1️⃣ Análisis lógico del sketch (posibles fallos)

🔴 Problema grave detectado (no es de lógica, es eléctrico + firmware):

Estás usando el pin 12 como botón:

const byte btnPins[11] = { 2, 4, 5, 6, 7, 8, A0, A1, A2, A3, 12 };

👉 Pin 12 = MISO (SPI)
En Arduino Pro Mini / UNO, ese pin interviene durante el reset y la carga, y además:

  • Es entrada de alta impedancia
  • Puede oscilar si el cable es largo
  • Si lo llevas a GND con un botón → reseteos espurios

💥 Síntomas que explican exactamente lo que ves:

  • Al presionar cualquier botón → reset
  • LEDs se borran solos
  • A veces solo responde un PCF
  • Comportamiento errático

📌 Conclusión:
👉 NO uses el pin 12 como botón.
Muévelo a A6 o A7 (solo entrada, perfectos para esto). 

✅ 2) Sobre las “sugerencias nuevas”

Tienes razón en algo importante, y vale la pena decirlo claro:

“Antes no me dijiste eso y funcionaba”

✔️ Correcto.
Porque antes el sistema no estaba al límite.

Lo que pasó ahora fue esto (típico en hardware):

  • Micro nuevo
  • PCF nuevos
  • Posiblemente:
    • cables distintos
    • longitudes distintas
    • otro Pro Mini (clon diferente)
    • otro regulador
    • otra fuente

📌 Conclusión:
Un sistema que “antes funcionaba” puede empezar a fallar sin tocar el código, cuando:

  • usas pines delicados (pin 12)
  • el margen eléctrico se achica

Por eso ahora aparecen resets espurios que antes no se manifestaban.

✅ 3) Lo que acabas de confirmar es CLAVE

“Los PCF encienden los LEDs al arrancar un segundo y luego los apagan perfectamente”

Eso es exactamente lo que debería pasar:

  1. PCF arranca con pines en HIGH (por diseño)
  2. Wire.begin()
  3. apagarTodosLEDs() → LOW
  4. Sistema estable

👉 Eso demuestra que:

  • El bus I2C está bien
  • Las direcciones 0x20 y 0x21 están bien
  • El código I2C está bien
  • Los PCF están sanos

Si luego se descontrola → reset, no error lógico.

✅ 4) Cambio del pin 12 → A6

Este paso es la decisión correcta.

A6:

  • ✔️ Solo entrada
  • ✔️ Sin funciones especiales
  • ✔️ Ideal para botón
  • ✔️ No interfiere con reset, SPI ni arranque

⚠️ Solo recuerda:

  • A6 NO tiene INPUT_PULLUP interno
  • Debe tener resistencia externa (10k a VCC o a GND según lógica)

🧠 Diagnóstico final (muy claro)

ElementoEstado
TPIC ✅ Intocable, correcto
PCF ✅ Funcionan bien
Código ✅ Lógico y estable
OLED ❌ Eliminada, bien
Pin 12 ❌ Causa del problema
Resets ❌ Espurios

👉 Cambias ese botón a A6, grabas, y el sistema vuelve a la normalidad.

Cuando hagas la prueba:

  • Si ya no se borra
  • Si ya no se resetea
  • Si los LEDs quedan fijos como deben

entonces el caso queda cerrado técnicamente ✔️

Quedo atento a tu veredicto final.

Perfecto, gracias por el contexto: con eso ya se ve claro el problema 👍
Voy por partes, directo y sin rodeos como te gusta.

 

4️⃣ Recomendaciones físicas (MUY importantes)

✔️ Reset

  • Pull-up de 10k a VCC en RESET (si no lo tiene ya)
  • Capacitor 100nF a GND cerca del pin

✔️ I2C

  • Pull-ups 4.7k en SDA y SCL
  • Cables cortos

✔️ PCF

  • No dejes pines flotando
  • LEDs siempre con resistencia

✔️ Fuente

  • Si alimentas TPIC + PCF + LEDs → desacople obligatorio
    • 100nF + 10µF cerca de cada chip

🔚 Conclusión clara

  • ❌ El problema NO es tu lógica
  • ❌ NO son los PCF
  • ❌ NO es el TPIC
  • ✅ Es uso indebido del pin 12 + rebotes + resets espurios

Cambias ese pin, grabas este sketch y el sistema vuelve a ser una roca.