Offline
Newbie
Karma: 0
Posts: 5
|
 |
« on: July 07, 2012, 03:33:07 pm » |
Ciao a tutti. Ho riscontrato un problema nell'acquisire dati ad intervalli di 5 secondi utilizzando la funzione millis() riporto qui sotto il codice utilizzato
unsigned long time_1=0;
if (millis()-time_1>5000) { v_p=analogRead(sens_p); v_b=analogRead(sens_b); time_1=millis(); }
con questo codice il valore di v_p e v_b rimane sempre a zero, se invece tolgo la riga "time_1=millis();" l'acquisizione viene fatta correttamente senza però aspettare i 5 secondi visto che la variabile time_1 è sempre nulla. Sapreste darmi una spiegazione o una soluzione alternativa, senza l'utilizzo del delay? Grazie a tutti in anticipo!!
|
|
|
|
|
Logged
|
|
|
|
|
Genova
Offline
Edison Member
Karma: 14
Posts: 2442
|
 |
« Reply #1 on: July 07, 2012, 05:24:54 pm » |
Bhe come alternativa in quei 5 secondi potresti fare dei campionamenti ad ogni passaggio del loop invece di fare aspettare il timer, raccogli 100-200 valori ora non so nel tuo loop quanti ne prenderebbe in 5 secondi, però potresti fare la media di n valori ottenendo misure prossime al reale.
|
|
|
|
« Last Edit: July 07, 2012, 05:57:38 pm by pablos »
|
Logged
|
Meglio imparare dalle cose inutili piuttosto che non imparare niente. [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]
|
|
|
|
Riva del Garda, TN / Forlì
Offline
Edison Member
Karma: 7
Posts: 2075
Il piu' modesto al mondo
|
 |
« Reply #2 on: July 07, 2012, 05:52:19 pm » |
Potresti postare l'intero codice? Magari il problema non si trova li
|
|
|
|
|
Logged
|
|
|
|
|
Italy
Offline
Full Member
Karma: 6
Posts: 102
|
 |
« Reply #3 on: July 08, 2012, 03:12:17 am » |
Sapreste darmi una spiegazione o una soluzione alternativa, senza l'utilizzo del delay? Prova ad usare LeOs...spingiamo le cose sviluppate in casa http://arduino.cc/forum/index.php/topic,111732.0.htmlPuoi programmare dei task e eseguirli una volta o ripetutamente ad un certo intervallo di tempo. Trovi tutto al link sopra. N.
|
|
|
|
|
Logged
|
"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 5
|
 |
« Reply #4 on: July 08, 2012, 05:17:00 am » |
questo è il programma intero
#include <LiquidCrystal.h> #include <SoftwareSerial.h> #include <math.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
double temp_p, temp_b, v_p, v_b; double B=0.00025641; int R=100; int Rn=2200; int E=5; double Tn=298.15; int sens_p=A0; int sens_b=A1; int tar=A2; int rele=10; int r_ill=6; int btn=7; unsigned long time; unsigned long time_1=0; int stato; int tar_1;
void setup() { pinMode (rele,OUTPUT); pinMode (r_ill,OUTPUT); pinMode (btn,INPUT); lcd.begin(16,2); }
void loop() {
tar_1=analogRead(tar); if(digitalRead(btn)==HIGH) { stato=HIGH; time= millis(); } if (millis()-time>5000) stato=LOW; digitalWrite(r_ill,stato);
if (millis()-time_1>10000) { v_p=analogRead(sens_p); v_b=analogRead(sens_b); time_1=millis(); } v_p=v_p/tar_1; v_b=v_b/tar_1;
temp_p=E; temp_p=temp_p-v_p; temp_p=temp_p*R; temp_p=temp_p/v_p; temp_p=temp_p/Rn; temp_p=log(temp_p); temp_p=B*temp_p; temp_p=temp_p+(1/Tn); temp_p=1/temp_p; temp_p=temp_p-273.15;
temp_b=E; temp_b=temp_b-v_b; temp_b=temp_b*R; temp_b=temp_b/v_b; temp_b=temp_b/Rn; temp_b=log(temp_b); temp_b=B*temp_b; temp_b=temp_b+(1/Tn); temp_b=1/temp_b; temp_b=temp_b-273.15;
if (temp_p>temp_b+5) digitalWrite(rele,HIGH); if (temp_p<temp_b+5) digitalWrite(rele,LOW);
lcd.setCursor(0,0); float x=temp_p; lcd.print("Pannelli:"); lcd.print(x,1); lcd.print((char)223); lcd.print("C");
lcd.setCursor(0,1); float y=temp_b; lcd.print("Accumulo:"); lcd.print(y,1); lcd.print((char)223); lcd.print("C");
}
Interessante l'uso delle "leOS", potrebbe essere una buona alternativa Grazie a tutti
|
|
|
|
|
Logged
|
|
|
|
|
Riva del Garda, TN / Forlì
Offline
Edison Member
Karma: 7
Posts: 2075
Il piu' modesto al mondo
|
 |
« Reply #5 on: July 08, 2012, 05:37:44 am » |
mi pare una cosa strana, prova a mettere un delay(1); dopo la lettura dei sensori però mi pare una cavolata.. comunque double non è implementato correttamente in arduino: http://arduino.cc/en/Reference/Doubleequivale ad un semplice float
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16462
Don't know what I do
|
 |
« Reply #6 on: July 08, 2012, 11:47:23 am » |
Sapreste darmi una spiegazione o una soluzione alternativa, senza l'utilizzo del delay? Prova ad usare LeOs...spingiamo le cose sviluppate in casa http://arduino.cc/forum/index.php/topic,111732.0.htmlPuoi programmare dei task e eseguirli una volta o ripetutamente ad un certo intervallo di tempo. Trovi tutto al link sopra. N. Grazie grazie 
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16462
Don't know what I do
|
 |
« Reply #7 on: July 08, 2012, 11:52:05 am » |
unsigned long time_1=0;
if (millis()-time_1>5000) { v_p=analogRead(sens_p); v_b=analogRead(sens_b); time_1=millis(); }
Io di solito le operazioni le metto non nei confronti. void setup() { ... unsigned long time_1 = millis() + 5000; .. }
void loop() { .. if (millis()>time_1) { v_p=analogRead(sens_p); v_b=analogRead(sens_b); time_1=millis() + 5000; } } PS: non ho guardato tutto il codice
|
|
|
|
|
Logged
|
|
|
|
|
Italy
Offline
Full Member
Karma: 6
Posts: 102
|
 |
« Reply #8 on: July 08, 2012, 12:08:58 pm » |
Sapreste darmi una spiegazione o una soluzione alternativa, senza l'utilizzo del delay? Prova ad usare LeOs...spingiamo le cose sviluppate in casa http://arduino.cc/forum/index.php/topic,111732.0.htmlPuoi programmare dei task e eseguirli una volta o ripetutamente ad un certo intervallo di tempo. Trovi tutto al link sopra. N. Grazie grazie  dovere! 
|
|
|
|
|
Logged
|
"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 5
|
 |
« Reply #9 on: July 09, 2012, 05:28:45 am » |
Sono riuscito a risolvere il problema del mio programma. Praticamente succedeva che l'acquisizione veniva fatta correttamente ogni 5 secondi però come si può vedere dal programma dopo l' IF il valore acquisito veniva diviso per tar_1 che vale circa 200, questa divisione veniva fatta ogni ciclo(tante volte in un secondo) sul numero che veniva acquisito solo ogni 5 secondi, in questo modo il risultato, venendo diviso tante volte, era molto piccolo e veniva visto come zero.
Grazie a tutti.
|
|
|
|
|
Logged
|
|
|
|
|
|