CC2530/ESP32+传感器+ZigBee+MQTT+MYSQL+Springboot+Vue+Echarts的老人卫生间防摔倒自动报警系统
写在前言
这是第一次发布也是我第一次制作一个软硬件结合的小系统。分为两个版本,一种是使用esp32作为开发板,使用红外、触控、温湿度、蜂鸣器等作为传感器获取数据。通过MQTT将数据发送,使用python接收并保存到mysql数据库中,后端使用Springboot,前端使用vue结合echarts制作了一个可视化大屏。另一个版本使用CC2530作为开发板,使用激光测距传感器、红外传感器、温湿度传感器、光敏传感器等获取数据,并使用zigbee协议进行组网,将整个感知层分为4个节点和一个协调器,个节点负责采集数据,使用zigbee将数据传送到协调器,协调器通过esp8266使用mqtt将数据发送出去。后面数据获取、保存、前后端展示和esp32模块相同。下文分为一代和二代进行讲解。内容很长,希望你能看完。
运行效果展示
废话不多说,先看运行效果。演示视频录得有点草率,请多包涵,将就着看。
演示视频
一代版本
一代版本使用了3个ESP32开发板,分别获取卫生间、马桶和淋浴的信息。整体架构图如下:
ESP32+MQTT读取红外传感器
首先使用红外传感器判断老人是否使用卫生间。引脚连接图如下:
代码如下:
#include <WiFi.h>
#include <PubSubClient.h>
// WiFi名及密码
const char* ssid = ""; //WiFi名
const char* password = ""; //WiFi密码
const char* mqtt_server = "broker.emqx.io"; //mqtt服务器ip地址
const int buzzpin = 16; //定义蜂鸣器16号引脚
const int ledpin = 2;//红外引脚
int infrared_value = 0;//红外传感器值
int infrared_hight = 0;//红外高电平
int infrared_low = 0;//红外低电平
int flag = 0;
boolean infrared_flag = false;//红外检测卫生间使用状态false表示无人、true表示有人
char attributes[1000];
#define LED_BUILTIN 13 //灯 13引脚
WiFiClient espClient; // 定义wifiClient实例
PubSubClient client(espClient); // 定义PubSubClient的实例
void setup_wifi() {
//初始化WiFi
delay(10); // 板子通电后要启动,稍微等待一下让板子点亮
Serial.println(); // 准备连接WiFi
Serial.print("连接: ");
Serial.println(ssid); //输出连接WiFi名
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi连接成功!");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("消息来自: [");
Serial.print(topic); // 打印主题信息
Serial.print("] 主题,内容:");
char str[100];
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]); // 打印主题内容
str[i] = (char)payload[i];
}
Serial.println();
if (strcmp(topic, "light_linfeng") == 0) {
//判读信息来源主题
if (strcmp(str, "开灯") == 0) {
//判断命令
digitalWrite(LED_BUILTIN, HIGH); // 开灯
} else if (strcmp(str, "关灯") == 0) {
digitalWrite(LED_BUILTIN, LOW); // 关灯
}
} else if (strcmp(topic, "alarm_linfeng") == 0) {
//判读信息来源主题
if (strcmp(str, "开始") == 0) {
digitalWrite(buzzpin, HIGH); // 开始报警
} else if (strcmp(str, "关闭") == 0) {
digitalWrite(buzzpin, LOW); // 关闭报警
}
}
}
void reconnect() {
while (!client.connected()) {
// 保持连接mqtt
Serial.print("尝试MQTT连接…");
String clientId = "ESP8266Client-"; // 创建随机的客户端ID
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
// 尝试连接
Serial.println("连接成功!");
client.subscribe("linfeng_data"); //订阅消息
client.subscribe