Problema sensore antincendio

Salve a tutti, sto facendo un progetto per la scuola e sono alle prime armi (se così mi posso definire) con la programmazione su Arduino. Per andare subito al sodo il mio problema sta nel fatto che, utilizzo uno schermo LCD 16x2 e nella scheda arduino oltre allo schermo ho montato un sensore di temperatura e umidità DHT-11, un sensore di temperatura LM-35 e un sensore antincendio. Il mio obiettivo è quello di visualizzare temperatura e umidità dal sensore DHT-11, la temperatura dal sensore LM-35 e contemporaneamente se il sensore antincendio rileva una fiamma di far apparire sullo schermo una scritta di allarme! Tutto ciò mi riesce, visualizzo per prima la temperatura e l’umidità con il sensore DHT-11, dopo 5 secondi visualizzo quella con LM-35 e poi ricomincia tutto da capo, non capisco però perchè quando avvicino la fiamma al sensore prima di far comparire la scritta allarme sul display e prima di accendere un led rosso e di fa suonare un buzzer debba aspettare che sullo schermo venga visualizzato il secondo messaggio (quello del sensore LM-35) e dopo parte il ciclo del sensore antincendio, vorrei risolvere questo problema facendo in modo che in qualsiasi momento io avvicini la fiamma al sensore questo faccia partire il ciclo del segnale di allarme. vi allego il codice che ho ricontrollato spesso ma essendo alle prime armi può essere che ci sia qualche errore, forse madornale e che mi sta facendo impazzire ahah.
Grazie mille in anticipo per l’aiuto!

const int sensorpin = 6; 
const int ledpin = 9; 
const int buzzerpin = 10; 
int statosensore = 0; // variabile di memorizzazione dello stato del sensore
#include <DHT.h>

#include <LiquidCrystal.h>
#include "DHT.h"
#define DHTPIN 8
// 8 è il pin di Arduino a cui collego il sensore di temperatura
#define DHTTYPE DHT11 // dht11 è il tipo di sensore che uso
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // connessione display (pin)

#define potPin  A0

void setup() {
  pinMode(sensorpin, INPUT);
  pinMode(ledpin, OUTPUT);
  pinMode(buzzerpin, OUTPUT);
  

}
void loop()
   
{
   
 
    int aRead = 0;
    aRead = analogRead(potPin);
    int tempC = aRead * 0.48875;

 int t = dht.readTemperature();
    int h = dht.readHumidity();
  statosensore = digitalRead(sensorpin);
    if (statosensore == HIGH) // se e’ presente una fiamma
 {
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Temperatura:");
    lcd.setCursor(0, 1);
    lcd.print("Umidita':");
    lcd.setCursor(12, 0);
    lcd.print(t);
    lcd.write(0xDF);
    lcd.print("C");
    lcd.setCursor(12, 1);
    lcd.print(h);
    lcd.print("%");

    delay(5000);


    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Temperatura");
    lcd.setCursor(0, 1);
    lcd.print("interna:    ");
    lcd.print(tempC);
    lcd.write(0xDF);
    lcd.print("C");


    delay(5000);
 }
  statosensore = digitalRead(sensorpin);
 if(statosensore == LOW)

   
    {
     digitalWrite(ledpin, HIGH); // attiva l’allarme
    digitalWrite(buzzerpin, HIGH);
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Allarme!");
    delay (300); // attende 3/10 di secondo
   
   
    digitalWrite(ledpin, LOW); // spegne l’allarme
    digitalWrite(buzzerpin, LOW);
    delay (300); // attende 3/10 di secondo e verifica nuovamente lo stato del sensore
   }


}

Buongiorno e benvenuto sul forum, essendo il tuo primo post, nel rispetto del regolamento, ti chiedo cortesemente di presentarti QUI ([u]spiegando bene quali conoscenze hai di elettronica e di programmazione[/u] ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie.

Guglielmo

P.S.: Qui una serie di link utili, [u]NON[/u] necessariamente inerenti alla tua domanda: - serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - pinout delle varie schede by xxxPighi: Pinout - link [u]generali[/u] utili: Link Utili

.... dopo di che ... hai descritto la configurazione, ma ... QUALE è il problema ? ? ? :o

Guglielmo

Grazie, adesso vado subito a presentarmi, scusatemi per prima ma mi era partito l’invio e non avevo terminato il messaggio :slight_smile:

const int sensorpin = 6; 
const int ledpin = 9; 
const int buzzerpin = 10; 
int statosensore = 0; // variabile di memorizzazione dello stato del sensore
#include <DHT.h>

#include <LiquidCrystal.h>
#include "DHT.h"
#define DHTPIN 8
// 8 è il pin di Arduino a cui collego il sensore di temperatura
#define DHTTYPE DHT11 // dht11 è il tipo di sensore che uso
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // connessione display (pin)

#define potPin  A0

void setup() {
  pinMode(sensorpin, INPUT);
  pinMode(ledpin, OUTPUT);
  pinMode(buzzerpin, OUTPUT);
  

}
void loop()
   
{
   
 
    int aRead = 0;
    aRead = analogRead(potPin);
    int tempC = aRead * 0.48875;

 int t = dht.readTemperature();
    int h = dht.readHumidity();
  statosensore = digitalRead(sensorpin);
    if (statosensore == HIGH) 
 {
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Temperatura:");
    lcd.setCursor(0, 1);
    lcd.print("Umidita':");
    lcd.setCursor(12, 0);
    lcd.print(t);
    lcd.write(0xDF);
    lcd.print("C");
    lcd.setCursor(12, 1);
    lcd.print(h);
    lcd.print("%");

    delay(5000);


    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Temperatura");
    lcd.setCursor(0, 1);
    lcd.print("interna:    ");
    lcd.print(tempC);
    lcd.write(0xDF);
    lcd.print("C");


    delay(5000);
 }
  statosensore = digitalRead(sensorpin);
 if(statosensore == LOW)

   
    {
     digitalWrite(ledpin, HIGH); // attiva l’allarme
    digitalWrite(buzzerpin, HIGH);
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Allarme!");
    delay (300); // attende 3/10 di secondo
   
   
    digitalWrite(ledpin, LOW); // spegne l’allarme
    digitalWrite(buzzerpin, LOW);
    delay (300); // attende 3/10 di secondo e verifica nuovamente lo stato del sensore
   }


}

Il problema sta in tutti quei delay che metti. Quando arduino si imbatte in un delay, sospende tutto quello che fa per tot tempo. Non fa altro. Quindi tutto quel ritardo che hai prima che ti compaia l'allarme sull'lcd è dovuto al fatto che arduino prima di completare il loop ci sta un bel po di secondi (somma di tutti i delay). Utilizza millis cosi avrai una sorta di ''multitasking'' anche se in realtà cosi non è, ma arduino è cosi veloce che ci riesce ad ingannare..d'altronde, fa sempre 16milioni circa di operazioni al secondo :D

Grazie mille, ho risolto il problema alla perfezione! Non ci sarei mai arrivato da solo a questa conclusione ma sicuramente è dovuto al fatto che ancora stia muovendo i primi passi in questo mondo! Grazie mille davvero, hai risolto un problema che mi assaliva da giorni ahah