Bingo reset met knop

algemene C code
Berichten: 34
Geregistreerd: 12 Mrt 2016, 23:38

Bingo reset met knop

Berichtdoor Pexy » 11 Nov 2018, 19:32

Hallo allemaal,

Ik heb hier een bingo sketch van Rino Wijngaa die gebruik maakt van een lcd en een knop.
Als men op de knop drukt komt er een getal op de lcd, als alle 75 getallen zijn geweest word de bingo gereset.
Nu zou ik graag willen dat als ik bijvoorbeeld 3 seconden lang op de knop druk dat de bingo gaat resetten.
Ik heb ook een stukje code voor een ledje dat gaat branden nadat er 3 sec. lang op de knop gedrukt wordt, zou graag willen weten hoe ik deze code kan combineren met de bingo sketch.
Alvast bedankt!

Hieronder de bingo sketch:
cpp code
#include <Entropy.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(4, 5, 6, 7, 8, 9);

uint8_t random_byte;
const int button = 2;
const int aantalGetallen = 75;
int buttonState;
int prevButtonState;
int trekkingNummer = 0;
long vorigeBingoGetal = 0;
String vorigeBingoLetter;
long bingoGetal = 0;
String bingoLetter;
int trekking[aantalGetallen+1]; // 0..75, 0=not used

void setup() {
Serial.begin(9600);
lcd.begin (16,2);
pinMode (button, INPUT);
startBingo();
Entropy.initialize();
}

void startBingo() {
vorigeBingoGetal = 0;
bingoGetal = 0;
bingoLetter = "";
vorigeBingoLetter = "";
trekkingNummer = 0;

// trekking schoonmaken
for (int i = 0; i <= aantalGetallen; i++) {
trekking[i] = -1;
}

printToLcd (
"B I N G O",
"Druk op de knop!");

prevButtonState = digitalRead (button);
}

void stopBingo() {
for (int i = 5; i>0; i--) {
printToLcd (
"We zijn klaar!",
"Reset in " + String(i) + " sec."
);
delay(1000);
}
}

void loop() {
buttonState = digitalRead (button);
if (buttonState != prevButtonState && buttonState == HIGH)
{
if (trekkingNummer == aantalGetallen) {
stopBingo();
startBingo();
return;
}

trekkingNummer++;
vorigeBingoGetal = bingoGetal;
vorigeBingoLetter = bingoLetter;
doBlinkOn();
do {
// bingoGetal = random (1,aantalGetallen+1);//
bingoGetal = Entropy.random(1,aantalGetallen+1); // returns a value from 1 to 6
// Serial.println("Trekking " + String(trekkingNummer) + ": " + String(bingoGetal));
} while (trekking[bingoGetal] != -1);
doBlinkOff();
trekking[bingoGetal] = 1; // markeer als geweest
bingoLetter = bepaalBingoLetter(bingoGetal);

if (trekkingNummer==1) {
printToLcd (
"We zijn begonnen",
"Trek. " + String (trekkingNummer) + ") " + bingoLetter + " " + bingoGetal
);
} else {
printToLcd (
"Trek. " + String (trekkingNummer-1) + ") " + vorigeBingoLetter + " " + vorigeBingoGetal,
"Trek. " + String (trekkingNummer) + ") " + bingoLetter + " " + bingoGetal
);
}
delay (500);
}
prevButtonState = buttonState;
}

String bepaalBingoLetter(long getal) {
if (getal <= 15) {
return "B";
} else if (getal <= 30) {
return "I";
} else if (getal <= 45) {
return "N";
} else if (getal <= 60) {
return "G";
} else if (getal <= 75) {
return "O";
}
return "";
}

void printToLcd (String line1, String line2) {
lcd.clear ();
lcd.print (line1);
lcd.setCursor (0, 1);
lcd.print (line2);
}

void doBlinkOn () {
lcd.setCursor (15, 1);
lcd.blink();
}

void doBlinkOff () {
lcd.setCursor (15, 1);
lcd.noBlink();
}


En hieronder de knop 3 sec. tellen sketch:
cpp code
// Arduino IDE 1.6.9

int ledPin = 13;
int buttonPin = 5;

int firsttime = 1;
unsigned long startTime;
unsigned long pressTime;

void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);
}

void loop(){

if (digitalRead(buttonPin) == HIGH) {
if (firsttime == 1) {
startTime = millis();
firsttime = 0;
}
pressTime = millis() - startTime;
if (pressTime >= 1) {
Serial.print("Time: ");
Serial.print(pressTime);
Serial.print(" milliseconds ");
Serial.print(int(pressTime / 1000));
Serial.println(" seconds");
}

if (pressTime > 3000) { // 3 sec wachten tot led aangaat

digitalWrite(ledPin, HIGH);
delay(1000);
}
}

else if (firsttime == 0) {
firsttime = 1;
Serial.println("Time: 0 milleseconds; 0 seconds");
digitalWrite(ledPin, LOW);
}
}

Advertisement

Gebruikers-avatar
Berichten: 1893
Geregistreerd: 06 Aug 2016, 01:03

Re: Bingo reset met knop

Berichtdoor Koepel » 11 Nov 2018, 21:40


Berichten: 34
Geregistreerd: 12 Mrt 2016, 23:38

Re: Bingo reset met knop

Berichtdoor Pexy » 11 Nov 2018, 22:20

Pexy schreef:Rino Wijngaa

Moet natuurlijk Rino van Wijngaarden zijn, foutje van mij.

Koepel schreef:Een link naar de bron: https://github.com/rwijngaa/bingo/blob/master/bingo.ino.

Dat is inderdaad de link.

Gebruikers-avatar
Berichten: 1893
Geregistreerd: 06 Aug 2016, 01:03

Re: Bingo reset met knop

Berichtdoor Koepel » 12 Nov 2018, 00:08

Je laat niet zien welke poging je hebt gedaan.

De ene sketch maakt gebruik van de StateChangeDetection (https://www.arduino.cc/en/Tutorial/StateChangeDetection), en de andere niet. Dat maakt dat ze niet zomaar samen te voegen zijn. Dus die tweede zal ik maar vergeten. De eerste heeft geen mooie logische structuur in de code. Met name de 'buttonState' en de 'prevButtonState' zijn niet logisch, en dat is nu juist wat nodig is om de 3 seconden toe te voegen (Koepel schudt zijn hoofd, kijkt een beetje triest en zucht eens diep).

1) Voeg drie globale variabelen toe:
cpp code
// Extra variables to detect if button is pressed for certain time.
unsigned long previousMillis;
const unsigned long timeOut = 3000;
bool timerRunning = false;


2) Wijzig de structuur van de loop() en voeg wat dingen toe:
cpp code
void loop() 
{
buttonState = digitalRead (button);
if (buttonState != prevButtonState)
{
if( buttonState == HIGH)
{
timerRunning = true;
previousMillis = millis();

if (trekkingNummer
...

delay (500);
}
else
{
// button has changed and is now low.
timerRunning = false;
}
}
prevButtonState = buttonState;

if( timerRunning)
{
if( millis() - previousMillis >= timeOut)
{
timerRunning = false;
stopBingo();
startBingo();
}
}
}


3) Verwijder de volgende regel uit de functie "startBingo()":
cpp code
prevButtonState = digitalRead(button);

Berichten: 34
Geregistreerd: 12 Mrt 2016, 23:38

Re: Bingo reset met knop

Berichtdoor Pexy » 12 Nov 2018, 21:00

Koepel, je bent geniaal!
Ik druk 3 seconden lang op de knop en... bingo!
Nouja geen bingo maar een nette reset van het spel.

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten