编辑器版本 ×
标准版

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

专业版 【毕设】基于阿里云IOT平台的智慧工厂设计-智能插排子项目

简介:基于阿里云IOT平台的智慧工厂设计,包括智能插排,智能主机,从机小板,下载器等。共同完成

开源协议: GPL 3.0

发布时间: 2022-09-23 09:04:08
  • 2.8k
  • 32
  • 39
描述
## 项目要求 基于阿里云阿里云,实现从网页或者手机端或者是室内主机,控制工厂内的各种设备,包括不限于将室内的温湿度烟雾浓度上报到网页,同时获取室内用电器的电压电流功率等信息。需要注意的是,主机只有一个,从机可以多个,而且可以分布在几十米内的各种地方。 本工程讲解的是智能插排的设计,用于实现向网页端上报用电器的电压电流等信息,可以用在电动机上,进而实现上传电动机的电压电流功率等信息。 控制网页:zhgc.hdxy.xyz 插排界面在这 ![image.png](//image.lceda.cn/pullimage/ETeJtECK7sbYWX2fwMlkfVgOeJqieSweQpH8gHX0.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](//image.lceda.cn/pullimage/CDhmEVOnBVBbEnWBPm3SJvMr5tl2PnDIZ3AmxHWF.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](//image.lceda.cn/pullimage/w6rmW5OHHBbV0SgQYxpK65p124UruWMoePZepZQ9.png)


电量计算: PF寄存器输出脉冲,当PF寄存器发生溢出将取反Data Updata REG的第7位,PF寄存器内数据清零,脉冲信号数量为: ![image.png](//image.lceda.cn/pullimage/S1dhHU2FKsKbRqdNoGIftKITp5L2tVgcC8r7AekN.png)

K为数据更新寄存器取反次数,n是当前数据寄存器的数值,因此一度电所对应脉冲数量为: ![image.png](//image.lceda.cn/pullimage/ge7Xxtk4v4szkgPtpFegMVO5h2efFVFv8tfN2NnQ.png)

当PFcnt的个数为1度电的脉冲数量时,则表示已经累计统计一度电,则当前电量为: ![image.png](//image.lceda.cn/pullimage/Uf5pOuvJZ9L34SmimMlY2TaO6EKLgEjfnBraHMtI.png) 本项目使用互感器,需要进行校准,校准使用标准已知负载即可,下图在代码块“***重要的串口解析,软串口接收数据校验后,进行计算,2.96与2.70是反向计算得到的***”里会用到 ![image.png](//image.lceda.cn/pullimage/pKZh9qmc7LMikkat0mcMRr7wAqWzowMcmghhPxOI.png) 提示:总体设计方案框图





数据流 ![image.png](//image.lceda.cn/pullimage/Xre9KSLdIZJU1bgRnCDNDX6PPMs5atY8m7fXZM1U.png) ## 原理图设计说明 提示:说明作品中模块的设计原理图,需要配上原理图,最好是有实物图一起,每个模块都需要说明,如不需要设计的,请说明获取来源。






电流互感器: ![image.png](//image.lceda.cn/pullimage/ubs2wXSrrBDAbW1rtboVM4gkISbvY1KqCcE82W17.png) 可以看到CN1输入的交流电,直接通过互感器输出,电线粗一点。电压互感器(黑色) ![image.png](//image.lceda.cn/pullimage/5OCGwRtWTRLEyDdRF7gcV6In9MvOKJ5pFUskcrpi.png) ![image.png](//image.lceda.cn/pullimage/kbxUpLlyryUyZtkq1Ut4NR5VGD8tPRHKylw2xqoq.png) 测量芯片,测量芯片的外围电路,PCB上都在一块放置。 ![image.png](//image.lceda.cn/pullimage/e1T5stfXt6TLhYjEafhQn8MJ7mMVl5PqHjrYcpRt.png)
![image.png](//image.lceda.cn/pullimage/ERHZkWG2HoR4lI8Uz0TUSWCiKp40c6d7Jx3xmFIa.png) 插排开关控制,使用了槽型光耦隔离,驱动mos从而控制继电器,D1二极管,为了保护mos,继电器断开真的会产生反向电动势。 下面是原理图pcb实物三件套展示 ![image.png](//image.lceda.cn/pullimage/wOQQPPkXZH0yROg8btAReu5iXEa5CkED9taxl3mB.png) ![image.png](//image.lceda.cn/pullimage/BlpD8OJjDFMV9908L5COdH6A9fm7BCtyzt7z0UDj.png) ![image.png](//image.lceda.cn/pullimage/NsdiYex7D9tKLhVLlWdm2FDk8aYQ95Caj61KrQSX.png) ## PCB设计说明 提示:这里写PCB的一些设计说明,如:PCB的布局、布线、线宽、间距等设计注意事项






PCB交流电走线要求粗一点,电流大小可以参考下表: ![image.png](//image.lceda.cn/pullimage/t5BErNaHUxxVnDFGU7xJ8cVMjyaBYEtFV6q37D8N.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](//image.lceda.cn/pullimage/ZxPYENIaDpT9qANzpWWyXfpomiDoLGrKwwGgeuIz.png)






这个是画的外壳,就是可能有小伙伴不知道开槽和基准线啥关系,可以这样想,基准线就是模型的最下面的那根线,开的槽会绕轴旋转90度。 ![image.png](//image.lceda.cn/pullimage/ygHGl5supyVatEqDqsQFGLbGybr5hwRioBBwobZL.png) ![image.png](//image.lceda.cn/pullimage/kRqHGM6TAYZf6q9DWYK9r5fbBmPRmsfpaLq0GqNg.png) ![image.png](//image.lceda.cn/pullimage/JTmrBffn5Q67uVayCVDfrjxLKSKUDUjmIb356G23.png)

![image.png](//image.lceda.cn/pullimage/iXADsl2DOwO4uLa7tNAJO5U4BNwXzU5OYKvJxFf5.png)

![image.png](//image.lceda.cn/pullimage/5X13xJuTMt5P6elXUOE0Q8nvY5SB5XTMAXuZ5TA9.png)

面板就是导出顶层丝印DXF文件,找好大小,屏幕画错了,呜呜呜

![image.png](//image.lceda.cn/pullimage/VCuZdovvJNkLsj5NkyfsKTvd6kORaiQ3MJ27ufPg.png)

## 注意事项 提示:这里说明作品在制作中需要注意的一些注意事项(没有可以不写)

本工程是毕业设计的一个子项目节点,黄框里面的。






网址: zhgc.hdxy.xyz [毕业设计展示网页](zhgc.hdxy.xyz)

![image.png](//image.lceda.cn/pullimage/UpM0KQgYUgaHILo7ZiwcreuEEvFwauNgEeLMVajd.png)

交流电危险!给大家看看我设计屏幕时候的思路

![image.png](//image.lceda.cn/pullimage/xp6u5SAO8RG6P62JP5AhmwlwkEEKu5rifwpoEWzb.png)

## 演示视频 视频链接同步到B站 [https://www.bilibili.com/video/BV18T4y1i7D5/](https://www.bilibili.com/video/BV18T4y1i7D5/) 附件也可以下载视频 ## 其它附件上传 考虑许久本着开源的精神,分享源代码给大家,烧录就可以使用。



设计图
原理图
1 /
PCB
1 /
暂无
工程成员
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

  • 开源平台公众号