Go Down

Topic: 2 sensori di temperatura con un allarme e tacitazione (Read 1 time) previous topic - next topic

camperos

Jan 19, 2013, 01:52 am Last Edit: Jan 19, 2013, 12:26 pm by camperos Reason: 1
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



Code: [Select]

#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

Code: [Select]

#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);
  }

}


https://www.youtube.com/watch?v=RR-xsS2xUzc

qsecofr

#1
Jan 19, 2013, 10:54 am Last Edit: Jan 19, 2013, 10:58 am by qsecofr Reason: 1
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.

camperos

https://www.youtube.com/watch?v=RR-xsS2xUzc

qsecofr


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.

qsecofr

su due piedi ti proporrei questo schema:
Code: [Select]
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

camperos

ho risolto  :)
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);
  }
https://www.youtube.com/watch?v=RR-xsS2xUzc

camperos


su due piedi ti proporrei questo schema:




sono ancora agli inizi, ci ho provato ma ancora per me troppo complicato
Grazie
https://www.youtube.com/watch?v=RR-xsS2xUzc

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy