Home Forum MICROCONTROLLORI Timer al volo

Questo argomento contiene 2 risposte, ha 2 partecipanti, ed è stato aggiornato da  solideo 4 mesi, 3 settimane fa.

Stai vedendo 3 articoli - dal 1 a 3 (di 3 totali)
  • Autore
    Articoli
  • #60786

    solideo
    Partecipante

    Ciao a tutti,
    dopo un piccolo incidente al bromografo, con relativa distruzione del timer, ho la necessita’ di farne uno al volo, non faccio nemmeno il pcb ma lo monto direttamente su breadbord, ed avendo degli arduino micro a disposizione ho pensato di usare la funzione ‘delay’ per il timer.
    Questo e’ il codice molto spartano, ma per il momento non ho bisogno di tanti fronzoli, che avevo pensato:
    #include int buzzer = 10;
    int up = 8;
    int down = 9;
    int start = 7;
    int rele = 6;
    int sec = 0;
    int i = 0;
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

    void setup() {
    // put your setup code here, to run once:
    pinMode(up, INPUT);
    pinMode(down, INPUT);
    pinMode(start, INPUT);
    pinMode(buzzer, OUTPUT);
    pinMode(rele, OUTPUT);
    lcd.begin(16, 2);
    lcd.print("Secondi:");

    }

    void loop() {
    // put your main code here, to run repeatedly:
    if (digitalRead(up) == HIGH ) { // controlla se il tasto è premuto
    delay(50); // ritardo per l'anti rimbalzo
    if (digitalRead(up) == HIGH ) { // ricontrolla dopo il delay se è sempre premuto, se falso ( non premuto ) esce dalla if vero continua
    sec++; //aumenta i secondi
    lcd.setCursor(1, 1); //posiziono il cursore senconda riga prima colonna
    lcd.print(sec, DEC); //scrive il valore dei secondi in formato decimale
    }
    }
    if (digitalRead(down) == HIGH ) {
    delay(50);
    if (digitalRead(down) == HIGH ) {
    sec--;
    lcd.setCursor(1, 1);
    lcd.print(sec, DEC);
    }
    }
    if (digitalRead(start) == HIGH ) {
    delay(50);
    if (digitalRead(start) == HIGH) {
    for (i = sec; i >= 1; i--) { // assegno ad i il valore dei secondi ed inizio ciclo fino a quando i è maggiore o ugaule 1 e decremeto i ad ogni ciclo
    digitalWrite(rele, HIGH); // attivo il rele
    lcd.setCursor(1, 1);
    lcd.print(i);
    delay(1000); // aspetto 1 secondo prima del prossimo ciclo
    }
    tone(buzzer, 400); // finito il ciclo for suona il buzzer
    delay(700);
    }
    }
    }

    mentre questo è il link allo schema :

    https://www.dropbox.com/s/inqof8v9zag7btz/arduino_timer_2_bb%20%28Small%29.jpg

    la cosa che volevo sapere da chi e’ piu esperto se come soluzione tampone puo andare bene.

    p.s. chiaramente se qualcosa puo andare storto va storto, nel computer che uso per programmare l’arduino si è guastato l’ hard disk, quindi devo sostituirlo e poi riinstallare il tutto.

    #75762

    Ivan.Tarozzi
    Partecipante

    Non sono un esperto di arduino ma a naso noto 2 cose:

    Il rele andrebbe attivato una sola volta fuori dal ciclo for, anche se di fatto anche così non cambia molto.

    Alla fine del ciclo il rele non viene disattivato.

    Infine, come logica lo sketch dovrebbe funzionare, ma il ciclo for di decremento secondi blocca il loop rendendo impossibile ad esempio una eventuale gestione dello stop anticipato o altro

    #75763

    solideo
    Partecipante

    Grazie della risposta, 4 occhi vedono meglio di 2
    Alla fine del ciclo il rele non viene disattivato.
    Hai ragione lo modifico subito.
    ...eventuale gestione dello stop anticipato o altro
    E’ per emergenza quindi per ora non ho bisogno di tante cose.

Stai vedendo 3 articoli - dal 1 a 3 (di 3 totali)

Devi aver eseguito l’accesso per poter rispondere a questa discussione.