modifiche e applicazioni swRTC per timer alba/tramonto

Ciao a tutti, siccome l’rtc hardware non mi riesce a farlo funzionare ci provo col software!

Lo scopo del progetto è pilotare 1-2-3…x strisce led in pwm con un timer con display lcd e 2 pulsanti per regolare l’ora su display lcd

L’impiego è acquariofilo, via software imposto le fasce orarie del fading delle strisce, con i 2 pulsanti regolo l’ora una volta attaccato

Per semplificarmi la vita ho diviso il lavoro in vari step

  1. applicare l’utilizzo dei 2 pulsanti al swrtc per cambiare l’ora e vedere tali modifiche tramite interrogazione serial monitor
  2. scrivere tutto su lcd
  3. montare tutto e bere una birra celebrativa

naturalmente mi sono già bloccato al primo step ( sarà che l’ultima volta che ho fatto un lavoro complesso in c era su un atmel 8535 nel 2006) ma non capisco dove sbaglio perchè 99 su 100 non mi ricordo il c

vi allego lo sketch attualmente realizzato

#include <swRTC.h>
swRTC rtc;
const int buttonPinH = 6;     // numero pulsante ore
const int buttonPinM = 7;     // numero pulsante minuti 

int buttonStateH = 0;         // variabile per leggere stato pulsante Ore
int buttonStateM = 0;         // variabile per leggere stato pulsante Minuti
int x=0;
int y=0;
int z=0;

void setup() {
    delay(2000); //delay to let the user opens the serial monitor
    rtc.stopRTC(); //stop the RTC
    rtc.setTime(x,y,0); //set the time here
    rtc.setDate(27,10,2011); //set the date here
    rtc.startRTC(); //start the RTC
    Serial.begin(19200); //choose the serial speed here
    // inizializzazione pulsante ore input:
  pinMode(buttonPinH, INPUT);
  // // inizializzazione pulsante minuti input:
  pinMode(buttonPinM, INPUT);  
}

void loop() {
   // read the state of the pushbutton value:
  buttonStateH = digitalRead(buttonPinH);
  buttonStateM = digitalRead(buttonPinM);
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonStateH == HIGH) {     
    // turn LED on:    
    rtc.stopRTC(); //stop the RTC
    rtc.setTime(x++,y,0); //set the time here
    rtc.startRTC(); //start the RTC  
  } 
  else if(buttonStateM == HIGH) {
    rtc.stopRTC(); //stop the RTC
    rtc.setTime(x,y++,0); //set the time here
    rtc.startRTC(); //start the RTC  
  }
  else{
    }  
 
  
  Serial.print(rtc.getHours(), DEC);
    Serial.print(":");
    Serial.print(rtc.getMinutes(), DEC);
    Serial.print(":");
    Serial.print(rtc.getSeconds(), DEC);
    Serial.print("  ");
    delay(1000);
}

se mandato in debug da serial monitor noto un incremento random dei minuti e delle ore senza alcuna pressione dei pulsanti ma non capisco come mai… forse ho sbagliato qualcosa nell 'if else-if , ne sono quasi sicuro ma non capisco cosa…

qualcuno mi potrebbe aiutare?
è ben accetto tutto!

Mi pareva che ti avessi già chiesto questa cosa ma comunque mi ripeto: secondo me hai un problema di debounce sui pulsanti, ossia che lo sketch legge valori casuali anche se non premi gli stessi. Lato software, non vedo infatti nessun controllo per evitare false letture tipo rimbalzi o fluttuazioni della lettura. Lato hardware, hai messo delle resistenze di pull-down sui pulsantini?

leo72: Mi pareva che ti avessi già chiesto questa cosa ma comunque mi ripeto: secondo me hai un problema di debounce sui pulsanti, ossia che lo sketch legge valori casuali anche se non premi gli stessi. Lato software, non vedo infatti nessun controllo per evitare false letture tipo rimbalzi o fluttuazioni della lettura. Lato hardware, hai messo delle resistenze di pull-down sui pulsantini?

Il bounce si verifica solo se li preme i pulsanti, quindi il problema probabilmente è nell'alta impedenza dei pin, che risolve come gli hai consigliato: una R da 10K in pull-down per ogni pulsante

Pull down,non mi ? nuova questa configurazione, ci studio e guardo cosa inventare domani sera, il resto del sorgente vi sembra logico?

duch: Pull down,non mi ? nuova questa configurazione, ci studio e guardo cosa inventare domani sera, il resto del sorgente vi sembra logico?

In parole povere devi mettere una R da 10K tra il pin a cui è collegato il pulsante e GND, sul sorgente non so aiutarti

menniti: Il bounce si verifica solo se li preme i pulsanti,

Vero, però senza pull-up o pull-down può anche leggere fluttuazioni, come ho precisato:

non vedo infatti nessun controllo per evitare false letture tipo rimbalzi o fluttuazioni della lettura.

Con un pin messo in input legge la mano passata sull'Arduino come la vicinanza di una qualunque fonte di elettromagnetismo.

@duch: come ho detto, devi implementare anche un controllo di debounce via software. Quindi, dopo aver messo le resistenze che ti abbiamo consigliato, metti i controlli sulla pressione così:

if (digitalRead(buttonPinM) == HIGH) { //pulsante premuto?
    delay(30); //aspetti per vedere se il pulsante è ancora premuto
    if (digitalRead(buttonPinM) == HIGH) { //è ancora premuto
        .......(il tuo codice).....
    }
}

Ok, torna tutto! Domani metto mano a tutto, dovrei avere resistenze ago e filo XD

Per il controllo deduco che devo fare una cascata di if , domani tireró fuori gli appunti di informatica e gli schemi della vecchia tesina e mi faccio anche un ripassone sennó sfiguro troppo contro voi due!

Sì, ma non ripassare troppo altrimenti poi sfiguriamo noi :blush: