基于STM32的智能电表可视化设计:ESP8266、AT指令集、python后端Flask(代码示例)

一、项目概述

随着智能家居的普及,智能电表作为家庭用电管理的重要工具,能够实时监测电流、电压及功率,并将数据传输至后台进行分析和可视化。本项目以STM32C8T6为核心,结合交流电压电流监测模块、ESP8266 Wi-Fi模块、OLED显示屏和继电器,构建一个智能电表系统。通过AT指令实现ESP8266与Python后端的通信,使得用户能够在可视化界面上实时查看用电情况。

项目目标

  • 实现电流和电压的实时监测。

  • 通过Wi-Fi将数据发送至Python后端。

  • 在OLED显示屏上实时显示监测数据。

  • 控制继电器开关,实现智能电器管理。

技术栈关键词

  • 单片机:STM32C8T6

  • 传感器:交流电压电流监测模块

  • 通信模块:ESP8266

  • 显示模块:OLED

  • 控制模块:继电器

  • 后端技术:Python、Flask、Matplotlib

  • 通信协议:AT指令集

二、系统架构

系统架构设计基于模块化思想,各个功能模块相互独立又紧密协作。以下是系统架构的详细描述:

  1. STM32C8T6:作为主控单元,负责数据采集、处理和控制。

  2. 电流电压监测模块:实时监测家用电器的电流和电压,提供数据给STM32。

  3. ESP8266模块:实现Wi-Fi连接,通过AT指令与Python后端通信。

  4. OLED显示模块:用于显示实时的电流、电压和功率信息。

  5. 继电器模块:根据设定条件控制电器的开关。

系统架构图

以下是系统架构图,清晰展示了各组件之间的交互关系:
采集数据 控制 显示 发送数据 数据传输 数据可视化 STM32C8T6 电流电压监测模块 继电器 OLED ESP8266 Python后端 用户界面

三、环境搭建和注意事项

1. 开发环境搭建

  • 软件开发:

    • STM32开发环境:使用STM32CubeIDE进行代码编写和调试。

    • Python开发环境:安装Python 3.x及Flask、requests等库,使用pip安装:

      bash 复制代码
      pip install Flask requests matplotlib
  • 硬件准备:

    • STM32C8T6开发板

    • 交流电压电流监测模块(如ZMPT101B、ACS712)

    • ESP8266 Wi-Fi模块

    • OLED显示屏(I2C接口)

    • 继电器模块

    • 连接线和面包板

2. 注意事项

  • 电源管理:确保所有模块的电源符合其工作电压,避免损坏。

  • 通信设置:在使用ESP8266时,确保AT指令集正确配置,避免连接失败。

  • 硬件连接:按照电路原理图连接各模块,确保连接牢固,避免短路和接触不良。

  • 安全性:在进行电流监测时,务必注意安全,避免直接接触高压电源。

四、代码实现过程

在这一部分中,我们将详细介绍项目的代码实现过程,特别是如何使用AT指令与ESP8266进行通信,以及各个模块的具体实现。代码将按照系统架构的设计,逐步实现功能模块,确保逻辑清晰且易于理解。

1. 系统初始化

首先,我们需要初始化各个模块,包括电流电压监测模块、OLED显示模块、ESP8266模块和继电器模块。以下是系统初始化的代码示例:

c 复制代码
#include "stm32f10x.h"
#include "oled.h"
#include "esp8266.h"
#include "current_sensor.h"
#include "relay.h"

void init_system() {
    // 初始化电流电压监测模块
    current_sensor_init();
    
    // 初始化OLED显示
    oled_init();
    
    // 初始化ESP8266
    esp8266_init();
    
    // 初始化继电器
    relay_init();
}

2. 数据采集

接下来,我们使用定时器定期采集电流和电压数据。在该函数中,我们将读取数据并在OLED上显示,并调用发送数据到服务器的函数。

c 复制代码
void collect_data() {
    float voltage = read_voltage();  // 读取电压数据
    float current = read_current();   // 读取电流数据
    float power = voltage * current;  // 计算功率
    
    oled_display(voltage, current, power); // 在OLED上显示数据
    send_data_to_server(voltage, current, power); // 发送数据到服务器
}

3. 数据传输

在这一部分,我们将详细介绍如何使用ESP8266模块通过AT指令与Python后端进行通信。ESP8266通过串口与STM32连接,接收指令并执行相应的操作。

3.1 ESP8266模块配置

在开始发送数据之前,我们首先需要配置ESP8266模块连接到Wi-Fi网络。以下是一个示例代码,展示如何通过AT指令设置Wi-Fi连接:

c 复制代码
void esp8266_init() {
    // 发送AT指令初始化ESP8266
    send_command_to_esp("AT\r\n");  // 检查模块是否响应
    delay(1000);

    send_command_to_esp("AT+RST\r\n");  // 重置ESP8266
    delay(2000);

    send_command_to_esp("AT+CWMODE=1\r\n");  // 设置为STA模式
    delay(1000);

    // 连接到Wi-Fi
    const char* ssid = "your_SSID";      // Wi-Fi名称
    const char* password = "your_PASSWORD"; // Wi-Fi密码
    char command[100];
    sprintf(command, "AT+CWJAP=\"%s\",\"%s\"\r\n", ssid, password);
    send_command_to_esp(command);  // 连接Wi-Fi
    delay(5000);  // 等待连接
}
3.2 发送数据到Python后端

一旦ESP8266连接到Wi-Fi,我们就可以使用AT指令将数据发送到Python后端。以下是发送数据的代码示例:

c 复制代码
void send_data_to_server(float voltage, float current, float power) {
    char command[256];
    
    // 连接到服务器
    sprintf(command, "AT+CIPSTART=\"TCP\",\"192.168.1.100\",5000\r\n");  // 替换为后端服务器IP和端口
    esp8266_send_command(command);
    
    // 发送数据
    sprintf(command, "AT+CIPSEND\r\n");
    esp8266_send_command(command);
    
    // 构建JSON格式数据
    sprintf(command, "{\"voltage\": %.2f, \"current\": %.2f, \"power\": %.2f}\r\n", voltage, current, power);
    esp8266_send_command(command);
}

3.3 AT指令详解

以下是使用的AT指令的详细说明:

  • AT:测试模块是否响应。返回"OK"表示ESP8266正常工作。

  • AT+RST:重置ESP8266模块。这通常用于清除之前的设置。

  • AT+CWMODE=1:设置ESP8266为Station模式(STA),使其可以连接到Wi-Fi网络。

  • AT+CWJAP="SSID","PASSWORD":连接到指定的Wi-Fi网络。需要替换为实际的SSID和密码。

  • AT+CIPSTART:建立与指定IP和端口的TCP连接。

  • AT+CIPSEND:准备发送数据。发送此命令后,模块会等待数据输入。

  • 数据内容:发送JSON格式的数据,包含电压、电流和功率信息。

4. OLED显示模块

OLED显示模块用于实时显示电压、电流和功率信息。以下是显示函数的示例:

c 复制代码
void oled_display(float voltage, float current, float power) {
    // 清屏
    oled_clear();
    
    // 显示电压
    oled_print("Voltage: %.2f V", voltage);
    // 显示电流
    oled_print("Current: %.2f A", current);
    // 显示功率
    oled_print("Power: %.2f W", power);
}

5. 继电器控制

根据特定条件控制继电器的开关,以下是继电器控制的代码示例:

c 复制代码
void control_relay(uint8_t state) {
    if (state) {
        relay_on();  // 开启继电器
    } else {
        relay_off(); // 关闭继电器
    }
}

6. 时序图

以下是系统的大致时序图,显示各模块之间的交互关系:
STM32 Sensor ESP8266 Python 采集电流电压数据 返回数据 发送数据 数据传输 数据可视化 STM32 Sensor ESP8266 Python

7. Python后端示例

后端使用Flask框架接收数据并进行可视化展示。以下是一个简单的Python后端示例代码:

py 复制代码
from flask import Flask, request, jsonify
import matplotlib.pyplot as plt

app = Flask(__name__)

# 用于存储数据
data_store = []

@app.route('/data', methods=['POST'])
def receive_data():
    data = request.get_json()
    voltage = data['voltage']
    current = data['current']
    power = voltage * current  # 计算功率
    data_store.append({'voltage': voltage, 'current': current, 'power': power})
    print(f"Voltage: {voltage}, Current: {current}, Power: {power}")
    return jsonify({'status': 'success'})

@app.route('/visualize', methods=['GET'])
def visualize():
    # 数据可视化逻辑
    voltages = [data['voltage'] for data in data_store]
    currents = [data['current'] for data in data_store]
    
    plt.plot(voltages, label='Voltage (V)')
    plt.plot(currents, label='Current (A)')
    plt.xlabel('Time (s)')
    plt.ylabel('Value')
    plt.title('Voltage and Current Over Time')
    plt.legend()
    plt.show()
    return "Visualization complete!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

五、项目总结

本项目成功实现了一个基于STM32的智能电表,具备实时监测、数据传输与可视化的功能。通过AT指令与Python后端进行通信,确保了数据的实时性和有效性。具体总结如下:

  • 实时监测:项目能够实时采集电压和电流数据,并计算功率。

  • 数据传输:利用ESP8266模块通过AT指令将数据发送至Python后端,具备良好的扩展性。

  • 可视化展示:后端通过Flask框架实现数据接收和处理,能够方便地进行数据可视化。

  • 控制功能:继电器模块可以根据需求实现对电器的控制,提升了智能家居的实用性。

未来的工作可以集中在优化数据处理算法、扩展更多功能(如故障报警、历史数据记录)以及提升用户界面的友好性等方面。

相关推荐
你好,我叫C小白3 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
TDengine (老段)5 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)5 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
朱嘉鼎5 小时前
状态机的介绍
c语言·单片机
清风6666666 小时前
基于单片机的噪声波形检测与分贝测量仪设计
单片机·嵌入式硬件·毕业设计·课程设计
Neverfadeaway6 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
一碗绿豆汤6 小时前
c语言-流程控制语句
c语言
易享电子6 小时前
基于单片机车窗环境监测控制系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
子牙老师6 小时前
从零手写gdb调试器
c语言·linux内核·gdb·调试器
三佛科技-134163842127 小时前
LED氛围灯方案开发MCU控制芯片
单片机·嵌入式硬件·智能家居·pcb工艺