Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Ciao, ho fatto qualche modifica al tuo codice;
- *
- * - il codice è "diviso in 2", la prima parte riguarda il gas, al seconda la temperatura. Vedi tu se modificare la seconda parte
- * sulla falsa riga della prima.
- * - ho tolto il delay in fondo e l'ho sostituito con dei timer, in questo modo Arduino non rimane fermo anon fare nulla per 2 secondi
- * ma continua a ciclare. Quando i timer scadono vengono eseguite le operazioni.
- * - ho aggiunto alcune variabili tra cui la tolleranza (tollGas) per evitare che ad ogni minima variazione (anche solo di 1)
- * venisse inviato il dato all'app.
- * - Verifica il pin del sensore DHT, ho messo il 9 perchè è il primo pin che mi è venuto in mente.
- * 23/05/2019
- * - Scarica la libreria per il sensore di distanza (NewPing.h) da questo link: https://bitbucket.org/teckel12/arduino-new-ping/downloads/
- * - Aggiunto il lampeggio del led in caso di rilevazione del gas
- * - Aggiunto la lettura di distanza tramite funzione.
- * I numeri dei pin l'ho scelto casualmente.
- * Il numero dei sensori (di distanza) che vuoi usare lo definisci nel dato NUM_SONAR
- * Ho inserito 2 variabili "areaRossa" e "areaGialla" in ottica di un'implementazione della guida autonoma e per avere una comunicazione
- * tempestiva sull'app (volendo si possono inserire diversi livelli e "animare" l'avvicinamento dell'ostacolo).
- * !!! Non ho potuto provare il funzionamento con 3 sensori, ma dovrebbe esser tutto a posto
- */
- #include <SoftwareSerial.h>
- #include <neotimer.h>
- #include "DHT.h"
- #include <NewPing.h>
- // definizione pin
- #define PIN_SENSORE A0 // pin sensore Gas
- #define trigSonar1 2 // <------------------ da definire!!!
- #define echoSonar1 3 // <------------------ da definire!!!
- #define trigSonar2 4 // <------------------ da definire!!!
- #define echoSonar2 5 // <------------------ da definire!!!
- #define trigSonar3 6 // <------------------ da definire!!!
- #define echoSonar3 7 // <------------------ da definire!!!
- #define PIN_LED 8
- #define PIN_TERMO 9 // <------------------ da definire!!!
- #define BT_RX_PIN 11 // Bluetooth
- #define BT_TX_PIN 12 // Bluetooth
- #define DHTTYPE DHT11
- #define NUM_SONAR 3 // <------------------ da definire!!!
- #define MAX_DISTANCE 200 // in cm
- SoftwareSerial bt = SoftwareSerial(BT_RX_PIN, BT_TX_PIN);
- Neotimer timerFlash(200); // frequenza di lampeggio
- Neotimer timerGas(2000); // in millisecondi -> 2 secondi
- Neotimer timerTermo(2000); // in millisecondi -> 2 secondi
- DHT Termometro(PIN_TERMO, DHTTYPE); // Definizione termometro
- // definizione sensori ultrasuoni (trig pin, echo pin, distanza massima)
- NewPing sonar[NUM_SONAR] = {NewPing(trigSonar1, echoSonar1,MAX_DISTANCE), NewPing(trigSonar2, echoSonar2,MAX_DISTANCE),NewPing(trigSonar3, echoSonar3,MAX_DISTANCE)};
- bool statoLed;
- bool ledON;
- int datoGas;
- int datoGasPrec;
- int tollGas;
- int limiteGas;
- int distanza;
- int areaRossa;
- int areaGialla;
- float Temperatura;
- String direzione;
- void setup() {
- //definisco modalità pin
- pinMode(BT_RX_PIN, INPUT);
- pinMode(BT_TX_PIN, OUTPUT);
- pinMode(PIN_LED, OUTPUT);
- bt.begin(9600); //inizializzo comunicazione Bluetooth
- Termometro.begin();
- timerGas.start();
- timerTermo.start();
- datoGasPrec = -1;
- tollGas = 10;
- limiteGas = 100;
- areaRossa = 5; // <------------------ da definire!!!
- areaGialla = 10; // <------------------ da definire!!!
- }
- void loop()
- {
- // ================== GESTIONE GAS ==================
- if(timerGas.done()) // quando il timer del gas è scaduto leggo il dato dal sensore
- {
- datoGas = analogRead(PIN_SENSORE);
- if ((datoGas >= (datoGasPrec+tollGas)) || (datoGas <= (datoGasPrec+tollGas))) //se diverso dall'ultima lettura(+ o - la tolleranza) lo invio al Bluetooth
- {
- if (datoGas >= limiteGas) // se maggiore o uguale del limite attivo la segnalazione
- {
- bt.print("ATTENZIONE GAS RILEVATO ");
- bt.println(datoGas);
- timerFlash.start();
- ledON = true;
- }
- else // altrimenti comunico solo il valore
- {
- bt.print("AMBIENTE SICURO ");
- bt.println(datoGas);
- ledON = false;
- }
- datoGasPrec = datoGas; // memorizzo il valore precedente
- timerGas.start(); // riattivo il timer del gas
- }
- }
- // ================== GESTIONE LED ==================
- if(ledON == true) // Se ho il comando del led a 1
- {
- if(timerFlash.done()) // quando scade il temporizzatore
- {
- digitalWrite(PIN_LED,statoLed); // imposto l'uscita del led in base alla memoria
- statoLed = !statoLed; // inverto lo stato della memoria
- timerFlash.start(); // riavvio il temporizzatore
- }
- }
- else // se ho il comando del led a 0
- {
- digitalWrite(PIN_LED,LOW); // tengo spento il led
- }
- // ================== GESTIONE TEMPERATURA ==================
- if(timerTermo.done()) // quando il timer della temperatura è scaduto
- {
- Temperatura = Termometro.readTemperature(); // leggo la temperatura
- if(isnan(Temperatura)) // se rivevo il valore "isnan" (sensore non comunica o è rotto)
- {
- bt.print("Sensore temperatura KO"); // segnalo la rottura del sensore
- }
- else
- {
- bt.print("Temperatura: "); // altrimenti invio la temperatura
- bt.println(Temperatura);
- }
- timerTermo.start(); // avvio nuovamente il timer
- }
- // ================== GESTIONE DISTANZA ==================
- for(int i=0;i<NUM_SONAR;i++)
- {
- distanza = leggiDistanza(i); // richiamo la funzione per leggere la distanza
- switch(i) // in base al numero di sensore compongo la stringa
- {
- case 0:
- direzione = "SX";
- break;
- case 1:
- direzione = "CEN";
- break;
- case 2:
- direzione = "DX";
- break;
- }
- if(distanza <= areaRossa) // se la distanza è minore del valore della zona rossa (stop)
- {
- bt.print("Oggetto in area rossa ");
- bt.println(direzione);
- }
- if((distanza > areaRossa) && (distanza <= areaGialla)) // se la distanza è minore del valore della zona gialla (rallenta)
- {
- bt.print("Oggetto in area gialla ");
- bt.println(direzione);
- } // altrimenti non comunicare niente
- }
- }
- int leggiDistanza(int numSonar)
- {
- int dist; // definisce la variabile locale
- dist = sonar[numSonar].ping_cm(); // legge il valore dal sensore
- delay(50); // attendo 50 mS tra un misura e la successiva
- return dist; // valore restiturio dalla funzione
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement