## 项目要求
基于阿里云阿里云,实现从网页或者手机端或者是室内主机,控制工厂内的各种设备,包括不限于将室内的温湿度烟雾浓度上报到网页,同时获取室内用电器的电压电流功率等信息。需要注意的是,主机只有一个,从机可以多个,而且可以分布在几十米内的各种地方。
本工程讲解的是智能插排的设计,用于实现向网页端上报用电器的电压电流等信息,可以用在电动机上,进而实现上传电动机的电压电流功率等信息。
控制网页:zhgc.hdxy.xyz
插排界面在这
![image.png]
## 题目分析
针对智能插排,选择了立创商城的HLW8032芯片,该芯片为国产,而且外围元器件少,同时数据手册十分详细。便于进行开发。
数据解析为了和蓝牙模块不产生冲突,使用Arduino的软串口功能,速度为4800mps,经测试十分稳定。
插排从大三开始绘制,已经改进到第四版,前三版为阻容降压,分压分流测电压电流,导致精度低,后采用互感器方案,使灵敏度和精度发生了质的飞跃。
程序,这咋字体自动变成黑色的了。。好吧,那这里当作分界线了!~~~~
关于程序,屏幕显示使用SSD1306库文件,屏幕事先画好,再去写。
数据解析是通过软串口进行解析,保存到数组里,完成数据校验再去解析数据
关于显示屏幕:使用I2C0.96寸OLED屏幕,需要注意的是改屏幕和SPI的0.96寸屏幕,尺寸有一点不一样!这直接导致我画的外壳尺寸直接,巨丑!
关于外壳:使用立创EDA专业版,我靠,十分好画,基本1个小时就做出来外壳了,非常棒!!!
关于面板:面板是在立创商城打烊,根据3D外壳进行绘制,耗时30分钟,后期客服微信跟进十分细心负责。
设计流程:
## 1.1 芯片选型
HLW8032 是一款高精度的电能计量 IC,它采用 CMOS 制造工艺,主要用于单相应用。它能够测量线电压和电流,并能计算有功功率,视在功率和功率因素。该芯片使用UART通讯方式,免去校正,程序更加容易编写,且官方给了参考的非隔离采样电路。该芯片可测量有用功功率、电压、电流等。其测量误差稳定在0.5%以内,各项指标满足设计要求。
主控芯片采用Arduino,该芯片程序易编写,有软串口头文件,主频最大20MHZ,具有I2C,SPI,UART/USART接口,32KB
程序存储器,输入电压1.8-5.5V,23个IO口。
串口芯片依旧采用CH340C,该芯片不用外接晶振,同时当供电电压为5V时,V3引脚要外接退耦电容,供电为3.3V时候,V3连接3.3V。
隔离芯片使用ORPC-817D光耦,该芯片响应时间4微秒,输入电流50毫安,用于隔离信号。
| ![image.png]
|
| --- |
| 图 6‑1 |
串口复用使用RS2228XN芯片,如图 6‑1
该芯片为
模拟开关,工作电压为0-6V,带宽550MHZ开启最快时间为20纳秒,关闭最短时间为15纳秒,符合要求。蓝牙工作会占用串口,此时下载程序会报错。使用该模拟开关芯片,可以在蓝牙模块工作时,断开蓝牙数据流,将计算机下载数据接通,从而完成下载。将模拟开关控制端将其连接到CH340的DLS引脚,该引脚在有下载信号时会被拉低,下载完成会被拉高,从而可以控制开关切换。将模拟开关OE使能端拉低,使其进入工作状态,当S接入高电平时,HSD1接通,S接入低电平时HSD2接通。
## 电路设计
插排电流分为功率测量模组、降压模组、主控芯片、插排电源控制电路、模拟开关与2.4G
### 功率测量模组
HLW8032采用UART通信,速率为4800bps,时间间隔为50MS,其数据格式如图所示:
![image.png]
电量计算:
PF寄存器输出脉冲,当PF寄存器发生溢出将取反Data Updata REG的第7位,PF寄存器内数据清零,脉冲信号数量为:
![image.png]
K为数据更新寄存器取反次数,n是当前
数据寄存器的数值,因此一度电所对应脉冲数量为:
![image.png]
当PFcnt的个数为1度电的脉冲数量时,则表示已经累计统计一度电,则当前电量为:
![image.png]
本项目使用互感器,需要进行校准,校准使用标准已知负载即可,下图在代码块“***重要的串口解析,软串口接收数据校验后,进行计算,2.96与2.70是反向计算得到的***”里会用到
![image.png]
提示:总体设计方案框图
数据流
![image.png]
## 原理图设计说明
提示:说明作品中模块的设计原理图,需要配上原理图,最好是有实物图一起,每个模块都需要说明,如不需要设计的,请说明获取来源。
电流互感器:
![image.png]
可以看到CN1输入的交流电,直接通过互感器输出,电线粗一点。
电压互感器(黑色)
![image.png]
![image.png]
测量芯片,测量芯片的外围电路,PCB上都在一块放置。
![image.png]
![image.png]
插排开关控制,使用了槽型光耦隔离,驱动mos从而
控制继电器,D1二极管,为了保护mos,继电器断开真的会产生反向电动势。
下面是原理图pcb实物三件套展示
![image.png]
![image.png]
![image.png]
## PCB设计说明
提示:这里写PCB的一些设计说明,如:PCB的布局、布线、线宽、间距等设计注意事项
PCB交流电走线要求粗一点,电流大小可以参考下表:
![image.png]
交流电最好开槽,实际上不开槽对整个电路没有显著影响,测试可以正常使用。
## 软件说明
提示:软件可以使用代码块来进行嵌套放置,无需全部软件部分说明,只需说明重要部分即可
```
代码块:
引入一些头文件,并且声明一些变量
#include
#include
#include
#include
Adafruit_SSD1306 display(128, 64, &Wire, 10);
#define ENCODER_A_PIN 3
#define ENCODER_B_PIN 5
#define SWITCH_PIN 9
#include
//实例化软串口
SoftwareSerial mySerial(2, 10); // RX, TX
#include
#include
long int RXcode[22];
long Voltage_parameter_reg = 0; //电压参数寄存器
long Voltage_reg = 0; //电压寄存器
long Current_parameter_reg = 0; //电流参数寄存器
long Current_reg = 0; //电流寄存器
long Power_parameter_reg = 0; //功率参数寄存器
long Power_reg = 0; //功率寄存器
long Data_update_register = 0; //数据更新寄存器
long Pf_pulse_data = 0; //PF脉冲数据
int check = 0;
int sw = 0;
float Voltage = 60.0;
float Current = 60.0;
float Power = 60.0;
float KWH = 60.0;
unsigned char keyValue = 0;
因为使用EC11所以定义按键的结构体
typedef struct
{
unsigned char index;
unsigned char up;
unsigned char down;
unsigned char right;
void (*operation)(void);
} KEY_TABLE;
*定义菜单结构
unsigned char funIndex = 0;
void (*current)(void);
void menu00();
void menu11();
void menu12();
void menu13();
void menu21();
void menu22();
void menu23();
void menu31();
void menu32();
void menu33();
void URAT();
void SWPOW();
定义跳转逻辑关系
//定义按键操作数据
KEY_TABLE table[10] =
{
{0, 1, 1, 1, (*menu00)},
{1, 3, 2, 4, (*menu11)},
{2, 1, 3, 5, (*menu12)},
{3, 2, 1, 6, (*menu13)},
{4, 4, 4, 1, (*menu21)},
{5, 9, 9, 7, (*menu22)},
{6, 6, 6, 3, (*menu23)},
{7, 8, 8, 5, (*menu31)},
{8, 7, 7, 2, (*menu32)},
{9, 5, 5, 2, (*menu33)},
};
编写其中一个菜单*
//一级菜单1
void menu11(void)//用电检测
{
display.clearDisplay();//清屏
display.setTextSize(2); //设置字体大小
display.setCursor(18, 1);//设置显示位置
display.println("-Menu11-");
display.drawBitmap(0, 20, jt, 16, 16, 1); //箭头
display.drawBitmap(28, 20, str11, 16, 16, 1); //用
display.drawBitmap(44, 20, str12, 16, 16, 1); //电
display.drawBitmap(70, 20, str13, 16, 16, 1); //检
display.drawBitmap(86, 20, str14, 16, 16, 1); //测
display.drawBitmap(28, 40, str21, 16, 16, 1); //开
display.drawBitmap(44, 40, str22, 16, 16, 1); //关
display.drawBitmap(70, 40, str23, 16, 16, 1); //控
display.drawBitmap(86, 40, str24, 16, 16, 1); //制
display.display(); // 开显示
}
重要的串口解析,软串口接收数据校验后,进行计算,2.96与2.70是反向计算得到的
if (mySerial.read() == (check & 0x000000FF)) //校验
{
Voltage = (float((RXcode[0] * 65536 + RXcode[1] * 256 + RXcode[2])) / float((RXcode[3] * 65536 + RXcode[4] * 256 + RXcode[5]))) * 2.96 ;
Current = (float((RXcode[6] * 65536 + RXcode[7] * 256 + RXcode[8])) / float((RXcode[9] * 65536 + RXcode[10] * 256 + RXcode[11]))) * 1.0;
Power = (float((RXcode[12] * 65536 + RXcode[13] * 256 + RXcode[14])) / float((RXcode[15] * 65536 + RXcode[16] * 256 + RXcode[17]))) * 2.70;
KWH = ((RXcode[19] * 256 + RXcode[20]) * ((RXcode[12] * 65536 + RXcode[13] * 256 + RXcode[14]) * 2.96 * 1.0)) / (3600 * 1000000000);
}
主循环
void setup()
{
pinMode(4, OUTPUT);
mySerial.begin(4800);
// Serial.begin(4800);
pinMode(ENCODER_A_PIN, INPUT);
pinMode(ENCODER_B_PIN, INPUT);
pinMode(SWITCH_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(3), ec11, FALLING);
// Serial.begin(9600);
// MsTimer2::set(500, screen);
// MsTimer2::start();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextColor(WHITE);//开像素点发光
display.clearDisplay();//清屏 vc
menu00();
// delay(5000);
}
void loop()
{
if (digitalRead(SWITCH_PIN) == 0)
{
delay(100);
if (digitalRead(SWITCH_PIN) == 0)
keyValue = 2;
}
if (keyValue != 0)
{
switch (keyValue)//获取按键对应序号
{
case 2: funIndex = table[funIndex].right; break;
case 3: funIndex = table[funIndex].down; break;
case 4: funIndex = table[funIndex].up; break;
}
current = table[funIndex].operation;//根据需要获取对应需要执行的函数
(*current)();//执行获取到的函数
}
keyValue = 0;
}
```
关于屏幕可以参考这篇博客[https://blog.csdn.net/TonyIOT/article/details/104013813](https://blog.csdn.net/TonyIOT/article/details/104013813)
关于软串口:[https://www.arduino.cn/forum.php?mod=viewthread&tid=47262&highlight=软串口](https://www.arduino.cn/forum.php?mod=viewthread&tid=47262&highlight=%E8%BD%AF%E4%B8%B2%E5%8F%A3)
关于HLW8032资料:[https://item.szlcsc.com/139306.html](https://item.szlcsc.com/139306.html)
关于自定义封装:[https://docs.lceda.cn/cn/PCBLib/PCBLib-Create/index.html](https://docs.lceda.cn/cn/PCBLib/PCBLib-Create/index.html)
## 实物展示说明
提示:作品的实物图片,图片可以加上说明。在这讲讲外壳面板吧![image.png]
这个是画的外壳,就是可能有小伙伴不知道开槽和基准线啥关系,可以这样想,基准线就是模型的最下面的那根线,开的槽会绕轴旋转90度。
![image.png]
![image.png]
![image.png]![image.png]![image.png]面板就是导出顶层丝印DXF文件,找好大小,屏幕画错了,呜呜呜![image.png]
## 注意事项
提示:这里说明作品在制作中需要注意的一些注意事项(没有可以不写)本工程是毕业设计的一个子项目节点,黄框里面的。
网址: zhgc.hdxy.xyz
[毕业设计展示网页](zhgc.hdxy.xyz)
![image.png]交流电危险!给大家看看我设计屏幕时候的思路![image.png]
## 演示视频
视频链接同步到B站
[https://www.bilibili.com/video/BV18T4y1i7D5/](https://www.bilibili.com/video/BV18T4y1i7D5/)
附件也可以下载视频
## 其它附件上传
考虑许久本着开源的精神,分享源代码给大家,烧录就可以使用。