problema con temperature minime e massime

Innanzitutto bentrovati... visto che è un bel po che non frequento :stuck_out_tongue:

Sto provando a fare un termometro che rileva 2 temperature e memorizza i valori massimi e minimi
A display ho prima schermata con temperatura esterna ed interna, seconda schermata accessibile da pulsante mi dovrebbe restituire le minime e le massime registrate sui due sensori ma in realtà assegna i valori rilevati solo da un sensore e mi stampa quelli. La soluzione è sotto il naso ma non la vedo :o
ecco lo sketch

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#include <OneWire.h>                   
#include <DallasTemperature.h>  

float massima = -50;   // dichiaro la variabile "massima"
float minima = 65;     //dichiaro la variabile "minima" 

LiquidCrystal lcd(0);
RTC_DS1307 RTC;
int P1=A0;

#define ONE_WIRE_BUS 7 //assegno pin dati sensori
#define LED 12            // LED collegato al pin 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress sensExt = { 0x28, 0xC4, 0x07, 0xA6, 0x04, 0x00, 0x00, 0x32 };
DeviceAddress sensInt = { 0x28, 0x29, 0x6A, 0x84, 0x04, 0x00, 0x00, 0xDB };

void setup()
{
  pinMode(LED, OUTPUT);     // imposta il pin spia output 
// inizio la libreria
sensors.begin();
// settaggio a 10 bit della risoluzione dei sensori
sensors.setResolution(sensExt, 10);
sensors.setResolution(sensInt, 10);
  
 lcd.begin(20, 4);
  lcd.setCursor(7,0);             ///////////////////////////////////////////
  lcd.print("GUTTY");             ////////pseudoSPLASH               ////////
  lcd.setCursor(2,1);             ////////      SCREEN BY GUIDO      ////////     
  lcd.print("Termometro");   ///////////////////////////////////////////  
  lcd.setCursor(2,2);             ////////      SCREEN BY GUIDO      ////////     
  lcd.print("con Arduino"); 
  
  delay(2000);
  lcd.clear();
  // Inizializzazione dei pulsanti
  pinMode(P1,INPUT);
  
   Serial.begin(9600);
  Wire.begin();
  RTC.begin();
  //RTC.sqw(1); 
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
   
  }
    // di default il display visualizzerà data e ora
  int menu=0;
  }
  
 void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Errore");
} else {
lcd.print(tempC);
lcd.print(" C");

if (tempC > massima) massima = tempC;    //imposto condizione che restituisce valore "massima"
 if (tempC < minima) minima = tempC; 
  if (tempC > 25)  digitalWrite(LED, HIGH);  // accende spia se alta temp
   if (tempC > 12)  digitalWrite(LED, HIGH);  // accende spia se bassa temp
}
}
void loop() { 


sensors.requestTemperatures();
lcd.setCursor(0,0);
lcd.print("TEMP.Esterna: ");
lcd.setCursor(0,1);
printTemperature(sensExt);
lcd.setCursor(0,2);
lcd.print("TEMP.Interna: ");
lcd.setCursor(0,3);
printTemperature(sensInt);

   if(digitalRead(P1))
  {
    lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("esterna");
     lcd.setCursor(10,0);
     lcd.print("interna");

     lcd.setCursor(0,2);
     lcd.print("max ");
     lcd.print(massima);                    //stampo "massima"

     lcd.setCursor(0,3);
     lcd.print("min ");
     lcd.print(minima);                     //stampo "massima" 
      
     lcd.setCursor(10,2);
     lcd.print("max ");
     lcd.print(massima);                    //stampo "massima"

     lcd.setCursor(10,3);
     lcd.print("min ");
     lcd.print(minima);                    //stampo "massima" 


     
    delay (12000);
    lcd.clear();
   }
  }

Grazie
Guido

Se hai un'unica variabile per la massima e una unica per la minima, come può tenere traccia di due distinti valori? Devi usare 4 variabili, tipo: maxInt, minInt, maxExt, minExt.

Di conseguenza non puoi nemmeno fare l'eventuale modifica di massimi e minimi da printTemperature(), perché non avrebbe modo di sapere quali usare. Suggerirei di farlo direttamente dal loop().

che benefici ottengo direttamente dal loop?

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#include <OneWire.h>                   
#include <DallasTemperature.h>  

float massima = -50;   // dichiaro la variabile "massima"
float minima = 65;     //dichiaro la variabile "minima" 
float massimaInt = -50;   // dichiaro la variabile "massima interna"
float minimaInt = 65;     //dichiaro la variabile "minima interna" 

LiquidCrystal lcd(0);

int P1=A0;

#define ONE_WIRE_BUS 7 //assegno pin dati sensori
#define LED 13            // LED collegato al pin 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

DeviceAddress sensExt = { 0x28, 0xC4, 0x07, 0xA6, 0x04, 0x00, 0x00, 0x32 };
DeviceAddress sensInt = { 0x28, 0x29, 0x6A, 0x84, 0x04, 0x00, 0x00, 0xDB };

void setup()
{
  pinMode(LED, OUTPUT);     // imposta il pin spia output 
// inizio la libreria
sensors.begin();
// settaggio a 10 bit della risoluzione dei sensori
sensors.setResolution(sensExt, 10);
sensors.setResolution(sensInt, 10);
  
 lcd.begin(20, 4);
  lcd.setCursor(2,0);             ///////////////////////////////////////////
  lcd.print("GUTTY");             ////////pseudoSPLASH               ////////
  lcd.setCursor(2,1);             ////////      SCREEN BY GUIDO      ////////     
  lcd.print("Termometro");   ///////////////////////////////////////////  
  lcd.setCursor(2,2);             ////////      SCREEN BY GUIDO      ////////     
  lcd.print("con Arduino"); 
  
  delay(2000);
  lcd.clear();
  // Inizializzazione dei pulsanti
  pinMode(P1,INPUT);
  }
  void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
lcd.print("Errore");
} else {
lcd.print(tempC);
lcd.print(" C");

if (tempC > massima) massima = tempC;    //imposto condizione che restituisce valore "massima e minima"
 if (tempC < minima) minima = tempC; 
  if (tempC > massimaInt) massimaInt = tempC;    //imposto condizione che restituisce valore "massima e minima interna"
   if (tempC < minimaInt) minimaInt = tempC;  
  
  
  if (tempC > 25)  digitalWrite(LED, HIGH);  // accende spia se alta temp
   if (tempC > 12)  digitalWrite(LED, HIGH);  // accende spia se bassa temp
}
}
void loop() { 


sensors.requestTemperatures();
lcd.setCursor(0,0);
lcd.print("TEMP.Esterna: ");
lcd.setCursor(0,1);
printTemperature(sensExt);
lcd.setCursor(0,2);
lcd.print("TEMP.Interna: ");
lcd.setCursor(0,3);
printTemperature(sensInt);

   if(digitalRead(P1))
  {
    lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("esterna");
     lcd.setCursor(10,0);
     lcd.print("interna");

     lcd.setCursor(0,2);
     lcd.print("max ");
     lcd.print(massima);                    //stampo "massima"

     lcd.setCursor(0,3);
     lcd.print("min ");
     lcd.print(minima);                     //stampo "massima" 
      
     lcd.setCursor(10,2);
     lcd.print("max ");
     lcd.print(massimaInt);                    //stampo "massima"

     lcd.setCursor(10,3);
     lcd.print("min ");
     lcd.print(minimaInt);                    //stampo "massima" 


     
    delay (12000);
    lcd.clear();
   }
  }

credo di essere nettamente in confusione, aggiunte due variabili come suggerito ma il risultato non cambia

Non è che ottieni dei benefici, è che da printTemperature() non sai quale termometro stai leggendo, e quindi non sai quali massimi e minimi aggiornare:

if (tempC > massima) massima = tempC;    //imposto condizione che restituisce valore "massima e minima"
 if (tempC < minima) minima = tempC; 
  if (tempC > massimaInt) massimaInt = tempC;    //imposto condizione che restituisce valore "massima e minima interna"
   if (tempC < minimaInt) minimaInt = tempC;

Così non fai distinzione tra massimi/minimi interni ed esterni, saranno sempre aggiornati insieme. Ci vuole qualcosa tipo:

sensors.requestTemperatures();

// ESTERNO
lcd.setCursor(0,0);
lcd.print("TEMP.Esterna: ");
lcd.setCursor(0,1);
tempC = sensors.getTempC(sensExt);
if (tempC == -127.00) {
  lcd.print("Errore");
} else {
  lcd.print(tempC);
  lcd.print(" C");

  if (tempC > massima)
    massima = tempC;    //imposto condizione che restituisce valore "massima e minima"
  if (tempC < minima)
    minima = tempC;
}

// INTERNO
lcd.setCursor(0,2);
lcd.print("TEMP.Interna: ");
lcd.setCursor(0,3);
tempC = sensors.getTempC(sensInt);
if (tempC == -127.00) {
  lcd.print("Errore");
} else {
  lcd.print(tempC);
  lcd.print(" C");

  if (tempC > massimaInt)
    massimaInt = tempC;    //imposto condizione che restituisce valore "massima e minima interna"
  if (tempC < minimaInt)
    minimaInt = tempC;
}

In uno dei due blocchi (quello che ti interessa) devi poi aggiungere il controllo per accendere il led.

Se poi preferisci puoi fare al limite due funzioni e/o applicare varie ottimizzazioni per non scrivere due volte il codice comune, ma in prima approssimazione quello che è più semplice e comprensibile è questo.

ho fatto un disastro!! per installare nuova versione arduino ho eliminato la cartella dei miei progetti :o :o :o :o :o
non ho backup e non riesco a ripristinare...porca paletta che nervi!