from machine import Pin, ADC, I2C
from ssd1306 import SSD1306_I2C
import urequests
import json
from utime import sleep
import network
import socket
import time
import gc # Para la recolección de basura
### CONFIGURACION WIFI Y CONEXION A API
# Configuración de WiFi
SSID = 'Wokwi-GUEST'
PASSWORD = ''
# Dirección de la API en tu servidor
API_URL = 'https://evidencia2-amt.onrender.com/data' # Cambia esto por la URL de tu API
PORT = 80 # Puerto del servidor
# Umbral de cambio significativo de humedad (para evitar mostrar valores repetidos)
CAMBIO_SIGNIFICATIVO = 50
# Función para conectarse al WiFi
def connect_wifi(ssid, password):
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while not wlan.isconnected():
print('Conectando a WiFi...')
time.sleep(1)
print('Conectado a WiFi. IP:', wlan.ifconfig()[0])
# Función para enviar datos a la API con manejo de errores y optimización de memoria
def send_data_to_api(humedad, estado):
gc.collect() # Forzar la recolección de basura para liberar memoria
try:
# Crear el payload como diccionario JSON
data = json.dumps({'nivel_humedad': humedad, 'estado_sistema': estado})
headers = {'Content-Type': 'application/json'} # Encabezado para JSON
# Enviar la solicitud POST
response = urequests.post(API_URL, data=data, headers=headers) # 'data' debe contener el JSON serializado
if response.status_code == 201:
print('Datos enviados correctamente!')
else:
print('Error al enviar los datos:', response.text)
response.close()
except MemoryError:
print("Error de memoria al intentar enviar los datos.")
gc.collect() # Liberar memoria inmediatamente
except Exception as e:
print('Error en la solicitud:', e)
# Configuración de los pines
sensor_humedad = ADC(Pin(34))
relé = Pin(23, Pin.OUT)
led = Pin(21, Pin.OUT)
# Configuración del sensor de humedad
sensor_humedad.atten(ADC.ATTN_0DB)
sensor_humedad.width(ADC.WIDTH_12BIT)
# Umbral de humedad
UMBRAL_HUMEDAD = 2000
# Configuración del I2C para el display OLED
i2c_oled = I2C(0, scl=Pin(15), sda=Pin(2))
oled = SSD1306_I2C(128, 64, i2c_oled)
# Función para mostrar información en la pantalla OLED
def mostrar_en_pantalla(humedad, led_state):
oled.fill(0) # Deja la pantalla en blanco
oled.text("Nivel de humedad:", 0, 0)
oled.text(f"{humedad}", 0, 16)
oled.text("Estado del LED:", 0, 32)
oled.text(f"{led_state}", 0, 48)
oled.show()
# Función para controlar el riego según la humedad del suelo
def controlar_riego(humedad_anterior, estado_anterior):
humedad = sensor_humedad.read() # Lee el valor del sensor de humedad
print("Humedad del suelo:", humedad) # Imprime el valor de humedad
# Verifica el nivel de humedad y controla el riego
if humedad < UMBRAL_HUMEDAD:
relé.value(1) # Activa el relé
led.value(1) # Enciende el LED
estado_actual = "Encendido"
else:
relé.value(0) # Desactiva el relé
led.value(0) # Apaga el LED
estado_actual = "Apagado"
# Solo actualiza la pantalla si la humedad ha cambiado significativamente o si el estado del LED ha cambiado
if abs(humedad - humedad_anterior) > CAMBIO_SIGNIFICATIVO or estado_actual != estado_anterior:
mostrar_en_pantalla(humedad, estado_actual)
print(f"Actualizando pantalla: Humedad={humedad}, Estado del LED={estado_actual}")
# Solo envía los datos a la API si la humedad cambió significativamente
if abs(humedad - humedad_anterior) > CAMBIO_SIGNIFICATIVO:
print("Cambio significativo en la humedad. Enviando datos.")
send_data_to_api(humedad, estado_actual)
return humedad, estado_actual
# Función principal
def main():
connect_wifi(SSID, PASSWORD)
humedad_anterior = sensor_humedad.read() # Lee el valor inicial de humedad
estado_anterior = "Apagado" if relé.value() == 0 else "Encendido" # Estado inicial del LED
while True:
# Pasa ambos argumentos a la función controlar_riego
humedad_anterior, estado_anterior = controlar_riego(humedad_anterior, estado_anterior)
sleep(10) # Espera 10 segundos antes de volver a leer los valores
main()