Pages: [1]   Go Down
Author Topic: Hc sr04 compensazione temperatura  (Read 435 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

Buongiorno a tutti,
ho da poco iniziato con Arduino e già mi trovo davanti il primo problema "serio".
Vorrei rendere il sensore a ultrasuoni HC sr04 ancora più preciso considerando
anche la temperatura dell'aria.
Però,  dal seguente codice ottengo solo valori incoerenti.
Code:
void loop(){
  //porta bassa l'uscita del trigger
  digitalWrite( triggerPort, LOW );
    
  //invia un impulso di 10microsec su trigger
  digitalWrite( triggerPort, HIGH );
  delayMicroseconds( 10 );
  digitalWrite( triggerPort, LOW );
  
  tempo = pulseIn(echoPort, HIGH) / (2*10^6); //tempo di viaggio espresso in secondi
  T = Get_Temperature(); // restituisce la temperatura in °C
  s = ((331,4 + 0,62* T) * tempo) * 10^2; spazio in cm
Serial.println(s);
 }

Quale potrebbe essere il problema?
Grazie
« Last Edit: March 29, 2013, 06:26:49 pm by leo72 » Logged

Dueville (VI)
Offline Offline
Edison Member
*
Karma: 28
Posts: 1771
http://cesarecacitti.wordpress.com/
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Buongiorno a tutti,
ho da poco iniziato con Arduino e già mi trovo davanti il primo problema "serio".
Vorrei rendere il sensore a ultrasuoni HC sr04 ancora più preciso considerando
anche la temperatura dell'aria.
Però,  dal seguente codice ottengo solo valori incoerenti.

 void loop(){
  //porta bassa l'uscita del trigger
  digitalWrite( triggerPort, LOW );
   
  //invia un impulso di 10microsec su trigger
  digitalWrite( triggerPort, HIGH );
  delayMicroseconds( 10 );
  digitalWrite( triggerPort, LOW );
 
  tempo = pulseIn(echoPort, HIGH) / (2*10^6); //tempo di viaggio espresso in secondi
  T = Get_Temperature(); // restituisce la temperatura in °C
  s = ((331,4 + 0,62* T) * tempo) * 10^2; spazio in cm
Serial.println(s);
 }

Quale potrebbe essere il problema?
Grazie
Da dove prelevi la temperatura?
Logged

Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

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

Da un LM35DT(http://www.alldatasheet.com/datasheet-pdf/pdf/8876/NSC/LM35DT.html), sensore di temperatura

Code:
 float GetTemperature() {
   float aRead = 0;
   for (int i = 0; i < 20; i++)
    aRead = aRead+analogRead(Pin);
    aRead /= 20;
  float temperature = ((100*1.1*aRead)/1024)*10;
   return temperature/10;
  }

edit: per favore includi il codice usando gli appositi tag
« Last Edit: March 29, 2013, 06:27:17 pm by leo72 » Logged

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

questa cosa era nella seconda prova dell'esame di maturità per gli ITIS nei corsi di elettronica, informatica e telecomunicazioni l'hanno scorso, prova a cercare le soluzioni in internet magari trovi qualcosa di interessante smiley

quel codice te lo compila? hai messo i numeri decimali con la virgola anzi che mettere i punti, forse è lì il problema  smiley-roll-sweat
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

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

Code:
s = ((331,4 + 0,62* T) * tempo) * 10^2; spazio in cm

E mancano anche i caratteri dei commenti //
Come fa a compilartelo?

Code:
s = ((331.4 + 0.62* T) * tempo) * 10^2;  // spazio in cm
Logged

my name is IGOR, not AIGOR

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

Grazie a tutti per le risposte.

Sì, ho provato a sostituire le virgole con i punti e il commento mancato è un errore di battitura non presente nel codice che uso.
Questo è l'intero listato.

Code:
//variabili d'ambiente
  float t, s, Temperatura;

  //sensore ultrasuoni 
  int trigger = 7;
  int echo = 8;
 
//sensore temperatura
 int Pin = 0;

  void setup() {
  pinMode( trigger, OUTPUT );
  pinMode( echo, INPUT );
  pinMode(4, OUTPUT);
  Serial.begin(9600);
  Serial.flush();
  analogReference(INTERNAL);
  }
 
  void loop()
  {
  digitalWrite( trigger, LOW );
 
  digitalWrite(trigger, HIGH );
  delayMicroseconds( 10 );
  digitalWrite(trigger, LOW );
 
  t = pulseIn(echo, HIGH );
    Temperatura = Get_Temperature();
    s = ((331.4 + 0.62* Temperatura) * t) * 10^2;  // spazio in cm
    Serial.println(s);
delay(1000);
}

float Get_Temperature() {
 float temperature, aRead = 0;
 for (int i = 0; i < 10; i++)
  aRead = aRead+analogRead(Pin);
 aRead /= 10;
 temperature = ((100*1.1*aRead)/1024);
 return temperature;
}
Logged

0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 486
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

PulseIn restituisce un tempo in microsecondi mentre la formula che usi tu vorrebbe un tempo in secondi.
Inoltre credo manchi un ritardo tra
digitalWrite( trigger, LOW );
 e
 digitalWrite(trigger, HIGH );

Per un efficace debugging però io stamperei anche la temperatura e la durata dell'impulso.
Logged

Pages: [1]   Go Up
Jump to: