Pages: [1]   Go Down
Author Topic: Acquisizione segnali con arduino  (Read 988 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Faraday Member
**
Karma: 40
Posts: 3431
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

no comment

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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.
Logged

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22951
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset


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
Logged


Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 333
Posts: 22951
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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:
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 Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


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
Logged

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: