[ risolto ] temperature min e max

Sembra facile ma non riesco a mettere in codice le variabili che servono allo scopo come spiegato in un post di qualche tempo fa

il mio codice è questo:

#include <OneWire.h>
#include <DallasTemperature.h>


#define ONE_WIRE_BUS 3


OneWire oneWire(ONE_WIRE_BUS);


DallasTemperature sensors(&oneWire);


DeviceAddress tempEsterna = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
DeviceAddress tempInterna = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };

void setup(void)
{
  
  Serial.begin(9600);

  sensors.begin();
  
  sensors.setResolution(tempEsterna, 10);
  sensors.setResolution(tempInterna, 10);
  
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("errore");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop(void)
{ 
  delay(2000);
    
  Serial.print("Temperatura esterna: ");
  printTemperature(tempEsterna);
  
  Serial.print("Temperatura interna: ");
  printTemperature(tempInterna);
  
  }

Nel seguente codice ho utilizzato le variabili float tempestmax e tempinmax per salvare le temperature massime rispettivamente esterne e interne, e le variabili float tempestmin e tempinmin per salvare le temperature minime rispettivamente esterne e interne. Ho aggiunto anche un pulsante sul pin 10 (ma naturalmente puoi benissimo utilizzare un altro pin inutilizzato) che, se premuto, consente di visualizzare sul serial monitor i valori sopra descritti, spero di esserti stato d’aiuto :).

#include <OneWire.h>
#include <DallasTemperature.h>


#define ONE_WIRE_BUS 3
#define INTERVALLO_MISURA 2000 //intervallo di 2 secondi tra una misura e l'altra
float tempestmax, tempestmin; //temperature esterne massima e minima
float tempinmax, tempinmin; //temperature interne massima e minima
int buttonPin = 10; //pulsante per la visualizzazione della temperatura esterna/interna massima rilevata!
long lastDebounceTime = 0; 
long debounceDelay = 50;  
int buttonState;            
int lastButtonState = LOW; 
int nextMisure;


OneWire oneWire(ONE_WIRE_BUS);


DallasTemperature sensors(&oneWire);


DeviceAddress tempEsterna = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
DeviceAddress tempInterna = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };

void setup(void)
{
  
  Serial.begin(9600);
  tempestmin = tempinmin = -50.0 ;// la temperatura esterna/interna più bassa registrabile
  tempestmax = tempinmax = 65.0 ;// la temperatura esterna/interna più alta registrabile
  sensors.begin();
  pinMode (buttonPin, INPUT);
  nextMisure = 0;
  
  sensors.setResolution(tempEsterna, 10);
  sensors.setResolution(tempInterna, 10);
  
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("errore");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop(void)
{ 
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) 
    lastDebounceTime = millis();
  if ((millis() - lastDebounceTime) > debounceDelay) {

    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
	Serial.print("La massima temperatura esterna rilevata è stata di C: ");
	Serial.println(tempestmax);
	Serial.print("La minima temperatura esterna rilevata è stata di C: ");
	Serial.println(tempestmin);
	Serial.print("La massima temperatura interna rilevata è stata di C: ");
	Serial.println(tempinmax);
	Serial.print("La minima temperatura interna rilevata è stata di C: ");
	Serial.println(tempinmin);
	}
        
    }
  }
  lastButtonState = reading;

  if ( millis() - nextMisure > INTERVALLO_MISURA ) {
  nextMisure = millis();
  Serial.print("Temperatura esterna: ");
  printTemperature(tempEsterna);
  tempestmax = ( tempestmax > tempEsterna ) ? tempestmax : tempEsterna;
  tempestmin = ( tempestmin < tempEsterna ) ? tempestmin : tempEsterna;

  Serial.print("Temperatura interna: ");
  printTemperature(tempInterna);
  tempinmax = ( tempinmax > tempInterna ) ? tempinmax : tempInterna;
  tempinmin = ( tempinmin < tempInterna ) ? tempinmin : tempInterna;
  }
  
  }

Quando inizializzi le variabili le devi inizializzare al contrario altrimenti non funziona Non così

tempestmin = tempinmin = -50.0 ;// la temperatura esterna/interna più bassa registrabile
tempestmax = tempinmax = 65.0 ;// la temperatura esterna/interna più alta registrabile

ma così

tempestmin = tempinmin = 65.0 ;// la temperatura esterna/interna più alta registrabile
tempestmax = tempinmax = -50.0 ;// la temperatura esterna/interna più bassa registrabile

La minima deve partire dall'alto e la massima dal basso, altrimenti al confronto la minima sarà sempre minima e la massima sempre massima.

Hai ragione! Ho scritto velocemente il codice e non me ne sono accorto! La prossima volta controllo meglio

Secondo me, come avevo già detto nell'altro thread, basta fare una prima lettura nel setup() e registrare la temperatura corrente in entrambe le variabili min e max.

leo72: Secondo me, come avevo già detto nell'altro thread, basta fare una prima lettura nel setup() e registrare la temperatura corrente in entrambe le variabili min e max.

In effetti per una programmazione coi fiocchi sarebbe opportuno effettuare l'inizializzazione delle variabili min e max ad una prima lettura nel setup(). A questo punto, per la semplicità del codice, credo sia opportuno lasciare all'utente finale la decisione di quale "strategia" utilizzare per le variabili min e max :).

Questo è il codice corretto: (nel precedente codice ho dichiarato int nextMisure quando invece và dichiarato unsigned long)

#include <OneWire.h>
#include <DallasTemperature.h>


#define ONE_WIRE_BUS 3
#define INTERVALLO_MISURA 2000 //intervallo di 2 secondi tra una misura e l'altra
float tempestmax, tempestmin; //temperature esterne massima e minima
float tempinmax, tempinmin; //temperature interne massima e minima
int buttonPin = 10; //pulsante per la visualizzazione della temperatura esterna/interna massima rilevata!
unsigned long lastDebounceTime = 0; 
long debounceDelay = 50;  
int buttonState;            
int lastButtonState = LOW; 
unsigned long nextMisure = 0;


OneWire oneWire(ONE_WIRE_BUS);


DallasTemperature sensors(&oneWire);


DeviceAddress tempEsterna = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
DeviceAddress tempInterna = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };

void setup(void)
{
  
  Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(tempEsterna, 10);
  sensors.setResolution(tempInterna, 10);
  pinMode (buttonPin, INPUT_PULLUP);
  /* inizializzazione valori massimi e minimi */
  tempestmax = tempestmin = printTemperature(tempEsterna);
  tempinmax = tempinmin = printTemperature(tempInterna);
  
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("errore");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop(void)
{ 
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) 
    lastDebounceTime = millis();
  if ((millis() - lastDebounceTime) > debounceDelay) {

    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
	Serial.print("La massima temperatura esterna rilevata è stata di C: ");
	Serial.println(tempestmax);
	Serial.print("La minima temperatura esterna rilevata è stata di C: ");
	Serial.println(tempestmin);
	Serial.print("La massima temperatura interna rilevata è stata di C: ");
	Serial.println(tempinmax);
	Serial.print("La minima temperatura interna rilevata è stata di C: ");
	Serial.println(tempinmin);
	}
        
    }
  }
  lastButtonState = reading;

  if ( millis() - nextMisure > INTERVALLO_MISURA ) {
  nextMisure = millis();
  Serial.print("Temperatura esterna: ");
  printTemperature(tempEsterna);
  tempestmax = ( tempestmax > tempEsterna ) ? tempestmax : tempEsterna;
  tempestmin = ( tempestmin < tempEsterna ) ? tempestmin : tempEsterna;

  Serial.print("Temperatura interna: ");
  printTemperature(tempInterna);
  tempinmax = ( tempinmax > tempInterna ) ? tempinmax : tempInterna;
  tempinmin = ( tempinmin < tempInterna ) ? tempinmin : tempInterna;
  }
  
  }

Bene. Puoi mettere [RISOLTO] nel titolo del thread (edita il 1° messaggio della discussione) in modo da far capire che il problema è stato... risolto. ;)

leo72: Bene. Puoi mettere [RISOLTO] nel titolo del thread (edita il 1° messaggio della discussione) in modo da far capire che il problema è stato... risolto. ;)

Non dovrebbe editare il thread chi ha posto la domanda?

Ah, sì. Mi pareva lo avessi aperto tu :wink:

eccomi! scusate… non ero a casa
grazie per le dritte, purtroppo non ho risolto, il codice mi da errore!

Ma printTemperature cosa fa, esattamente? Restituisce un valore oppure no?

printTemperature è void. Prova con questo codice:

#include <OneWire.h>
#include <DallasTemperature.h>


#define ONE_WIRE_BUS 3
#define INTERVALLO_MISURA 2000 //intervallo di 2 secondi tra una misura e l'altra
float tempestmax, tempestmin; //temperature esterne massima e minima
float tempinmax, tempinmin; //temperature interne massima e minima
int buttonPin = 10; //pulsante per la visualizzazione della temperatura esterna/interna massima rilevata!
unsigned long lastDebounceTime = 0; 
long debounceDelay = 50;  
int buttonState;            
int lastButtonState = LOW; 
unsigned long nextMisure = 0;


OneWire oneWire(ONE_WIRE_BUS);


DallasTemperature sensors(&oneWire);


DeviceAddress tempEsterna = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
DeviceAddress tempInterna = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };

void setup(void)
{
  
  Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(tempEsterna, 10);
  sensors.setResolution(tempInterna, 10);
  pinMode (buttonPin, INPUT_PULLUP);
  /* inizializzazione valori massimi e minimi */
  tempestmin = tempinmin = 65.0 ;// la temperatura esterna/interna più alta registrabile
  tempestmax = tempinmax = -50.0 ;// la temperatura esterna/interna più bassa registrabile
  
}

void printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("errore");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
  }
}

void loop(void)
{ 
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) 
    lastDebounceTime = millis();
  if ((millis() - lastDebounceTime) > debounceDelay) {

    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
	Serial.print("La massima temperatura esterna rilevata è stata di C: ");
	Serial.println(tempestmax);
	Serial.print("La minima temperatura esterna rilevata è stata di C: ");
	Serial.println(tempestmin);
	Serial.print("La massima temperatura interna rilevata è stata di C: ");
	Serial.println(tempinmax);
	Serial.print("La minima temperatura interna rilevata è stata di C: ");
	Serial.println(tempinmin);
	}
        
    }
  }
  lastButtonState = reading;

  if ( millis() - nextMisure > INTERVALLO_MISURA ) {
  nextMisure = millis();
  Serial.print("Temperatura esterna: ");
  printTemperature(tempEsterna);
  tempestmax = ( tempestmax > tempEsterna ) ? tempestmax : tempEsterna;
  tempestmin = ( tempestmin < tempEsterna ) ? tempestmin : tempEsterna;

  Serial.print("Temperatura interna: ");
  printTemperature(tempInterna);
  tempinmax = ( tempinmax > tempInterna ) ? tempinmax : tempInterna;
  tempinmin = ( tempinmin < tempInterna ) ? tempinmin : tempInterna;
  }
  
  }

di nuovo medesimo errore nella riga dopo l'ultimo if: tempestmax = ( tempestmax > tempEsterna ) ? tempestmax : tempEsterna;

tu l'hai testato? mi viene un dubbio sulle mie librerie ciao

Prova questo:

#include <OneWire.h>
#include <DallasTemperature.h>


#define ONE_WIRE_BUS 3
#define INTERVALLO_MISURA 2000 //intervallo di 2 secondi tra una misura e l'altra
float tempestmax, tempestmin; //temperature esterne massima e minima
float tempinmax, tempinmin; //temperature interne massima e minima
int buttonPin = 10; //pulsante per la visualizzazione della temperatura esterna/interna massima rilevata!
unsigned long lastDebounceTime = 0; 
long debounceDelay = 50;  
int buttonState;            
int lastButtonState = LOW; 
unsigned long nextMisure = 0;


OneWire oneWire(ONE_WIRE_BUS);


DallasTemperature sensors(&oneWire);


DeviceAddress tempEsterna = { 0x28, 0x94, 0xE2, 0xDF, 0x02, 0x00, 0x00, 0xFE };
DeviceAddress tempInterna = { 0x28, 0x6B, 0xDF, 0xDF, 0x02, 0x00, 0x00, 0xC0 };

void setup(void)
{
  
  Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(tempEsterna, 10);
  sensors.setResolution(tempInterna, 10);
  pinMode (buttonPin, INPUT_PULLUP);
  /* inizializzazione valori massimi e minimi */
  tempestmin = tempinmin = 65.0 ;// la temperatura esterna/interna più alta registrabile
  tempestmax = tempinmax = -50.0 ;// la temperatura esterna/interna più bassa registrabile
  
}

float printTemperature(DeviceAddress deviceAddress)
{
  float tempC = sensors.getTempC(deviceAddress);
  if (tempC == -127.00) {
    Serial.print("errore");
  } else {
    Serial.print("C: ");
    Serial.print(tempC);
    Serial.print(" F: ");
    Serial.print(DallasTemperature::toFahrenheit(tempC));
    return tempC;
  }
}

void loop(void)
{ 
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) 
    lastDebounceTime = millis();
  if ((millis() - lastDebounceTime) > debounceDelay) {

    if (reading != buttonState) {
      buttonState = reading;

      if (buttonState == HIGH) {
	Serial.print("La massima temperatura esterna rilevata è stata di C: ");
	Serial.println(tempestmax);
	Serial.print("La minima temperatura esterna rilevata è stata di C: ");
	Serial.println(tempestmin);
	Serial.print("La massima temperatura interna rilevata è stata di C: ");
	Serial.println(tempinmax);
	Serial.print("La minima temperatura interna rilevata è stata di C: ");
	Serial.println(tempinmin);
	}
        
    }
  }
  lastButtonState = reading;

  if ( millis() - nextMisure > INTERVALLO_MISURA ) {
  nextMisure = millis();
  Serial.print("Temperatura esterna: ");
  float tempEst = printTemperature(tempEsterna);
  tempestmax = ( tempestmax > tempEst ) ? tempestmax : tempEst;
  tempestmin = ( tempestmin < tempEst ) ? tempestmin : tempEst;

  Serial.print("Temperatura interna: ");
  float tempin = printTemperature(tempInterna);
  tempinmax = ( tempinmax > tempInt ) ? tempinmax : tempInt;
  tempinmin = ( tempinmin < tempInt ) ? tempinmin : tempInt;
  }
  
  }

ora il codice gira ma mi restituisce 65 e 50 fissi, ricontrollo indirizzi sonde, pin e vi faccio sapere! buona settimana a tutti :)

Chi ti restituisce 65 e 50 fissi? la variabili max e min o il sensore?

Devo correggermi, proprio si blocca dopo l’ultimo float…
se tempint diventa tempin il codice gira ma mi da temperature c 85 e f 185

premendo pulsante ho temperature massime 85 e minime 65

leo72: Ma printTemperature cosa fa, esattamente? Restituisce un valore oppure no?

MasterPi: printTemperature è void.

Ed allora com'è che lo usate per ricevere la temperatura dal sensore ed assegnarla ad una variabile?

float tempin = printTemperature(tempInterna);

Non capisco...

Ci devo ragionare Leo perchè per me non è così semplice voglio però approfondire anche il tuo metodo e ragionamento appena funziona l'idea di masterPi