ESP32 Rega IoT de Plantas (Sensor + Bomba)
A bomba liga sozinha quando a terra do vaso seca, e você acompanha a umidade do solo ao vivo no celular. Este projeto é o guia passo a passo do modelo IoT Umidade do solo + bomba do app, com um ESP32, um sensor de umidade do solo, um relé e uma mini bomba d'água. Vá em Oficina › Dispositivos › Adicionar dispositivo; o Ohmi prepara o código com a sua chave de dispositivo. O código daqui é um exemplo: a chave e o Wi-Fi são valores de exemplo.

Controle este dispositivo pelo app
Conecte seu ESP32 ou Raspberry Pi Pico W ao Wi-Fi, ligue e desligue pelo celular e veja as leituras ao vivo. O Ohmi prepara o código; você só informa os dados do Wi-Fi e faz o upload.
Modelo no app: Umidade do solo + bomba
- Onde fica no app?Adicione um novo dispositivo pela aba Ferramentas ou em Oficina › Dispositivos e escolha este modelo.
- Biblioteca ArduinoAbra o Gerenciador de Bibliotecas no Arduino IDE, procure BlueGraysIoT e instale.
O plano grátis inclui 1 dispositivo, 1 gráfico e 24 horas de histórico. Com o Premium, você tem mais dispositivos, mais gráficos e histórico mais longo.
Esquema do circuito

Código-fonte
1// ─────────────────────────────────────────
2// BlueGrays · bluegrays.com
3// ESP32 Rega IoT de Plantas (Sensor + Bomba)
4// ─────────────────────────────────────────
5// O modelo IoT "Umidade do solo + bomba" do app BlueGrays: o sensor de
6// umidade do solo mede a cada 2 segundos e manda o valor para o app, o
7// relé liga a bomba quando a umidade cai abaixo do limite de rega e
8// desliga 10 pontos acima; você também controla a bomba e o limite pelo
9// celular. O Ohmi prepara o código de verdade no app com a sua própria
10// chave de dispositivo (Oficina › Dispositivos › Adicionar dispositivo); o
11// código daqui é um exemplo, a chave do dispositivo e os dados do Wi-Fi
12// são valores de exemplo. Gerenciador de bibliotecas: BlueGraysIoT (com as
13// dependências). A placa só se conecta a redes Wi-Fi de 2,4 GHz. O relé
14// aciona com LOW. Segurança: alimente a bomba com o próprio suporte de
15// pilhas (4 x AA), não pela placa; mantenha a placa, o relé e as pilhas
16// longe da água, numa caixa fechada; nunca deixe a bomba funcionar a seco.
17//
18// Pinos:
19// GPIO34 -> Sensor de umidade do solo AO
20// 3V3, GND -> Sensor de umidade do solo VCC, GND
21// GPIO26 -> Módulo relé IN
22// 5V, GND -> Módulo relé VCC, GND
23// Relé COM -> suporte de pilhas (+), NO -> bomba (+), bomba (-) -> suporte de pilhas (-); a
24// bomba usa as próprias 4 x AA
25// Pico W: sensor de umidade AO GP26, relé IN GP15
26
27/*
28 * Umidade do solo + bomba · BlueGrays IoT
29 * BlueGrays · bluegrays.com
30 * Não compartilhe este código: ele contém a chave do dispositivo e a senha do Wi-Fi.
31 */
32
33#include <BlueGraysIoT.h>
34
35const char *DEVICE_KEY = "SUA_CHAVE_DO_DISPOSITIVO";
36const char *WIFI_NAME = "SUA_REDE_WIFI";
37const char *WIFI_PASSWORD = "SUA_SENHA_WIFI";
38
39BlueGraysIoT bg(DEVICE_KEY);
40
41const int RELAY_PIN = 26;
42const bool RELAY_ACTIVE_LOW = true; // a maioria dos módulos de relé liga com LOW
43void setRelay(bool on) { digitalWrite(RELAY_PIN, (on != RELAY_ACTIVE_LOW) ? HIGH : LOW); }
44const int SOIL_PIN = 34;
45const int SOIL_DRY = 3200; // leitura em solo seco
46const int SOIL_WET = 1300; // leitura em solo úmido
47int threshold = 30; bool pump = false; unsigned long lastReadMs = 0;
48
49void setup() {
50 Serial.begin(115200);
51 pinMode(RELAY_PIN, OUTPUT);
52 setRelay(false);
53 analogReadResolution(12);
54 bg.onSwitch("pompa", [](bool on) { pump = on; setRelay(on); });
55 bg.onNumber("esik", [](float v) { threshold = (int)v; });
56 bg.setDeadband("toprak", 1.0);
57 bg.setDebug(Serial);
58 bg.setLanguage(BG_LANG_EN);
59 bg.begin(WIFI_NAME, WIFI_PASSWORD);
60}
61
62void loop() {
63 bg.loop(); // evite delay() longos aqui
64 if (millis() - lastReadMs >= 2000) {
65 lastReadMs = millis();
66 int pct = constrain(map(analogRead(SOIL_PIN), SOIL_DRY, SOIL_WET, 0, 100), 0, 100);
67 bg.send("toprak", pct);
68 // Liga a bomba abaixo do limite e desliga 10 pontos acima
69 if (pct < threshold && !pump) { pump = true; setRelay(true); bg.send("pompa", true); }
70 if (pct > threshold + 10 && pump) { pump = false; setRelay(false); bg.send("pompa", false); }
71 }
72}
73Perguntas frequentes
Posso enviar o código desta página direto para a placa?
Pode, mas ela não vai se conectar: a chave do dispositivo e os dados do Wi-Fi são valores de exemplo. No app, vá em Oficina › Dispositivos › Adicionar dispositivo e escolha o modelo Umidade do solo + bomba; o Ohmi prepara o código com a sua chave, o nome da sua rede e a sua senha. Copie esse código e envie para a placa. Depois você vê o código completo em Dispositivo › Código e chave.
Funciona também com uma Pico W?
Funciona. Ao adicionar o dispositivo, escolha Pico W como placa; o código continua igual, só mudam os pinos e os valores de calibração: o sensor de umidade no GP26 (uma entrada analógica) e o relé no GP15. Na Arduino IDE, instale o pacote "pico" pelo Gerenciador de placas. O circuito e a foto desta página foram feitos com um ESP32.
Por que a bomba tem pilhas próprias?
A corrente que a bomba puxa e o ruído do motor podem reiniciar a placa. Por isso a bomba é alimentada por um suporte de 4 pilhas AA e passa só pelos terminais COM e NO do relé; ela não tem nenhum fio ligado à placa. Mantenha a placa, o relé e o suporte de pilhas longe da água, numa caixa fechada, e as emendas dos fios secas. A bomba só pode funcionar dentro da água; a seco ela esquenta e queima em poucos minutos. Tire as pilhas quando for encaixar a mangueira ou tirar a bomba da água.
Quando a bomba liga, e o que acontece se eu ligar na mão?
A placa mede a umidade a cada 2 segundos. Quando ela cai abaixo do Limite de rega do app (no começo, 30%) a bomba liga, e desliga 10 pontos acima do limite; essa folga evita que ela fique ligando e desligando. Você também pode tocar no interruptor Bomba, mas a regra automática manda: se desligar com a terra abaixo do limite, ela volta a ligar em 2 segundos, e se ligar com a terra 10 pontos acima, ela desliga na hora. Ajuste o limite ao seu vaso.
