Go Down

Topic: Acquisizione segnali con arduino (Read 2079 times) previous topic - next topic

NIKI90

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


pablos71

#1
Jul 08, 2012, 12:24 am Last Edit: Jul 08, 2012, 12:57 am by pablos Reason: 1
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.
L'esperienza è il tipo di insegnante più difficile ....
Prima ti fa l'esame e poi ti spiega la lezione.

superlol

Potresti postare l'intero codice? Magari il problema non si trova li
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

superp


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

Prova ad usare LeOs...spingiamo le cose sviluppate in casa :smiley-mr-green:
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.

NIKI90

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

superlol

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
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

leo72



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

Prova ad usare LeOs...spingiamo le cose sviluppate in casa :smiley-mr-green:
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  :smiley-sweat: :smiley-sweat:

leo72


Code: [Select]

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.

Code: [Select]
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

superp




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

Prova ad usare LeOs...spingiamo le cose sviluppate in casa :smiley-mr-green:
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  :smiley-sweat: :smiley-sweat:

dovere! :smiley-mr-green:

NIKI90

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.

Go Up