提要:
之前卓哥门做个一更深入的、技术性更强的智能门锁,对于新手来说,虽然讲的很明晰,但是可能依然会有很高的难度。于是分享一款适用于新手的、近乎搭积木的智能门锁项目。
- 基本思路和前期框架
之前写了一个csdn,Aeduino代码和手机上面的Blinker部署在上面讲得很清楚,这里就直接使用,但是有一点小小的更新,因为源代码有一点小bug(在设定舵机的角度时的那个时间有一点小问题),新的代码将开门和关门两个功能分开了,并且加了一个查看门的状态的参数。
之前的csdn
更新的代码
#define BLINKER_WIFI //宏定义,将ESP32的模式设置为WiFi模式
#include <Blinker.h> //Blinker库
#include <ESP32Servo.h>
#include <DHT.h>//包含DHT头文件
#define DHTPIN 4 //定义DHT11模块连接管脚也可以通过gpio去进行定义
#define DHTTYPE DHT11 // 使用温度湿度模块的类型为DHT11
char auth[] = "8731df097c48";//blinker上提供的密钥
char ssid1[] = "";//ESP32将连接的WiFi的名字
char pswd1[] = "";//ESP32将连接的WiFi的密码
Servo myservo;//用于舵机控制的参数
BlinkerNumber HUMI("humi-1"); //定义湿度数据键名
BlinkerNumber TEMP("temp-1"); //定义温度数据键名
BlinkerNumber DOOR("zhuangtai"); //定义门状态数据键名
DHT dht(DHTPIN, DHTTYPE); //生成DHT对象,参数是引脚和DHT的类型
float humi_read = 0, temp_read = 0;//定义浮点型全局变量 储存传感器读取的温湿度数据
int sta=0;//整型变量,判断门的状态
BlinkerButton Button1("btn1");//定义一个名为“btn1”的开关,用于控制舵机
BlinkerButton Button2("btn2");//定义一个名为“btn1”的开关,用于控制舵机
void heartbeat()
{
HUMI.print(humi_read); //给blinkerapp回传湿度数据
TEMP.print(temp_read); //给blinkerapp回传温度数据
}
void button1_callback(const String & state)
{
myservo.write(180);
Blinker.vibrate();//Blinker库的一个函数,会让你的手机震动一下
Blinker.delay(450);
myservo.write(90);
Blinker.delay(2000);
Blinker.vibrate();
sta=1;
}//这是开门按键的函数,按下开关后,会自动调用这上面的函数
void button2_callback(const String & state)
{
myservo.write(0);
Blinker.delay(500);
myservo.write(90);
Blinker.delay(2000);
Blinker.vibrate();
sta=0;
}//这是关门按键的函数,按下开关后,会自动调用这上面的函数
void setup()
{
Serial.begin(9600); //初始化端口,将串口通讯的频率设定到9600
myservo.attach(16);
myservo.write(90);
BLINKER_DEBUG.stream(Serial);//将debug的输出流设置为串口
BLINKER_DEBUG.debugAll();//辅助监测的工具
Blinker.begin(auth,ssid1,pswd1); // // 初始化blinker
Blinker.attachHeartbeat(heartbeat);//将传感器获取的数据传给blinker app上
//心跳包函数,每一分钟执行一次,向app端传送信息,故而app上面关于温度和湿度指示会1min更新一次
Button1.attach(button1_callback);
Button2.attach(button2_callback);
dht.begin();//初始化DHT传感器
}
void loop()
{
Blinker.run();
float h = dht.readHumidity();//读取DHT11传感器的湿度 并赋值给h
float t = dht.readTemperature();//读取传感器的温度 并赋值给t
if (isnan(h) || isnan(t))//判断是否成功读取到温湿度数据
{
BLINKER_LOG("Failed to read from DHT sensor!");//读取温湿度失败!
}
else//成功读取到数据
{
//打印
BLINKER_LOG("Humidity: ", h, " %");
BLINKER_LOG("Temperature: ", t, " *C");
BLINKER_LOG(sta);
humi_read = h;//将读取到的湿度赋值给全局变量humi_read
temp_read = t;//将读取到的温度赋值给全局变量temp_read
}
DOOR.print(sta); //给blinkerapp回传门的状态(因为需要实时显示就不需要放入心跳包中了,不然反应时间会很长)
Blinker.delay(2000);//每2s读取一次温度
}
这里需要注意的是Blinker的库文件尽量不要选择最新的版本,可能会于esp32的核心板文件不匹配。
新的Blinker部署
2.3D打印模块
这个就需要自己去搞了,这里有需要的uu可以找我要我设置的3D打印的文件,但是每个寝室的门锁的硬件基础不一样,最好是根据自己的实际情况,好好的设计一下。
3.联网设计
这里需要注意,前面所有的WiFi信息都是我用自己的热点来做测试用的,也正如我csdn里面说的,校园网比较难破解(感兴趣的uu可以参考卓哥的有一篇文章),所以我们最好用一个路由器来解决(也可以自己尝试做一个,也可以参考卓哥的文章)。这样还有一个好处,路由器连接校园网时,第一个人需要进行认证,其后则不需要,这样我们就可以让esp32一直挂在上面,从而实现公网随时访问。
4.提升功能
uu们可以将寝室的灯,空调都用esp32当作控制核心来进行控制(浅挖一个坑),可以选择走线设计,也可以选择多用几个esp8266和单独电源的设计。