毕业设计 STM32的智能电表系统(源码+硬件+论文)


0 前言

🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 毕业设计 STM32的智能电表系统(源码+硬件+论文)

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 项目分享:

https://gitee.com/sinonfin/sharing

在这里插入图片描述

1 主要功能

本设计由STM32单片机核心板电路+交流电压电流检测模块电路+WIFI模块电路+指示灯电路组成。

  • 1、通过电压互感器和电流互感器别检测交流电压和交流电流值,

  • 2、手机APP和WiFi模块互联后,可以实时显示交流电压、交流电流、功率和电量实时显示在手机上。

  • 3、当功率超过200W时,继电器自动断开。功率不超过200W时,可以手动控制继电器的开关。

  • 4、手机和WiFi模块连接后,手机上显示计时时间。

本系统具体框图如下图所示:

在这里插入图片描述

2 硬件设计(原理图)

在这里插入图片描述

3 核心软件设计

在这里插入图片描述

篇幅有限,不过多复述详细设计细节

关键代码

key_table table[30]=
{
    {0,0,0,1,(*fun0)}, //第0层,显示主界面

    {1,4,2,5,(*fun1)}, //第一层,显示【亮度设置】、快充、数据记录、返回
    {2,1,3,6,(*fun2)}, //第一层,显示亮度设置、【快充】、数据记录、返回
    {3,2,4,9,(*fun3)}, //第一层,显示亮度设置、快充、【数据记录】、返回
    {4,3,1,0,(*fun4)}, //第一层,显示亮度设置、快充、数据记录、【返回】

    {5,5,5,1,(*fun5)}, //第二层,亮度设置

    {6,8,7,10,(*fun6)},//第二层,快充层下显示【QC 2.0】、QC3.0、返回
    {7,6,8,11,(*fun7)}, //第二层,快充层下显示QC 2.0、【QC3.0】、返回
    {8,7,6,2,(*fun8)},  //第二层,快充层下显示QC 2.0 、QC3.0、【返回】

    {9,9,9,3,(*fun9)}, //第二层,数据记录

    {10,10,10,6,(*fun10)},   //第三层,快充QC 2.0
    {11,11,11,7,(*fun11)},//第三层,快充QC 3.0

主函数循环

 while (1)
  {
      OLED_Refresh();//刷新显存
      if(time_1s_ok)
      {
          time_1s_ok=0;
          voltage     = INA220_GetVoltage();
          current     = INA220_GetCurrent();
          power       = INA220_GetPower();
          energy_temp = energy_temp + power*0.00027777;
          energy      = energy_temp;

          if(power!=0&&mem_addr_base<0xE00)
          {
              HAL_I2C_Mem_Write(&hi2c1,0xA0,mem_addr_base,I2C_MEMADD_SIZE_16BIT,(u8*)ina220_data,4,100);
              mem_addr_base=mem_addr_base+4;
          }
      }
      /*******************find index****************************/
      if((key_enter==1)||(key_up==1)||(key_down==1))
      {
          if(key_up==1)
          {
              func_index=table[func_index].up;    //up
              key_up=0;
          }
          if(key_down==1)
          {
              func_index=table[func_index].down;    //down
              key_down=0;
          }
          if(key_enter==1)
          {
              OLED_Clear();
              func_index=table[func_index].enter;    //enter
              key_enter=0;
          }

      }
      if(key_back==1)
      {
          key_back=0;
          if(oled_on==1)
              oled_on=0;
          else
              oled_on=1;
      }
      current_operation_index=table[func_index].current_operation;
      (*current_operation_index)();//执行当前操作函数
      HAL_Delay(10);
  }
}

OLED屏使用硬件I2C驱动,直接调用HAL库中的HAL_I2C_Mem_Write()即可实现大量显存的连续写入。 该函数原本是用于读写eeprom的,但其它需要写入两个地址的应用同样可以使用。

//刷新显存
void OLED_Refresh(void)
{
    u8 i;
    for(i=0;i<8;i++)
    {
    OLED_WR_Byte(0xb0+i,OLED_CMD); //设置行起始地址
    OLED_WR_Byte(0x00,OLED_CMD);   //设置低列起始地址
    OLED_WR_Byte(0x10,OLED_CMD);   //设置高列起始地址
    HAL_I2C_Mem_Write(&hi2c2,OLED_ADDRESS,0x40,I2C_MEMADD_SIZE_8BIT,&OLED_GRAM[i][0],128,100);
    //写入显存
    }
}

INA220的读写由于也要写入两个地址,所以同样可以直接使用HAL_I2C_Mem_R/W()函数读写,这样就不用另外花时间去实现。 但由于INA220中的寄存器是16位的,该函数只能读写u8,所以要手动把两个u8合成一个u16。

//INA220初始化
void INA220_Init(void)
{
u8 CFG[2] = {0x27,0xff}; //配置寄存器0x21D7
u8 CAL[2] = {0x20,0x00}; //校准寄存器0x5000,1ma/bit

HAL_I2C_Mem_Write(&hi2c1,INA220_ADDR,CFG_REG,I2C_MEMADD_SIZE_8BIT,&CFG[0],2,100);//设置配置寄存器
HAL_I2C_Mem_Write(&hi2c1,INA220_ADDR,CAL_REG,I2C_MEMADD_SIZE_8BIT,&CAL[0],2,100);//设置校准寄存器
}

4 实现效果

在这里插入图片描述

5 最后

包含内容

在这里插入图片描述

🧿 项目分享:

https://gitee.com/sinonfin/sharing

  • 0
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
虚拟表V2.5.2是根据DL/T645-1997规约、DL/T645-2007规约、上海规约和BNC智能终端规约设计的虚拟电表软件。 本软件主要的操作说明如下: 1.下拉菜单的电表参数包括: 功能类:中继测试,侦听测试,白名单测试,黑名单测试,区间表单测试,不识别表号 ○1中继测试只针对TCT监控模块虚拟表模式; ○2侦听测试可针对监控645的TCT模块,监控载波的TCT模块或者监控串口数据的交互,对接收的数据进行解析(如果是监控载波鼎信报文,选择单/三相显示,可完成侦听记录/侦听报文的显示在“按相位分屏”和“不分屏”之间切换); ○3白名单为选中的表号有效; ○4黑名单为选中的表号无效; ○5区间表单为接收到所填黑名单区间内的表号无效; ○6不识别表号为对任意表号命令均有效。 命令类:设置底度----设置电量的底度。 使能类:前导符FE,编程开关,支持跨相,通道芯片,长帧测试,自设回复,循环回复。 ○1前导符FE----选中响应帧有4个0xFE作为前导符; ○2编程开关----选中才能写设备地址地址有效; ○3支持跨相----只有中继测试时有效,选中则不进行相位比较,返回的相位信息为自身所处相位(目前表所处相位是根据表号决定,表号除以3,余数为0,相位为C相;相余数为1,相位为A相;余数为2,相位为B相); ○4通道芯片----中继测试时无效,不选中时响应的报文带1字节的相位信息; ○5长帧测试----自定义长帧测试的数据标识。 设置长帧命令表示当接到这条命令,将数据标识后的数据内容存储起来,最大255个字节,响应报文的数据域只有数据标识; 读取长帧命令表示当接到这条命令,按数据标识后设置的长度(1字节,小于之前发送的存储数据长度)回复之前存储的数据内容。 ○6自设回复----自定义响应报文的内容 选中自设回复后,任何命令都将按自定义的报文进行响应。 控制码:1个字节 数据域:使用者自定义数据域内容,可自由选择是否加0x33或数据域翻转处理,最大255个字节。 后续字节:使用者自定义在645响应帧后添加的内容。 ○6循环回复----按规律循环回复特定报文,使用者可自定义起始字节数和终止字节数,范围为0~255。 注意:自设回复和循环回复使能二选一,不能同时有效。 表类型:新载波表,采集器,开箱监视器,旧载波表 2.事件上报功能 注意:使用者自行定义四个输入框内容 命令框:读事件上报的命令 响应框:上报的事件 取消框:取消事件上报状态的命令 结束框:回复事件上报状态已取消 I/O配置:选择为硬件设置,只需点击“事件使能”就置上事件上报状态;不选择为软件设置,点击“事件使能”后接受到特定报文才置上事件上报状态。 3.快捷键 ALT+S:在1200 / 2400 / 4800 / 9600bps之间快速切换串口波特率。 ALT+A:快速切换是否循环回复。 4.可变速率 选中时此表为可变速率表,支持从1200,2400,4800,9600自动向上变速,变速条件为正确应答使用者规定的次数。 5.命令选择 使用者可自定义哪些命令响应,哪些命令不响应,其中选中的命令会响应。 注意:现在只针对DL/T645-1997的两条读表号命令。 6.提示说明 在软件开启时,在操作记录中将对主要的几个菜单选项进行提示,帮助使用者更好地确定软件应用时的条件。 7.645显示 只处理DL/T645协议报文。 8.延时选择 只在645显示被选择时使能。 (1)响应延迟 收到命令帧后响应延迟,范围为0-5000ms。 (2)字节延迟 字节之间停顿时间, 范围为0-5000ms。 (3)首字节后延迟 首字节响应后停顿时间, 范围为0-500ms。 只在首字节响应后,虚拟表会延迟延时响应后续字节。 如果选择随机,虚拟表将在0至所选时间内随机一个时间后对命令进行各种延迟。 9.鼎信显示 只在侦听测试模式下显示鼎信协议报文,解析报文。 10.鼎信不解析 只在侦听测试模式下显示鼎信协议报文,不解析报文。 11.自定义数据 按测试要求填写一些645数据项内容。 12.组命令帧 弹出命令发送组帧窗口,这是模拟通道芯片下的设备作为主动发起方,命令帧格式必须符合645规约格式。 需要通信的表号会列于列表中,使用者可以直接用txt文档导入表号,或者一个个输入编辑,双击表号改变表号的选择状态,或者使用右键全部选择/全部取消。 控制码:1个字节 数据域内容: (1)645数据标识 97为2个字节,07为4个字节,填写的内容无需加0x33和翻转处理。 (2)645数据帧格式 完整的645帧,需要表号,控制码和数据内容三个部分。 (3)自定义数据格式 数据域内容由使用者自定义

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值