Pages: [1]   Go Down
Author Topic: Incremento ora con pulsante  (Read 968 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3240
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

una cosa così?

Code:
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);  
« Last Edit: October 16, 2012, 11:28:00 am by pablos » Logged

no comment

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.



Logged

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3240
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: October 16, 2012, 03:06:23 pm by pablos » Logged

no comment

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
 
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 110
Posts: 6974
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: October 17, 2012, 03:31:52 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Genova
Offline Offline
Faraday Member
**
Karma: 38
Posts: 3240
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

no comment

Offline Offline
Newbie
*
Karma: 1
Posts: 9
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok grazie
Logged

Pages: [1]   Go Up
Jump to: