Go Down

Topic: Hc sr04 compensazione temperatura (Read 458 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