初始想法:

最初版的构思是通过ESP32板子连接学校的校园网,进而访问学校一个协会的服务器(仅在校园网或者协会WiFi能够连接上协会的服务器),使用服务器的Broker,以MQTT协议为基础,通过ArduinoIDE用C++对ESP32板子烧录程序,以达到物联网的效果(这里仅仅是想让这个东西可以开门就行)。 
     实际操作过程中遇到了两大问题:一、校园网的认证破解难度太高,学习周期偏长(需要从1700多行的JS语言中找到正确的JOSN数据包,并且加重了ESP32本身需要烧录的程序);二、MQTTX在手机端操作麻烦。

想法更新:

经过查阅,了解到了Blinker这款应用,于是有了以下构思:
用ESP32直接连接互联网,并访问Blinker的MQTT Broker,同样以MQTT协议为基础,通过ArduinoIDE用C++给ESP32烧录程序,以实现物联网。
       此方案解决问题的途径:一、对于访问MQTT Broker的问题,因为Blinker的服务器是公开的,可以用任何网络去访问。二、对于手机版运用复杂问题,BlinkerAPP提供了一款手机版的APP(适用于安卓、苹果),让手机版界面更便于操作和个性化。
       此外,Blinker有许多可以现用的库函数,让项目内容得到了提升(给加入温湿度测量的提供了基础)。

开始实践:

一、ArduinoIDE环境搭建

①ESP32开发板

关于Arduino的下载就不多赘述了,这里主要是想要分享一下关于在开发板管理器中添加ESP32时,在首选项里面关于网址的填写。

相信大多数人在首选项中用的Github上面的网址,下载的速度实在是太慢了,本人之前在开发ESP8266时也遇到过这样的问题。也在网上去寻找过许多方法,其实最简单的就是用这个网址:

https://arduino.me/packages/esp32.json

https://arduino.me/packages/esp8266.json(esp8266的也奉上)

当然,想要了解更多的可以自己去Arduino社区里看看,网址:https://arduino.me/home

②Blinker库、DHT库和ServoESP32库

我用的是这三个,当然你也可以用自己的。(这里需要注意的是ServoESP32库可能会和Servo库有冲突,后面代码大家可以自己看看想用哪一个,第一个完整的代码是没有用ServoESP32库的代码,里面关于pwm信号的计算在本文中不做介绍,第二个完整代码是用了ServoESP32库的)

二、手机下载Blinker

直接在手机浏览器上面搜索Blinker官网上面直接下载就行。

Blinker官网:https://diandeng.tech/home

三、硬件设施

主要包括:1个ESP32的板子、1个拓展板(注意和你手上板子的兼容性)、1个MG995舵机、1个DHT11温湿度传感器模块,3D打印配件(这个东西根据你们自己的需要去打印就行,这里就不过多介绍了),1个电源(来个充电宝就行)。

四、代码

完整代码:

直接给想要copy后,自己理解的UU们奉上。

未运用ESP32Servo库的代码:

#define BLINKER_WIFI //宏定义,将ESP32的模式设置为WiFi模式
#include <Blinker.h> //Blinker库
#include <DHT.h>//包含DHT头文件
#define DHTPIN 4      //定义DHT11模块连接管脚也可以通过gpio去进行定义
#define DHTTYPE DHT11   // 使用温度湿度模块的类型为DHT11char auth[] = "";//blinker上提供的密钥
char ssid1[] = "";//ESP32将连接的WiFi的名字
char pswd1[] = "";//ESP32将连接的WiFi的密码
int freq = 50;
int channel = 8;
int resolution = 8;
int servo_max=180,servo_middle=90,servo_min=0;
const int led = 16;//用于舵机控制的参数
BlinkerNumber HUMI("humi-1");    //定义湿度数据键名
BlinkerNumber TEMP("temp-1");    //定义温度数据键名
DHT dht(DHTPIN, DHTTYPE);    //生成DHT对象,参数是引脚和DHT的类型
float humi_read = 0, temp_read = 0;//定义浮点型全局变量 储存传感器读取的温湿度数据
BlinkerButton Button1("btn1");//定义一个名为“btn1”的开关,用于控制舵机void heartbeat()
{HUMI.print(humi_read);        //给blinkerapp回传湿度数据TEMP.print(temp_read);        //给blinkerapp回传温度数据
}//心跳包函数,每一分钟执行一次,向app端传送信息,故而app上面关于温度和湿度指示会1min更新一次int calculatePWM(int degree)
{ const float deadZone = 6.4;const float max = 32;if (degree < 0)degree = 0;if (degree > 180)degree = 180;return (int)(((max - deadZone) / 180) * degree + deadZone);
}//关于舵机转动角度的计算(pwm信号的计算)void button1_callback(const String & state)
{    BLINKER_LOG("get button state: ", servo_max); ledcWrite(channel, calculatePWM(180));  Blinker.vibrate();Blinker.delay(2000);BLINKER_LOG("get button state: ", servo_middle);  ledcWrite(channel, calculatePWM(90));Blinker.vibrate();Blinker.delay(2000);    BLINKER_LOG("get button state: ", servo_min);  ledcWrite(channel, calculatePWM(0));Blinker.vibrate();Blinker.delay(2000);BLINKER_LOG("get button state: ", servo_middle);  ledcWrite(channel, calculatePWM(90));Blinker.vibrate();
}//这是开关按键的函数,按下开关后,会自动调用这上面的函数void setup()
{   Serial.begin(9600); //初始化端口,将串口通讯的频率设定到9600ledcSetup(channel, freq, resolution); // 设置通道ledcAttachPin(led, channel);          // 将通道与对应的引脚连接BLINKER_DEBUG.stream(Serial);//将debug的输出流设置为串口BLINKER_DEBUG.debugAll();//辅助监测的工具Blinker.begin(auth,ssid1,pswd1); // // 初始化blinker Blinker.attachHeartbeat(heartbeat);//将传感器获取的数据传给blinker app上Button1.attach(button1_callback);dht.begin();//初始化DHT传感器
}void loop()
{
Blinker.run();  float h = dht.readHumidity();//读取DHT11传感器的湿度 并赋值给hfloat t = dht.readTemperature();//读取传感器的温度   并赋值给tif (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;//将读取到的湿度赋值给全局变量humi_readtemp_read = t;//将读取到的温度赋值给全局变量temp_read}
Blinker.delay(2000);//减少读取的次数,减轻esp32的工作量
}

运用了ESP32Servo库的代码:

#define BLINKER_WIFI //宏定义,将ESP32的模式设置为WiFi模式
#include <Blinker.h> //Blinker库
#include <ESP32Servo.h>
#include <DHT.h>//包含DHT头文件
#define DHTPIN 4      //定义DHT11模块连接管脚也可以通过gpio去进行定义
#define DHTTYPE DHT11   // 使用温度湿度模块的类型为DHT11char auth[] = "";//blinker上提供的密钥
char ssid1[] = "";//ESP32将连接的WiFi的名字
char pswd1[] = "";//ESP32将连接的WiFi的密码
Servo myservo;//用于舵机控制的参数
BlinkerNumber HUMI("humi-1");    //定义湿度数据键名
BlinkerNumber TEMP("temp-1");    //定义温度数据键名
DHT dht(DHTPIN, DHTTYPE);    //生成DHT对象,参数是引脚和DHT的类型
float humi_read = 0, temp_read = 0;//定义浮点型全局变量 储存传感器读取的温湿度数据
BlinkerButton Button1("btn1");//定义一个名为“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(2000);myservo.write(90);Blinker.delay(2000);Blinker.vibrate();myservo.write(0);Blinker.delay(2000);Blinker.vibrate();myservo.write(90);
}//这是开关按键的函数,按下开关后,会自动调用这上面的函数void setup()
{   Serial.begin(9600); //初始化端口,将串口通讯的频率设定到9600myservo.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);dht.begin();//初始化DHT传感器
}void loop()
{
Blinker.run();  float h = dht.readHumidity();//读取DHT11传感器的湿度 并赋值给hfloat t = dht.readTemperature();//读取传感器的温度   并赋值给tif (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;//将读取到的湿度赋值给全局变量humi_readtemp_read = t;//将读取到的温度赋值给全局变量temp_read}Blinker.delay(2000);//每2s读取一次温度
}

代码讲解:

#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

这里是头文件,其他的没什么好讲的,需要注意的就是如果你的DHT和我的不一样的话,宏定义的部分可能也有不同,根据你自己的硬件的介绍去改就行。

char auth[] = "";//blinker上提供的密钥
char ssid1[] = "";//ESP32将连接的WiFi的名字
char pswd1[] = "";//ESP32将连接的WiFi的密码
    Blinker.begin(auth,ssid1,pswd1); // // 初始化blinker 

这是Blinker的初始化。(我看Blinker文档的时候看见只有这种格式,如果有其他的大家可以在评论区说一下)

BlinkerNumber HUMI("humi-1");    //定义湿度数据键名
BlinkerNumber TEMP("temp-1");    //定义温度数据键名
BlinkerButton Button1("btn1");//定义一个名为“btn1”的开关,用于控制舵机

这里是Blinker库里面的类,用类创建了两个数据对象和一个按键对象。里面的参数是Blinker手机板APP里面我们创建的对应数据和按键的组件键名。

void heartbeat()
{HUMI.print(humi_read);        //给blinkerapp回传湿度数据TEMP.print(temp_read);        //给blinkerapp回传温度数据
}
    float h = dht.readHumidity();//读取DHT11传感器的湿度 并赋值给hfloat t = dht.readTemperature();//读取传感器的温度   并赋值给tif (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;//将读取到的湿度赋值给全局变量humi_readtemp_read = t;//将读取到的温度赋值给全局变量temp_read}Blinker.delay(2000);//每2s读取一次温度
void button1_callback(const String & state)
{    myservo.write(180);Blinker.vibrate();//Blinker里面的一个函数,会让你的手机震动一下Blinker.delay(2000);myservo.write(90);Blinker.delay(2000);Blinker.vibrate();myservo.write(0);Blinker.delay(2000);Blinker.vibrate();myservo.write(90);
}//这是开关按键的函数,按下开关后,会自动调用这上面的函数
    Blinker.attachHeartbeat(heartbeat);//将传感器获取的数据传给blinker app上
//心跳包函数,每一分钟执行一次,向app端传送信息,故而app上面关于温度和湿度指示会1min更新一次Button1.attach(button1_callback);//按下手机APP里面的对应开关后,会执行与其相关联的函数

这里的heartbeat()函数名可以自定,在这个函数里面是运用了Blinker数据对象的print()函数,将DHT11读取到的数据上传给手机的BlinkerAPP ,而上传的触发是由Blinker.arrachHeartbeat()函数来实现的,这个函数是网络连接的一个心跳包(这里涉及到了MQTT协议),ESP32会每59s给Blinker的MQTT服务器发一个消息。所以我们将数据上传函数的触发与心跳函数结合起来,就可以让寝室温湿度及时的上传给手机端(如果直接将heartbeat()函数直接写在loop()函数里面可能会影响ESP32和Blinker的服务器连接的稳定性,具体原因和MQTT协议的通讯模式有关)。同时,我们需要注意到的是我们将DHT11的数据读取放在了loop()函数中,并将其设定为2s读取一次,这样可以确保ESP32在向服务器传输的数据都是及时更新的,这样并不会影响开门的功能。(也许有UU要问,为什么不把这个读取放在heartbeat()函数中呢?其实是可以的,这样的好处是减少了ESP32的工作量,但是会存在数据更新延迟太长的现象大概是90s-120s,并且读取到的数据准确性下降。两种方案各有弊益,各位自己选择。)

而Button1.attch()函数则是Button对象里面的一个成员函数,它将Button1触发后的动作设定为button_callback(),于是就实现了我们按下开关就开门。需要注意的是不同的舵机,这里的代码不同,我的舵机是360°的,所以在这里用myservo.write(0或180)是舵机会分别向两个相反的方向一直旋转,而myservo.write(90)是舵机会停止旋转。如果你手上的是180°的舵机,那么就可以把myservo.write(90)这部分给省略掉。

五、手机APP操作

那些copy完就直接上传的都是失败了的,看到这里他们才明白原因。当然,恭喜认真看完的你,离成功就差最后一步了。这里我直接上图,照着操作就行。

点入你自己的设备后自己设计自己的界面的一定要将组件键名和你代码里面的设置成一样的,这样才能够实现最后一个界面。

发展空间

关于DHT模块的运用其实可以不止于显示在手机上面,还可以与寝室里面的一些其他硬件结合起来,比如:空调、加湿器等。可以做到自己调节开关,当然也可以像开门一样,做一个按钮。(这两者结合当然是最好的)其次关于开门方面的提升,可以再加一个指纹识别模块,做到不需要任何其他的工具来开门。(想法是让一块ESP8266的板子处于混合模式,这样让指纹识别模块和ESP32连接在一个局域网内进行通讯,进而实现开门。这样还解决了一个问题, 就是关于ESP32配网的问题。由于ESP32在blinker架构下没有像esp8266wifimulti库这样的库函数来配置网络连接,当我们用ESP32来联网时,只能连接预设好的WiFi。但我们学校校园网覆盖广,所以寝室就没有专门安装固定的路由器,而让ESP32连接校园网需要认证通过,太麻烦能力不够,所以我们的WiFi就只是寝室里某一个人的手机热点,就有局限性了。而用ESP8266来当中间人,就可以解决这一问题,同时还可以通过ESP8266的WiFi的一些库函数来识别连接的WiFi信息,从而向其他成员汇报谁回寝、或者谁开了门之类的功能,当然这里的前提是你手机的热点连接了互联网。)

感悟

这篇博客是本人的第一篇博客,内容上面可能会有一些错误,欢迎大家在评论区留言、或者私信我,有什么疑惑也十分乐意和大家讨论交流,希望能够和广大创客们一起进步。

用ESP32+Blinker完成寝室智能门锁以及寝室温湿度的反馈相关推荐

  1. Arduino+esp32+blinker第一课点灯

    Arduino+esp32+blinker第一课点灯 文章目录 Arduino+esp32+blinker第一课点灯 前言 一.开发环境搭建 二.开发第一个点灯程序 1.添加设备 2.载入示例 3.代 ...

  2. (esp32+MQTT+云服务器+MySQL)实现物联网温湿度数据采集到云端数据库MySQL

    前言 之前物联网硬件采集数据一直都是通过阿里云实现数据的可视化,没有将硬件采集到的数据存入云数据库,没有进一步利用数据进行操作. 本文一共有五个步骤: 1.esp32通过arduino平台和硬件DHT ...

  3. c语言验证寝室是否满人,寝室管理系统c语言.doc

    寝室管理系统c语言 课程设计成绩 考勤成绩( %) 指导老师评语 报告及程序成绩( %) 总评成绩 指导老师签名: <数据结构> 课 程 设 计 报 告 学院(系): 电计系 班 级: 软 ...

  4. 基于ESP32和指纹传感器的智能门锁安全系统

    安全性是我们日常生活中需要着重考虑的事情,数字锁已成为这些安全系统的重要组成部分.基于指纹传感器的系统是最安全的门锁系统之一,因为它具有识别和区分每个人的能力,而不会出错.基于指纹的安全系统可以在工业 ...

  5. 哈理工大学计算机专业宿舍,计算机学院举办“灯塔工程”之寝室文化节

    为夯实我院标准化寝室建设成果,紧密契合学生培养"灯塔工程"中的构建和谐寝室的理念,践行服务育人.管理育人.环境育人的理念,培育健康.积极.向上的寝室文化,营造舒适.温馨.和谐的寝室 ...

  6. 【高校宿舍管理系统】第九章 寝室编号设置和宿舍初始化以及预选设置

    第九章 寝室编号设置和宿舍初始化以及预选设置 提示:本博客个为人独立博客,不是权威,仅供参考!所有思路只做交流之用!如有不足之处,望各位在评论区友善指正. 文章目录 第九章 寝室编号设置和宿舍初始化以 ...

  7. 开源项目——寝室助手

    开源项目--寝室助手 身为计算机专业的大学生,我们会自然而然地想办法用自己已有的资源和技术去让生活自动化.智能化.寝室助手这个项目不算创新项目,但是会是一个整理得比较完备的项目.它易于搭建,成本不算高 ...

  8. (附源码)SSM学生寝室管理系统JAVA计算机毕业设计项目

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  9. 杭电计算机学院宿舍,走进杭电 | 不得不说的杭电寝室

    原标题:走进杭电 | 不得不说的杭电寝室 杭电生活区微地图 1.关于空调 在选择学校时,很多同学都关心寝室是否有空调.独立卫浴和饮水机的问题.作为一所硬件设施先进的学校,杭电的寝室配备当然是很齐全的. ...

最新文章

  1. python csv转excel_使用 Python 把 PDF 转为 CSV 和 Excel(一)
  2. 【python 8】python 装饰器
  3. 商业智能常见名词浅释(转载)
  4. jQuery hash 插件
  5. Python读取文本文档转化成列表
  6. LeetCode 106/105 从中序和后序/前序遍历序列构造二叉树
  7. nextpolish安装_希望组自主三代组装软件NextDenovo最新版本全球学术开源!
  8. python设计一个爱心_python画一个玫瑰和一个爱心
  9. C#:导出json数据到Excel表格
  10. SQL Server中, DateTime (日期)型操作的 SQL语法
  11. 爬虫第六篇:scrapy框架爬取某书网整站爬虫爬取
  12. 5G无线技术基础自学系列 | 5G组网方式
  13. DMA小区漏损治理之武林秘籍
  14. VC浏览器相关的学习(五)(在BHO中建立对话框)--解决CreateDialog的1813错误
  15. “旅行青蛙”游戏外挂藏风险 苹果:或至个人ID泄露
  16. linux+sftp限制目录,Linux 限制SFTP用户目录和权限
  17. c语言大作业黑白棋,C语言编写黑白棋游戏源代码.doc
  18. 微信小程序控制onenet智能灯
  19. 禁止Skype开机自启动
  20. python生成海报商品图片_如何优雅的生成海报/动态合成图片 ?

热门文章

  1. 【部分原创】jquery图表插件flot笔记
  2. Axure页面基础操作
  3. win7 / win10 装Ubuntu16.04双系统
  4. VUE axios 415 错误
  5. C语言用句柄显示bmp图片,VC编程之VC MFC界面上显示BMP图片
  6. Rego不好用?用Pipy实现OPA
  7. Vue内置指令的使用
  8. 抖音小店无货源玩法,玩好这几点小店轻轻松松月入上万
  9. Linux Qt Designer UI界面设计
  10. 谷粒学院16万字笔记+1600张配图(八)——课程管理