电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
Arduino ESP32 Blinker 毕业设计 课程设计 DIY 004——基于ESP32的温度报警装置的设计与制作
分 享
扫描二维码分享
Arduino ESP32 Blinker 毕业设计 课程设计 DIY 004——基于ESP32的温度报警装置的设计与制作
arduino
esp32
blinker
xbk_559291
关注
发布时间: 2022-01-17
丨
阅读: 5242
# 一、硬件材料: 1、1\*ESP32开发板 2、1\*DHT11温湿度模块 3、1\*MQ-2烟雾模块 4、1\*MX1508电机驱动模块 5、1\*直流电机 6、1\*OLED显示屏模块【白色】【0.96寸】 7、1\*蜂鸣器模块 8、1\*MLX90614红外测温模块 9、1\*MICRO数据线【0.5m】 10、1\*电池【USB公充/microUSB公放】 11、其他可能需要的元器件(面包板、电阻、电容、导线/杜邦线等) 12、可能需要的工具(万用表、电烙铁及焊锡、剪钳/剪刀、剥线钳/打火机、普通胶布/电工胶布/胶枪等) # 二、程序功能: 第1步:ESP32开发板通过DHT11温湿度模块,读取温度和湿度,可以在OELD屏幕和手机APP上查看环境的温度和湿度,当环境温度过高时,打开风扇。 第2步:ESP32开发板通过MQ-2烟雾模块,检测烟雾气体浓度,当浓度超过设定浓度时,打开蜂鸣器进行报警,并且在OELD屏幕和手机APP上可以查看当前烟雾浓度以及报警信息。 第3步:ESP32开发板通过MLX90614红外测温模块,检测物体温度和问题温度,当人体温度超过阈值时,可以在OELD屏幕和手机APP上查看警示信息。 第4步:可以通过手机APP设置烟雾阈值。 第5步:可以通过手机APP设置环境温度阈值。 第6步:可以通过手机APP设置人体温度阈值。 其他未有写明的地方,以需求出发点、示意图片/视频为参考。 # 三、后期更新电路图: ##3.1 原理图: ![](https://cf05.ickimg.com/bbsimages/202201/edc6a9753372320bf320eda970f3d664.png) ##3.2 PCB图: ![](https://cf05.ickimg.com/bbsimages/202201/e37d0bcd947775c9809a44cd4e606447.png) ##3.3 3D图: ![](https://cf05.ickimg.com/bbsimages/202201/98a28464d39f6a62f5a4154211efdc16.png) # 四、Arduino完整代码: ```cpp #include
#define BLINKER_WIFI //定义连接方式为wifi #include
//导入Blinker库文件 #include "dht11.h" //导入DHT11温湿度库文件 #include
#include
#include
#define dht11Pin 18 //接dht11的I/O引脚 #define buzzerPin 19 //接蜂鸣器的I/O引脚 #define motorIN1Pin 25 //接电机驱动模块的IN1 #define motorIN2Pin 26 //接电机驱动模块的IN2 #define smogPin 33 //接烟雾的AO引脚 #define oledSdaPin 17 //接oled的SDA引脚 #define oledSclPin 16 //接oled的SCL引脚 int smogTriggerValue = 1200; //烟雾的触发值(高于) float PeoTriggerValue = 38.0; //人体温度的触发值(高于) int temperatureTriggerValue = 30; //温度的触发值(高于) String peoResult = "OK"; #define buzzerOn LOW //打开蜂鸣器 #define buzzerOff HIGH //关闭蜂鸣器 #define REPORTING_PERIOD_MS 1000 char auth[] = "8642618f6862"; //BLINKER的密钥 char ssid[] = "caoxiangzhi"; //需要连接的wifi名称 char pswd[] = "12345678"; //需要连接的wifi密码 // 新建组件对象 BlinkerNumber numberTemperature("num-temperature"); //温度组件对象 BlinkerNumber numberHumidity("num-humidity"); //湿度组件对象 BlinkerNumber numberSmog("num-smog"); //烟雾组件对象 BlinkerNumber numberHeartRate("num-rw"); //人体温度组件对象 BlinkerNumber numberSop2("num-ww"); //物体温度组件对象 BlinkerSlider sliderSmog("ran-smog"); //烟雾阈值 BlinkerSlider sliderTemperature("ran-temperature"); //温度阈值 BlinkerSlider sliderSop2("ran-rwyz"); //人体温度阈值 BlinkerButton buttonUpdate("btn-update"); //手动更新数据组件对象 dht11 DHT11; //实例化温湿度传感器 Adafruit_MLX90614 mlx = Adafruit_MLX90614(); //实例化MLX90614红外测温模块 U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0, oledSclPin, oledSdaPin, U8X8_PIN_NONE); //实例化OLED屏幕 int temperatureValue = 0; //温度值 int humidityValue = 0; //湿度值 int smogValue = 0; //烟雾值 float PeoValue = 0.00; //人体温度值 float ObjValue = 0.00; //物体温度值 //打开风扇 void openFan() { ledcWrite(1, 255); ledcWrite(2, 155); } //关闭风扇 void closeFan() { ledcWrite(1, 0); ledcWrite(2, 0); } void sliderSmogCallback(int32_t value) { BLINKER_LOG("烟雾阈值: ", value); smogTriggerValue = value; Serial.print(F("设定后烟雾阈值为:")); Serial.println(smogTriggerValue); } void sliderTemperatureCallback(int32_t value) { BLINKER_LOG("温度阈值: ", value); temperatureTriggerValue = value; Serial.print(F("设定后温度阈值为:")); Serial.println(temperatureTriggerValue); } void sliderSop2Callback(int32_t value) { BLINKER_LOG("人体温度阈值: ", value); PeoTriggerValue = (float)value; Serial.print(F("设定后人体温度阈值为:")); Serial.println(PeoTriggerValue); } //数据更新 void updateCallback(const String & state) { Serial.println("手动请求数据更新"); updateSensorData(); } /@@* 函数功能:更新所有传感器的数据到云平台 入口参数:无 返回值:无 */ void updateSensorData() { numberTemperature.print(temperatureValue); numberHumidity.print(humidityValue); numberSmog.print(smogValue); numberHeartRate.print(PeoValue); numberSop2.print(ObjValue); Serial.println("自动上传传感器数据"); } /@@* 函数功能:自动更新所有传感器的数据到云平台,大约1分钟1次 入口参数:无 返回值:无 */ void automaticUpdateSensorData() { static unsigned long readSmogTime = 0; if (millis() - readSmogTime > 1000) { readSmogTime = millis(); smogValue = analogRead(smogPin); //读取烟雾值 } static unsigned long readTemTime = 0; if (millis() - readTemTime > 2000) { readTemTime = millis(); DHT11.read(dht11Pin); //读取温湿度 humidityValue = DHT11.humidity; temperatureValue = DHT11.temperature; } //读取人体温度和物体温度 static unsigned long peoTime = 0; if (millis() - peoTime > 2000) { peoTime = millis(); ObjValue = mlx.readAmbientTempC(); PeoValue = mlx.readObjectTempC(); if (PeoValue > PeoTriggerValue) { static unsigned long warnPeoTime = 0; if (millis() - warnPeoTime > 6000) { warnPeoTime = millis(); Blinker.notify("!人体温度过高,请检查!"); } peoResult = "Warn"; } else { peoResult = "OK"; } } if (smogValue > smogTriggerValue) { digitalWrite(buzzerPin, buzzerOn); //打开蜂鸣器 static unsigned long warnWaterTime = 0; if (millis() - warnWaterTime > 6000) { warnWaterTime = millis(); Blinker.notify("!起火了!警报!警报!"); } } else { digitalWrite(buzzerPin, buzzerOff); //关闭蜂鸣器 } if (temperatureValue > temperatureTriggerValue) { openFan(); } else { closeFan(); } oledDisplayRefresh(); //oled刷新屏幕显示 //串口打印传感器检测的数据 static unsigned long printTime = 0; if (millis() - printTime > 1000) { printTime = millis(); Serial.print("温度:"); Serial.print(temperatureValue); Serial.print("\t 湿度:"); Serial.print(humidityValue); Serial.print("\t 烟雾:"); Serial.print(smogValue); Serial.print("\t 人体温度:"); Serial.print(PeoValue); Serial.print("\t 物体温度:"); Serial.println(ObjValue); } } /@@* 函数功能:oled显示 入口参数:无 返回值:无 */ void oledDisplayRefresh() { static unsigned long nowTime = 0; if (millis() - nowTime > 500) { nowTime = millis(); oledDisplay(); } } /@@* 函数功能:oled显示 入口参数:无 返回值:无 */ void oledDisplay() { u8g2.clearBuffer(); //温湿度 u8g2.setCursor(0, 15); u8g2.print("Tem:"); u8g2.setCursor(33, 15); u8g2.print(temperatureValue); u8g2.setCursor(70, 15); u8g2.print("Hum:"); u8g2.setCursor(99, 15); u8g2.print(humidityValue); //烟雾 u8g2.setCursor(0, 31); u8g2.print("Som:"); u8g2.setCursor(33, 31); u8g2.print(smogValue); //物体温度 u8g2.setCursor(0, 47); u8g2.print("Obj:"); u8g2.setCursor(33, 47); u8g2.print(ObjValue); //人体温度 u8g2.setCursor(0, 63); u8g2.print("Sop:"); u8g2.setCursor(33, 63); u8g2.print(PeoValue); u8g2.setCursor(75, 63); u8g2.print("C:"); u8g2.setCursor(90, 63); u8g2.print(peoResult); u8g2.sendBuffer(); } void setup() { delay(50); Serial.begin(115200); //初始化串口,波特率为115200 pinMode(buzzerPin, OUTPUT); //初始化蜂鸣器 digitalWrite(buzzerPin, buzzerOff); //上电关闭蜂鸣器 ledcSetup(1, 2000, 8); //设置通道1 ledcAttachPin(motorIN1Pin, 1); //将 LEDC 通道绑定到指定 IO 口上以实现输出 ledcSetup(2, 2000, 8); //设置通道2 ledcAttachPin(motorIN2Pin, 2); //将 LEDC 通道绑定到指定 IO 口上以实现输出 if (!mlx.begin()) { //初始化MLX90614红外测温模块 Serial.println("Error connecting to MLX sensor. Check wiring."); while (1); }; u8g2.begin(); //初始化OLED屏幕 u8g2.enableUTF8Print(); u8g2.setFont(u8g2_font_unifont_t_chinese2); oledDisplay(); WiFi.begin(ssid, pswd); //初始化WIFI while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } BLINKER_DEBUG.stream(Serial); //设置blinker调试打印串口 Blinker.begin(auth, ssid, pswd); //连接wifi buttonUpdate.attach(updateCallback); sliderSmog.attach(sliderSmogCallback); sliderTemperature.attach(sliderTemperatureCallback); sliderSop2.attach(sliderSop2Callback); Blinker.attachHeartbeat(updateSensorData); Serial.println("\r\n程序初始化完成"); } void loop() { Blinker.run(); automaticUpdateSensorData(); //实时更新传感器数据 } ``` # 五、效果演示: ## 5.1 Blinker APP手机界面: ![](https://cf05.ickimg.com/bbsimages/202201/2c07ae9c0035084d14b85ae1936cc12d.jpg) ## 5.2 视频链接: https://www.bilibili.com/video/BV16u41127e6/
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
xbk_559291
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交