# --- Bibliotecas para MicroPython ---
from machine import Pin, ADC
import time
import network
import urequests # Necesitarás instalar urequests si no lo tienes (es un módulo para peticiones HTTP)
# --- Configuración de Wi-Fi y Telegram ---
# Reemplaza con tus credenciales de Wi-Fi
WIFI_SSID = "Wokwi-GUEST"
WIFI_PASSWORD = ""
# Reemplaza con el token de tu bot de Telegram y el ID de tu chat (tu ID de usuario)
# Puedes obtener tu ID de chat usando un bot como @userinfobot en Telegram
TELEGRAM_BOT_TOKEN = "7652227978:AAE9eZHo_doH2917Y9Y0MAsOW2jfMSU9k4"
TELEGRAM_CHAT_ID = "TU_CHAT_ID_DE_USUARIO" # Ejemplo: "123456789"
# --- Configuración del Caudalímetro y LEDs ---
Caudalimetro = ADC(Pin(34)) # Pin 34 es un pin ADC válido en ESP32
Caudalimetro.width(ADC.WIDTH_10BIT) # Rango de 0-1023
Caudalimetro.atten(ADC.ATTN_11DB) # Rango de voltaje de 0-3.3V
led_rojo = Pin(12, Pin.OUT)
led_verde = Pin(13, Pin.OUT)
led_blanco = Pin(14, Pin.OUT)
led_blanco.on() # Enciende el LED blanco al inicio
# --- Funciones de Conexión Wi-Fi ---
def connect_wifi(ssid, password):
sta_if = network.WLAN(network.STA_IF)
if not sta_if.isconnected():
print('Conectando a la red WiFi...')
sta_if.active(True)
sta_if.connect(ssid, password)
while not sta_if.isconnected():
led_verde.off()
time.sleep(0.2)
led_verde.on()
time.sleep(0.2)
pass
print('¡Conexión Wi-Fi establecida!')
print('Configuración de red:', sta_if.ifconfig())
led_verde.on() # Enciende el LED verde fijo cuando está conectado
time.sleep(1)
led_verde.off()
# --- Función para enviar mensaje a Telegram ---
def send_telegram_message(message):
url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
headers = {'Content-Type': 'application/json'}
data = {
'chat_id': TELEGRAM_CHAT_ID,
'text': message
}
try:
response = urequests.post(url, headers=headers, json=data)
response.close() # Importante cerrar la respuesta para liberar recursos
if response.status_code == 200:
print("Mensaje de Telegram enviado exitosamente.")
led_rojo.off() # Apaga el LED rojo si el mensaje se envió
else:
print(f"Error al enviar mensaje a Telegram: {response.status_code}, {response.text}")
led_rojo.on() # Enciende el LED rojo si hubo un error
except Exception as e:
print(f"Excepción al enviar mensaje a Telegram: {e}")
led_rojo.on() # Enciende el LED rojo si hubo una excepción
# --- Bucle principal (Manejo de "comandos" simples desde Telegram) ---
# En MicroPython, no hay un "bot" escuchando comandos de forma sofisticada.
# Podríamos, por ejemplo, tener un bucle que lea los mensajes recientes y actúe.
# Esto es un ejemplo MUY simplificado y NO ROBUSTO para un bot real.
# Un enfoque más realista sería usar un servidor web en el ESP32 o un broker MQTT.
def get_updates():
url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/getUpdates"
try:
response = urequests.get(url)
updates = response.json()
response.close()
return updates['result']
except Exception as e:
print(f"Error al obtener actualizaciones de Telegram: {e}")
return []
def main():
connect_wifi(WIFI_SSID, WIFI_PASSWORD)
last_update_id = 0 # Para llevar un registro de los mensajes ya procesados
print("Bot MicroPython iniciado. Esperando comandos...")
# Envía un mensaje inicial para saber que el bot está activo
send_telegram_message("¡El ESP32 del caudalímetro se ha iniciado!")
while True:
updates = get_updates()
for update in updates:
if update['update_id'] > last_update_id:
last_update_id = update['update_id']
if 'message' in update and 'text' in update['message']:
message_text = update['message']['text']
chat_id_from_msg = update['message']['chat']['id']
# Solo procesa mensajes si vienen de tu CHAT_ID_DE_USUARIO configurado
if str(chat_id_from_msg) == TELEGRAM_CHAT_ID:
print(f"Mensaje recibido: {message_text}")
if message_text == "/getflow":
lectura_adc = Caudalimetro.read()
# La fórmula de 30 L/m para 1023 es una aproximación,
# deberías calibrar tu caudalímetro
flujo_actual = (30 / 1023) * lectura_adc
send_telegram_message(f"El caudal actual es: {flujo_actual:.2f} L/m")
elif message_text == "/status":
send_telegram_message("ESP32 del caudalímetro online.")
# Puedes añadir más comandos aquí
time.sleep(5) # Espera 5 segundos antes de buscar nuevas actualizaciones
if __name__ == "__main__":
main()