from machine import Pin, SoftI2C
import ssd1306
import math
# Define los pines SCL y SDA para la conexión I2C
scl_pin = Pin(22) # Pin 22 para SCL: Define el pin físico en el ESP32 que se usará para la señal de reloj I2C (SCL).
sda_pin = Pin(21) # Pin 21 para SDA: Define el pin físico en el ESP32 que se usará para la señal de datos I2C (SDA).
# Inicializa la conexión I2C usando SoftI2C
i2c = SoftI2C(scl=scl_pin, sda=sda_pin)
# SoftI2C: Crea una instancia del objeto SoftI2C, que permite la comunicación I2C usando los pines definidos.
# scl=scl_pin: Asocia el pin para la señal de reloj (SCL) a la instancia de I2C.
# sda=sda_pin: Asocia el pin para la señal de datos (SDA) a la instancia de I2C.
# Inicializa la pantalla OLED (128x64 píxeles)
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# ssd1306.SSD1306_I2C: Crea una instancia del objeto SSD1306_I2C, que maneja la pantalla OLED.
# 128: Ancho de la pantalla en píxeles.
# 64: Alto de la pantalla en píxeles.
# i2c: La instancia de comunicación I2C que se usará para controlar la pantalla.
# Limpia la pantalla antes de cualquier operación
oled.fill(0)
# oled.fill(0): Rellena toda la pantalla OLED con el valor 0 (negro), borrando cualquier contenido previo.
# Centro del círculo
center_x = 64 # Coordenada X del centro del círculo: Define el centro horizontal del círculo en la pantalla.
center_y = 32 # Coordenada Y del centro del círculo: Define el centro vertical del círculo en la pantalla.
# Radios de los círculos
outer_radius = 20 # Radio del círculo exterior (blanco): Define el radio del círculo más grande.
inner_ring_radius = 16 # Radio del anillo interior (negro): Define el radio del anillo negro que se dibuja dentro del círculo exterior.
inner_circle_radius = 10 # Radio del círculo central (blanco): Define el radio del círculo más pequeño en el centro.
# Radio y altura de la corona
crown_radius = 8 # Radio de la corona (blanca): Define el radio de la forma de la corona en la parte superior.
crown_height = 5 # Altura de la corona (blanca): Define la altura vertical de la corona.
# Dibujar el círculo exterior (blanco)
for x in range(128): # Recorre cada píxel horizontalmente: Itera a través de cada posición horizontal en la pantalla.
for y in range(64): # Recorre cada píxel verticalmente: Itera a través de cada posición vertical en la pantalla.
# Calcula la distancia desde el centro del círculo
distance_from_center = (x - center_x) ** 2 + (y - center_y) ** 2
# (x - center_x): Calcula la diferencia horizontal entre el píxel actual y el centro del círculo.
# (y - center_y): Calcula la diferencia vertical entre el píxel actual y el centro del círculo.
# (x - center_x) ** 2 + (y - center_y) ** 2: Calcula la distancia euclidiana al cuadrado desde el centro del círculo.
# Comprueba si el píxel está dentro del círculo exterior
if distance_from_center <= outer_radius ** 2:
oled.pixel(x, y, 1) # Enciende el píxel (blanco): Establece el píxel en blanco si está dentro del círculo exterior.
# Apagar el anillo interior (negro)
for x in range(128): # Recorre cada píxel horizontalmente: Itera a través de cada posición horizontal en la pantalla.
for y in range(64): # Recorre cada píxel verticalmente: Itera a través de cada posición vertical en la pantalla.
# Calcula la distancia desde el centro del círculo
distance_from_center = (x - center_x) ** 2 + (y - center_y) ** 2
# Comprueba si el píxel está en el anillo interior
if inner_circle_radius ** 2 < distance_from_center <= inner_ring_radius ** 2:
oled.pixel(x, y, 0) # Apaga el píxel (negro): Establece el píxel en negro si está en el anillo interior.
# Dibujar el círculo central blanco
for x in range(128): # Recorre cada píxel horizontalmente: Itera a través de cada posición horizontal en la pantalla.
for y in range(64): # Recorre cada píxel verticalmente: Itera a través de cada posición vertical en la pantalla.
# Calcula la distancia desde el centro del círculo
distance_from_center = (x - center_x) ** 2 + (y - center_y) ** 2
# Comprueba si el píxel está dentro del círculo central
if distance_from_center <= inner_circle_radius ** 2:
oled.pixel(x, y, 1) # Enciende el píxel (blanco): Establece el píxel en blanco si está dentro del círculo central.
# Dibujar la corona en la parte superior del círculo exterior
crown_top = center_y - outer_radius - crown_height # Posición vertical de la parte superior de la corona
# (center_y - outer_radius): Calcula la posición vertical inferior del círculo exterior.
# (center_y - outer_radius - crown_height): Calcula la posición vertical superior de la corona.
for x in range(center_x - outer_radius - crown_radius - 1, center_x + outer_radius + crown_radius + 1): # Recorre cada píxel horizontalmente en el área de la corona
for y in range(crown_top, center_y - outer_radius): # Recorre cada píxel verticalmente en el área de la corona
# Calcula la distancia desde el centro del círculo para la corona
distance_from_center = (x - center_x) ** 2 + (y - crown_top) ** 2
# Comprueba si el píxel está dentro de la corona
if distance_from_center <= crown_radius ** 2:
oled.pixel(x, y, 1) # Enciende el píxel (blanco): Establece el píxel en blanco si está dentro del área de la corona.
# Escribir "Fc" dentro del círculo central con color negro (apagar los píxeles)
oled.text('F', center_x - 6, center_y - 4, 0) # Coordenadas ajustadas para centrar la "F" en el círculo central
# oled.text: Dibuja texto en la pantalla OLED.
# 'F': El carácter que se va a mostrar.
# center_x - 6: Coordenada X de la posición de la "F" ajustada para centrarla horizontalmente.
# center_y - 4: Coordenada Y de la posición de la "F" ajustada para centrarla verticalmente.
# 0: Color del texto, en este caso negro.
oled.text('C', center_x + 2, center_y - 4, 0) # Coordenadas ajustadas para centrar la "C" en el círculo central
# oled.text: Dibuja texto en la pantalla OLED.
# 'C': El carácter que se va a mostrar.
# center_x + 2: Coordenada X de la posición de la "C" ajustada para centrarla horizontalmente.
# center_y - 4: Coordenada Y de la posición de la "C" ajustada para centrarla verticalmente.
# 0: Color del texto, en este caso negro.
# Mostrar la imagen en la pantalla OLED
oled.show() # Actualiza la pantalla OLED para mostrar el dibujo completo.