Offline
Newbie
Karma: 0
Posts: 9
|
 |
« on: October 16, 2012, 10:56:51 am » |
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
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16440
Don't know what I do
|
 |
« Reply #1 on: October 16, 2012, 11:03:56 am » |
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
Edison Member
Karma: 14
Posts: 2439
|
 |
« Reply #2 on: October 16, 2012, 11:09:50 am » |
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);
|
|
|
|
« Last Edit: October 16, 2012, 11:28:00 am by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #3 on: October 16, 2012, 01:32:52 pm » |
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
Edison Member
Karma: 14
Posts: 2439
|
 |
« Reply #4 on: October 16, 2012, 03:04:39 pm » |
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
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #5 on: October 17, 2012, 01:50:09 am » |
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
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16440
Don't know what I do
|
 |
« Reply #6 on: October 17, 2012, 02:04:20 am » |
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
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #7 on: October 17, 2012, 03:24:03 am » |
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
Offline
Faraday Member
Karma: 49
Posts: 3001
|
 |
« Reply #8 on: October 17, 2012, 03:29:17 am » |
byte indica il tipo di dato. --> http://arduino.cc/en/Reference/ByteAltri 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
|
IDE 1.0.4 - Arduino UNO R3 - Ethernet Shield R3 - DCF77 Module - Adafruit Data Loggin Shield - LCD 16x2 RGB positive backlight - i2c LCD backpack - RTC 1307 Board - Saleae Compatibile Logic Analyzer 8ch 24Mhz - ATtiny2313 ProtoBoard - Xino Board - ATtiny 4313 - Arduino 2009 - Arduino USB Serial Ligth - DS18B20 - LM35DZ - ShiftRegister - TL431 - ATtiny 85 Ultimi acquisti: CodeBender: http://codebender.cc/register/?referrer=PaoloP
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2439
|
 |
« Reply #9 on: October 17, 2012, 04:26:25 am » |
si hai ragione scusa con ultima_ora +1 intendevo evidenziare dove andava messo l'incremento, il +1 sarebbe stato il tuo count ciao
|
|
|
|
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 9
|
 |
« Reply #10 on: October 17, 2012, 08:57:11 am » |
ok grazie
|
|
|
|
|
Logged
|
|
|
|
|
|