又双叒更新同步开关状态 ,小爱同学+app+本地按键控制状.....
本帖最后由 z01228 于 2020-4-19 16:00 编辑你有没有发现app上面的按键在操作完毕后你就不知道开关的状态了;或者小爱操作完毕后与app上面的状态不同步。下面的程序就是解决这个问题的。晚上无聊就这个问题解决了一下方便大家,我使用的是板载的led做为指示,具体应用场景大家自己发挥一下:lol。使用了心跳包大概30s~60s同步一次状态。
2020年3月4日今天更新了!今天更新了下添加了本地按键 毕竟有时候手机不在身边。这个时候本地按键就方便了
2020年4月18日15:11:06今天更新了!esp8266运行一些时间网络就情况了。今天加入软件重启,但是有一个问题就是如果原来是熄的 在网络断开重启后就会亮,。如果用EEPROM记录开关状态。如果电灯已经熄灭在发生网络断开重启时,电灯可以维持原来的状态。但如果断开电源再合上电灯将不会被点亮,只能软件操作或者本地开关(轻触开关)操作。
使用的模块照片,模块不一样程序可能需要小修改一下。
方案1.通过心跳包统一状态,不足的地方就是需要30-60s进行状态同步。
/************官方按键示例程序详细注释,方便第一次看程序的。如果有错误的及时通知下修改***************
十六进制颜色码
(#FF0000 红色)(#FFFF00 黄色)(#FFFFFF 白色)(#0000FF 蓝色)(#00FFFF 浅蓝色)(#FFFFFF白色)
程序特色1.app控制2.小爱控制3.状态同步4.添加本地按键
使用的单片机是esp8266-01s,io0接继电器,开机默认(low)动作,io2接本地轻触按键(与GND接触就动作(按下轻开才动作))
*/
#define BLINKER_WIFI //官方wifi协议库
#define BLINKER_MIOT_LIGHT //小爱灯类库
#define BLINKER_PRINT Serial //串口协议库
#include <Blinker.h> //官方库
char auth[] = "2b1****2b"; //设备key号
char ssid[] = "mi"; //wifi名称
char pswd[] = "123**780"; //wifi密码
//**软重启定义
uint32_t con_time = 0; //断网记时
int con_flag = 0; //断网标记,1为断网
void(*resetFunc) (void) = 0;//定义一个reset函数(用于重启)
int kg=0;//继电器输出
int kg2=2;//本地轻触开关,io2与gnd接时动作
//*******新建组件对象
BlinkerButton Button1("btn-abc"); //设置app按键的键名
//*******app上按下按键即会执行该函数app里按键有2种模式3钟不同样式,下面写出所有的开关状态。
void button1_callback(const String & state) //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了!: ", state); //串口打印
if (digitalRead(kg)==LOW) { //如果state是on状态
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg, HIGH);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off"); //反馈回按键状态是开
}
else if (digitalRead(kg)==HIGH) { //如果state是off状态
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg,LOW);
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on"); //反馈回按键状态是关
}
}
//*******如果小爱有对设备进行操作就执行下面
void miotPowerState(const String & state)
{
BLINKER_LOG("小爱语音操作!"); //串口打印
if (state == BLINKER_CMD_ON){
digitalWrite(kg,LOW);
BlinkerMIOT.powerState("on");
BLINKER_LOG("亮灯!");
BlinkerMIOT.print();
}
else if (state == BLINKER_CMD_OFF){
digitalWrite(kg,HIGH);
BlinkerMIOT.powerState("off");
BLINKER_LOG("灭灯!");
BlinkerMIOT.print();
}
}
//*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
void heartbeat()
{
BLINKER_LOG("状态同步!");
if (digitalRead(kg)==LOW)
{
Button1.print("on");
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
}
else
{
Button1.print("off");
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
}
}
///如果本地开关有动作执行下面手动模式
void sdms(){
if (digitalRead(kg)==HIGH&&digitalRead(kg2)==LOW) { //
Blinker.delay(150);//延时150ms不能太少标准按键成功率
if (digitalRead(kg2)==HIGH){
BLINKER_LOG("本地开关动作!");
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg,LOW);
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on");
}
}
if (digitalRead(kg)==LOW&&digitalRead(kg2)==LOW) {
Blinker.delay(150);
if (digitalRead(kg2)==HIGH){
BLINKER_LOG("本地开关动作!");
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg, HIGH);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off");
}
}
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化有LED的IO
pinMode(kg, OUTPUT);
digitalWrite(kg, LOW); //默认上电是开LOW 时的是接通继电器。
pinMode(kg2,INPUT_PULLUP); //输入上拉
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
}
void loop() {
sdms();//本地开关手动模式函数
//**软重启
if (Blinker.connected())//Blinker.connected()函数反馈网络连接状态
{
con_flag = 0;
} else
{
if (con_flag == 0)
{
con_time = millis(); //给断网时间赋初始值
con_flag = 1;
} else
{
if ((millis() - con_time) >= 90000) //判断断网时间超90秒后执行重启,这个时间可根据实际需要调整
{
resetFunc();//启用这个函数就软重启设备
}
}
}
Blinker.run();
}
方案2:直接在小爱的操作函数里反馈开关状态。不设置心跳包,可以实时的反馈开关状态。但是存在不同步的可能。
/************官方按键示例程序详细注释,方便第一次看程序的。如果有错误的及时通知下修改***************
十六进制颜色码
(#FF0000 红色)(#FFFF00 黄色)(#FFFFFF 白色)(#0000FF 蓝色)(#00FFFF 浅蓝色)(#FFFFFF白色)
程序特色1.app控制2.小爱控制3.状态同步4.添加本地按键
使用的单片机是esp8266-01s,io0接继电器,开机默认(low)动作,io2接本地轻触按键(与GND接触就动作(按下轻开才动作))
*/
#define BLINKER_WIFI //官方wifi协议库
#define BLINKER_MIOT_LIGHT //小爱灯类库
#define BLINKER_PRINT Serial //串口协议库
#include <Blinker.h> //官方库
char auth[] = "2b1fdcb2ba2b"; //设备key号
char ssid[] = "mi"; //wifi名称
char pswd[] = "123456780"; //wifi密码
int kg=0;//继电器输出
int kg2=2;//本地轻触开关,io2与gnd接时动作
//**软重启定义
uint32_t con_time = 0; //断网记时
int con_flag = 0; //断网标记,1为断网
void(*resetFunc) (void) = 0;//定义一个reset函数(用于重启)
//*******新建组件对象
BlinkerButton Button1("btn-abc"); //设置app按键的键名
//*******app上按下按键即会执行该函数app里按键有2种模式3钟不同样式,下面写出所有的开关状态。
void button1_callback(const String & state){ //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
BLINKER_LOG("app操作了!: ", state); //串口打印
if (digitalRead(kg)==LOW) { //如果state是on状态
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg, HIGH);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off"); //反馈回按键状态是开
}
else if (digitalRead(kg)==HIGH) { //如果state是off状态
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg,LOW);
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on"); //反馈回按键状态是关
}
}
//*******如果小爱有对设备进行操作就执行下面
void miotPowerState(const String & state){
BLINKER_LOG("小爱语音操作!"); //串口打印
if (state == BLINKER_CMD_ON){
digitalWrite(kg,LOW);
BlinkerMIOT.powerState("on");
BLINKER_LOG("亮灯!");
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on"); //反馈回按键状态是关
BlinkerMIOT.print();
}
else if (state == BLINKER_CMD_OFF){
digitalWrite(kg,HIGH);
BlinkerMIOT.powerState("off");
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off"); //反馈回按键状态是开
BLINKER_LOG("灭灯!");
BlinkerMIOT.print();
}
}
///如果本地开关有动作执行下面手动模式
void sdms(){
//BLINKER_LOG("本地开关动作!");
if (digitalRead(kg)==HIGH&&digitalRead(kg2)==LOW) { //
Blinker.delay(150);//延时150ms不能太少标准按键成功率
if (digitalRead(kg2)==HIGH){
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg,LOW);
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on");
}
}
if (digitalRead(kg)==LOW&&digitalRead(kg2)==LOW) {
Blinker.delay(150);
if (digitalRead(kg2)==HIGH){
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg, HIGH);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off");
}
}
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化有LED的IO
pinMode(kg, OUTPUT);
digitalWrite(kg, LOW); //默认上电是开LOW 时的是接通继电器。
pinMode(kg2,INPUT_PULLUP); //输入上拉
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
}
void loop() {
sdms();//本地开关手动模式函数
//**软重启
if (Blinker.connected())//Blinker.connected()函数反馈网络连接状态
{
con_flag = 0;
} else
{
if (con_flag == 0)
{
con_time = millis(); //给断网时间赋初始值
con_flag = 1;
} else
{
if ((millis() - con_time) >= 90000) //判断断网时间超90秒后执行重启,这个时间可根据实际需要调整
{
resetFunc();//启用这个函数就软重启设备
}
}
}
Blinker.run();
}
本帖最后由 YLGZS 于 2020-3-19 20:36 编辑
这是我根据楼主的代码稍加更改的。加了自动配网:lol
/************官方按键示例程序详细注释,方便第一次看程序的。如果有错误的及时通知下修改***************
十六进制颜色码
(#FF0000 红色)(#FFFF00 黄色)(#FFFFFF 白色)(#0000FF 蓝色)(#00FFFF 浅蓝色)(#FFFFFF白色)
程序特色1.app控制2.小爱控制3.状态同步4.添加本地按键
使用的单片机是esp8266-01s,io0接继电器,开机默认(low)动作,io2接本地轻触按键(与GND接触就动作(按下轻开才动作))
*/
#define BLINKER_WIFI //官方wifi协议库
#define BLINKER_ESP_SMARTCONFIG // 进行配网
#define BLINKER_MIOT_LIGHT //小爱灯类库
#define BLINKER_PRINT Serial //串口协议库
#include <Blinker.h> //官方库
char auth[] = "**************"; //设备key号
//char ssid[] = "mi"; //wifi名称
//char pswd[] = "123**780"; //wifi密码
int kg=0;//继电器输出
int kg2=2;//本地轻触开关,io2与gnd接时动作
//*******新建组件对象
BlinkerButton Button1("btn-abc"); //设置app按键的键名
//*******app上按下按键即会执行该函数app里按键有2种模式3钟不同样式,下面写出所有的开关状态。
void button1_callback(const String & state) //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了!: ", state); //串口打印
if (digitalRead(kg)==HIGH) { //如果state是on状态
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg, LOW);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off"); //反馈回按键状态是开
}
else if (digitalRead(kg)==LOW) { //如果state是off状态
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg,HIGH);
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on"); //反馈回按键状态是关
}
}
//*******如果小爱有对设备进行操作就执行下面
void miotPowerState(const String & state)
{
BLINKER_LOG("小爱语音操作!"); //串口打印
if (state == BLINKER_CMD_ON){
digitalWrite(kg,HIGH);
BlinkerMIOT.powerState("on");
BLINKER_LOG("亮灯!");
BlinkerMIOT.print();
}
else if (state == BLINKER_CMD_OFF){
digitalWrite(kg,LOW);
BlinkerMIOT.powerState("off");
BLINKER_LOG("灭灯!");
BlinkerMIOT.print();
}
}
//*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
void heartbeat()
{
BLINKER_LOG("状态同步!");
if (digitalRead(kg)==HIGH)
{
Button1.print("on");
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
}
else
{
Button1.print("off");
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
}
}
///如果本地开关有动作执行下面手动模式
void sdms(){
if (digitalRead(kg)==LOW&&digitalRead(kg2)==LOW) { //
Blinker.delay(150);//延时150ms不能太少标准按键成功率
if (digitalRead(kg2)==HIGH){
BLINKER_LOG("本地开关动作!");
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg,HIGH);
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on");
}
}
if (digitalRead(kg)==HIGH&&digitalRead(kg2)==LOW) {
Blinker.delay(150);
if (digitalRead(kg2)==HIGH){
BLINKER_LOG("本地开关动作!");
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg, LOW);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off");
}
}
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化有LED的IO
pinMode(kg, OUTPUT);
digitalWrite(kg, LOW); //默认上电是关 LOW 时的是断开继电器。
pinMode(kg2,INPUT_PULLUP); //输入上拉
// 初始化blinker
Blinker.begin(auth);//, ssid, pswd
Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
}
void loop() {
sdms();//本地开关手动模式函数
Blinker.run();
}
界面配置代码
{¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨light¨¨background¨{¨img¨¨assets/img/headerbg.jpg¨¨isFull¨«}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-power-off¨¨mode¨É¨t0¨¨文本1¨¨t1¨¨文本2¨¨bg¨É¨cols¨Ë¨rows¨Ë¨key¨¨btn-abc¨´x´Ì´y´Ñ¨speech¨|÷¨lstyle¨Ê}{ßA¨deb¨ßEÉßJÉßKÑßLÌßM¨debug¨´x´É´y´Í}÷¨actions¨|÷¨triggers¨|÷}
四路本地控制+小爱同学+配网+反馈【根据楼主代码更改+B站学习】
原理:插座多路控制。
注意:下面大多注释不正确,我太累了不想修改。不影响使用。
代码有些累赘,有大神可以的话帮忙修改一下,谢谢。
/************官方按键示例程序详细注释,方便第一次看程序的。如果有错误的及时通知下修改***************
十六进制颜色码
(#FF0000 红色)(#FFFF00 黄色)(#FFFFFF 白色)(#0000FF 蓝色)(#00FFFF 浅蓝色)(#FFFFFF白色)
程序特色1.app控制2.小爱控制3.状态同步4.添加本地按键
使用的单片机是esp8266-12E,io0接继电器,开机默认(low)动作,io2接本地轻触按键(与GND接触就动作(按下轻开才动作))
*/
#define BLINKER_WIFI //官方wifi协议库
#define BLINKER_ESP_SMARTCONFIG // 进行配网
#define BLINKER_MIOT_MULTI_OUTLET //设置为小爱多个插座的模式
#define BLINKER_PRINT Serial //串口协议库
#include <Blinker.h> //官方库
char auth[] = "e2b8e75b7b29"; //设备key号
//char ssid[] = "mi"; //wifi名称
//char pswd[] = "123**780"; //wifi密码
//灯
int kg1=14;//1 D5
int kg2=12;//2 D6
int kg3=13;//3 D7
int kg4=15;//4 D8
//开关
int kg5=5;//1本地轻触开关,io2与gnd接时动作 D1
int kg6=4;//2D2
int kg7=0;//3D3
int kg8=2;//4D4
//*******新建组件对象 设置app按键的键名
BlinkerButton Button1("btn-1");
BlinkerButton Button2("btn-2");
BlinkerButton Button3("btn-3");
BlinkerButton Button4("btn-4");
//*******app上按下按键即会执行该函数app里按键有2种模式3钟不同样式,下面写出所有的开关状态。
////////////////////////////////////////////////////////////////////////////1
void button1_callback(const String & state) //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了 按键1 : ", state); //串口打印
if (digitalRead(kg1)==HIGH) { //如果state是on状态
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg1, LOW);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off"); //反馈回按键状态是关
}
else if (digitalRead(kg1)==LOW) { //如果state是off状态
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg1,HIGH);
Button1.color("#FFFF00"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on"); //反馈回按键状态是开
}
}
///////////////////////////////////////////////////////////////////////////////2
void button2_callback(const String & state) //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了 按键2 : ", state); //串口打印
if (digitalRead(kg2)==HIGH) { //如果state是on状态
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg2, LOW);
Button2.color("#00FFFF"); //设置app按键是深蓝色
Button2.text("灭");
Button2.print("off"); //反馈回按键状态是关
}
else if (digitalRead(kg2)==LOW) { //如果state是off状态
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg2,HIGH);
Button2.color("#0000FF"); //设置app按键是浅蓝色
Button2.text("亮");
Button2.print("on"); //反馈回按键状态是开
}
}
//////////////////////////////////////////////////////////////////////////3
void button3_callback(const String & state) //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了 按键3 : ", state); //串口打印
if (digitalRead(kg3)==HIGH) { //如果state是on状态
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg3, LOW);
Button3.color("#00FFFF"); //设置app按键是深蓝色
Button3.text("灭");
Button3.print("off"); //反馈回按键状态是关
}
else if (digitalRead(kg3)==LOW) { //如果state是off状态
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg3,HIGH);
Button3.color("#FF0000"); //设置app按键是浅蓝色
Button3.text("亮");
Button3.print("on"); //反馈回按键状态是开
}
}
/////////////////////////////////////////////////////////////////////////4
void button4_callback(const String & state) //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了 按键4 : ", state); //串口打印
if (digitalRead(kg4)==HIGH) { //如果state是on状态
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg4, LOW);
Button4.color("#00FFFF"); //设置app按键是深蓝色
Button4.text("灭");
Button4.print("off"); //反馈回按键状态是关
}
else if (digitalRead(kg4)==LOW) { //如果state是off状态
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg4,HIGH);
Button4.color("#006400"); //设置app按键是浅蓝色
Button4.text("亮");
Button4.print("on"); //反馈回按键状态是开
}
}
void Set_Butt(int num) //on反馈
{
if (num == 1) {
Button1.color("#FFFF00"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on");
} else if (num == 2) {
Button2.color("#0000FF"); //设置app按键是浅蓝色
Button2.text("亮");
Button2.print("on");
} else if (num == 3) {
Button3.color("#FF0000"); //设置app按键是浅蓝色
Button3.text("亮");
Button3.print("on");
} else if (num == 4) {
Button4.color("#006400"); //设置app按键是浅蓝色
Button4.text("亮");
Button4.print("on");
}
}
void Reset_Butt(int num) //off反馈
{
if (num == 1) {
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off");
} else if (num == 2) {
Button2.color("#00FFFF"); //设置app按键是深蓝色
Button2.text("灭");
Button2.print("off");
} else if (num == 3) {
Button3.color("#00FFFF"); //设置app按键是深蓝色
Button3.text("灭");
Button3.print("off");
} else if (num == 4) {
Button4.color("#00FFFF"); //设置app按键是深蓝色
Button4.text("灭");
Button4.print("off");
}
}
//*******如果小爱有对设备进行操作就执行下面
char Port;
int Feedback = 0;
int OnorOff = 0;
void miotPowerState(const String & state, uint8_t num) //小爱控制函数
{
BLINKER_LOG("need set outlet: ", num, ", power state: ", state);
if (num == 1) {
Feedback = 1;
Port = kg1; //指定每一路开关对应在开发板上的通道接口
} else if (num == 2) {
Feedback = 2;
Port = kg2;
} else if (num == 3) {
Feedback = 3;
Port = kg3;
} else if (num == 4) {
Feedback = 4;
Port = kg4;
}
if (state == BLINKER_CMD_ON) {
OnorOff = 1;
if(num == 0)
{
Feedback = 5;
digitalWrite(kg1, HIGH);
digitalWrite(kg2, HIGH);
digitalWrite(kg3, HIGH);
digitalWrite(kg4, HIGH);
}
else
{
digitalWrite(Port, HIGH);
}
BlinkerMIOT.powerState("on", num);
BlinkerMIOT.print();
}
else if (state == BLINKER_CMD_OFF) {
OnorOff = 2;
if(num == 0)
{
Feedback = 5;
digitalWrite(kg1, LOW);
digitalWrite(kg2, LOW);
digitalWrite(kg3, LOW);
digitalWrite(kg4, LOW);
}
else
{
digitalWrite(Port, LOW);
}
BlinkerMIOT.powerState("off", num);
BlinkerMIOT.print();
}
}
//*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
void heartbeat()
{
BLINKER_LOG("状态同步!");
//////////////////////////////////////////////1
if (digitalRead(kg1)==HIGH)
{
Button1.print("on");
Button1.color("#FFFF00"); //设置app按键是浅蓝色
Button1.text("亮");
}
else
{
Button1.print("off");
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
}
////////////////////////////////////////////////2
if (digitalRead(kg2)==HIGH)
{
Button2.print("on");
Button2.color("#0000FF"); //设置app按键是浅蓝色
Button2.text("亮");
}
else
{
Button2.print("off");
Button2.color("#00FFFF"); //设置app按键是深蓝色
Button2.text("灭");
}
//////////////////////////////////////////////////3
if (digitalRead(kg3)==HIGH)
{
Button3.print("on");
Button3.color("#FF0000"); //设置app按键是浅蓝色
Button3.text("亮");
}
else
{
Button3.print("off");
Button3.color("#00FFFF"); //设置app按键是深蓝色
Button3.text("灭");
}
//////////////////////////////////////////4
if (digitalRead(kg4)==HIGH)
{
Button4.print("on");
Button4.color("#006400"); //设置app按键是浅蓝色
Button4.text("亮");
}
else
{
Button4.print("off");
Button4.color("#00FFFF"); //设置app按键是深蓝色
Button4.text("灭");
}
}
///如果本地开关有动作执行下面手动模式
void sdms(){
//////////////////////////////////////////////////////////////
if (digitalRead(kg1)==LOW&&digitalRead(kg5)==LOW) {
Blinker.delay(150);//延时150ms不能太少标准按键成功率
if (digitalRead(kg5)==HIGH){
BLINKER_LOG("本地开关1");
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg1,HIGH);
Button1.color("#FFFF00"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on");
}
}
if (digitalRead(kg1)==HIGH&&digitalRead(kg5)==LOW) {
Blinker.delay(150); //延时150ms不能太少标准按键成功率
if (digitalRead(kg5)==HIGH){
BLINKER_LOG("本地开关1");
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg1, LOW);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off");
}
}
////////////////////////////////////////////////////////////////////////////
if (digitalRead(kg2)==LOW&&digitalRead(kg6)==LOW) {
Blinker.delay(150);//延时150ms不能太少标准按键成功率
if (digitalRead(kg6)==HIGH){
BLINKER_LOG("本地开关2");
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg2,HIGH);
Button2.color("#0000FF"); //设置app按键是浅蓝色
Button2.text("亮");
Button2.print("on");
}
}
if (digitalRead(kg2)==HIGH&&digitalRead(kg6)==LOW) {
Blinker.delay(150); //延时150ms不能太少标准按键成功率
if (digitalRead(kg6)==HIGH){
BLINKER_LOG("本地开关2");
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg2, LOW);
Button2.color("#00FFFF"); //设置app按键是深蓝色
Button2.text("灭");
Button2.print("off");
}
}
///////////////////////////////////////////////////////////
if (digitalRead(kg3)==LOW&&digitalRead(kg7)==LOW) {
Blinker.delay(150);//延时150ms不能太少标准按键成功率
if (digitalRead(kg7)==HIGH){
BLINKER_LOG("本地开关3");
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg3,HIGH);
Button3.color("#FF0000"); //设置app按键是浅蓝色
Button3.text("亮");
Button3.print("on");
}
}
if (digitalRead(kg3)==HIGH&&digitalRead(kg7)==LOW) {
Blinker.delay(150); //延时150ms不能太少标准按键成功率
if (digitalRead(kg7)==HIGH){
BLINKER_LOG("本地开关3");
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg3, LOW);
Button3.color("#00FFFF"); //设置app按键是深蓝色
Button3.text("灭");
Button3.print("off");
}
}
/////////////////////////////////////////////////////
if (digitalRead(kg4)==LOW&&digitalRead(kg8)==LOW) {
Blinker.delay(150);//延时150ms不能太少标准按键成功率
if (digitalRead(kg8)==HIGH){
BLINKER_LOG("本地开关4");
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg4,HIGH);
Button4.color("#006400"); //设置app按键是浅蓝色
Button4.text("亮");
Button4.print("on");
}
}
if (digitalRead(kg4)==HIGH&&digitalRead(kg8)==LOW) {
Blinker.delay(150); //延时150ms不能太少标准按键成功率
if (digitalRead(kg8)==HIGH){
BLINKER_LOG("本地开关4");
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg4, LOW);
Button4.color("#00FFFF"); //设置app按键是深蓝色
Button4.text("灭");
Button4.print("off");
}
}
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化有LED的IO
pinMode(kg1, OUTPUT);
digitalWrite(kg1, LOW); //默认上电是开LOW 时的是断开继电器。
pinMode(kg5,INPUT_PULLUP); //输入上拉
///////////////////////////////////////////
pinMode(kg2, OUTPUT);
digitalWrite(kg2, LOW); //默认上电是开LOW 时的是断开继电器。
pinMode(kg6,INPUT_PULLUP); //输入上拉
////////////////////////////////
pinMode(kg3, OUTPUT);
digitalWrite(kg3, LOW); //默认上电是开LOW 时的是断开继电器。
pinMode(kg7,INPUT_PULLUP); //输入上拉
////////////////////////////////////
pinMode(kg4, OUTPUT);
digitalWrite(kg4, LOW); //默认上电是开LOW 时的是断开继电器。
pinMode(kg8,INPUT_PULLUP); //输入上拉
// 初始化blinker
Blinker.begin(auth);//, ssid, pswd
Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
Button2.attach(button2_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
Button3.attach(button3_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
Button4.attach(button4_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
}
int i=0;
long F_time = 0;
int count=0;
void loop() {
sdms();//本地开关手动模式函数
Blinker.run();
if(OnorOff == 0)
{
}
else if(OnorOff == 1)//如果是ON状态
{
delay(1000);
if(Feedback < 5)//小于5 是单独控制 1-4
{
Set_Butt(Feedback);//反馈1-4
OnorOff = 0;
}else if(Feedback == 5)//等于5 是打开所有然后1.2s每个的速度反馈所有
{
if(millis() - F_time >=0)
{
F_time = millis();
i++;
Set_Butt(i);
i%=4;
if(i == 0) //当所有状态反馈完毕则退出
{
Feedback = 0;
OnorOff = 0;
}
}
}
}
else if(OnorOff == 2)
{
delay(1000);
if(Feedback < 5)//小于5 是单独控制 1-4
{
Reset_Butt(Feedback);//反馈1-4
OnorOff = 0;
}else if(Feedback == 5)//等于5 是 关闭 所有然后1.2s每个的速度反馈所有
{
if(millis() - F_time >=0)
{
F_time = millis();
i++;
Reset_Butt(i);
i%=4;
if(i == 0) //当所有状态反馈完毕则退出
{
Feedback = 0;
OnorOff = 0;
}
}
}
}
}
手机界面代码:
{¨config¨{¨headerColor¨¨transparent¨¨headerStyle¨¨light¨¨background¨{¨img¨¨assets/img/bg/f2.jpg¨¨isFull¨»}}¨dashboard¨|{¨type¨¨btn¨¨ico¨¨fal fa-lightbulb-on¨¨mode¨Ê¨t0¨´1´¨t1¨¨文本2¨¨bg¨É¨cols¨Í¨rows¨Í¨key¨¨btn-1¨´x´É´y´Ñ¨speech¨|÷¨lstyle¨Ë}{ßAßBßCßDßEÊßF´2´ßGßHßIÉßJÍßKÍßL¨btn-2¨´x´Í´y´ÑßN|÷ßOË}{ßAßBßCßDßEÊßF´3´ßGßHßIÉßJÍßKÍßL¨btn-3¨´x´É´y´¤CßN|÷ßOË}{ßAßBßCßDßEÊßF´4´ßGßHßIÉßJÍßKÍßL¨btn-4¨´x´Í´y´¤CßN|÷ßOË}{ßA¨deb¨ßEÊßIÉßJÑßKÍßL¨debug¨´x´É´y´ÉßN|÷ßOÊ}÷¨actions¨|÷¨triggers¨|÷} 注释很到位,解释很清楚!:lol 本帖最后由 z01228 于 2020-3-7 12:43 编辑
sunofsun 发表于 2020-3-4 08:36
注释很到位,解释很清楚!
要的就是方便新人:lol 毕竟我也是这样过来的 你好,楼主,我现在在想,在电路中增加一个按键,按一下开或关。同时将状态同步在app中的按钮。我现在一直找不到解决办法。想问一下有什么解决方法。
本帖最后由 z01228 于 2020-3-7 08:01 编辑
一入极客深似海 发表于 2020-3-6 17:21
你好,楼主,我现在在想,在电路中增加一个按键,按一下开或关。同时将状态同步在app中的按钮。我现在一直 ...
这个很好解决吧 但是1s不知道可不可以用。我假设控制的io开是o低电平触发+硬件防抖在loop这个里面加这个if(digitalRead(LED_BUILTIN)==LOW&&digitalRead(0)==LOW){ BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(LED_BUILTIN,LOW);
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on");}
if(digitalRead(LED_BUILTIN)==HIGH&&digitalRead(0)==LOW){
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(LED_BUILTIN, HIGH);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off");}
z01228 发表于 2020-3-7 08:00
这个很好解决吧 但是1s不知道可不可以用。我假设控制的io开是o低电平触发+硬件防抖在loop这个里面加这 ...
好的,我试一下,谢谢 z01228 发表于 2020-3-7 08:00
这个很好解决吧 但是1s不知道可不可以用。我假设控制的io开是o低电平触发+硬件防抖在loop这个里面加这 ...
楼主 ,我把你程序中的LED_BUILTIN定义了一个引脚并输出。这一块没问题。然后加上你给的按键中的程序就有一行一直不能编译通过。
劳您大驾,给看看是怎么回事?
/*我自定义的了一个读取按键状态的引脚*/
#define Socket2 D6 //电路中的按键
/*引脚设为输入状态*/
void setup()
{
pinMode(Socket2, INPUT);
}
/*这一段是整个loop中的函数*/
void loop() {
Blinker.run();
if(digitalRead(LED_BUILTIN) ==LOW&&digitalRead(Socket2)==LOW){
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(LED_BUILTIN,LOW);
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on"); }
if(digitalRead(LED_BUILTIN)==HIGH&&digitalRead(Socket2)==LOW){ //编译在这一行出错显示内容为:stray '\357' in program
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(LED_BUILTIN, HIGH);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off");}
}
你这一段程序,我什么都不加,直接放进去也不行。也是那一行编译不通过
一入极客深似海 发表于 2020-3-6 17:21
你好,楼主,我现在在想,在电路中增加一个按键,按一下开或关。同时将状态同步在app中的按钮。我现在一直 ...
你是怎样实现即用物理开关控制又用APP控制的呢?求教 本帖最后由 z01228 于 2020-3-8 13:20 编辑
不会飞的猪 发表于 2020-3-7 12:22
你是怎样实现即用物理开关控制又用APP控制的呢?求教
你用这个试一试。我加了程序防抖。这个程序可以app+小爱+本地按键控制。状态也可以同步。
/************官方按键示例程序详细注释,方便第一次看程序的。如果有错误的及时通知下修改***************
十六进制颜色码
(#FF0000 红色)(#FFFF00 黄色)(#FFFFFF 白色)(#0000FF 蓝色)(#00FFFF 浅蓝色)(#FFFFFF白色)
程序特色1.app控制2.小爱控制3.状态同步4.添加本地按键
使用的单片机是esp8266-01s,io0接继电器,开机默认(low)动作,io2接本地轻触按键(与GND接触就动作(按下轻开才动作))
*/
#define BLINKER_WIFI //官方wifi协议库
#define BLINKER_MIOT_LIGHT //小爱灯类库
#define BLINKER_PRINT Serial //串口协议库
#include <Blinker.h> //官方库
char auth[] = "2b1****2b"; //设备key号
char ssid[] = "mi"; //wifi名称
char pswd[] = "123**780"; //wifi密码
int kg=0;//继电器输出
int kg2=2;//本地轻触开关,io2与gnd接时动作
//*******新建组件对象
BlinkerButton Button1("btn-abc"); //设置app按键的键名
//*******app上按下按键即会执行该函数app里按键有2种模式3钟不同样式,下面写出所有的开关状态。
void button1_callback(const String & state) //用state来存储组键的值按键 : "tap"(点按); "pre"(长按); "pup"(释放)开关 : "on"(打开); "off"(关闭)
{
BLINKER_LOG("app操作了!: ", state); //串口打印
if (digitalRead(kg)==LOW) { //如果state是on状态
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg, HIGH);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off"); //反馈回按键状态是开
}
else if (digitalRead(kg)==HIGH) { //如果state是off状态
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg,LOW);
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on"); //反馈回按键状态是关
}
}
//*******如果小爱有对设备进行操作就执行下面
void miotPowerState(const String & state)
{
BLINKER_LOG("小爱语音操作!"); //串口打印
if (state == BLINKER_CMD_ON){
digitalWrite(kg,LOW);
BlinkerMIOT.powerState("on");
BLINKER_LOG("亮灯!");
BlinkerMIOT.print();
}
else if (state == BLINKER_CMD_OFF){
digitalWrite(kg,HIGH);
BlinkerMIOT.powerState("off");
BLINKER_LOG("灭灯!");
BlinkerMIOT.print();
}
}
//*******app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态30s~60s一次
void heartbeat()
{
BLINKER_LOG("状态同步!");
if (digitalRead(kg)==LOW)
{
Button1.print("on");
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
}
else
{
Button1.print("off");
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
}
}
///如果本地开关有动作执行下面手动模式
void sdms(){
if (digitalRead(kg)==HIGH&&digitalRead(kg2)==LOW) { //
Blinker.delay(150);//延时150ms不能太少标准按键成功率
if (digitalRead(kg2)==HIGH){
BLINKER_LOG("本地开关动作!");
BLINKER_LOG("亮灯!"); //串口打印
digitalWrite(kg,LOW);
Button1.color("#0000FF"); //设置app按键是浅蓝色
Button1.text("亮");
Button1.print("on");
}
}
if (digitalRead(kg)==LOW&&digitalRead(kg2)==LOW) {
Blinker.delay(150);
if (digitalRead(kg2)==HIGH){
BLINKER_LOG("本地开关动作!");
BLINKER_LOG("灭灯!"); //串口打印
digitalWrite(kg, HIGH);
Button1.color("#00FFFF"); //设置app按键是深蓝色
Button1.text("灭");
Button1.print("off");
}
}
}
void setup()
{
// 初始化串口
Serial.begin(115200);
BLINKER_DEBUG.stream(Serial);
// 初始化有LED的IO
pinMode(kg, OUTPUT);
digitalWrite(kg, LOW); //默认上电是开LOW 时的是接通继电器。
pinMode(kg2,INPUT_PULLUP); //输入上拉
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Button1.attach(button1_callback); //app上操作必须的注册回调函数关联按键名“Button1”和判断程序“button1_callback"
BlinkerMIOT.attachPowerState(miotPowerState); //小爱语音操作注册函数
Blinker.attachHeartbeat(heartbeat); //app定时向设备发送心跳包, 设备收到心跳包后会返回设备当前状态进行语音操作和app操作同步。
}
void loop() {
sdms();//本地开关手动模式函数
Blinker.run();
}
一入极客深似海 发表于 2020-3-7 11:28
楼主 ,我把你程序中的LED_BUILTIN定义了一个引脚并输出。这一块没问题。然后加上你给的按键中的程序就有 ...
应该是你没有定义好io口 我重新写了下程序你试一试