Il Capacitive soil moisture sensor wemos lipo shield telegram bot unisce alcuni degli articoli che hai letto negli ultimi mesi.
Il progetto che sto preparando e di cui leggerai nei prossimi giorni necessita di questa parte di conoscenze ossia la lettura dei dati di un sensore direttamente via Telegram Bot.
Nei molti esempi di sketch che ho trovato on-line avrai letto di come inviare dei comandi via Telegram alla tua ESP8266, l’ho fatto anche io in questo articolo.
Il motivo è che quando testi per la prima volta un progetto con WeMos D1 e Telegram, o Arduino e Telegram, l’esempio classico ti invita a provare la semplice accensione del led “on-board” della scheda.
Un progetto che usi Telegram per la comunicazione spesso necessita sia della parte di controllo del dispositivo sia di quella di check e raccolta informazioni da parte del progetto.
L’articolo che ti mostro oggi parla propio di questo aspetto: leggere una informazione da un sensore capacitivo e trasferire questa informazione al nostro TelegramBot.
La domanda che potresti porti è “ogni quanto tempo riceverò questa informazione?”
Faremo in modo che l’informazione sia resa disponibile su richiesta.
Sarai tu a chiedere al capacitive soil moisture sensor wemos lipo shield telegram bot quale sia il valore di umidità del terreno. Ricevendone risposta immediata.
Cosa ti serve per il progetto
Per la realizzazione del progetto hai bisogno di:
- WeMos D1 mini ( ESP8266 )
- Capacitive soil moisture sensor ( https://amzn.to/3h8I5po )
- Wemos proto shield
- Drv8833 motor driver ( https://amzn.to/3z1vUAV )
Ti mostro una foto dei componenti pre-assemblati:
Per il progetto finale dovremo aggiungere anche altri componenti che ti indico per completezza qualora volessi acquistarli tutti insieme:
- Wemos Lipo battery shield ( https://amzn.to/3zSGI5w )
- Pompa peristaltica ( https://amzn.to/3zV6pCu )
- Lipo Battery 1000mAh ( https://amzn.to/3twc1AM )
- 3D case per pompa peristaltica ( lo troverai in un prossimo articolo )
- 3D case per elettronica e batteria ( lo troverai in un prossimo articolo )
Gli ultimi dei componenti li potrai stampare in 3D e sono studiati con Fusion 360 per questo progetto.
Sketch capacitive soil moisture sensor wemos lipo shield telegram bot
Lo sketch del progetto capacitive soil moisture sensor wemos lipo shield telegram bot parte dallo sketch che hai già letto nell’articolo Telegram Bot ESP8266 a cui aggiungeremo le parti necessarie al controllo del sensore:
/******************************************************************* A telegram bot for your ESP8266 that controls the capacitive soil moisture sensor and a pump. Parts: D1 Mini ESP8266 (or any ESP8266 board) Capacitive soil moisture sensor = Affilate Capacitive soil moisture sensor ( https://amzn.to/3h8I5po ) Written by Mauro Alfieri YouTube: https://www.youtube.com/c/MauroAlfieri77 Instagram: @mauroalfieri *******************************************************************/ #include <ESP8266WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> // Wifi network station credentials #define WIFI_SSID "[your WiFi SSID]" #define WIFI_PASSWORD "[your WiFi SSID password]" // Telegram BOT Token (Get from Botfather) #define BOT_TOKEN "[your Telegram Bot Tocken]" const unsigned long BOT_MTBS = 1000; // mean time between scan messages X509List cert(TELEGRAM_CERTIFICATE_ROOT); WiFiClientSecure secured_client; UniversalTelegramBot bot(BOT_TOKEN, secured_client); unsigned long bot_lasttime; // last time messages' scan has been done const int ledPin = LED_BUILTIN; const int soilMoistureSensor = A0; int ledStatus = 0; int soilMisure = 0; char buffer[200] =""; void handleNewMessages(int numNewMessages) { Serial.print("handleNewMessages "); Serial.println(numNewMessages); for (int i = 0; i < numNewMessages; i++) { String chat_id = bot.messages[i].chat_id; String text = bot.messages[i].text; String from_name = bot.messages[i].from_name; if (from_name == "") from_name = "Guest"; if (text == "/ledon") { digitalWrite(ledPin, LOW); ledStatus = 1; bot.sendMessage(chat_id, "Led is ON", ""); } if (text == "/ledoff") { ledStatus = 0; digitalWrite(ledPin, HIGH); bot.sendMessage(chat_id, "Led is OFF", ""); } if (text == "/status") { if (ledStatus) { bot.sendMessage(chat_id, "Led is ON", ""); } else { bot.sendMessage(chat_id, "Led is OFF", ""); } } if (text == "/soilUmidity") { sprintf(buffer, "Soil Moisture: %d\n", soilMisure); bot.sendMessage(chat_id, buffer, ""); } if (text == "/start") { String welcome = "Welcome to Universal Arduino Telegram Bot library, " + from_name + ".\n"; welcome += "This is Flash Led Bot example.\n\n"; welcome += "/ledon : to switch the Led ON\n"; welcome += "/ledoff : to switch the Led OFF\n"; welcome += "/status : Returns current status of LED\n"; welcome += "/soilUmidity : Returns current status of Soil\n"; bot.sendMessage(chat_id, welcome, "Markdown"); } } } void setup() { Serial.begin(115200); Serial.println(); pinMode(soilMoistureSensor, INPUT); pinMode(ledPin, OUTPUT); delay(10); digitalWrite(ledPin, HIGH); // attempt to connect to Wifi network: configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP secured_client.setTrustAnchors(&cert); // Add root certificate for api.telegram.org Serial.print("Connecting to Wifi SSID "); Serial.print(WIFI_SSID); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.print("\nWiFi connected. IP address: "); Serial.println(WiFi.localIP()); // Check NTP/Time, usually it is instantaneous and you can delete the code below. Serial.print("Retrieving time: "); time_t now = time(nullptr); while (now < 24 * 3600) { Serial.print("."); delay(100); now = time(nullptr); } Serial.println(now); } void loop() { if (millis() - bot_lasttime > BOT_MTBS) { int numNewMessages = bot.getUpdates(bot.last_message_received + 1); while (numNewMessages) { Serial.println("got response"); handleNewMessages(numNewMessages); numNewMessages = bot.getUpdates(bot.last_message_received + 1); } bot_lasttime = millis(); soilMisure = analogRead(soilMoistureSensor); Serial.println(soilMisure); } }
in particolare la linea 037: definisci una costante a cui assegni il valore A0, ossia il pin a cui il sensore è connesso;
linea 040: definisci la variabile di tipo integer in cui memorizzeremo il valore di umidità letto dal sensore;
linea 061: costruiamo una nuova consizione in grado di riconoscere la stringa “/soilUmidity” e di restituire la frase “Soil Moisture: %d” in cui:
%d sarà sostituito dal comando sprintf() con il valore della variabile soilMisure creata alla linea 040;
e l’intera frase, così composta, sarà inviata al Telegram Bot con il comando bot.sendMessage(chat_id, buffer,
""
);
come già visto nel precedente articolo per l’invio del valore di stato del led;
nelle linee 063-072: inseriremo una nuova linea, la 070, che riporta le istruzioni inviate in fase di “/start” al bot e che l’utente potrà seguire per interagirvi.
Ecco come si presenta il bot in funzione in questa fase:
Come vedi il bot ti mostra, come ultima linea delle istruzioni, quella appena aggiunta.
Le ultime linee da modificare riguardano la setup() e la loop(), in particolare:
setup()
l’unica linea aggiunta è la 081 che serve a impostare la modalità “INPUT” per il pin A0;
loop()
anche in questo caso c’è un unica linea da aggiungere, rispetto allo sketch che già conosci ed è la 119 in cui assegni alla variabile soilMisure il valore analogico letto sul pin A0 ( qui riportato come variabile soilMoistureSensor;
Tale valore sarà quello inviato al bot alla richiesta specifica “/soilUmidity”.
Funzionamento del bot
Come tutti i bot Telegram, a cui probabilmente sei abituato, anche questo funziona inviando comandi preceduti dal carattere “/”, il primo che puoi eseguire è “/start”:
che restituisce l’elenco dei comandi accettati dal bot stesso, potrai ri-eseguire questo comando tutte le volte che ti serviranno queste informazioni.
Prova adesso a inviare il comando “/soilUmidity” ed osserva la risposta che la WeMos D1 invia al bot:
Il valore restituito, non volutamente, ti indica certamente che il sensore è immerso in un terreno davvero arido.
Warning!
Ti consiglio di mettere dell’acqua in questa piantina 😀
Dopo aver aggiunto acqua nel terreno prova a chiedere nuovamente il valore del capacitive soil moisture sensor wemos lipo shield telegram bot:
Adesso è decisamente meglio, per la pianta intendo.
Nei prossimi articoli dedicati al capacitive soil moisture sensor wemos lipo shield telegram bot analizzeremo:
- la parte relativa al case in 3D
- i collegamenti del driver motore
- lo sketch per controllare la pompa di irrigazione
- l’assemblaggio
2 commenti
Buongiorno Mauro, ottime guide, grazie! E per essere avvisati dal bot (senza che sia io ad entrare in Telegram intendo) , se ad esempio l’umidità scende oltre un certo valore, come è fattibile? In caso puoi anche dare un link alla guida più “per principianti”.. Grazie!
Autore
Ciao Massimo,
certo si può, dovrai implementare un controllo periodico nello sketch e farti inviare la notifica a Telegram con il comando:
bot.sendMessage( … … ..)