Go Down

Topic: Incremento ora con pulsante (Read 1 time) previous topic - next topic

willy72

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

leo72

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.

pablos

#2
Oct 16, 2012, 06:09 pm Last Edit: Oct 16, 2012, 06:28 pm by pablos Reason: 1
una cosa così?

Code: [Select]
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);  
no comment

willy72

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.




pablos

#4
Oct 16, 2012, 10:04 pm Last Edit: Oct 16, 2012, 10:06 pm by pablos Reason: 1
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
no comment

willy72

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("  ");

 
  }

leo72


  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..

willy72

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

PaoloP

#8
Oct 17, 2012, 10:29 am Last Edit: Oct 17, 2012, 10:31 am by PaoloP Reason: 1
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 --> http://www.html.it/guide/guida-c2/ oppure http://www.html.it/guide/guida-c/
e qui --> http://arduino.cc/en/Reference/HomePage
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

pablos

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

willy72


Go Up