import machine
from machine import Pin, SoftI2C, ADC
import ssd1306
from time import sleep
import math
# Configuración del bus I2C y del display OLED
i2c = SoftI2C(scl=Pin(5), sda=Pin(4))
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
# Configuración del LED integrado
led = Pin(2, Pin.OUT)
# Configuración de los botones
boton1 = Pin(14, Pin.IN, Pin.PULL_UP)
boton2 = Pin(15, Pin.IN, Pin.PULL_UP)
boton3 = Pin(12, Pin.IN, Pin.PULL_UP) # Botón adicional para la tercera función
# Configuración del ADC
adc1 = ADC(Pin(27)) # ADC en el pin GP25 para funcion1
adc2 = ADC(Pin(26)) # ADC en el pin GP26 para funcion2
adc3 = ADC(Pin(28)) # ADC en el pin GP33 para funcion3
# Función 1: Muestra el medidor analógico en OLED con el valor del ADC1 (Pin 25)
def funcion1():
valor_adc1 = adc1.read_u16() * 180 / 65535 # Lee el valor del ADC y lo mapea al rango de 0 a 180 grados
oled.fill(0) # Borra el contenido anterior del display
# Dibuja la circunferencia de fondo
x_center, y_center = 64, 50 # Centro del círculo
radius_background = 40 # Radio de la circunferencia de fondo
num_points = 200 # Número de puntos para dibujar la circunferencia completa
for i in range(num_points):
angulo = math.radians(i * (360 / num_points))
x1 = int(x_center + radius_background * math.cos(angulo))
y1 = int(y_center - radius_background * math.sin(angulo)) # Invertimos el signo aquí
angulo2 = math.radians((i + 1) * (360 / num_points))
x2 = int(x_center + radius_background * math.cos(angulo2))
y2 = int(y_center - radius_background * math.sin(angulo2)) # Invertimos el signo aquí
oled.line(x1, y1, x2, y2, 1)
# Mapea el valor del ADC al rango de 0 a 180 grados
angulo = (valor_adc1 / 180) * math.pi
# Calcula las coordenadas para dibujar el puntero
radius_pointer = 30 # Radio del puntero
x_pointer = int(x_center + radius_pointer * math.cos(angulo))
y_pointer = int(y_center - radius_pointer * math.sin(angulo)) # Invertimos el signo aquí
# Dibuja el puntero del medidor analógico
oled.line(x_center, y_center, x_pointer, y_pointer, 1)
# Calcula el valor ADC1 y su conversión
valor_adc1_converted = adc1.read_u16() * 5.15 / 1023.0
res1 = (valor_adc1_converted / (2000 / (2000 + 1000))) / 100
# Muestra el valor del ADC como texto en el display
oled.text("Voltaje: {:.2f}".format(res1), 0, 0)
oled.text('LMEC458', 0, 57)
oled.show() # Actualiza el display
# Función 2: Muestra el medidor analógico en OLED con el valor del ADC2 (Pin 26)
def funcion2():
valor_adc2 = adc2.read_u16() * 180 / 65535 # Lee el valor del ADC y lo mapea al rango de 0 a 180 grados
oled.fill(0) # Borra el contenido anterior del display
# Dibuja la circunferencia de fondo
x_center, y_center = 64, 50 # Centro del círculo
radius_background = 40 # Radio de la circunferencia de fondo
num_points = 200 # Número de puntos para dibujar la circunferencia completa
for i in range(num_points):
angulo = math.radians(i * (360 / num_points))
x1 = int(x_center + radius_background * math.cos(angulo))
y1 = int(y_center - radius_background * math.sin(angulo)) # Invertimos el signo aquí
angulo2 = math.radians((i + 1) * (360 / num_points))
x2 = int(x_center + radius_background * math.cos(angulo2))
y2 = int(y_center - radius_background * math.sin(angulo2)) # Invertimos el signo aquí
oled.line(x1, y1, x2, y2, 1)
# Mapea el valor del ADC al rango de 0 a 180 grados
angulo = (valor_adc2 / 180) * math.pi
# Calcula las coordenadas para dibujar el puntero
radius_pointer = 30 # Radio del puntero
x_pointer = int(x_center + radius_pointer * math.cos(angulo))
y_pointer = int(y_center - radius_pointer * math.sin(angulo)) # Invertimos el signo aquí
# Dibuja el puntero del medidor analógico
oled.line(x_center, y_center, x_pointer, y_pointer, 1)
# Calcula el valor ADC2 y su conversión
valor_adc2_converted = adc2.read_u16() * 5.15 / 1023.0
res2 = (valor_adc2_converted / (2000 / (2000 + 1000))) / 100
# Muestra el valor del ADC como texto en el display
oled.text("res: {:.2f}".format(res2), 0, 0)
oled.text('LMEC458', 0, 57)
oled.show() # Actualiza el display
# Función 3: Muestra el medidor analógico en OLED con el valor del ADC3 (Pin 33)
def funcion3():
valor_adc3 = adc3.read_u16() * 180 / 65535 # Lee el valor del ADC y lo mapea al rango de 0 a 180 grados
oled.fill(0) # Borra el contenido anterior del display
# Dibuja la circunferencia de fondo
x_center, y_center = 64, 50 # Centro del círculo
radius_background = 40 # Radio de la circunferencia de fondo
num_points = 200 # Número de puntos para dibujar la circunferencia completa
for i in range(num_points):
angulo = math.radians(i * (360 / num_points))
x1 = int(x_center + radius_background * math.cos(angulo))
y1 = int(y_center - radius_background * math.sin(angulo)) # Invertimos el signo aquí
angulo2 = math.radians((i + 1) * (360 / num_points))
x2 = int(x_center + radius_background * math.cos(angulo2))
y2 = int(y_center - radius_background * math.sin(angulo2)) # Invertimos el signo aquí
oled.line(x1, y1, x2, y2, 1)
# Mapea el valor del ADC al rango de 0 a 180 grados
angulo = (valor_adc3 / 180) * math.pi
# Calcula las coordenadas para dibujar el puntero
radius_pointer = 30 # Radio del puntero
x_pointer = int(x_center + radius_pointer * math.cos(angulo))
y_pointer = int(y_center - radius_pointer * math.sin(angulo)) # Invertimos el signo aquí
# Dibuja el puntero del medidor analógico
oled.line(x_center, y_center, x_pointer, y_pointer, 1)
# Calcula el valor ADC3 y su conversión
valor_adc3_converted = adc3.read_u16() * 5.15 / 1023.0
res3 = (valor_adc3_converted / (2000 / (2000 + 1000))) / 100
# Muestra el valor del ADC como texto en el display
oled.text("corriente: {:.2f}".format(res3), 0, 0)
oled.text('LMEC458', 0, 57)
oled.show() # Actualiza el display
# Bucle principal
while True:
if boton1.value() == 1: # Si el primer botón está presionado (normalmente HIGH, LOW cuando presionado)
funcion1()
if boton2.value() == 1: # Si el segundo botón está presionado (normalmente HIGH, LOW cuando presionado)
funcion2()
if boton3.value() == 1: # Si el tercer botón
funcion3()