*** If you are using the ESP32, Please see this: ESP32
It would be great if every IoT device deployed with OTA capability with Wifimanager. Then the IoT device would be able to change SSID & password without connecting the device to the computer to update SSID and password as well as FOTA at any time when you wanted.
In this tutorial, let’s combine ESPAsync_Wifimanager and AsyncElegantOTA into a code base to become a handy tool for future IoT projects!
I have made WiFiManager & AsyncElegantOTA tutorial videos. If you don't know what they are and how they work for IoT projects, I strongly recommend you to watch these videos first.
This time, I used ESPAsync_WiFiManager library, it's because WiFiManager does not work with AsyncElegnatOTA together. We have to change to ESPAsync_WiFiManager. The main reason for this is that AsnycWiFiManager is using Asynchronous technology. Which means it can accept connections from different sources at the same time. So, while WiFiManager is running on the device, the device can also be a FOTA server to allow firmware to be remotely updated!
Watch these videos first, if haven't heard about these.
For those of you do not have the time to watch the entire video, here is the Video Timeline
00:00 Project introduction
00:16 Arduino libraries used in this project
00:29 Short Wifimanager briefing (Check out my previous video)
00:59 Short AsyncElegnatOTA briefing (Check out my previous video)
01:34 Tutorial begin
02:04 Copy ESPAsyncWifimanager sample code to your editor
02:44 Check AsyncElegantOTA sample code
02:50 Start to merge the two libraries
05:16 Setup your IoT AP name
05:58 Copy AsyncElegantOTA code & modify
06:20 Modify server variables
07:05 What does webServer.on do?
07:35 Upload sketch
08:11 Test AsyncWifimanager and setup SSID & Password
09:10 Access ESP32 from browser
09:44 Access ESP32 OTA page
The End.
*** If you are using the ESP8266, Please see this: ESP8266
It would be great if every IoT device deployed with OTA capability with Wifimanager. Then the IoT device would be able to change SSID & password without connecting the device to the computer to update SSID and password as well as FOTA at any time when you wanted.
In this tutorial, let’s combine ESPAsync_Wifimanager and AsyncElegantOTA into a code base to become a handy tool for future IoT projects!
I have made WiFiManager & AsyncElegantOTA tutorial videos. If you don't know what they are and how they work for IoT projects, I strongly recommend you to watch these videos first.
This time, I used ESPAsync_WiFiManager library, it's because WiFiManager does not work with AsyncElegnatOTA together. We have to change to ESPAsync_WiFiManager. The main reason for this is that AsnycWiFiManager is using Asynchronous technology. Which means it can accept connections from different sources at the same time. So, while WiFiManager is running on the device, the device can also be a FOTA server to allow firmware to be remotely updated!
Watch these videos first, if haven't heard about these.
For those of you do not have the time to watch the entire video, here is the Video Timeline
00:00 Project introduction
00:16 Arduino libraries used in this project
00:29 Short Wifimanager briefing (Check out my previous video)
00:59 Short AsyncElegnatOTA briefing (Check out my previous video)
01:34 Tutorial begin
02:04 Copy ESPAsyncWifimanager sample code to your editor
02:44 Check AsyncElegantOTA sample code
02:50 Start to merge the two libraries
05:16 Setup your IoT AP name
05:58 Copy AsyncElegantOTA code & modify
06:20 Modify server variables
07:05 What does webServer.on do?
07:35 Upload sketch
08:11 Test AsyncWifimanager and setup SSID & Password
09:10 Access ESP32 from browser
09:44 Access ESP32 OTA page
It's always troublesome to update firmware for your IoT projects? Tried Arduino BasicOTA examples, but never get it to work? Then you must try AsyncElegantOTA! It's very easy to use and I've succeed the first time I try it.
For those of you do not have time to watch it all, here is the video timeline for your quick reference.
Video Timeline:
00:13 Tutorial summary
00:53 What's OTA & Why
01:25 Tutorial begin
01:36 Install AsyncElegantOTA library
02:32 Download ESPAsyncWebServer & ESPAsyncTCP
02:57 Ensure Arduino board is capable of OTA
03:41 Where to place downloaded libraries
04:09 Open sample AsyncElegantOTA sketch
04:52 Upload sketch
05:05 Open serial monitor to see ESP8266 IP address
05:36 Access to ESP8266 from browser
06:10 Update ESP8266 firmware from browser
06:31 Where to find .bin file in VS Code
06:54 How to create .bin file in Arduino IDE
08:16 OTA update ESP8266 firmware
09:01 Next video tutorial - How to combine ESP8266 project with AsyncElegantOTA library
In this tutorial, I will show you how to make a Voice Control Color Lighting with Google Home or Google Assistant. I used a NODEMCU ESP-12E V2.0 and WS2812B LED strips for this project.
Preface:
In last tutorial, I had showed you how to make a Voice Control Light Switch with Google Home or
Google Assistant. Not sure if you have chance to try to do this yourself or not. The previous tutorials
are considered a prerequisite for this tutorial. Please checkout previous tutorials from here:
Use voice command to say “Set Color Light” + color to change the light colors.
For example: If you said “Set color light red”, the lighting will change from current color to “red”.
Very sample!
Although turn on/off light switch with voice is quite practical in daily life, it’s somehow not so interesting. In this tutorial, you will be able to change the lighting color with voice.
Components needed:
NODEMCU ESP-12E V2.0 * 1
WS2812B RGB LED Strips – two meters (120 LEDs) * 1
Few jumper wires
220 resistors * 4
1000uF capacitor * 1 (Not used in this tutorial. place this capacitor near NODEMCU)
110V 5V/2.4A power adapter * 1
Core of paper towel * 3
Double sided tapes
Hot glue
A large white semi-transparent plastic cardboard
1. Get three core of paper towers and stack them like this at the predefined length. Glue them with hot glue.
2. Cut WS2812B LED strip into four pieces with 30 LED each. Solder three wires on each WS2812B LED strip; Red for + pin; Black for – pin; Green for data pin. Then, cut small holes on the bottom of the paper tower core. This is used for the wire to go through.
3. Glue four LED strips on the paper tower core with double sided tape and let wires go inside the paper tower core. So we could collect all wires to the base for easier connections.
4. Here I used a thicker paper box as the base and cut a hole on the center top. Also, I fill the inside with Styrofoam to make the base more stable. Then, drill a hole that’s roughly the diameter of the paper tower core.
5. Place the paper tower core into the hole of the paper box.
6. To decorate the base, I used wooden color paper sticker to wrap around the paper box. It does look better!
7. Cut white plastic cardboard into equal length that’s roughly longer than the total height of the paper tower core.
8. Glue these white plastic cardboard into a long squared tube as shown.
9.Insert the paper tower core with LED strips into the base with all the wires to go through the paper box base.
11. Here is the almost completed LED lighting unit
12. Now, place the white plastic square tube on the paper tower core to diffuse the LED colors.
13. Light it up. It looks pretty good!
PS: I reused a 5V/2.4A old power adapter. I think this is bright enough for the LED lighting. Do not use 5V/1A or 5V/1.5A for this project, the light will be incorrect and very dim.
Connection:
This video shows you the detailed connections on NODEMCU and WS2812B LED strips.
Red to 5V+ (total 4 pins from LED strips)
Black to GND (total 4 pins from LED strips)
Green to NODEMCU data pins ((total 4 pins from LED strips; D2,D3,D4,D5)
NodeMCU VIN to 5V+
NodeMCU GND to power Adapter GND (Share GND)
5V/2.4A power adapter to 5V+
5V/2.4A power adapter to GND
1000uF Capacitor parallel with the power adapter (Not in this tutorial, since I haven't purchase this yet :)
Programming codes:
/***************************************************
Adafruit MQTT Library ESP8266 Adafruit IO SSL/TLS example
Must use the latest version of ESP8266 Arduino from:
https://github.com/esp8266/Arduino
Works great with Adafruit's Huzzah ESP board & Feather
---- https://www.adafruit.com/product/2471
---- https://www.adafruit.com/products/2821
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Tony DiCola for Adafruit Industries.
SSL/TLS additions by Todd Treece for Adafruit Industries.
MIT license, all text above must be included in any redistribution
****************************************************/
#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
//This line allows one to use NODEMCU pin name, such as D0
#define FASTLED_ESP8266_RAW_PIN_ORDER
#include <FastLED.h>
#include <Wire.h>
// Information about the LED strip itself
#define LED_PIN1 D3
#define LED_PIN2 D4
#define LED_PIN3 D5
#define LED_PIN4 D6
#define COLOR_ORDER GRB
#define CHIPSET WS2811
#define NUM_LEDS 30
#define BRIGHTNESS 255
CRGB leds[NUM_LEDS];
// FastLED v2.1 provides two color-management controls:
// (1) color correction settings for each LED strip, and
// (2) master control of the overall output 'color temperature'
//
// THIS EXAMPLE demonstrates the second, "color temperature" control.
// It shows a simple rainbow animation first with one temperature profile,
// and a few seconds later, with a different temperature profile.
//
// The first pixel of the strip will show the color temperature.
//
// HELPFUL HINTS for "seeing" the effect in this demo:
// * Don't look directly at the LED pixels. Shine the LEDs aganst
// a white wall, table, or piece of paper, and look at the reflected light.
//
// * If you watch it for a bit, and then walk away, and then come back
// to it, you'll probably be able to "see" whether it's currently using
// the 'redder' or the 'bluer' temperature profile, even not counting
// the lowest 'indicator' pixel.
//
//
// FastLED provides these pre-conigured incandescent color profiles:
// Candle, Tungsten40W, Tungsten100W, Halogen, CarbonArc,
// HighNoonSun, DirectSunlight, OvercastSky, ClearBlueSky,
// FastLED provides these pre-configured gaseous-light color profiles:
// WarmFluorescent, StandardFluorescent, CoolWhiteFluorescent,
// FullSpectrumFluorescent, GrowLightFluorescent, BlackLightFluorescent,
// MercuryVapor, SodiumVapor, MetalHalide, HighPressureSodium,
// FastLED also provides an "Uncorrected temperature" profile
// UncorrectedTemperature;
#define TEMPERATURE_1 Tungsten100W
#define TEMPERATURE_2 OvercastSky
// How many seconds to show each temperature before switching
#define DISPLAYTIME 20
// How many seconds to show black between switches
#define BLACKTIME 3
// Relay settings
#define relay2Pin D7 //NodeMCU pin D7
#define relay1Pin D8 //NodeMCU pin D8
int relay1Status = 0; //switch of the relay; either 0=off or 1=on
int relay2Status = 0; //switch of the relay; either 0=off or 1=on
/************************* WiFi Access Point *********************************/
#define WLAN_SSID "Use_your_ssid"
#define WLAN_PASS "Use_your_wifi_password"
/************************* Adafruit.io Setup *********************************/
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 8883 // 8883 for MQTTS sercure, 1883 for non-Secure
#define AIO_USERNAME "Use_your_user_name"
#define AIO_KEY "Use_your_own_AIO_key"
/************ Global State (you don't need to change this!) ******************/
// WiFiFlientSecure for SSL/TLS support
WiFiClientSecure client;
//WiFiClient for non-secure
//WiFiClient client;
// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// io.adafruit.com SHA1 fingerprint
const char* fingerprint = "AD 4B 64 B3 67 40 B5 FC 0E 51 9B BD 25 E9 7F 88 B6 2A A3 5B";
/****************************** Feeds ***************************************/
// Setup a feed called 'test' for publishing.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
//Adafruit_MQTT_Publish light_color = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/light-color");
//Adafruit_MQTT_Publish light_1 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/light-1");
/*************************** Sketch Code ************************************/
// Bug workaround for Arduino 1.6.6, it seems to need a function declaration
// for some reason (only affects ESP8266, likely an arduino-builder bug).
void MQTT_connect();
void verifyFingerprint();
//set up two feeds called 'light_1' / 'light_color' for subscribing to changes
Adafruit_MQTT_Subscribe light_1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/light-1");
Adafruit_MQTT_Subscribe light_color = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/light-color");
void setup() {
delay( 3000 ); // power-up safety delay for LED stripe
Serial.begin(115200);
delay(10);
//MQTT connection indication when Blue is on
pinMode(LED_BUILTIN, OUTPUT);
// Relay pins
pinMode(relay1Pin, OUTPUT);
pinMode(relay2Pin, OUTPUT);
//LED pins
pinMode(LED_PIN1, OUTPUT);
pinMode(LED_PIN2, OUTPUT);
pinMode(LED_PIN3, OUTPUT);
pinMode(LED_PIN4, OUTPUT);
//FastLED declaration
FastLED.addLeds<CHIPSET, LED_PIN1, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.addLeds<CHIPSET, LED_PIN2, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.addLeds<CHIPSET, LED_PIN3, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.addLeds<CHIPSET, LED_PIN4, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
FastLED.setBrightness( BRIGHTNESS );
//Turn on the light to White in the beginning
Serial.println(F("Connecting Wi-Fi...(Blue)"));
fill_solid(leds, NUM_LEDS, CRGB::Blue);
FastLED.show();
Serial.println(F("Home MQTT Color Light Control System"));
// Connect to WiFi access point.
Serial.println(); Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.print("IP address: "); Serial.println(WiFi.localIP());
// check the fingerprint of io.adafruit.com's SSL cert
verifyFingerprint();
//Subscribe to Adafruit Feed!
mqtt.subscribe(&light_1);
mqtt.subscribe(&light_color);
//Turn on the light When io.adafruit.com & MQTT connected
Serial.println(F("Wi-Fi Connected...(White)"));
fill_solid(leds, NUM_LEDS, CRGB::White);
FastLED.show();
}
uint32_t x = 0;
/* This turn on/off relay switch
*/
void switchRelay(int relay, int stat) {
if (relay == 2) { //this is light-1;
if (stat == 0) {
digitalWrite(relay2Pin, LOW);
relay1Status = 0;
Serial.println(F("Relay off"));
}
if (stat == 1) {
digitalWrite(relay2Pin, HIGH);
relay1Status = 1;
Serial.println(F("Relay on"));
}
}
if (relay == 1) { //this is color-light;
if (stat == 0) {
digitalWrite(relay1Pin, LOW);
relay2Status = 0;
Serial.println(F("Relay off"));
}
if (stat == 1) {
digitalWrite(relay1Pin, HIGH);
relay2Status = 1;
Serial.println(F("Relay on"));
}
}
}
void loop() {
String feed_lastread; //This is the String of effect name read from Adafruit.IO
// Ensure the connection to the MQTT server is alive (this will make the first
// connection and automatically reconnect when disconnected). See the MQTT_connect
// function definition further below.
MQTT_connect();
Adafruit_MQTT_Subscribe *subscription;
while ((subscription = mqtt.readSubscription(1000))) {
if (subscription == &light_1) {
Serial.print(F("Light-1:"));
Serial.println((char *)light_1.lastread);
feed_lastread = (char *)light_1.lastread;
feed_lastread.trim(); //
// Serial.println("Light 1:" + feed_lastread); //for verifying the varialble
// *** NOTICE: adafruit.io publishes the data as strings, not numbers!!!
if (feed_lastread == "ON") {
switchRelay(2, 1);
}
if (feed_lastread == "OFF") {
switchRelay(2, 0);
}
}
if (subscription == &light_color) {
Serial.print(F("Color-Light:"));
Serial.println((char *)light_color.lastread);
feed_lastread = (char *)light_color.lastread;
feed_lastread.trim(); //
// Serial.println("Color Light:" + feed_lastread); //for verifying the variable
// *** NOTICE: adafruit.io publishes the data as strings, not numbers!!!
if (feed_lastread == "ON") {
switchRelay(1, 1);
} else if (feed_lastread == "OFF") {
switchRelay(1, 0);
} else {
//if (relay2Status == 1 ) { //Only send color light commands when Color Light is on
colorEffectFunction(feed_lastread);
//}
}
}
} //while MQTT got message loop
/*
switchRelay();
Serial.print(F("\nSwitch is:"));
if (relay1Status == 1) {
Serial.print(F("On"));
} else {
Serial.print(F("Off"));
}
// Now we can publish stuff!
Serial.print(F("\nSending val "));
Serial.print(x);
Serial.print(F(" to Relay1 feed..."));
if (! Relay1.publish(x++)) {
Serial.println(F("Failed"));
} else {
Serial.println(F("OK!"));
}
// Now we can publish stuff!
Serial.print(F("\nSending val "));
Serial.print(x);
Serial.print(F(" to Relay2 feed..."));
if (! Relay2.publish(x)) {
Serial.println(F("Failed"));
} else {
Serial.println(F("OK!"));
}
// wait a couple seconds to avoid rate limit
delay(5000);
*/
}
/*
This function show the color light
Control multiple WS2812 strips easily!
https://github.com/FastLED/FastLED/wiki/Multiple-Controller-Examples
FastLED All effects in one script
https://www.tweaking4all.com/hardware/arduino/arduino-all-ledstrip-effects-in-one/
Take this to complete your "Google Home" project
First example to show you the basics about FastLED: https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/
*/
void colorEffectFunction(String colorVariant) {
Serial.print(F("Color effect:"));
if (colorVariant == "rainbow") {
static uint8_t starthue = 0;
Serial.println(F("Rainbow"));
fill_rainbow( leds, NUM_LEDS, --starthue, 20);
FastLED.show();
}
if (colorVariant == "candle") {
Serial.println(F("Candle"));
fill_solid(leds, NUM_LEDS, Candle);
FastLED.show();
}
if (colorVariant == "red") {
Serial.println(F("Red"));
fill_solid(leds, NUM_LEDS, CRGB::OrangeRed);
FastLED.show();
}
if (colorVariant == "green") {
Serial.println(F("Green"));
fill_solid(leds, NUM_LEDS, CRGB::Green);
FastLED.show();
}
if (colorVariant == "blue") {
Serial.println(F("Blue"));
fill_solid(leds, NUM_LEDS, CRGB::Blue);
FastLED.show();
}
if (colorVariant == "yellow") {
Serial.println(F("Yellow"));
fill_solid(leds, NUM_LEDS, CRGB::Yellow);
FastLED.show();
}
if (colorVariant == "gold") {
Serial.println(F("Gold"));
fill_solid(leds, NUM_LEDS, CRGB::Gold);
FastLED.show();
}
if (colorVariant == "orange") {
Serial.println(F("Orange"));
fill_solid(leds, NUM_LEDS, CRGB::Orange);
FastLED.show();
}
if (colorVariant == "White") {
Serial.println(F("White"));
fill_solid(leds, NUM_LEDS, CRGB::White);
FastLED.show();
}
if (colorVariant == "purple") {
Serial.println(F("Std. Fluorescent"));
fill_solid(leds, NUM_LEDS, CRGB::Purple);
FastLED.show();
}
}
void verifyFingerprint() {
const char* host = AIO_SERVER;
Serial.print("Connecting to ");
Serial.println(host);
if (! client.connect(host, AIO_SERVERPORT)) {
Serial.println("Connection failed. Halting execution.");
while (1);
}
// if (client.verify(fingerprint, host)) {
// Serial.println("Connection secure.");
// } else {
// Serial.println("Connection insecure! Halting execution.");
// while(1);
// }
}
// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to MQTT... ");
uint8_t retries = 30;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
while (1);
}
}
Serial.println("MQTT Connected!");
//Turn on Blue LED to indicate it's connected.
digitalWrite(LED_BUILTIN, HIGH);
}
使用聲控命令說“set color lighting”+顏色來改變燈光顏色。
例如:如果您說“set color lighting red”,則照明將從當前顏色更改為“紅色”, 非常有趣實用!
雖然上次用聲音打開/關閉燈開關在日常生活中也非常實用,但它在某種程度上並不那麼好玩。 在本教學中,您將能夠使用語音更改RGB燈光顏色。