说明
最近做一个远程开锁的小玩意儿,感觉很方便,忘带钥匙就不用去麻烦楼下温柔的阿姨了。无奈舵机和定滑轮一直不到,先就做个远程控制小灯,小灯是arduino自带的那个。另外怕室友不够“尊重”,我又加了个蜂鸣器(嘿嘿嘿)。
材料
一个OneNET账号,一个Uno,一个ESP8266-01(我还是喜欢用01S),一个蜂鸣器(不怕打的就来一个),杜邦线若干。
展示
代码
-
UnlockingTest.ino
/***************************************************** * 功 能:通过OneNET的http协议下发指令控制arduino * 说 明:http协议并不适合数据下发,这里只是用get * 方法提供一个投机取巧的思路 * 作 者:新鲜的大白菜 * 创建日期:2020/10/21 *****************************************************/ #include "Unlocking.h" #define BUZ 10 void setup() { Serial.begin(115200); //初始化WIFI串口 pinMode(LED_BUILTIN, OUTPUT); pinMode(BUZ, OUTPUT); digitalWrite(LED_BUILTIN, 0); digitalWrite(BUZ, 0); } void loop() { //发送get指令 send_get(); //接收onenet发送的消息 receive_info(); //处理控制信息并实现效果 if (strstr(temp, "\"current_value\":1")) { digitalWrite(LED_BUILTIN, 1); digitalWrite(BUZ, 1); } else { digitalWrite(LED_BUILTIN, 0); digitalWrite(BUZ, 0); } }
-
Unlocking.h
#ifndef __UNLOCKING_H #define __UNLOCKING_H #include <arduino.h> //HTTP协议需要(Signal_http只是测试) #define Signal_http "POST /devices/600328063/datapoints?type=3 HTTP/1.1\napi-key:w3ncIqXbYR9RuCxjZEoLEqOYCb0=\nHost:api.heclouds.com\nContent-Length:15\n\n {\"Signal\":27}\r\n" #define SWITCH "GET /devices/600328063/datastreams/switch HTTP/1.1\napi-key:w3ncIqXbYR9RuCxjZEoLEqOYCb0=\nHost: api.heclouds.com\n\n" void send_get(); //发送get指令 void receive_info(); //接收onenet发送的消息 extern String receive; //String类型接收缓冲区 extern char temp[380]; //char* 类型临时接收缓冲区 #endif //__UNLOCKING_H
-
Unlocking.cpp
#include "Unlocking.h" String receive = ""; //String类型接收缓冲区 char temp[380] = {0}; //char* 类型临时接收缓冲区 void send_get() { Serial.print(SWITCH); //向云端发送get指令以获取信息 delay(1000); //没有延时影响灯的稳定性,但是不影响蜂鸣器 } void receive_info() { while (Serial.available() > 0) { receive += char(Serial.read()); delay(2); //保证数据完整 } strcpy(temp, receive.c_str()); //String转换成char* receive = ""; //清理接收缓冲区 }
细节(很重要)
-
OneNET
需要了解OneNET的POST与GET的格式基本使用,数据流创建与基本使用,之所以说我这个方法投机取巧就是因为http协议不适合数据下发,推荐EDP协议,网上有详细资料
-
WIFI模块
我只用过ESP01和ESP01S(推荐),需要说明的是因为Arduino在固定的位置,有固定的WiFi,并不会经常改动,所以我把配置wifi的AT指令全部使用usb-ttl工具事先配置好了,只要一通电就会自动连接wifi、与OneNET建立tcp连接、开启透传模式,所以在代码中并没有配置wifi模块的信息,网上有wifi模块的教程,注意接线和电压,使用串口调试助手配置时注意回车换行问题,01S比01更容易上手,所以推荐ESP01S
-
Arduino
Arduino的接收缓冲区默认只有64字节,但通过GET指令查询数据流时,服务器返回的信息大于64,所以需要修改缓冲区大小,网上有详细教程
结语
很不推荐这种投机取巧的方法,但是玩玩还是可以的,这里面有些坑,但是都是可以找到解决方案的,不管怎么说,忘带钥匙麻烦楼下阿姨上来开门就是不对的!