#include #include #include #include #include "NeoPatterns.h" #define PIN D1 #define SENSOR D3 #define NUMPIXELS 144 bool lastSensorValue = false; void StripComplete(){ return; } NeoPatterns pixels = NeoPatterns(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800,&StripComplete); HomieNode stripNode("strip", "strip"); HomieNode sensorNode("sensor", "sensor"); Bounce debouncer = Bounce(); bool onSetPixel(const HomieRange& range, const String& value){ if(!range.isRange) { pixels.None(); pixels.ColorSet(value.toInt()); stripNode.setProperty("pixel").send(value); return true; } if (range.index < 0 || range.index > pixels.numPixels()-1) { return false; } pixels.None(); pixels.setPixelColor(range.index, value.toInt()); pixels.show(); stripNode.setProperty("pixel_" + String(range.index)).send(value); } bool onSetBrightness(const HomieRange& range, const String& value){ long brightness= value.toInt(); if (brightness < 0 || brightness > 255) { return false; } pixels.setBrightness(brightness); pixels.show(); stripNode.setProperty("brightness").send(value); } bool onSetEffect(const HomieRange& range, const String& value){ String effect = value; effect.toLowerCase(); if(effect == "scanner") { pixels.Scanner(pixels.Color(255,0,0), 40); } else if(effect == "randomscanner") { pixels.Scanner(pixels.Color(255,0,0), 40,true); } else if(effect == "rainbowcycle") { pixels.RainbowCycle(50); } else if(effect == "theaterchase") { pixels.TheaterChase(pixels.Color(0,0,255), pixels.Color(255,0,00), 100); } else if(effect == "fade") { pixels.Fade(pixels.Color(100,0,0),pixels.Color(0,0,100),200,100); } else if(effect == "randomfade") { pixels.RandomFade(); } else { pixels.None(); } stripNode.setProperty("effect").send(value); } bool onSetClear(const HomieRange& range, const String& value){ pixels.None(); pixels.clear(); pixels.show(); stripNode.setProperty("clear").send(value); } bool onSetLength(const HomieRange& range, const String& value){ pixels.None(); pixels.clear(); pixels.show(); int newLength = value.toInt(); if(newLength > 0) { pixels.updateLength(newLength); } stripNode.setProperty("length").send(value); } void loopHandler() { pixels.Update(); int sensorValue = debouncer.read(); if (Homie.isConfigured() && Homie.isConnected() && sensorValue != lastSensorValue) { sensorNode.setProperty("motion").send(sensorValue ? "true" : "false"); lastSensorValue = sensorValue; } } void setup() { Serial.begin(115200); debouncer.attach(SENSOR,INPUT); debouncer.interval(50); Homie_setFirmware("schild", "1.0.0"); Homie.setLoopFunction(loopHandler); stripNode.advertiseRange("pixel", 0, NUMPIXELS-1).settable(onSetPixel); stripNode.advertise("brightness").settable(onSetBrightness); stripNode.advertise("effect").settable(onSetEffect); stripNode.advertise("clear").settable(onSetClear); stripNode.advertise("length").settable(onSetLength); sensorNode.advertise("motion"); pixels.begin(); pixels.clear(); pixels.setBrightness(64); pixels.show(); Homie.setup(); ArduinoOTA.setHostname(Homie.getConfiguration().deviceId); ArduinoOTA.setPassword((const char *)"ctdo2342"); ArduinoOTA.begin(); } void loop() { Homie.loop(); debouncer.update(); ArduinoOTA.handle(); }