sensore temperatura ds18b20

Buonasera a tutti,

Ho un problema con la programmazione di un sensore DS18B20.

Premetto che non ho grosse basi di programmazione e faccio un po di fatica, ma cerco sempre di capire quello che sto facendo.

Il mio obbiettivo è quello di controllare la temperatura e se super un determinato valore far suonare una cicalina.

Come detto prima, dato che devo capire, per ora sto solo giocando con il sensore ( senza cicalina) ed il monitor seriale, per capirne il funzionamento e la programmazione.

Ho provato a scrivere uno sketch e caricarlo, solo che superato il valore che gli imposto, non viene fuori la scritta del secondo caso ( temp. critica).

i 2 sketch che ho provato sono questi:

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int printTemperature = sensors.getTempCByIndex(0);
void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
  
}


void loop(void)
{ 
  
  sensors.requestTemperatures(); 
  float temperatura = printTemperature;

  if (temperatura < 25)
  {
    Serial.print("temperatura ok: ");
    Serial.println(sensors.getTempCByIndex(0));
  }

  else 
  {
    Serial.print("temperatura critica: ");
    Serial.println(sensors.getTempCByIndex(0));
  }
   
}
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int printTemperature = sensors.getTempCByIndex(0);
void setup(void)
{
  Serial.begin(9600);
  sensors.begin();
  
}


void loop(void)
{ 
  
  sensors.requestTemperatures(); 
  float temperatura = printTemperature;

  if (temperatura < 25)
  {
    Serial.print("temperatura ok: ");
    Serial.println(sensors.getTempCByIndex(0));
  }

  if (temperatura > 25)
  {
    Serial.print("temperatura critica: ");
    Serial.println(sensors.getTempCByIndex(0));
  }
   
}

ho provato a cercare altro materiale ma io non sono riuscito a trovare nulla.

Dove sto sbagliando?

float temperatura = printTemperature;

printTemperature, per come l'hai definita, è una variabile globale, che inizializzi una volta e poi non aggiorni mai, di conseguenza conterrà sempre lo stesso valore. Devi invece chiamare l'apposita funzione ogni volta che vuoi la temperatura corrente, ovvero:

float temperatura = sensors.getTempCByIndex(0);

E printTemperature puoi anche rimuoverlo.

Grazie mille per la spiegazione,

ora ho implementato con la cicalina come segue:

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int printTemperature = sensors.getTempCByIndex(0);
int cicalina = A1;


void setup(void)
{
  pinMode ( cicalina, OUTPUT);
   sensors.begin();
  Serial.begin(9600);
 
  
}


void loop(void)
{ 
  
  sensors.requestTemperatures(); 
  float temperatura = sensors.getTempCByIndex(0);

  if (temperatura < 25)
  {
    Serial.print("temperatura ok: ");
    Serial.println(sensors.getTempCByIndex(0));
    digitalWrite (cicalina, HIGH);
  }

  if (temperatura > 25)
  {
    Serial.print("temperatura critica: ");
    Serial.println(sensors.getTempCByIndex(0));
    digitalWrite (cicalina, LOW);
  }
   
}

funziona, ma se if (temperatura > 25) volessi far suonare la cicalina ad intermittenza per x secondi devo usare millis?
Ho trovato tanto materiale su millis ma faccio un po di fatica a capirne il funzionamento, ovvero non so come implementare in caso di temperatura >25.

Potete aiutarmi a capire per favore?

Ciao, se il tuo sketch non fa nulla di che puoi usare anche un semplice delay

Buonasera,

Ringrazio tutti per la pazienza ma ho ancora un ultimo problema:

prima metto lo sketch:

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
int printTemperature = sensors.getTempCByIndex(0);
int cicalina = A1;
int pulsante = 9;
int StatoPulsante = 0;
int ValoreTemperatura = 70;
int attesaTasto = 60000;


void setup(void)
{
  pinMode ( pulsante, INPUT);
  pinMode ( cicalina, OUTPUT);
   sensors.begin();
  Serial.begin(9600);  
}


void loop(void)
{ 
  StatoPulsante = digitalRead (pulsante);
  
  sensors.requestTemperatures(); 
  float temperatura = sensors.getTempCByIndex(0);

  if (temperatura < ValoreTemperatura)
  {
    Serial.print("temperatura ok: ");
    Serial.println(sensors.getTempCByIndex(0));
    digitalWrite (cicalina, HIGH);
  }

  if (temperatura > ValoreTemperatura)
  {
    Serial.print("temperatura critica: ");
    Serial.println(sensors.getTempCByIndex(0));
    digitalWrite (cicalina, LOW);
  }

   if (StatoPulsante==HIGH)
   {digitalWrite (cicalina, HIGH);
   delay (attesaTasto);
   }
}

il riassunto è controllo la temperatura di una vecchia caldaia senza automatismi. se supera i 70°C deve scattare l'allarme per intervenire manualmente e chiudere lo sportello, e non farla arrivare a 100°C.
Se supera i 70°C suona la cicalina, ma con il pulsante voglio disattivare la cicalina.
Per come so scrivere lo sketch pero ho notato che c'è un problema: se la disattivo per quei 10 min ( 60000 ms) la scheda non tiene piu conto della temperatura, il che è pericoloso in quanto la temperatura potrebbe ancora salire).
Quindio io avrei bisogno che:

  1. meno di 70 non suona
  2. sopra 70 suona
  3. premo il pulsante e disattivo la cicalina,
  4. dopo aver silenziato la cicalina, imposto una seconda temperatura critica che solo se raggiunta a quel punto riparte la cicalina.

il punto 4 non saprei proprio come programmarlo....Mi potete aiutare per favore?
Grazie

  1. meno di 70 non suona
  2. sopra 70 suona
  3. premo il pulsante e disattivo la cicalina per 10 minuti ( o più )
  4. dopo aver silenziato se scaduto il tempo impostato la temperatura è ancora sopra i 70 gradi, risuona
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

#define cicalina A1
#define pulsante  9
int ValoreTemperatura = 70;
boolean stato = 0 ;
boolean bistato = 1 ;
unsigned long old_millis = 0 ;
unsigned long ritardo = 600000 ; // 600 secondi ( 10 minuti )

void setup()
{
  pinMode ( pulsante, INPUT);
  pinMode ( cicalina, OUTPUT);
  sensors.begin();
  Serial.begin(9600);
}

void loop()
{
  sensors.requestTemperatures();
  float temperatura = sensors.getTempCByIndex(0);

  if (temperatura < ValoreTemperatura)
  {
    Serial.print("temperatura ok: ");
    Serial.println(sensors.getTempCByIndex(0));
    stato = 0 ;
  }

  if (temperatura >= ValoreTemperatura)
  {
    Serial.print("temperatura critica: ");
    Serial.println(sensors.getTempCByIndex(0));
    stato = 1 ;
  }

  if ( digitalRead (pulsante) == HIGH)   {
    bistato = 0 ;
    stato = 0;
    old_millis = millis() ;
  }

  if (stato == 1 && bistato == 1) {
    digitalWrite (cicalina, LOW); // stato=1 accende il cicalino
  }
  else if ( stato == 0 ) {
    digitalWrite (cicalina, HIGH);  // stato=0 spegne il cicalino
  }
  if ( millis() - old_millis >= ritardo ) {
    bistato = 1 ;
  }
}

Wow Brunello, avrei ottenuto quel risultato con almeno il doppio delle righe. Grande!

Brunello sei un mito, grazie mille.
Ho anche avuto modo di testarlo dato che sono a casa.

Avrei pero bisogno di un'ultima modifica ( una l'ho gia fatta l'altra invece mi aveva sballato la programmazione e non la inserisco)

posto lo sketch e poi la modifica di cui avrei bisogno:

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

#define cicalina A1
#define pulsante  9
int TemperaturaMassima = 70;
int TemperaturaCritica = 75;
boolean stato = 0 ;
boolean bistato = 1 ;
unsigned long old_millis = 0 ;
unsigned long ritardo = 300000 ; // 300 secondi ( 5 minuti )

void setup()
{
  pinMode ( pulsante, INPUT);
  pinMode ( cicalina, OUTPUT);
  sensors.begin();
  Serial.begin(9600);
}

void loop()
{
  sensors.requestTemperatures();
  float letturaTemp1 = sensors.getTempCByIndex(0);
  float letturaTemp2 = sensors.getTempCByIndex(0);
  
  if (letturaTemp1 < TemperaturaMassima)
  {
    Serial.print("temperatura ok: ");
    Serial.println(sensors.getTempCByIndex(0));
    stato = 0 ;
  }

  if (letturaTemp1 > TemperaturaMassima & letturaTemp1 < TemperaturaCritica)
  {
    Serial.print("temperatura massima: ");
    Serial.println(sensors.getTempCByIndex(0));
    stato = 1 ;
  }

if (letturaTemp2 >= TemperaturaCritica)
  {
    Serial.print("temperatura critica: ");
    Serial.println(sensors.getTempCByIndex(0));
    stato = 1 ;
  }
  
  if ( digitalRead (pulsante) == HIGH)   {
    bistato = 0 ;
    stato = 0;
    old_millis = millis() ;
  }

  if (stato == 1 && bistato == 1) {
    digitalWrite (cicalina, LOW); // stato=1 accende il cicalino
  }
  else if ( stato == 0 ) {
    digitalWrite (cicalina, HIGH);  // stato=0 spegne il cicalino
  }
  if ( millis() - old_millis >= ritardo ) {
    bistato = 1 ;
  }
}

modifica di cui avrei cortesemente bisogno:

arriva a 70( temp max) e suona, premo il pulsante e spengo finche non arriva 75 (senza tempo quindi); deve ripartire solo se arriva a 75 ( temp crit) e a quella temperatura va bene il ritardo di x tempo....

io avevo provato inserendo un boolean stato2 = 1 ed inserendo questo stato nel settore dove scrive sul monitor seriale temp. crit....pero il risultato è stato che suonava perennemente.... :confused:

un ultimo aiutino per favore?

Grazie

Ma certamente.
Se non mi si sono intrecciati gli occhi, dovrebbe essere così

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

#define cicalina A1
#define pulsante  9
int TemperaturaMassima = 70;
int TemperaturaCritica = 75;
byte stato = 0 ;
boolean bistato = 1 ;
unsigned long old_millis = 0 ;
unsigned long ritardo = 300000 ; // 300 secondi ( 5 minuti )


void setup()
{
  pinMode ( pulsante, INPUT);
  pinMode ( cicalina, OUTPUT);
  sensors.begin();
  Serial.begin(9600);
}

void loop()
{
  sensors.requestTemperatures();
  float letturaTemp1 = sensors.getTempCByIndex(0);

  if (letturaTemp1 < TemperaturaMassima)
  {
    Serial.print("temperatura ok: ");
    Serial.println(letturaTemp1);
    stato = 0 ;
  }

  if (letturaTemp1 >= TemperaturaMassima && letturaTemp1 < TemperaturaCritica)
  {
    Serial.print("temperatura massima: ");
    Serial.println(letturaTemp1);
    stato = 1 ;
  }

  if (letturaTemp1 >= TemperaturaCritica)
  {
    Serial.print("temperatura critica: ");
    Serial.println(letturaTemp1);
    stato = 2 ;
  }

  if ( digitalRead (pulsante) == HIGH && stato == 1 )   {
    bistato = 0 ;
  }
  if ( digitalRead (pulsante) == HIGH && stato == 2) {
    bistato = 0 ;
    old_millis = millis() ;
  }

  if (stato > 0  && bistato == 1) {
    digitalWrite (cicalina, LOW); //   accende il cicalino
  }
  else {
    digitalWrite (cicalina, HIGH);  //   spegne il cicalino
  }
  if ( millis() - old_millis >= ritardo && stato == 2 ) {
    bistato = 1 ;
  }
}

Ora lo provo subito cosi ti dico, intanto ti ringrazio infinitamente per la cortesia e la disponibilita.

Sempre a "occhio", mi sono dimenticato di rimettere a posto la bistato
aggiungila qui

if (letturaTemp1 < TemperaturaMassima)
  {
    Serial.print("temperatura ok: ");
    Serial.println(letturaTemp1);
    stato = 0 ;
    bistato = 1;
  }

Rieccomi,

Il programma è perfetto ora avrei un problema hardware legato all'alimentazione...creo post nella sezione hardware, a breve link qui sotto...

link