Fogpilot程序说明文档

前言

本程序实现了一个车辆检测通讯装置,能通过磁场检测车辆的经过,然后通过LoRa通讯通知其他的装置。

硬件部分

Heltec WiFi LoRa32 V3

ESP32+LoRa 开发板

相关介绍:https://docs.heltec.org/zh_CN/node/esp32/wifi_lora_32/index.html

相关资源:https://resource.heltec.cn/download/WiFi_LoRa_32_V3

设计缺陷:当使用电池供电时,5V引脚无法正常输出电压,仅在USB线供电时可用

QMC5883

三轴磁传感器,可测得X,Y,Z轴方向的磁场

数据手册:https://qstcorp.com/upload/pdf/202202/%EF%BC%88%E5%B7%B2%E4%BC%A0%EF%BC%8913-52-19%20QMC5883P%20Datasheet%20Rev.C(1).pdf

所使用的相关库:https://github.com/mprograms/QMC5883LCompass

代码部分

概述

总体采用了ArduSensorPlatform架构,即Host-Sensor架构,一个Host下有多个Sensors,Host会循环对每个Sensor执行Read,Write,Update操作

目前实现了两个核心Sensors:Qmc与LoraSensor,并经过了相关测试

Qmc

QMC5883通过I2C接口与单片机相连,由于单片机的每个GPIO都可以充当I2C接口,且ESP32默认的I2C接口在LoRa32开发板中被占用,在本例程中选用GPIO33,GPIO34作为与QMC5883相连的I2C接口

#define I2C_SCL 34
#define I2C_SDA 33

通过调用库QMC5883LCompass,可以获得x,y,z三轴的磁场量,数据形式为float,单位为μT(微特斯拉),根据早期实验(使用SD卡存储磁场数据)磁场测得的速率可达60Hz(每秒60个点),理论上高达144km/h的车速的车经过也能采得7个点,足够检测出车的经过

由于LoRa32开发板的OLED显示屏也使用了I2C接口,与QMC5883产生了冲突,是无法直接同时使用QMC5883与OLED的,需要将QMC5883LCompass库中所有的Wire替换为Wire1

Qmc的核心功能实现了两个函数,分别为检测车辆的经过和检测车辆停在传感器上

    checkForVehicle(zValue);
    checkForVehicleStop(zValue);

两个函数中有注释的串口打印代码,取消注释可以通过串口查看更多详细数据进行调试,修改车辆检测相关参数

当检测车辆经过时,会调用OnCarDetected()函数,通过LoRa向其他装置发送消息

当检测车辆停止时,会使变量carStopped为true,当车辆离开一段时间后carStopped会变回false,同样会通过LoRa向其他装置发送消息

LoraSensor

默认处于接收状态,当OnCarDetected()被调用时或carStopped为true时会切换到发送状态,发送对应消息

接收到消息后会将对应消息打印到OLED显示屏中

如果接收到"sleep"消息,会进入睡眠状态(deepsleep),CPU和外设功能都会关闭,十分钟(时间可调)后唤醒

OLEDDisplay

作为调试和测试用的工具,类似串口,可以将信息打印到屏幕中

写了个类似Serial.print()的函数,传入一个String,会将String的内容打印到屏幕中

void oled_print(String str);

注意:这里的String不是const char *,也不是C++的std::string,是Arduino框架中的一种字符串类型

详细请见:

https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

https://arduino.nxez.com/2016/12/22/arduino-string-class-usage-summary.html

Config

用于配置信息,如section_idpath_idstub_id

利用LittleFS来实现配置功能

LittleFS是一个为微控制器创建的轻量级文件系统,它允许您像在计算机上的标准文件系统中那样访问闪存(Flash Memory),但是它更简单,也更有限

更多请见:https://randomnerdtutorials.com/arduino-ide-2-install-esp32-littlefs/

简单说就是写一个Config.txt(或者其他形式的文本)上传到单片机中,然后程序能打开这个配置文件并读取其中的配置信息

Config.txt放置于于项目文件夹的data文件夹下,即<your_project>/data/config.txt

下面是一个简单的Config.txt示例

section id=1
path id=1
stub id=1

程序中的Config模块可以读取Config.txt的内容,并将其信息存储到类变量中

后续展望

目前通过任务拆分,将最核心的两大功能:车辆检测与LoRa通讯完全实现了,之后再根据设计文档将功能继续丰富完善

目前程序正持续更新中...


本文章使用limfx的vscode插件快速发布