{"id":659,"date":"2026-08-23T23:41:48","date_gmt":"2026-08-24T02:41:48","guid":{"rendered":"http:\/\/www.wagnersalvi.com.br\/?p=659"},"modified":"2026-08-23T23:41:50","modified_gmt":"2026-08-24T02:41:50","slug":"transformando-seu-hidrometro-em-um-dispositivo-iot-inteligente-com-esp32-cam","status":"publish","type":"post","link":"http:\/\/www.wagnersalvi.com.br\/?p=659","title":{"rendered":"Transformando seu Hidr\u00f4metro em um Dispositivo IoT Inteligente com ESP32-CAM"},"content":{"rendered":"\n<p>Voc\u00ea j\u00e1 foi surpreendido por uma conta de \u00e1gua abusiva no final do m\u00eas devido a um vazamento invis\u00edvel? Ou simplesmente esqueceu de verificar o medidor de \u00e1gua na cal\u00e7ada?<\/p>\n\n\n\n<p>Neste exemplo vou mostrar como criar um Leitor Inteligente de Hidr\u00f4metro utilizando o microcontrolador de baixo custo ESP32-CAM e o Telegram. Trata-se de uma solu\u00e7\u00e3o simples, pr\u00e1tica e altamente funcional de Internet das Coisas (IoT).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">O Conceito do Projeto<\/h2>\n\n\n\n<p>A l\u00f3gica \u00e9 extremamente simples e eficiente:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Modo Sono Profundo (<em>Deep Sleep<\/em>):<\/strong> O ESP32-CAM fica desligado a maior parte do tempo, consumindo quase nada de energia.<\/li>\n\n\n\n<li><strong>Despertar Autom\u00e1tico:<\/strong> No hor\u00e1rio programado (por exemplo, 1x ao dia), ele acorda automaticamente.<\/li>\n\n\n\n<li><strong>Ilumina\u00e7\u00e3o e Foto:<\/strong> Acende o LED flash por fra\u00e7\u00e3o de segundo, tira uma foto n\u00edtida do visor num\u00e9rico e se conecta ao Wi-Fi.<\/li>\n\n\n\n<li><strong>Envio da Foto:<\/strong> Transmite a imagem com o registro do consumo direto para o seu aplicativo no <strong>Telegram<\/strong>.<\/li>\n\n\n\n<li><strong>Retorno ao Sono:<\/strong> O m\u00f3dulo se desliga novamente para economizar energia.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Materiais Necess\u00e1rios<\/h2>\n\n\n\n<p>Para montar este projeto, voc\u00ea n\u00e3o precisa de conhecimentos avan\u00e7ados em eletr\u00f4nica:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>Componente<\/strong><\/td><td><strong>Quantidade<\/strong><\/td><td><strong>Fun\u00e7\u00e3o no Projeto<\/strong><\/td><\/tr><\/thead><tbody><tr><td><strong><a href=\"https:\/\/meli.la\/2s89G4G\">ESP32-CAM + C\u00e2mera OV2640<\/a><\/strong><\/td><td>1 un.<\/td><td>C\u00e9rebro do sistema + sensor de imagem de 2 Megapixels.<\/td><\/tr><tr><td><strong><a href=\"https:\/\/meli.la\/1dT8kSV\" data-type=\"link\" data-id=\"https:\/\/meli.la\/1dT8kSV\">Fonte de Alimenta\u00e7\u00e3o 5V (USB)<\/a><\/strong><\/td><td>1 un.<\/td><td>Carregador de celular padr\u00e3o (5V \/ 2A) para garantir energia suficiente ao Wi-Fi.<\/td><\/tr><tr><td><strong><a href=\"https:\/\/meli.la\/2snGai1\">Caixa Herm\u00e9tica de Prote\u00e7\u00e3o (IP65)<\/a><\/strong><\/td><td>1 un.<\/td><td>Caixa pl\u00e1stica para proteger os componentes de poeira e umidade no abrigo do medidor.<\/td><\/tr><tr><td><strong>Fita Dupla Face \/ Abra\u00e7adeiras<\/strong><\/td><td>1 un.<\/td><td>Para fixar a c\u00e2mera alinhada ao visor do hidr\u00f4metro.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">O Segredo T\u00e9cnico: Ajustando o Foco Macro<\/h2>\n\n\n\n<p>A c\u00e2mera OV2640 vem ajustada de f\u00e1brica para tirar fotos de objetos a partir de 50 cm de dist\u00e2ncia. Como ela vai ficar instalada a cerca de 10 a 15 cm do visor do hidr\u00f4metro, a imagem sair\u00e1 emba\u00e7ada se n\u00e3o fizer este ajuste simples:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Localize a cola de silicone amarela travando a rosca da lente.<\/li>\n\n\n\n<li>Com cuidado (usando a ponta dos dedos ou um alicate pequeno), gire a rosca da lente no sentido anti-hor\u00e1rio em aproximadamente 1\/4 de volta.<\/li>\n\n\n\n<li>Isso ajustar\u00e1 o foco para curtas dist\u00e2ncias (<em>Macro<\/em>), tornando os n\u00fameros do visor perfeitamente leg\u00edveis.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">C\u00f3digo Fonte Pronto (Arduino IDE)<\/h2>\n\n\n\n<p>Instale as bibliotecas <code>UniversalTelegramBot<\/code> e <code>ArduinoJson<\/code> no seu ambiente Arduino IDE, cole o c\u00f3digo abaixo, preencha seus dados de Wi-Fi e Telegram, e fa\u00e7a o upload para a placa:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;WiFi.h>\n#include &lt;WiFiClientSecure.h>\n#include \"esp_camera.h\"\n#include &lt;UniversalTelegramBot.h>\n#include &lt;ArduinoJson.h>\n\n\/\/ ======================================================\n\/\/ CONFIGURA\u00c7\u00d5ES DE REDE E TELEGRAM\n\/\/ ======================================================\nconst char* ssid = \"NOME_DA_SUA_REDE_WIFI\";\nconst char* password = \"SENHA_DO_SEU_WIFI\";\nconst char* BOTtoken = \"SEU_BOT_TOKEN_DO_TELEGRAM\";\nconst char* CHAT_ID = \"SEU_CHAT_ID_DO_TELEGRAM\";\n\n\/\/ Pinagem Padr\u00e3o da C\u00e2mera (M\u00f3dulo AI-THINKER)\n#define PWDN_GPIO_NUM     32\n#define RESET_GPIO_NUM    -1\n#define XCLK_GPIO_NUM      0\n#define SIOD_GPIO_NUM     26\n#define SIOC_GPIO_NUM     27\n#define Y9_GPIO_NUM       35\n#define Y8_GPIO_NUM       34\n#define Y7_GPIO_NUM       39\n#define Y6_GPIO_NUM       36\n#define Y5_GPIO_NUM       21\n#define Y4_GPIO_NUM       19\n#define Y3_GPIO_NUM       18\n#define Y2_GPIO_NUM        5\n#define VSYNC_GPIO_NUM    25\n#define HREF_GPIO_NUM     23\n#define PCLK_GPIO_NUM     22\n#define FLASH_LED_PIN      4\n\nWiFiClientSecure clientTCP;\nUniversalTelegramBot bot(BOTtoken, clientTCP);\n\nvoid configCamera() {\n  camera_config_t config;\n  config.ledc_channel = LEDC_CHANNEL_0;\n  config.ledc_timer = LEDC_TIMER_0;\n  config.pin_d0 = Y2_GPIO_NUM;\n  config.pin_d1 = Y3_GPIO_NUM;\n  config.pin_d2 = Y4_GPIO_NUM;\n  config.pin_d3 = Y5_GPIO_NUM;\n  config.pin_d4 = Y6_GPIO_NUM;\n  config.pin_d5 = Y7_GPIO_NUM;\n  config.pin_d6 = Y8_GPIO_NUM;\n  config.pin_d7 = Y9_GPIO_NUM;\n  config.pin_xclk = XCLK_GPIO_NUM;\n  config.pin_pclk = PCLK_GPIO_NUM;\n  config.pin_vsync = VSYNC_GPIO_NUM;\n  config.pin_href = HREF_GPIO_NUM;\n  config.pin_sscb_sda = SIOD_GPIO_NUM;\n  config.pin_sscb_scl = SIOC_GPIO_NUM;\n  config.pin_pwdn = PWDN_GPIO_NUM;\n  config.pin_reset = RESET_GPIO_NUM;\n  config.xclk_freq_hz = 20000000;\n  config.pixel_format = PIXFORMAT_JPEG;\n\n  if(psramFound()){\n    config.frame_size = FRAMESIZE_VGA;\n    config.jpeg_quality = 10;\n    config.fb_count = 2;\n  } else {\n    config.frame_size = FRAMESIZE_SVGA;\n    config.jpeg_quality = 12;\n    config.fb_count = 1;\n  }\n  esp_camera_init(&amp;config);\n}\n\nvoid enviarFotoTelegram() {\n  digitalWrite(FLASH_LED_PIN, HIGH); \/\/ Liga o Flash LED\n  delay(500); \/\/ Aguarda a luz estabilizar\n\n  camera_fb_t * fb = esp_camera_fb_get();\n  digitalWrite(FLASH_LED_PIN, LOW); \/\/ Desliga o Flash\n\n  if(!fb) return;\n\n  clientTCP.setInsecure(); \/\/ Ignora verifica\u00e7\u00e3o estrita de SSL\n  \n  if (clientTCP.connect(\"api.telegram.org\", 443)) {\n    String head = \"--Boundary\\r\\nContent-Disposition: form-data; name=\\\"chat_id\\\"\\r\\n\\r\\n\" + String(CHAT_ID) + \n                  \"\\r\\n--Boundary\\r\\nContent-Disposition: form-data; name=\\\"photo\\\"; filename=\\\"hidrometro.jpg\\\"\\r\\nContent-Type: image\/jpeg\\r\\n\\r\\n\";\n    String tail = \"\\r\\n--Boundary--\\r\\n\";\n\n    size_t totalLen = head.length() + fb->len + tail.length();\n\n    clientTCP.println(\"POST \/bot\" + String(BOTtoken) + \"\/sendPhoto HTTP\/1.1\");\n    clientTCP.println(\"Host: api.telegram.org\");\n    clientTCP.println(\"Content-Type: multipart\/form-data; boundary=Boundary\");\n    clientTCP.println(\"Content-Length: \" + String(totalLen));\n    clientTCP.println();\n    clientTCP.print(head);\n\n    uint8_t *fbBuf = fb->buf;\n    size_t fbLen = fb->len;\n    for (size_t n=0; n&lt;fbLen; n+=1024) {\n      if (n+1024 &lt; fbLen) {\n        clientTCP.write(fbBuf + n, 1024);\n      } else {\n        clientTCP.write(fbBuf + n, fbLen - n);\n      }\n    }\n    clientTCP.print(tail);\n    clientTCP.stop();\n  }\n  esp_camera_fb_return(fb);\n}\n\nvoid setup() {\n  pinMode(FLASH_LED_PIN, OUTPUT);\n  digitalWrite(FLASH_LED_PIN, LOW);\n\n  WiFi.begin(ssid, password);\n  while (WiFi.status() != WL_CONNECTED) {\n    delay(500);\n  }\n\n  configCamera();\n  enviarFotoTelegram();\n\n  \/\/ Configura sono profundo por 24 horas (em microssegundos)\n  uint64_t tempoSono = 86400ULL * 1000000ULL;\n  esp_sleep_enable_timer_wakeup(tempoSono);\n  esp_deep_sleep_start();\n}\n\nvoid loop() {\n  \/\/ Loop permanece vazio pois o Deep Sleep reinicia o chip a cada ciclo\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Passo a Passo de Execu\u00e7\u00e3o<\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Abra o Telegram<\/strong> e pesquise por <code>@BotFather<\/code>.<\/li>\n\n\n\n<li>Envie o comando <code>\/newbot<\/code> para criar seu rob\u00f4 e guarde o <strong>Token API<\/strong>.<\/li>\n\n\n\n<li>Pesquise por <code>@userinfobot<\/code>, envie qualquer mensagem e anote seu n\u00famero de <strong>Chat ID<\/strong>.<\/li>\n\n\n\n<li>Abra o c\u00f3digo na <strong>Arduino IDE<\/strong>, insira seu SSID, Senha do Wi-Fi, Token e Chat ID.<\/li>\n\n\n\n<li>Conecte o ESP32-CAM via m\u00f3dulo MB USB no PC e fa\u00e7a o upload (Selecione a placa <em>AI Thinker ESP32-CAM<\/em>).<\/li>\n\n\n\n<li>Instale o dispositivo na caixa herm\u00e9tica apontado para o medidor de \u00e1gua e pronto!<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Pr\u00f3ximos Passos &amp; Automa\u00e7\u00e3o Avan\u00e7ada<\/h2>\n\n\n\n<p>Este projeto pode facilmente evoluir. Com a imagem sendo gerada, voc\u00ea pode integr\u00e1-lo ao Home Assistant e utilizar o projeto open-source AI-on-the-edge-device, que aplica OCR (Reconhecimento \u00d3ptico de Caracteres) para ler os n\u00fameros da foto automaticamente e gerar gr\u00e1ficos do consumo de \u00e1gua por dia.<\/p>\n\n\n\n<p>Ainda indo mais adiante voc\u00ea pode adicionar baterias, inclusive a Energia solar deixando ainda mais econ\u00f4mica e a prova de falta de energia<\/p>\n<p>Views: 5<\/p>","protected":false},"excerpt":{"rendered":"<p>Voc\u00ea j\u00e1 foi surpreendido por uma conta de \u00e1gua abusiva no final do m\u00eas devido a um vazamento invis\u00edvel? Ou [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":660,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[52,55,49],"tags":[281,53,282],"class_list":["post-659","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hardware","category-iot","category-programacao","tag-esp32","tag-iot","tag-telegram"],"_links":{"self":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/659","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=659"}],"version-history":[{"count":1,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/659\/revisions"}],"predecessor-version":[{"id":661,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/posts\/659\/revisions\/661"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=\/wp\/v2\/media\/660"}],"wp:attachment":[{"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=659"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=659"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.wagnersalvi.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=659"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}