内容介绍
项目介绍:
利用倾斜开关触发,使里面的圆球导通里面的开关,点灯报警LED,使蜂鸣器蜂鸣,驱动电机工作,然后通过MQTT显示相关的信息在窗口,通过OLED显示当前的工作状态,只有当人为按下开关,才会关掉蜂鸣,再OLED和MQTT显示工作情况。
硬件介绍(控制器及外设,应用方向及应用场景):
硬件模块如下:
1.360度倾斜开关
2.蜂鸣器
3.OLED
4.DFR0654(ESP32)
5.风机(为了直观用LED代替)
6、按键:
1、360度倾斜开关:Gravity:数字钢球360°倾斜传感器 是一款可对360°全方向进行倾斜检测的Gravity开关量传感器,产品利用钢球的特性,通过内部特殊结构和钢球的重力作用,使钢球滚动,从而使开关闭合或断开。因此也可作为简单的倾角传感器使用。钢球开关数字输入模块,与Arduino专用传感器扩展板结合使用,能够实现非常有趣的互动作品,比使用水银开关更加安全。
传统的钢球倾斜开关只能实现对单方向的倾倒检测,本品采用圆柱形设计,实现对360°任意方向的倾斜检测。
技术要求:
1、3.3V、5V兼容,工作电压:3.3~5V
2、360°倾斜检测
3、通信方式:数字信号
4、接口类型:Gravity接口
5、倾斜开关角度:45°±10°
6、模块尺寸:22 * 30 mm
2.蜂鸣器:
蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型。
无源他激型蜂鸣器的工作发声原理是:方波信号输入谐振装置转换为声音信号输出。
3.OLED:
OLED显示需要显示的功能,只是一个显示的功能。
4.ESP32
FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。
它支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。
1、输入电压:3.3V~5.5V,支持低功耗:10uA
2、支持最大放电电流:600mA@3.3V LDO,支持最大充电电流:500mA
3、支持USB充电
4、处理器:Tensilica LX6双核处理器(一核处理高速连接;一核独立应用开发)
主频:240MHz,SRAM:520KB,Flash:4MB
5、Wi-Fi标准:FCC/CE/TELEC/KCC
6、Wi-Fi协议:802.11 b/g/n/d/e/i/k/r (802.11n,速度高达150 Mbps),A-MPDU和A-MSDU聚合,支持0.4us防护间隔,频率范围:2.4~2.5 GHz
7、蓝牙协议:符合蓝牙v4.2 BR/EDR和BLE标准,蓝牙音频:CVSD和SBC音频低功耗:10uA
工作电流:80mA(平均),频率范围:2.4~2.5GHz
8、支持Arduino一键下载,支持micropython
9、片上时钟:40MHz晶振、32.768KHz晶振,数字I/O x10(arduino默认),模拟输入 x5(arduino默认),SPI x1(arduino默认),I2C x1(arduino默认),I2S x1(arduino默认),RGB_LED:5/D8
10、接口方式:FireBeetle V2系列兼容,工作温度:-40℃~+85℃,模块尺寸:25.4 × 60(mm)
,安装孔尺寸:M2安装孔孔径2.0mm
设计思路(用板子的哪些模块实现了什么功能):
本项目产品设计思路与项目描述如下:
静默状态:
- 电源以弱电为例,工作电源电压为3V,显示屏通过IIC通信显示MeiYaoEsp32 HeiioWorld字符,这个时候产品为等候状态,相当于待机的状态。
- MQTT连接后,接收窗口显示MQTT Connected!
动态状态:
- 当倾斜开关出现倾倒状态时,ESP32板载的LED会亮,倾斜板载的红色LED也会亮,起到警示的作用。
- OLED会显示360SW DOWN(360倾斜开关倒下),buzzer moto run(蜂鸣器和马达运行)。
- 倾斜开关出现倾倒状态时,蜂鸣器处于一直鸣叫的状态。
- 马达(用红色LED1代替)一直处于工作状态。
- Mqtt窗口会显示baojing alarm,倾斜开关倒下,开风机。
- 按下ESP32S板载按键后MQTT会显示OFF BUZZER 关蜂鸣器。
- 按下ESP32S板载按键后OLED会显示moto run off buzzer.工作流程,产品在接入YTPEC时,或者接入PC端时,注意是5V供电,电压不能超过5V,否则会烧毁ESP32-WROOM-32E开发板,还会因为电压过高,烧坏OLED,倾斜开关等设备。当通上电时,除了OLED有显示外,其它的设备都没有任何人眼和人耳能接收到的信息,只能通过OLED屏上看到MEIYAO ESP32 ,HELLO WORLD显示状态,这个状态是静默状态,正在等待下一步动作,MQTT显示窗口会出现MQTT Connected!,后面就没有任何显示了。
- 一切动作都在等待倾斜开关的动作,当倾斜开关出现倾斜时,首先蜂鸣器就会发出响亮的蜂鸣声,由于是晚上,我没有把蜂鸣器上的贴纸拿下来,因为有同事在休息,不能吵到同事睡觉。蜂鸣器发出的声音非常的清脆,不过这个蜂鸣器可以调节它的工作模式,可以有节奏的发出蜂鸣声,然后风机会转,民会发出工作的声音,这个是听;人眼可以看到的ESP32-WROOM-32E LED会亮,倾斜开关上的LED也会点亮,红色的LED,红色的LED代表警示的作用,可以在晚上或者白天都非常的清晰看到,ESP32-WROOM-32E板载LED的工作方式是,只有当倾斜开关出现倾斜时才会亮,也就是触发状态时,当倾斜开关到正常状态时就会熄灭,倾斜开关倾斜时,会给到ESP32-WROOM-32EG 一个输入的高电平,这个时候ESP32-WROOM-32E的IO口就会识别到有电平输入,然后就会通过ESP32-WROOM-32E发射出相关的信息,还通过IO27脚输出高电平点亮LED,IO16脚输出高电平使蜂鸣器发出声音;ESP32-WROOM-32E通过网络与MQTT相连,发送倾斜开关倒下,开风机告诉MQTT,并通过MQTT的窗口显示出当前产品的工作状态,处于在哪一步。
- 当倾斜开关倾斜时,触发了报警状态,只能通过人为的操作按下IO27脚的轻触开关,IO27为输入,只有出现低电平时才会被ESP32-WROOM-32E的IO口识别,并取消蜂鸣器的蜂鸣,这个时间风机会一直在工作状态,不会因为人按下轻触开关时而关闭,MQTT窗口也会显示BUZZER off,MOTO RUN,OLED也会显示BUZZER off,MOTO RUN,OLED,然后OLED会一直停止在这个状态,不会有其它的动作,除非倾斜开关又倾倒,才会再次触发工作,满足条件后,又会再次回到DOWN的状态,往返工作。
项目总结报告:
- 本项目是个人进行物联网开发的产品,是利用一个倾斜开关触发装置引发的工作模式产品,可以通过蜂鸣器LED报警,并打开风机工作,通过MQTT显示工作状态。
- 它是通过珠子滚动接触导针的原理来控制电路的接通或者断开的。比如打开或关掉电灯一样的道理,如手动去开关触碰里头的金属板电灯就亮,离开就关,滚珠开关也是利用这样的原理。利用开关中的小珠的滚动,制造与金属端子的触碰,就能产生导通或不导通的效果。
各功能对应的主要代码片段及说明:
#include <WiFi.h>
#include "WiFiClientSecure.h"
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include <Wire.h>
#include "SSD1306.h"
#define WLAN_SSID "TPS-227"
#define WLAN_PASS "TPSDS12345678"
/************************* Adafruit.io Setup *********************************/
#define MQTT_SERVER "broker.emqx.io"
#define MQTT_SERVERPORT 1883
#define MQTT_USERNAME "test001"
#define MQTT_KEY "test001"
int ledPin = 2; // Connect LED to pin 13
int report = 17; // Connect Tilt sensor to Pin3 倾倒报警器
int Buzzer = 16; //蜂鸣器模块连接引脚16
int moto1 = 15; //启动马达
int switcher = 27; //按键输入
//int moto2 = 12; //工作马达
//int moto3 = 4; //工作马达
WiFiClient client; //定义wifi客户端对象
Adafruit_MQTT_Client mqtt(&client, MQTT_SERVER, MQTT_SERVERPORT, MQTT_USERNAME, MQTT_KEY);
Adafruit_MQTT_Publish MQTT = Adafruit_MQTT_Publish(&mqtt, "alarm");
SSD1306 display(0x3c, 21, 22);
void setup() {
pinMode(ledPin, OUTPUT); // Set digital pin 13 to output mode
pinMode(report, INPUT); // Set digital pin 3 to input mode
pinMode(switcher, INPUT_PULLUP); // Set digital pin 3 to input mode
pinMode(Buzzer, OUTPUT); // Set digital pin 3 to input mode
pinMode(moto1, OUTPUT); //风机
// pinMode(moto2, OUTPUT); //马达
// pinMode(moto3, OUTPUT); //马达
//联网配置
display.init();//初始化
WiFi.begin(WLAN_SSID, WLAN_PASS);
delay(2000);
display.drawString(40, 25, "Hello World");//显示字符串
display.drawString(0, 0, "MeiYao ESP32");//显示字符串
display.drawString(0, 45, "...............................................");//显示..。
display.display();//显示
display.clear();
//digitalWrite(moto2, HIGH); // 马达
//digitalWrite(moto3, HIGH); // 马达
}
void loop() {
MQTT_connect();
if (digitalRead(report) == HIGH) //Read sensor value
{
display.clear();
digitalWrite(ledPin, HIGH); // Turn on LED when the sensor is tilted
digitalWrite(Buzzer, HIGH); // 蜂鸣器
digitalWrite(moto1, HIGH); // 风机
//发送mqtt消息代码
display.drawString(0, 0, "...............................................");//显示..。
display.drawString(60, 35, "360sw down");//显示字符串
display.drawString(40, 15, "buzzer moto run");//蜂鸣器工作
display.drawString(0, 50, "...............................................");//显示..。
display.display();//显示
if (!MQTT.publish("baojing alarm")) { //发布内容
// Serial.println(F("Msg pub Failed"));
} else {
// Serial.println(F("Msg pub OK!"));
}
if (!MQTT.publish("倾斜开关倒下,开风机")) { //发布内容
// Serial.println(F("Msg pub Failed"));
} else {
// Serial.println(F("Msg pub OK!"));
}
delay(1000);
} else {
}
digitalWrite(ledPin, LOW); // Turn off LED when the sensor is not triggered
if(digitalRead(switcher) == LOW)
{
if(digitalRead(switcher) == LOW)
{
delay(1000);
display.clear();
display.drawString(40, 0, "moto run");//显示字符串
display.drawString(0, 15, "...............................................");//显示..。
display.drawString(40, 35, "OFF BUZZER");//显示字符串
display.drawString(0, 45, "...............................................");//显示..。
display.display();//显示
digitalWrite(Buzzer, LOW); // Turn on LED when the sensor is tilted
if (!MQTT.publish("OFF BUZZER 关蜂鸣器")) { //发布内容
} else {
}
}
}
}
void MQTT_connect() {
int8_t ret;
// Stop if already connected.
if (mqtt.connected()) {
return;
}
uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
mqtt.disconnect();
delay(5000); // wait 5 seconds
retries--;
if (retries == 0) {
// basically die and wait for WDT to reset me
ESP.restart();
}
}
if (!MQTT.publish("MQTT Connected!")) { //发布内容
// Serial.println(F("Msg pub Failed"));
} else {
// Serial.println(F("Msg pub OK!"));
}
}
功能展示及说明