#include #include #include // ====== WIFI & MQTT CONFIG ====== const char* ssid = "Oskar"; const char* password = "claritabonita"; const char* mqtt_server = "89.116.24.168"; const int mqtt_port = 31160; const char* mqtt_user = "oskar"; const char* mqtt_password = ""; const char* topic_pub = "xiao/mensaje"; const char* topic_sub = "xiao/servo"; // ================================= // ====== LED RINGS CONFIG ====== #define NUM_LEDS 12 #define BRIGHTNESS 10 #define PIN_OJO_IZQ 4 #define PIN_OJO_DER 3 #define PIN_BOCA 2 CRGB ojoIzq[NUM_LEDS]; CRGB ojoDer[NUM_LEDS]; CRGB boca[NUM_LEDS]; // =============================== WiFiClient espClient; PubSubClient client(espClient); // ====== LED FUNCTIONS ====== void mostrar() { FastLED.show(); } void apagarTodo() { fill_solid(ojoIzq, NUM_LEDS, CRGB::Black); fill_solid(ojoDer, NUM_LEDS, CRGB::Black); fill_solid(boca, NUM_LEDS, CRGB::Black); mostrar(); } void ojos(CRGB color) { fill_solid(ojoIzq, NUM_LEDS, color); fill_solid(ojoDer, NUM_LEDS, color); mostrar(); } void bocaAzul() { fill_solid(boca, NUM_LEDS, CRGB::Black); for (int i = 3; i <= 8; i++) { boca[i] = CRGB::Blue; } mostrar(); } void caraNormal() { fill_solid(ojoIzq, NUM_LEDS, CRGB::Blue); fill_solid(ojoDer, NUM_LEDS, CRGB::Blue); fill_solid(boca, NUM_LEDS, CRGB::Black); for (int i = 3; i <= 8; i++) { boca[i] = CRGB::Blue; } mostrar(); } void caraRoja() { fill_solid(ojoIzq, NUM_LEDS, CRGB::Red); fill_solid(ojoDer, NUM_LEDS, CRGB::Red); bocaAzul(); } void caraVerde() { fill_solid(ojoIzq, NUM_LEDS, CRGB::Green); fill_solid(ojoDer, NUM_LEDS, CRGB::Green); bocaAzul(); } void caraBlanca() { fill_solid(ojoIzq, NUM_LEDS, CRGB::White); fill_solid(ojoDer, NUM_LEDS, CRGB::White); bocaAzul(); } void parpadeo() { fill_solid(ojoIzq, NUM_LEDS, CRGB::Black); fill_solid(ojoDer, NUM_LEDS, CRGB::Black); bocaAzul(); delay(200); fill_solid(ojoIzq, NUM_LEDS, CRGB::Blue); fill_solid(ojoDer, NUM_LEDS, CRGB::Blue); bocaAzul(); } void hablar() { fill_solid(boca, NUM_LEDS, CRGB::Black); for (int i = 0; i < NUM_LEDS; i += 2) { boca[i] = CRGB::Blue; } mostrar(); delay(150); fill_solid(boca, NUM_LEDS, CRGB::Blue); mostrar(); delay(150); bocaAzul(); } // ====== WIFI ====== void connectWiFi() { WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } } // ====== MQTT CALLBACK ====== void mqttCallback(char* topic, byte* payload, unsigned int length) { String message = ""; for (unsigned int i = 0; i < length; i++) { message += (char)payload[i]; } message.trim(); message.toLowerCase(); if (message == "normal") { caraNormal(); client.publish(topic_pub, "Face normal"); } else if (message == "red") { caraRoja(); client.publish(topic_pub, "Face red"); } else if (message == "green") { caraVerde(); client.publish(topic_pub, "Face green"); } else if (message == "white") { caraBlanca(); client.publish(topic_pub, "Face white"); } else if (message == "off") { apagarTodo(); client.publish(topic_pub, "Face off"); } else if (message == "blink") { parpadeo(); client.publish(topic_pub, "Blink"); } else if (message == "talk") { hablar(); client.publish(topic_pub, "Mouth talking"); } else if (message == "eyes_red") { ojos(CRGB::Red); bocaAzul(); client.publish(topic_pub, "Eyes red"); } else if (message == "eyes_blue") { ojos(CRGB::Blue); bocaAzul(); client.publish(topic_pub, "Eyes blue"); } else if (message == "mouth_blue") { bocaAzul(); client.publish(topic_pub, "Mouth blue"); } else { client.publish(topic_pub, "Commands: normal, red, green, white, off, blink, talk, eyes_red, eyes_blue, mouth_blue"); } } // ====== MQTT CONNECT ====== void connectMQTT() { while (!client.connected()) { String clientId = "XIAO-ESP32S3-"; clientId += String((uint32_t)ESP.getEfuseMac(), HEX); bool connected; if (strlen(mqtt_user) > 0) { connected = client.connect(clientId.c_str(), mqtt_user, mqtt_password); } else { connected = client.connect(clientId.c_str()); } if (connected) { client.subscribe(topic_sub); client.publish(topic_pub, "XIAO ESP32-S3 face connected"); } else { delay(5000); } } } // ====== SETUP ====== void setup() { FastLED.addLeds(ojoIzq, NUM_LEDS); FastLED.addLeds(ojoDer, NUM_LEDS); FastLED.addLeds(boca, NUM_LEDS); FastLED.setBrightness(BRIGHTNESS); FastLED.clear(); FastLED.show(); caraNormal(); connectWiFi(); client.setServer(mqtt_server, mqtt_port); client.setCallback(mqttCallback); client.setKeepAlive(60); client.setSocketTimeout(10); } // ====== LOOP ====== void loop() { if (WiFi.status() != WL_CONNECTED) { connectWiFi(); } if (!client.connected()) { connectMQTT(); } client.loop(); }