Acquisizione segnali con arduino

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!!

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.

Potresti postare l’intero codice? Magari il problema non si trova li

Sapreste darmi una spiegazione o una soluzione alternativa, senza l'utilizzo del delay?

Prova ad usare LeOs...spingiamo le cose sviluppate in casa :grin: http://arduino.cc/forum/index.php/topic,111732.0.html

Puoi programmare dei task e eseguirli una volta o ripetutamente ad un certo intervallo di tempo. Trovi tutto al link sopra. N.

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_pR;
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_bR;
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

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/Double equivale ad un semplice float

superp:

Sapreste darmi una spiegazione o una soluzione alternativa, senza l'utilizzo del delay?

Prova ad usare LeOs...spingiamo le cose sviluppate in casa :grin: http://arduino.cc/forum/index.php/topic,111732.0.html

Puoi programmare dei task e eseguirli una volta o ripetutamente ad un certo intervallo di tempo. Trovi tutto al link sopra. N.

Grazie grazie :sweat_smile: :sweat_smile:

NIKI90: ``` 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

leo72:

superp:

Sapreste darmi una spiegazione o una soluzione alternativa, senza l'utilizzo del delay?

Prova ad usare LeOs...spingiamo le cose sviluppate in casa :grin: http://arduino.cc/forum/index.php/topic,111732.0.html

Puoi programmare dei task e eseguirli una volta o ripetutamente ad un certo intervallo di tempo. Trovi tutto al link sopra. N.

Grazie grazie :sweat_smile: :sweat_smile:

dovere! :grin:

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.