Introduction I wanted a way to have Alexa turn off the stereo in my workshop. I found the code below on GitHub https://github.com/kakopappa/arduino-esp8266-alexa-multiple-wemo-switch It is easy to use and can be directly connected to Alexa. |
Hardware Wemos D1 - the program toggles pin D2 which is connected to a 5 volt relay on my relay board - the board takes 5 volts (there is no regulator) and powers both the relay and the ESP8266 |
|
Code This code can be used to toggle one relay with Alexa - device name in this case is "stereo". Use Discover Devices on phone app for Alexa - it should find "stereo" A zip file containing all of the subroutines is here: ESP8266/AlexaRelay/wemos-3-oneLED-StereoOnOff.zip // working d. bodnar 11-30-2016 with mosfet // used a 7805 to drop 12 to 5 and fed that to the VCC input // 1K resistor from pin 4 to base of mosfet // works well! // FIXED with folder delete explained here https://github.com/esp8266/Arduino/issues/1387 #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <WiFiUdp.h> #include <functional> #include "switch.h" #include "UpnpBroadcastResponder.h" #include "CallbackFunction.h" int LED4 = 4; int LED5 = 5; int LEDRed = 15; // built in LEDs int LEDGreen = 12; int LEDBlue = 13; // prototypes boolean connectWifi(); //on/off callbacks void stereoOn(); void stereoOff(); //void kitchenLightsOn(); //void kitchenLightsOff(); // Change this before you flash const char* ssid = "main2"; const char* password = "passpass"; boolean wifiConnected = false; UpnpBroadcastResponder upnpBroadcastResponder; Switch *stereo = NULL; //Switch *kitchen = NULL; void setup() { pinMode(LED5, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LEDRed, OUTPUT); pinMode(LEDGreen, OUTPUT); pinMode(LEDBlue, OUTPUT); Serial.begin(9600); // Initialise wifi connection wifiConnected = connectWifi(); if (wifiConnected) { digitalWrite(LEDGreen, HIGH); upnpBroadcastResponder.beginUdpMulticast(); // Define your switches here. Max 14 // Format: Alexa invocation name, local port no, on callback, off callback stereo = new Switch("stereo ", 80, stereoOn, stereoOff); // kitchen = new Switch("kitchen lights", 81, kitchenLightsOn, kitchenLightsOff); Serial.println("Adding switches upnp broadcast responder"); upnpBroadcastResponder.addDevice(*stereo); // upnpBroadcastResponder.addDevice(*kitchen); } // digitalWrite(LEDRed, HIGH); // digitalWrite(LEDGreen, HIGH); // digitalWrite(LEDBlue, HIGH); delay(2000); // digitalWrite(LEDRed, LOW); digitalWrite(LEDGreen, LOW); // digitalWrite(LEDBlue, LOW); } void loop() { if (wifiConnected) { // digitalWrite(LEDGreen, HIGH); upnpBroadcastResponder.serverLoop(); // kitchen->serverLoop(); stereo->serverLoop(); } else { // digitalWrite(LEDGreen, LOW); } } void stereoOn() { Serial.print("Switch 1 turn on ..."); digitalWrite(LED4, HIGH); digitalWrite(LEDBlue, LOW); digitalWrite(LEDRed, LOW); digitalWrite(LEDGreen, HIGH); // digitalWrite(LEDBlue, HIGH); } void stereoOff() { Serial.print("Switch 1 turn off ..."); digitalWrite(LED4, LOW); //digitalWrite(LEDBlue, LOW); digitalWrite(LEDRed, HIGH); digitalWrite(LEDGreen, LOW); // digitalWrite(LEDBlue, LOW); } void kitchenLightsOn() { Serial.print("Switch 2 turn on ..."); digitalWrite(LED5, HIGH); } void kitchenLightsOff() { Serial.print("Switch 2 turn off ..."); digitalWrite(LED5, LOW); } // connect to wifi – returns true if successful or false if not boolean connectWifi() { boolean state = true; int i = 0; WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.println(""); Serial.println("Connecting to WiFi"); // Wait for connection Serial.print("Connecting ..."); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); if (i > 10) { state = false; break; } i++; } if (state) { Serial.println(""); Serial.print("Connected to "); Serial.println(ssid); Serial.print("IP address: "); Serial.println(WiFi.localIP()); } else { Serial.println(""); Serial.println("Connection failed."); } return state; }
|