############################
# E072_4X7SEG_74HC595_RTC.PY: Gestiona 4x7 segmentos con 74hc595© y RTC
# ENTRADAS: GPIO, tiempos y RTC DS1307©
# SALIDAS: HH:MM en 4x7 segmentos
############################
from machine import Pin, SoftI2C # Gestión del GPIO
import time # Control de tiempos
import ds1307 # Control RTC
# Define los pines DS, ST_CP y SH_CP para 74hc595©
ds_pin = Pin(25, Pin.OUT) # Datos
sh_cp_pin = Pin(32, Pin.OUT) # Desplazamiento
st_cp_pin = Pin(33, Pin.OUT) # Almacenamiento
# Define los pines SDA y SCL bus I2C del RTC
scl_pin = Pin(21, Pin.OUT) # Reloj
sda_pin = Pin(22, Pin.OUT) # Datos
# Inicialización del RTC DS1307© bus I2C
i2c = SoftI2C(sda=Pin(sda_pin), scl=Pin(scl_pin))
rtc = ds1307.DS1307(i2c)
# Parámetros
tmp = .5 # Tiempo de transición 1/2 segundo
n_mod = 4 # Número de módulos
# Códigos 7 segmentos
codigo = [
0b00111111, # 0
0b00000110, # 1
0b01011011, # 2
0b01001111, # 3
0b01100110, # 4
0b01101101, # 5
0b01111101, # 6
0b00000111, # 7
0b01111111, # 8
0b01101111, # 9
0b10000000, # pto
0b01110111, # A
0b01111100, # B
0b00111001, # C
0b01011110, # D
0b01111001, # E
0b01110001, # F
0b00000000 # blanco
]
# Envía un byte al shift-register 74hc595
def ver(data):
for i in range(8*n_mod, -1, -1): # Envía los bits: MSB a LSB
bit = (data >> i) & 0x01 # Bit i-ésimo del byte
ds_pin.value(bit) # DS=bit i-ésimo
sh_cp_pin.value(1) # Sube SH_CP (desplaza)
time.sleep_us(1) # Espera corta
sh_cp_pin.value(0) # Baja SH_CP
st_cp_pin.value(1) # Sube ST_CP (almacena)
time.sleep_us(1) # Espera corta
st_cp_pin.value(0) # Baja ST_CP
# Bucle principal
if __name__ == "__main__":
print('RTC CON 74HC595© y DS1307©')
print('Visualiza HH:MM...')
# Buscando DS1307© en bus I2C
print('Escaneando bus...')
print(f'RTC en: {hex(i2c.scan()[0])}')
print('Visualizando hora...')
try:
while True: # Bucle principal
datos = rtc.datetime()
hora = datos[4]
minuto = datos[5]
numero = str(hora)+str(minuto)
m, c, d, u = map(int, str(numero))
ver_sin = codigo[m]<<24|codigo[c]<<16|codigo[d]<<8|codigo[u]
ver_con = ver_sin | codigo[10] # Añado punto
ver(ver_con) # Veo con punto
time.sleep(tmp) # Espera
ver(ver_sin) # Veo sin punto
time.sleep(tmp) # Espera
except KeyboardInterrupt:
print('Programa finalizado')
ver(0) # Apaga LED
Loading
esp32-devkit-c-v4
esp32-devkit-c-v4