Salve a tutti,sto utilizzando la libreria swRTC rtc. Praticamente mi funziona perfettamente, solo che vorrei scrivere il programma che se sono le 19:00 si accende una lampada e gradualmente col PWM aumenta di intensità fino alle 19:05 e appenasono le 19:10 si spegne, ho provato a fare un if di questa maniera ma non mi fuziona
#include <DallasTemperature.h>
#include <swRTC.h>
swRTC rtc;
#include <OneWire.h>
#include <LiquidCrystal.h>
#define led 6
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int FotoPin = A1;
int FotoValue;
void setup() {
pinMode(led,OUTPUT);
sensor.begin ();
lcd.begin(16, 2);
rtc.stopRTC(); //stop the RTC
rtc.setTime(18,56,0); //set the time here
rtc.setDate(06,10,2013); //set the date here
rtc.startRTC(); //start the RTC
Serial.begin(19200); //choose the serial speed here
delay(2000); //delay to let the user opens the serial monitor
}
void loop() {
sensor.requestTemperatures();
[b] if (rtc.setTime(19,0,0)){
digitalWrite(led,HIGH);}
[/b]
lcd.clear();
lcd.setCursor(0, 0); // bottom left
lcd.print(rtc.getHours(), DEC);
lcd.print(":");
lcd.print(rtc.getMinutes(), DEC);
lcd.print(":");
lcd.print(rtc.getSeconds(), DEC);
lcd.print(" -- ");
lcd.print(rtc.getDay(), DEC);
lcd.print("/");
lcd.print(rtc.getMonth(), DEC);
lcd.print("/");
lcd.print(rtc.getYear(), DEC);
lcd.print(" (Leap year: ");
lcd.setCursor(0, 1); // bottom left
FotoValue = analogRead(FotoPin);
lcd.print (sensor.getTempCByIndex(0));
lcd.print (" C ");
lcd.print (FotoValue);
lcd.print(" lm");
delay(500);
}
Sbagli comando, intanto per usare la PWM devi usare analogWrite(pin,0-255).
Secondo con il comando :
if (rtc.setTime(19,0,0)){
Non leggi l'ora , non fai nulla perchè non cè una condizione e quel comando serve per impostare l'ora non per leggerla, mi chiedo come mai il compilatore non ti dia errore
devi fare così:
ratto93:
Sbagli comando, intanto per usare la PWM devi usare analogWrite(pin,0-255).
quindi dopo l'if mettendo un
analogWrite(led,1)
ho un incremento istantaneo, ma se lo volessi avere graduale fino a quando
if ((rtc.getHours() == 19 && rtc.getMinutes() == 5 && rtc.getSeconds() == 0)){
analogWrite(led,255)}
Non c'è un modo più semplice? Se dovessi per esempio programmarlo non da sketch l'accensione e lo spegnimento ma da tastierino o da pulsanti ecc. come dovrei fare? In questo metti un if ogni minuto fino a che arriva perchè so già quanti minuti durerà l'incremento, ma se dovessi programmarlo in modo che mi stampa:
"inserire orario di inizio accensione" ---19:00 e inizia l'ìincremento
"inserire orario di massima luminosità"---23:00 il led è arrivato a 255
devi fare un if dove entri se l ora è maggiore di inizio e minore di fine, vedi quanto minuti sono passati da inizio,fai una AnalogWrite di (Pin, (minuti/intervallo))
per fare l'incremento ogni intervallo devo fare un ciclo for giusto?
se l'incremento è ogni 10 secondi come lo imposto?
for (luminosità=0,luminosità<=255,luminosità++)
analogWrite(pin, luminosità)
in questo modo avviene subito, ma se deve avvenire in base l'intervallo calcolato, quindi ogni 10 secondi, o ogni minuto ecc.?
Dovrei mettere un millis(incremento*1000) ? Incremento sarebbe il valore di tempo che deve aspettare il prgramma per aumentare la luminosità giusto?
Quindi diventerebbe
for (luminosità=0,luminosità<=255,luminosità++)
analogWrite(pin, luminosità)
millis(incremento*1000)
ratto93:
quel comando serve per impostare l'ora non per leggerla, mi chiedo come mai il compilatore non ti dia errore
Nel caso in question, setTime è una funzione di tipo boolean che restituisce true se l'operazione di cambio dell'ora è andata a buon fine oppure false se i parametri passati erano fuori range, per cui può essere usata come argomento di test in un if.
ratto93:
quel comando serve per impostare l'ora non per leggerla, mi chiedo come mai il compilatore non ti dia errore
Nel caso in question, setTime è una funzione di tipo boolean che restituisce true se l'operazione di cambio dell'ora è andata a buon fine oppure false se i parametri passati erano fuori range, per cui può essere usata come argomento di test in un if.
Ecco spiegato perchè non dava errore, siccome lìho usata con facilità sono mono mai andato a spuciare dentro il codice
Beh, non ne avevi neanche motivo
Più che altro, è un modo mio di programmare, uso spesso funzioni che restituiscono qualcosa in modo che se devo fare debug non devo fare altro che leggere cosa mi rimandano indietro per capire se una di loro ha "toppato"
alba_tramonto:60: error: stray '\' in program
alba_tramonto:60: error: stray '\' in program
alba_tramonto:60: error: stray '\' in program
alba_tramonto:61: error: stray '\' in program
alba_tramonto.ino: In function 'void loop()':
alba_tramonto:60: error: expected initializer before 'u00e0'
C:\Users\Amex\Desktop\arduino-1.0.5\hardware\arduino\cores\arduino/Arduino.h:105: error: too many arguments to function 'long unsigned int millis()'
alba_tramonto:62: error: at this point in file
alba_tramonto:62: error: expected primary-expression before '}' token
alba_tramonto:62: error: expected `)' before '}' token
alba_tramonto:62: error: expected primary-expression before '}' token
alba_tramonto:62: error: expected `;' before '}' token
#include <DallasTemperature.h>
#include <swRTC.h>
swRTC rtc;
#include <OneWire.h>
#include <LiquidCrystal.h>
#define led 6
#define ONE_WIRE_BUS 7
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int FotoPin = A1;
int FotoValue;
void setup() {
pinMode(led,OUTPUT);
sensor.begin ();
lcd.begin(16, 2);
rtc.stopRTC(); //stop the RTC
rtc.setTime(18,59,0); //set the time here
rtc.setDate(06,10,2013); //set the date here
rtc.startRTC(); //start the RTC
Serial.begin(19200); //choose the serial speed here
delay(2000); //delay to let the user opens the serial monitor
}
void loop() {
lcd.clear();
lcd.setCursor(0, 0); // bottom left
lcd.print(rtc.getHours(), DEC);
lcd.print(":");
lcd.print(rtc.getMinutes(), DEC);
lcd.print(":");
lcd.print(rtc.getSeconds(), DEC);
lcd.print(" -- ");
lcd.print(rtc.getDay(), DEC);
lcd.print("/");
lcd.print(rtc.getMonth(), DEC);
lcd.print("/");
lcd.print(rtc.getYear(), DEC);
lcd.print(" (Leap year: ");
//sensor.requestTemperatures();
int ora1=Serial.read();
int minuto1=Serial.read();
int secondo1=Serial.read();
int ora2=Serial.read();
int minuto2=Serial.read();
int secondo2=Serial.read();
if (ora1>ora2){
int tempo_fade=(ora2-ora1)*60+(minuto2-minuto1);
int incremento=tempo_fade/255;
if ( rtc.getHours() == ora1 && rtc.getMinutes() == minuto1 && rtc.getSeconds() == secondo1){
analogWrite(led,0);
for (int luminosità=0,luminosità<=255,luminosità++)
analogWrite(pin, luminosità);
millis(incremento*1000);}}
/* lcd.setCursor(0, 1); // bottom left
FotoValue = analogRead(FotoPin);
lcd.print (sensor.getTempCByIndex(0));
lcd.print (" C ");
lcd.print (FotoValue);
lcd.print(" lm");
delay(500);*/
}
PVeng:
Non c'è un modo più semplice? Se dovessi per esempio programmarlo non da sketch l'accensione e lo spegnimento ma da tastierino o da pulsanti ecc. come dovrei fare? In questo metti un if ogni minuto fino a che arriva perchè so già quanti minuti durerà l'incremento, ma se dovessi programmarlo in modo che mi stampa:
"inserire orario di inizio accensione" ---19:00 e inizia l'ìincremento
"inserire orario di massima luminosità"---23:00 il led è arrivato a 255
Che comando potrei mettere?
mah non sapendo di preciso che devi realizzare la cosa è un po' "cervellotica" ]
se l'incremento è lineare puoi "sottrarre"... b (tempo di fine) 23:00 da a tempo di inizio (19:00)
ottenendo ...c tempo dell'incremento (240 minuti)
dividi c/255 ottieni il passo d
adesso hai tutto
parti da inizio ora e ad ogni passo aumenti di uno fino ad arrivare a 255
PVeng, quelli sono errori sintattici, avrai sbagliato a scrivere il codice omettendo delle parentesi o aggiungendole dove non servono.
Indenta meglio il codice così da vedere dove iniziano e terminano i vari blocchi di codice introdotti da if e for.