orologio Arduino da libreria

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 :roll_eyes:
devi fare così:

if(   rtc.getHours() == 19 &&  rtc.getMinutes() == 0  && rtc.getSeconds() == 0)

in questo modo alle ore 19.00.00 entri dentro la tua If e arduino esegue le istruzioni che trova al suo interno :slight_smile:

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)}

che dovrei fare?

e che vuoi fare ?
metti tanti if fino a che ti stanno bene
es un if a minuto e incrementi fino ad arrivare a 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

Che comando potrei mettere?

Conta i secondi di differenza tra i due orari, calcola i secondi diviso 255 e vedi ogni quanti secondi devi fare un incremento di luminosità ...

Ho fatto questo codice:

ora1=Serial.read();
minuto1=Serial.read();
secondo1=Serial.read();
ora2=Serial.read();
minuto2=Serial.read();
secondo2=Serial.read();
tempo_fade=(ora2-ora1)*60+(minuto2-minuto1);
incremento=tempo_fade/255;

if ( rtc.getHours() == ora1 && rtc.getMinutes() == minuto1 && rtc.getSeconds() == secondo1){
analogWrite(led,0);}
if ((rtc.getHours() == ora2 && rtc.getMinutes() == minuto2 && rtc.getSeconds() == secondo2)){
analogWrite(led,255);}

Dal cellulare faccio fatica a scrivere, ma :

  • dove usi incremento ??
  • cosa succede se intervallo 23:00 01:00

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 :roll_eyes:

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.

leo72:

ratto93:
quel comando serve per impostare l'ora non per leggerla, mi chiedo come mai il compilatore non ti dia errore :roll_eyes:

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 :stuck_out_tongue:

Beh, non ne avevi neanche motivo :wink:
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" :wink:

Riguardo alla mia ultima risposta? Che consigli mi date?

Sì, puoi fare come hai detto. Ricordati di mettere la gestione dell'ora all'interno di quel for altrimenti ti si blocca l'orologio.

leo72:
Sì, puoi fare come hai detto. Ricordati di mettere la gestione dell’ora all’interno di quel for altrimenti ti si blocca l’orologio.

Cioè?

Problema di compilazione :

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" ]:smiley:
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.

Ho sistemato e mi da corretto, solo che non avviene nessun incremento, come mai? Resta spento il led

#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,13); //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(); 
 Serial.println("inserisci");
 int ora1=Serial.read();
 Serial.println(ora1);
  Serial.println("inserisci");
 int minuto1=Serial.read();
  Serial.println("inserisci");
 int secondo1=Serial.read();
  Serial.println("inserisci");
 int ora2=Serial.read();
  Serial.println("inserisci");
 int minuto2=Serial.read();
  Serial.println("inserisci");
 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 luminosita=0;luminosita<=255;luminosita++)
        {
        analogWrite(led, luminosita);
        unsigned long orario= 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);*/
      
  
 
  
}