Incremento ora con pulsante

Salve ragazzi
Ho bisogno di aiuto poichè non riesco a venirne fuori !
Ho richiamato la libreria rtc su arduino uno , e mi appare l'ora partendo da come è impostata sul rtc.setTime (12,00,00) , fino a qui tutto bene !

Quello che voglio fare è incrementare l'ora quando premo un pulsante!
Io sono riuscito ad incrementare di 1 ora , ma se ripremo il pulsante non accade niente !

Qualcuno gentilmente mi può dare una dritta ?

inserisco qui sotto lo sketch :

#include <swRTC.h>
swRTC rtc;
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int BUTTON = 6;
int statoButton = 0; // stato del pulsante (inizialmente non premuto)
int lastStatoButton = 0; // ultimo stato del pulsante (per ora non premuto)
int countButton = 0; // Conteggio del bottone

void setup() {
delay(2000);
rtc.stopRTC();
rtc.setTime(12,00,00);
rtc.startRTC();

lcd.begin(16, 2);
pinMode(BUTTON, INPUT); // imposta il pin digitale come input
}

void loop() {

if(digitalRead(BUTTON))
{
// Aspetto 15ms per far alzare il dito all'utente
delay(15);
// Cambio l'ultimo stato del bottone
if(lastStatoButton==0) lastStatoButton=1;
else lastStatoButton=0;
// Aumento il count del bottone
if(countButton<=1) countButton=countButton+1;
else countButton=0;
}
lcd.setCursor(5, 0);
lcd.print(rtc.getHours() + lastStatoButton, DEC);
lcd.print(":");
lcd.print(rtc.getMinutes(), DEC);
lcd.print(":");
lcd.print(rtc.getSeconds(), DEC);
lcd.print(" ");

}

grazie

Non capisco la logica del tuo programma. Mi pare che il cambio dell'ora sia solo in fase di visualizzazione, non cambi materialmente l'orario al swRTC.

una cosa così?

 if(digitalRead(BUTTON))
  { 
rtc.setTime(ultima_ora +1, ultimo_min, ultimo sec);
// Aspetto 800ms per far alzare il dito all'utente se lo tengo premuto avanza ancora
    delay(800);

Ciao leo72
Capisco perché non vedi una logica! Il motivo è che non so programmare! Sto cercando di imparare!
Il fatto è che non so come fare ad incrementare una variabile per più di una volta, mi spiego meglio, se io premo il pulsante una volta, il 12,mi diventa 13. Ma se lo ripremo non aumenta più.
Probabilmente è una stupidaggine, ma non la conosco.
Se tu hai una soluzione più semplice, me la puoi postare!

Ho visto lo sketch di pablos ma non ho capito se ultima_ora è una variabile o una parola chiave della libreria rtc?
Comunque domani provo, perché adesso sto scrivendo dal tablet.

Non sono istruzioni della libreria, sono delle variabili temporenee, dove copi HH,MM,SS se tu lasciassi a 0 minuti e secondi ogni volta che incrementi l'ora così:

rtc.setTime(12+countButton,00,00);
azzeresti i minuti e secondi perdendo il sincronismo

Ciao Pablos
Ho provato come dici te con ultima_ora ecc. però riesco ad incrementare solo una volta .
Potresti sistemarmi lo sketch che riporto qui sotto , cosi capisco dove sbaglio ?

#include <swRTC.h>
swRTC rtc;
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
const int BUTTON = 6;
//int statoButton = 0; // stato del pulsante (inizialmente non premuto)
//int lastStatoButton = 0; // ultimo stato del pulsante (per ora non premuto)
//int countButton = 0; // Conteggio del bottone
int ultima_ora = 0;
int ultimo_min = 0;
int ultimo_sec = 0;

void setup() {
delay(2000);
rtc.stopRTC();
rtc.setTime(ultima_ora, ultimo_min, ultimo_sec);
rtc.startRTC();

lcd.begin(16, 2);
pinMode(BUTTON, INPUT); // imposta il pin digitale come input
}

void loop() {

if(digitalRead(BUTTON)) {
rtc.setTime(ultima_ora +1, ultimo_min, ultimo_sec);
// Aspetto 800ms per far alzare il dito all'utente se lo tengo premuto avanza ancora
delay(800);
}

lcd.setCursor(5, 0);
lcd.print(rtc.getHours(), DEC);
lcd.print(":");
lcd.print(rtc.getMinutes(), DEC);
lcd.print(":");
lcd.print(rtc.getSeconds(), DEC);
lcd.print(" ");

}

willy72:
rtc.setTime(ultima_ora +1, ultimo_min, ultimo_sec);

Per forza che non la cambi più. Al valore delle ore assegni SEMPRE il valore iniziale + 1. Quindi lo sketch parte con ultima_ora che vale 0. Alla prima pressione fai 0+1=1 e scrivi 1. Alle successive pressioni fai sempre 0+1.
Devi incrementare il valore di ultima_ora. Anzi, per fare una cosa fatta bene dovresti:

  1. leggere l'ora dall'RTC
  2. incrementare questo valore (e controllare di non passare le 23)
  3. salvare l'ora

byte temp = rtc.getHours() + 1;
rtc.setTime(temp, rtc.getMinutes(), rtc.getSeconds());

Ovviamente ricordati che incrementando le ore e passando le 23 devi incrementare il giorno ecc..

Ciao Leo72

Grazie ora funziona tutto perfettamente !

In pratica se il pulsante è premuto assegni alla variabile "temp" il valore di rtc.getHours +1 . ma non mi è chiara la funzione del "byte" !

Mi potresti spiegare come viene usato e in quali occasioni ?

So che possono sembrare domande idiote ,ma è da solo un paio di settimane che ho scoperto arduino ed il linguaggio di programmazione lo sto imparando man mano che mi compaiono i problemi.

grazie ciao

byte indica il tipo di dato. --> http://arduino.cc/en/Reference/Byte
Altri tipi sono: boolean, char, unsigned char, int, unsigned int, word, long, unsigned long, float ecc ecc.

Dai una lettura qui --> C++: tutorial del linguaggio di programmazione | HTML.it oppure C (linguaggio): tutorial per imparare programmare | Guida HTML.it
e qui --> Arduino - Home

si hai ragione scusa con ultima_ora +1 intendevo evidenziare dove andava messo l'incremento, il +1 sarebbe stato il tuo count
ciao

ok grazie