失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 8266 + 巴法云 小爱远程控制电脑开关机 arduino

8266 + 巴法云 小爱远程控制电脑开关机 arduino

时间:2022-11-25 11:52:16

相关推荐

8266 + 巴法云 小爱远程控制电脑开关机 arduino

暂时保存下 还在继续改进准备用小封装的芯片晒笔记本里面去

需求

可能需要在外面远程家里的电脑???没有需求创造需求

然后小爱可以控制电脑开关机

物联网基于 巴法云搭建 (白嫖且没有设备数量的限制)兼容小爱

巴法云的链接:

/tcp/index.html 对应的文档 /docs/#/

如何用巴法云接入小爱:

米家APP - 我的-其他平台设备-找到巴法云-同步设备

设计思路

1、当发送开机或关机指令后(on/off),启动1s的继电器,让电脑主板上的power swich 短接。2、 将无线遥控器接入的引脚与8266 相接 ,通过遥控器控制。就可以将主机隐藏起来 不需要往下摸开机键 3、通过巴法云接入小爱同学,通过小爱音响控制电脑开关4、巴法云平台的设备当前的开关状态是根据最后一条指令决定的,为了解决手动关机后状态不刷新的问题,加了个继电器当作在线的flag信号,在手动开机或者关机后,能够更新“开关”的状态。

电路

RL2继电器为3V继电器,RL3 为5V继电器。

PC-flag对应的地,为PC主板上JUSB的5V的Power和Ground的引脚。

PC-power 和gound为主板与前面板相连的power Switch+ - 直接并联,这样就不会影响原来的开机键

315a-D3 接下图中的D3接收模块。

其他Dx引脚为8266的引脚。

(ps:不关注开关状态的还可以去掉RL3的相关电路)

程序说明

基于巴法云的案例程序修改,

1、当PC-flag变化时向服务器发送 on 或者 off (ps:本机(a)发送命令给服务器不会在传回来,其他终端(b)发送本机(a)开机指令到服务器,会发到对应本机(a))。

2、增加中断: 遥控按键按下时会触发中断,短接开机键1s

3、开关程序都是 短按开机键1s

4、(目前选择的为巴法云的中电风扇设备 1档二档三档功能未设置)

程序

/** 智能语言控制控制,支持天猫、小爱、小度、google Assistent同时控制* -08-12* QQ交流群:566565915* 官网 */#include <ESP8266WiFi.h>#include <Arduino.h>#include <U8g2lib.h>//#define server_ip "192.168.31.224" //巴法云服务器地址默认即可#define server_ip "" //巴法云服务器地址默认即可#define server_port "8344" //服务器端口,tcp创客云端口8344//IO引脚定义// const int D0 = 16;const int D1 = 5;const int D2 = 4;const int D3 = 0;const int D4 = 2;const int D5 = 14;//开关机 const int D6 = 12;//重启 const int D7 = 13;//开机状态输入 const int D8 = 15;//按键A输入 默认低电平 高电平触发中断const int D9 = 3;//const int D10 = 1;//********************需要修改的部分*******************//#define wifi_name "wifi名字"//WIFI名称,区分大小写,不要写错#define wifi_password "wifi密码" //WIFI密码String UID = " xxxxxxxxxxxxxxxxxxx"; //用户私钥,可在控制台获取,修改为自己的UIDString TOPIC = "remPC003"; //主题名字,可在控制台新建const int PC_open = D5 ;//LED_BUILTIN //单片机LED引脚值,D2是NodeMcu引脚命名方式,其他esp8266型号将D2改为自己的引脚const int PC_Re = D6 ; const int PC_flag = D7 ; const int reto_A = D8 ; int OLED_Refresh =0;bool int_flag=0;int int_num=0;//**************************************************////最大字节数#define MAX_PACKETSIZE 512//设置心跳值30s#define KEEPALIVEATIME 25*1000//30*1000//tcp客户端相关初始化,默认即可WiFiClient TCPclient;String TcpClient_Buff = "";//初始化字符串,用于接收服务器发来的数据unsigned int TcpClient_BuffIndex = 0;unsigned long TcpClient_preTick = 0;unsigned long preHeartTick = 0;//心跳unsigned long preTCPStartTick = 0;//连接bool preTCPConnected = false;//相关函数初始化//连接WIFIvoid doWiFiTick();void startSTA();//TCP初始化连接void doTCPClientTick();void startTCPClient();void sendtoTCPServer(String p);//led控制函数,具体函数内容见下方void turnOnLed();void turnOffLed();void ReturnOnLed();/**发送数据到TCP服务器*/void sendtoTCPServer(String p){if (!TCPclient.connected()) {Serial.println("Client is not readly");return;}TCPclient.print(p);}/**初始化和服务器建立连接*/void startTCPClient(){if(TCPclient.connect(server_ip, atoi(server_port))){Serial.print("\nConnected to server:");Serial.printf("%s:%d\r\n",server_ip,atoi(server_port));String tcpTemp=""; //初始化字符串tcpTemp = "cmd=1&uid="+UID+"&topic="+TOPIC+"\r\n"; //构建订阅指令sendtoTCPServer(tcpTemp); //发送订阅指令tcpTemp="";//清空/*//如果需要订阅多个主题,可再次发送订阅指令tcpTemp = "cmd=1&uid="+UID+"&topic="+主题2+"\r\n"; //构建订阅指令sendtoTCPServer(tcpTemp); //发送订阅指令tcpTemp="";//清空*/preTCPConnected = true;preHeartTick = millis();TCPclient.setNoDelay(true);}else{Serial.print("Failed connected to server:");Serial.println(server_ip);TCPclient.stop();preTCPConnected = false;}preTCPStartTick = millis();}/**检查数据,发送心跳*/void doTCPClientTick(){//检查是否断开,断开后重连if(WiFi.status() != WL_CONNECTED) return;if (!TCPclient.connected()) {//断开重连if(preTCPConnected == true){preTCPConnected = false;preTCPStartTick = millis();Serial.println();Serial.println("TCP Client disconnected.");TCPclient.stop();}else if(millis() - preTCPStartTick > 1*1000)//重新连接startTCPClient();}else{if (TCPclient.available()) {//收数据char c =TCPclient.read();TcpClient_Buff +=c;TcpClient_BuffIndex++;TcpClient_preTick = millis();if(TcpClient_BuffIndex>=MAX_PACKETSIZE - 1){TcpClient_BuffIndex = MAX_PACKETSIZE-2;TcpClient_preTick = TcpClient_preTick - 200;}preHeartTick = millis();}if(millis() - preHeartTick >= KEEPALIVEATIME){//保持心跳preHeartTick = millis();Serial.println("--Keep alive:");sendtoTCPServer("ping\r\n"); //发送心跳,指令需\r\n结尾,详见接入文档介绍}}if((TcpClient_Buff.length() >= 1) && (millis() - TcpClient_preTick>=200)){TCPclient.flush();Serial.print("Rev string: ");TcpClient_Buff.trim(); //去掉首位空格Serial.println(TcpClient_Buff); //打印接收到的消息String getTopic = "";String getMsg = "";String get_Acsr_Msg= "";int AcsrmsgIndex;if(TcpClient_Buff.length() > 15){//注意TcpClient_Buff只是个字符串,在上面开头做了初始化 String TcpClient_Buff = "";//此时会收到推送的指令,指令大概为 cmd=2&uid=xxx&topic=light002&msg=offint topicIndex = TcpClient_Buff.indexOf("&topic=")+7; //c语言字符串查找,查找&topic=位置,并移动7位,不懂的可百度c语言字符串查找int msgIndex = TcpClient_Buff.indexOf("&msg=");//c语言字符串查找,查找&msg=位置AcsrmsgIndex=msgIndex+2;getTopic = TcpClient_Buff.substring(topicIndex,msgIndex);//c语言字符串截取,截取到topic,不懂的可百度c语言字符串截取getMsg = TcpClient_Buff.substring((msgIndex+5),(msgIndex+7));//c语言字符串截取,截取到消息Serial.print("topic:------");Serial.println(getTopic); //打印截取到的主题值Serial.print("msg:--------");Serial.println(getMsg); //打印截取到的消息值}if(getMsg == "on"){//如果是消息==打开 //一档get_Acsr_Msg=TcpClient_Buff.substring((AcsrmsgIndex+5));Serial.println(get_Acsr_Msg); if(get_Acsr_Msg == "#1"){ReturnOnLed();}//二档else if (get_Acsr_Msg == "#2"){ReturnOnLed();Serial.println("D6 on"); }else{turnOnLed();}}else if(getMsg == "of"){//如果是消息==关闭turnOffLed();}TcpClient_Buff="";TcpClient_BuffIndex = 0;}}/**初始化wifi连接*/void startSTA(){WiFi.disconnect();WiFi.mode(WIFI_STA);WiFi.begin(wifi_name, wifi_password);}/**************************************************************************WIFI***************************************************************************//*WiFiTick检查是否需要初始化WiFi检查WiFi是否连接上,若连接成功启动TCP Client控制指示灯*/void doWiFiTick(){static bool startSTAFlag = false;static bool taskStarted = false;static uint32_t lastWiFiCheckTick = 0;if (!startSTAFlag) {startSTAFlag = true;startSTA();}//未连接1s重连if ( WiFi.status() != WL_CONNECTED ) {if (millis() - lastWiFiCheckTick > 1000) {lastWiFiCheckTick = millis();}}//连接成功建立else {if (taskStarted == false) {taskStarted = true;Serial.print("\r\nGet IP Address: ");Serial.println(WiFi.localIP());startTCPClient();}}}//打开void turnOnLed(){Serial.println("Turn ON");digitalWrite(PC_open,LOW);delay(1000);digitalWrite(PC_open,HIGH);}//关闭void turnOffLed(){Serial.println("Turn OFF");digitalWrite(PC_open,LOW);delay(1000);digitalWrite(PC_open,HIGH);}void ReturnOnLed(){Serial.println("ReTurn ON");digitalWrite(PC_Re,HIGH);delay(1000);digitalWrite(PC_Re,LOW);}//InPUTint PC_flag_temp=0;void INIO(){if(PC_flag_temp != digitalRead(PC_flag)){PC_flag_temp = digitalRead(PC_flag);if(digitalRead(PC_flag) == HIGH){String temp= "cmd=2&uid="+UID+"&topic="+TOPIC+"&msg=off\r\n";Serial.println(temp);sendtoTCPServer(temp); OLED_Refresh=1;}else if(digitalRead(PC_flag) == LOW){String temp= "cmd=2&uid="+UID+"&topic="+TOPIC+"&msg=on\r\n";Serial.println(temp);sendtoTCPServer(temp); OLED_Refresh=1;}}}//中断程序ICACHE_RAM_ATTR void GPIO8_INTERRUPT(void){int_flag = ~int_flag; //中断标志位Serial.println("int creat");}//中断执行程序void int_deal(){if(int_flag == 1 ){//Serial.println("i_int...");//Serial.println(int_flag);digitalWrite(PC_open,LOW);delay(1000);digitalWrite(PC_open,HIGH);int_flag = 0;// Serial.println("o_int...");// Serial.println(int_flag);}else{int_num = int_num;}}// 初始化,相当于main 函数void setup() {Serial.begin(115200);pinMode(PC_open,OUTPUT);digitalWrite(PC_open,HIGH);pinMode(PC_Re,OUTPUT);digitalWrite(PC_Re,LOW);pinMode(PC_flag,INPUT_PULLUP); //IO上拉digitalWrite(PC_flag,HIGH);pinMode(reto_A, INPUT_PULLUP); digitalWrite(reto_A ,LOW);attachInterrupt(digitalPinToInterrupt(reto_A),GPIO8_INTERRUPT, RISING); //开启编码器中Serial.println("Beginning...");}//循环void loop() {doWiFiTick();doTCPClientTick();INIO();int_deal();delay(10); }

如果觉得《8266 + 巴法云 小爱远程控制电脑开关机 arduino》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。