Vai al contenuto
PLC Forum


Arduino sensore temperatura, con allarme, uscita fan


alexcanadair

Messaggi consigliati

Ciao ragazzi,

sto cercando di realizzare un progetto particolare con arduino nano,

praticamente mi serve lo sketch e lo schema di collegamento per avere questa funzione di rilevare una temperatura mediante sensore LM35 o simile :

da 10 gradi fino a 40 deve rimanere un led verde acceso,

da 41 gradi fino a 64 si deve accendere un led giallo insieme al relè per accendere le ventole da pc

superata la soglia di 65 gradi si deve accendere un led rosso e lampeggiare costantemente ed accendere un buzzer che suona ad intermittenza indicando un allarme temperatura alta

si può fare? chi mi può aiutare?

grazie in anticipo

Link al commento
Condividi su altri siti


Quote

praticamente mi serve lo sketch e lo schema di collegamento

 

In altri termini ti serve l'intero progetto.:smile:

Per prima cosa leggiti il dasheet dello LM35 . Poi basta fare una ricerca con google e trovi decine di esempi. Questo è il primo che mi ha mostrato google.

Link al commento
Condividi su altri siti

Adelino Rossi

si può fare

per qualche euro trovi la basetta pronta e funzionante di un sensore di temperatura già fatto e funzionante specificatamente per arduino, poi ti studi e sviluppi il software relativo alle funzioni che vuoi, poi applichi alle uscite led e relè secondo lo schema previsto per arduino, come dice livio cerca in rete tra le decine di schemi.

Link al commento
Condividi su altri siti

grazie Livio e Adelino, come infatti ho trovato un progetto interessante che si avvicina al mio progetto ma dovrei mettere delle opportune modifiche togliendo qualche led e metterne solo 3 verde, giallo, rosso, la ventola ed il buzzer che suona ad intermittenza che abbia la funzione come ho descritto prima mi sembra che questo codice indica la temperatura in F° e non in C° come vorrei :)

screen_shot_2012_04_28_at_11_50_47_am.pn

e questo e il codice:

//Arduino Temperature Meter Sketch

//Joshua Brake

//Created 28 April 2012

//www.joshbrake.wordpress.com

float tempC = 0;

float tempF = 0;

int baselineTempF = 64;

int maxTempF = 80;

int alarmTempF = 75;

int ledCount = 10;

int alarmPin = 3;

int ledPins[] = {4,5,6,7,8,9,10,11,12,13};

 

 

void setup() {               

  Serial.begin(9600);

for (int thisLed = 0; thisLed < ledCount; thisLed++)

{

  pinMode(ledPins[thisLed], OUTPUT);

}

  pinMode(alarmPin, OUTPUT);

 

 

initialize(); 

 

 

}

 

 

void loop() {

 

  //Average temperature readings

  for(int i=0;i<10;i++)

  {

    tempC = tempC + analogRead(A0);

 

    if(i==9)

      {

        tempC=tempC/10;

      }

  }

 

  //Convert Celsius to Fahrenheit

  tempC = (5000/1024)*tempC;

  tempC = tempC/10;

  tempF = (tempC*9/5)+32;

  Serial.print("Temperature: ");

  Serial.print(tempF); 

  Serial.print(" Degrees F ");

  Serial.print(tempC); 

  Serial.println(" Degrees C");

 

  //Map temperature to bargraph LED level

  int ledLevel = map(tempF, baselineTempF, maxTempF, 0, ledCount);

 

  //Control output LEDs

  for(int thisLed = 0; thisLed < ledCount; thisLed++)

   {

     if(thisLed < ledLevel)

     {

       digitalWrite(ledPins[thisLed], HIGH);

     }

    

     else

     {

       digitalWrite(ledPins[thisLed], LOW);

     }

   

   }

 

  //Check alarm and if above threshold, activate

  if(tempF > alarmTempF)

  {

    tone(alarmPin,880,1000);

  }

 

 

  //If temperature value is out of range, sound an alarm

  if(tempF > maxTempF)

  {

    tone(alarmPin,1760,500);

  }

 

  if(tempF < baselineTempF)

  {

    tone(alarmPin,440,500);

  }

 

 

  delay(1000);

}

 

 

 

 

 

 

//Cool initialization routine

void initialize()

{

  int delay_val=50;

  int i=0,n=0;

 

  while(i < 14 && n==0)

  {

    digitalWrite(ledPins, HIGH);   // set the LED on

    delay(delay_val);              // wait for a second

    i=i+1;

    if(i==14)

    {

      n=1;

    }

 

 

  }

 

 

  i=0;

 

  while(i<14 && n==1)

  {

    digitalWrite(ledPins, LOW);   // set the LED on

    delay(delay_val);

    i=i+1;

    if(i==14)

    {

      n=0;

    }

  }

 

 

 

}

Link al commento
Condividi su altri siti

Bhe qualche cosettina dovrai per farla da solo.:smile:

 

Il metodo per imparare è provare e verificare per trarre esperienza dai propri errori.

Arduino, con tutti i suoi limiti e difetti, ti offre il grande vantaggio di poter provare tutto in modo semplice senza dover costruire schede o altro.

Puoi tranquilla mente sostituire il sensore con un potenziometro e simulare le varie temperature, verificando che il tuo programma esegua quello che vorresti fare.

Link al commento
Condividi su altri siti

heee lo so ^^ comunque ora sto ordinando il sensore perchè non ne ho in laboratorio, in alternativa posso usare un sensore NTC a due poli o simile per questo progetto?

cosi almeno in questi giorni mi diletto sul codice e cerco di finire la programmazione

Link al commento
Condividi su altri siti

bhe ho letto ma non sapevo del potenziomento al posto del sensore almeno per consolidare la programmazione

che valore di potenziometro devo mettere al posto del LM35DZ? e in quali pin? per caso tra A0 e GND??

Link al commento
Condividi su altri siti

Quote

bhe ho letto ma non sapevo del potenziomento al posto del sensore almeno ...

 

Misembra di averlo scritto chiaramente.

Quote

Puoi tranquillamente sostituire il sensore con un potenziometro e simulare le varie temperature,

 

Il potenziometro lo alimenti tra il +5V e 0V di arduino, il centrale lo colleghi all'ingresso A0, o ad altro ingresso analogico che hai adibito come ingresso del sensore.

 

Consiglio fondamentale: alimenta arduino con un alimentatore esterno avente tensione compresa tra 7V e 12V, magari ci metti prima un 7808. Se usi solo l'alimentazione proveniente da USB rischi di avere le letture dell'analogica piuttosto "ballerine"

Link al commento
Condividi su altri siti

perfetto Livio sono arrivato dove volevo mi manca solo alcune configurazioni

temperatura base 40°, e si accende il primo led, a 55° si accende il secondo led, a 60° si accende il terzo led nel momento in cui si accende il terzo led si deve attivare il buzzer che suona ad intermittenza e con un altra uscita disponibile si deve attivare un relè che modifica devo fare per avere queste due funzioni in più? ecco la programmazione attuale ^_^

const float baselineTemp = 40.0;
 
void setup()
{
 Serial.begin(9600);
 
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 
 digitalWrite(2, LOW);
 digitalWrite(3, LOW);
 digitalWrite(4, LOW);
}
 
void loop()
{
  int sensorValue = analogRead(A0);
 
  Serial.print("Sensor Value: ");
  Serial.print(sensorValue);
 
  float voltage = (sensorValue/1024.0) * 5.0;
 
  Serial.print(" Volts: ");
  Serial.print(voltage);
 
  float temperature = (voltage - 0.5) * 100;
 
  Serial.print(" degrees C: ");
  Serial.println(temperature);
 
  if (temperature < baselineTemp)
  {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
  }
  else if (temperature >= baselineTemp + 2 && temperature < baselineTemp + 15)
  {
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
  }
  else if (temperature >= baselineTemp + 2 && temperature < baselineTemp + 20)
  {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
  }
  else if (temperature >= baselineTemp + 25)
  {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
  }
 
  delay(250);
}

Link al commento
Condividi su altri siti

Ciao Roberto, allora sono riuscito a fare sa dolo la giusta programmazione, proprio poco fà mi e arrivato il sensore LM35DZ pero controllando con il monito seriale, la temperatura non è reale e sballata mi risulta una temperatura sotto lo zero tipo -20 come posso calibrare questo sensore per la mia programmazione? questo e lo stato attuale dove devo correggere?

const float baselineTemp = 40.0;
 
void setup()
{
 Serial.begin(9600);
 
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 
 digitalWrite(2, LOW);
 digitalWrite(3, LOW);
 digitalWrite(4, LOW);
 digitalWrite(5, LOW);
}
 
void loop()
{
  int sensorValue = analogRead(A0);
 
  Serial.print("Sensor Value: ");
  Serial.print(sensorValue);
 
  float voltage = (sensorValue/1024.0) * 5.000;
 
  Serial.print(" Volts: ");
  Serial.print(voltage);
 
  float temperature = (voltage - 0.5) * 100;
 
  Serial.print(" degrees C: ");
  Serial.println(temperature);
 
  if (temperature < baselineTemp)
  {
    digitalWrite(2, LOW);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
  }
  else if (temperature >= baselineTemp + 2 && temperature < baselineTemp + 15)
  {
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
  }
  else if (temperature >= baselineTemp + 2 && temperature < baselineTemp + 20)
  {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    tone(7, 500, 150);
    delay(2000);
    tone(7, 500, 150);
 
  }
  else if (temperature >= baselineTemp + 25)
  {
    digitalWrite(2, HIGH);
    digitalWrite(3, HIGH);
    digitalWrite(4, HIGH);
   
    delay(250);
    tone(7, 2000, 190);
    delay(130);
    tone(7, 2500, 150);
    delay(500);
    tone(7, 3000, 200);
    
    digitalWrite(5, HIGH);
    delay(250);
    digitalWrite(5, LOW);
    
 
    
    
  }
 
  delay(100);
}

 

Link al commento
Condividi su altri siti

Hai letto il datasheet dello LM35DZ?

Hai guardato i vari esempi di connessione con i vari circuiti?

La versione base, collegando solo l'uscita da 10mV/1°C.

Come lo hai collegato?

Che tensione leggi?

Oppure quanti counts dall?A/D misura arduino? (basta buttare la misura sulla seriale)

Link al commento
Condividi su altri siti

sto leggendo questi dati a 9600baud e ora leggo: sensor value: 59 Volts: 0.29 Degrees C: -21.19

ho collegato gnd del sensore in a gnd di arduino, +5v del sensore a 5v di arduino e il +sens del sensore ad A0 di arduino

ho provato a cambiare il valore 5.000 in 13 e il valore gia si avvicina a quella reale e risulta ora: sensor value: 59 Volts: 0.74 Degrees C: 23.63

ma non so se è la giusta taratura da fare

 

int sensorValue = analogRead(A0);
 
  Serial.print("Sensor Value: ");
  Serial.print(sensorValue);
 
  float voltage = (sensorValue/1024.0) * 5.000;         cambiamento in *13 al posto di *5,000
 
  Serial.print(" Volts: ");
  Serial.print(voltage);
 
  float temperature = (voltage - 0.5) * 100;
 
  Serial.print(" degrees C: ");
  Serial.println(temperature);

 

Link al commento
Condividi su altri siti

l'unico problema e che in partenza al valore di 0,29mV dovevo leggere 29 gradi ma non è così, perchè leggo -21.19 gradi.

Come mai questa inversione di valore?

provando a cambiare il valore 5000 in 13 la misurazione sembra quasi reale ma non coincide con i mV letti dal seriale perchè su 0,74mV leggo 23.63 gradi

dove sto sbagliando? come posso correggere? anticipo che ho messo i valori allo stato iniziale originale di 5000.

Link al commento
Condividi su altri siti

i collegamenti sono corretti ho preso spunto da piu schemi guardati su internet per togliermi il dubbio,

i dati vengono rilevati correttamente, l'unica cosa che non combaciava nella programmazione era la conversione mV - °C del sensore che non era coordinata con la temperatura reale

ovvero 280mV = 28 gradi

e stato sufficiente cambiare il  float temperature = (voltage - 0.5) * 100; con un altro valore a tentativi

e sono riuscito a far combaciare i mV con i gradi tutto ok

risolto grazie lo stesso.

Link al commento
Condividi su altri siti

in conclusione dico che ho pubblicato nella sezione radioamatori il mio progettino, mi dispiace di non aver curato del rifiniture e un po troppo grezzo, ma alla fine

il risultato conta HI!

:P

Link al commento
Condividi su altri siti

Ciao a tutti.

 

Alex perché a voltage sottrai 0.5?

Se la temperatura è di 28 gradi voltage vale 0,280 mV, se togli 0.5 ottieni -0.22 da cui il valore negativo che spunta fuori.

Forse inizialmente ti sei basato su un esempio che moltiplicava per 5000 e non 5.000.

Link al commento
Condividi su altri siti

ciao Giacomo avevo problemi su questo punto e ho risolto ad intuito puoi vedere la programmazione completa nella sezione radioamatore (carico fittizio intelligente) vedi un attimo se va tutto bene se ci sono errori fammi sapere ^_^

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...