############################
# E012_ADC_OLED.PY: Lee entrada conversor analógico-digital ADC
# ENTRADAS: ADC en GPIO34 entre 0 y +3.3v
# SALIDAS: Lectura ADC en voltios GPIO27/26 LED verde/rojo y OLED
############################
from machine import Pin, SoftI2C # Control I2C
import sh1106 # Gestiona el SH1106©
import time, random # Hora y datos aleatorios
import ntptime, machine # Actualiza el RTC del ESP32
# Configura el pin ADC
pin_adc = 34
adc = machine.ADC(machine.Pin(pin_adc))
# Configura el rango del ADC a 0-3.3v (defecto 0-1v)
adc.atten(machine.ADC.ATTN_11DB)
# Configura los pines para los LED
pin_led_verde = 27
pin_led_rojo = 26
led_verde = machine.Pin(pin_led_verde, machine.Pin.OUT)
led_rojo = machine.Pin(pin_led_rojo, machine.Pin.OUT)
# AJUSTE RTC DEL ESP32 ------------------------------------
# Configura el RTC interno del ESP32
rtc = machine.RTC()
# Sincroniza hora con servidor NTP
try:
print ('Obteniendo fecha y hora de Internet...')
#ntptime.settime() # captura los datos de Internet
except OSError as e:
print("Error al sincronizar con NTP:", e)
machine.reset()
# Ajuste hora local (por ejemplo, UTC+1)
ajuste_zona_horaria = 1
# Obtiene la fecha y hora actual del RTC
year, month, day, weekday, hour, minute, second, _ = rtc.datetime()
hour += ajuste_zona_horaria
# Ajusta a rango de 0 a 23
hour = hour % 24
# Actualiza el RTC con la hora ajustada
print('Actualizo hora en el ESP32')
rtc.datetime((year, month, day, '', hour, minute, second, 0))
# AJUSTE DISPLAY SH1106© POR I2C ---------------------------
# Configura el bus I2C y la direccion de la pantalla SH1106©
i2c = SoftI2C(scl=Pin(22), sda=Pin(21), freq=400000)
direccion_pantalla = 0x3C # Ajusta la dirección I2C (ver Internet)
# Inicializa la pantalla SH1106©
oled = sh1106.SH1106_I2C(128, 64, i2c, None, 0x3C, rotate=180, delay=0)
# Realiza la lectura analógica de 0 a 3.3V y controla los LED
# El ADC es de 12bits por tanto 2^12-1=4095 niveles
def leer_adc():
valor_adc = adc.read()
voltaje = (valor_adc / 4095) * 3.3
return round(voltaje,2)
t = 1
limite = 1.65
print('USO DE ADC CON POTENCIÓMETRO')
print('Gira el potenciómetro')
# Ejemplo de uso
try:
while True:
valor = leer_adc()
# Controla los LED según umbral de entrada
if valor > limite: # Si la tensión supera la mitad del rango
estado = 'superado límite ' + str(limite) + 'v'
led_verde.off() # Apaga el LED verde
led_rojo.on() # Enciende el LED rojo
time.sleep(t) # Parpadea el LED rojo
led_rojo.off()
else:
estado = 'normal'
led_rojo.off() # Apaga el LED rojo
led_verde.on() # Enciende el LED verde
time.sleep(1) # Parpadea el LED verde
led_verde.off()
print(f'Valor ADC: {valor}v, {estado}')
year, month, day, weekday, hour, minute, second, _ = rtc.datetime()
hora = "{:02d}:{:02d}:{:02d}".format(hour, minute, second) # Formato hh:mm:ss
oled.text(hora, 64-4*len(hora), 0) # Ubica hora en centro de pantalla
texto = f'ADC: {valor}v'
oled.text(texto, 64-4*len(texto), 30)
oled.show() # Actualiza display
oled.fill(0) # Borra display
except KeyboardInterrupt:
print("\nLectura ADC detenida.")
# Asegúrate de apagar los LED al detener el script
led_verde.off()
led_rojo.off()
oled.poweroff()