# Estación Meteorológica para Raspberry Pi Pico
# Autor: Cristobal SASTRE
# Fecha: Mayo 2025
import machine
import time
import onewire
import ds18x20
import dht
from machine import Pin, ADC
# Configuración de pines
ds_pin = Pin(2) # GP2 para DS18B20
dht_pin = Pin(3) # GP3 para DHT22
ldr_pin = ADC(26) # GP26 (ADC0) para LDR
# Inicializar sensores
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
ds_roms = ds_sensor.scan()
print(f"[INFO] Sensores DS18B20 encontrados: {len(ds_roms)}")
dht_sensor = dht.DHT22(dht_pin)
led = Pin(25, Pin.OUT)
# Diccionario para almacenar datos
sensor_data = {
"ds18b20_temp": None,
"dht22_temp": None,
"dht22_humidity": None,
"light_level": None,
"timestamp": None
}
def led_blink(times=1, delay=0.2):
for _ in range(times):
led.value(1)
time.sleep(delay)
led.value(0)
time.sleep(delay)
def read_ds18b20():
try:
if not ds_roms:
print("[ERROR] No se encontraron sensores DS18B20")
return None
ds_sensor.convert_temp()
time.sleep(0.75)
return round(ds_sensor.read_temp(ds_roms[0]), 1)
except Exception as e:
print(f"[ERROR] DS18B20: {e}")
return None
def read_dht22():
try:
dht_sensor.measure()
return round(dht_sensor.temperature(), 1), round(dht_sensor.humidity(), 1)
except Exception as e:
print(f"[ERROR] DHT22: {e}")
return None, None
def read_ldr():
try:
raw = ldr_pin.read_u16()
return round((raw / 65535) * 100, 1)
except Exception as e:
print(f"[ERROR] LDR: {e}")
return None
def update_sensor_data():
global sensor_data
sensor_data["ds18b20_temp"] = read_ds18b20()
dht_temp, dht_hum = read_dht22()
sensor_data["dht22_temp"] = dht_temp
sensor_data["dht22_humidity"] = dht_hum
sensor_data["light_level"] = read_ldr()
sensor_data["timestamp"] = time.time()
return sensor_data
def print_sensor_data():
print("-" * 40)
print("ESTACIÓN METEOROLÓGICA - DATOS ACTUALES")
print("-" * 40)
print(f"Temperatura DS18B20: {sensor_data['ds18b20_temp']}°C")
print(f"Temperatura DHT22: {sensor_data['dht22_temp']}°C")
print(f"Humedad DHT22: {sensor_data['dht22_humidity']}%")
print(f"Nivel de luz: {sensor_data['light_level']}%")
print(f"Timestamp: {sensor_data['timestamp']}")
print("-" * 40)
def save_to_txt(data, filename="data_log.txt"):
try:
timestamp = time.localtime()
log_line = (
f"[{timestamp[0]}-{timestamp[1]:02d}-{timestamp[2]:02d} "
f"{timestamp[3]:02d}:{timestamp[4]:02d}:{timestamp[5]:02d}] "
f"DS18B20: {data['ds18b20_temp']}°C | "
f"DHT22: {data['dht22_temp']}°C, {data['dht22_humidity']}% | "
f"Luz: {data['light_level']}%\n"
)
with open(filename, "a") as f:
f.write(log_line)
except Exception as e:
print(f"[ERROR] No se pudo guardar en TXT: {e}")
def main():
print("🟢 Circuito inicializado correctamente. Estación meteorológica activa.")
led_blink(3)
try:
while True:
update_sensor_data()
print_sensor_data()
save_to_txt(sensor_data)
led_blink(1)
time.sleep(60) # Esperar un minuto antes de la próxima lectura
except KeyboardInterrupt:
print("🛑 Programa detenido por el usuario.")
except Exception as e:
print(f"[ERROR FATAL] {e}")
for _ in range(10):
led_blink(1, 0.1)
# Ejecutar
if __name__ == "__main__":
main()