#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SoftwareSerial.h>
Adafruit_SSD1306 display(128, 32, &Wire, -1);
// Pin 11 = RX (conecta al TX del puente), Pin 12 = TX (conecta al RX del puente)
SoftwareSerial btSerial(11, 12);
const int pinR = 6; // Rojo
const int pinG = 9; // Verde
const int pinB = 5; // CAMBIADO AL PIN 5 para evitar conflictos con SoftwareSerial
int modoActual = -1;
unsigned long tiempoInicio = 0;
void setup() {
Serial.begin(9600); // Solo para depuración en tu consola local
btSerial.begin(9600); // Lee DIRECTAMENTE el hardware externo desde los pines 11 y 12
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinB, OUTPUT);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("ERROR: OLED no encontrado");
while(1);
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
display.setCursor(0, 10);
display.println("Esperando al Cubo...");
display.display();
Serial.println("=== BASE RECEPTORA INICIADA ===");
}
void loop() {
// Leer datos directamente procesados por los pines de SoftwareSerial (11 y 12)
if (btSerial.available()) {
char dato = btSerial.read();
if (dato == '\n' || dato == '\r') {
return;
}
if (dato >= '0' && dato <= '5') {
int cara = dato - '0';
Serial.print("Recibido exitosamente: ");
Serial.println(cara);
modoActual = cara;
tiempoInicio = millis();
actualizarLED(modoActual);
}
}
// Actualizar pantalla con cronómetro
if (modoActual != -1) {
unsigned long segsTotales = (millis() - tiempoInicio) / 1000;
int horas = segsTotales / 3600;
int minutos = (segsTotales % 3600) / 60;
int segundos = segsTotales % 60;
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 8);
display.print("MODE:");
display.setTextSize(2);
display.setCursor(32, 18);
if (horas < 10) display.print("0");
display.print(horas);
display.print(":");
if (minutos < 10) display.print("0");
display.print(minutos);
display.print(":");
if (segundos < 10) display.print("0");
display.print(segundos);
display.setTextSize(2);
display.setCursor(32, 1);
switch (modoActual) {
case 0: display.print("ESTUDI"); break;
case 1: display.print("RELAX"); break;
case 2: display.print("TREBALL"); break;
case 3: display.print("OCI"); break;
case 4: display.print("LECTURA"); break;
case 5: display.print("PAUSA"); break;
}
display.display();
}
delay(100);
}
void actualizarLED(int modo) {
digitalWrite(pinR, LOW);
digitalWrite(pinG, LOW);
digitalWrite(pinB, LOW);
switch (modo) {
case 0: analogWrite(pinB, 255); break; // ESTUDI - Azul
case 1: analogWrite(pinR, 255); analogWrite(pinB, 255); break; // RELAX - Rosa
case 2: analogWrite(pinG, 255); break; // TREBALL - Verde
case 3: analogWrite(pinR, 255); analogWrite(pinG, 255); break; // OCI - Amarillo
case 4: analogWrite(pinG, 255); analogWrite(pinB, 255); break; // LECTURA - Cian
case 5: analogWrite(pinR, 255); break; // PAUSA - Rojo
}
}