Wie kan mij helpen hier iets van te maken ?
De code heb ik van chatgpt maar moet er een schema bij.
Dit is de bedoeling:
Dobbelsteen met 7 ledjes
3 druk schakelaars
Bedoeling :
- alle ledjes knipperen snel aan en uit in het begin
- wordt pb1 ingedrukt dan verschijn er een getal tussen de 1 en de 5 op de dobbelsteen en blijft staan totdat pb3 (reset) wordt ingedrukt en weer begint te knipperen
- worden pb1 en pb2 ingedrukt dan verschijn er 6 op de dobbelsteen. (pb2 is een geheime drukknop)
Bovenstaande heb ik in chatgpt ingevoerd en kreeg deze code :
C++
#include <avr/io.h>
#include <util/delay.h>
// Pindefinities
#define LED_DDR DDRB
#define LED_PORT PORTB
#define LED_PIN PB0
#define PB1_PIN PINB1
#define PB2_PIN PINB2
#define PB3_PIN PINB3
// Functie om alle LED's snel te laten knipperen
void knipperAlleLedjes() {
for (int i = 0; i < 10; i++) {
LED_PORT ^= (1 << LED_PIN);
_delay_ms(100);
}
}
// Functie om een willekeurig getal tussen 1 en 5 te genereren
int genereerWillekeurigGetal() {
return (rand() % 5) + 1;
}
int main() {
// Initialisatie
LED_DDR |= (1 << LED_PIN); // LED pin als output
DDRB &= ~((1 << PB1_PIN) | (1 << PB2_PIN) | (1 << PB3_PIN)); // Drukknop pinnen als input
PORTB |= (1 << PB1_PIN) | (1 << PB2_PIN) | (1 << PB3_PIN); // Interne pull-up weerstanden inschakelen
// Alle LED's knipperen snel aan en uit in het begin
knipperAlleLedjes();
while (1) {
// Controleren of PB1 is ingedrukt
if (!(PINB & (1 << PB1_PIN))) {
int getal = genereerWillekeurigGetal();
// LED's instellen op basis van het gegenereerde getal
LED_PORT = (LED_PORT & 0xF8) | getal;
while (1) {
// Controleren of PB3 (reset) is ingedrukt
if (!(PINB & (1 << PB3_PIN))) {
knipperAlleLedjes();
break;
}
}
}
// Controleren of PB1 en PB2 tegelijkertijd zijn ingedrukt
if (!(PINB & (1 << PB1_PIN)) && !(PINB & (1 << PB2_PIN))) {
// LED's instellen op 6
LED_PORT = (LED_PORT & 0xF8) | 6;
}
}
return 0;
}
Het is de bedoeling dat ik het upload op een attiny
Weet niet of deze code werkt ... zou iemand mij kunnen helpen aan een schema ?
Dobbelsteen met ledjes moet er uitzien als op de bijlage.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Chatgpt doet z’n best en als er iets plausibels op een scherm moet staan in een TV show kan dit voor code doorgaan. Maar het is geen dobbelsteen.
Probeer ‘t maar uit op breadboard. Even afgezien van dat PB0 waarschijnlijk in PORTB0 veranderd moet worden voordat het compileert en er mogelijk meer van dat inzit. Het knippert de led op B0 bij het opstarten, niet een random bewegende dobbelsteen.
Zou ‘rand()’ uberhaupt gewoon werken? Ik denk dat daar op z’n minst nog een andere include voor nodig is, en liefst een seed. (Iets als hoeveel us de resetknop ingedrukt is, of de tijd tussen ‘aan’ en het indrukken van de dobbelknop, zal voor een goochelvalsspeeldobbelsteen wel genoeg zijn. Tenzij elke keer dezelfde getallenreeks niet erg is, je doet immers nooit 2x dezelfde truc achter elkaar…)
De getallen zijn gewoon binair en worden niet omgezet naar ‘aantal LED’s dat aan is’ wat je voor een dobbelsteen nodig hebt. Al is een dobbelsteen nog wat lastiger, want het patroon moet ook kloppen.
Anders krijg je misschien iets als dit voor een 3:
*
*
*
ChatGPT moet nog ff wat beter z’n best doen / wat dingetjes bijleren. (Je kunt het sneller zelf)
Die mask met 0xF8 is ook schattig. Dat zijn 5 bits, geen 6. Er van afgezien dat je 7 led’s nodig hebt voor een dobbelsteen, dat chatgpt denkt dat het er 5 zijn is een schattige vergissing. Als ik robotpsycholoog was zou ik zeggen dat het komt door de 5 in je opdracht.
Je bijlage gebruikt trouwens een PIC12Fnnn, geen attiny. Ik denk oom dat je een chip met wat meer IO wil, dus geen ‘tiny45/85 maar een ‘tiny2313 ofzo.
Schakelaar en led op dezelfde pin zal geven dat de led oplicht als je de schakelaar indrukt, dat geeft de truc weg, dus je zult iets met meer pinnen willen of de led’s willen multiplexen of charlieplexen. Dus om de software eenvoudig te houden wil je denk ik iets met meer pinnen dan een ‘tiny45 of een pic12Fiets.
Maar, serieus, zet iets op breadboard en schrijf je code zelf. Dat is een leerproces, dat kan even duren, daar kun je wat hulp bij krijgen van dit forum. Maar chatgpt kan ‘t ook nog niet en als jij het dat moet gaan aanleren kun je makkelijker je dobbelsteen zelf maken. Met een arduino voor mijn part.
(Al is het misschien ook interessant of GPT met de juiste prompting er werkende code van kan maken, maar dan moet je dus eigenlijk zelf al kunnen programmeren… of dingen terugzeggen als ‘dit werkt niet, ik krijg compilerfout zusenzo op regel 3’ of ‘ik wil 7 leds in de vorm van een dobbelsteen aansturen, je hebt er nu 5’ enzo, maar ik weet niet hoe ver je daar mee komt).
Bedankt voor uw antwoord.
Ik wil er desnoods voor betalen als iemand mij kan helpen om zoiets te bouwen.
Ik heb dit gevonden maar werkt niet met ledjes :
https://www.elektormagazine.com/articles/tiny-dice/6842
[Bericht gewijzigd door fossie op (34%)]
als je wat budget hebt, kan ik zoiets wel voor je maken, maar ondanks dat de vraag simpel is, is dit toch altijd meer werk dan je zou verwachten.
pa3gws
Ik ben gestopt met roken nu mijn schakelingen nog.
Goedemorgen.
Super bedankt voor al jullie reacties !
Ik heb het uiteraard gegoogeld
.
Maar wat ik zoek is helaas geen standaard oplossing.
Arduino dobbelstenen zat maar niet wat ik zoek.
Heb helaas ook geen kaas gegeten van het programeren zodat ik een code kan aanpassen.
Dit is mijn bedoeling :
Dobbelsteen met 7 leds in een H vorm (3 links 3 rechts en 1 in het midden)
3 drukknoppen (pb1 start, pb2 reset, pb3 extra)
Werking :
Bij spanning beginnen alle leds te knipperen.
Wordt er op pb1 gedrukt dan geeft de dobbelsteen een getal tussen de 1 en de 5 en blijft hierop branden totdat er op pb2 wordt gedrukt en begint dan weer te knipperen.
Als er samen op pb1 en pb3 wordt gedrukt geeft de dobbelsteen een 6 aan en blijft branden totdat pb2 reset wordt gedrukt en beginnen alle leds weer te knipperen.
kan je al heel simpel schrijven.
knipperled in arduino is niks.
dan tel je bv de tijd dat die knop pb1 ingedrukt was in ms en neem je het laatste cijfer als de 'waarde'.
bv je drukte
2143ms de knop in (2sec dus), dan is de uitkomst nu 3.
is dat getal meer dan 5, trek je het voorgaande eraf
bv 2149ms, dan 9 -4 = 5
is het een 6
bv 2196, doe je omgekeerd, 9 - 6 = 3
hoef je al geen random te programmeren, je neemt het gewoon van de drukknop tijd af
met dat geheime knopje zet je de output altijd op 6 en geef je dat weer op dobbelsteen.
eens je een getal hebt, is het peanuts om de leds te laten branden
1 : 6 leds uit, middelste aan
2 : 1 bovenaan aan, 1 onderaan aan, rest uit
...
Doet dit dan precies hoe ik het beschreven hebt ?
Ik heb nog nooit een code geschreven.
Kan dit dan op een attiny ?
En hoe kom ik aan een schema hiervoor ?
SparkyGSX
Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Waarom wil je perse iets met 2 knoppen tegelijk ingedrukt, als die geen andere functie lijken te hebben?
Het lijkt me handiger om een magnetische ring te gebruiken in plaats van dat verborgen knopje, dan kan iemand het hele ding bekijken zonder je truc door te hebben. Sowieso snapt iedereen dat zo'n elektronische dobbelsteen triviaal nep kan zijn. Je kunt ook de hoek waaronder je hem houdt (een klein beetje in een bepaalde richting draaien voor een 6), de tijd dat je het knopje indrukt, o.i.d. gebruiken.
Die code is knap gemaakt voor een large language model, maar nog steeds bagger, want dat gaat niet werken, en om te begrijpen waarom niet, moet je er al genoeg van weten dat het zelf schrijven gemakkelijker was geweest.
schema is nu het meest eenvoudige.
2 schakelaars op een digitale input
reset kan je als een 3de nemen.
voor de outputs heb je met 4 genoeg.
1 en 6 werken zowieso altijd al samen bij getal 2-3-4-5 en 6, oftewel enkel bij 1 zijn ze uit 
7 brand enkel bij 1 en 5
3 en 4 branden enkel bij 6
2 en 5 branden enkel bij 4-5 en 6
Super nu komen we wat verder.
Wat voor tinyat moet ik hiervoor gebruiken ?
Heb je toevallig een complete schema en de code hiervoor ?
hardbass
PE2BAS
Als je eens begint met een voorbeeld van een Arduino project. Iets wat je gewoon na kan bouwen. Dan heb je voor 90% al wat je wilt hebben. Die laatste modificatie kunnen wij je dan wel bij helpen.
Bijvoorbeeld:
https://www.instructables.com/Arduino-Led-Dice/
[Bericht gewijzigd door hardbass op (14%)]
pak een arduino nano, compact, geen rand componenten.
7 leds eraan met een weerstandje, 2 schakelaars eraan, en wat code erin rammen

de pagina dat hardbass toont, geeft je al de volledige code.
ze genereren een random getal van 1 tot 7, trek er daar eentje af en de dobbelsteen gaat maar tot 5 meer 
en dan maak je de extra 2 regeltjes als je geheime knop aan staat dat er een 6 komt
[Bericht gewijzigd door fcapri op (34%)]
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Op 28 november 2023 14:39:35 schreef fcapri:.
voor de outputs heb je met 4 genoeg.
[afbeelding]1 en 6 werken zowieso altijd al samen bij getal 2-3-4-5 en 6, oftewel enkel bij 1 zijn ze uit
7 brand enkel bij 1 en 5
3 en 4 branden enkel bij 6
2 en 5 branden enkel bij 4-5 en 6
Ah! Slim! Karnaugh?
Je kunt dus met 4 bits toe. Nog steeds geen 5, maar hé.
Maargoed. Als je begint met een bestaand dobbelsteenproject en dat een beetje uitbreid/aanpast lijkt me idd het makkelijkst.
OPTOdesign
R&D | Design | Light | Innovation | Education
Op 27 november 2023 22:33:11 schreef fossie:
Bedankt voor uw antwoord.
Ik wil er desnoods voor betalen als iemand mij kan helpen om zoiets te bouwen.
Ik heb dit gevonden maar werkt niet met ledjes :
https://www.elektormagazine.com/articles/tiny-dice/6842
Ik heb al heel wat LED-dobbelstenen met losse LEDjes voorbij zien komen bij Elektor. Een aantal ter inspiratie:
https://www.elektormagazine.nl/news/supereenvoudige-elektronische-dobb…
https://www.elektormagazine.nl/magazine/elektor-200007/13550
https://www.elektormagazine.nl/magazine/elektor-199801/39171
https://www.elektormagazine.nl/magazine/elektor-263/60835
https://www.elektormagazine.nl/magazine/elektor-310/61889
Op 28 november 2023 14:39:35 schreef fcapri:
schema is nu het meest eenvoudige.
2 schakelaars op een digitale input
reset kan je als een 3de nemen.voor de outputs heb je met 4 genoeg.
[afbeelding]1 en 6 werken zowieso altijd al samen bij getal 2-3-4-5 en 6, oftewel enkel bij 1 zijn ze uit
7 brand enkel bij 1 en 5
3 en 4 branden enkel bij 6
2 en 5 branden enkel bij 4-5 en 6
7 brand toch ook bij 3? Dus 1, 3 en 5 
Okiedokie heb voorbeeld van hardbass gemaakt.
Upgeload op nano.
Ledjes staan in het begin uit.
Na druk op knop geeft hij een getal aan en na paar seconde gaat hij uit.
[Bericht gewijzigd door fossie op (65%)]
Hoe kan ik het veranderen naar het volgende :
- dat alle ledjes knipperen in het begin voordat er gedrukt wordt ipv uit te zijn ?
- dat het alleen maar 1 t/m 5 geeft bij ingedrukte knop 1
- dat het cijfer blijft staan ipv na een paar seconde uit gaat
- hoe kan ik een reset knop toevoegen (dat de ledjes weer allemaal gaan knipperen)
- hoe kan ik een extra knop toevoegen die samen met knop 1 ingedrukt wordt en de cijfer 6 aangeeft ?
Dit is de code die er nu opstaat :
int pinLeds1 = 10;
int pinLeds2 = 9;
int pinLeds3 = 7;
int pinLed4 = 8;
int buttonPin = 6;
int buttonState;
long ran;
int time = 2000;
void setup ()
{
pinMode (pinLeds1, OUTPUT);
pinMode (pinLeds2, OUTPUT);
pinMode (pinLeds3, OUTPUT);
pinMode (pinLed4, OUTPUT);
pinMode (buttonPin, INPUT);
randomSeed(analogRead(0));
}
void loop()
{
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH){
ran = random(1, 7);
if (ran == 1){
digitalWrite (pinLed4, HIGH);
delay (time);
}
if (ran == 2){
digitalWrite (pinLeds1, HIGH);
delay (time);
}
if (ran == 3){
digitalWrite (pinLeds3, HIGH);
digitalWrite (pinLed4, HIGH);
delay (time);
}
if (ran == 4){
digitalWrite (pinLeds1, HIGH);
digitalWrite (pinLeds3, HIGH);
delay (time);
}
if (ran == 5){
digitalWrite (pinLeds1, HIGH);
digitalWrite (pinLeds3, HIGH);
digitalWrite (pinLed4, HIGH);
delay (time);
}
if (ran == 6){
digitalWrite (pinLeds1, HIGH);
digitalWrite (pinLeds2, HIGH);
digitalWrite (pinLeds3, HIGH);
delay (time);
}
}
digitalWrite (pinLeds1, LOW);
digitalWrite (pinLeds2, LOW);
digitalWrite (pinLeds3, LOW);
digitalWrite (pinLed4, LOW);
}
[Bericht gewijzigd door fossie op (61%)]
dan moet je de leds laten knipperen als je niet op de knop drukt. de code moet je gebruiken . t is niet de properste code nu, maar je moet het begrijpen
int pinLeds1 = 10;
int pinLeds2 = 9;
int pinLeds3 = 7;
int pinLed4 = 8;
int buttonPin = 6;
int buttonState;
long ran;
int time = 2000;
int ledson=0;
void setup ()
{
pinMode (pinLeds1, OUTPUT);
pinMode (pinLeds2, OUTPUT);
pinMode (pinLeds3, OUTPUT);
pinMode (pinLed4, OUTPUT);
pinMode (buttonPin, INPUT);
randomSeed(analogRead(0));
}
void loop()
{
buttonState = digitalRead(buttonPin); // hier lees je de knop in
if (buttonState == HIGH){ //hier kijk je op die ingedrukt is
ran = random(1, 7);
if (ran == 1){
digitalWrite (pinLed4, HIGH);
delay (time);
}
if (ran == 2){
digitalWrite (pinLeds1, HIGH);
delay (time);
}
if (ran == 3){
digitalWrite (pinLeds3, HIGH);
digitalWrite (pinLed4, HIGH);
delay (time);
}
if (ran == 4){
digitalWrite (pinLeds1, HIGH);
digitalWrite (pinLeds3, HIGH);
delay (time);
}
if (ran == 5){
digitalWrite (pinLeds1, HIGH);
digitalWrite (pinLeds3, HIGH);
digitalWrite (pinLed4, HIGH);
delay (time);
}
if (ran == 6){
digitalWrite (pinLeds1, HIGH);
digitalWrite (pinLeds2, HIGH);
digitalWrite (pinLeds3, HIGH);
delay (time);
}
sleep(30000); //nadat de dobbelsteen er is, blijf 30sec staan
} else { //knop NIET ingedrukt, dus knipperen
flip_leds();
delay(100); //leds 100ms aan en 100ms uit
}
}
// als de leds aan zijn, zet je ze uit, als ze uit zijn, zet je ze aan
void flip_leds(){
if (ledson==1){
digitalWrite (pinLeds1, LOW);
digitalWrite (pinLeds2, LOW);
digitalWrite (pinLeds3, LOW);
digitalWrite (pinLed4, LOW);
ledson=0;
} else {
digitalWrite (pinLeds1, HIGH);
digitalWrite (pinLeds2, HIGH);
digitalWrite (pinLeds3, HIGH);
digitalWrite (pinLed4, HIGH);
ledson=1;
}
}
SparkyGSX
Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Ik wil ook nog wel een duit in het zakje doen:
const unsigned char LedLookup[ 7 ] = { 0x00, 0x01, 0x02, 0x03, 0x06, 0x07, 0x0E };
void DisplayNumber( unsigned char number )
{
digitalWrite( pinLED1, LedLookup[ number ] & 0x01 ); // center dot
digitalWrite( pinLED2, LedLookup[ number ] & 0x02 ); // left top and right bottom
digitalWrite( pinLED3, LedLookup[ number ] & 0x04 ); // left bottom and right top
digitalWrite( pinLED4, LedLookup[ number ] & 0x08 ); // center left and right
};
hardbass
PE2BAS
Op 28 november 2023 21:39:02 schreef fossie:
exit status 1Compilation error: 'sleep' was not declared in this scope
Blijkbaar bestaat het sleep commando niet. Wat je dan doet is naar google gaan en zoeken op 'arduino sleep' Bij mij geeft de tweede link dan aan dat je geen sleep maar delay moet gebruiken.
https://www.arduino.cc/reference/en/language/functions/time/delay/
Oh, nog een huishoudelijke tip, als je code plaatst zet die dan tussen code tags. Zie: https://www.circuitsonline.net/forum/faq/2#code_tag
Dat maakt het wat beter leesbaar en kunnen wij jou beter helpen.
[Bericht gewijzigd door hardbass op (19%)]
Op 28 november 2023 21:39:02 schreef fossie:
exit status 1Compilation error: 'sleep' was not declared in this scope
even zelf zoeken wat er mis is. heb al commentaar gezet wat ik veranderde.
hier zal je dan zien dat ik sleep(30000) heb gebruik ipv delay(30000).
4 regels later heb ik wel delay getyped.
dus gewoon die sleep even vervangen door delay
dit was eigenlijk wel een makkelijke dat je had kunnen vinden.
in het originele programma ging de dobbelsteen een waarde geven, 2 sec wachten en ging dan uit (delay(time) achter elke van die 6 combinaties).
die delay wordt bovenaan gegeven als time=2000
je zou ook die sleep(30 000) kunnen weghalen, en gewoon bovenaan die time naar 30000 veranderen.
of je kan iets invullen dat het programma voor eeuwig daar blijft, tot je een reset doet op de arduino
bv if 1{};
de code rammelt, maar heb ze speciaal eenvoudig gehouden zodat je ze nog enigsinds kan lezen en begrijpen.
de blokken code is ook gewoon VEEEEEL te lang. als je zelf programmeert, moet je binnen de 10regels kunnen blijven binnen elk blok.
ik zou eerder zoiets schrijven (is uit losse hand, zal NIET werken)
int pinLeds1 = 10; //###alles declareren
int pinLeds2 = 9;
int pinLeds3 = 7;
int pinLed4 = 8;
int buttonPin = 6;
int buttonState;
long ran;
int time = 2000;
int ledson=0;
void setup (){ //###arduino klaarmaken
pinMode (pinLeds1, OUTPUT);
pinMode (pinLeds2, OUTPUT);
pinMode (pinLeds3, OUTPUT);
pinMode (pinLed4, OUTPUT);
pinMode (buttonPin, INPUT);
randomSeed(analogRead(0));
}
void loop(){ //### eigenlijke programma
buttonState = digitalRead(buttonPin); //### hier lees je de knop in
if (buttonstate) { //### controller of knop is ingedrukt
rolldice(); //### is ingedrukt, rol de dobbelsteen
waitinfinite(); //### blijf hier staan
} else {
flipleds(); //### niet ingedrukt, knipper alle leds
}
delay(100); //### wacht 0,1sec om nog eens te controlleren
}
void flip_leds(){ //###als de leds branden, zet ze af, anders, zet ze aan
if (ledson==1){
digitalWrite (pinLeds1, LOW);
digitalWrite (pinLeds2, LOW);
digitalWrite (pinLeds3, LOW);
digitalWrite (pinLed4, LOW);
ledson=0;
} else {
digitalWrite (pinLeds1, HIGH);
digitalWrite (pinLeds2, HIGH);
digitalWrite (pinLeds3, HIGH);
digitalWrite (pinLed4, HIGH);
ledson=1;
}
}
void rolldice(){ //###laat de dobbelsteen een waarde tonen
ran = random(1, 7);
if (ran == 1){
digitalWrite (pinLed4, HIGH);
}
if (ran == 2){
digitalWrite (pinLeds1, HIGH);
}
if (ran == 3){
digitalWrite (pinLeds3, HIGH);
digitalWrite (pinLed4, HIGH);
}
if (ran == 4){
digitalWrite (pinLeds1, HIGH);
digitalWrite (pinLeds3, HIGH);
}
if (ran == 5){
digitalWrite (pinLeds1, HIGH);
digitalWrite (pinLeds3, HIGH);
digitalWrite (pinLed4, HIGH);
}
if (ran == 6){
digitalWrite (pinLeds1, HIGH);
digitalWrite (pinLeds2, HIGH);
digitalWrite (pinLeds3, HIGH);
}
}
die roll_dice is me eigenlijk ook al te lang. dat zou ik in een case gooien, of gewoon het weergeven in een sub routine.
bv hier enkel het getal genereren, bv 5
en dan een ander programma oproepen met:
showleds(5);
void showleds(int number){
...
geef leds weer
...
}
dit geeft als grote voordeel: als je een kleinigheid wil veranderen, bv de dobbelsteen die maar tot 5 gaat, moet je enkel dat kleine subprogramma roll_dice aanpassen dat die tot 5 gaat.
je moet niet al die code doorlezen waar ze die 5 omzetten naar leds hoog zetten