当前位置:   article > 正文

基于STM32的智慧厨房安全全栈嵌入式系统:融合FreeRTOS、MQTT、Flask、Vue.js、Flutter等技术的解决方案_单片机智惠厨房

单片机智惠厨房

1. 项目概述

智慧厨房安全系统是一个基于STM32微控制器的物联网项目,旨在提高厨房安全性和用户体验。该系统通过各种传感器监测厨房环境,如温度、湿度、烟雾浓度等,并通过Wi-Fi将数据传输到云端进行分析和存储。用户可以通过手机APP实时查看厨房状态,接收警报通知,远程控制设备。

本项目涵盖了嵌入式开发、后端服务器、前端应用和云平台等全栈技术,是一个综合性的物联网解决方案。

2. 系统设计

2.1 硬件设计

硬件系统主要包括:

  • STM32F4系列微控制器作为主控
  • DHT22温湿度传感器
  • MQ-2烟雾传感器
  • MQ-5可燃气体传感器
  • ESP8266 Wi-Fi模块
  • 蜂鸣器和LED用于本地警报
  • OLED显示屏用于显示实时数据

硬件系统架构图:

2.2 软件架构

软件系统包括:

  • STM32固件:采用FreeRTOS实时操作系统
  • MQTT Broker:用于设备和服务器间的通信
  • 后端服务器:使用Python Flask框架
  • 数据库:采用MySQL存储历史数据
  • Web前端:基于Vue.js框架
  • 移动APP:使用Flutter开发跨平台应用
  • Home Assistant:集成用于智能家居控制

软件系统架构图:

3. 代码实现

3.1 STM32固件核心代码

以下是STM32固件的主要结构,使用FreeRTOS创建了两个任务:主任务和MQTT发布任务。

  1. #include "FreeRTOS.h"
  2. #include "task.h"
  3. #include "semphr.h"
  4. #include "sensors.h"
  5. #include "wifi.h"
  6. #include "mqtt_client.h"
  7. // 互斥信号量
  8. SemaphoreHandle_t xDataMutex;
  9. // 全局传感器数据结构体
  10. SensorData_t gSensorData;
  11. // 主任务函数
  12. void vMainTask(void *pvParameters)
  13. {
  14. while(1)
  15. {
  16. // 获取互斥信号量
  17. xSemaphoreTake(xDataMutex, portMAX_DELAY);
  18. // 读取传感器数据
  19. ReadSensorData(&gSensorData);
  20. // 释放互斥信号量
  21. xSemaphoreGive(xDataMutex);
  22. // 检查阈值
  23. CheckThresholds(&gSensorData);
  24. // 任务延时
  25. vTaskDelay(pdMS_TO_TICKS(1000));
  26. }
  27. }
  28. // MQTT发布任务函数
  29. void vMQTTPublishTask(void *pvParameters)
  30. {
  31. while(1)
  32. {
  33. // 获取互斥信号量
  34. xSemaphoreTake(xDataMutex, portMAX_DELAY);
  35. // 发布传感器数据
  36. MQTT_PublishSensorData(&gSensorData);
  37. // 释放互斥信号量
  38. xSemaphoreGive(xDataMutex);
  39. // 任务延时
  40. vTaskDelay(pdMS_TO_TICKS(5000));
  41. }
  42. }
  43. // 主函数
  44. int main(void)
  45. {
  46. // 硬件初始化
  47. HardwareInit();
  48. // 创建互斥信号量
  49. xDataMutex = xSemaphoreCreateMutex();
  50. // 创建主任务
  51. xTaskCreate(vMainTask, "MainTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
  52. // 创建MQTT发布任务
  53. xTaskCreate(vMQTTPublishTask, "MQTTPublishTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
  54. // 启动调度器
  55. vTaskStartScheduler();
  56. for(;;);
  57. }
代码说明:
  • vMainTask函数:该函数执行主任务,负责读取传感器数据并检查是否超出阈值。在每次读取和处理数据之前获取互斥信号量,以确保数据安全。
  • vMQTTPublishTask函数:该函数执行MQTT发布任务,定期将传感器数据发布到MQTT Broker。与主任务类似,它也在操作数据之前获取互斥信号量。
  • main函数:硬件初始化后,创建互斥信号量和任务,并启动FreeRTOS调度器。

3.2 传感器驱动代码

以下是传感器驱动代码,实现了对各类传感器数据的读取和阈值检查。

  1. #include "sensors.h"
  2. // 读取传感器数据
  3. void ReadSensorData(SensorData_t* data)
  4. {
  5. data->temperature = ReadTemperature();
  6. data->humidity = ReadHumidity();
  7. data->smoke = ReadSmokeLevel();
  8. data->gas = ReadGasLevel();
  9. }
  10. // 检查传感器数据是否超出阈值
  11. void CheckThresholds(SensorData_t* data)
  12. {
  13. if(data->temperature > TEMP_THRESHOLD ||
  14. data->humidity > HUMIDITY_THRESHOLD ||
  15. data->smoke > SMOKE_THRESHOLD ||
  16. data->gas > GAS_THRESHOLD)
  17. {
  18. TriggerAlarm();
  19. }
  20. else
  21. {
  22. ClearAlarm();
  23. }
  24. }
代码说明:
  • ReadSensorData函数:封装了具体的传感器数据读取操作,包括温度、湿度、烟雾和可燃气体传感器。
  • CheckThresholds函数:检查读取到的传感器数据是否超过预设阈值,如果超过则触发报警,否则清除报警。

3.3 MQTT通信代码

以下是使用ESP8266模块通过UART与STM32通信,并通过MQTT协议将数据上传至云端的代码示例。

  1. #include "mqtt_client.h"
  2. #include "wifi.h"
  3. // MQTT发布传感器数据
  4. void MQTT_PublishSensorData(SensorData_t* data)
  5. {
  6. char payload[128];
  7. snprintf(payload, sizeof(payload), "{\"temperature\":%.2f,\"humidity\":%.2f,\"smoke\":%.2f,\"gas\":%.2f}",
  8. data->temperature, data->humidity, data->smoke, data->gas);
  9. MQTT_Publish("kitchen/sensorData", payload);
  10. }
  11. // 初始化Wi-Fi并连接到AP
  12. void WiFi_Init(void)
  13. {
  14. ESP8266_Init();
  15. ESP8266_JoinAP("SSID", "PASSWORD");
  16. ESP8266_StartMQTT("broker.hivemq.com", 1883, "kitchenClient");
  17. }
代码说明:
  • MQTT_PublishSensorData函数:将传感器数据格式化为JSON字符串,并通过MQTT协议发布到指定的主题。
  • WiFi_Init函数:初始化ESP8266模块,并连接到指定的Wi-Fi接入点,然后启动MQTT客户端连接到MQTT Broker。

4. 后端开发

4.1 Flask后端示例

以下是使用Python Flask框架实现的后端服务器代码示例。

  1. from flask import Flask, request, jsonify
  2. from flask_sqlalchemy import SQLAlchemy
  3. app = Flask(__name__)
  4. app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:password@localhost:3306/kitchen_db'
  5. db = SQLAlchemy(app)
  6. class SensorData(db.Model):
  7. id = db.Column(db.Integer, primary_key=True)
  8. temperature = db.Column(db.Float)
  9. humidity = db.Column(db.Float)
  10. smoke = db.Column(db.Float)
  11. gas = db.Column(db.Float)
  12. timestamp = db.Column(db.DateTime, default=db.func.current_timestamp())
  13. @app.route('/data', methods=['POST'])
  14. def receive_data():
  15. data = request.json
  16. new_data = SensorData(
  17. temperature=data['temperature'],
  18. humidity=data['humidity'],
  19. smoke=data['smoke'],
  20. gas=data['gas']
  21. )
  22. db.session.add(new_data)
  23. db.session.commit()
  24. return jsonify({'status': 'success'}), 200
  25. @app.route('/data', methods=['GET'])
  26. def get_data():
  27. data = SensorData.query.all()
  28. result = []
  29. for entry in data:
  30. result.append({
  31. 'temperature': entry.temperature,
  32. 'humidity': entry.humidity,
  33. 'smoke': entry.smoke,
  34. 'gas': entry.gas,
  35. 'timestamp': entry.timestamp
  36. })
  37. return jsonify(result), 200
  38. if __name__ == '__main__':
  39. db.create_all()
  40. app.run(debug=True)
代码说明:
  • SensorData模型:定义了传感器数据的数据库模型,包括温度、湿度、烟雾、气体浓度和时间戳字段。
  • receive_data路由:处理POST请求,接收传感器数据并存储到数据库中。
  • get_data路由:处理GET请求,从数据库中获取所有传感器数据并返回JSON格式的响应。

4.2 数据库设计

使用MySQL数据库存储传感器数据。数据库表的设计如下:

  1. CREATE TABLE SensorData (
  2. id INT AUTO_INCREMENT PRIMARY KEY,
  3. temperature FLOAT,
  4. humidity FLOAT,
  5. smoke FLOAT,
  6. gas FLOAT,
  7. timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  8. );

4.3 Web前端示例

以下是使用Vue.js框架实现的Web前端代码示例。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>智慧厨房安全系统</title>
  5. <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
  6. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
  7. <style>
  8. table {
  9. width: 100%;
  10. border-collapse: collapse;
  11. }
  12. th, td {
  13. border: 1px solid black;
  14. padding: 8px;
  15. text-align: left;
  16. }
  17. th {
  18. background-color: #f2f2f2;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <div id="app">
  24. <h1>智慧厨房安全系统</h1>
  25. <table>
  26. <tr>
  27. <th>Temperature</th>
  28. <th>Humidity</th>
  29. <th>Smoke</th>
  30. <th>Gas</th>
  31. <th>Timestamp</th>
  32. </tr>
  33. <tr v-for="data in sensorData" :key="data.timestamp">
  34. <td>{{ data.temperature }}</td>
  35. <td>{{ data.humidity }}</td>
  36. <td>{{ data.smoke }}</td>
  37. <td>{{ data.gas }}</td>
  38. <td>{{ data.timestamp }}</td>
  39. </tr>
  40. </table>
  41. </div>
  42. <script>
  43. new Vue({
  44. el: '#app',
  45. data: {
  46. sensorData: []
  47. },
  48. created() {
  49. this.fetchSensorData();
  50. },
  51. methods: {
  52. fetchSensorData() {
  53. axios.get('http://localhost:5000/data')
  54. .then(response => {
  55. this.sensorData = response.data;
  56. })
  57. .catch(error => {
  58. console.error('Error fetching sensor data:', error);
  59. });
  60. }
  61. }
  62. });
  63. </script>
  64. </body>
  65. </html>
代码说明:
  • HTML结构:定义了一个简单的表格来显示传感器数据。
  • Vue实例:创建了一个Vue实例,初始化了sensorData数组,并在实例创建时调用fetchSensorData方法。
  • fetchSensorData方法:使用Axios库发送GET请求到后端服务器,获取传感器数据并将其存储在sensorData数组中。

4.4 移动APP示例

以下是使用Flutter框架实现的移动应用代码示例。

  1. import 'package:flutter/material.dart';
  2. import 'package:http/http.dart' as http;
  3. import 'dart:convert';
  4. void main() => runApp(MyApp());
  5. class MyApp extends StatelessWidget {
  6. @override
  7. Widget build(BuildContext context) {
  8. return MaterialApp(
  9. home: SensorDataScreen(),
  10. );
  11. }
  12. }
  13. class SensorDataScreen extends StatefulWidget {
  14. @override
  15. _SensorDataScreenState createState() => _SensorDataScreenState();
  16. }
  17. class _SensorDataScreenState extends State<SensorDataScreen> {
  18. List<dynamic> sensorData = [];
  19. @override
  20. void initState() {
  21. super.initState();
  22. fetchSensorData();
  23. }
  24. Future<void> fetchSensorData() async {
  25. final response = await http.get(Uri.parse('http://localhost:5000/data'));
  26. if (response.statusCode == 200) {
  27. setState(() {
  28. sensorData = json.decode(response.body);
  29. });
  30. } else {
  31. throw Exception('Failed to load sensor data');
  32. }
  33. }
  34. @override
  35. Widget build(BuildContext context) {
  36. return Scaffold(
  37. appBar: AppBar(
  38. title: Text('智慧厨房安全系统'),
  39. ),
  40. body: ListView.builder(
  41. itemCount: sensorData.length,
  42. itemBuilder: (context, index) {
  43. final data = sensorData[index];
  44. return ListTile(
  45. title: Text('Temperature: ${data['temperature']}'),
  46. subtitle: Text(
  47. 'Humidity: ${data['humidity']} \nSmoke: ${data['smoke']} \nGas: ${data['gas']} \nTimestamp: ${data['timestamp']}',
  48. ),
  49. );
  50. },
  51. ),
  52. );
  53. }
  54. }
代码说明:
  • Flutter应用结构:创建了一个简单的Flutter应用,其中包含一个SensorDataScreen来显示传感器数据。
  • fetchSensorData方法:使用http库发送GET请求到后端服务器,获取传感器数据并解析为JSON格式,然后更新状态。

5. 项目总结

本项目通过STM32微控制器、传感器、ESP8266 Wi-Fi模块等硬件设备,结合FreeRTOS、MQTT、Flask、Vue.js、Flutter等软件技术,构建了一个综合性的智慧厨房安全系统。项目的主要成果和总结如下:

5.1 硬件设计

项目的硬件部分采用了STM32F4系列微控制器作为主控,配合DHT22温湿度传感器、MQ-2烟雾传感器、MQ-5可燃气体传感器等多种传感器,对厨房环境进行实时监测。同时,ESP8266 Wi-Fi模块实现了数据的无线传输,蜂鸣器和LED提供了本地报警功能,OLED显示屏用于显示当前传感器数据。

5.2 软件架构

软件部分采用FreeRTOS实时操作系统,实现了任务的调度和管理。通过MQTT协议,传感器数据可以实时上传到云端进行存储和分析。后端服务器使用Python Flask框架,结合MySQL数据库,实现了数据的接收、存储和查询功能。前端部分采用Vue.js框架,实现了Web端的实时数据展示和用户交互。移动端则使用Flutter框架开发,实现了跨平台的移动应用,方便用户随时随地查看厨房状态。

5.3 系统集成

项目的系统集成部分通过Home Assistant实现了智能家居的控制和管理。用户可以通过Web前端或移动APP实时查看厨房环境数据,接收报警通知,并远程控制相关设备。同时,系统还可以根据预设的阈值自动触发报警,确保厨房的安全。

5.4 项目成果

  1. 实时环境监测:通过多种传感器实时监测厨房环境,包括温度、湿度、烟雾和可燃气体浓度。
  2. 无线数据传输:通过ESP8266 Wi-Fi模块实现了数据的无线传输,用户可以通过互联网随时查看数据。
  3. 智能报警:系统可以根据设定的阈值自动触发报警,并通过蜂鸣器和LED进行本地提示,同时通过MQTT发送报警通知到用户的手机。
  4. 数据存储与分析:传感器数据可以存储在云端数据库中,方便用户进行历史数据查询和分析。
  5. 跨平台应用:通过Web前端和Flutter移动应用,用户可以在多种设备上访问系统,操作便捷。

5.5 项目挑战与解决方案

  1. 实时性要求高:为确保数据的实时性和系统响应速度,项目采用了FreeRTOS进行任务调度,并使用MQTT协议进行高效的消息传递。
  2. 数据安全性:在数据传输过程中,采用HTTPS加密协议,确保数据的安全性和完整性。
  3. 系统可靠性:通过合理的硬件设计和软件架构,确保系统的稳定运行,避免因硬件故障或软件错误导致系统崩溃。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/997730
推荐阅读
相关标签
  

闽ICP备14008679号