本程序实现了一个车辆检测通讯装置,能通过磁场检测车辆的经过,然后通过LoRa通讯通知其他的装置。
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线供电时可用
三轴磁传感器,可测得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,并经过了相关测试
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向其他装置发送消息
默认处于接收状态,当OnCarDetected()
被调用时或carStopped
为true时会切换到发送状态,发送对应消息
接收到消息后会将对应消息打印到OLED显示屏中
如果接收到"sleep"消息,会进入睡眠状态(deepsleep),CPU和外设功能都会关闭,十分钟(时间可调)后唤醒
作为调试和测试用的工具,类似串口,可以将信息打印到屏幕中
写了个类似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
用于配置信息,如section_id
、path_id
、stub_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插件快速发布