Go Down

Topic: Non riesco a venirne a capo (Read 3748 times) previous topic - next topic

Dandovino

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

tonid

Code: [Select]
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");....

gingardu

#2
Nov 10, 2012, 07:29 am Last Edit: Nov 10, 2012, 07:33 am by gingardu Reason: 1
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:
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Michele Menniti

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 =+
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

leo72


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.

Michele Menniti

allora quello segnalato da Gingardu è un errore in quanto ha invertito i due operatori
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

leo72

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?

Dandovino

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.

Dandovino

ecco lo sketch, diviso in due parti sennò non mi entrava, abbiate pazienza e... grazie davvero a tutti
Code: [Select]
/*
/*
* 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);
}

Dandovino

Code: [Select]
/*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);
 

}

leo72

Non era un richiamo, intendiamoci.  ;)

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.

Dandovino

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'  :(

Dandovino

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

Dandovino

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?

gingardu

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

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
Le cose si possono considerare facili in due casi: quando le si conosce bene o quando non le si conosce affatto...

Go Up