0 前言
🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 STM32的智能电表系统(源码+硬件+论文)
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:4分
🧿 项目分享:文章来源:https://www.toymoban.com/news/detail-783900.html
https://gitee.com/sinonfin/sharing文章来源地址https://www.toymoban.com/news/detail-783900.html
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
到了这里,关于毕业设计 STM32的智能电表系统(源码+硬件+论文)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!