Автоматическая система полива офисных растений на Arduino, WiFi и IFTTT
Компоненты и материалы
| Arduino Due | 1 шт. |
| Andium Anduino WiFi | 1 шт. |
| Arduino Zero | 1 шт. |
| Ёмкостной датчик влажности почвы | 1 шт. |
Приложения и сервисы
- Arduino IDE
- IFTTT
- Adafruit IO
О проекте
Мотивация
В Andium переехали в новый офис, украсили растениями. Забыли поливать — через неделю растения завяли.


Мы IoT-компания, мы лучше этого. Почему растения не подключены к интернету! Срочно делаем решение на anduinoWiFi shield и IFTTT. Даём растениям голос!
Начало работы
Если у вас зелёный большой палец — вы уже не читаете. Если как я — нужно дать растениям умолять о воде цифровым способом — вы по адресу.
Нужен Arduino Due или Zero, anduinoWiFi shield (или любой WiFi Arduino, говорящий с Adafruit IO) и ёмкостной датчик влажности почвы. И стакан воды (дайте растению когда закончим, оно скажет спасибо по email).

Датчик влажности
Датчик классный — его можно погрузить в мокрую землю. Не погружайте ниже белой линии — контакты не выдержат.


Зачем датчик в стакане воды? Для калибровки!
Калибровка ёмкостного датчика влажности почвы
Три провода: 3.3V (красный), земля (чёрный), сигнал (синий) → аналоговый пин A1. Калибруем: сухой датчик → значение dryVal, погружённый до белой линии в воду → wetVal. Это 0-100% относительной влажности.
Подключите датчик, запустите скетч, запишите результаты. У меня dryVal=807, wetVal=415.
int inputPin = A1;
void setup() {
Serial.begin(115200);
delay(3000);
}
void loop() {
Serial.print("Raw val: ");
Serial.println(readHumidity());
delay(3000);
}
int readHumidity() {
int sensorVal = analogRead(inputPin);
return sensorVal;
}
Теперь настройте маппинг относительной влажности. Калибровка завершена!
Основной скетч
#include <WiFi101.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include "AnduinoLCD.h"
// WiFi parameters
#define WLAN_SSID "Andium"
#define WLAN_PASS "maybeitsjustpassword"
// Adafruit IO
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "yourusernname"
#define AIO_KEY "dosifje0j230fj32lksdfj230ff23"
WiFiClient client;
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Publish humidityVal = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/officePlants");
AnduinoLCD LCD = AnduinoLCD(ST7735_CS_PIN, ST7735_DC_PIN, ST7735_RST_PIN);
int inputPin = A1;
const int dryVal = 807;
const int wetVal = 415;
int humidity = 0;
int humidityPrev = 0;
int relHumidity = 0;
void setup() {
Serial.begin(115200);
delay(3000);
connectToWiFi();
connectToAdafruit();
LCD.begin();
LCDinit();
}
void loop() {
if(! mqtt.ping(3)) {
if(! mqtt.connected()) connect();
}
humidity = readHumidity();
char b[4];
String str = String(humidity);
for(int i=0; i= 0) mqtt.disconnect();
Serial.println(F("Retrying connection..."));
delay(1000);
}
Serial.println(F("Adafruit IO Connected!"));
}
void displayHumidity(int humidity, int humidtyPrev) {
LCD.setTextColor(ST7735_BLACK);
LCD.setTextSize(2);
LCD.setTextWrap(true);
LCD.setCursor(40,60);
LCD.setTextSize(5);
LCD.print(humidityPrev);
LCD.setTextSize(2);
LCD.print("%");
LCD.setTextColor(ST7735_WHITE);
LCD.setTextSize(2);
LCD.setTextWrap(true);
LCD.setCursor(40,60);
LCD.setTextSize(5);
LCD.print(humidity);
LCD.setTextSize(2);
LCD.print("%");
}
void connectToWiFi() {
delay(10);
Serial.print(F("Connecting to "));
Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(F("."));
}
Serial.println(F("WiFi connected!"));
}
void connectToAdafruit() { connect(); }
void LCDinit() {
LCD.setBacklight(ON);
LCD.fillScreen(ST7735_BLACK);
LCD.showBanner();
LCD.setTextColor(ST7735_WHITE);
LCD.setTextSize(2);
LCD.setTextWrap(true);
LCD.setCursor(0,40);
LCD.print("Humidity: ");
}
int readHumidity() {
int sensorVal = analogRead(inputPin);
relHumidity = map(sensorVal, dryVal, wetVal, 0, 100);
Serial.println("relHumidity");
Serial.print(relHumidity);
return relHumidity;
}
Скопируйте в IDE, установите библиотеки: WiFi101, Adafruit_MQTT, AnduinoLCD. Подставьте свои калиброванные dryVal и wetVal.
Если всё ок — каждые 10 минут публикуются показания. Скриншот показаний:

Теперь используем IFTTT для порогового уведомления.
IFTTT порог
Настроил порог: когда относительная влажность почвы падает ниже 20%, растения твитят (@andiumPlants) просьбу о поливе.



Что дальше?
Фантазируйте! Как ещё дать растениям голос. Берите anduinoWiFi и датчик почвы и творите!
Код
Anduino
Библиотека Arduino для Andium(Anduino) shield. Превратите Arduino в AndiumNode. GitHub
Производственный процесс
- Удобрения: наука, производство и устойчивое будущее
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Оптимизированные решения питания для проектов на Arduino
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Оценка здоровья растений с TinyML: Практическое руководство
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino