张高兴的 .NET IoT 入门指南:(七)制作一个气象站

2022-05-09 15:11:00 浏览数 (1)

距离上一篇《张高兴的 .NET Core IoT 入门指南》系列博客的发布已经过去 2 年的时间了,2 年的时间 .NET 版本发生了巨大的变化,.NET Core 也已不复存在,因此本系列博客更名为 《张高兴的 .NET IoT 入门指南》,我也重新审阅了之前的内容进行了相应的更改以保证内容的时效性。

和单片机不同,使用 Linux 开发板、现成的传感器套件以及合适的后端技术几乎可以做成任何东西。为了更好的整合前面章节介绍的内容,本文将制作一个简单的气象站(也许叫环境信息收集装置更合适),至于为何选择制作一个气象站,因为难度不高制作不复杂,并且温湿度传感器花费较低的价格即可获得,可以以低廉的价格换取一个 cool stuff。本文将使用 .NET 6 编写一个控制台应用程序,通过本文你可以学到:

  1. I2C I2cDevice 类的使用;
  2. 摄像头设备 VideoDevice 类的使用;
  3. Iot.Device.Bindings NuGet 包的使用;
  4. 时序数据库 TimescaleDB 的简单使用;
  5. Quartz 定时任务的使用;
  6. 在控制台应用中进行依赖注入;
  7. 使用 Docker 拉取镜像、部署应用。
  • 硬件需求
  • 电路
  • 准备工作
    • 配置 TimescaleDB 数据库
    • 安装摄像头的依赖库
  • 编写代码
    • 项目结构
    • 项目依赖
    • 数据库上下文与实体类
    • 配置文件
    • 初始化与依赖注入配置
    • 配置定时任务
  • 部署应用
    • 发布到文件
    • 构建 Docker 镜像
  • 后续工作

硬件需求

名称

描述

数量

Orange Pi Zero

Linux 开发板

x1

BME280

提供温度、湿度以及气压数据

x1

USB 摄像头

提供环境图像

x1

杜邦线

传感器与开发板的连接线

若干

电路

传感器

接口

开发板接口

BME280

SDA

TWI0_SDA (Pin 3)

SCL

TWI0_SCK (Pin 5)

VCC

5V (Pin 4)

GND

GND (Pin 6)

USB 摄像头

USB

USB

准备工作

配置 TimescaleDB 数据库

TimescaleDB 是一款基于 PostgreSQL 插件的时序数据库。考虑到收集的环境数据是按时间进行索引,并且数据基本上都是插入,没有更新的需求,因此选用了时序数据库作为数据存储。TimescaleDB 是 PostgreSQL 的一款插件,可以通过先安装 PostgreSQL 之后再安装插件的形式部署 TimescaleDB,这里直接使用 TimescaleDB 的 Docker 镜像进行部署。

  1. 拉取 TimescaleDB 镜像:
代码语言:javascript复制
docker pull timescale/timescaledb:latest-pg14
  1. 创建卷,用于持久化数据库数据:
代码语言:javascript复制
docker volume create tsdb_data
  1. 运行镜像,端口映射为 54321,密码配置为弱密码 @Passw0rd
代码语言:javascript复制
docker run -d --name timescaledb -p 54321:5432 --restart=always -e POSTGRES_PASSWORD='@Passw0rd' -e TZ='Asia/Shanghai' -e ALLOW_IP_RANGE=0.0.0.0/0 -v tsdb_data:/var/lib/postgresql timescale/timescaledb:latest-pg14
  1. 使用熟悉的数据库管理工具(如 Navicat)创建数据库 WeatherMetrics
代码语言:javascript复制
CREATE DATABASE "WeatherMetrics"
WITH OWNER = postgres ENCODING = 'UTF8';

CREATE TABLE metrics (
   time TIMESTAMP WITHOUT TIME ZONE NOT NULL DEFAULT 'now()',
   device_id VARCHAR(50) NULL,
   weather_type VARCHAR(50) NULL,
   temperature DECIMAL(5, 2) NULL,
   humidity DECIMAL(5, 2) NULL,
   pressure DECIMAL(8, 2) NULL,
   image_base64 TEXT NULL
);

SELECT create_hypertable('metrics', 'time');

time 表示采集数据的时间,device_id 记录采集设备的 id,weather_type 记录从心知天气获取的天气名,temperature 记录传感器获取的温度,humidity 记录传感器获取的湿度,pressure 记录传感器获取的气压,image_base64 记录摄像头采集的图像。

0 人点赞