Innanzitutto bentrovati... visto che è un bel po che non frequento
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();
}
}
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().
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!