Vai al contenuto
PLC Forum


Arduino sensore temperatura, con allarme, uscita fan


Messaggi consigliati

Inserito:

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


Inserita:
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.

Adelino Rossi
Inserita:

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.

Inserita:

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;

    }

  }

 

 

 

}

Inserita:

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.

Inserita:

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

Inserita:

Alllora non leggi quello che scrivo. Se vuoi simulare il sensore devi usare un potenziometro.

Inserita:

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??

Inserita:
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"

Inserita:

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);
}

Inserita:

con quale tempo di intermittenza vuoi che suoni il buzzer? se è un tempo alto di pausa non devi utilizzare il delay ma il millis

Inserita:

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);
}

 

Inserita:

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)

Inserita:

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

 

Inserita:

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.

Inserita:

Se non rispondi alle domande precendenti non posso darti aiuto.

Inserita:

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.

Inserita:

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

Inserita:

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.

Inserita:

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 ^_^

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...