Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  * Ciao, ho fatto qualche modifica al tuo codice;
  3.  *
  4.  *  - il codice è "diviso in 2", la prima parte riguarda il gas, al seconda la temperatura. Vedi tu se modificare la seconda parte
  5.  *    sulla falsa riga della prima.
  6.  *  - 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
  7.  *    ma continua a ciclare. Quando i timer scadono vengono eseguite le operazioni.
  8.  *  - ho aggiunto alcune variabili tra cui la tolleranza (tollGas) per evitare che ad ogni minima variazione (anche solo di 1)
  9.  *    venisse inviato il dato all'app.
  10.  *  - Verifica il pin del sensore DHT, ho messo il 9 perchè è il primo pin che mi è venuto in mente.
  11.  *  23/05/2019
  12.  *  - Scarica la libreria per il sensore di distanza (NewPing.h) da questo link: https://bitbucket.org/teckel12/arduino-new-ping/downloads/
  13.  *  - Aggiunto il lampeggio del led in caso di rilevazione del gas
  14.  *  - Aggiunto la lettura di distanza tramite funzione.
  15.  *    I numeri dei pin l'ho scelto casualmente.
  16.  *    Il numero dei sensori (di distanza) che vuoi usare lo definisci nel dato NUM_SONAR
  17.  *    Ho inserito 2 variabili "areaRossa" e "areaGialla" in ottica di un'implementazione della guida autonoma e per avere una comunicazione
  18.  *      tempestiva sull'app (volendo si possono inserire diversi livelli e "animare" l'avvicinamento dell'ostacolo).
  19.  *    !!! Non ho potuto provare il funzionamento con 3 sensori, ma dovrebbe esser tutto a posto
  20.  */
  21. #include <SoftwareSerial.h>
  22. #include <neotimer.h>
  23. #include "DHT.h"
  24. #include <NewPing.h>
  25.  
  26. // definizione pin
  27.  
  28. #define PIN_SENSORE A0 // pin sensore Gas
  29.  
  30. #define trigSonar1 2 // <------------------ da definire!!!
  31. #define echoSonar1 3 // <------------------ da definire!!!
  32. #define trigSonar2 4 // <------------------ da definire!!!
  33. #define echoSonar2 5 // <------------------ da definire!!!
  34. #define trigSonar3 6 // <------------------ da definire!!!
  35. #define echoSonar3 7 // <------------------ da definire!!!
  36. #define PIN_LED 8
  37. #define PIN_TERMO 9 // <------------------ da definire!!!
  38. #define BT_RX_PIN 11 // Bluetooth
  39. #define BT_TX_PIN 12 // Bluetooth
  40.  
  41. #define DHTTYPE DHT11
  42. #define NUM_SONAR 3 // <------------------ da definire!!!
  43. #define MAX_DISTANCE 200 // in cm
  44.  
  45.  
  46. SoftwareSerial bt =  SoftwareSerial(BT_RX_PIN, BT_TX_PIN);
  47. Neotimer timerFlash(200); // frequenza di lampeggio
  48. Neotimer timerGas(2000); // in millisecondi -> 2 secondi
  49. Neotimer timerTermo(2000); // in millisecondi -> 2 secondi
  50. DHT Termometro(PIN_TERMO, DHTTYPE); // Definizione termometro
  51. // definizione sensori ultrasuoni (trig pin, echo pin, distanza massima)
  52. NewPing sonar[NUM_SONAR] = {NewPing(trigSonar1, echoSonar1,MAX_DISTANCE), NewPing(trigSonar2, echoSonar2,MAX_DISTANCE),NewPing(trigSonar3, echoSonar3,MAX_DISTANCE)};
  53.  
  54. bool statoLed;
  55. bool ledON;
  56. int datoGas;
  57. int datoGasPrec;
  58. int tollGas;
  59. int limiteGas;
  60. int distanza;
  61. int areaRossa;
  62. int areaGialla;
  63. float Temperatura;
  64. String direzione;
  65.  
  66. void setup() {
  67.   //definisco modalità pin
  68.   pinMode(BT_RX_PIN, INPUT);
  69.   pinMode(BT_TX_PIN, OUTPUT);
  70.   pinMode(PIN_LED, OUTPUT);
  71.   bt.begin(9600); //inizializzo comunicazione Bluetooth
  72.   Termometro.begin();
  73.   timerGas.start();
  74.   timerTermo.start();
  75.   datoGasPrec = -1;
  76.   tollGas = 10;
  77.   limiteGas = 100;
  78.   areaRossa = 5; // <------------------ da definire!!!
  79.   areaGialla = 10; // <------------------ da definire!!!
  80. }
  81.  
  82. void loop()
  83. {
  84.   // ================== GESTIONE GAS ==================
  85.   if(timerGas.done()) // quando il timer del gas è scaduto leggo il dato dal sensore
  86.   {
  87.     datoGas = analogRead(PIN_SENSORE);
  88.     if ((datoGas >= (datoGasPrec+tollGas)) || (datoGas <= (datoGasPrec+tollGas))) //se diverso dall'ultima lettura(+ o - la tolleranza) lo invio al Bluetooth
  89.     {
  90.        if (datoGas >= limiteGas) // se maggiore o uguale del limite attivo la segnalazione
  91.        {
  92.           bt.print("ATTENZIONE GAS RILEVATO   ");
  93.           bt.println(datoGas);
  94.           timerFlash.start();
  95.           ledON = true;
  96.         }
  97.         else // altrimenti comunico solo il valore
  98.         {
  99.           bt.print("AMBIENTE SICURO   ");
  100.           bt.println(datoGas);
  101.           ledON = false;
  102.         }
  103.       datoGasPrec = datoGas; // memorizzo il valore precedente
  104.       timerGas.start(); // riattivo il timer del gas
  105.     }
  106.   }
  107.   // ================== GESTIONE LED ==================
  108.   if(ledON == true) // Se ho il comando del led a 1
  109.   {
  110.     if(timerFlash.done()) // quando scade il temporizzatore
  111.     {
  112.       digitalWrite(PIN_LED,statoLed); // imposto l'uscita del led in base alla memoria
  113.       statoLed = !statoLed; // inverto lo stato della memoria
  114.       timerFlash.start(); // riavvio il temporizzatore
  115.     }
  116.   }
  117.   else // se ho il comando del led a 0
  118.   {
  119.     digitalWrite(PIN_LED,LOW); // tengo spento il led
  120.   }
  121.  
  122.   // ================== GESTIONE TEMPERATURA ==================
  123.   if(timerTermo.done()) // quando il timer della temperatura è scaduto
  124.   {
  125.     Temperatura = Termometro.readTemperature(); // leggo la temperatura
  126.     if(isnan(Temperatura)) // se rivevo il valore "isnan" (sensore non comunica o è rotto)
  127.     {
  128.       bt.print("Sensore temperatura KO"); // segnalo la rottura del sensore
  129.     }
  130.     else
  131.     {
  132.       bt.print("Temperatura: "); // altrimenti invio la temperatura
  133.       bt.println(Temperatura);
  134.     }
  135.     timerTermo.start(); // avvio nuovamente il timer
  136.   }
  137.  
  138.   // ================== GESTIONE DISTANZA ==================
  139.   for(int i=0;i<NUM_SONAR;i++)
  140.   {
  141.     distanza = leggiDistanza(i); // richiamo la funzione per leggere la distanza
  142.     switch(i) // in base al numero di sensore compongo la stringa
  143.     {
  144.       case 0:
  145.         direzione = "SX";
  146.       break;
  147.       case 1:
  148.         direzione = "CEN";
  149.       break;
  150.       case 2:
  151.         direzione = "DX";
  152.       break;
  153.     }
  154.     if(distanza <= areaRossa) // se la distanza è minore del valore della zona rossa (stop)
  155.     {
  156.       bt.print("Oggetto in area rossa ");
  157.       bt.println(direzione);
  158.     }
  159.     if((distanza > areaRossa) && (distanza <= areaGialla)) // se la distanza è minore del valore della zona gialla (rallenta)
  160.     {
  161.       bt.print("Oggetto in area gialla ");
  162.       bt.println(direzione);
  163.     }                                       // altrimenti non comunicare niente
  164.   }
  165. }
  166.  
  167. int leggiDistanza(int numSonar)
  168. {
  169.   int dist; // definisce la variabile locale
  170.   dist = sonar[numSonar].ping_cm(); // legge il valore dal sensore
  171.   delay(50); // attendo 50 mS tra un misura e la successiva
  172.   return dist; // valore restiturio dalla funzione
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement