a. 3-5分钟短视频(要求横屏且1080p)【请先上传到自己的bilibili账号上(或优酷/腾讯视频)】
<iframe frameborder="0" src="https://v.qq.com/txp/iframe/player.html?vid=h3368o390tm" allowFullScreen="true"></iframe>
· 简短的自我介绍
我是一个电子爱好者,因为喜欢参加了电子电路职业培训,又参与了这个活动。正好我这边有个门,冬天太冷,又很多人不随手关门,打算做个关门报警器,不关门就报警,提醒关门。
· 硬件介绍(控制器及外设,应用方向及应用场景)
控制器使用 DFR0654-F (https://www.dfrobot.com.cn/goods-3048.html)FireBeetle ESP32-E
MQTT服务器使用siot 1.2搭建,简单易用。
FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。
FireBeetle ESP32-E深度支持ArduinoIDE编程,并且支持Scratch图形化编程及MicroPython编程。 DFROBOT提供了详细的在线教程和应用案例,以及上千种免焊接的Gravity接口传感器与执行器,方便使用。
它支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。
- 拥有更丰富的软硬件资源
- 体积小巧,仅25.4 × 60 mm
- ESP32双核低功耗主控,WiFi+BT4.0二合一
- GDI显示接口,可以单线连接显示屏
- 板载充电电路以及PH2.0锂电池接入
其他硬件有1602 lcd屏显示模块,应用于显示文字。
DFR0033 数字贴片磁感应传感器(https://www.dfrobot.com.cn/goods-84.html)用于磁铁感应,是否有磁铁靠近。
还使用了一个无源蜂鸣器。
· 设计思路(用板子的哪些模块实现了什么功能)
控制器用FireBeetle ESP32-E检测 DFR0033 数字贴片磁感应传感器检测感应门上的磁铁是否靠近,以便检测是否门开了。
使用了一个1602 lcd屏显示模块,用于显示提醒信息。
无源蜂鸣器,用来发出警报。
· 本期指定完成任务的功能演示
b. 项目总结报告(放在电子森林项目的描述处)
· 项目描述
使用杜邦线将FireBeetle ESP32-E控制器,1602lcd显示模块,数字贴片磁感应传感器,无源蜂鸣器连接一起。
数字贴片磁感应传感器连接到数字引脚,无源蜂鸣器连接到PWM引脚,1602LCD屏连接于IIC引脚。
具体连接引脚编号参考:
int Buzzer_PIN = 17; //无源蜂鸣器模块连接引脚16
int ledPin = 2; // 设置LED引脚
int inputPin = 25; // 设置报警器引脚
lcd.begin(21, 22); // 配置LCD的 SDA 和 SCL 引脚
· 各功能对应的主要代码片段及说明
引用库:
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include <LiquidCrystal_I2C.h>
配置网络:
#define WLAN_SSID "test"
#define WLAN_PASS "99999999"
配置MQTT服务器
#define AIO_SERVER "192.168.0.5"
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "siot"
#define AIO_KEY "dfrobot"
变量定义赋值:
String MQTTmsg = ""; //要处理的msg
int Buzzer_PIN = 17; //无源蜂鸣器模块连接引脚16
int ledPin = 2; // 设置LED引脚
int inputPin = 25; // 设置报警器引脚
int val = 0; // 放置报警器状态的变量
int val_old = 0; //放用于比较的旧变量值
int send = 0; //是否发送过mqtt消息
int count = 0; //心跳间隔计数
WiFiClient client; //定义wifi客户端对象
MQTT定义和LCD设置
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);//配置
Adafruit_MQTT_Publish alarmP = Adafruit_MQTT_Publish(&mqtt, "door/alarm");//定义MQTT
LiquidCrystal_I2C lcd(0x27, 16, 2); // 设置1602液晶地址 0x27 设置一行显示的字符 16个 2 行显示
主程序:
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println(F(" "));
Serial.println(F("MQTT Alarm Door"));
Serial.println();
pinMode(ledPin, OUTPUT); // 设置LED引脚为输出
pinMode(Buzzer_PIN, OUTPUT); // 蜂鸣器Buzzer_PIN设置为输出
digitalWrite(Buzzer_PIN, LOW); // 初始化蜂鸣器不响
pinMode(inputPin, INPUT); // 设置报警器引脚为输入
Serial.println(F("LCD init"));
lcd.init(); //初始化
lcd.begin(21, 22); // 配置LCD的 SDA 和 SCL 引脚
lcd.clear(); //清除屏幕内容
lcd.print("waiting..."); //LCD输出内容
lcd.backlight(); //打开背光
delay(500);
lcd.setCursor(0, 0);
Serial.print("Connecting to ");
lcd.print("Connecting to "); //LCD输出内容
Serial.println(WLAN_SSID);
lcd.setCursor(0, 1);
lcd.print(WLAN_SSID); //LCD输出内容
lcd.blink(); //lcd闪烁
WiFi.begin(WLAN_SSID, WLAN_PASS);
delay(2000);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
lcd.print(".");
}
Serial.println();
lcd.clear(); //清除屏幕内容
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
lcd.noBlink();
lcd.print("WiFi connected");
lcd.setCursor(0, 1);
lcd.print("IP address: ");
lcd.print(WiFi.localIP());
}
void loop() {
MQTT_connect();
lcd.clear(); //清除屏幕内容
val = digitalRead(inputPin); // 读取报警器状态
//加入与非判断
if (val != val_old) { //和旧值比较
val_old = val; //不相等的话旧值赋值为新获取的val
// lcd.clear();
MQTTmsg = "Door msg...";
if (val == LOW) { // 无磁铁状态
digitalWrite(ledPin, HIGH); // 报警灯亮起
MQTTmsg = "Door open!Alarm!";
lcd.print(MQTTmsg); //输出内容
lcd.backlight(); //打开背光
Serial.println(MQTTmsg); //输出内容
lcd.blink(); //lcd闪烁
Buzzer(); //调用报警函数
} else { //有磁铁状态
digitalWrite(ledPin, LOW); // 关闭报警灯
MQTTmsg = "Door closed!";
lcd.print(MQTTmsg); //输出内容
Serial.println(MQTTmsg); //输出内容
lcd.noBacklight(); //关闭背光
lcd.noBlink(); //关闭闪烁
}
//数据传输到MQTT
if (send = 0) {
if (!alarmP.publish("Door msg...")) { //发布内容
Serial.println(F("Msg pub Failed"));
} else {
Serial.println(F("Msg pub OK!"));
}
if (val == LOW) { // 无磁铁状态
if (!alarmP.publish("Door open!Alarm!")) { //发布内容
Serial.println(F("Door open Msg pub Failed"));
} else {
Serial.println(F("Door openMsg pub OK!"));
}
} else {
if (!alarmP.publish("Door closed!")) { //发布内容
Serial.println(F("Door closed Msg pub Failed"));
} else {
Serial.println(F("Door closed Msg pub OK!"));
}
}
send = 1;
}
} else {
if (val == LOW) { //新旧值相等,且无磁铁状态,模拟门开着
lcd.print("Door open!Alarm!"); //输出内容
lcd.backlight(); //打开背光
if (!alarmP.publish("Door open!Alarm!")) { //发布内容
Serial.println(F("Door open Msg pub Failed"));
} else {
Serial.println(F("Door openMsg pub OK!"));
}
Buzzer(); //调用报警函数
}
// N秒 心跳一次
}
delay(100); //100ms检测一次
count = count + 1;
if (count >= 1200) // ping the server to keep the mqtt connection alive
{
if (!mqtt.ping()) {
mqtt.disconnect();
}
count = 0;
Serial.println("MQTT alive msg.");
if (!alarmP.publish("MQTT alive")) { //发布内容
Serial.println(F("Msg pub Failed"));
} else {
Serial.println(F("Msg pub OK!"));
}
}
}
功能子程序:
void Buzzer() //无源蜂鸣器报警
{
for (int i = 0; i < 100; i++) {
digitalWrite(Buzzer_PIN, HIGH);
delayMicroseconds(200); // 休眠微妙
digitalWrite(Buzzer_PIN, LOW);
delayMicroseconds(100); // 休眠微妙
}
// delay(100);
}
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
Serial.print("Connecting to MQTT... ");
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
Serial.println(mqtt.connectErrorString(ret));
Serial.println("Retrying MQTT connection in 5 seconds...");
lcd.clear();
lcd.print(mqtt.connectErrorString(ret));
lcd.autoscroll();
lcd.print("Retrying MQTT connection in 5 seconds...");
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
MQTTmsg = "Connect to MQTT ERROR";
Serial.println(MQTTmsg);
lcd.clear();
lcd.print(MQTTmsg);
ESP.restart();
// while (1) ;
}
}
MQTTmsg = "MQTT Connected!";
Serial.println(MQTTmsg);
lcd.clear();
lcd.setCursor(0, 1);
lcd.print(MQTTmsg);
if (!alarmP.publish("MQTT Connected!")) { //发布内容
Serial.println(F("Msg pub Failed"));
} else {
Serial.println(F("Msg pub OK!"));
}
}
· 功能展示及说明(可右上角点“上传”插入图片进行展示并说明)
思维导图:
· 对本活动的心得体会(包括意见或建议)
本次活动因为之前各种原因耽误的时间太多了,结果到后期时间紧张,不能增加更多的功能,实在遗憾。如果可以的话,希望以后有时间完善,比如增加电磁锁,关门器等等。
c. 可编译下载的代码(放在电子森林项目的附件处)