Comme mqttfastled (Effet cylon sur un bandeau de LED contrôlé par HomeAssistant) mais en mieux (tout en 5v, condensateur)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

145 lines
3.0 KiB

#include "mqttfastledplus.h"
#define FASTLED_ESP8266_NODEMCU_PIN_ORDER
#include <FastLED.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// LED
CRGB leds[NUM_LEDS];
bool ledGo = false;
// WIFI
WiFiClient espClient;
// MQTT
char message_buff[100];
PubSubClient client(espClient);
void setup() {
Serial.begin(SERIAL_SPEED);
Serial.println("\nresetting");
// WIFI
setupWifi();
// MQTT
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callbackMQTT);
testConnectMQTT();
client.subscribe("homeassistant/switch1");
// LED
LEDS.addLeds<CHIPSET,LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
ledBlackAll();
}
// WIFI
void setupWifi() {
Serial.println();
Serial.print("Connexion a ");
Serial.print(wifi_ssid);
WiFi.begin(wifi_ssid, wifi_password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("IP : ");
Serial.println(WiFi.localIP());
}
// MQTT
void testConnectMQTT() {
while (!client.connected()) {
Serial.print("Connexion au serveur MQTT... ");
if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
Serial.println("OK");
} else {
Serial.print("KO, erreur : ");
Serial.print(client.state());
Serial.println(", on attend 5 secondes avant de recommencer");
delay(5000);
}
}
}
// Déclenche les actions à la réception d'un message
void callbackMQTT(char* topic, byte* payload, unsigned int length) {
unsigned int i = 0;
Serial.print("Received [" + String(topic) + "] : ");
// create character buffer with ending null terminator (string)
for(i = 0; i < length; i++) {
message_buff[i] = payload[i];
}
message_buff[i] = '\0';
String msgString = String(message_buff);
Serial.println(msgString);
if (msgString == "ON") {
ledGo = true;
} else {
ledGo = false;
}
}
// LED
void ledCylon()
{
// Effet cylon : on allume une led, on attends, on eteinds, on passe à la suivante
for(int i = 0; i < NUM_LEDS; i++) {
if ((i % 10) == 0) {
client.loop();
}
leds[i] = CRGB::Red;
FastLED.show();
FastLED.delay(1000 / FRAMES_PER_SECOND);
leds[i] = CRGB::Black;
FastLED.show();
FastLED.delay(1000 / FRAMES_PER_SECOND);
}
for(int i = NUM_LEDS - 1; i > 0; i--) {
if ((i % 10) == 0) {
client.loop();
}
leds[i] = CRGB::Red;
FastLED.show();
FastLED.delay(1000 / FRAMES_PER_SECOND);
leds[i] = CRGB::Black;
FastLED.show();
}
FastLED.delay(1000 / FRAMES_PER_SECOND);
}
void ledBlackAll()
{
fill_solid(leds, NUM_LEDS, CRGB::Black);
FastLED.show();
FastLED.delay(1000 / FRAMES_PER_SECOND);
}
void loop() {
// MQTT
testConnectMQTT();
client.loop();
EVERY_N_SECONDS(180) {
Serial.print("MQTT Subscribe refresh");
client.subscribe("homeassistant/select1");
Serial.println(" done");
}
// LED
if (ledGo) {
ledCylon();
} else {
ledBlackAll();
}
}