Pages: [1]   Go Down
Author Topic: 2 sensori di temperatura con un allarme e tacitazione  (Read 1559 times)
0 Members and 1 Guest are viewing this topic.
milano
Offline Offline
Sr. Member
****
Karma: 3
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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


« Last Edit: January 19, 2013, 06:26:11 am by camperos » Logged


Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
« Last Edit: January 19, 2013, 04:58:16 am by qsecofr » Logged

milano
Offline Offline
Sr. Member
****
Karma: 3
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho modificato il post, spero si legga bene  smiley
Logged


Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho modificato il post, spero si legga bene  smiley

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.
Logged

Offline Offline
Sr. Member
****
Karma: 8
Posts: 293
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

milano
Offline Offline
Sr. Member
****
Karma: 3
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho risolto  smiley
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);
  }
Logged


milano
Offline Offline
Sr. Member
****
Karma: 3
Posts: 258
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

su due piedi ti proporrei questo schema:
 


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


Pages: [1]   Go Up
Jump to: