# WeatherStation **Repository Path**: icesu/WeatherStation ## Basic Information - **Project Name**: WeatherStation - **Description**: ESP8266气象站 - **Primary Language**: C - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2019-11-05 - **Last Updated**: 2026-03-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # WeatherStation #### 介绍 基于ESP8266的联网气象站 #### 软件架构 目前有三版: 1. ver 1.0&1.2:Arduino开发环境,直接对ESP8266编程,OLED显示 2. ver 2.0:Arduino+MDK5,使用STC15做主机,ESP8266做从机,数码管显示 3. ver 3.0:ARM-GCC+CubeMX开发,STM32F407VGT6做主控,ESP8266做从,AT指令,FreeRTOS+STemwin(已更新为LittleVGL),TFTLCD显示,此版本正在开发中 #### ver3.0功能 1. 时间日期显示、天气情况显示、室内外温度显示 2. 根据环境亮度自动调节LCD背光亮度 3. SD卡读取,FatFs文件系统 4. USB接口:CDC用于调试、MSC读写SD卡、OTG(计划) #### ver3.0各接口及组件说明 1. STM32F407VGT6:8MHzHSE输入,PLL倍频168MHz,HAL+LL库,全用HAL速度慢,FreeRTOS+FatFs 2. LCD:FSMC接口,STemwin做GUI,BMP格式图片存于SD卡中,读取并显示 3. 天气获取:AT指令操作ESP8266,天气情况服务器:www.tianqiapi.com,GET请求,解析JSON数据,单片机内存较小没有用cJson,当字符串解的 4. 温湿度传感器:DHT12,贼难用,官网还没资料,IIC读取数据各种不稳,下一版本换掉 5. 光敏电阻:5506型,AD采样读电压 6. GUI界面占用内存比想象的多,192k也不够用了,下版本在板子上加个SRAM(HAL库一大堆调用也背锅,但谁让他省事儿呢),emwin的回调还用不太明白,触摸检测自己造了个轮子虽然不圆也还能用 #### ver3.0调试记录 2019.11.24: 1. 改了DHT12的驱动,之前一个地址一个地址的读很容易乱码,今天找到了官方的一个驱动,直接写了个地址0X00然后直接读五个字节,按照官方驱动改了之后正常了,数据检验也能工作。这版本板子有点问题,DHT12的窗口方向不对,会收集板子产生的热量,下个版本得换个方向,手动下调个三四度先 2. FreeRTOS的时钟频率降低到100Hz,1000Hz没啥必要,没有实时控制。另外也是为了适应IIC速率的下降,尽量让任务在期望的周期内能运行完 2019.11.30: 1. 把emwin的堆栈放到CCMRAM里了,之前一直没注意STM32F4的这个RAM区,直连CPU访问速度也变快了,最重要的是省下了不少空间,刷屏速度也有提升。操作系统可用的堆也变大了,计划把cjson放里面,就不用了手动解析json了。只是CCMRAM只有64k,不知道以后会不会爆,先用着 GCC使用CCMRAM的方法:(__attribute__(section(".ccmram"))),"ccmram"是链接文件里声明的section 2020.02.02: 1. ESP8266的驱动函数做了优化,之前用状态机的方法太蠢了,在多任务操作系统里写状态机属实没必要,改成了呼叫——等待应答的机制,等待超时自动返回 2. EMWIN的中间层做了优化,最大程度上减少了函数调用的次数,刷屏终于不拉窗帘了,只是界面切换时有些闪烁。其实感觉还可以优化:EMWIN用的是24位颜色数据,我只用到16位,试了一下EMWIN内部应该有24转16位颜色的算法,如果能把这部分算法取消直接给16位颜色值就能更快了,目前还没找到这部分算法在哪 2020.05.26: 1. 为了更好地解析json,开始用库,一开始用cjson,然而cjson总有问题,运行一段时间会莫名其妙卡死,申请的内存也释放了,调试看剩余堆内存也没有什么问题,目前猜测只有越界访问这种可能的错误了,有待探究 2. 自己写了个简易的的json解析,暂时能用,cjson对于这片子来讲还是过大了感觉,量身定制一个挺好的,毕竟就要那么几个数据,cjson把有的没的都解出来了很占地方 3. cjson移除了就得想法自己转utf8了,明天写一个unicode转utf8 2020.06.15: Software ver:2.0.0 软件版本更新为ver2.0.0,emwin对这片子来讲还是过于繁杂,所以把GUI换成了LittleVGL,比emwin小巧很多。今天算是移植成功(显示和触摸屏),记录几个问题: 版本号说明:x.y.z,软件中间件更新,x加1;功能更新,y加1;修复bug,z加1 1. XPT2046这个芯片读写速度不能太快,否则读出来的是错误的值,168M时候要降一下SPI的时钟 2. lvgl移植的时候如果用了DMA,DMA的源地址八位对齐,目的地址半字对齐,和emwin不太一样 3. lvgl和usb_cdc设备不能一起初始化,否则就会进hardfault,目前并不清楚导致这种问题的原因 4. 上次说的cjson总是卡死,原因是GET请求数据的问题,有时候返回的数据是空值,但cjson还是照常去解析,就出现了越界访问的情况 5. 显存放在了普通的ram里,虽然ccmram更快但ccmram不能用DMA访问 6. 跑官方DEMO的时候帧率还是上不去,底层应该可以再优化看看,还是F407就这速度?先想法优化试试 2020.06.16: Software ver:2.0.1 1. 修复了触摸屏的bug,一定要传给lvgl一个触摸检测,由于这个xpt2046的笔中断有问题,所以只能根据AD值去判断,之前把这个忽略了导致了控件响应不正常,现已修复 2020.06.20: Software ver:2.0.2 1. DMA传输的时候可以用半字对半字,之前有问题是因为我把数据量搞错了,现已修正,半字对半字传输速度也更快,算是优化 Software ver:2.0.3 1. 底层优化:将lvgl的heap和freertos的heap都放进了ccmram里,并且增大了lvgl的显存,速度有明显的提升 2. 整合了官方的demo进去,随时可进行测试 3. 之后的更新可能会比较慢,界面太难设计了,目前还没啥思路 2020.06.27: Software ver:2.1.3 1. LCD驱动部分增加了对ILI9488的支持,触摸屏驱动增加了对GT9xx系列电容触摸芯片的支持 2. 前些天就写好了这俩玩意儿的驱动,触摸没啥问题,9488有点麻烦,这个芯片只要窗口设置过大画面就会撕裂,而且很有趣的是,只有一部分控件会撕裂,比如菜单就是正常的,找了三天也没找到是什么原因,总之先放上来 2020.06.27: Software ver:2.2.3 1. 将ILI9486、ILI9488、XPT2046、GT911的驱动整合在了一起,用函数注册的方式,将初始化函数和读点函数注册到输入设备管理结构里,这样就可以随时换屏幕不用重新编译固件了。 触摸芯片区分方法:上电后先初始化IIC总线然后试读PID,GT911读出来是911,XPT2046读出来是六万多(其实不算是读出来,只是数据线时钟线是公用的所以也会读一些奇怪的东西出来),总之这样能把他们俩区分开然后在结构体里注册不同的函数交给LVGL进行操作;LCD的驱动函数只区分一个初始化就成并且通信方式相同所以不用注册函数 2. 一时半会找不到电容屏画面撕裂的原因,先用电阻屏调着,慢慢的想 3. GT911手册里的产品ID寄存器的描述有问题,手册里写的0x8140里是低字节,实际上读出来是高字节,也就是手册的描述是反的,这种手册里的错误真的烦人,和ILI的手册有一拼 4. GPIO的初始化在touch.c中用LL库手动初始化,不用Cubemx生成,方便管理 2020.06.28: Software ver:2.3.3 1. 写了个python调用官方的字体生成器,直接用官方的太麻烦了命令行要打一长段,简单的用python封装了下,至少好用了那么一点 2. 开机界面已完成 2020.07.02: Software ver:2.3.3 1. 主界面完成了一部分,先存一下防止硬盘爆炸。按键用的是button+image的形式,imagebutton对象用不了缩放。 2. 只完成俩按钮,版本号无变化 2020.08.02: 1. 主界面完成,时钟界面完成一半,正在考虑温湿度和天气情况的布局 2. 模拟时钟的指针时不时会被隐藏在表盘后面,暂不清楚问题所在 3. 上位机仿真的时候监视内存,发现好像有泄露情况,不过测试的时候长时间没有发现什么异常 2020.08.04: Software ver:2.4.3 1. 时钟界面完成 ![时钟界面截图](3.0/screenshot/clock_menu.png) 由于是上位机模拟,温湿度随便设置了两个值 2. 右侧暂时没想好放什么,将来可能放一个logo可能放一个天气图标 2020.08.05: Software ver:2.5.3 1. 给模拟时钟的指针添加了一个动画效果,打开时钟界面后时钟和分针会从初始位置转动到当前时间位置