Pages: [1]   Go Down
Author Topic: Problema lettura sensori  (Read 633 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti, mi sono appena registrato al forum; ho un problema con Arduino che mi sta facendo impazzire e spero che qualcuno mi possa aiutare: ho una Arduino Uno, un sensore per la temperatura LM35 (ma potrei anche usare un TMP36 se più accurato), e un sensore per l'umidità HIH-4030.
Ho collegato i due sensori a dei cavetti lunghi circa un metro in modo tale che le masse e i positivi siano in comune, poi, per i dati, ho un cavo dell' LM35 collegato a A1 e il cavo dati dell' HIH 4030 collegato a A0. Ho inserito il codice che segue, il problema è che la temperatura comincia a dare dati in sequenza diversi tra loro, qualcuno può aiutarmi? Grazie.

Code:
const unsigned int attesa= 9600;

void setup() {
  Serial.begin(attesa);
}
  
void loop() {
  while (1) {
    temperatura();
    umidita();
    delay (attesa);
  }
}

void temperatura()
{
  float temp = 0.0;  
  int val = 0;
  val = analogRead(A1);  
  temp = ( 5 * val * 100) / 1024.0;   // converte il dato fornito dal sensore °C
  Serial.print("Temperatura: ");
  Serial.print(temp);
  Serial.println (" C");
}

void umidita()
{
  float temp2 = 0.0;  
  float umi = 0.0;
  float umiRelativa = 0.0;
  int val2 = 0;
  val2 = analogRead(A1);  
  temp2 = ( 5 * val2 * 100) / 1024.0;   // converte il dato fornito dal sensore °C

  umi = analogRead(A0);
  umiRelativa = (((umi / 1023) * 5) - 0.8) / 0.031;
  umiRelativa = umiRelativa/(1.0546 - (0.00216 * temp2));
  Serial.print("Umidita' relativa: ");
  Serial.println(umiRelativa);
}

« Last Edit: April 04, 2013, 12:22:47 am by leo72 » Logged

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

Ciao e benvenuto.
Ti ricordo di leggere il regolamento del forumsmiley-wink
Logged


BZ (I)
Online Online
Brattain Member
*****
Karma: 266
Posts: 21654
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

La funzione loop() viene giá ripetuta all infinito; non serve che aggiungi "while (1) {" .
cosa sigifica: "il problema è che la temperatura comincia a dare dati in sequenza diversi tra loro,"
puoi darci un po di valori?

Ciao Uwe
Logged

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

Ricordati anche che conviene sempre mettere una lettura a vuoto quando si cambia pin analogico.
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9493
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ricordati anche che conviene sempre mettere una lettura a vuoto quando si cambia pin analogico.

Ricordati che non serve a nulla come ho spiegato qui smiley
Logged

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

Senza dover stare a controllare le impedenze di ciò che è collegato ai pin, è sempre meglio fare qualche lettura sullo stesso pin e poi restituire la media o l'ultima, per avere un risultato più affidabile. Non trovi?
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9493
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Non trovi?

Sopratutto il discorso della media è sbagliato di principio se c'è il problema dell'impedenza troppo alta, non serve a nulla fare letture a vuoto, semmai tocca inserire dei delay per dare tempo al condensatore del s/h di caricarsi al giusto livello.
La media serve per ripulire dal rumore, se la fai su un valore che sta salendo per via dell'alta impedenza il valore finale non è corretto visto che rappresenta il valore medio della curva di carica (eventualmente spostato verso l'alto a seconda di quante lettere esegui) e non della reale tensione, semmai tocca fare letture distanziate nel tempo, quanto serve, e fare la media di queste.
Questa storia della lettura da buttare via sta diventando una leggenda metropolitana  smiley-grin
La regola da seguire quando si usa l'ADC è fare in modo che l'impedenza d'uscita della sorgente sia sempre inferiore a 10k, se non lo è basta mettere in mezzo un opamp rail to rail in configurazione voltage follower, questo per evitare problemi di letture fluttuanti e/o drastica riduzione della banda visto che è già poca di suo.
Logged

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

OK.
Logged


ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 4956
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

...opamp rail to rail in configurazione voltage follower, ...
Per capire a cosa ti riferisci, questa lettura può andare bene?
http://www.editorialedelfino.it/ita/dettaglio.articolo.php?id=641&id_catalogo=2&id_famiglia=30
Logged

my name is IGOR, not AIGOR

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 129
Posts: 9493
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Per capire a cosa ti riferisci, questa lettura può andare bene?

Si può condensare il concetto semplicemente dicendo che un opamp rail to rail è in grado di far variare la tensione in uscita tra gli estremi della sua alimentazione, p.e. tra 0V e 5V, in realtà c'è sempre una perdita minimale (da pochi mV a qualche decina di mV a seconda del modello) rispetto alle alimentazioni.
Una soluzione semplice, se non si dispone di un rail to rail, è usare un comunissimo LM358 che è in grado di raggiungere in out quasi 0V, alimentarlo ad almeno 7V (5V se è per 3.3V) in modo che anche la tensione alta arrivi a 5V (o 3.3V come serve)
Logged

Pages: [1]   Go Up
Jump to: