Go Down

Topic: Hc sr04 compensazione temperatura (Read 461 times) previous topic - next topic

Anelito

Mar 29, 2013, 05:50 pm Last Edit: Mar 30, 2013, 12:26 am by leo72 Reason: 1
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: [Select]

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

cece99


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?
Il Vero Programmatore non ha bisogno di manuali sull'assembler, sono
  sufficienti i data sheet dei microprocessori.

Anelito

#2
Mar 29, 2013, 11:46 pm Last Edit: Mar 30, 2013, 12:27 am by leo72 Reason: 1
Da un LM35DT(http://www.alldatasheet.com/datasheet-pdf/pdf/8876/NSC/LM35DT.html), sensore di temperatura

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

ƎR

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 :)

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:
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

nid69ita


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


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

Code: [Select]
s = ((331.4 + 0.62* T) * tempo) * 10^2;  // spazio in cm
my name is IGOR, not AIGOR

Anelito

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: [Select]
//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;
}

zoomx

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.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy