CC2530/ESP32+传感器+ZigBee+MQTT+MYSQL+Springboot+Vue+Echarts的老人卫生间防摔倒自动报警系统

  • 写在前言
    • 运行效果展示
    • 一代版本
      • ESP32+MQTT读取红外传感器
      • ESP32+MQTT读取触控传感器
      • ESP32+MQTT读取温湿度传感器
      • python订阅MQTT保存数据到MySQL
      • Springboot后端读取MySQL
      • Vue+Axios+Echarts+js可视化大屏展示
    • 二代版本
      • CC2530读取红外传感器
      • CC2530读取小车循迹传感器
      • CC2530读取激光测距传感器
      • CC2530读取温湿度传感器
      • python订阅MQTT保存数据到MySQL
      • Springboot后端读取MySQL
      • Vue+Axios+Echarts+js可视化大屏展示
  • 总结

写在前言

这是第一次发布也是我第一次制作一个软硬件结合的小系统。分为两个版本,一种是使用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() { //初始化WiFidelay(10);  // 板子通电后要启动,稍微等待一下让板子点亮Serial.println();  // 准备连接WiFiSerial.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()) { // 保持连接mqttSerial.print("尝试MQTT连接…");String clientId = "ESP8266Client-";    // 创建随机的客户端IDclientId += String(random(0xffff), HEX);if (client.connect(clientId.c_str())) {    // 尝试连接Serial.println("连接成功!");client.subscribe("linfeng_data"); //订阅消息client.subscribe("light_linfeng"); //订阅消息client.subscribe("alarm_linfeng"); //订阅消息} else { //连接失败Serial.print("failed, rc=");Serial.print(client.state());Serial.println(" try again in 5 seconds");delay(5000);}}
}void setup() {pinMode(LED_BUILTIN, OUTPUT);     // 初始化BUILTIN_LED引脚作为输出pinMode(buzzpin, OUTPUT);     // 初始化buzzpin引脚作为输出Serial.begin(115200); // 串口波特率setup_wifi(); //执行Wifi初始化,下文有具体描述client.setServer(mqtt_server, 1883); //设定MQTT服务器与使用的端口,1883是默认的MQTT端口client.setCallback(callback); //设定回调方式,当ESP8266收到订阅消息时会调用此方法
}void loop() {if (!client.connected()) {reconnect();}client.loop();infrared_value = digitalRead(ledpin); //读取红外传感器if (infrared_value == HIGH && flag == 0) //如果它的值为高电平,即检测到有人通过{flag = 1;infrared_hight = 1;}else if(infrared_value == LOW){flag = 0;}if (infrared_hight == 1) {infrared_hight = 0;if (infrared_flag) {Serial.println("离开卫生间!");String payload = "{";payload += "\"place\":"; payload += "\"wc\",";payload += "\"IsWc\":"; payload += false;payload += "}";payload.toCharArray( attributes, 1000 );client.publish("linfeng_data", attributes); //MQTT发布消息client.publish("wc_linfeng", "不行"); //向马桶、淋浴发送指令表示不可以发布信息} else if (!infrared_flag) {Serial.println("进入卫生间!");String payload = "{";payload += "\"place\":"; payload += "\"wc\",";payload += "\"IsWc\":"; payload += true;payload += "}";payload.toCharArray( attributes, 1000 );client.publish("linfeng_data", attributes); //MQTT发布消息client.publish("wc_linfeng", "可以"); //向马桶、淋浴发送指令表示可以发布信息}infrared_flag = !infrared_flag;infrared_hight = 0;}delay(200);
}

使用串口调试助手可查看信息的收发,结果如下:

ESP32+MQTT读取触控传感器

使用触控传感器采集老人使用马桶的数据,引脚连接图如下:

关键代码如下:

void loop() {if (!client.connected()) {reconnect();}client.loop();if (wc_flag == 1) {touch_value = digitalRead(TOUCH_PIN); //如果进入卫生间则读取触控传感器}if (touch_value == HIGH) //如果它的值为高电平,即检测到有人通过{touch_hight = 1;delay(100);}else{if (touch_hight == 1) {touch_low = 1;}delay(100);}if (touch_hight == 1 && touch_low == 1) {if (touch_flag) {String payload = "{";payload += "\"place\":"; payload += "\"toilet\",";payload += "\"IsToilet\":"; payload += false;payload += "}";payload.toCharArray( attributes, 1000 );client.publish("linfeng_data", attributes); //MQTT发布消息Serial.println("离开马桶!");} else if (!touch_flag) {String payload = "{";payload += "\"place\":"; payload += "\"toilet\",";payload += "\"IsToilet\":"; payload += true;payload += "}";payload.toCharArray( attributes, 1000 );client.publish("linfeng_data", attributes); //MQTT发布消息Serial.println("使用马桶!");}touch_flag = !touch_flag;touch_hight = 0;touch_low = 0;}delay(200);
}

使用串口调试助手可查看信息的收发,结果如下:

ESP32+MQTT读取温湿度传感器

前两个传感器采集了卫生间和马桶的信息。此处就采集淋浴的使用情况,淋浴的使用和马桶一样,通过触控传感器来采集,此处多了一个温湿度的采集。温湿度引脚连接图如下:

关键代码如下:

void getAndSendTemperatureAndHumidityData()
{// 大概1s读取一次delay(200);byte hum;byte tem;int err = SimpleDHTErrSuccess;if ((err = dht11.read(&tem, &hum, NULL)) != SimpleDHTErrSuccess) {Serial.print("读取数据失败, err="); Serial.println(err);delay(1000);return;}// 查看是否读取温湿度失败的if (isnan(hum) || isnan(tem)) {Serial.println("从DHT传感器读取失败!");return;}String temperature = String(tem);String humidity = String(hum);// 构建一个 JSON 格式的payload的字符串String payload = "{";payload += "\"temperature\":"; payload += temperature; payload += ",";payload += "\"humidity\":"; payload += humidity;payload += "}";payload.toCharArray( attributes, 100 );client.publish( "Tem_hum", attributes );
}

使用淋浴结果如下:

python订阅MQTT保存数据到MySQL

感知层的数据获取完成后,接下来就是数据的存储。使用python订阅感知层发送的MQTT主题,接收这些主题的信息,并将其保存到MySQL数据库中。关键代码如下:

# -*- encoding: utf-8 -*-
"""
@File    : 老人卫生间防摔倒自动报警系统.py
@Time    : 2022/5/22 16:32
@Author  : 林枫
@Software: PyCharm
"""
import time
import paho.mqtt.client as mqtt
import pymysqlbroker = 'broker.emqx.io'
port = 1883def saveMysql(tableName, data):conn = pymysql.connect(host='localhost',  # 调用MySQL 并命名为 connuser='root',  # 输入用户名password='',  # 输入初始密码db='oldman',  # 调用数据库charset='utf8')  # 定义格式cursor = conn.cursor()  # 创建游标   模拟鼠标if tableName == 'toilet':sql = """insert into toilet(in_time, out_time)values(%s, %s)"""# sql语句向表名为林的表中插入值   这里的%s是占位符  等待匹配对应值cursor.execute(sql, (data[0], data[1]))  # 向占位符中输入对应值conn.commit()conn.rollback()time.sleep(1)  # 延时0.1秒,免得CPU出问题..............print("保存成功!")conn.close()  # 关闭   数据库def on_connect(client, userdata, flags, rc):if rc == 0:print("连接成功!")client.subscribe(topic='linfeng_data')else:print("Failed to connect, return code %dn", rc)
def on_message(client, userdata, msg):global wcs_time, toilet_times, showers_timemessage = []data = eval(msg.payload.decode())if data["place"] == "wc":if data["IsWc"] == 1:wcs_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())  # 规整本地时间的格式print(wcs_time)message.clear()message = [1, 0, 0, wcs_time]print("开始保存数据到state中......................")saveMysql("state", message)if data["IsWc"] == 0:wc_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())  # 规整本地时间的格式print(wc_time)message.clear()message.append(wcs_time)message.append(wc_time)print("开始保存数据到wc中......................")saveMysql("wc", message)message.clear()message = [0, 0, 0, wc_time]print("开始保存数据到state中......................")saveMysql("state", message).....................................def run():client = mqtt.Client()client.on_connect = on_connectclient.on_message = on_messageclient.connect("broker.emqx.io", 1883, 60)client.loop_forever()if __name__ == '__main__':run()

运行结果如下:

数据库部分信息如下:

Springboot后端读取MySQL

本系统较为简单,对数据库的操作只有添加和读取,添加使用python,读取部分使用Springboot框架和mybatis-plus。

State类:

package com.example.floodprevention.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;/*** @author 林枫* @date 2022年05月22日 19:04*/
@TableName("state")
@Data
public class State {@TableId(type = IdType.AUTO)private Integer id;private String wc;private String toilet;private String shower;private String nowTime;
}

StateMapper接口:

package com.example.floodprevention.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.floodprevention.entity.State;public interface StateMapper extends BaseMapper<State> {}

StateController方法:

package com.example.floodprevention.controller;import com.example.floodprevention.common.Result;
import com.example.floodprevention.mapper.StateMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** @author 林枫* @date 2022年05月22日 19:07*/
@RestController
@RequestMapping("/state")
public class StateController {@ResourceStateMapper stateMapper;@GetMappingpublic Result<?> GetAll() {return Result.success(stateMapper.selectList(null));}
}

访问路由结果如下:

Vue+Axios+Echarts+js可视化大屏展示

由于前端代码过于复杂,就不进行代码展示,效果图如下:

注:由于截图时硬件没有运行,所以没有温湿度的数据!系统的整体运行效果可访问下面的连接。视频草率,请勿吐槽

CC2530/ESP32+传感器+ZigBee+MQTT+MYSQL+Springboot+Vue+Echarts的老人卫生间防摔倒自动报警系统相关推荐

  1. Java+MySQL Springboot+vue的体用用品销售商城网站#毕业设计

    项目编号:Java+MySQL spring264-基于Springboot+vue的体用用品销售商城网站#毕业设计 开发语言:Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 ...

  2. SpringBoot+Vue+Echarts实现双柱体柱状图

    场景 若依前后端分离版本地搭建开发环境并运行项目的教程: 若依前后端分离版手把手教你本地搭建环境并运行项目_BADAO_LIUMANG_QIZHI的博客-CSDN博客 在上面搭建架构的基础上,实现使用 ...

  3. Springboot+Vue+Echarts实现51job大数据岗位分析数据大屏

    效果图:  后端代码: 前端代码: 前后端分离开发,适合当大数据数据大屏大作业,需要源码请私信!

  4. Java项目:仿小米电子产品售卖商城系统(java+SpringBoot+Vue+MySQL+Redis+ElementUI)

    源码获取:博客首页 "资源" 里下载! 项目描述:这是一个基于SpringBoot+Vue框架开发的仿小米电子产品售卖商城系统.首先,这是一个前后端分离的项目,代码简洁规范,注释说 ...

  5. Java项目:前后端分离疫情防疫平台设计和实现(java+springmvc+VUE+node.js+mybatis+mysql+springboot+redis+jsp)

    源码获取:博客首页 "资源" 里下载! 主要技术:Java.springmvc.VUE.node.js.mybatis.mysql.tomcat.jquery.layui.boot ...

  6. 基于JAVA+SpringBoot+Vue+Mybatis+MYSQL的在线音乐网站

    项目介绍: 基于springboot+vue实现的音乐网站,系统采用前后端分离开发模式开发,分为三个工程文件,分别是springboot后台服务端工程,主要提供API接口:vue前端用户客户端工程,主 ...

  7. Java项目毕业设计:交流互动论坛信息网站(java+springboot+vue+mysql)

    运行环境: 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服务:Tomcat7/Tomcat8 使用框架springboot+vue 项目介绍 系统主要功能包括管理员:首页.个人 ...

  8. 基于javaweb的精美物流管理系统(java+springboot+vue+mysql)

    基于javaweb的精美物流管理系统(java+springboot+vue+mysql) 运行环境 Java≥8.MySQL≥5.7.Node.js≥10 开发工具 后端:eclipse/idea/ ...

  9. Java+MySQL基于Springboot+vue的汉服交流网站#毕业设计

    项目编号:Java+MySQL spring263-基于Springboot+vue的汉服交流网站#毕业设计 开发语言:Java 开发工具:IDEA /Eclipse 数据库:MYSQL5.7 应用服 ...

最新文章

  1. anaconda3下opencv安装
  2. 面试(后台开发,转载)
  3. 今晚直播 | 清华大学NLP组刘正皓:神经信息检索的进展与挑战
  4. VTK:可视化算法之DataSetSurface
  5. 突然听到一只公鸡的局域网聊天软件
  6. mybatis笔记之使用Mapper接口注解
  7. Enterprise Library 3.1 简化使用范例一
  8. Rust语言学习大纲
  9. php smarty 后台,smarty后台文件常用方法及说明
  10. 小米销量被荣耀赶超:手机枭雄如何跌落神坛?
  11. Spring Boot入门(5)-表单验证
  12. matlab/simulink 永磁直驱海上风电场仿真模型 含集群电流源等效 海上风电场线路结构
  13. 网站漏洞修复之CSRF跨站攻击
  14. 解构2019世界人工智能大会:三大变化,十年趋势,一场地球与火星的碰撞
  15. 和导师闹僵跑来实习?拼了命也要拿到大厂实习offer
  16. poj3294Life Forms
  17. Nova Conductor服务
  18. autojs教程:完善找图函数,图片内随机点击
  19. 2020-02-10
  20. 重磅!《2020年中国 DevOps 现状调查》全面启动!

热门文章

  1. 【程序源代码】毕业设计源码推荐
  2. Java后台+PDF.js 实现pdf分页加载的后端实现
  3. Visual Studio Code (VSCode)使用之普通Web项目启动
  4. python 手眼标定OpenCV手眼标定(calibrateHandeye())二
  5. cnn汇总(1)(2)
  6. STC51定时器与定时器中断
  7. TED的字幕到哪里下载?介绍一个很好的网站
  8. 数据库udf提权,WAF绕过
  9. SoapUI中返回提示信息“The processing instruction target matching “[xX][mM][lL]“ is not allowed”的解决方法及原因
  10. ssh密钥的生成与使用