Pages: [1] 2 3 4   Go Down
Author Topic: Non riesco a venirne a capo  (Read 3164 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ragazzi, vi chiedo aiuto in ginocchio, perchè con il seguente codice alle 2 di notte, quindi con 'time' effettivamente maggiore di 'oras+x*19'  e minore di 'ora' invece di essere nella fase 'notte'  mi rimane nella fase giorno? Anche nella fase 'giorno' qualcosa non va, visto che dovrebbe attivarsi se 'time' è maggiore di 'ora+x*16' e minore di '<oras+x' come in effetti è? Alle 2 di notte questo if dovrebbe risultare falso... e invece no. Non ci sto capendo più nulla.
Quote

   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
   signed int dim;
   signed int ora;
   signed int oras;
   int moonlight=7;//pin led lunari
   signed long time=+(hour()*60*60 + minute()*60 + second());//orario hr,min,sec ridotto in secondi
   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=81900;//23:15 ora spegnimento in millisecondi(ore*3600 minuti*60 secondi*1)*1000
   signed int x=150;//intervallo in millisecondi tra un fade e un altro

/*impostazione per l'accensione deiled lunari*/
 
 
  if (time > oras+x*2 && time<ora+x){
    digitalWrite (moonlight, HIGH);
  }
  if (time < oras+x*2 && time>ora+x){
  digitalWrite (moonlight, LOW);}
  delay(10);
 /*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%");
  delay(10);
}

 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%");
  delay(10);
}...................
}
/*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");
  delay(10);....................
/*spegnimento completo dell'illuminazione, fase 'Notte' */
if (time >= oras+x*19 && time<ora)
  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*18);
  analogWrite (leduv, dim*18);
  LCD.setCursor(0,1);
  LCD.print ("Notte"); }
 delay(10);
Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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");
  delay(10);....................
/*spegnimento completo dell'illuminazione, fase 'Notte' */
if (time >= oras+x*19 && time<ora)
  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*18);
  analogWrite (leduv, dim*18);
  LCD.setCursor(0,1);
  LCD.print ("Notte"); }
Mi pare manchi una graffa di chiusura della if dopo LCD,print("GIORNO");....
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

dovresti postare il codice completo  usando il simbolo #

comunque  mi pare che in questa riga c'è qualcosa che non va

signed long time=+(hour()*60*60 + minute()*60 + second());//orario hr,min,sec ridotto in secondi

o è uguale o è piu

non vedo nemmeno un millis()   smiley-eek-blue
« Last Edit: November 10, 2012, 01:33:31 am by gingardu » Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 573
Posts: 12635
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Nella Guida sintetica di programmazione c'è scritto:
Quote
x += y // same as x = x + y, or increments x by +y
non so però se si possa scrivere anche nella forma =+
Logged


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

Nella Guida sintetica di programmazione c'è scritto:
Quote
x += y // same as x = x + y, or increments x by +y
non so però se si possa scrivere anche nella forma =+
No. Le forme abbreviate di assegnamento prevedono prima il simbolo dell'operazione e poi il simbolo dell'uguale. Quindi x+=y è la forma corretta.
Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 573
Posts: 12635
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

allora quello segnalato da Gingardu è un errore in quanto ha invertito i due operatori
Logged


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

Sicuramente è un errore. Poi ci possono magari essere anche errori logici, ma questi sono più difficili da interpretare se non si è nel "cranio" dell'autore del sorgente  smiley-yell
Ad esempio, lo spezzone di codice dove sta? E' racchiuso nel loop()? Se sì, perché ad ogni ciclo imposta i pin in output?
Perché usa variabili di tipo int per numeri che possono arrivare max a 59? Perché specifica "signed" quando è implicito che un "int" sia un "signed int"? Perché vedo delay(10) infilati da tutte le parti? A che serve aspettare 10 ms dopo un digitalWrite?
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il tutto si comporta come se i numeri in alcuni casi fossero di segno opposto. Eh... il cranio mio è bello duro  smiley-mr-green e tutte le domande di Leo hanno una sola risposta che le racchiude: perché sono ignorante e ho tutto da imparare su Arduino quindi il codice è scritto più a senso unito a pochi ricordi di C di quand'ero piccolo che con vera cognizione di causa... ecco perché spesso mi inceppo per stupidaggini che per voi sono scontate. Colgo l'occasione proprio per ringraziarvi per pazienza che avete e il sostegno che mi date. Ora sono col cel, appena arrivo al pc posto il codice intero. Di nuovo grazie a tutti.
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ecco lo sketch, diviso in due parti sennò non mi entrava, abbiate pazienza e... grazie davvero a tutti
Code:
/*
/*
 * 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);
 
  setSyncProvider(RTC.get);   // the function to get the time from the RTC
    
}

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

 
 
   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
   signed int dim;
   signed int ora;
   signed int oras;
   int moonlight=7;//pin led lunari
   unsigned long time=+(hour()*60*60 + minute()*60 + second());//orario hr,min,sec ridotto in secondi
   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=81900;//23:15 ora spegnimento in millisecondi(ore*3600 minuti*60 secondi*1)*1000
   signed int x=150;//intervallo in millisecondi tra un fade e un altro

/*impostazione per l'accensione deiled lunari*/
  
  
  if (time > oras+x*2 or time<ora+x){
    digitalWrite (moonlight, HIGH);
  }
  if (time < oras+x*2 && time>ora+x){
  digitalWrite (moonlight, LOW);}
  delay(10);
 /*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%");
  delay(10);
}

 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%");
  delay(10);
}

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%");
  delay(10);
}

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%");
  delay(10);
}

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%");
  delay(10);
}

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%");
  delay(10);
}
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%");
  delay(10);
}

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%");
  delay(10);
}

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%");
  delay(10);
}

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%");
  delay(10);
}
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%");
  delay(10);
}
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%");
  delay(10);
}

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%");
  delay(10);
}
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%");
  delay(10);
}
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%");
  delay(10);
}

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%");
  delay(10);
}
/*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");
  delay(10);
}
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
/*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 -42:30");
  delay(10);
}

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 -40:00");
  delay(10);
}

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 -37:30");
  delay(10);
}

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 -35:00");
  delay(10);
}

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 -32:30");
  delay(10);
}

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 -30:00");
  delay(10);
}

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 -27:30");
  delay(10);
}

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 -25:00");
  delay(10);
}

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 -22:30");
  delay(10);
}


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 -20:00");
  delay(10);
}

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 -17:30");
  delay(10);
}

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 -15:00");
  delay(10);
}

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 -12:30");
  delay(10);
}
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 -10:00");
  delay(10);
}

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 -7:30");
  delay(10);
}

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 -5:00");
  delay(10);
 
}

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 -2:30");
  delay(10);
}

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");
  delay(10);
}
/*spegnimento completo dell'illuminazione, fase 'Notte' */
if (time >= oras+x*19 or time<ora)
  {
  analogWrite (ledw1,dim*18);
  analogWrite (ledw2,dim*18);
  analogWrite (leduv, dim*18);
  LCD.setCursor(0,1);
  LCD.print ("Notte"); }
 delay(10);
 

}
Logged

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

Non era un richiamo, intendiamoci.  smiley-wink

PS:
per il codice... sinceramente non posso mettermi a spulciare un sorgente del genere per capire dov'è l'errore.. smiley-sweat
inizia intanto a sistemare quelle cose che ti sono state segnalate e poi riprova.
Logged


Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Tranquillo, la mia risposta era intesa simpaticamente, la cosa seria e' che davvero sto imparando mentre lo programmo, come diceva un famoso comico... di più nin zo'  smiley-sad
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

gingardu, dici 'non vedo nemmeno un millis', perchè ho convertito l'orario in secondi e non in millisecondi, è sbagliato? Cambierebbe qualcosa?
Logged

Offline Offline
Full Member
***
Karma: 1
Posts: 113
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Perché usa variabili di tipo int per numeri che possono arrivare max a 59?
ore min e sec espressi in secondi arrivano a oltre 80000, perchè dici 59? Che variabili dovrei utilizzare?
Quote
Ad esempio, lo spezzone di codice dove sta? E' racchiuso nel loop()? Se sì, perché ad ogni ciclo imposta i pin in output?
I pin li ho impostati solo all'inizio,perchè dici che a ogni ciclo li reimposto?
Logged

Offline Offline
God Member
*****
Karma: 8
Posts: 691
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

se una variabile in qualsiasi sketc  non superera mai  i 255  conviene mettere byte ache se nessuno vieta di adoperare ache altre tipi  (per il fatto di risparmiare byte)

ho dato una "sbirciata"  al codice   anche se concettualmente lo vedo semplicissimo

accendere spegnere led (+ scritte) in base al tempo che passa   ci sono tante  librerie
che ancora non ho mai usato/studiato   quindi non sono in grado di darti il consiglio definitivo  smiley-confuse

fai dei tentativi  e vedi se qualcosa va in overflow  es un int che supera il valore consentito

sostituisci gli int con i long se hai ancora spazio
Logged


Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Pages: [1] 2 3 4   Go Up
Jump to: