esp8266的点灯程序
int led = LED_BUILTIN; //或者led = 2, 定义 IO 口2 既LED_BUILTIN 引脚,对应开发板内置LED灯
void setup ()
{
pinMode(led,OUTPUT); //设置 IO 口 2 为输出接口,我们用到的I/O 口都要进行类似这样的定义
}
void loop()
{
digitalWrite(led, LOW); //IO 口 2 设置为低电平,点亮数字2口LED
delay(500);
digitalWrite(led, HIGH); //IO 口 2 设置为低高电平,点亮数字2口LED
delay(500);
}
esp8266的串口部分
注意Serial.println()和Serial.printf()的区别是ln的是自动换行,后者不换行
void setup ()
{
Serial.begin(115200); // 设置调试串口波特率
}
void loop()
{
Serial.println("tying shuai"); // 打印串口输出信息
delay(500);
}
esp8266的水位检查器
int value = 0;
void setup ()
{
Serial.begin(115200); // 设置调试串口波特率
}
void loop()
{
value = (analogRead(A0)*100)/1024;//将测量到的值保存到变量value中
Serial.println(value); // 打印串口输出信息
delay(500);
}
esp8266的DHT11
首先要安装DHT11库文件
工具-库管理-搜索DHT
#include <DHT.h>//调用dht11驱动库
#define DHTPIN D4 //说明数据接口为8266开发板的D4口,也可以写为#define DHTPIN 2
既8266芯片的IO口2
#define DHTTYPE DHT11//说明使用的模块是DHT11
DHT dht(DHTPIN,DHTTYPE); //把DHTPIN和DHTTYPE传递给测量函数
void setup() {
dht.begin();//开始测量
Serial.begin(9600);//打开串口,设置波特率
}
void loop() {
delay(200);//延时,等待测量完成
float h = dht.readHumidity();//读取湿度
float t =dht.readTemperature();//读取温度
Serial.print("当前湿度:");//发送字符“当前湿度:”
Serial.print(h);//发送湿度值
Serial.println("%");//发送湿度值
Serial.print("当前温度:");//发送字符“当前温度:”
Serial.print(t);//发送温度值
Serial.println("℃");//发送湿度值
delay(2000);//2s测量一次
}
通过网页端按钮实现继电器的控制(WIFI插座)(把IP地址直接复制到网页就可以点开关了 )
// 调用wifi库
#include <ESP8266WiFi.h>
// 替换为你的wifi名称和密码
const char* ssid = "CMCC-AAA";//wifi名称
const char* password = "123456789";//wifi密码
// 设置web服务器端口为80
WiFiServer server(80);
// 定义储存HTTP请求的变量
String header;
// 定义储存当前输出状态的变量
String output5State = "off";
String output4State = "off";
// 定义输出引脚连接
const int output5 = 5;//esp8266的IO口5,既D1
const int output4 = 2;//esp8266的IO口2,既D4
void setup() {Serial.begin(115200);
// 设置引脚为输出模式
pinMode(output5, OUTPUT);
pinMode(output4, OUTPUT);
// 将引脚输出初始化为低
digitalWrite(output5, LOW);
digitalWrite(output4, LOW);
// 通过wifi名称和密码连接网络
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// 串口打印网站的IP地址,并启动服务器
Serial.println("");
Serial.println("WiFi connected.");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
server.begin();
}
void loop(){
WiFiClient client = server.available(); // Listen for incoming clients
if (client) { // If a new client connects,
Serial.println("New Client."); // print a message out in the serial port
String currentLine = ""; // make a String to hold incoming data
while (client.connected()) { // loop while the client's connected
if (client.available()) { // if there's bytes to read
char c = client.read(); // read a byte, then
Serial.write(c); // print it out the serial monitor
header += c;
if (c == '\n') { // if the byte is a newline character
// if the current line is blank, you got two newline characters in a row.
// that's the end of the client HTTP request, so send a response:
if (currentLine.length() == 0) {
// HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
// and content-type so the client knows what's coming, then a blank line:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println("Connection: close");
client.println();
// turns the GPIOs on and off
if (header.indexOf("GET /5/on") >= 0) {
Serial.println("GPIO 5 on");
output5State = "on";
digitalWrite(output5, HIGH);
} else if (header.indexOf("GET /5/off") >= 0) {
Serial.println("GPIO 5 off");
output5State = "off";
digitalWrite(output5, LOW);
} else if (header.indexOf("GET /4/on") >= 0) {
Serial.println("GPIO 4 on");
output4State = "on";
digitalWrite(output4, HIGH);
} else if (header.indexOf("GET /4/off") >= 0) {
Serial.println("GPIO 4 off");
output4State = "off";
digitalWrite(output4, LOW);
}
// Display the HTML web page
client.println("<!DOCTYPE html><html>");
client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
client.println("<link rel=\"icon\" href=\"data:,\">");
// CSS to style the on/off buttons
// Feel free to change the background-color and font-size attributes
client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;");
client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
client.println(".button2 {background-color: #77878A;}</style></head>");// Web Page Heading
client.println("<body><h1> WIFI开关 </h1>");
// Display current state, and ON/OFF buttons for GPIO 5
client.println("<p> 开关1状态 " + output5State + "</p>");//client.println("<p>GPIO 5 - State " + output5State + "</p>");
// If the output5State is off, it displays the ON button
if (output5State=="off") {
client.println("<p><a href=\"/5/on\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/5/off\"><button class=\"button button2\">OFF</button></a></p>");
}
// Display current state, and ON/OFF buttons for GPIO 4
client.println("<p>开关2状态 " + output4State + "</p>");//client.println("<p>GPIO 4 - State " + output4State + "</p>");
// If the output4State is off, it displays the ON button
if (output4State=="off") {
client.println("<p><a href=\"/4/on\"><button class=\"button\">ON</button></a></p>");
} else {
client.println("<p><a href=\"/4/off\"><button class=\"button button2\">OFF</button></a></p>");
}
client.println("</body></html>");
// The HTTP response ends with another blank line
client.println();
// Break out of the while loop
break;
} else { // if you got a newline, then clear currentLine
currentLine = ""; }
} else if (c != '\r') { // if you got anything else but a carriage return character,currentLine += c; // add it to the end of the currentLine
} } }// Clear the header variable
header = "";
// Close the connection
client.stop();
Serial.println("Client disconnected.");
Serial.println("");
} }
控制灯
#include <ESP8266WiFi.h> // 调用ESP8266WiFi库
#include <ESP8266WiFiMulti.h> // 调用ESP8266WiFiMulti库
#include <ESP8266WebServer.h> // 调用ESP8266WebServer库
ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti'
ESP8266WebServer esp8266_server(80);// 建立网络服务器对象,该对象用于响应HTTP请求,监听端口(80)
void setup(void){
Serial.begin(9600); // 启动串口通讯
pinMode(D4, OUTPUT); //设置内置LED引脚为输出模式以便控制LED
//通过addAp函数存储 WiFi名称 WiFi密码
wifiMulti.addAP("CMCC-AAA", "123456789");
wifiMulti.addAP("HUAZHU-JiHotel", ""); // 这2条语句通过调用函数addAP来记录2个不同的WiFi网络信息。
wifiMulti.addAP("room-8607", "62131498"); //此处WiFi信息只是示例,请在使用时将需要连接的WiFi信息填入相应位置。
// 这里只存储了2个WiFi信息,您可以存储更多的WiFi信息在此处。
Serial.println("正在连接Wifi...");
int i = 0;
while (wifiMulti.run() != WL_CONNECTED) { // 此处的wifiMulti.run()是重点。通过wifiMulti.run(),ESP8266将会在当前
delay(1000); // 环境中搜索addAP函数所存储的WiFi。如果搜到多个存储的WiFi那么ESP8266
Serial.print(i++); Serial.print(' '); // 将会连接信号最强的那一个WiFi信号。
} // 一旦连接WiFI成功,wifiMulti.run()将会返回“WL_CONNECTED”。这也是
// 此处while循环判断是否跳出循环的条件。
// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n');
Serial.print("Connected to ");
Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称
Serial.print("IP address:\t");
Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-ESP8266的IP
esp8266_server.begin(); // 启动网站服务
esp8266_server.on("/", HTTP_GET, handleRoot); // 设置服务器根目录即'/'的函数'handleRoot'
esp8266_server.on("/LED", HTTP_POST, handleLED); // 设置处理LED控制请求的函数'handleLED'
esp8266_server.onNotFound(handleNotFound); // 设置处理404情况的函数'handleNotFound'
Serial.println("HTTP esp8266_server started");// 告知用户ESP8266网络服务功能已经启动
}
void loop(void){
esp8266_server.handleClient(); // 检查http服务器访问
}
/*设置服务器根目录即'/'的函数'handleRoot'
该函数的作用是每当有客户端访问ESP8266服务器根目录时,
ESP8266都会向访问设备发送 HTTP 状态 200 (Ok) 这是send函数的第一个参数。
同时ESP8266还会向浏览器发送HTML代码,以下示例中send函数中第三个参数,
也就是双引号中的内容就是ESP8266发送的HTML代码。该代码可在网页中产生LED控制按钮。
当用户按下按钮时,浏览器将会向ESP8266的/LED页面发送HTTP请求,请求方式为POST。
ESP8266接收到此请求后将会执行handleLED函数内容*/
void handleRoot() {
esp8266_server.send(200, "text/html", "<form action=\"/LED\" method=\"POST\"><input type=\"submit\" value=\"LED\"></form>");
}
//处理LED控制请求的函数'handleLED'
void handleLED() {
digitalWrite(D4,!digitalRead(D4));// 改变LED的点亮或者熄灭状态
esp8266_server.sendHeader("Location","/"); // 跳转回页面根目录
esp8266_server.send(303); // 发送Http相应代码303 跳转
}
// 设置处理404情况的函数'handleNotFound'
void handleNotFound(){
esp8266_server.send(404, "text/plain", "404: Not found"); // 发送 HTTP 状态 404 (未找到页面) 并向浏览器发送文字 "404: Not found"
}
测量水位并在网页端显示
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
//定义ADC(模拟至数字转换器)读取的值
int value = 0;//读取的值
float WaterLevel;
/*Put your SSID & Password*/
const char* ssid = "CMCC-AAA"; //输入你的WIFI名称
const char* password = "123456789"; //输入你的wifi密码
ESP8266WebServer server(80);//建立80端口的server服务
void setup() {
Serial.begin(115200);//设置串口波特率为115200
delay(100);
//以下为串口打印wifi连接信息
Serial.println("Connecting to ");
Serial.println(ssid);
//connect to your local wi-fi network
WiFi.begin(ssid, password);
//check wi-fi is connected to wi-fi network
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected..!");
Serial.print("Got IP: "); Serial.println(WiFi.localIP());
server.on("/", handle_OnConnect);
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
}
void handle_OnConnect() {
WaterLevel =(analogRead(A0)*100)/1024;//
server.send(200, "text/html", SendHTML(WaterLevel));
}
void handle_NotFound(){
server.send(404, "text/plain", "Not found");
}
String SendHTML(float WaterLevelstat){
String ptr = "<!DOCTYPE html> <html>\n";
ptr +="<head> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
ptr +="<link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,600\" rel=\"stylesheet\">\n";
ptr +="<meta charset=\"UTF-8\">\n";
ptr +="<title>智能水位计</title>\n";
ptr +="<style>html { font-family: 'Open Sans', sans-serif; display: block; margin: 0px auto; text-align: center;color: #333333;}\n";
ptr +="body{margin-top: 50px;}\n";
ptr +="h1 {margin: 50px auto 30px;}\n";
ptr +=" .wd {margin: 50px auto 30px;width: auto;color: #f39c12}\n";
ptr +=" .wd1 {margin: 50px auto 30px;width: auto;color: #3498db}\n";
ptr +=".side-by-side{display: inline-block;vertical-align: middle;position: relative;}\n";
ptr +=".WaterLevel-text{font-weight: 600;padding-left: 15px;font-size: 19px;width: 160px;text-align: left;}\n";
ptr +=".WaterLevel{font-weight: 300;font-size: 60px;color: #3498db;}\n";
ptr +=".superscript{font-size: 17px;font-weight: 600;position: absolute;right: -20px;top: 15px;}\n";
ptr +=".data{padding: 10px;}\n";
ptr +="</style>\n";
ptr +="</head>\n";
ptr +="<body>\n";
ptr +="<div id=\"webpage\">\n";
ptr +="<h1>水位检测系统</h1>\n";
ptr +="<div class=\"data\">\n";
ptr +="</div>\n";
ptr +="<span class=\"superscript\">°C</span></div>\n";
ptr +="</div>\n";
ptr +="<div class=\"data\">\n";
ptr +="</div>\n";
ptr +="<div class=\"side-by-side WaterLevel-text\">当前水位:</div>\n";
ptr +="<div class=\"side-by-side WaterLevel\">";
ptr +=(int)WaterLevelstat;
ptr +="<span class=\"superscript\">%</span></div>\n";
ptr +="</div>\n";
ptr +="</div>\n";
ptr +="</body>\n";
ptr +="</html>\n";
return ptr;
}
DHT11测量温湿度并在网页端显示
#include <DHT.h>//调用dht11驱动库
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#define DHTPIN D4 //说明数据接口为8266开发板的D4口,也可以写为#define DHTPIN 2既8266芯片的IO口2
#define DHTTYPE DHT11//说明使用的模块是DHT11
DHT dht(DHTPIN,DHTTYPE);//DHT11初始化
//定义浮点类型变量保存测量值
float Temperature;
float Humidity;
//定义WIFI信息
const char* ssid = "CMCC-AAA"; // Enter SSID here
const char* password = "123456789"; //Enter Password here
ESP8266WebServer server(80);
void setup() {
pinMode(D4, INPUT);
Serial.begin(115200);
delay(100);
dht.begin();
Serial.println("Connecting to ");
Serial.println(ssid);
//connect to your local wi-fi network
WiFi.begin(ssid, password);
//check wi-fi is connected to wi-fi network
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected..!");
Serial.print("Got IP: "); Serial.println(WiFi.localIP());
server.on("/", handle_OnConnect);
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop() {
server.handleClient();
}
void handle_OnConnect() {
Temperature = dht.readTemperature(); // Gets the values of the temperature
Humidity = dht.readHumidity(); // Gets the values of the humidity
server.send(200, "text/html", SendHTML(Temperature,Humidity));
}
void handle_NotFound(){
server.send(404, "text/plain", "Not found");
}
String SendHTML(float Temperaturestat,float Humiditystat){
String ptr = "<!DOCTYPE html> <html>\n";
ptr +="<head> <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no\">\n";
ptr +="<link href=\"https://fonts.googleapis.com/css?family=Open+Sans:300,400,600\" rel=\"stylesheet\">\n";
ptr +="<meta charset=\"UTF-8\">\n";
ptr +="<title>温湿计</title>\n";
ptr +="<style>html { font-family: 'Open Sans', sans-serif; display: block; margin: 0px auto; text-align: center;color: #333333;}\n";
ptr +="body{margin-top: 50px;}\n";
ptr +="h1 {margin: 50px auto 30px;}\n";
ptr +=" .wd {margin: 50px auto 30px;width: auto;color: #f39c12}\n";
ptr +=" .wd1 {margin: 50px auto 30px;width: auto;color: #3498db}\n";
ptr +=".side-by-side{display: inline-block;vertical-align: middle;position: relative;}\n";
ptr +=".humidity-text{font-weight: 600;padding-left: 15px;font-size: 19px;width: 160px;text-align: left;}\n";
ptr +=".humidity{font-weight: 300;font-size: 60px;color: #3498db;}\n";
ptr +=".temperature-text{font-weight: 600;padding-left: 15px;font-size: 19px;width: 160px;text-align: left;}\n";
ptr +=".temperature{font-weight: 300;font-size: 60px;color: #f39c12;}\n";
ptr +=".superscript{font-size: 17px;font-weight: 600;position: absolute;right: -20px;top: 15px;}\n";
ptr +=".data{padding: 10px;}\n";
ptr +="</style>\n";
ptr +="</head>\n";
ptr +="<body>\n";
ptr +="<div id=\"webpage\">\n";
ptr +="<h1>温湿度检测系统</h1>\n";
ptr +="<div class=\"data\">\n";
ptr +="</div>\n";
ptr +="<div class=\"side-by-side temperature-text\">温度:</div>\n";
ptr +="<div class=\"side-by-side temperature\">";
ptr +=(int)Temperaturestat;
ptr +="<span class=\"superscript\">°C</span></div>\n";
ptr +="</div>\n";
ptr +="<div class=\"data\">\n";
ptr +="</div>\n";
ptr +="<div class=\"side-by-side humidity-text\">湿度:</div>\n";
ptr +="<div class=\"side-by-side humidity\">";
ptr +=(int)Humiditystat;
ptr +="<span class=\"superscript\">%</span></div>\n";
ptr +="</div>\n";
ptr +="</div>\n";
ptr +="</body>\n";
ptr +="</html>\n";
return ptr;
}
通过手机APP实现继电器的控制(WIFI插座)
首先安装blinker库
源码
/* *****************************************************************
*
*B站账号:蓉新微电子
*淘宝网店地址:https://rongxindz.taobao.com/
*
* *****************************************************************/
#define BLINKER_WIFI //定义通过wifi网络连接
#include <Blinker.h> //调用Blinker库
char auth[] = "16bbaa9fce35"; //设备秘钥
char ssid[] = "@Hyatt_WiFi"; //wifi名称
char pswd[] = ""; //wifi密码
// 新建组件对象
BlinkerButton Button1("btn1");
// 按下按键即会执行该函数
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state); //调试日志,显示开关状态
digitalWrite(D1, !digitalRead(D1)); //D1脚状态变化
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
// 初始化有LED的IO
pinMode(D1, OUTPUT);
digitalWrite(D1, HIGH);
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
//按键后执行button1_callback函数
Button1.attach(button1_callback);
}
void loop() {
Blinker.run();
}
需要下载 点灯科技APP
在APP里面添加独立设备-网络接入-复制key(设备秘钥)-返回独立设备-新建按钮-编辑按钮
编译完时就会出现在线状态
测量水位并在手机APP显示---在按钮中添加新建组件对象
#define BLINKER_WIFI//以WiFi方式接入blinker
#include <Blinker.h>
char auth[] = "6971af8c8740";//设备密钥
char ssid[] = "CMCC-AAA";//WiFi名称
char pswd[] = "123456789";//WiFi密码
BlinkerNumber WATER("water");// 新建组件对象
float water_read = 0;//定义浮点类型变量保存测量值
void heartbeat()
{
WATER.print(water_read);//WATER组件中打印water_read的值
}
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
Blinker.begin(auth, ssid, pswd);// 初始化blinker
Blinker.attachHeartbeat(heartbeat); //心跳包函数
}
void loop()
{
Blinker.run();//Blinker运行
water_read =(analogRead(A0)*100)/1024;//esp8266内置模拟-数字转换器启动测量
if (isnan(water_read))
{
BLINKER_LOG("Failed to read from sensor!");
}
else
{
BLINKER_LOG("Water-Levl: ", water_read, " %");
}
Blinker.delay(2000);
}
DHT11测量温湿度并在手机APP显示
#define BLINKER_WIFI
#include <Blinker.h>
#include <DHT.h>
char auth[] = "ecdc2388f56f";
char ssid[] = "CMCC-AAA";
char pswd[] = "123456789";
BlinkerNumber HUMI("humi");
BlinkerNumber TEMP("temp");
#define DHTPIN D4
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
float humi_read = 0, temp_read = 0;
void heartbeat()
{
HUMI.print(humi_read);
TEMP.print(temp_read);
}
void setup()
{
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
Blinker.begin(auth, ssid, pswd);
Blinker.attachHeartbeat(heartbeat);
dht.begin();
}
void loop()
{
Blinker.run();
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t))
{
BLINKER_LOG("Failed to read from DHT sensor!");
}
else
{
BLINKER_LOG("Humidity: ", h, " %");
BLINKER_LOG("Temperature: ", t, " *C");
humi_read = h;
temp_read = t;
}
Blinker.delay(2000);
}
通过小爱音箱实现继电器的语音控制(WIFI智能插座)
/* *****************************************************************
blinker+小爱同学控制2路开关(程序预留4路)
* *****************************************************************/
#define BLINKER_WIFI //以wifi方式连接
#define BLINKER_MIOT_MULTI_OUTLET //支持多路开关
#define BLINKER_PRINT Serial //定义串口方式打印信息
#define BLINKER_WITHOUT_SSL //以不加密方式进行远程通信,减少RAM占用
#include <Blinker.h> //调用Blinker库
char auth[] = "46e64f4684b9"; //Blinker APP中的设备Secret Key(密钥)
//网络配置
char ssid[] = "@Hyatt_WiFi"; //wifi名称
char pswd[] = ""; //wifi密码
//定义继电器信号引脚
#define Relay_1 D1 //定义继电器1信号接入D1
#define Relay_2 D2 //定义继电器2信号接入D2
#define Relay_3 D3 //定义继电器3信号接入D3
#define Relay_4 D4 //定义继电器4信号接入D4
// 新建Blinker软件组件对象
BlinkerButton Button("MainSwitch"); //组件对象,要和APP组件中的“数据键名”一致,总开关
BlinkerButton Button1("Switch1"); //组件对象,要和APP组件中的“数据键名”一致,开关1
BlinkerButton Button2("Switch2"); //组件对象,要和APP组件中的“数据键名”一致,开关2
BlinkerButton Button3("Switch3"); //组件对象,要和APP组件中的“数据键名”一致,开关3
BlinkerButton Button4("Switch4"); //组件对象,要和APP组件中的“数据键名”一致,开关4
BlinkerButton Button5("Refresh"); //APP端按钮状态刷新
//定义插座状态,用于小爱同学状态反馈
bool oState[5] = { false };
#define OUTLET_ALL 0 //所有插孔
#define OUTLET_NO_1 1 //插座插孔一
#define OUTLET_NO_2 2 //插座插孔二
#define OUTLET_NO_3 3 //插座插孔三
#define OUTLET_NO_4 4 //插座插孔四
//反馈继电器状态函数
void RelayState(int num)
{
switch(num)
{
case 1: //插座插孔一状态
if(digitalRead(Relay_1)==LOW)
{
Button1.color("#FF0000"); //app按键按下后变为红色
Button1.text("插座1开"); //app按键文本显示“开”
Button1.print("on");
oState[1] = true;
}
else if(digitalRead(Relay_1==HIGH))
{
Button1.color("#808080"); //app按键弹起,恢复灰色
Button1.text("插座1关"); //app按键文本显示“关”
Button1.print("off");
oState[1] = false;
}
break;
case 2:
if(digitalRead(Relay_2)==LOW)
{
Button2.color("#FF0000"); //app按键按下后变为红色
Button2.text("插座2开"); //app按键文本显示“开”
Button2.print("on");
oState[2] = true;
}
else if(digitalRead(Relay_2==HIGH))
{
Button2.color("#808080"); //app按键弹起,恢复灰色
Button2.text("插座2关"); //app按键文本显示“关”
Button2.print("off");
oState[2] = false;
}
break;
case 3:
if(digitalRead(Relay_3)==LOW)
{
Button3.color("#FF0000"); //app按键按下后变为红色
Button3.text("插座3开"); //app按键文本显示“开”
Button3.print("on");
oState[3] = true;
}
else if(digitalRead(Relay_3==HIGH))
{
Button3.color("#808080"); //app按键弹起,恢复灰色
Button3.text("插座3关"); //app按键文本显示“关”
Button3.print("off");
oState[3] = false;
}
break;
case 4:
if(digitalRead(Relay_4)==LOW)
{
Button4.color("#FF0000"); //app按键按下后变为红色
Button4.text("插座4开"); //app按键文本显示“开”
Button4.print("on");
oState[4] = true;
}
else if(digitalRead(Relay_4==HIGH))
{
Button4.color("#808080"); //app按键弹起,恢复灰色
Button4.text("插座4关"); //app按键文本显示“关”
Button4.print("off");
oState[4] = false;
}
break;
default:
break;
}
}
//小爱同学控制插座多个插孔
void ctrl_multi_outlet(uint8_t num, uint8_t io_level)
{
switch (num)
{
case 0: //所有插孔
digitalWrite(Relay_1, io_level);//控制继电器1
digitalWrite(Relay_2, io_level);//控制继电器2
digitalWrite(Relay_3, io_level);//控制继电器3
digitalWrite(Relay_4, io_level);//控制继电器4
break;
case 1: //插座插孔一
digitalWrite(Relay_1, io_level);//控制继电器1
break;
case 2: //插座插孔二
digitalWrite(Relay_2, io_level);//控制继电器2
break;
case 3: //插座插孔三
digitalWrite(Relay_3, io_level);//控制继电器3
break;
case 4: //插座插孔四
digitalWrite(Relay_4, io_level);//控制继电器4
break;
default:
break;
}
}
//小爱电源类回调,例如:“打开插座”、“打开插座插孔一”、“打开插座插孔二”
void miotPowerState(const String & state, uint8_t num)
{
BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
if (state == BLINKER_CMD_ON)
{
ctrl_multi_outlet(num, LOW);//打开继电器,num表示是多少路(继电器低电平触发)
BlinkerMIOT.powerState("on", num);
BlinkerMIOT.print();
RelayState(num);
oState[num] = true;
}
else if (state == BLINKER_CMD_OFF)
{
ctrl_multi_outlet(num, HIGH);//关闭继电器,num表示是多少路
BlinkerMIOT.powerState("off", num);
BlinkerMIOT.print();
RelayState(num);
oState[num] = false;
}
}
//小爱设备查询的回调函数,查询设备状态,例如:“插座插孔一状态”
void miotQuery(int32_t queryCode,uint8_t num)
{
BLINKER_LOG("插孔",num,"状态",",codes:", queryCode);
switch (num)
{
case 0 :
BLINKER_LOG("状态:");
BlinkerMIOT.powerState(oState[1] ? "on" : "off");
BlinkerMIOT.powerState(oState[2] ? "on" : "off");
BlinkerMIOT.powerState(oState[3] ? "on" : "off");
BlinkerMIOT.powerState(oState[4] ? "on" : "off");
BlinkerMIOT.print();
break;
case 1 :
BLINKER_LOG("插孔1状态:");
BlinkerMIOT.powerState(oState[1] ? "on" : "off");
BlinkerMIOT.print();
break;
case 2 :
BLINKER_LOG("插孔2状态:");
BlinkerMIOT.powerState(oState[2] ? "on" : "off");
BlinkerMIOT.print();
break;
case 3 :
BLINKER_LOG("插孔3状态:");
BlinkerMIOT.powerState(oState[3] ? "on" : "off");
BlinkerMIOT.print();
break;
case 4 :
BLINKER_LOG("插孔4状态:");
BlinkerMIOT.powerState(oState[4] ? "on" : "off");
BlinkerMIOT.print();
break;
default :
BlinkerMIOT.powerState(oState[1] ? "on" : "off");
BlinkerMIOT.powerState(oState[2] ? "on" : "off");
BlinkerMIOT.powerState(oState[3] ? "on" : "off");
BlinkerMIOT.powerState(oState[4] ? "on" : "off");
BlinkerMIOT.print();
break;
}
}
// 在APP控制,按下MainSwitch按键即会执行该函数
void button_callback(const String & state)
{
BLINKER_LOG("操作了MainSwitch: ", state);//APP中的Monitor控件打印的信息
if (state=="on")
{
ctrl_multi_outlet(OUTLET_ALL, LOW);//打开继电器--所有
// 反馈继电器状态
Button.color("#FF0000"); //设置app按键是红色
Button.text("开"); //设置app按键注释“开”
Button.print("on");
} else if(state=="off")
{
ctrl_multi_outlet(OUTLET_ALL, HIGH);//关闭继电器--所有
// 反馈继电器状态
Button.color("#808080"); //设置app按键是纯黄色,16进制颜色码
Button.text("关"); //设置app按键注释“开”
Button.print("off");
}
}
// 在APP控制,按下Switch1按键即会执行该函数--第1路开关
void button1_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
if (state=="on")
{
ctrl_multi_outlet(OUTLET_NO_1, LOW);//打开继电器--第1路
// 反馈继电器1状态
RelayState(1); //调用继电器反馈程序
} else if(state=="off")
{
ctrl_multi_outlet(OUTLET_NO_1, HIGH);//关闭继电器--第1路
// 反馈继电器状态
RelayState(1); //调用继电器反馈程序
}
}
// 在APP控制,按下Switch2按键即会执行该函数--第2路开关
void button2_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
if (state=="on")
{
ctrl_multi_outlet(OUTLET_NO_2, LOW);//打开继电器--第2路
// 反馈继电器状态
RelayState(2); //调用继电器反馈程序
} else if(state=="off")
{
ctrl_multi_outlet(OUTLET_NO_2, HIGH);//关闭继电器--第2路
// 反馈继电器状态
RelayState(2); //调用继电器反馈程序
}
}
// 在APP控制,按下Switch3按键即会执行该函数--第3路开关
void button3_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
if (state=="on")
{
ctrl_multi_outlet(OUTLET_NO_3, LOW);//打开继电器--第3路
// 反馈继电器状态
RelayState(3); //调用继电器反馈程序
} else if(state=="off")
{
ctrl_multi_outlet(OUTLET_NO_3, HIGH);//关闭继电器--第3路
// 反馈继电器状态
RelayState(3); //调用继电器反馈程序
}
}
// 在APP控制,按下Switch4按键即会执行该函数--第4路开关
void button4_callback(const String & state)
{
BLINKER_LOG("get button state: ", state);//APP中的Monitor控件打印的信息
if (state=="on")
{
ctrl_multi_outlet(OUTLET_NO_4, LOW);//打开继电器--第4路
// 反馈继电器状态
RelayState(4); //调用继电器反馈程序
} else if(state=="off")
{
ctrl_multi_outlet(OUTLET_NO_4, HIGH);//关闭继电器--第4路
// 反馈继电器状态
RelayState(4); //调用继电器反馈程序
}
}
//APP端状态手动刷新按钮
void button5_callback(const String & state)
{
for(int i=0;i<5;i++)
{
RelayState(i);
}
}
//心跳包刷新状态
void heartbeat()
{
for(int i=0;i<5;i++)
{
RelayState(i);
}
}
void setup()
{
// 初始化串口,用于调试,后期可删除
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
BLINKER_DEBUG.debugAll();
// 初始化有继电器的IO
pinMode(Relay_1, OUTPUT);
pinMode(Relay_2, OUTPUT);
pinMode(Relay_3, OUTPUT);
pinMode(Relay_4, OUTPUT);
//初始化继电器初始状态
digitalWrite(Relay_1, HIGH); //继电器为低电平触发,初始化为HIGH
digitalWrite(Relay_2, HIGH);
digitalWrite(Relay_3, HIGH);
digitalWrite(Relay_4, HIGH);
//初始化blinker
Blinker.begin(auth, ssid, pswd);//代码配网
Button.attach(button_callback); //绑定按键回调
Button1.attach(button1_callback); //绑定按键回调
Button2.attach(button2_callback); //绑定按键回调
Button3.attach(button3_callback); //绑定按键回调
Button4.attach(button4_callback); //绑定按键回调
Button5.attach(button5_callback);
//小爱同学注册回调
BlinkerMIOT.attachPowerState(miotPowerState); //注册小爱电源回调
BlinkerMIOT.attachQuery(miotQuery); //小爱设备查询的回调函数
//心跳包,初始化
Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态
}
void loop()
{
Blinker.run();
}
米家APP安装包(二维码)