由于懒,不想每次还要下床手动开关灯,将家中闲置的台灯加入物联网模块,使其摇身一变,升级为智能遥控台灯。在原先用按钮控制的基础上,为其增加了如下功能:远程开关灯,定时开关灯,人来开灯人走关灯,声控,温湿度测量及显示等(部分功能可以在APP中配置打开或关闭)。此外,最近迷上了小米的一系列智能家居产品,种类齐全,生态完善,质量外观都还不错,最重要的是价格非常亲民适合我这种穷又爱体验的人。体验完智能家居后,看着家里笨笨的老设备心里痒痒,想换又觉得不划算,刚好借这次立创EDA暑期训练营发券培训的机会,进行DIY设计,为老设备赋能。
根据上述功能需求,将整个电路设计分成了七个模块,包括主控模块,WIFI模块,电源模块,继电器模块,外接接口模块,内存模块以及辅助模块。理清楚了整个电路系统结构后,依次对各个部分进行设计和器件选型。 首先,主控模块采用的是STM32F103C8T6,选用此芯片主要是考虑到程序开发方便、成本以及库存。入门起就基本上一直基于ST的MCU做开发,比较熟悉相关开发流程,自己也攒了一些典型外设驱动的例程。其实平常工作用的F4更多一些,但是F1足够就不额外增加成本了。最后自己这边还有一些C8T6存货。综上。 WIFI模块选用的是安信可基于乐鑫ESP8266EX芯片开发的ESP-12F(ESP8266MOD),原因在于对这个模块耳熟一点,嘉立创有库存能直接下单,方便。WIFI和MCU是通过UART2通信,设计的时候和采用了两个插针放在了TX和RX上,方便调试,调试好后用跳线帽连接上即可。设计了一个按键,用于复位WIFI模块。 电源模块中,接口使用的是常用的安卓micro USB。稳压模块设计是完全照抄零妖的方案。同样也有一个CH340E模块用于USB转TTL,连接的是UART1,方便调代码阶段打印调试信息找BUG。 继电器模块选型也是和零妖一样,不同的是数量,因为我的台灯上有四个机械按钮(开关,低亮度,中亮度,高亮度),为了适配,就放置了四路继电器。 外接接口模块用于连接其它功能模块,外接的模块有:温湿度传感器SHT30(小米同款,没拆过,看网上说的),0.96寸OLED显示屏,人体红外传感器模块,蓝牙模块,调试用ESP8266电源,SWD烧录接口。其中SHT30和OLED显示屏用的是同一个I2C接口,到时候做一根一拖二的线;红外传感器根据是否感应到人输出0/1信号,用的是GPIO外部中断功能;声控模块根据是否感应到声音输出0/1信号,也是用的外部中断功能。光敏电阻采用的是GL7537,通过ADC采样电压,来反映光敏电阻阻值进而反映当前环境亮度值。蓝牙模块接的是UART3(考虑到当WIFI功能调不出来时还有个保底的)。设计的时候考虑到没有将一些功能模块焊在板子上而是通过接口连线接出来,是因为到时候电路板上有强电,到时候会有放置在外壳中,而有些传感器必须要露出来。接口除了调试用的外都是采用的1.25mm接插件,比那种单根杜邦线连接靠谱一万倍。到时候模块通过接线与主板相连,模块则通过安装孔或者热熔胶固定在壳子上。 内存模块用于保存配置信息,重启后能够迅速进入配置好的功能状态。采用的是华邦的16MB FLASH芯片W25Q128,其实W25Q32就足够了,选择Q128主要也是手上有这颗料,程序也有现成的,方便。 辅助模块主要调试阶段用的LED灯,包括电源指示灯,程序运行状态指示灯,4个LED灯。其中这四个LED灯本来设计之初是想着用于显示四个继电器的状态,现在想想理论上正常工作时只会有4种状态,关灯/低亮度/中亮度/高亮度,只需要两个LED灯就可以对其状态进行显示,剩余2个根据调程序阶段遇到的实际情况用作备用(比如指示WIFI联网状态)。
软件设计主要包括单片机控制程序设计以及控制端(手机电脑等)界面设计。本工程所选用的云服务器为移动的onenet,设备与云通信协议采用的EDP协议。选用原因是我的wifi模块用的是ESP8266-12F,在网上搜了一圈找到了一份比较靠谱的关键词为 STM32 ESP8266 onenet的文章,因此选用onenet。(其实参与培训班之初我想的是实现一下更为普遍的MQTT协议,不过时间太紧,而且协议啥的只是一个工具,现阶段下先这样,后面再学吧) 单片机控制程序设计又包括硬件驱动设计以及应用代码设计。程序是在MDK上基于st库函数开发的,硬件驱动部分包括GPIO的配置(LED灯 继电器),外部中断(人体红外以及声传感器),ADC(光敏电阻),I2C(SHT30,OLED显示屏),UART(WIFI和串口)。这一部分为后面编写应用程序做准备。 应用代码设计则是根据功能需求,按预设的逻辑或者说系统运行思路,调用前面写好的驱动程序API接口将各个部分串起来,主要包括系统功能逻辑的实现以及WIFI模块连接云端。 手机界面设计则是根据onenet接入手册,一步一步搭建即可。主要是建立产品,创建设备,创建数据流,最后通过拖模块这种傻瓜式操作创建了一个控制终端界面,能够连接onenet继而与设备通信,实现控制指令的上发与数据的下发显示。 附件有上传整套源程序,附有readme。
首先是硬件。在嘉立创打的板子是空板(五元五块板24小时发货真香),主要是考虑到元器件不多,空板打板快以及方便调试。刚学画板子的时候老是蜜汁自信感觉焊上就马上都跑了,然而基本都是一堆问题而且还不好找问题。因此后面就养成一个习惯,将设计的板子按功能分成多个模块,逐个焊接逐个调试,ok后再下一部分。本工程将板子分成如下几个模块,调试顺序依次为:电源,MCU,WIFI,以及继电器,以及其它外接的传感器和模块部分。前一个是后一个的基础,即电源正常,其它模块才能工作,MCU作为系统大脑正常工作后剩余模块才能连接在一起发挥作用,WIFI和继电器作为本工程的核心部分在前面都ok的前提下先调试,而其它如声 光 温湿度 OLED等模块作为增量后面再调试。其次是软件调试,软件思路和硬件类似,根据系统运行逻辑以及难易程序,顺序依次为:底层驱动,设备云端通信以及上层应用,我一般写代码就是大致列个框架,然后到具体实现时,自己之前有做过相关就直接copy过来,没有就CSDN搜一圈找到合适的再copy过来。
问题1、焊好电源,MCU模块以及指示用LED等辅助电路后发现LED_RUN一直是亮着的。而我设计的是在程序正常运行时通过GPIO控制高低电平,进而控制LED_RUN 1s周期闪烁。
解决步骤:首先我想是不是MCU相应的脚没焊好和VCC短路了,通过电表测发现并没有短路,但是发现电压一直时2.5V左右。于是我怀疑是不是降压模块或者MCU硬件有问题,但是检查了LDO输出是正常的3.3V,排除了供电的问题。怀疑是MCU坏了,但是拆了重焊比较麻烦,想着刚好有串口以及还有别的LED灯。于是就通过串口打印调试字符,以及将其它LED灯都点亮,发现串口OK,但是其它4个LED灯有三个能亮一个不亮。 又更怀疑是MCU有些引脚是有问题了,正准备换MCU的时候,突然想到可以先看看不亮的那个LED灯是不是焊反了,结果果然是焊反了,又减轻了对MCU的怀疑,进而从软件着手去检查。最终发现因为我用的这个GPIO口PA15是比较特殊的JTAG口,要想当GPIO口使用要先复用一下,加上相应代码就好了。具体实现见前人CSDN文章(感谢) https://blog.csdn.net/qhw5279/article/details/72630637
问题2、继电器没反应,
解决步骤:一开始同样是怀疑硬件没焊好或者芯片有问题。重新焊了个继电器驱动芯片。测试还是不行。程序检查了一遍也没有问题,IO口高低电平都有。最后发现是原理图的问题。。。当时其实宋工是有给出完整电路的,NUD3105芯片手册上也有应用电路,但是盲目自信又对mos管驱动不熟悉,结果画错了。下面给出正确和错误示范。
遇到这种硬件原理错误的问题只能重新画图打板了,但是时间太紧,想着要是等新板子到再调试那肯定赶不上进度了,而且担心通信方面还会又问题。所以在把板子投出去后,对旧板子一顿操作,通过割线以及飞线的方式,先救活了一路继电器,继续调试其它功能。下面是飞线图,担心灰尘啥的掉到飞线的地方导致短路烧我电脑的USB口,用热熔胶糊了下。
问题3 :调试ESP8266,用USB转TTL模块单独连ESP8266时,AT指令都没反应。重新烧了下固件可以了,后来又不行了。
解决步骤:通过查阅ESP8266相关文档,应该是我上电没有复位导致的,增加相应IO的配置,给ESP8266的RESET引脚一个低电平100ms再拉高既可。
问题4:对ESP8266和云服务器连接以及手机APP设计毫无概念,不知从何下手。
解决步骤:CSDN上以stm32f103 ESP8266 mqtt为关键词搜了一圈,发现有一个经纬电子的程序,但是它用的是SIM模块通信的,尝试去修改为WIFI模块通信,未果。又继续搜资料,发现用中国移动onenet作为云服务器的文章中有几篇都给出了比较详尽的资料,大致了解了下onenet的接入教程后,根据别人的经验贴以及官方教程来操作,发现程序只要改个设备ID KEY值 以及WIFI账号密码既可,而onenet的注册创建也很简单,然后就神奇般的通信上了。走出了0到1这一步后,后面就简单了,无非就是加模块,改界面,调试功能即可。下面同样给出参考的资料(感谢):https://www.cnblogs.com/luxiaoguogege/p/10136996.html
问题5:onenet应用设计中没有那种点动式的按钮,只有一个按钮然后左边是on 右边是off,易按错而且逻辑不清楚或者说操作复杂,此外也没有控件能够直观表明台灯当前状态的。
解决步骤:将台灯开关按钮分为4个,不管单击单个按钮的on还是off,发送给设备端的指令都是一样,这样每个按钮的功能都是独立的(之前设计的是要先让开关按钮处于开,然后再选择亮度(台灯本身的机械按钮就是这么实现的))。此外增加了一个数据流用于显示灯当前状态。
问题6:SHT30在读温湿度时,发现温度正常但是 湿度一直是99.9多
解决步骤:仔细看datasheet,发现它不光有单次读取模式,还有发一次命令后多次读取,然后多次读取的频率都比较低,每秒十几二十次,因此想到是不是没有我在发完读取命令后,传感器还没有转化为我就去读了,于是在发送读取命令和读取寄存器值之间加了5ms延时,问题果然解决了。
问题7:PIR人体感应模块的输出值一直0/1跳变。
解决步骤:增加了一个软件防抖处理就OK了。
当前已经实现了大部分功能。包括灯的控制以及状态反馈,温湿度测量与显示,以及智能开关的功能,比如说如下两个场景: 1 当灯原本是开着,但是检测到没人也没有声音就自动关了。 2 当灯本身是关着的,当检测到光线弱,有人或者有声音的时候就会打开。
接下来要将OLED显示屏幕调试好,外壳弄好,将整个系统集成在一起,并且拍一些功能演示视频,整理工程资料并上传。
将上述未完成的继续完成,还想增加一个辅助学习的功能,就类似于番茄钟那种,通过发送一个指令后计时,到达指定时间间隔后将产生提示:通过闪灯,或者用备用的蓝牙接口中的一个口复用为IO口驱动一个外接蜂鸣器。另外学习使用另外几家的云服务器(BAT),毕竟这三家的使用范围应该更广一些,功能强一些。另外一定好好深入学习MQTT协议,后面再了解NB-IOT协议以及相应的模块使用等。争取早日入门物联网设计。
赶到最后一天将主体功能集成调试完毕。调试过程见附件视频。
1 实现了预期的改造老旧产品的目的,现在关灯终于可以不用下床了。 2 学习了物联网设备实现的基本流程~~~~和关键技术点,比如说物联网设备主要是进行操作端-云端-设备端开发。 3 听老师讲课和看同学们的作品以及讨论的问题,弥补了自己之前的知识盲区,比如说电容滤波必须要经过电容才行,还有继电器的驱动以及PCB设计时有些地方不能铺铜等等。 4 在项目驱动下,在遇到问题时能够积极地寻找解决办法,逐个解决,这种项目经历以及遇到问题寻找bug解决bug的经历感觉非常宝贵。 5 感谢立创 感谢立创EDA团队,立创EDA是真的好用,省了N多建库的时间。立创商城也是好 料全价格合理 避免了淘宝买到问题料的尴尬,嘉立创打板也是非常nice。
附件中有上传整套源程序。演示的视频包括工程介绍,初步功能演示以及最终功能演示。其中最终功能演示不知道为什么在工程介绍预览中显示不出画面,但是亲测下载后是可以正常播放的。~~~~
!注意:请使用浏览器自带下载,迅雷等下载软件可能无法下载到有效资源。
欢迎加入EEWorld参考设计群,也许能碰到搞同一个设计的小伙伴,群聊设计经验和难点。 入群方式:微信搜索“helloeeworld”或者扫描二维码,备注:参考设计,即可被拉入群。 另外,如您在下载此设计遇到问题,也可以微信添加“helloeeworld”及时沟通。
EEWorld Datasheet 技术支持