石榴姐

[Complete Design] Smart factory design based on Alibaba Cloud IOT platform-smart plug-in sub-project

 
Overview
## 项目要求

基于阿里云阿里云,实现从网页或者手机端或者是室内主机,控制工厂内的各种设备,包括不限于将室内的温湿度烟雾浓度上报到网页,同时获取室内用电器的电压电流功率等信息。需要注意的是,主机只有一个,从机可以多个,而且可以分布在几十米内的各种地方。
本工程讲解的是智能插排的设计,用于实现向网页端上报用电器的电压电流等信息,可以用在电动机上,进而实现上传电动机的电压电流功率等信息。

控制网页: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]

## 注意事项

提示:这里说明作品在制作中需要注意的一些注意事项(没有可以不写)本工程是毕业设计的一个子项目节点,黄框里面的。
网址: zhgc.hdxy.xyz

[毕业设计展示网页](zhgc.hdxy.xyz)![image.png]

## 演示视频

视频链接同步到B站
[https://www.bilibili.com/video/BV18T4y1i7D5/](https://www.bilibili.com/video/BV18T4y1i7D5/)
附件也可以下载视频

## 其它附件上传

考虑许久本着开源的精神,分享源代码给大家,烧录就可以使用。
参考设计图片
×
 
 
Search Datasheet?

Supported by EEWorld Datasheet

Forum More
Update:2025-05-21 04:47:41

EEWorld
subscription
account

EEWorld
service
account

Automotive
development
community

Robot
development
community

About Us Customer Service Contact Information Datasheet Sitemap LatestNews


Room 1530, 15th Floor, Building B, No.18 Zhongguancun Street, Haidian District, Beijing, Postal Code: 100190 China Telephone: 008610 8235 0740

Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号