基于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框架实现数据接收和处理,能够方便地进行数据可视化。

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

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

相关推荐
~yY…s<#>39 分钟前
5种IO模型
android·linux·服务器·c语言·c++
半个番茄43 分钟前
C语言: *p++
c语言
不能只会打代码1 小时前
32单片机从入门到精通之测试与验证——性能优化(十六)
单片机·嵌入式硬件·性能优化·32单片机
dw.z2 小时前
STC8H2K12U读取EEPROM错位
单片机
爬上树顶2 小时前
物联网:七天构建一个闭环的物联网DEMO-MQTT的配置
物联网
HUIBUR科技2 小时前
人工智能与物联网:智慧城市的未来
人工智能·物联网·智慧城市
还是车万大佬2 小时前
C语言二级考试
c语言·开发语言·笔记
云山工作室3 小时前
基于单片机的智能家居排气扇系统设计
stm32·单片机·嵌入式硬件·毕业设计·智能家居·毕设
国产化创客3 小时前
嵌入式系统Linux实时化(一)Linux实时化技术路径
物联网·嵌入式·实时操作系统·xenomai
北京天拓四方3 小时前
边缘计算网关在机床设备数据采集中的应用
物联网·其他