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

news2024/12/22 22:58:36

一、前言

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

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

二、整体框架

        结合学习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.coloradmin.cn/o/2263938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

30. 多进程编程

一、什么是进程 进程(process)则是一个执行中的程序。每个进程都拥有自己的地址空间、内存、数据栈以及其它用于跟踪执行的辅助数据。操作系统管理其上所有进程的执行,并为这些进程合理分配时间。进程也可以通过派生新的进程来执行其它任务&a…

Unity Post请求发送fromdata数据content-type

wwwfrom 的 headers["Content-Type"]修改 错误代码: WWWForm form new WWWForm(); if (form.headers.ContainsKey("Content-Type")) {string boundary string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));form…

aosp15 - Activity生命周期切换

本文探查的是,从App冷启动后到MainActivity生命周期切换的系统实现。 调试步骤 在com.android.server.wm.RootWindowContainer#attachApplication 方法下断点,为了attach目标进程在com.android.server.wm.ActivityTaskSupervisor#realStartActivityLock…

SAP PP ECN CSAP_MAT_BOM_MAINTAIN

刚开始的时候ECN总是加不上, 参考kimi给出的案例 点击链接查看和 Kimi 智能助手的对话 https://kimi.moonshot.cn/share/cth1ipmqvl7f04qkggdg 效果 加上了 FUNCTION ZPBOM_PLM2SAP. *"------------------------------------------------------------------…

GitLab的安装和使用

1.GitLab 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能…

开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)综述

定义 开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)是一种目标检测任务,旨在检测和识别那些未在训练集中明确标注的物体类别。传统的目标检测模型通常只能识别有限数量的预定义类别,而OVOD模型则具有识别“开放词汇…

JaxaFx学习(三)

目录: (1)JavaFx MVVM架构实现 (2)javaFX知识点 (3)JavaFx的MVC架构 (4)JavaFx事件处理机制 (5)多窗体编程 (6)数据…

【C++】小乐乐求和问题的高效求解与算法对比分析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯问题描述与数学模型1.1 题目概述1.2 输入输出要求1.3 数学建模 💯方法一:朴素循环求和法2.1 实现原理2.2 分析与问题2.3 改进方案2.4 性能瓶颈与结论…

基于Spring Boot的找律师系统

一、系统背景与意义 在现代社会,法律服务的需求日益增长,但传统寻找律师的方式往往存在信息不透明、选择困难等问题。基于Spring Boot的找律师系统旨在解决这些问题,通过线上平台,用户可以轻松搜索、比较和选择合适的律师&#x…

【Spring】方法注解@Bean,配置类扫描路径

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 引入 一:Bean方法注解 1:方法注解要搭配类注解使用 2:执行结果 …

深度学习0-前置知识

一、背景 AI最大,它的目的是通过让机器模仿人类进而超越人类; ML次之,它是AI的一个分支,是让机器模仿人类的一种方法。开发人员用大量数据和算法“训练”机器,让机器自行学会如何执行任务,它的成功取决于…

前端面试题整理-前端异步编程

1. 进程、线程、协程的区别 在并发编程领域,进程、线程和协程是三个核心概念,它们在资源管理、调度和执行上有着本质的不同。 首先,进程是操作系统进行资源分配和调度的独立单位(资源分配基本单位),每个进…

ARM学习(38)多进程多线程之间的通信方式

ARM学习(38)ARM学习(38)多进程多线程之间的通信方式 一、问题背景 笔者在调试模拟器的时候,碰到进程间通信的问题,一个进程在等另外一个进程ready的时候,迟迟等不到,然后通过调试发现,另外一个进程变量已经变化了,但是当前进程变量没变化,需要了解进程间通信的方式…

群晖利用acme.sh自动申请证书并且自动重载证书的问题解决

前言 21年的时候写了一个在群晖(黑群晖)下利用acme.sh自动申请Let‘s Encrypt的脚本工具 群晖使用acme自动申请Let‘s Encrypt证书脚本,自动申请虽然解决了,但是自动重载一直是一个问题,本人也懒,一想到去…

level2逐笔委托查询接口

沪深逐笔委托队列查询 前置步骤 分配数据库服务器 查询模板 以下是沪深委托队列查询的请求模板&#xff1a; http://<数据库服务器>/sql?modeorder_book&code<股票代码>&offset<offset>&token<token>查询参数说明 参数名类型说明mo…

delve调试环境搭建—golang

原文地址&#xff1a;delve调试环境搭建—golang – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 由于平时不用 IDE 开发环境&#xff0c;习惯在 linux终端vim 环境下开发&#xff0c;所以找了golang的调试工具&#xff0c;delve类似gdb的调试界…

PC寄存器(Program Counter Register) jvm

在JVM&#xff08;Java虚拟机&#xff09;中&#xff0c;PC寄存器&#xff08;Program Counter Register&#xff09;扮演着至关重要的角色&#xff0c;它是JVM执行引擎的核心组成部分之一。以下是PC寄存器在JVM中的具体角色和职责&#xff1a; 指令执行指针&#xff1a; PC寄存…

线性分类器(KNN,SVM损失,交叉熵损失,softmax)

KNN 工作机制 k-近邻算法的工作机制可以分为两个主要阶段&#xff1a;训练阶段和预测阶段。 训练阶段 在训练阶段&#xff0c;k-近邻算法并不进行显式的模型训练&#xff0c;而是简单地存储训练数据集。每个样本由特征向量和对应的标签组成。此阶段的主要任务是准备好数据&…

重拾设计模式--适配器模式

文章目录 适配器模式&#xff08;Adapter Pattern&#xff09;概述适配器模式UML图适配器模式的结构目标接口&#xff08;Target&#xff09;&#xff1a;适配器&#xff08;Adapter&#xff09;&#xff1a;被适配者&#xff08;Adaptee&#xff09;&#xff1a; 作用&#xf…

StarRocks:存算一体模式部署

目录 一、StarRocks 简介 二、StarRocks 架构 2.1 存算一体 2.2 存算分离 三、前期准备 3.1前提条件 3.2 集群规划 3.3 配置环境 3.4 准备部署文件 四、手动部署 4.1 部署FE节点 4.2 部署BE节点 4.3 部署CN节点&#xff08;可选&#xff09; 4.4 FE高可用…