Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const int optoPin = 12; //questo è il pin a cui è collegato l'optoswitch
- const int relePin = 2;
- const int buzzerPin = 9;
- const int relePinRefill = 8;
- int pin;
- int value;
- bool optoState; //stato dell'opto
- bool lastOptoState; //stato precedente dell'opto
- int coins = 0;
- unsigned long startTime;
- #define TIMEOUT 10000
- #define BUZTIME 100
- //Funzioni dei vari cicli
- void changeMenu();
- void dispMenu();
- void control1();
- void control2();
- //Variabili globali
- char menu = 0x01;
- char set1 = 0x00, set2 = 0x00;
- boolean t_butDown, t_butP, t_butUp;
- //DISPLAY Mappa Hardware
- #include <LiquidCrystal.h>
- LiquidCrystal lcd ( 13, //RS
- 3, //EN
- 4, //D4
- 5, //D5
- 6, //D6
- 7); //D7
- #include <Keypad.h>
- const byte ROWS = 4; //number of rows on the keypad i.e. 4
- const byte COLS = 4; //number of columns on the keypad i,e, 3
- char keys[ROWS][COLS] =
- {
- {'1', '2', '3', 'A'},
- {'4', '5', '6', 'B'},
- {'7', '8', '9', 'C'},
- {'*', '0', '#', 'D'}
- };
- byte rowPins[ROWS] = {11, 10, A5, A4}; //Rows 0 to 3
- byte colPins[COLS] = {A0, A1, A2, A3}; //Columns 0 to 3
- // command for library forkeypad
- //initializes an instance of the Keypad class
- Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
- char tastobattuto; // variabile di memorizzazione del carattere battuto
- byte semaforoval = 0; // semaforo di gestione della routine di ricezione valori da tastiera
- int valore = 0; // numero battuto sulla tastiera
- int moltiplicatore = 0; // utilizzato nel calcolo del codice battuto su tastiera
- int indice = 0; // utilizzato nel calcolo del valore battuto su tastiera
- int tabnum [5]; // tabella di memorizzazione dei dati battuti (max 4 cifre, 9999)
- byte indtab = 0; // indice di scorimento della tabella tabnum
- byte semloop = 0; // semaforo che indica che la routine di acquisizione dei dati da tastiera e' stata lanciata dl loop
- int numerosegreto = 1982;
- void tastieraecountdown ()
- {
- if (semloop == 1) // se arrivo dal loop
- semaforoval = 1; // inibisce il loop di ricezione, a meno che non sia stato premuto un tasto
- tastobattuto = keypad.getKey(); // acquisisce il valore del tasto battuto, gia' trascodificato tramite la tabella chiave
- for (indtab = 0; indtab < 5; indtab ++) // pulisce i dati eventualmente gia' memorizzati
- tabnum [indtab] = 0;
- indtab = 0;
- valore = 0;
- if (tastobattuto) // se e' stato premuto un tasto
- {
- lcd.clear ();
- delay (200); // 200 millisecondi di delay (per evitare una doppia battuta)
- semaforoval = 0;
- }
- while (semaforoval == 0)
- { // loop di ricezione dati - data receiving loop
- if (semloop == 1)
- // se si e' in fase di loop
- if (tastobattuto) // se e' stato battuto un tasto
- {
- lcd.setCursor (indtab, 0);
- lcd.print (tastobattuto);
- if ((tastobattuto >= '0') && (tastobattuto <= '9'))
- {
- tabnum [indtab] = tastobattuto - 48;// memorizza il valore battuto, trasformato in un numero da 0 a 9
- indtab++;
- if (indtab == 4)
- semaforoval = 1; // esce dal loop di ricezione dati
- }
- if (tastobattuto == 'C') // se e' stata annullata la digitazione
- {
- for (indtab = 0; indtab < 5; indtab ++) // pulisce i dati eventualmente gia' memorizzati
- tabnum [indtab] = 0;
- indtab = 0;
- valore = 0;
- lcd.clear ();
- semaforoval = 1; // esce dal loop di ricezione dati
- }
- if (tastobattuto == 'D')
- semaforoval = 1; // esce dal loop di ricezione dati
- }
- if (semaforoval == 0)
- {
- tastobattuto = keypad.getKey(); // acquisisce il valore del successivo tasto battuto (gia' trascodificato
- // tramite la tabella chiave)
- delay (200); // attende 2/10 di secondo per evitare una doppia battuta
- }
- }
- valore = 0;
- moltiplicatore = 1;
- for (indice = indtab; indice > 1; indice--)
- moltiplicatore = moltiplicatore * 10;
- for (indice = 0; indice <= indtab; indice++)
- {
- valore = valore + tabnum[indice] * moltiplicatore;
- moltiplicatore = moltiplicatore / 10;
- }
- }
- void setup() {
- lcd.begin(16, 2);
- pinMode(buzzerPin, OUTPUT);
- pinMode(optoPin, INPUT_PULLUP);
- pinMode(relePin, OUTPUT);
- pinMode(relePinRefill, OUTPUT);
- digitalWrite(relePin, HIGH);
- digitalWrite(relePinRefill, LOW);
- Serial.begin(9600); //inizio comunicazione seriale
- optoState = digitalRead(optoPin);
- digitalWrite(buzzerPin, HIGH);
- delay(500);
- digitalWrite(buzzerPin, LOW);
- lcd.setCursor(0, 0);
- lcd.print("LaBucciata Slot");
- delay(5000);
- lcd.setCursor(0, 1);
- lcd.print("Configurazione..");
- delay(500);
- lcd.begin(16, 2);
- lcd.setCursor(5, 0);
- lcd.print("Ready");
- delay(400);
- digitalWrite(buzzerPin, HIGH);
- delay(200);
- digitalWrite(buzzerPin, LOW);
- delay(200);
- digitalWrite(buzzerPin, HIGH);
- delay(200);
- digitalWrite(buzzerPin, LOW);
- lcd.begin(16, 2);
- keypad.addEventListener(keypadEvent);
- t_butDown = 0x00;
- t_butP = 0x00;
- t_butUp = 0x00;
- }
- void loop() {
- checkForCredits1();
- releaseTokens();
- tokensCountDown();
- char keypressed = keypad.getKey();
- if (keypressed != NO_KEY)
- {
- Serial.print(keypressed);
- }
- changeMenu(); //Menu di scambio
- dispMenu(); //Selezionare il menu
- }
- void gettonikey()
- {
- lcd.clear();
- lcd.setCursor(0, 1);
- lcd.print("n. gettoni");
- semloop = 1; // setta il semaforo di "loop attivo"
- valore = 0;
- while (valore == 0)
- tastieraecountdown ();
- coins = (valore);
- }
- //Funzioni
- void keypadEvent(KeypadEvent eKey) {
- switch (keypad.getState()) {
- case PRESSED:
- digitalWrite(buzzerPin, HIGH);
- delay(50);
- digitalWrite(buzzerPin, LOW);
- lcd.begin(16, 2);
- lcd.setCursor(5, 0);
- Serial.print(eKey);
- switch (eKey) {
- case '*': t_butUp = 0x01; break;
- case '#': t_butDown = 0x01; break;
- case 'A': t_butP = 0x01; break;
- }
- }
- }
- void changeMenu() {
- if (t_butUp && t_butUp) {
- t_butUp = 0x00;
- lcd.clear(); //Cancella Schermo lcd
- menu++;
- if (menu > 0x02) {
- menu = 0x01;
- }
- }
- if (t_butDown && t_butDown) {
- t_butDown = 0x00;
- lcd.clear();
- menu--;
- if (menu < 0x01) {
- menu = 0x02;
- }
- }
- }
- void dispMenu() {
- switch (menu) {
- case 0x01:
- control1(); //Funzione controllo led1
- break;
- case 0x02:
- control2();
- break;
- }
- }
- void control1() {
- lcd.setCursor(0, 1);
- lcd.print("refill");
- if (t_butP && t_butP) {
- t_butP = 0x00;
- set1++;
- if (set1 > 3) {
- set1 = 0x01;
- }
- switch (set1) {
- case 0x01:
- lcd.clear();
- lcd.setCursor(0, 1);
- digitalWrite(relePinRefill, HIGH);
- lcd.print("refill ON");
- break;
- case 0x02:
- lcd.clear();
- lcd.setCursor(0, 1);
- digitalWrite(relePinRefill, LOW);
- lcd.print("refill OFF");
- break;
- }
- }
- }
- void control2() {
- lcd.setCursor(0, 1);
- lcd.print("erogazione gettoni");
- if (t_butP && t_butP) {
- t_butP = 0x00;
- set2++;
- if (set2 > 1) {
- set2 = 0x01;
- }
- switch (set2) {
- case 0x01:
- lcd.clear();
- lcd.setCursor(0, 1);
- lcd.print("inserisci password");
- semloop = 1; // setta il semaforo di "loop attivo"
- valore = 0;
- while (valore == 0)
- tastieraecountdown (); // acquisisce dati da tastiera
- if (valore == numerosegreto)
- {
- gettonikey();
- }
- else
- {
- lcd.clear();
- lcd.setCursor(0 ,1);
- lcd.print("errore");
- }
- break;
- }
- }
- }
- void checkForCredits1() {
- while (Serial.available() > 0) {
- value = Serial.parseInt();
- if (Serial.read() == 'x') {
- if (value > 0) {
- coins ++;
- Serial.flush();
- Serial.begin(9600);
- }
- }
- }
- }
- void releaseTokens() {
- if (coins > 0) {
- // Se il motore è fermo, memorizzo il momento in cui parte.
- // In questo modo mi assicuro di impostare la variabile solo al fronte di salita di relePin
- if (digitalRead(relePin) == HIGH) {
- startTime = millis();
- }
- digitalWrite(relePin, LOW); //rilascio gettoni
- optoState = digitalRead(optoPin);
- }
- else {
- digitalWrite(relePin, HIGH);//STOP rilascio gettoni
- lcd.setCursor(0, 0);
- lcd.print("LaBucciata Slot $ $ Buona Fortuna $ $");
- delay(400);
- for (int positionCounter = 0; positionCounter < 1; positionCounter++) {
- lcd.scrollDisplayLeft();
- }
- }
- // Solo se il motore è ancora acceso, dopo 10 secondi dall'attivazione, resetto l'uscita
- if (digitalRead(relePin) == LOW) {
- if (millis() - startTime > TIMEOUT ) {
- digitalWrite(relePin, HIGH); //STOP rilascio gettoni
- digitalWrite(buzzerPin, HIGH);
- lcd.begin(16, 2);
- lcd.setCursor(5, 0);
- lcd.print("refill");
- digitalWrite(relePinRefill, HIGH);
- delay(3000);
- lcd.begin(16, 2);
- lcd.setCursor(0, 0);
- lcd.print("gettoni mancanti:");
- delay(1000);
- lcd.setCursor(13, 1);
- lcd.println(coins);
- coins = 0;
- digitalWrite(buzzerPin, LOW);
- lcd.begin(16, 2);
- }
- }
- }
- void tokensCountDown() {
- if (optoState != lastOptoState) { // se lo stato dell'opto è cambiato (cioè qualcosa sta passando, in entrata o uscita)
- lastOptoState = optoState;
- delay (100); //debounce "economico" (questo serve perchè nel passaggio di stato possono esserci fluttuazioni che portano a conteggi errati)
- if (lastOptoState == LOW && coins > 0) {
- coins = coins - 1 ; //decremento gettoni
- startTime = millis(); //reset timer
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement