Questo circuito permette di accendere un LED per 10 sec premendo un pulsante, il tempo decrescente è visualizzato su un display. Il LED può essere spento in qualsiasi momento da un altro pulsante. I pulsanti usano la resistenza di pull-up interna al micro controllore Atmega 328.
// ******************************************** // * Accende un led per 10 sec se si preme P1 * // * Si spegne tutto con P2 e il display * // * segna il conto alla rovescia * // * Realizzato da Cusato Emmanuel Guido * // * 08-10-2019 * // ******************************************** #include <Wire.h> #include <LiquidCrystal_PCF8574.h> LiquidCrystal_PCF8574 lcd(0x27); void setup() { lcd.begin (16, 2); lcd.setBacklight (255); pinMode (13, OUTPUT); //Pin 13 in uscita pinMode (8, INPUT_PULLUP); //Pin 8 in ingresso + resistenza di pull up pinMode (9, INPUT_PULLUP); //Pin 9 in ingresso + resistenza di pull up Serial.begin (9600); //Casomai servisse il monitor seriale } void loop() { if (digitalRead (8) == LOW){ //Controllo P1 premuto lcd.clear(); //Pulisce display for (int i = 10; i>=0 ; i--){ //Conteggio da 10 a 0 if (digitalRead (9) == LOW){ //Se viene premuto il secondo pulsante break; //Esce dal ciclo for } digitalWrite (13, HIGH); //LED ON lcd.setCursor (0, 0); //Colonna 0 - riga 0 del display lcd.print (i); //Stampa sul display conto alla rovescia delay (1000); //Pausa lcd.clear(); } digitalWrite (13, LOW); //LED OFF } else{ digitalWrite (13, LOW); //LED OFF lcd.setCursor (0, 0); lcd.print("LED SPENTO"); //Stampa sul display } }
La versione che segue è elaborata in modo molto diverso ma ottiene gli stessi risultati
// Gabriele Panfilo - 10.10.2019 // Accensione con spegnimento ritardato #include <Wire.h> #include <LiquidCrystal_PCF8574.h> LiquidCrystal_PCF8574 lcd(0x27); boolean riposo7=true; boolean riposo8=true; boolean inconteggio=false; int conteggio=10; long int time=0; void setup(){ pinMode(7, INPUT_PULLUP); pinMode(8, INPUT_PULLUP); pinMode(13, OUTPUT); lcd.begin(16, 2); lcd.setBacklight(1); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Tempo: 0"); } void loop(){ if (!digitalRead(7) && digitalRead(8)) { delay(100); if (riposo7 && !inconteggio) { inconteggio=true; digitalWrite(13, 1); } riposo7=false; } else if (!digitalRead(8) && digitalRead(7)) { delay(100); if (riposo8 && inconteggio) { stop(); } riposo8=false; } if (digitalRead(8)) { riposo8=true; } if (digitalRead(7)) { riposo7=true; } if (inconteggio && round((millis() - time) / 1000)) { time=millis(); lcd.clear(); lcd.print("Tempo: " + String(conteggio)); if (conteggio) { conteggio--; } else { stop(); } } } void stop(){ lcd.clear(); lcd.print("Tempo: 0"); time=0; conteggio=10; inconteggio=false; digitalWrite(13, 0); }