Sì, il timestamp è una funzione della libreria.
abs() ritorna il valore assoluto di un numero. Semanticamente equivale a:
if x < 0
return -x
else
return x
endif
Non ho letto bene il tuo codice, ma mi pare che di fronte ad una variabile che assume valori inaspettatamente negativi la soluzione non sia "togliere il segno meno", ma capire perché ciò avviene.
hai ragione, ma rileggendo tutto il codice non mi pare di vedere possibilità di far divenire un numero positivo un numero negativo...
non ce la faccio più, sta diventando ridicolo, come può in questo codice diventare vero l'if della fase 'giorno' passata la mezzanotte dove invece dovrebbe essere assolutamente falso?
/*
* TimeRTC.pde
* example code illustrating Time library with Real Time Clock.
*
*/
#include <LiquidCrystal.h>
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
LiquidCrystal LCD(12,11,5,4,3,2);
void setup() {
LCD.begin (16,2);
Serial.begin(9600);
DS1307RTC();
}
void loop()
{
LCD.setCursor(0,0);
digitalClockDisplay();
delay(1000);
}
void digitalClockDisplay(){
// digital clock display of the time
LCD.print(hour());
printDigits(minute());
LCD.setCursor(5,0);
printDigits(second());
LCD.print(" ");
}
void printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
LCD.print(":");
if(digits < 10)
LCD.print('0');
LCD.print(digits);
}
void DS1307RTC(){
int ledw1=9;//pin linea led bianchi e rb posteriore
int ledw2=10;//pin linea led bianchi e rb anteriore
int leduv=6;//pin linea led rossi, verdi, uv
float dim;
int ora;
int oras;
int moonlight=7;//pin led lunari
int time=(hour()*60*60 + minute()*60 + second());//orario hr,min,sec ridotto in secondi//cambiato da unsigned int a int
pinMode (ledw1,OUTPUT);
pinMode (ledw2, OUTPUT);
pinMode (leduv, OUTPUT);
pinMode (moonlight,OUTPUT);
dim=255/18;//aumento intensità per ogni step
ora=45000;//12:30 ora accensione in millisecondi(ore*3600 minuti*60 secondi*1)*1000
oras=83700;//23:15 ora spegnimento in millisecondi(ore*3600 minuti*60 secondi*1)*1000
int x=150;//intervallo in millisecondi tra un fade e un altro
LCD.clear();
/*impostazione per l'accensione deiled lunari*/
if (time >=ora+x*16 && time <oras+x)
{
analogWrite (ledw1,dim*4);
analogWrite (ledw2,dim*4);
analogWrite (leduv, dim*4);
LCD.setCursor(0,1);
LCD.print ("Giorno");
}
Io proverei a stampare sulla seriale i valori all'interno delle condizioni if(). Cioè time e i due valori calcolati con cui lo confronti.
allora, se davanti a ora e oras metto 'int' da vera la fase giorno sia di giorno che di notte, se metto 'long' da vera la fase di notte sempre in entrambe i casi... tra un pò spacco tutto... è illogico!!!
allora, se davanti a ora e oras metto 'int' da vera la fase giorno sia di giorno che di notte, se metto 'long' da vera la fase di notte sempre in entrambe i casi... tra un pò spacco tutto... è illogico!!!
Una variabile di tipo int non può contenere un valore di 45000,guarda quì
int
Description
Integers are your primary datatype for number storage, and store a 2 byte value. This yields a range of -32,768 to 32,767 (minimum value of -2^15 and a maximum value of (2^15) - 1).
edit. Quindi è normale che superato il suo massimo valore positivo ti dia poi un valore negativo
questo è vero.
Un int va da -32768 a +32767 mentre un unsigned int va da 0 a 65535, in entrambi i casi non arrivi al max numero di secondi di un giorno, 86400. Ti serve un long per forza.
long
Description
Long variables are extended size variables for number storage, and store 32 bits (4 bytes), from -2,147,483,648 to 2,147,483,647.
E' un po un spreco ma non credo sia possibile fare diversamente.....
si, ma vista la formula per portare hr min sec in secondi dovrei avere un valore, alle 22 avrò 79200, invece dà come risultato circa 13000, se aggiungo alla formula *2 mi dà naturalmente 26000 se provo 4 mi da 4268647983 che non c'entra nulla con 130004.
si, ma vista la formula per portare hr min sec in secondi dovrei avere un valore, alle 22 avrò 79200, invece dà come risultato circa 13000, se aggiungo alla formula *2 mi dà naturalmente 26000 se provo 4 mi da 4268647983 che non c'entra nulla con 130004.
E che variabile stai usando ?
long
ora ho aggiunto questa riga
time = time*5;
ma con il 5 da un risultato reale, fino a 5,9 se invece metto 6 sballa. Ipotesi, 15=5.....15,9=5,9.....16=6,5....
Ti converrebbe cercare di risolvere il problema dei numeri negativi scrivendo un piccolo sketch che contenga soltanto il codice minimo necessario ad analizzare (e comprendere) questo problema.
Metti le routine di conversione e stampa dei risultati, poi fai varie prove.
E posta il codice che stai usando.
A forza di frasi smozzicate e "si ferma" "non va", ecc. non si va da nessuna parte.
IMHO, sia chiaro...
mettendo 5,9 mi da 80300 mentre se metto 6 mi da 92000 e passa
questo è il codice completo
/*
* TimeRTC.pde
* example code illustrating Time library with Real Time Clock.
*
*/
#include <LiquidCrystal.h>
#include <Time.h>
#include <Wire.h>
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
LiquidCrystal LCD(12,11,5,4,3,2);
void setup() {
LCD.begin (16,2);
Serial.begin(9600);
setSyncProvider(RTC.get);
DS1307RTC();
}
void loop()
{
LCD.setCursor(0,0);
digitalClockDisplay();
delay(1000);
}
void digitalClockDisplay(){
// digital clock display of the time
LCD.print(hour());
printDigits(minute());
LCD.setCursor(5,0);
printDigits(second());
LCD.print(" ");
}
void printDigits(int digits){
// utility function for digital clock display: prints preceding colon and leading 0
LCD.print(":");
if(digits < 10)
LCD.print('0');
LCD.print(digits);
}
void DS1307RTC(){
int ledw1=9;//pin linea led bianchi e rb posteriore
int ledw2=10;//pin linea led bianchi e rb anteriore
int leduv=6;//pin linea led rossi, verdi, uv
float dim;
unsigned long ora;
unsigned long oras;
int moonlight=7;//pin led lunari
unsigned long time=((hour()*60*60) + (minute ()*60) + second());//orario hr,min,sec ridotto in secondi//cambiato da unsigned int a int
pinMode (ledw1,OUTPUT);
pinMode (ledw2, OUTPUT);
pinMode (leduv, OUTPUT);
pinMode (moonlight,OUTPUT);
dim=255/18;//aumento intensità per ogni step
ora=45000;//12:30 ora accensione in millisecondi(ore*3600 minuti*60 secondi*1)*1000
oras=83700;//23:15 ora spegnimento in millisecondi(ore*3600 minuti*60 secondi*1)*1000
int x=150;//intervallo in millisecondi tra un fade e un altro
LCD.clear();
time = time*5,99999;
/*impostazione per l'accensione deiled lunari*/
if (time > oras+x*2 && time <=86399){
digitalWrite (moonlight, HIGH);
}
if (time >= ora*0 && time <=ora+x*2){
digitalWrite (moonlight, HIGH);
}
if (time <= oras+x*2&& time>ora+x*2){
digitalWrite (moonlight, LOW);}
/*inizio della fase 'Alba' e aumento graduale dell'intensità dell'illuminazione*/
if ( time >= ora&&time <ora+x)
{
analogWrite (ledw1,dim*18);
analogWrite (ledw2,dim*18);
analogWrite (leduv, dim*16);
LCD.setCursor(0,1);
LCD.print ("Alba 0%");
}
if (time >= ora+x&&time<ora+x*2)
{
analogWrite (ledw1,dim*18);
analogWrite (ledw2,dim*18);
analogWrite (leduv, dim*14);
LCD.setCursor(0,1);
LCD.print ("Alba 6%");
}
if (time >= ora+x*2&&time < ora+x*3)
{
analogWrite (ledw1,dim*18);
analogWrite (ledw2,dim*16);
analogWrite (leduv, dim*14);
LCD.setCursor(0,1);
LCD.print ("Alba 12%");
}
if (time >= ora+x*3&&time < ora+x*4)
{
analogWrite (ledw1,dim*17);
analogWrite (ledw2,dim*15);
analogWrite (leduv, dim*13);
LCD.setCursor(0,1);
LCD.print ("Alba 18%");
}
if (time >=ora+x*4&&time < ora+x*5)
{
analogWrite (ledw1,dim*16);
analogWrite (ledw2,dim*14);
analogWrite (leduv, dim*12);
LCD.setCursor(0,1);
LCD.print ("Alba 24%");
}
if (time >= ora+x*5&&time<ora+x*6)
{
analogWrite (ledw1,dim*15);
analogWrite (ledw2,dim*13);
analogWrite (leduv, dim*11);
LCD.setCursor(0,1);
LCD.print ("Alba 30%");
}
if (time >= ora+x*6&&time<ora+x*7)
{
analogWrite (ledw1,dim*14);
analogWrite (ledw2,dim*12);
analogWrite (leduv, dim*10);
LCD.setCursor(0,1);
LCD.print ("Alba 36%");
}
if (time >= ora+x*7&&time<ora+x*8)
{
analogWrite (ledw1,dim*13);
analogWrite (ledw2,dim*11);
analogWrite (leduv, dim*9);
LCD.setCursor(0,1);
LCD.print ("Alba 42%");
}
if (time >= ora+x*8&&time<ora+x*9)
{
analogWrite (ledw1,dim*12);
analogWrite (ledw2,dim*10);
analogWrite (leduv, dim*8);
LCD.setCursor(0,1);
LCD.print ("Alba 48%");
}
if (time >= ora+x*9&&time<ora+x*10)
{
analogWrite (ledw1,dim*11);
analogWrite (ledw2,dim*9);
analogWrite (leduv, dim*7);
LCD.setCursor(0,1);
LCD.print ("Alba 54%");
}
if (time >= ora+x*10 && time<ora+x*11)
{
analogWrite (ledw1,dim*10);
analogWrite (ledw2,dim*8);
analogWrite (leduv, dim*6);
LCD.setCursor(0,1);
LCD.print ("Alba 60%");
}
if (time >= ora+x*11 && time<ora+x*12)
{
analogWrite (ledw1,dim*9);
analogWrite (ledw2,dim*7);
analogWrite (leduv, dim*5);
LCD.setCursor(0,1);
LCD.print ("Alba 66%");
}
if (time >= ora+x*12 && time<ora+x*13)
{
analogWrite (ledw1,dim*8);
analogWrite (ledw2,dim*6);
analogWrite (leduv, dim*4);
LCD.setCursor(0,1);
LCD.print ("Alba 72%");
}
if (time >= ora+x*13 && time<ora+x*14)
{
analogWrite (ledw1,dim*7);
analogWrite (ledw2,dim*5);
analogWrite (leduv, dim*4);
LCD.setCursor(0,1);
LCD.print ("Alba 78%");
}
if (time >=ora+x*14 && time<ora+x*15)
{
analogWrite (ledw1,dim*6);
analogWrite (ledw2,dim*4);
analogWrite (leduv, dim*4);
LCD.setCursor(0,1);
LCD.print ("Alba 84%");
}
if (time >=ora+x*15 && time<ora+x*16)
{
analogWrite (ledw1,dim*5);
analogWrite (ledw2,dim*4);
analogWrite (leduv, dim*4);
LCD.setCursor(0,1);
LCD.print ("Alba 90%");
}
/*fase intermedia 'Giorno' nella quale l'illuminazione viene tenuta al massimo dell'intensità impostata e che va dalla fine dell'alba all'inizio della fase di decremento dell'illuminazione 'Tramonto' */
if (time >=ora+x*16 && time <oras+x)
{
analogWrite (ledw1,dim*4);
analogWrite (ledw2,dim*4);
analogWrite (leduv, dim*4);
LCD.setCursor(0,1);
LCD.print ("Giorno");
}
/*inizio della fase 'Tramonto' e diminuzione graduale dell'intensità dell'illuminazione fino al completo spegnimento*/
if (time >=oras+x&&time <oras+x*2)
{
analogWrite (ledw1,dim*5);
analogWrite (ledw2,dim*4);
analogWrite (leduv, dim*4);
LCD.setCursor(0,1);
LCD.print ("Tramonto -45:00");
}
if (time >= oras+x*2&&time<oras+x*3)
{
analogWrite (ledw1,dim*6);
analogWrite (ledw2,dim*4);
analogWrite (leduv, dim*4);
LCD.setCursor(0,1);
LCD.print ("Tramonto -42:30");
}
if (time >= oras+x*3&&time<oras+x*4)
{
analogWrite (ledw1,dim*7);
analogWrite (ledw2,dim*4);
analogWrite (leduv, dim*4);
LCD.setCursor(0,1);
LCD.print ("Tramonto -40:00");
}
if (time >= oras+x*4&&time<oras+x*5)
{
analogWrite (ledw1,dim*8);
analogWrite (ledw2,dim*4);
analogWrite (leduv, dim*4);
LCD.setCursor(0,1);
LCD.print ("Tramonto -37:30");
}
if (time >= oras+x*5&&time<oras+x*6)
{
analogWrite (ledw1,dim*9);
analogWrite (ledw2,dim*4);
analogWrite (leduv, dim*5);
LCD.setCursor(0,1);
LCD.print ("Tramonto -35:00");
}
if (time >=oras+x*6&&time<oras+x*7)
{
analogWrite (ledw1,dim*10);
analogWrite (ledw2,dim*4);
analogWrite (leduv, dim*6);
LCD.setCursor(0,1);
LCD.print ("Tramonto -32:30");
}
if (time >=oras+x*7&&time<oras+x*8)
{
analogWrite (ledw1,dim*11);
analogWrite (ledw2,dim*4);
analogWrite (leduv, dim*7);
LCD.setCursor(0,1);
LCD.print ("Tramonto -30:00");
}
if (time >=oras+x*8&&time<oras+x*9)
{
analogWrite (ledw1,dim*12);
analogWrite (ledw2,dim*6);
analogWrite (leduv, dim*8);
LCD.setCursor(0,1);
LCD.print ("Tramonto -27:30");
}
if (time >=oras+x*9&&time<oras+x*10)
{
analogWrite (ledw1,dim*13);
analogWrite (ledw2,dim*7);
analogWrite (leduv, dim*9);
LCD.setCursor(0,1);
LCD.print ("Tramonto -25:00");
}
if (time >= oras+x*10&&time<oras+x*11)
{
analogWrite (ledw1,dim*14);
analogWrite (ledw2,dim*9);
analogWrite (leduv, dim*10);
LCD.setCursor(0,1);
LCD.print ("Tramonto -22:30");
}
if (time >= oras+x*11&&time<oras+x*12)
{
analogWrite (ledw1,dim*15);
analogWrite (ledw2,dim*10);
analogWrite (leduv, dim*10);
LCD.setCursor(0,1);
LCD.print ("Tramonto -20:00");
}
if (time >= oras+x*12&&time<oras+x*13)
{
analogWrite (ledw1,dim*16);
analogWrite (ledw2,dim*11);
analogWrite (leduv, dim*10);
LCD.setCursor(0,1);
LCD.print ("Tramonto -17:30");
}
if (time >= oras+x*13&&time<oras+x*14)
{
analogWrite (ledw1,dim*17);
analogWrite (ledw2,dim*14);
analogWrite (leduv, dim*10);
LCD.setCursor(0,1);
LCD.print ("Tramonto -15:00");
}
if (time >= oras+x*14&&time<oras+x*15)
{
analogWrite (ledw1,dim*17);
analogWrite (ledw2,dim*15);
analogWrite (leduv, dim*11);
LCD.setCursor(0,1);
LCD.print ("Tramonto -12:50");
}
if (time >= oras+x*15&&time<oras+x*16)
{
analogWrite (ledw1,dim*18);
analogWrite (ledw2,dim*16);
analogWrite (leduv, dim*11);
LCD.setCursor(0,1);
LCD.print ("Tramonto -10:00");
}
if (time >=oras+x*16&&time<oras+x*17)
{
analogWrite (ledw1,dim*18);
analogWrite (ledw2,dim*17);
analogWrite (leduv, dim*11);
LCD.setCursor(0,1);
LCD.print ("Tramonto -7:30");
}
if (time >= oras+x*17&&time<oras+x*18)
{
analogWrite (ledw1,dim*18);
analogWrite (ledw2,dim*18);
analogWrite (leduv, dim*14);
LCD.setCursor(0,1);
LCD.print ("Tramonto -5:00");
}
if (time >= oras+x*18&&time<oras+x*19)
{
analogWrite (ledw1,dim*18);
analogWrite (ledw2,dim*18);
analogWrite (leduv, dim*16);
LCD.setCursor(0,1);
LCD.print ("Tramonto -2:30");
}
/*spegnimento completo dell'illuminazione, fase 'Notte' */
if (time > oras+(x*19))
{
analogWrite (ledw1,dim*18);
analogWrite (ledw2,dim*18);
analogWrite (leduv, dim*18);
LCD.setCursor(0,1);
LCD.print ("Notte"); }
if (time<ora)
{
analogWrite (ledw1,dim*18);
analogWrite (ledw2,dim*18);
analogWrite (leduv, dim*18);
LCD.setCursor(0,1);
LCD.print ("Notte "); }
Serial.print (time);
Serial.print (ora);
Serial.print (oras);
delay(10);
}
Mi sembra tutto molto strano.....
Sembra che usi una unsigned int che ha come capacità un numero fino a 65535 e ti spiego perchè...
Come tu dici ,alle 22 dovresti leggere un valore di 79200 ma siccome la unsigned int arriva fino a 65535 quello che leggerai sarà pari a
79200-65535=13655........se moltiplichi 79200 per 2 avrai 158400 quindi riempi la variabile più di una volta 158400-65535-65535=27330 che dovrebbe essere il valore che leggi.....se moltiplichi però per numeri più alti,secondo i tuoi esempi, i conti non tornano più.
Ridai una sistemata al codice controllando bene le variabili e poi magari posta il tutto,è più facile poterti aiutare.
edit.mentre scrivevo lo hai già fatto
no non è int è long
Si infatti ma facendo i conti sembrava lo fosse..
mi sta venendo un altro dubbio, ma le fasi di alba e tramonto 'funzionano' quindi lì riconoscel'orario....