MONITORAGGIO AREE PROTETTE del GFA con BLUETOOTH
Il seguente " monitoraggio e controllo " è puramente didattico e ... fantasioso( ma realizzabile)
La scelta del " Giardino di flora appenninica di Capracotta" è stata di puro campanilismo.
Si utilizzerà l'uso di un sistema bluetooth da smartphone e tablet Android.
Sfruttando le potenzialità dei vari ESP32 collegati singolarmente a sensori di varia natura : :
Quando si vuole realizzare un progetto è indispensabile definire quali GPIO devono essere utilizzati.
Metodo personale di programmazione:
Non utilizzo GPIO relativi per future applicazioni es. LCD, SD,GPS,ecc.
Es.: Lista di Occupazione personale(Reminescenza di programmazione P.L.C. Lab. Automazione I.T.I.S.)
Per limitare al minimo il consumo di energia elettrica posso sfruttare alcune peculiarità dell'ESP32, es:
e monitorare le aree sottoposte a sorveglianza, rispettando la "privacy" della flora e della fauna.
Ogni singolo ESP32 è preposto alla sorveglianza di un'area ben definita.
Variante di controllo e programmi desunti dai link:
Circolo Didattico Capracotta: Monitoraggio dei parametri naturali ed ambientali di uno stagno.
MONITORAGGIO e CONTROLLO delle AREE PROTETTE (es.. Giardino della Flora Appenninica di Capracotta)
Monitoraggio,didattico, di un bacino naturale di contenimento per la raccolta delle acque piovane al fine di ridurre i fenomeni torrenziali distruttivi.
1° TEST con relativa procedura di :
Rilevamento:
N.B. I Sensori alimentati dal modulo ESP32 .... devono essere del tipo a 3.3 Vcc.
N.B. I Sensori alimentati dal modulo ESP32 devono essere del tipo a 3.3 Vcc.
Il modulo sensore ad ultrasuoni HC-SR04-P : il campo di alimentazione è compreso tra 3.3v e 5v a differenza dell' HC-SR04 che è alimentato solo da 5v.
Collegamenti Trasmittente ESP32- Sensore ad ultrasuoni HC-SR04 P:
GPIO 12 dell'ESP32 (Verde) al pin TRIG
GPIO 14 dell'ESP32 (Blu) al pin ECHO
Il modulo sensore di umidità e temperatura DHT11 : il campo di alimentazione è compreso tra 3.3v e 5v
Out ==> GPIO 27 dell'ESP32
Supporto del trasmettitore stampato con l'ANYCUBIC Mega S
La trasmissione DATI con i moduli BLUETOOTH è contenuta nel raggio di azione max di 10 m(senza ostacoli).
Fatta l'installazione ci prepariamo il programma per l'ESP32.
Trasmissione dati punto a punto.
1° Test di simulazione su ESP32 - Temperatura e Umidità ambientale su Monitor P.C.:
// Test di simulazione facsimile Arduino
// Esercitazione con Tablet Android 14 4 2024
// File:BLUETOOTH_DHT11_ESP32_11_4_2024
// IDE:Arduino 1.8.14
// SCHEDA:ESP32-WROOM DA-Module
#include "BluetoothSerial.h"
BluetoothSerial Stagno;
#include "DHT.h"
//Uso del PIN 27 dell’ ESP32
#define DHTPIN 27
#define DHTTYPE DHT11
//creatae una instanza del sensore DHT11
DHT dht(DHTPIN, DHTTYPE);
int cont = 1;
void setup()
{
Serial.begin(115200);
delay(500);
Serial.println("DHT11 sensor!");
//Abilito la lettura dal sensore
dht.begin();
Stagno.begin("ESP32-Stagno");
//N.B. Sul tab comparirà
ESP32-Stagno da accoppiare
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Lettura fallita dal sensore!!!!");
return;
}
// Stampo il risultato sul Monitor P.C.
String msg ="Gradi: " + String(t) + " Umidità: " + String( h) + "%"
+ " Cont. :" + String(cont);
Serial.println(msg);
Stagno.println(msg);
delay(1000);
cont++
}
Questo è il risultato sul Monitor:
ACCOPPIAMENTO DEI DISPOSITIVI BLUETOOTH:
In questa fase l'ESP32 deve essere alimentato.
TABLET ANDROID PERSONALE:
ATTIVARE IL BLUETOOTH
leggero touch prolungato su: Bluetooth
touch su: + Accoppia nuovo dispositivo
touch su: ESP32-Stagno
touch su: ACCOPPIA
Risultato: Presenza del dispositivo ESP32-Stagno
Prossimo passaggio:
touch su: Serial Bluetooth Terminal
touch su: le tre lineette orizzontali lato SX
touch su: Devices
Elenco dei Devices
touch su: ESP32-Stagno e si attiva
ulteriore touch su: ESP32-Stagno e.....
Questo è il risultato
2° Test di simulazione su ESP32 con il modulo sensore ad ultrasuoni HC-SR04-P
//
Esercitazione con Tablet Android 14 4 2024
// File:BLUETOOTH_ESP32_HC_SR04_BLUETOOTH_14_4_2024
// IDE:Arduino 1.8.14
// SCHEDA:ESP32-WROOM DA-Module
#include "BluetoothSerial.h"
BluetoothSerial Stagno;
#define TRIG_PIN 12 // ESP32 pin GPIO 12
#define ECHO_PIN 14 // ESP32 pin GPIO 14
int cont = 1;
float durata_us, distanza_cm;
void setup() {
Serial.begin (115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Stagno.begin("GFA-Stagno");
// GFA-Stagno da ACCOPPIARE su TAB
}
void loop() {
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
durata_us = pulseIn(ECHO_PIN, HIGH);
// calcolo della distanza
distanza_cm = 0.017 * durata_us;
// Stampa sul serial Monitor
//Serial.print("distanza: ");
//Serial.print(distanza_cm);
//Serial.println(" cm");
String msg ="Distanza cm.: " + String(distanza_cm)
+ " Cont. :" +
String(cont); ;
Stagno.println(msg);
delay(500);
cont++;
}
Questo è il risultato sul tab dopo l'accoppiamento:
Test COMPLETO :
// Esercitazione con Tablet Android
18 4 2024
// File:BLUETOOTH_DHT11_ HC-SR04-P ESP32_18_4_2024
// IDE:Arduino 1.8.14
// SCHEDA:ESP32-WROOM DA-Module
//******* BLUETOOTH **************
#include "BluetoothSerial.h"
BluetoothSerial Stagno;
//********************************
//******* DHT **************
#include "DHT.h"
//Uso del GPIO 27 dell’ ESP32
#define DHTPIN 27
#define DHTTYPE DHT11
//creata una instanza del sensore DHT11
DHT dht(DHTPIN, DHTTYPE);
//********************************
//***** HC-SR04-P 3.3 Volt *********
#define TRIG_PIN 12 // ESP32 pin GPIO 12
#define ECHO_PIN 14 // ESP32 pin GPIO 14
float durata_us;
float distanza_cm;
//********************************
//***** Contatore *********
int cont = 1;
//*************************
void setup()
{
Serial.begin(115200);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
Serial.println("DHT11 sensor!");
//******************************
//Abilito la lettura dal sensore
dht.begin();
//********************************
// ****** Definizione del Begin *********
Stagno.begin("GFA-Stagno");
//N.B. Sul tab comparirà ESP32-Stagno da accoppiare
//********************************
}
void loop() {
// ******* PARAMETRI DHT11 **********
float h = dht.readHumidity();
float t = dht.readTemperature();
// ****** Verifico se è attiva la lettura *********
//if (isnan(h) || isnan(t)) {
//Serial.println("Lettura fallita dal sensore!!!!");
//return;
// ******* PROCEDURA PER L'HC-SR04-P **********
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
durata_us = pulseIn(ECHO_PIN, HIGH);
delay(100);
// calcolo della distanza
distanza_cm = 0.017 * durata_us;
//**** TERMINE PROCEDURA CALCOLO HC-SR04-P **********
// **** DEFINIZIONE DELLE STRINGHE DA INVIARE ****************
String msg ="Gradi: " + String(t) + " Umidità: " + String( h) + "%" ;
String msg1 ="Distanza cm.: " + String(distanza_cm) + " Cont. :" + String(cont);
String msg2 ="
" ;
Serial.println(msg);
Serial.println(msg1);
Serial.println(msg2);
// ******* INVIO DATI AL TABLET **********
Stagno.println(msg);
Stagno.println(msg1);
Stagno.println(msg2);
delay(1000);
cont++;
}
QUESTO E' IL RISULTATO FINALE
Test di simulazione con ESP32 e rilevatore di distanza laser.
Massima distanza rilevabile con il LIDAR 12 metri.
Rilevare la distanza dal pelo superficiale dell'acqua.
Distanza max (dist + prof) = 8 metri
// File:BLUETOOTH_LIDAR_ESP32_28_4_2024
// IDE:Arduino 1.8.14
// SCHEDA:ESP32-WROOM DA-Module
// con oled 164x48
// ***** LIBRERIA E DEFINIZIONE BLUETOOTH ******
#include "BluetoothSerial.h"
BluetoothSerial Stagno;
// ************************************
// ***** COLLEGAMENTI GPIO LIDAR ******
#define RXD2 16 // VERDE del LIDAR al GPIO 16 DELL'esp32
#define TXD2 17 // BIANCO del LIDAR al GPIO 17 dell'ESP32
// ************************************
int dist; /*—actual distance measurements of LiDAR—*/
int strength; /*—signal strength of LiDAR */
float temprature;
unsigned char check; /*—save check value */
int i;
unsigned char uart[9]; /*—save data measured by LiDAR */
const int HEADER=0x59; /*—frame header of data package */
int rec_debug_state = 0x01;//receive state for frame
//***** Contatore *********
int cont = 1;
//*************************
void setup() {
delay(2000);
Serial.begin(115200);
Serial.println("\nBenewake TFmini-PLUS UART LiDAR Program");
Serial2.begin(115200);
// ****** Definizione del Begin STAGNO *********
Stagno.begin("GFA-Stagno");
//N.B. Sul tab comparirà GFA-Stagno da accoppiare
//********************************
}
void loop() {
Get_Lidar_data();
String msg ="Distanza cm.: " + String(dist) + " Cont. :" + String(cont);
String msg2 =" " ;
// ****INVIO MESSAGGI TRAMITE BLUETOOTH ***********
Stagno.println(msg);
Stagno.println(msg2);
//************************************
delay(100);
cont++;
}
// ****DEFINIZIONE PROCEDURA LETTURA LIDAR ***********
void Get_Lidar_data(){
if (Serial2.available()) //check if serial port has data input
{
if(rec_debug_state == 0x01)
{ //the first byte
uart[0]=Serial2.read();
if(uart[0] == 0x59)
{
check = uart[0];
rec_debug_state = 0x02;
}
}
else if(rec_debug_state == 0x02)
{//the second byte
uart[1]=Serial2.read();
if(uart[1] == 0x59)
{
check += uart[1];
rec_debug_state = 0x03;
}
else{
rec_debug_state = 0x01;
}
}
else if(rec_debug_state == 0x03)
{
uart[2]=Serial2.read();
check += uart[2];
rec_debug_state = 0x04;
}
else if(rec_debug_state == 0x04)
{
uart[3]=Serial2.read();
check += uart[3];
rec_debug_state = 0x05;
}
else if(rec_debug_state == 0x05)
{
uart[4]=Serial2.read();
check += uart[4];
rec_debug_state = 0x06;
}
else if(rec_debug_state == 0x06)
{
uart[5]=Serial2.read();
check += uart[5];
rec_debug_state = 0x07;
}
//Benewake
else if(rec_debug_state == 0x07)
{
uart[6]=Serial2.read();
check += uart[6];
rec_debug_state = 0x08;
}
else if(rec_debug_state == 0x08)
{
uart[7]=Serial2.read();
check += uart[7];
rec_debug_state = 0x09;
}
else if(rec_debug_state == 0x09)
{
uart[8]=Serial2.read();
if(uart[8] == check)
{
dist = uart[2] + uart[3]*256;//the distance
strength = uart[4] + uart[5]*256;//the strength
temprature = uart[6] + uart[7] *256;//calculate chip temprature
temprature = temprature/8 - 256;
Serial.print("dist = ");
Serial.print(dist); //output measure distance value of LiDAR
Serial.print('\n');
//Benewake
Serial.print("strength = ");
Serial.print(strength); //output signal strength value
Serial.print('\n');
Serial.print("\t Chip Temprature = ");
Serial.print(temprature);
Serial.println(" celcius degree"); //output chip temperature of Lidar
while(Serial2.available()){Serial2.read();}
}
rec_debug_state = 0x01;
}
}
}
RISULTATO FINALE su SMARTPHONE:
TEST con SLEEP da TIMER e uso del Bluetooth:
Collegamenti Trasmittente ESP32- Sensore ad ultrasuoni HC-SR04 P:
GPIO 12 dell'ESP32 (Verde) al pin TRIG
GPIO 14 dell'ESP32 (Blu) al pin ECHO
GPIO 27 dell'ESP32 al LED di segnalazione trasmissione (acceso in trasmissione)
N.B. Il void loop() {} nella fase di SLEEP non è contemplato
Tutte le istruzione del programma devono essere presenti nel :
void setup() {
.........
while((millis() <30000))
{
Corpo principale di calcolo
}
Ecco un esempio per :
la trasmissione dati Bluetooth e Sleeping
// IDE:Arduino 1.8.14
// SCHEDA:ESP32-WROOM DA-Module
//FILE:TEST__BLUETOOTH__E_SHRC_SLEEP_ESP32_23_4_2024
const uint32_t SLEEP_DURATA = 40 *1000000;//40 SECONDI DORME
//******* BLUETOOTH **************
#include "BluetoothSerial.h"
BluetoothSerial Stagno;
//********************************
//***** HC-SR04-P 3.3 Volt *********
#define TRIG_PIN 12 // ESP32 pin GPIO 12
#define ECHO_PIN 14 // ESP32 pin GPIO 14
float durata_us;
float distanza_cm;
//********************************
//***** Contatore *********
int cont = 1;
//*************************
void setup() {
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// ****** Definizione del Begin STAGNO *********
Stagno.begin("GFA-Stagno");
//N.B. Sul tab comparirà ESP32-Stagno da accoppiare
//********************************
pinMode(27,OUTPUT);
delay(100);
digitalWrite(27,1);
Serial.begin(115200);
//Serial.println( "light sleep");
delay(1000);
while((millis() <30000))
{
// ******* PROCEDURA PER L'HC-SR04-P **********
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
durata_us = pulseIn(ECHO_PIN, HIGH);
delay(100);
// calcolo della distanza
distanza_cm = 0.017 * durata_us;
//**** TERMINE PROCEDURA CALCOLO HC-SR04-P **********
String msg1 ="Distanza cm.: " + String(distanza_cm) + " Cont. :" + String(cont);
Serial.println(msg1);
cont++;
Serial.println("SONO SVEGLIO");
Stagno.println(msg1);
delay(5);
}
Serial.println( "VADO IN LETARGO");
delay(100);
esp_sleep_enable_timer_wakeup(SLEEP_DURATA);
esp_deep_sleep_start();
Serial.println("Wakeup");
}
void loop() {}
Questo è il risultato:
Consumi durante la Trasmissione e Sleeping:
Le FASI operative dell'ESP32 sono definite dalle due righe del programma:
Corrisponde a 40 secondi di ibernazione dell' ESP32
........................
Corrisponde a 30 secondi di attività operativa dell' ESP32
L'ibernazione può essere molto dilatata nel tempo (anche ore e giornate)
Se ho la necessità di interrogare il "sistema" posso intervenire al "risveglio" utilizzando dei componenti esterni:
Durante questa modalità di SLEEPING (DEEP SLEEP MODE) solo alcuni pin GPIO sono utilizzabili .
CONTINUA.....