Irrighiamo con Wemos e Telegram lo sketch finalmente ci siamo, in questo articolo trovi lo sketch con cui controllare il progetto.
Come hai letto negli ultimi articoli dedicati al progetto ci sono alcuni passaggi che compongono il progetto e che puoi seguire leggendo questi articoli:
- Capacitive soil moisture sensor wemos
- Realizza una shield Wemos
- Capacitive soil moisture sensor wemos lipo shield telegram bot
- Wemos plant watering case
- Irrighiamo con Wemos e Telegram – la pompa
- Irrighiamo con Wemos e Telegram test finale
a cui si aggiunge il presente articolo con la descrizione dello sketch.
Irrighiamo con Wemos e Telegram lo sketch
Iniziamo subito con lo sketch che ti permetterà di controllare il tuo progetto di irrigazione da remoto:
/******************************************************************* 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 *** BOM *** WeMos D1 mini ( ESP8266 ) Capacitive soil moisture sensor ( https://amzn.to/3h8I5po ) Wemos proto shield Drv8833 motor driver ( https://amzn.to/3z1vUAV ) 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 ( https://www.thingiverse.com/thing:4961202 ) 3D case per elettronica e batteria ( https://www.thingiverse.com/thing:4961202 ) 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 Name]" #define WIFI_PASSWORD "[Your WiFI Password]" // Telegram BOT Token (Get from Botfather) #define BOT_TOKEN "[Telegram Bot Token]" 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; const int pumpA = D5; const int pumpB = D6; int ledStatus = 0; int pumpStatus = 0; int soilMisure = 0; const int soilThreshold = 500; const int irrigationTime = 1500; 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 == "/pumpon") { pumpON(); bot.sendMessage(chat_id, "Pump is ON", ""); } if (text == "/pumpoff") { pumpOFF(); bot.sendMessage(chat_id, "Pump is OFF", ""); } if (text == "/pumpStatus") { if (pumpStatus) { bot.sendMessage(chat_id, "Pump is ON", ""); } else { bot.sendMessage(chat_id, "Pump is OFF", ""); } } if (text == "/soilUmidity") { sprintf(buffer, "Soil Moisture: %d\n", soilMisure); bot.sendMessage(chat_id, buffer, ""); } if (text == "/Water2000") { irrigation( 2000 ); bot.sendMessage(chat_id, "Pump is ON for 2sec", ""); } if (text == "/Water4000") { irrigation( 4000 ); bot.sendMessage(chat_id, "Pump is ON for 4sec", ""); } if (text == "/Water6000") { irrigation( 6000 ); bot.sendMessage(chat_id, "Pump is ON for 6sec", ""); } if (text == "/Water8000") { irrigation( 8000 ); bot.sendMessage(chat_id, "Pump is ON for 8sec", ""); } if (text == "/Water10000") { irrigation( 10000 ); bot.sendMessage(chat_id, "Pump is ON for 10sec", ""); } 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 += "/pumpon : to switch the Pump ON\n"; welcome += "/pumpoff : to switch the Pump OFF\n"; welcome += "/pumpStatus : Returns current status of Pump\n"; welcome += "/Water2000 : Returns current status of Pump\n"; welcome += "/Water4000 : Returns current status of Pump\n"; welcome += "/Water6000 : Returns current status of Pump\n"; welcome += "/Water8000 : Returns current status of Pump\n"; welcome += "/Water10000 : Returns current status of Pump\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(pumpA, OUTPUT); pinMode(pumpB, OUTPUT); pinMode(ledPin, OUTPUT); delay(10); digitalWrite(ledPin, HIGH); digitalWrite(pumpA, LOW); digitalWrite(pumpB, LOW); // 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); if (soilMisure > soilThreshold) { irrigation( irrigationTime ); } } } void irrigation( int timeToIrrigation ) { for(int i=0; i<=timeToIrrigation; i++ ) { pumpON(); delay(1); } pumpOFF(); } void pumpON() { digitalWrite(pumpA,LOW); analogWrite(pumpB,255); pumpStatus = 1; } void pumpOFF() { digitalWrite(pumpA, LOW); digitalWrite(pumpB, LOW); pumpStatus = 0; }
la descrizione della maggior parte delle linee di codice la puoi trovare in questi due articoli:
in questo articolo dedicato al progetto irrighiamo con Wemos e Telegram lo sketch leggerai il commento alle sole linee nuove partendo dalle
linee 045-046: in cui definisci due nuove costanti legate ai due pin della Wemod a cui è connesso il driver DRV8833 per il controllo della pompa peristaltica.
All’interno della funzione handleMessages() dovrai inserire alcune linee nuove come le linee 072-074: in cui per ciascuna linea definisci sia il messaggio che ti spetti da Telegram sia l’azione da intraprendere alla ricezione; ad esempio la line a 072 indica che alla ricezione del messaggio “/pumpon” devi avviare la pompa richiamando la funzione pumpON() ( che analizzeremo in seguito ) e restituire il messaggio “Pump is ON” al bot telegram.
Analogamente le altre due linee faranno operazioni simili.
Le linee 076-080: aggiungono altri possibili comandi recepiti dallo sketch; ad esempio digitando sul bot il comando “/Water6000” avvierai l’irrigazione per 6 secondi ( 6000 millisecondi ):
al termine dell’esecuzione della funzione di irrigazione il messaggio che restituirai al bot sarà “Pumo is ON for 6sec” anche se l’esecuzione della routine di irrigazione è già terminata quando il bot riceverà il messaggio.
Linea 082: definisce il messaggio di risposta al comando “/start” è quindi necessario aggiungere anche in questa parte di sketch delle linee nuove.
Tali linee informeranno l’utente che sta utilizzando Telegram dei possibili comandi che irrighiamo con Wemos e Telegram lo sketch accetta.
In particolare puoi aggiungere le linee 089-091 che analogamente alle linee 072-074 definiscono i nuovi comandi accettati, anche se saranno le righe 072-074 ad eseguirli.
Le linee 093-097 che provvederanno ad informare l’utente dell’esistenza dei comandi /Water* ( dove * è il valore in millisecondi accettato dal programma ).
In questo modo inviando dal Bot il comando “/start” l’utente riceverà il seguente messaggio:
e sarà in grado di irrigare o chiedere info sullo stato del terreno.
Puoi trovare sul sito thingiverse i file necessari alla realizzazione dei due case 3D che ospitano il progetto.