code herstarten als ik op keypad key A indruk

algemene C code
Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

code herstarten als ik op keypad key A indruk

Berichtdoor christiaan » 02 Feb 2016, 18:13

Hallo allemaal,

Heb onderstaande code wat voor mij heel fijn werkt.
Echter wil ik iets wat niet werkt bij mij. Het is de bedoeling dat zodra hij in de ledLoop() code zit, registreert of er iemand op A drukt (of een code en dan eindigt met A) zodat het spel (de code) wordt gereset, en je overnieuw kunt beginnen. Wat moet ik daarvoor doen in de onderstaande code???

cpp code
#include <Keypad.h>
byte maxPasswordLength = 10;
byte currentPasswordLength = 0;
const byte ROWS = 4; // Four rows
const byte COLS = 4; // Four columns

//Define the keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};

//// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[ROWS] = {21,20,19,18}; //connect to row pinouts (2,3,4,5)

// Connect keypad COL0, COL1, COL2 and COL3 to these Arduino pins.
byte colPins[COLS] = {17,16,15,14}; //connect to column pinouts (6,7,8,9)

// Create the Keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

String passwordLvl1 = "873940";
String passwordLvl2 = "156243";
String passwordLvl3 = "019827";
String passwordLvl4 = "829015";
String passwordLvl5 = "572901";
String passwordAdmin = "7926";
String userinput;
String level = "1";
boolean loopEnd = false;

/* Display */
#include <TFT.h> // Arduino LCD library
#include <SPI.h>

// pin definition for the Uno
#define cs 10 // 10
#define dc 9 // 9
#define rst 8 // 8
TFT TFTscreen = TFT(cs, dc, rst);

/* Timer */
#include<CountUpDownTimer.h>
CountUpDownTimer T(DOWN);
#include <Arduino.h>
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 43
#define DIO 45
TM1637Display display(CLK, DIO);

/* Matrix */
#include "LedControlMS.h"
#define NBR_MTX 2
LedControl lc=LedControl(5,7,6, NBR_MTX);

/* Overig */
int piezoPin = 47;
int hoursT;
int minutesT;
int secondsT;

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
pinMode(22, OUTPUT);
pinMode(23, OUTPUT);
pinMode(24, OUTPUT);
pinMode(25, OUTPUT);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);

// Put this line at the beginning of every sketch that uses the GLCD:
TFTscreen.begin();

display.setBrightness(0x0f);
//T.SetTimer(1,30,0); // Timer voor de Escape room
T.SetTimer(0,5,01);

// clear the screen with a black background
TFTscreen.background(0, 0, 0);

// write the static text to the screen
// set the font color to white
TFTscreen.stroke(255, 255, 255);
// set the font size
TFTscreen.setTextSize(4);
// write the text to the top left corner of the screen
TFTscreen.text("System", 0, 0);
TFTscreen.text("start!", 0, 50);
delay(2000);
printDisplay();
T.StartTimer();

for (int i=0; i< NBR_MTX; i++){
lc.shutdown(i,false);
/* Set the brightness to a medium values */
lc.setIntensity(i,8);
/* and clear the display */
lc.clearDisplay(i);
}

}

void loop() {
/* Timer script met matrix gedeelte */

T.Timer(); // run the timer
uint8_t fail[] = { 0b01110001,0b01110111,0b00000110,0b00111000 };

if (T.TimeHasChanged() ) // this prevents the time from being constantly shown.
{

tone(piezoPin, 5000, 50);

//HIER DE COLON ON!!!!!
uint8_t test[] = { 0b10000000 };
display.setSegments(test,2,1);

display.showNumberDec(T.ShowMinutes(), true, 2, 0);
display.showNumberDec(T.ShowSeconds(), true, 2, 2);
Serial.print(T.ShowHours());
Serial.print(":");
Serial.print(T.ShowMinutes());
Serial.print(":");
Serial.println(T.ShowSeconds());

hoursT = T.ShowHours();
minutesT = T.ShowMinutes();
secondsT = T.ShowSeconds();
if (hoursT == 0 && minutesT == 0 && secondsT == 0) {
T.StopTimer();
delay(500);
Serial.println("BOOM");
digitalWrite(22, HIGH);
digitalWrite(25, HIGH);
showBomb();
display.setSegments(fail);
melodyFailPlay();
//display.showNumberDec(1234, true, 4, 0);
}

} // End of T.TimeHasChanged

/* Werkend script voor keypad + display */
// put your main code here, to run repeatedly:
char key = keypad.getKey();
if (key != NO_KEY){
digitalWrite(23, HIGH);
digitalWrite(26, HIGH);
delay(60);
switch (key){
case 'A': resetGame(); break;
case 'B': break;
case 'C': break;
case 'D': changePassword(); break;
case '#': checkPassword(); break;
case '*': resetPassword(); break;
default: processNumberKey(key);
}
digitalWrite(23, LOW);
digitalWrite(26, LOW);
}
}

void processNumberKey(char key) {
Serial.print(key);
currentPasswordLength++;
userinput += key;
printDisplay();
if (currentPasswordLength == maxPasswordLength) {
checkPassword();
}
}

void checkPassword() {
switch (userinput.toInt()) {
case 873940: // Level 1
Serial.println(" OK.");
digitalWrite(24, HIGH);
digitalWrite(27, HIGH);
level = "2";
delay(250);
digitalWrite(24, LOW);
digitalWrite(27, LOW);
break;
case 156243: // Level 2
Serial.println(" OK.");
digitalWrite(24, HIGH);
digitalWrite(27, HIGH);
level = "3";
delay(250);
digitalWrite(24, LOW);
digitalWrite(27, LOW);
break;
case 619827: // Level 3
Serial.println(" OK.");
digitalWrite(24, HIGH);
digitalWrite(27, HIGH);
level = "4";
delay(250);
digitalWrite(24, LOW);
digitalWrite(27, LOW);
break;
case 829015: // Level 4
Serial.println(" OK.");
digitalWrite(24, HIGH);
digitalWrite(27, HIGH);
level = "5";
delay(250);
digitalWrite(24, LOW);
digitalWrite(27, LOW);
break;
case 572901: // Level 5
Serial.println(" OK.");
digitalWrite(24, HIGH);
digitalWrite(27, HIGH);
T.PauseTimer();
level = "END!";
gameEnd();
delay(250);
digitalWrite(24, LOW);
digitalWrite(27, LOW);
loopEnd = false;
default:
Serial.println(" Wrong passwowrd!");
digitalWrite(22, HIGH);
digitalWrite(25, HIGH);
delay(250);
digitalWrite(22, LOW);
digitalWrite(25, LOW);
}

resetPassword();
}

void resetPassword() {
userinput = "";
currentPasswordLength = 0;
printDisplay();
}

void changePassword() {
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, HIGH);
digitalWrite(27, HIGH);
//password = "123";
resetPassword();
Serial.print("Password changed to ");
//Serial.println(password);
delay(100);
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
resetPassword();
}

void resetGame() {
T.SetTimer(0,5,01);
level = "1";
loopEnd = false;
resetPassword();
T.StartTimer();
}

void ledLoop() {
do
{
digitalWrite(22, HIGH);
delay(250);
digitalWrite(22, LOW);
digitalWrite(23, HIGH);
delay(250);
digitalWrite(23, LOW);
digitalWrite(24, HIGH);
delay(250);
digitalWrite(24, LOW);
digitalWrite(27, HIGH);
delay(250);
digitalWrite(27, LOW);
digitalWrite(26, HIGH);
delay(250);
digitalWrite(26, LOW);
digitalWrite(25, HIGH);
delay(250);
digitalWrite(25, LOW);
delay(250);
} while (loopEnd = true);
}

void gameEnd() {
uint8_t winner[] = { 0b01000000,0b01000000,0b00000110,0b01001111 };
display.setSegments(winner);
TFTscreen.background(0, 0, 0);
TFTscreen.setTextSize(1);
TFTscreen.text("Je hebt het spel voltooid", 0, 0);
TFTscreen.text("Kijk op het display voor", 0, 20);
TFTscreen.text("je code! Je moet er nog", 0, 40);
TFTscreen.text("nog 2 x een - voorzetten!", 0, 60);
ledLoop();
}

void printDisplay() {
char charBuf[50];
char levelBuf[50];
userinput.toCharArray(charBuf, 50);
level.toCharArray(levelBuf, 50);
TFTscreen.background(0, 0, 0);
TFTscreen.setTextSize(2);
TFTscreen.text("Voer code in:", 0, 0);
TFTscreen.setTextSize(3);
TFTscreen.text(charBuf, 0, 35);
TFTscreen.text("Level:", 0, 90);
TFTscreen.text(levelBuf, 110,90);
}

void melodyFailPlay() {
tone(piezoPin, 262);
delay(250);
tone(piezoPin, 196);
delay(500);
noTone(piezoPin);
}

void showWaiting() {
// First set all positions to off
matrixAlloff();
// Now mark the waiting circle

}

void showBomb() {
// First set all positions to off
matrixAlloff();
// Now mark the bomb
lc.setLed(0,2,0,true);
lc.setLed(0,3,0,true);
lc.setLed(0,4,0,true);
lc.setLed(0,5,0,true);
lc.setLed(0,1,1,true);
lc.setLed(0,6,1,true);
lc.setLed(0,0,2,true);
lc.setLed(0,2,2,true);
lc.setLed(0,5,2,true);
lc.setLed(0,7,2,true);
lc.setLed(0,0,3,true);
lc.setLed(0,3,3,true);
lc.setLed(0,4,3,true);
lc.setLed(0,7,3,true);
lc.setLed(0,0,4,true);
lc.setLed(0,7,4,true);
lc.setLed(0,0,5,true);
lc.setLed(0,2,5,true);
lc.setLed(0,5,5,true);
lc.setLed(0,7,5,true);
lc.setLed(0,1,6,true);
lc.setLed(0,6,6,true);
lc.setLed(0,2,7,true);
lc.setLed(0,3,7,true);
lc.setLed(0,4,7,true);
lc.setLed(0,5,7,true);
}

void showApproved() {
// First set all positions to off
matrixAlloff();
// Now mark the approved sign
lc.setLed(0,0,2,true);
lc.setLed(0,1,1,true);
lc.setLed(0,2,0,true);
lc.setLed(0,3,1,true);
lc.setLed(0,4,2,true);
lc.setLed(0,5,3,true);
lc.setLed(0,6,4,true);
lc.setLed(0,7,5,true);
}

void showCross() {
// First set all positions to off
matrixAlloff();
// Now mark the cross
lc.setLed(0,0,0,true);
lc.setLed(0,1,1,true);
lc.setLed(0,2,2,true);
lc.setLed(0,3,3,true);
lc.setLed(0,4,4,true);
lc.setLed(0,5,5,true);
lc.setLed(0,6,6,true);
lc.setLed(0,7,7,true);
lc.setLed(0,0,7,true);
lc.setLed(0,1,6,true);
lc.setLed(0,2,5,true);
lc.setLed(0,3,4,true);
lc.setLed(0,4,3,true);
lc.setLed(0,5,2,true);
lc.setLed(0,6,1,true);
lc.setLed(0,7,0,true);
}

void matrixAlloff() {
lc.setLed(0,0,0,false);
lc.setLed(0,0,1,false);
lc.setLed(0,0,2,false);
lc.setLed(0,0,3,false);
lc.setLed(0,0,4,false);
lc.setLed(0,0,5,false);
lc.setLed(0,0,6,false);
lc.setLed(0,0,7,false);
lc.setLed(0,1,0,false);
lc.setLed(0,1,1,false);
lc.setLed(0,1,2,false);
lc.setLed(0,1,3,false);
lc.setLed(0,1,4,false);
lc.setLed(0,1,5,false);
lc.setLed(0,1,6,false);
lc.setLed(0,1,7,false);
lc.setLed(0,2,0,false);
lc.setLed(0,2,1,false);
lc.setLed(0,2,2,false);
lc.setLed(0,2,3,false);
lc.setLed(0,2,4,false);
lc.setLed(0,2,5,false);
lc.setLed(0,2,6,false);
lc.setLed(0,2,7,false);
lc.setLed(0,3,0,false);
lc.setLed(0,3,1,false);
lc.setLed(0,3,2,false);
lc.setLed(0,3,3,false);
lc.setLed(0,3,4,false);
lc.setLed(0,3,5,false);
lc.setLed(0,3,6,false);
lc.setLed(0,3,7,false);
lc.setLed(0,4,0,false);
lc.setLed(0,4,1,false);
lc.setLed(0,4,2,false);
lc.setLed(0,4,3,false);
lc.setLed(0,4,4,false);
lc.setLed(0,4,5,false);
lc.setLed(0,4,6,false);
lc.setLed(0,4,7,false);
lc.setLed(0,5,0,false);
lc.setLed(0,5,1,false);
lc.setLed(0,5,2,false);
lc.setLed(0,5,3,false);
lc.setLed(0,5,4,false);
lc.setLed(0,5,5,false);
lc.setLed(0,5,6,false);
lc.setLed(0,5,7,false);
lc.setLed(0,6,0,false);
lc.setLed(0,6,1,false);
lc.setLed(0,6,2,false);
lc.setLed(0,6,3,false);
lc.setLed(0,6,4,false);
lc.setLed(0,6,5,false);
lc.setLed(0,6,6,false);
lc.setLed(0,6,7,false);
lc.setLed(0,7,0,false);
lc.setLed(0,7,1,false);
lc.setLed(0,7,2,false);
lc.setLed(0,7,3,false);
lc.setLed(0,7,4,false);
lc.setLed(0,7,5,false);
lc.setLed(0,7,6,false);
lc.setLed(0,7,7,false);
delay(10);
}


heb al wel een resetGame() function die dit eventueel moet gaan oppakken, maar die kan ik niet aanroepen zodra hij uit de loop lijn is en dus de ledLoop() function heeft aangeroepen
cpp code
void resetGame() {
T.SetTimer(0,5,01);
level = "1";
loopEnd = false;
resetPassword();
T.StartTimer();
}

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: code herstarten als ik op keypad key A indruk

Berichtdoor shooter » 02 Feb 2016, 19:30

die ledloop bevat twee problemen, hier staat de processor heel erg lang in delays en die loopend kan nooit false worden (of je moet ergens een interupt routine hebben staan.
dus je zult hier met een timer moeten werken en een case en dan de case telkens ophogen als de timer gedaan is.

ofwel zorg dat je programma snel doorlopen wordt, en doe iets in een functie alleen als dat nodig is. dus bijv timer.
paul deelen
shooter@home.nl

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: code herstarten als ik op keypad key A indruk

Berichtdoor christiaan » 03 Feb 2016, 19:45

shooter schreef:die ledloop bevat twee problemen, hier staat de processor heel erg lang in delays en die loopend kan nooit false worden (of je moet ergens een interupt routine hebben staan.
dus je zult hier met een timer moeten werken en een case en dan de case telkens ophogen als de timer gedaan is.

ofwel zorg dat je programma snel doorlopen wordt, en doe iets in een functie alleen als dat nodig is. dus bijv timer.


Hoe stel jij de ledloop functie dan voor? En hoe krijg ik mijn keypad werkend aan het eind...

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: code herstarten als ik op keypad key A indruk

Berichtdoor shooter » 03 Feb 2016, 21:12

int ledloopposition=0; // ergens bovenaan
cpp code
void ledLoop() {
do {
if millis()-ledtimer > 250){ledlooposition++;ledtimer=millis()


switch ledloopposition

{
case 0
digitalWrite(22, HIGH);
break
// delay(250); dat kan weg
case 1
digitalWrite(22, LOW);
digitalWrite(23, HIGH);
case ....
delay(250);
digitalWrite(23, LOW);
digitalWrite(24, HIGH);
delay(250);
digitalWrite(24, LOW);
digitalWrite(27, HIGH);
delay(250);
digitalWrite(27, LOW);
digitalWrite(26, HIGH);
delay(250);
digitalWrite(26, LOW);
digitalWrite(25, HIGH);
delay(250);
digitalWrite(25, LOW);
loopend=false;
delay(250);
} // einde if betekent dat loop maar een keer doorlopen wordt als de tijd om is.
while (loopEnd = true || keytest='A');
}
paul deelen
shooter@home.nl

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: code herstarten als ik op keypad key A indruk

Berichtdoor christiaan » 03 Feb 2016, 21:17

Maar nu loopt ie dus een keer de code door?
En als ik loopend=false weghaal, loopt hij door totdat ik key "A" op loopEnd true maak???

Berichten: 86
Geregistreerd: 31 Dec 2015, 14:11

Re: code herstarten als ik op keypad key A indruk

Berichtdoor christiaan » 04 Feb 2016, 19:12

Krijg de code niet werkend. Als ik het me goed herinner met die millis() en Led timer. Exacte foutmelding kan ik niet melden omdat ik mijn laptop niet heb nu

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten