Timer 10 sec con Arduino e display LCD

9 10 2019

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.

Schema elettrico del circuito timer

// ********************************************
// * 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);
  
}