当前位置: 首页 > article >正文

玩转树莓派Pico(19): 迷你气象站5——软件整合

一、前言

        各个模块都已经测试了,硬件也组装完成,到了软件整合的步骤了。

        目前我仅按照自己的经验来整合,肯定要踩坑的。以后除了多去开源网站看看大佬的代码,还要继续揣摩《无线电》杂志里的文章。很多文章对我来说比较高深,看不大懂,只能多看多学多尝试。

二、整体框架

        结合学习flask项目的经验和《代码大全》里的建议,我对该项目的整体框架设计是按功能和层次将各个模块分开。既能降低耦合,又使程序调理清晰、方便以后扩展。

        分如下三个层次:

  • main.py是顶层,是整个项目的入口,可以通过定时或中断来执行各个任务。
  • 任务模块是中层,由main.py调用,执行各种任务。比如读取传感器数据、校时、发送数据等。
  • 驱动模块、支持模块、配置模块是底层,他们是被调用的,相互独立,专注于各自的功能。

三、底层模块

        底层模块只完成特定功能,只能被调用。

        驱动模块

        驱动模块专门与硬件打交道,放在drivers目录中。本项目用到的温湿度气压模块、光照模块、wifi模块,都有对应的驱动模块。

        一般的驱动模块都是从网上下载的,可以直接使用。wifi模块是在别人的基础上改进的,除了连接wifi的基本功能外,在刷了带MQTT功能的固件后,可以轻松使用MQTT的相关功能。不但能发布订阅,还能获取网络时间,用于校时。

        支持模块

        支持模块提供额外的功能,放在supports目录下。目前仅有一个my_datetime.py,提供转换时间相关的功能。

        配置模块

        模块名称为settings.py,因为就一个文件,放在根目录下。我参照flask项目里的配置模块,做了Config类,放入要用到的一些设置参数和公共变量,方便更改。

四、中层模块

        中层模块目前仅是任务模块,放在tasks目录中,由主程序按需调用。

        wifi初始化任务模块

        文件名为wifi_task.py,用于wifi的相关设置

        读取气象数据任务模块

        文件名为weatherdata_task.py,用于读取气象数据

        MQTT任务模块

        文件名为mqtt_task.py,用于发布和订阅消息

        时间任务模块

        文件名为time_task.py,用于获取网络时间并校时

五、顶层模块

        顶层模块就是main.py,是整个项目的入口。我第一次使用看门狗和定时器功能,手忙脚乱,错误频出。特别时看门狗,用了之后pico会与电脑断开,最后只能暂时停用。

        自我感觉主程序写的不好,不过目前先能用起来,等以后经验丰富了再改进。

六、代码

        我在gitcode建了仓库,仓库地址:

GitCode - 全球开发者的开源社区,开源代码托管平台

七、测试效果

        测试能达到预定效果。发布的消息分别是光照、气压、湿度、温度,用分号分隔。

接收订阅的消息

发布消息

云平台管理后台显示接收的消息

八、待完成的功能

        为了不增加第一个项目的复杂度,目前仅完成读取和发送数据、校时等基本功能。更多功能以后慢慢加上。

        待完成的功能如下:

  • 建立本地的sqlite数据库,用于存储读取的气象数据和日志
  • MQTT功能继续完善,比如遗嘱功能
  • 在云服务器上用flask做一个网站,接收定时发送的数据并存储,可以以图表的方式展示气象数据
  • 在树莓派或另一个pico上连接APRS的TNC设备,将获取的气象数据和定位信息通过无线电发射出去

        另外还有个终端编号的功能取消了。本来是要装一个3位编码开关(要占用3个gpio针脚,不过pico的针脚很多),根据编码来设置终端的编号(0-7),适合多终端的情况。


http://www.kler.cn/a/446832.html

相关文章:

  • Qt5HttpServer : Qt官方的HTTP服务器
  • Python中的上下文管理器:从资源管理到自定义实现
  • VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)
  • Flask内存马学习
  • OneCode:开启高效编程新时代——企业定制出码手册
  • 穷举vs暴搜vs深搜vs回溯vs剪枝系列一>找出所有子集的异或总和再求和
  • 代码随想录第52天
  • 【数据分析】层次贝叶斯
  • 电子应用设计方案-64:智能窗帘系统方案设计
  • React与Vue的区别(相同点和不同点)
  • 一个签名笔迹量化分析专家辅助系统
  • 数据结构:B树与B+树
  • React 事件机制和原生 DOM 事件流有什么区别
  • 源码编译llama.cpp for android
  • linux下网络编程socketselectepoll的底层实现原理
  • js常用方法之: 预览大图(uniapp原生方法封装)
  • 机器学习《西瓜书》学习笔记《待续》
  • git分支管理及策略
  • HIPT论文阅读
  • Java 优化springboot jar 内存 年轻代和老年代的比例 减少垃圾清理耗时 如调整 -XX:NewRatio
  • 使用ResNet18进行猫狗分类(原始数据处理+训练流程)
  • Android Overlay Priority Rules
  • Oracle 数据库函数的用法(一)
  • Java-30 深入浅出 Spring - IoC 基础 启动IoC 纯XML启动 Bean、DI注入
  • [react]5、React脚手架
  • 【Linux】文件IO--open/close/文件描述符(详)