## 项目要求
基于阿里云阿里云,实现从网页或者手机端或者是室内主机,控制工厂内的各种设备,包括不限于将室内的温湿度烟雾浓度上报到网页,同时获取室内用电器的电压电流功率等信息。需要注意的是,主机只有一个,从机可以多个,而且可以分布在几十米内的各种地方。
本工程讲解的是智能插排的设计,用于实现向网页端上报用电器的电压电流等信息,可以用在电动机上,进而实现上传电动机的电压电流功率等信息。
控制网页: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/) 附件也可以下载视频 ## 其它附件上传 考虑许久本着开源的精神,分享源代码给大家,烧录就可以使用。
电量计算: 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/) 附件也可以下载视频 ## 其它附件上传 考虑许久本着开源的精神,分享源代码给大家,烧录就可以使用。
参考设计下载
相关器件
群聊设计,与管理员及时沟通
欢迎加入EEWorld参考设计群,也许能碰到搞同一个设计的小伙伴,群聊设计经验和难点。 入群方式:微信搜索“helloeeworld1”或者扫描二维码,备注:参考设计,即可被拉入群。 另外,如您在下载此设计遇到问题,也可以微信添加“helloeeword1”及时沟通。
网友评论
相关项目
- LF85CPT-TR 8.5V 极低压降稳压器的典型应用
- 用于负载瞬态响应的 LR8N3-G 高输入电压线性稳压器的典型应用
- AM3G-0503SZ 3.3V 3 瓦 DC/DC 转换器的典型应用
- 光立方灯控
- AM2F-0512SH52Z 12V 2 瓦 DC/DC 转换器的典型应用
- 使用 Richtek Technology Corporation 的 RT8097A 的参考设计
- 【训练营】【物联网实战】灯带世界+846932A
- si4844 机械调谐 数字显示全波段收音机
- MIC2548A-2YM 用于热插拔应用的可编程限流高边开关的典型应用
- 【航顺训练营】HK32F103CAN总线学习板+947086A
电路图
更多>
下载中心
更多>
大学堂
更多>
论坛推荐
更多>