2 sensori di temperatura con un allarme e tacitazione

Ciao a tutti mi chiamo Silvio, e sono da poco entrato in questo mondo.
Lo sketch qui sotto è funzionante, ma è solo per 1 sensore, la temperatura quando supera un livello impostato si accende un LED e suona un buzzer,
quando la temperatura scende sotto lo stesso valore impostato il LED e il buzzer si spengono,
se LED e buzzer stanno funzionando con il tasto tacitazione si spengono,
LED e Buzzer si rimettono in funzione al prossimo superamento

il problema è che quando aggiungo un secondo sensore,
-con le dovute aggiunte e modifiche
le due temperature vengono lette dal LCD regolarmente
ma se supero la temperatura impostata del secondo sensore il led lampeggia, e di conseguenza alche il buzzer e la tacitazione non funzionano,
mentre se super solo il primo sensore funziona regolarmente.
penso che sia colpa dell’ultima parte dello sketch riportato qui sotto,
la parte:
if (temperatura < 23) {
digitalWrite(ledRosso, LOW);
analogWrite(buzzer,LOW);
CambiareLeCose=0;
delay (1000);
che è riportata anche al secondo sensore.
come posso ovviare ciò?
spero si essermi spiegato bene,
grazie in anticipo

1 sensore solo e funziona correttamente :

//collegamenti,
//pin 13 led
//pin 6 buzzer
//pin 7 pulsante tacitazione
//A0 sensore

#include <LiquidCrystal.h>
#include <math.h>
LiquidCrystal lcd(12, 11, 2, 3, 4, 5);		  
double MioSensore(int RawADC) {
  long Resistenza;  
  double Temperatura;
  Resistenza=((10240000/RawADC) - 10000);
  Temperatura = log(Resistenza);
  Temperatura = 1 / (0.001129148 + (0.000234125 * Temperatura) + (0.0000000876741 * Temperatura * Temperatura * Temperatura));
  Temperatura = Temperatura - 273.15;
  return Temperatura; 
}
  int tastoTaci=7; 
  int ledRosso=13;
  int buzzer=6;
  
  int CambiareLeCose=0;
  
void fammiVedere(int valore) {
lcd.print (int(valore));
}
void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(tastoTaci, INPUT);
  pinMode(ledRosso, OUTPUT);
}
#define termometro_1 0  
 int temperatura;
void loop() {
  lcd.setCursor(0, 0);
  temperatura=MioSensore(analogRead(termometro_1));	  
  lcd.print("MOTORE ");
  fammiVedere(temperatura);
  lcd.print((char)223);
  lcd.setCursor(0, 2);
  lcd.print("il mio nome");  
  
  //xxxxxxxxxxxxxxxxxxxxxxxxx
    tastoTaci=digitalRead(7);
if ((temperatura > 23) and (tastoTaci==LOW)and(CambiareLeCose==0)) {
    digitalWrite(ledRosso,HIGH); 
    analogWrite(buzzer, 150); 
    CambiareLeCose=1;
    delay (1000);
  }
   
else if ((temperatura > 23) and (tastoTaci==HIGH) and (CambiareLeCose==1)){
    digitalWrite(ledRosso,LOW);
    analogWrite(buzzer,LOW); 
    CambiareLeCose=1;
    delay (1000);
  } 
if (temperatura < 23) {
    digitalWrite(ledRosso, LOW);
    analogWrite(buzzer,LOW); 
    CambiareLeCose=0;
    delay (1000); 
  }
}

2 sensori, funziona riguardo l’LCD
ma non funziona l’allarme e la tacitazione, cioe:

ho 2 sensori, 1 buzzer, 1 LED e 1 tasto tacitazione
il primo dei 2 sensori che supera la soglia di temperatura deve far suonare il buzzer, accendere il LED e col pulsante tacitazione fermare l’alarme,
se non fermo l’allarme col pulsante tacitazione…quando la temperatura rientra sotto la soglia l’allarme si ferma da solo,
con 1 sensore funziona, con due sensori no

#include <LiquidCrystal.h>
#include <math.h>
LiquidCrystal lcd(12, 11, 2, 3, 4, 5);		  
double MioSensore(int RawADC) {
  long Resistenza;  
  double Temperatura;
  Resistenza=((10240000/RawADC) - 10000);
  Temperatura = log(Resistenza);
  Temperatura = 1 / (0.001129148 + (0.000234125 * Temperatura) + (0.0000000876741 * Temperatura * Temperatura * Temperatura));
  Temperatura = Temperatura - 273.15;
  return Temperatura; 
}
  int tastoTaci=7; 
  int ledRosso=13;
  int buzzer=6;
  
  int CambiareLeCose=0;
  
void fammiVedere(int valore) {
lcd.print (int(valore));
}
void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  pinMode(tastoTaci, INPUT);
  pinMode(ledRosso, OUTPUT);
}
#define sensoreMotore 0  
#define sensoreGas 1
  
 int temperatura;
 int temperatura1=temperatura;
 
void loop() {
  lcd.setCursor(0, 0);
  temperatura=MioSensore(analogRead(sensoreMotore));	  
  lcd.print("MOTORE ");
  fammiVedere(temperatura);
  lcd.print((char)223);
  lcd.setCursor(0, 2);
  //lcd.print("il mio nome");  
  
  //xxxxxxxxxxxxxxxxxxxxxxxxx
    tastoTaci=digitalRead(7);
if ((temperatura > 23) and (tastoTaci==LOW)and(CambiareLeCose==0)) {
    digitalWrite(ledRosso,HIGH); 
    analogWrite(buzzer, 150); 
    CambiareLeCose=1;
    delay (1000);
  }
   
else if ((temperatura > 23) and (tastoTaci==HIGH) and (CambiareLeCose==1)){
    digitalWrite(ledRosso,LOW);
    analogWrite(buzzer,LOW); 
    CambiareLeCose=1;
    delay (1000);
  } 
if (temperatura < 23) {
    digitalWrite(ledRosso, LOW);
    analogWrite(buzzer,LOW); 
    CambiareLeCose=0;
    delay (1000); 
  }
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  temperatura1=MioSensore(analogRead(sensoreGas));
  lcd.print("GAS ");
  fammiVedere(temperatura1);
  lcd.print((char)223);   
  lcd.setCursor(-4, 1); 
  
      tastoTaci=digitalRead(7);
if ((temperatura1 > 23) and (tastoTaci==LOW)and(CambiareLeCose==0)) {
    digitalWrite(ledRosso,HIGH); 
    analogWrite(buzzer, 150); 
    CambiareLeCose=1;
    delay (1000);
  }
   
else if ((temperatura1 > 23) and (tastoTaci==HIGH) and (CambiareLeCose==1)){
    digitalWrite(ledRosso,LOW);
    analogWrite(buzzer,LOW); 
    CambiareLeCose=1;
    delay (1000);
  } 
if (temperatura1 < 23) {
    digitalWrite(ledRosso, LOW);
    analogWrite(buzzer,LOW); 
    CambiareLeCose=0;
    delay (1000); 
  }
 
}

però mi pare che qui leggi un solo sensore… e l’altro come hai fatto lo sketch?
ps: includi il codice tra i tag code… trovi questo tasto di sopra: #
si legge meglio.
un’altra cosa: parli di led lampeggiante ma non capisco come lo gestisci questo lampeggio: a me sembra più una normale tacitazione + spegnimento dell’allarme fintanto che la temperatura non torna bassa.

ho modificato il post, spero si legga bene :)

camperos: ho modificato il post, spero si legga bene :)

purtroppo i due sensori interferiscono gli uni gli altri: l'accensione del led del primo sensore viene spenta (dopo il delay) dallo stato del secondo sensore e viceversa. la stessa variabile cambialecose è comune e quindi crea dei conflitti inoltre il programma è gonfio di delay che ti bloccano il programma dandoti l'impressione per 1 secondo che funzioni (ma così non è). Non riesco a darti una istruzione da cambiare: secondo me andrebbe ripensato il codice ma sicuramente ci sono tanti tanti metodi per arrivare allo stesso risultato.

su due piedi ti proporrei questo schema:

temp1 = leggitemperatura1()
temp2 = leggitemperatura2()
tasto = digitalread(pintasto) // tacitazione
stampa temp1
stampa temp2

if temp1 > 23 || temp2 > 23 
    allarme = true;

if temp1 < 23 && temp2 < 23
    allarme = false;


if allarme
     digitalwrite led, high
else
     digitalwrite led, low
     tacitazione = false


if tasto ==high 
	tacitazione = true
 


if allarme && !tacitazione
     accendi buzzer

if tacitazione 
	spegni buzzer

ho risolto :slight_smile:
mancava una condizione nei due termostati

}
if ((temperatura1 < 23) and (temperatura < 23) ) {
digitalWrite(ledRosso, LOW);
analogWrite(buzzer,LOW);
CambiareLeCose=0;
delay (1000);
}

}
if ((temperatura1 < 23) and (temperatura < 23) ) {
digitalWrite(ledRosso, LOW);
analogWrite(buzzer,LOW);
CambiareLeCose=0;
delay (1000);
}

qsecofr: su due piedi ti proporrei questo schema:

sono ancora agli inizi, ci ho provato ma ancora per me troppo complicato Grazie