#!/usr/bin/env python3 """ Genera el diagrama de conexión completo para la placa ESP32 CYD: - 2x Sensores de temperatura DS18B20 en conector CN1 (1-Wire GPIO 22) - 1x Módulo GPS N32+ / U-blox en conectores P1 y P3 (5V, GND, GPIO 35 RX, GPIO 1 TX) """ from PIL import Image, ImageDraw, ImageFont import os W, H = 1060, 750 im = Image.new("RGB", (W, H), (11, 15, 25)) # Sleek dark navy draw = ImageDraw.Draw(im) # Load fonts try: font_title = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 18) font_subtitle = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 12) font_sec = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 13) font_bold = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 11) font_reg = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 11) font_small = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 10) font_tiny = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 9) except Exception: font_title = ImageFont.load_default() font_subtitle = font_sec = font_bold = font_reg = font_small = font_tiny = font_title # Helper for drawing rounded boxes def draw_card(box, fill, outline, radius=6): draw.rounded_rectangle(box, radius=radius, fill=fill, outline=outline, width=1) # Color palette C_BG = (11, 15, 25) C_CARD = (20, 26, 42) C_CARD_BORDER = (45, 58, 88) C_CARD_HEADER = (28, 36, 58) C_TEXT_WHITE = (240, 243, 248) C_TEXT_MUTED = (140, 153, 175) C_TEXT_CYAN = (0, 210, 255) # Wire Colors COLOR_VCC_3V3 = (255, 75, 75) # Red (3.3V Sensores) COLOR_GND_DS = (40, 130, 255) # Blue (GND Sensores) COLOR_DATA_DS = (245, 195, 35) # Gold / Yellow (Datos Sensores) # GPS Wire Colors (Matching User's physical soldered cable) COLOR_GPS_VCC = (255, 120, 20) # Cable Naranja (Pad V y EN puenteados) COLOR_GPS_TX = (35, 130, 245) # Cable Azul (Pad T / TX del GPS) COLOR_GPS_RX = (235, 240, 250) # Cable Blanco (Pad R / RX del GPS) COLOR_GPS_GND = (40, 200, 110) # Cable Verde (Pad G / GND del GPS) # ------------------------------------------------------------- # 1. HEADER # ------------------------------------------------------------- draw.text((35, 20), "DIAGRAMA DE CONEXION: SENSORES DS18B20 Y MODULO GPS A PLACA CYD", fill=C_TEXT_WHITE, font=font_title) draw.text((35, 45), "ESP32-2432S028 (CYD 2.8\" TFT) - Conectores Traseros CN1, P1 (Alimentación / TX) y P3 (RX)", fill=C_TEXT_CYAN, font=font_subtitle) draw.line([(35, 68), (W - 35, 68)], fill=(35, 46, 72), width=1) # ------------------------------------------------------------- # 2. SECCIÓN IZQUIERDA ARRIBA: SENSORES DS18B20 # ------------------------------------------------------------- ds_panel_box = [35, 80, 520, 315] draw_card(ds_panel_box, (15, 20, 34), C_CARD_BORDER, radius=8) draw.text((50, 92), "1. BUS 1-WIRE: TEMPERATURA INTERIOR Y EXTERIOR", fill=(100, 215, 255), font=font_sec) # Sensor 1 (Interior) s1_box = [50, 120, 175, 195] draw_card(s1_box, (24, 32, 50), (60, 75, 105), radius=5) draw.text((70, 126), "SENSOR 1", fill=(100, 215, 255), font=font_bold) draw.text((72, 142), "DS18B20", fill=C_TEXT_WHITE, font=font_reg) draw.text((68, 158), "Habitaculo", fill=C_TEXT_MUTED, font=font_small) draw.text((68, 172), "(Cara plana)", fill=(100, 115, 135), font=font_tiny) # Sensor 2 (Exterior) s2_box = [205, 120, 330, 195] draw_card(s2_box, (24, 32, 50), (60, 75, 105), radius=5) draw.text((225, 126), "SENSOR 2", fill=(100, 215, 255), font=font_bold) draw.text((227, 142), "DS18B20", fill=C_TEXT_WHITE, font=font_reg) draw.text((229, 158), "Exterior", fill=C_TEXT_MUTED, font=font_small) draw.text((223, 172), "(Cara plana)", fill=(100, 115, 135), font=font_tiny) # Pines Sensor 1 p1_s1 = (72, 195) p2_s1 = (112, 195) p3_s1 = (152, 195) draw.text((65, 200), "P1:GND", fill=COLOR_GND_DS, font=font_tiny) draw.text((106, 200), "P2:DQ", fill=COLOR_DATA_DS, font=font_tiny) draw.text((144, 200), "P3:VCC", fill=COLOR_VCC_3V3, font=font_tiny) # Pines Sensor 2 p1_s2 = (227, 195) p2_s2 = (267, 195) p3_s2 = (307, 195) draw.text((220, 200), "P1:GND", fill=COLOR_GND_DS, font=font_tiny) draw.text((261, 200), "P2:DQ", fill=COLOR_DATA_DS, font=font_tiny) draw.text((299, 200), "P3:VCC", fill=COLOR_VCC_3V3, font=font_tiny) # Resistencia 4.7k res_box = [370, 235, 415, 265] draw_card(res_box, (220, 200, 160), (140, 120, 80), radius=3) # Bandas de color de 4.7k (Amarillo, Violeta, Rojo, Dorado) draw.line([(380, 235), (380, 265)], fill=(240, 210, 20), width=3) # Amarillo (4) draw.line([(388, 235), (388, 265)], fill=(150, 40, 180), width=3) # Violeta (7) draw.line([(396, 235), (396, 265)], fill=(220, 30, 30), width=3) # Rojo (x100) draw.line([(406, 235), (406, 265)], fill=(210, 175, 55), width=2) # Dorado (+-5%) draw.text((352, 218), "Resistencia 4.7k", fill=C_TEXT_WHITE, font=font_bold) draw.text((362, 272), "(Pull-up)", fill=C_TEXT_MUTED, font=font_small) # Wires DS18B20: # GND (Azul) - Pata 1 de ambos draw.line([(p1_s1[0], 215), (p1_s1[0], 285)], fill=COLOR_GND_DS, width=2) draw.line([(p1_s2[0], 215), (p1_s2[0], 285)], fill=COLOR_GND_DS, width=2) draw.line([(p1_s1[0], 285), (540, 285)], fill=COLOR_GND_DS, width=2) draw.ellipse([p1_s1[0]-3, 285-3, p1_s1[0]+3, 285+3], fill=COLOR_GND_DS) draw.ellipse([p1_s2[0]-3, 285-3, p1_s2[0]+3, 285+3], fill=COLOR_GND_DS) # DQ Datos (Amarillo) - Pata 2 de ambos draw.line([(p2_s1[0], 215), (p2_s1[0], 255)], fill=COLOR_DATA_DS, width=2) draw.line([(p2_s2[0], 215), (p2_s2[0], 255)], fill=COLOR_DATA_DS, width=2) draw.line([(p2_s1[0], 255), (370, 255)], fill=COLOR_DATA_DS, width=2) draw.line([(415, 255), (540, 255)], fill=COLOR_DATA_DS, width=2) draw.ellipse([p2_s1[0]-3, 255-3, p2_s1[0]+3, 255+3], fill=COLOR_DATA_DS) draw.ellipse([p2_s2[0]-3, 255-3, p2_s2[0]+3, 255+3], fill=COLOR_DATA_DS) # VCC 3.3V (Rojo) - Pata 3 de ambos y conectado al otro extremo de resistencia 4.7k draw.line([(p3_s1[0], 215), (p3_s1[0], 230)], fill=COLOR_VCC_3V3, width=2) draw.line([(p3_s2[0], 215), (p3_s2[0], 230)], fill=COLOR_VCC_3V3, width=2) draw.line([(p3_s1[0], 230), (540, 230)], fill=COLOR_VCC_3V3, width=2) draw.ellipse([p3_s1[0]-3, 230-3, p3_s1[0]+3, 230+3], fill=COLOR_VCC_3V3) draw.ellipse([p3_s2[0]-3, 230-3, p3_s2[0]+3, 230+3], fill=COLOR_VCC_3V3) draw.line([(392, 235), (392, 230)], fill=COLOR_VCC_3V3, width=2) draw.ellipse([392-3, 230-3, 392+3, 230+3], fill=COLOR_VCC_3V3) # ------------------------------------------------------------- # 3. SECCIÓN IZQUIERDA ABAJO: MODULO GPS (FOTO REAL / PADS V, EN, T, R, G, VB) # ------------------------------------------------------------- gps_panel_box = [35, 335, 520, 560] draw_card(gps_panel_box, (15, 20, 34), C_CARD_BORDER, radius=8) draw.text((50, 347), "2. MODULO GPS N32+ / U-BLOX (TUS CABLES SOLDADOS)", fill=(100, 255, 160), font=font_sec) # Modulo GPS Box gps_body_box = [50, 375, 255, 545] draw_card(gps_body_box, (20, 38, 70), (40, 80, 140), radius=6) draw.text((65, 382), "MODULO GPS", fill=C_TEXT_WHITE, font=font_bold) draw.text((65, 396), "N32+ (Foto Real)", fill=C_TEXT_CYAN, font=font_tiny) # Antena Cerámica cuadrada en el módulo ant_box = [62, 415, 140, 495] draw_card(ant_box, (180, 145, 60), (120, 95, 35), radius=4) draw.ellipse([94, 448, 106, 460], fill=(230, 230, 230), outline=(100, 100, 100)) draw.text((65, 500), "Antena GPS", fill=C_TEXT_MUTED, font=font_tiny) # Pila de botón abajo a la derecha draw.ellipse([80, 516, 102, 538], fill=(195, 202, 212), outline=(130, 135, 145)) draw.text((108, 522), "VB: Pila Backup", fill=(140, 155, 175), font=font_tiny) # Pines del GPS (en el lateral derecho del módulo x=255) gps_p_vcc = (255, 395) gps_p_tx = (255, 435) gps_p_rx = (255, 470) gps_p_gnd = (255, 505) draw.text((150, 387), "V+EN (5V)", fill=COLOR_GPS_VCC, font=font_bold) draw.text((150, 399), "[Naranja]", fill=COLOR_GPS_VCC, font=font_tiny) draw.text((150, 427), "T: TX", fill=COLOR_GPS_TX, font=font_bold) draw.text((150, 439), "[Azul]", fill=COLOR_GPS_TX, font=font_tiny) draw.text((150, 462), "R: RX", fill=COLOR_GPS_RX, font=font_bold) draw.text((150, 474), "[Blanco]", fill=(200, 205, 215), font=font_tiny) draw.text((150, 497), "G: GND", fill=COLOR_GPS_GND, font=font_bold) draw.text((150, 509), "[Verde]", fill=COLOR_GPS_GND, font=font_tiny) # Puntos de conexión en el borde draw.ellipse([gps_p_vcc[0]-4, gps_p_vcc[1]-4, gps_p_vcc[0]+4, gps_p_vcc[1]+4], fill=COLOR_GPS_VCC) draw.ellipse([gps_p_tx[0]-4, gps_p_tx[1]-4, gps_p_tx[0]+4, gps_p_tx[1]+4], fill=COLOR_GPS_TX) draw.ellipse([gps_p_rx[0]-4, gps_p_rx[1]-4, gps_p_rx[0]+4, gps_p_rx[1]+4], fill=COLOR_GPS_RX) draw.ellipse([gps_p_gnd[0]-4, gps_p_gnd[1]-4, gps_p_gnd[0]+4, gps_p_gnd[1]+4], fill=COLOR_GPS_GND) # Trazado de cables GPS hacia la derecha (todos al conector UART / P1) # Cable Naranja (VCC 5V) -> va a Pin 1 de P1 (x=600, y=278) draw.line([gps_p_vcc, (340, 395), (340, 278), (605, 278)], fill=COLOR_GPS_VCC, width=2) # Cable Blanco (RX GPS) -> va a Pin 2 de P1 (x=600, y=298) draw.line([gps_p_rx, (280, 470), (280, 298), (605, 298)], fill=COLOR_GPS_RX, width=2) # Cable Azul (TX GPS) -> va a Pin 3 de P1 (x=600, y=318) draw.line([gps_p_tx, (300, 435), (300, 318), (605, 318)], fill=COLOR_GPS_TX, width=2) # Cable Verde (GND GPS) -> va a Pin 4 de P1 (x=600, y=338) draw.line([gps_p_gnd, (320, 505), (320, 338), (605, 338)], fill=COLOR_GPS_GND, width=2) # ------------------------------------------------------------- # 4. SECCIÓN DERECHA: PLACA ESP32 CYD (ESP32-2432S028) # ------------------------------------------------------------- cyd_box = [570, 80, 1025, 560] draw_card(cyd_box, (18, 24, 38), (240, 190, 40), radius=10) draw.text((590, 92), "PLACA ESP32 CYD (ESP32-2432S028)", fill=(255, 215, 60), font=font_sec) draw.text((590, 110), "Vista de Conectores Traseros JST 1.25mm", fill=C_TEXT_MUTED, font=font_small) # --- CONECTOR CN1 (4 pines) --- cn1_box = [590, 135, 1005, 235] draw_card(cn1_box, (25, 34, 52), (50, 68, 100), radius=6) draw.text((605, 142), "CONECTOR CN1 (Sensores Temperatura 1-Wire)", fill=(100, 215, 255), font=font_bold) draw.rectangle([605, 160, 620, 172], fill=COLOR_VCC_3V3) draw.text((630, 160), "Pin 1: 3.3V (VCC)", fill=C_TEXT_WHITE, font=font_reg) draw.text((760, 160), "<-- Pata 3 de ambos DS18B20", fill=COLOR_VCC_3V3, font=font_small) draw.rectangle([605, 177, 620, 189], fill=(70, 75, 85)) draw.text((630, 177), "Pin 2: (No usar / Libre)", fill=(130, 135, 145), font=font_small) draw.rectangle([605, 194, 620, 206], fill=COLOR_DATA_DS) draw.text((630, 194), "Pin 3: GPIO 22 (Datos)", fill=C_TEXT_WHITE, font=font_reg) draw.text((785, 194), "<-- Pata 2 de ambos DS18B20 + 4.7k", fill=COLOR_DATA_DS, font=font_small) draw.rectangle([605, 211, 620, 223], fill=COLOR_GND_DS) draw.text((630, 211), "Pin 4: GND (Masa)", fill=C_TEXT_WHITE, font=font_reg) draw.text((765, 211), "<-- Pata 1 de ambos DS18B20", fill=COLOR_GND_DS, font=font_small) # Conexion fisica cables CN1 draw.line([(540, 230), (575, 230), (575, 166), (605, 166)], fill=COLOR_VCC_3V3, width=2) draw.line([(540, 255), (570, 255), (570, 200), (605, 200)], fill=COLOR_DATA_DS, width=2) draw.line([(540, 285), (565, 285), (565, 217), (605, 217)], fill=COLOR_GND_DS, width=2) # --- CONECTOR P1 / UART (4 pines: Vin, TX0, RX0, GND) --- p1_box = [590, 245, 1005, 370] draw_card(p1_box, (25, 34, 52), (50, 68, 100), radius=6) draw.text((605, 252), "CONECTOR UART / P1 (Conexion GPS Completa)", fill=(255, 180, 50), font=font_bold) draw.rectangle([605, 272, 620, 284], fill=COLOR_GPS_VCC) draw.text((630, 272), "Pin 1: Vin (5V USB)", fill=C_TEXT_WHITE, font=font_reg) draw.text((760, 272), "<-- Cable Naranja (Pad V+EN GPS)", fill=COLOR_GPS_VCC, font=font_bold) draw.rectangle([605, 292, 620, 304], fill=COLOR_GPS_RX) draw.text((630, 292), "Pin 2: GPIO 1 (TX0)", fill=C_TEXT_WHITE, font=font_reg) draw.text((760, 292), "--> Cable Blanco (Pad R/RX GPS)", fill=(235, 240, 250), font=font_bold) draw.rectangle([605, 312, 620, 324], fill=COLOR_GPS_TX) draw.text((630, 312), "Pin 3: GPIO 3 (RX0)", fill=C_TEXT_WHITE, font=font_reg) draw.text((760, 312), "<-- Cable Azul (Pad T/TX GPS)", fill=COLOR_GPS_TX, font=font_bold) draw.rectangle([605, 332, 620, 344], fill=COLOR_GPS_GND) draw.text((630, 332), "Pin 4: GND (Masa)", fill=C_TEXT_WHITE, font=font_reg) draw.text((760, 332), "<-- Cable Verde (Pad G/GND GPS)", fill=COLOR_GPS_GND, font=font_bold) # --- CONECTOR P3 (4 pines: 3.3V, GND, GPIO 35, GPIO 21) --- p3_box = [590, 380, 1005, 545] draw_card(p3_box, (25, 34, 52), (50, 68, 100), radius=6) draw.text((605, 387), "CONECTOR P3 (Libre / GPIOs Auxiliares)", fill=(100, 255, 160), font=font_bold) draw.rectangle([605, 407, 620, 419], fill=(70, 75, 85)) draw.text((630, 407), "Pin 1: 3.3V (Libre)", fill=(130, 135, 145), font=font_small) draw.rectangle([605, 427, 620, 439], fill=(70, 75, 85)) draw.text((630, 427), "Pin 2: GND (Masa auxiliar)", fill=(130, 135, 145), font=font_small) draw.rectangle([605, 447, 620, 459], fill=(70, 75, 85)) draw.text((630, 447), "Pin 3: GPIO 35 (Libre)", fill=(130, 135, 145), font=font_small) draw.rectangle([605, 467, 620, 479], fill=(70, 75, 85)) draw.text((630, 467), "Pin 4: GND / IO21 (Libre)", fill=(130, 135, 145), font=font_small) # ------------------------------------------------------------- # 5. RESUMEN DE CONEXION RAPIDA (BLOQUE INFERIOR) # ------------------------------------------------------------- summary_box = [35, 575, 1025, 730] draw_card(summary_box, (15, 20, 32), (50, 65, 95), radius=8) draw.text((50, 585), "TABLA RESUMEN DE CONEXIONES EXACTAS PARA TUS CABLES:", fill=C_TEXT_WHITE, font=font_bold) # Columna 1: DS18B20 draw.rectangle([50, 608, 62, 620], fill=COLOR_GND_DS) draw.text((70, 608), "Pata 1 Sensores (Masa) --> Pin 4 de CN1 (GND)", fill=C_TEXT_WHITE, font=font_small) draw.rectangle([50, 628, 62, 640], fill=COLOR_DATA_DS) draw.text((70, 628), "Pata 2 Sensores (Datos) --> Pin 3 de CN1 (GPIO 22) [+ Resistencia 4.7k a 3.3V]", fill=C_TEXT_WHITE, font=font_small) draw.rectangle([50, 648, 62, 660], fill=COLOR_VCC_3V3) draw.text((70, 648), "Pata 3 Sensores (VCC) --> Pin 1 de CN1 (3.3V Corriente)", fill=C_TEXT_WHITE, font=font_small) # Columna 2: GPS (Todo al conector UART / P1) col2_x = 540 draw.rectangle([col2_x, 608, col2_x + 12, 620], fill=COLOR_GPS_VCC) draw.text((col2_x + 20, 608), "Cable NARANJA (Pads V + EN) --> Pin 1 de UART (Vin 5V USB Alimentación)", fill=C_TEXT_WHITE, font=font_small) draw.rectangle([col2_x, 628, col2_x + 12, 640], fill=COLOR_GPS_RX) draw.text((col2_x + 20, 628), "Cable BLANCO (Pad R / RX) --> Pin 2 de UART (GPIO 1 / TX0 Comandos Sleep)", fill=C_TEXT_WHITE, font=font_small) draw.rectangle([col2_x, 648, col2_x + 12, 660], fill=COLOR_GPS_TX) draw.text((col2_x + 20, 648), "Cable AZUL (Pad T / TX) --> Pin 3 de UART (GPIO 3 / RX0 Datos NMEA)", fill=C_TEXT_WHITE, font=font_small) draw.rectangle([col2_x, 668, col2_x + 12, 680], fill=COLOR_GPS_GND) draw.text((col2_x + 20, 668), "Cable VERDE (Pad G / GND) --> Pin 4 de UART (GND / Masa Común)", fill=C_TEXT_WHITE, font=font_small) # Guardar en ambas ubicaciones im.save("hardware/diagrama_conexion_ds18b20.png", "PNG") im.save("diagrama_conexion_ds18b20.png", "PNG") im.save("hardware/diagrama_conexion_hardware.png", "PNG") print("Imagenes generadas exitosamente!")