Go Down

Topic: Acquisizione segnali con arduino (Read 1 time) 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!!


pablos

#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.
no comment

superlol

Potresti postare l'intero codice? Magari il problema non si trova li
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

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.
"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

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
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

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:
"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

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