
【训练营_进阶班】互联网智能插座
简介
基于STM32F103C8T6+ESP8266构建的智能插座系统。语雀链接 https://www.yuque.com/wuyuchen-69cjr/zp1e0u/bbtl9p
简介:基于STM32F103C8T6+ESP8266构建的智能插座系统。语雀链接 https://www.yuque.com/wuyuchen-69cjr/zp1e0u/bbtl9p开源协议
:GPL 3.0
描述
一、项目简介
本项目基于stm32和esp8266,实现了手机APP控制插座、手机APP查看数据(温湿度、插座通断),板载OLED查看数据等功能。
stm32使用HAL库,esp8266使用RTOS3.0 SDK,它们之间使用串口通信进行数据交互。本项目为更复杂的物联网应用提供设计原型,更深层次的开发只需在该解决方案上增加外设即可。
如果只是实现一个插座的功能,可以直接使用ESP8266来完成,但是当ESP8266的引脚数量不够多,需要使用stm32来扩展功能的时候,本项目可以提供一套解决方案,完成了STM32与ESP8266相互通讯的软硬件设计。
二、硬件原理图设计(详细见原理图)
1、MCU选型
选择STM32F103C8T6,作为设计原型,选择一颗具有代表性的芯片即可。如果该芯片功能不够无法满足后续开发,可以替换为STM32F103VC、STM32F407ZE等芯片。(PS:主要是因为便宜+简单+熟悉)
2、WIFI芯片选型
选择ESP8266芯片,使用安信可推出的ESP-12F模组。个人感觉这颗芯片的知名度较高,网上资源比较多,学习成本较低。而EMW3080,网络上资料较少。在B站上分别搜索这两颗芯片,一目了然,一个是满屏的教程,一个是3080显卡。在csdn上也差不多。
3、STM32最小系统电路设计
1、BOOT电路:两个BOOT都下拉,程序从flash区域启动
2、下载电路:使用SWD下载程序,接口使用X9821WRS-04-9TSN,防呆,比用杜邦线插拔舒服,此处仅个人习惯,可改为2.54mm排针
3、晶振电路:8MHz,个人喜欢5032 两脚封装的晶振,比49S看起来舒服,就是贵一点
4、复位电路
5、电源指示灯
6、电源:使用SPX3819-3.3,LDO,用来给主控芯片供电较为合适
7、滤波:四个100nF的滤波电容
4、LED指示灯
一个电源指示灯、三个自定义LED
5、按键
两个按键,用来恢复出厂设置、控制OLED显示等
6、OLED
本次设计中没有给stm32加上USB电路,也没有预留串口引脚,无法串口输出信息,所以加上OLED可以方便调试,当然最主要的还是用户可以看到数据。
7、DHT11
采集温湿度可以说是插座的一个扩展功能,DHT11可以说是非常常见而且便宜的温湿度传感器了,所以用它。
8、ESP8266最小系统设计
1、ESP_EN、GPIO0、GPIO2上拉
2、GPIO15下拉
3、复位电路
4、CH340串口一键下载电路
9、ESP8266与STM32通信电路设计
ESP8266只有一个半UART,其中UART1用来输出日志,UART0用来下载程序,但是要实现与STM32串口通信需要做一些更改。将ESP8266的UART0的TX和RX映射到U0RTS(MTDO/GPIO15)和U0CTS (MTCK/GPIO13)。交换引脚之后,我们依旧可以使用之前的TXD0和RXD0来下载程序,但是和stm32通信则使用GPIO13和GPIO15。这样可以保证在不改变硬件连接的情况下,同时下载程序以及与STM32通信。
三、硬件Layout设计
1、USB走差分线

2、对晶振进行包地处理,内部不覆铜

3、220V区域不铺铜,采用2mm线宽

四、STM32软件设计
1、开发环境
MDK ARM 5.28
STM32CubesMX 6.0.1
2、SDK版本
STM32Cube MCU Package for STM32F1 Series 1.8.0
Keil.STM32F1xx_DFP.2.3.0.pack
3、使用freeRTOS,创建“SWTask”和“UARTTask”进行任务调度
3、创建结构体,使用UART DMA同步STM32和ESP8266的数据,不定长接收,判断帧头sof1、sof2接收数据
typedef struct
{
uint8_t sof1;
uint8_t sof2;
uint16_t temperature;
uint16_t humidity;
_Bool relay;
_Bool linkkit_started;
_Bool factory_restore;
} Model_Info_t;
4、OLED驱动程序,使用软件模拟IIC通信,显示数据
5、“SWTask”实现按键扫描,检测SW1,SW2长按或短按,并执行相应操作。
6、“UARTTask”实现发送数据,接收数据由DMA回调完成
五、ESP8266软件设计
1、开发环境
Visual Studio Code 1.47.3
gcc version 5.2.0 (crosstool-NG crosstool-ng-1.22.0-92-g8facf4c0)
2、SDK版本
ESP8266_RTOS_SDK 3.2
3、使用esp-aliyun框架
4、将日志输出和串口改为TX1
5、交换UART0的引脚,实现与STM32通信
6、采集DHT11数据
7、使用硬件定时器控制定时任务
六、机械设计
1、OLED支架。
我使用的OLED是0.96寸 IIC OLED,尺寸为25mm*26mm。考虑到OLED模块底部有元器件,所以特意在中间镂空1mm,使得元器件嵌入凹槽中。装配使用了M2*5mm的自攻螺丝。



2、外壳,这个版本由于同时使用了stm32、esp8266、oled、dht11等器件,板子的整体面积较大,所以并不想设计外壳。后续会设计一版去除dht11、stm32,只留esp8266以及继电器部分,使体积尽可能小再设计外壳。
七、公有APP

八、功能实现
1、实现公有APP一键配网,查看温湿度数据,控制插座
2、天猫精灵语音控制插座,“打开插座”、“关闭插座”
3、长按SW1,重置ESP8266,进入配网模式,指示灯闪烁,配网后,指示灯常亮
4、OLED显示温湿度数据、网络连接数据等
九、设计问题及改进
V2.0
1、修改了上一版本中的问题
2、黑色阻焊
V1.0
1、ESP8266电路中使用了GPIO9来读取DHT11的温湿度数据,如下图所示,设计的初衷是该引脚距离DHT11的摆放位置比较近,但是实测却发现使用这个引脚,板子就会重启,后经查找资料发现,ESP8266的GPIO9和GPIO10用于读写FLASH,使用了会造成读取程序出错。所以下一版我将使用GPIO5来读取DHT11。这一版只能通过外接一个DHT11模块来实现功能,板载的已经不能用了。

错误图1
2、OLED的封装出现问题,我购买的0.96寸 IIC OLED的实际尺寸为25mm*26mm,但是封装上的尺寸大于该设计,导致布局布线很紧凑。下一版将会更新封装。

失误图2
3、设计继电器电路的时候,输入端信号布线设置了“CH1”网络,但是在单片机那端没有添加该网络。而DRC的时候,由于这个引脚已将连接了上拉电阻,所以并没有提示网络端口只有一个,以至于没有检查出错误。这提醒了我设计完成后应当从头到尾每个网络都检查一遍,出现这样的纰漏实属不该。这一版只能将LED4去掉,将它的引脚通过跳线连接到“CH1”网络上,来实现继电器的控制。

错误图3
4、ESP8266与STM32联调的时候,日志会重定向到TX1(GPIO2)输出,但是这一版设计没有将TX1引出。初衷是作为一个插座,不需要添加多余的组件,在实际使用中TX1引脚是不会使用到的。但是在联调的时候由于看不到ESP8266的日志,这对于调试程序极为不利。考虑到目前处于测试阶段,而且一个焊盘的位置在板子上也是绰绰有余的,所以在下一版将添加GPIO2焊盘用于调试程序。

改进图4
5、为了使得STM32与ESP8266响应够快,将STM32的串口发送周期设为100ms,发送数据导致ESP8266的串口接收任务堆栈溢出,导致出错,故将其重新设置为1s周期。
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










