esp8266Arduino开发

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安装包(二维码)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值