Funpack2-3_ESP32-E物联网门报警
使用FireBeetle ESP32-E开发板制作的物联网门报警系统,arduino程序,物联网
标签
Funpack活动
ESP32
DFR0033
磁感应
报警
把酒灵灵
更新2023-01-04
733

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锂电池接入

FkHOstpuInfQBojZxUCQUSxiO8if
其他硬件有1602 lcd屏显示模块,应用于显示文字。

DFR0033 数字贴片磁感应传感器(https://www.dfrobot.com.cn/goods-84.html)用于磁铁感应,是否有磁铁靠近。

FmqxPALK0-JdvONDXrW86KuF4Oj7

还使用了一个无源蜂鸣器。

· 设计思路(用板子的哪些模块实现了什么功能)

控制器用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!"));
  }
}

· 功能展示及说明(可右上角点“上传”插入图片进行展示并说明)
思维导图:

FrVTv8PFl2zqi7f3EFdgVQr7XD0u

· 对本活动的心得体会(包括意见或建议)
本次活动因为之前各种原因耽误的时间太多了,结果到后期时间紧张,不能增加更多的功能,实在遗憾。如果可以的话,希望以后有时间完善,比如增加电磁锁,关门器等等。

c. 可编译下载的代码(放在电子森林项目的附件处)

附件下载
mqtt_alarm_door.ino
团队介绍
没团队,一个人
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号