spelletje met meerdere knoppen

Arduino specifieke Software
Berichten: 4
Geregistreerd: 29 Jun 2021, 22:27

spelletje met meerdere knoppen

Berichtdoor BartjeB » 14 Sep 2022, 21:58

Goedendag,

Ik ben nog steeds een groentje. Het programmeren heeft even stilgelegen omdat het me telkens niet lukte om een goeie sketch te maken.
En ook nu loop ik weer vast. In mijn hoofd lijkt het heel simpel maar ik kan het niet vertalen in een bruikbare sketch. Hopelijk kunnen jullie me op weg helpen.

Ik wil een arduino based Geocache maken. Hierbij moet geocache speler een spelletje spelen. Het spel heb ik uitgelegd in de code, althans zover als ik hem nu heb. Ik heb de sketch zover gemaakt dat ik het kan testen. Maar dit stukje krijg ik dus al niet werkend. :oops:

/* Sketch voor Arduino based Geocache.
* De speler moet aan de hand van 3 knopjes de juiste volgorde
* achterhalen. Wanneer een verkeerde schakelaar wordt bediend
* moet de speler weer opnieuw beginnen. Het doel is om ook een
* grap in te bouwen. Zo zal, wanneer de hele cyclus gelukt is,
* een servo geactiveerd worden die een als "reset" aangeduide knop bediend.
* Hierdoor zal de speler denken dat ie weer opnieuw moet beginnen.
* Na een 3-tal seconden zal de sleutel toch tevoorschijn komen.
*/
const int buttonPin1 = 2; //Pinnummer spelschakelaar 1 D2
const int buttonPin2 = 3; //Pinnummer spelschakelaar 2 D3
const int buttonPin3 = 4; //Pinnummer spelschakelaar 3 D4

int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;

void setup() {
pinMode(buttonPin1, INPUT); // Spelschakelaar 1
pinMode(buttonPin2, INPUT); // Spelschakelaar 2
pinMode(buttonPin3, INPUT); // Spelschakelaar 3

pinMode(5, OUTPUT); //LED 1
pinMode(6, OUTPUT); //LED 2
pinMode(7, OUTPUT); //LED 3
pinMode(8, OUTPUT); //LED 4
pinMode(9, OUTPUT); //LED 5
pinMode(10,OUTPUT); //LED 6

digitalWrite (5, HIGH); //Zet LED 1 aan
delay (500); //Wacht halve seconde
digitalWrite (6, HIGH); //Zet LED 2 aan
delay (500); //Wacht halve seconde
digitalWrite (7, HIGH); //Zet LED 3 aan
delay (500); //Wacht halve seconde
digitalWrite (8, HIGH); //Zet LED 4 aan
delay (500); //Wacht halve seconde
digitalWrite (9, HIGH); //Zet LED 5 aan
delay (500); //Wacht halve seconde
digitalWrite (10, HIGH); //Zet LED 6 aan
delay (3000); //Wacht drie seconden


}
void loop() {
digitalWrite (5, LOW) ; //Zet LED 1 uit
digitalWrite (6, LOW) ; //Zet LED 2 uit
digitalWrite (7, LOW) ; //Zet LED 3 uit
digitalWrite (8, LOW) ; //Zet LED 4 uit
digitalWrite (9, LOW) ; //Zet LED 5 uit
digitalWrite (10,LOW) ; //Zet LED 6 uit

buttonState1 = digitalRead(buttonPin1); // Lees de status van de spelschakelaar 1
buttonState2 = digitalRead(buttonPin2); // Lees de status van de spelschakelaar 2
buttonState3 = digitalRead(buttonPin3); // Lees de status van de spelschakelaar 3

if (buttonState1 == LOW) //Controleer of de spelschakelaar1 niet is ingedrukt
{
if (buttonState2 == HIGH) //Controleer of de spelschakelaar2 niet is ingedrukt
{
if (buttonState3 == HIGH) //Controleer of de spelschakelaar3 niet is ingedrukt
{
digitalWrite (5, HIGH) ; //Zet de eerste LED aan
}else{

digitalWrite (5,HIGH) ; //Zet de eerste LED aan
digitalWrite (6,HIGH) ; //Zet de tweede LED aan
digitalWrite (7,HIGH) ; //Zet de derde LED aan
digitalWrite (8,HIGH) ; //Zet de vierde LED aan
digitalWrite (9,HIGH) ; //Zet de vijfde LED aan
digitalWrite (10,HIGH); //Zet de zesde LED aan
delay (300) ;

}}
{
return;
}

}}

Advertisement

Berichten: 68
Geregistreerd: 04 Sep 2021, 08:31

Re: spelletje met meerdere knoppen

Berichtdoor RobGood » 17 Sep 2022, 09:35

Hallo Bart,
Ja leuk project.
Ik heb je sketch bekeken, de syntax klopt op wat punten en kommaas na, maar de logica... daar gaat het echt mis.
Wat ik altijd doe is zo een idee opdelen in stukjes, die stukjes samen vormen dan het hele program, maar die stukjes kun je ook apart testen en vaak bewaren om in andere programmaas (puzzels) te gebruiken.

Onderstaand heb ik een programmaatje ingevoegd van zo een stukje. Dit programma deel handelt de acties van de spelers af, het indrukken van die knopjes.
Je ziet de opbouw:
Eerst wat variabelen declareren, dan de pinnen bepalen en instellen in de setup, in de loop alleen een timer die 50x per seconde een functie aanroept die de knoppen uitleest.
Is er een knop ingedrukt, dus niet losgelaten....dan wordt er in knopactie iets gedaan, in jouw puzzel dan een volgende stukje, bv. het testen of de speler de goede knop heeft ingedrukt. In het voorbeeld wordt een ledje getoggeled. aan> uit of uit > aan.

Knopjes bouncen, als je ze indrukt dan stuiteren die contacten even op en neer, gevolg die arduino die heeft ongeveer een 500 aan en uit momenten gemeten terwijl jij maar 1x de knop denkt ingedrukt te hebben. Die constructie met die timer in loop lost dat op.
Ook wil je dat alleen het indrukken van de knop iets doet, daarom moet je de status van de knop(pen) ergens onthouden, dus de variabele laatst.

De syntax, de programmeer 'taal' die ik gebruik is een zelf verzonnen mengelmoesje tussen de arduino taal, C en bit wise programmeren wat ik zelf wel lekker vindt werken, de teksten worden dan wat compacter en het geheel (vind ik dan) beter leesbaar, maar zeker kan dit ook in volledig arduino syntax, goeie oefening?? Daar moet je je eigen ding in vinden..

Je kan gewoon goegelen op die regels om te zien hoe dat dan in elkaar steekt.
Ik hoop dat je er wat aan hebt,

Je hoeft het alleen maar in een leeg arduino sketch te kopieeren. Verder 4 leds op pin8~pin10 anode(lange pootje) in de pin, cathode via een weerstand van 1K naar GND. 4 drukknoppen op pinnen A0~A3 andere pootje van de drukknoppen naar GND.

Rob

// Knoppen actie sketch
unsigned long slowtime;
byte laatst;

// the setup function runs once when you press reset or power the board
void setup() {
PINC |= (15 << 0); //pull ups op pinnen A0~A3
DDRB |= (15 << 0); //pins 8~11 als output
}

// the loop function runs over and over again until power down or reset
void loop() {

if (millis() - slowtime > 20) { //gebruik ingebakken timer voor een 50hz timer
slowtime = millis();
leesknoppen();
}
}
void leesknoppen() {
byte nu = PINC; //lees de knoppen
byte veranderd = laatst ^ nu; //xor de twee bytes voor een verandering
if (veranderd > 0) { //er is wat veranderd
for (byte i = 0; i < 4; i++) {
if (veranderd & (1 << i) && (~nu & (1<<i))) { //deze pin is ingedrukt
knopactie(i);
}
}
}
laatst = nu; //zet huidige stand knoppen in laatst
}
void knopactie(byte knop) {
//de actie voor een ingedrukte knop
PORTB ^= (1 << knop); //flip de output (ledje?)
}

Berichten: 4
Geregistreerd: 29 Jun 2021, 22:27

Re: spelletje met meerdere knoppen

Berichtdoor BartjeB » 18 Sep 2022, 20:34

Hallo Rob,

bedankt voor de uitleg en tip. Je sketch werkt ook. Ik kan er alleen helemaal niets uit wijs worden aangezien ik de gewone arduino taal al lastig vindt. :oops:
Het lijkt wel een beetje op wat ik voor ogen heb behalve dan dat er een volgorde in zit en wanneer er wordt afgeweken dat hij dan reset.

Ik ga het proberen na te maken in Arduino taal en dan kijken of ik het kan uitbreiden.

Want als ik het zo bregrijp moet ik een teller starten als variabele. Komtme ook weer vaag bekend voor van de opleiding. Super bedankt alvast!

Groet Bart

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: ojcaqohacpun en 13 gasten