CivicHacking per il monitoraggio canali con Arduino e Telegram
Alcuni amici “Gruppo Volontari per l’ambiente – Matera” che si occupano anche della protezione civile, mi hanno chiesto di sviluppare un prototipo per monitorare l’altezza dell’acqua di un canale. Hanno vinto un bando per progetti di comunità della Fondazione Matera-Basilicata2019 ricevendo un piccolo importo per la realizzazione del progetto.
Quando questo canale sale di tot cm (o metri) a valle spessissimo avvengono dei fenomeni sgradevoli che possono mettere a rischio la sicurezza pubblica.
L’idea è semplice ma allo stesso tempo il prodotto deve essere affidabile.

Ovviamente lo scopo è didattico e statistico. Non certo si sostituisce ai normali sistemi di monitoraggio ufficiale che gli enti preposti posseggono.
- La centralina deve essere connessa ad internet per inviare ogni ora i dati dell’altezza del corso d’acqua del canale
- La centralina, nel caso di innalzamento sotto alcune soglie, deve inviare messaggi ad un gruppo di monitoraggio che eventualmente si attiva per vedere il monitoraggio fisico delle conseguenze
- La centralina non può avere WiFi o energia elettrica dato che sarà installata in aperta campagna e fuori dal centro abitato
- La centralina deve essere economica
- La centralina deve avere un sensore per l’altezza dell’acqua da 1 a 4 mt di escursione
- La centralina deve avere il minimo costo di gestione e il minimo costo di manutenzione nel tempo.
Sembra un problema di maturità 🙂 .
Definiamo il punto 4) → max 250 euro
Ho pensato ad un sistema Arduino based, connesso tramite le rete GSM e con una SIM da 6 euro al mese solo dati, che invia i risultati di un sensore alla piattaforma ThingSpeak (o ad una propria ma saliamo di costi).
Infine la libreria dell’Arduino include Telegram e l’invio dei dati di allarme vengono inviati ad un gruppo riservato in cui ci sono i volontari.
Per l’autonomia energetica un piccolo pannello solare, con una batteria da 12V da 7Ah (in assenza di irraggiamento solare subentra la batteria) e un caricatore con convertitore a 5V .
Elenco della spesa
- MKR GSM 1400 : https://store.arduino.cc/mkr-gsm-1400 circa 80 euro in Italia con Antenna (non dimenticatevela)
- Kit Solare (Pannello, caricatore e batteria): https://www.ebay.it/itm/Kit-solare-fotovoltaico-pannello-30W-12V-con-batteria-18Ah-cavi-2-5mmq-PVC/253657202490?hash=item3b0f25bf3a:g:MssAAOSwC19bDkYC circa 70 euro
- Cavi vari (sia da 2.5 mm sezione per pannello e batteria, sia cavetteria Arduino)
- Sensore JSN-SR04T ad ultrasuoni. Non ho pensato a sensori con galleggianti altrimenti la manutenzione sarebbe stata molto frequente. cosi non ho alcun contatto e la misurazione arriva da 25cm a 4,5mt: https://www.amazon.com/Waterproof-Ultrasonic-Distance-Measuring-Transducer/dp/B01J5KZU8M/ref=as_li_ss_tl?ie=UTF8&qid=1549537345&sr=8-4&keywords=jsn-sr04t&linkCode=sl1&tag=makerguides-20&linkId=9898a62e4fccc22dd0e96ee5a45a5bcc&language=en_US ma si trovano anche in italia a poco. circa 15 euro. La scheda tecnica descrive temperature e tensioni di esercizio.
- Scatola stagna in cui mettere Batteria da 7Ah, regolatore carica, MKR GSM e parte elettronica del sensore JSN. circa 40 euro
- Palo per il pannello e bulloni vari: circa 50 euro
Totale circa 250 euro . Ci siamo 🙂
I collegamenti sono identici a questo schema per ArduinoUno (sostituendolo ovviamente con il MKR GSM):
il sensore ad ultrasuoni lo colleghiamo ai pin 2 (Trig) e 3 (Echo) di Arduino:
All’alimentazione USB dell’Arduino va collegato il cavetto che entra nel regolatore di carica:
che a sua volta è collegato al pannello solare e alla batteria:
Ho trovato in rete un’immagine che potrebbe rendere l’idea su come installare il sensore e centralina:
Il costo di gestione quindi sarà di 6 euro al mese per la sim dati a ogni 3 anni circa la sostituzione della batteria da 12v 7Ah (sovradimensionata lo so ma il sistema deve essere affidabile). Altre 20 euro insomma.
Ora andiamo su ThingSpeak.com e creaiamo un account. Poi creiamo un “Canale” inserendo come unico campo “Distanza” in Field1 e rendiamo (sezione sharing) il canale visibile a tutti:
Ora andate in “Chiavi API” e copiatevi la WriteKey in un posto sicuro (*)
Passiamo a Telegram.
- cercate @botfather e fate /newbot
- Create un Bot con Nome e username
- Vi verrà assegnato un TOKEN. Copiatevelo in un posto sicuro (**)
- Aprite su Telegram un Gruppo
- Inserite come “utente” e poi trasformatelo in “Amministratore” il vostro Bot del punto 2). Lo trovate tra i contatti digitando il nome utente (es. nomebot)
- Inserite come utente e poi come amministratore il bot @useridbot
- Digitale nel gruppo: @useridbot
- Vi risponderà con un messaggio in cui c’è il vostro userid (non username ma id cioè è un numero univoco che vi rappresenta su Telegram) e con un numero che inizia con il segno – (meno) che identifica il vostro gruppo privato. Copiatevelo in un posto sicuro (***)
Bene siamo pronti con lo Sketck da inserire nel vostro Arduino. Aprite Arduino IDE, selezionate come Board MKR GSM 1400 e poi selezionate la porta USB a cui è collegata:
Importatevi la libreria Telegram :
Io ho usato questa.
Vediamo ora lo Sketch. Modificate i valori delle righe con commenti in GRASSETTO (pin SIM, APN SIM, WriteKey di ThingSpeak, Id gruppo Telegram, Token Telegram)
#include <TelegramKeyboard.h>
#include <TelegramBot.h>
#include <Arduino.h>
#include “wiring_private.h”
#include <ArduinoLowPower.h>
#include <MKRGSM.h>
#define echoPin 3 // Echo Pin
#define trigPin 2 // Trigger Pin
long duration, distance; // Duration used to calculate distance
const char PINNUMBER[] = “1111”; // INSERIRE IL PIN DELLA SIM DATI
// APN data
const char GPRS_APN[] = “web.XXXX.it”; // INSERIRE APN DEL PROPRIO GESTORE SIM DATI
const char GPRS_LOGIN[] = “”;
const char GPRS_PASSWORD[] = “”;
String writeAPIKey = “XXXXXXXX”; // write API key for your ThingSpeak Channel. Punto (*)
const char* server = “api.thingspeak.com”;
String chatid=”-11111111111″; // gruppo Telegram AllarmiSensori. Punto (***)
int minuti=1;
// initialize the library instance
GSMClient client;
GPRS gprs;
GSM gsmAccess;
// Initialize Telegram BOT
const char BotToken[] = “XYXYXYXYXYXYXXY”; Inserire TOKEN . Punto (**)
GSMSSLClient clients;
TelegramBot bot (BotToken, clients);
String message;
int contatore;
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.println(“Starting Arduino web client.”);
// connection state
bool connected = false;
// After starting the modem with GSM.begin()
// attach the shield to the GPRS network with the APN, login and password
while (!connected) {
if ((gsmAccess.begin(PINNUMBER) == GSM_READY) &&
(gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY)) {
connected = true;
} else {
Serial.println(“Not connected”);
delay(1000);
}
}
Serial.println(“connecting…”);
}
void distancecm (){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
//Calculate the distance (in cm) based on the speed of sound.
distance = duration/58.2;
}
void loop()
{
String text;
String text2;
distancecm();
if (distance == 0) distancecm();
Serial.print(“Distanza “);
Serial.print(distance);
Serial.println();
if (distance >=300) {
minuti=60;
Serial.println(“Frequenza a 60 minuti”);
text=”Controllo: “;
}else if (distance >=200) {
minuti=15;
Serial.println(“Frequenza a 15 minuti”);
text=”Controllo medio: “;
}else {
minuti=1;
text=”Alert! “;
}
String url=”GET /update?api_key=”+writeAPIKey+”&field1=”+String(distance)+” HTTP/1.1\r\nHost: 184.106.153.149\r\nConnection: close\r\n\r\n”;
if (client.connect(server, 80)) {
Serial.println(“Connesso…”);
Serial.println(url);
client.println(url);
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
String line = client.readStringUntil(‘\r’);
Serial.print(line);
}
delay(5000);
}
else {
//Se fallisce la connessione
Serial.println(“Connection failed”);
Serial.println(“Disconnecting.”);
client.stop();
}
text2=text+String(distance)+” cm per il Sensore1″;
bot.sendMessage(chatid, text2); // invia il messaggio nel gruppo Telegram
delay(60000*minuti); //
Serial.println(“resetting”);
setup(); // faccio ripartire tutto cosi si ristabilisce la connessione GSM.
}
**ATTENZIONE** WordPress trasforma le “(virgolette dritte) in ” obblique. se copiate il codice poi fate una sostituzione altrimenti avrete molti errori di compilazione. Inoltre ricordatevi che la libreria Telegram vuole ArduinoJson versione 5 per qui se ricevete errore nelle compilazione, andate nelle librerie di Arduino IDE e riscaricate una versione precedente.
Se funziona tutto avrete su ThingSpeak ogni ora la rilevazione.
Su Telegram verranno inviati allarmi: normalmente ogni ora controllo funzionamento base, In caso di superamento di 200cm ogni 15 minuti, sopra i 200cm invece ogni minuto (massima allerta).
Potete integrare (embeddare) questo grafico sul vostro sito o vederlo online. ogni canale di ThingSpeak ha un proprio url diretto pubblico (lo avete reso voi pubblico dalla sezione Sharing . se volete renderlo solo privato allora non fate il punto di sopra su questo argomento).
Mentre nel gruppo Telegram:
Buon civichacking 🙂
Piersoft
Lic. CC-BY-SA