import network
import machine
import time
import urequests
from machine import Pin
from dht import DHT22
# Configuración WiFi y ThingSpeak
SSID = "Wokwi-GUEST"
PASSWORD = ""
THINGSPEAK_URL = "https://api.thingspeak.com/update.json"
API_KEY = "X3ZSZ1SPTQ5X8BLJ"
# Pines de los sensores
trig_pin = Pin(5, Pin.OUT) # Trigger del sensor HC-SR04
echo_pin = Pin(18, Pin.IN) # Echo del sensor HC-SR04
pir_pin = Pin(15, Pin.IN) # Pin de salida del sensor PIR
dht_sensor = DHT22(Pin(4)) # Pin de datos del sensor DHT22
# Conexión WiFi
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
print("Conectando a WiFi...")
while not wlan.isconnected():
time.sleep(1)
print("Conectado a WiFi:", wlan.ifconfig())
# Medir distancia con el sensor ultrasónico
def medir_distancia():
trig_pin.value(0)
time.sleep_us(2)
trig_pin.value(1)
time.sleep_us(10)
trig_pin.value(0)
try:
duration_us = machine.time_pulse_us(echo_pin, 1, 30000) # Timeout en 30 ms
distance_cm = duration_us / 58.0
return round(distance_cm, 2)
except OSError as e:
print("Error al medir distancia:", e)
return None
# Leer temperatura y humedad del sensor DHT22
def leer_dht22():
try:
dht_sensor.measure()
temp = dht_sensor.temperature()
hum = dht_sensor.humidity()
return round(temp, 2), round(hum, 2)
except OSError as e:
print("Error al leer DHT22:", e)
return None, None
# Detectar movimiento con el sensor PIR
def detectar_movimiento():
try:
return pir_pin.value()
except Exception as e:
print("Error al leer PIR:", e)
return None
# Enviar datos a ThingSpeak usando POST y JSON
def enviar_a_thingspeak(distancia, temp, hum, movimiento):
# Si algún sensor devuelve None, enviar valores predeterminados
distancia = distancia if distancia is not None else 0
temp = temp if temp is not None else 0
hum = hum if hum is not None else 0
movimiento = movimiento if movimiento is not None else 0
# Combinar temperatura y humedad en un solo campo
temp_hum_combinado = f"{temp},{hum}"
# Crear el JSON para enviar
data = {
"api_key": API_KEY,
"field1": distancia,
"field2": temp_hum_combinado,
"field3": movimiento
}
try:
respuesta = urequests.post(THINGSPEAK_URL, json=data)
print("")
print("Enviado a ThingSpeak:", respuesta.text)
print("")
respuesta.close()
except Exception as e:
print("")
print("Error al enviar datos:", e)
print("")
# Programa principal
connect_wifi()
try:
while True:
# Leer sensores
distancia = medir_distancia()
temp, hum = leer_dht22()
movimiento = detectar_movimiento()
# Mostrar resultados en consola
print("")
print(f"Distancia: {distancia} cm, Temp/Hum: {temp},{hum}, Movimiento: {movimiento}")
# Enviar datos a ThingSpeak
enviar_a_thingspeak(distancia, temp, hum, movimiento)
# Esperar 15 segundos antes de la próxima lectura
time.sleep(15)
except KeyboardInterrupt:
print("Programa detenido.")