- 2024-11-01
-
加入了学习《 【2024 DigiKey 创意大赛】 作品提交,展示视频》,观看 效果展示
-
加入了学习《基于树莓派5的工业智能网关视频》,观看 得捷2024大赛基于树莓派5的智能工业网关视频
-
发表了主题帖:
【2024 DigiKey 创意大赛】-基于树莓派5的工业智能网关的设计
本帖最后由 JectXie 于 2024-11-1 11:34 编辑
基于Raspberry 5工业传感网关系统的设计
作者:JectXie
一、作品简介
本作品主要实现了网关的功能对各下层终端设备的数据进行收集、保存、转发至云平台。解决了终端设备直接与平台数据互通时在复杂的网络环境中数据发送失败的问题,以及数据发送失败导致的数据无法追查的问题,通过本网关系统进行中转,可以让数据更好更稳定的保留至本地,方便未来追溯及分析。作品使用树莓派作为主控,树莓派linux系统作为主要系统,Python作为后端语言搭配Flask后台管理框架,前端使用谷歌MUI结合React,采集端使用ESP32-S作为主控采集SHT30、SHT40、FST Sensor 、BME680、SGP30、LTR-329数据,使用HTTP协议作为主要数据传输协议。
二、系统框图
设计思路、软硬件介绍如下,以图文方式展示如下。
本作品主要由Raspberry5作为网关主控(“以下将‘Raspberry Gateway网关’简称为‘网关’”),ESP32 作为终端设备主控控制所有传感器,BME680、SGP30、FST Sensor、SHT30、SHT40、LTR-329作环境数据采集传感器,采集的参数主要为温度、湿度、压强、气体指令、二氧化碳含量、光照强度、红外光强度、挥发性有机物含量,C++作为嵌入式部分编程语言。另外一部分工业打印机与Raspberry 5 处于一个局域网内,按照设计的架构,客户端PC通过MQTT间接与工业打印机建立联系,从而达到控制打印机打印的目的。
1、ESP32读取各传感器数据、使用HTTP POST将数据传输给网关,网关对数据进行存储且将数据转发至云平台,本地网关可以查询到历史数据。
2、网关收集各传感器数据存储至数据库中
3、客户端程序发布打印指令通过MQTT 服务器,将数据给到网关,网关再将打印指令转发给打印机。示例为斑马打印指令(条码行业龙头,90%的打印机厂商都会支持斑马指令)。
三、各部分功能说明
第一部分:ESP32 采集各传感器数据,采用Arduino IDE开发,结合Adafruit SDK作为基础进行增加HTTP功能。用官方库,SHT30 和FST Sensor官方没有SDK,需要重新调整。FST Sensor用到了软串口的库。
定义好网关接口地址,和定义好wifi,再Setup函数内连接wifi
Setup连接wifi
循环函数内发送HTTP数据
第二部分:网关的主要代码。为了让项目代码更好维护,以及为了未来可以有人一起维护这个项目,这是一个前后端分离的项目。
前端:需要给网关安装好web服务器(任何web服务器不限nginx、apache、iis)来运行前端html及js代码。前端项目采用MIT开源协议,在谷歌MUI的基础上整合。
打包完成后,根据web服务器的配置打开网页即可查看前端页面,
打包命令使用到了yarn,需要提前安装yarn 运行yarn build 即可打包完成。
在打开代码以后需要运行npm install 安装相关以来,由于nodejs依赖非常大,需要耐心等待以及需要网络较好的情况下完成(这是nodejs的通病)。Node环境推荐越新越好。
下面的各个传感器数据成功展示的截图
后端:采用Python作为后端语言,使用Flask框架做技术支撑,用到了Flask内部的很多方法,例如内部的Session机制
这种后端项目应该按照标准MVVM文件结构来做,但是由于功能并不复杂,写的随意了一些,
具体的接口全部写在router文件夹内
另外,同步云端单独起了一个文件,cloud_sync.py
用到了Flask-SQLAlchemy技术,来更好更快的操作Mysql。Mysql或Mariadb版本不限。
设备开机时,会自动连接wifi,将数据发送到网关。网关给出返回201状态码及成功数据。并且将数据转发给云端。下面是后台接收到数据,网关数据库和云端数据库的代码。
第三部分:客户端跨网络控制工业打印机的部分,这里主要是使用到了MQTT协议,通过网关做一个数据的转发。让外网的机器可以控制内网的打印机进行打印。
这里做了一个简单的上位机软件。来配合后台程序测试。结合了斑马的打印指令。
输入,或者条码枪扫描二维码,点击打印,即可控制网关局域网内的条码打印机进行打印标签。
看到这里说明打印指令发送成功,这是一条标准斑马打印指令,BQ代表二维码,打印出来的内容会是一个二维码(条码打印机的知识不多做赘述)
四、作品源码
源码地址https://download.eeworld.com.cn/detail/JectXie/634870?u_atoken=689184ea01cf712f811f4489704aa7fc&u_asig=1a0c66dc17304282160008808e00a0
源码说明:
Python版本3.8.8及以上
nodejs 版本20.12.2(前端需要npm install下载依赖)
上位机软件基于.net 6.0,与.net fremework 4.x 不兼容
五、作品功能演示视频
作品视频
六、项目总结
首先感谢得捷和EEworld能给我这次机会参加这次活动,其实这次的项目的内容,我在内心构思了很久,一直没有做完,正好这次的机会让我可以完成到当前这个进度对于我个人来讲已经很满意了。
本次作品是一个工业网关,前端UI是我工作这么多年认为比较好看的UI之一。后端采用的Python加速了开发进度,抛开语言本身的限制,对于整个项目所有开发语言的选型,我个人认为是比较不错的。目前完成的项目感觉还是有不尽人意的地方,希望在后续可以慢慢完善。对于我个人本身。代码规范还是需要加强。
-
上传了资料:
2024创意大赛代码-基于树莓派的智能网关DigiKey_contest_2024
- 2024-10-25
-
加入了学习《Follow me 第二季第2期汇总的视频》,观看 Follow me 第二季第2期汇总的视频
-
加入了学习《 【2024 DigiKey 创意大赛】智能聊天机器人》,观看 智能聊天机器人
- 2024-10-21
-
发表了主题帖:
【2024 DigiKey创意大赛】基于Raspberry 5工业传感网关系统的设计-各项传感器数据采集
本帖最后由 JectXie 于 2024-10-21 23:03 编辑
本项目用到的各项传感器,
1、FST红外温度传感器(主要用于无法安装接触式传感器测温场景)
1.2 这是一个工业级Modbus红外测温传感器。下面是ESP32 驱动串口、写入接收Modbus数据,拿到温度数据的代码
#include <SoftwareSerial.h>
// 使用SoftwareSerial定义Modbus的RX和TX引脚
SoftwareSerial mod(16, 17); // RX = 16, TX = 17
// 读取FST传感器的Modbus命令
const uint8_t ModFstReadBuffer[] = {0x7B, 0x03, 0x00, 0x00, 0x00, 0x02, 0xCF, 0x91};
// 将尾数部分转换为小数
float tow_to_ten(uint32_t dat) {
float result = 0.0;
uint8_t countt = 1;
uint32_t num = (dat << 9) & 0xFFFFFFFF; // 将尾数左移以进行转换
// 将尾数的二进制转换为十进制小数
while (num > 0) {
result += ((num & 0x80000000) >> 31) * pow(0.5, countt);
countt++;
num = num << 1;
if (countt > 23) {
break; // 超过23位时退出
}
}
return result;
}
// 将IEEE 754格式的数据转换为十进制浮点数
float IEEE754_to_decimal(uint32_t source) {
uint8_t sign = (uint8_t)((source & 0x80000000) >> 31); // 符号位:第31位
uint8_t index = (uint8_t)((source & 0x7F800000) >> 23); // 指数部分:第23-30位
uint32_t mantissa = (source & 0x007FFFFF); // 尾数部分:第0-22位
float decimal = tow_to_ten(mantissa); // 将尾数转换为小数
// 根据IEEE 754公式计算十进制浮点数
return pow(-1, sign) * (1 + decimal) * pow(2, (index - 127));
}
// 获取FST传感器的温度数据
void GetfstSenesorData() {
float fstTemperature, FstTemperatureFahrenheit;
Serial.println("state=2常规工作模式-------------菲尔斯特探头工作模式");
unsigned int data[9]; // 用于存储读取到的响应数据
delay(10); // 等待传感器响应
// 写入Modbus命令并检查是否成功发送了8个字节
if (mod.write(ModFstReadBuffer, sizeof(ModFstReadBuffer)) == 8) {
Serial.println("写入串口数据成功");
Serial.println("----------1----------↓");
// 读取传感器的Modbus响应数据
for (int i = 0; i < 9; i++) {
data[i] = mod.read();
Serial.print(data[i], HEX);
if (i < 8) Serial.print("/");
}
Serial.println();
// 检查返回的数据是否符合预期格式
if (data[1] == 3 && data[2] == 4) {
int val = 0;
char *pBuf = (char *)&val;
// 将四个字节的数据组合成一个32位的整数
pBuf[0] = data[6];
pBuf[1] = data[5];
pBuf[2] = data[4];
pBuf[3] = data[3];
Serial.print("读取的原始整数值:");
Serial.println(val);
// 将读取到的数据转换为实际的温度值
fstTemperature = IEEE754_to_decimal(val);
FstTemperatureFahrenheit = (fstTemperature * 1.8) + 32.0f;
// 输出温度值
Serial.print("温度 (摄氏度): ");
Serial.println(fstTemperature);
Serial.print("温度 (华氏度): ");
Serial.println(FstTemperatureFahrenheit);
} else {
Serial.println("接收到的Modbus响应数据无效。");
}
Serial.println("↑-----------1----------↑");
} else {
Serial.println("写入串口数据失败。");
}
}
void setup() {
// 初始化串口和Modbus通信
Serial.begin(115200);
mod.begin(9600);
}
void loop() {
// 每2秒获取一次FST传感器数据
GetfstSenesorData();
delay(2000);
}
这一部分需要有一个TTL-RS485的芯片,附一个原理图供参考
2、SGP30 传感器(这是我的必选物料之一)
SGP30 是一款多功能气体传感器,用于测量空气中的总挥发性有机化合物 (TVOC) 和二氧化碳当量 (CO₂eq) 浓度。SGP30 使用MEMS技术和气体传感技术。
2.2 下面是ESP32 读取SGP30监测到的有机化合物 (TVOC) 和二氧化碳当量 (CO₂eq) 浓度,氢气、乙醇的代码
#include <Wire.h>
#include <Adafruit_SGP30.h>
// SGP30 引脚连接到 ESP32:
// SGP30 VCC -> ESP32 3.3V
// SGP30 GND -> ESP32 GND
// SGP30 SDA -> ESP32 GPIO 21(或其他 SDA 引脚)
// SGP30 SCL -> ESP32 GPIO 22(或其他 SCL 引脚)
Adafruit_SGP30 sgp;
void setup() {
Serial.begin(115200);
// 初始化 SGP30
if (!sgp.begin()) {
Serial.println("Failed to find SGP30 chip");
while (1) {
delay(10); // 避免无限循环时占用过多CPU
}
}
// 初始化 IAQ(Indoor Air Quality)
sgp.IAQinit();
}
void loop() {
// 读取 eCO₂ 和 TVOC 数据
if (sgp.IAQmeasure()) {
Serial.print("eCO2 = ");
Serial.print(sgp.eCO2);
Serial.println(" ppm");
Serial.print("TVOC = ");
Serial.print(sgp.TVOC);
Serial.println(" ppb");
Serial.print("Raw H2: ");
Serial.print(sgp.rawH2);
Serial.print(" Raw Ethanol: ");
Serial.println(sgp.rawEthanol);
Serial.println("-----------------");
} else {
Serial.println("Measurement failed");
}
delay(3000); // 每3秒读取一次数据
}
3、BME680模组 (这是我的第二个必选模组)
BME680 是一款由 Bosch Sensortec 生产的多合一环境传感器,可以测量温度、湿度、气压、气体
下面是ESP32 读取这些参数的代码
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME680.h>
Adafruit_BME680 bme; // I2C
void setup() {
Serial.begin(115200);
if (!bme.begin(0x77)) { // 根据你的模块地址设置
Serial.println("BME680 not found");
while (1);
}
}
void loop() {
if (bme.performReading()) {
Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");
Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");
Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");
Serial.print("Gas Resistance = ");
Serial.print(bme.gas_resistance);
Serial.println(" ohms");
} else {
Serial.println("Failed to perform reading");
}
delay(3000); // 每3秒读取一次数据
}
4、SHT40 这是一款高精度的温湿度传感器,可以读取温度和湿度。I2C协议,
这是SHT30的升级款,代码也有改动。下面是示例代码
#include <Wire.h>
#include <Adafruit_SHT4x.h>
Adafruit_SHT4x sht4x;
void setup() {
Serial.begin(115200);
// 初始化 SHT40
if (!sht4x.begin()) {
Serial.println("SHT40 not found");
while (1) delay(10);
}
// 可以设置传感器精度
sht4x.setPrecision(SHT4X_HIGH_PRECISION);
}
void loop() {
sensors_event_t humidity, temperature;
// 读取温湿度数据
if (sht4x.getEvent(&humidity, &temperature)) {
Serial.print("Temperature: ");
Serial.print(temperature.temperature);
Serial.println(" °C");
Serial.print("Humidity: ");
Serial.print(humidity.relative_humidity);
Serial.println(" %");
} else {
Serial.println("Failed to read data from SHT40");
}
delay(2000); // 每2秒读取一次数据
}
5、LTR329 这是一个光传感器,可以测量可见光和红外光。在项目中用于监测车间内光照强度是否达标。对员工视力是否影响。
下面是ESP32 读取LTR-329的代码
#include "Adafruit_LTR329_LTR303.h"
Adafruit_LTR329 ltr = Adafruit_LTR329();
void setup() {
Serial.begin(115200);
Serial.println("Adafruit LTR-329 light sensor test");
if (!ltr.begin()) {
Serial.println("Couldn't find LTR sensor!");
while (1) delay(10);
}
Serial.println("Found LTR sensor!");
// 设置默认增益、积分时间和测量速率
ltr.setGain(LTR3XX_GAIN_2); // 默认增益
ltr.setIntegrationTime(LTR3XX_INTEGTIME_100); // 默认积分时间
ltr.setMeasurementRate(LTR3XX_MEASRATE_200); // 默认测量速率
}
void loop() {
if (ltr.newDataAvailable()) {
uint16_t visible_plus_ir, infrared;
bool valid = ltr.readBothChannels(visible_plus_ir, infrared);
if (valid) {
Serial.print("CH0 Visible + IR: ");//可见光
Serial.print(visible_plus_ir);
Serial.print("\t\tCH1 Infrared: ");//红外光
Serial.println(infrared);
}
}
delay(2000); // 延时以避免数据更新过于频繁
}
到这里,完成了ESP32 采集数据部分的功能。
后续请看下一集,ESP32通过网络将数据传输到工业传感器网关
- 2024-10-20
-
加入了学习《智能书房》,观看 智能书房
-
加入了学习《得捷电子专区》,观看 【2024 DigiKey 创意大赛】红外温度检测及火灾报警器
- 2024-10-01
-
加入了学习《【Follow me 第二季第2期任务】 各个任务实现的展示效果》,观看 【Follow me 第二季第2期任务】MQTT接入到HomeAssistant
- 2024-09-30
-
回复了主题帖:
大家国庆出门不?求推荐一个人不多的地方晃一圈。。。
JectXie 发表于 2024-9-30 21:27
景德镇一年四季都没人玩,只是当地人觉得自己是旅游城市到了时间就涨价。不是长假有时间可以选择瓷博会的 ...
如果是晴天,在昌江边上走走,也蛮好的。
以前我们读书的时候,那的水真的很干净很干净。清澈的可以见底。拍照都不用滤镜出来的就是那种很唯美的图。
-
回复了主题帖:
大家国庆出门不?求推荐一个人不多的地方晃一圈。。。
soso 发表于 2024-9-30 17:47
没人去 还涨价 哈哈
我们去年巨热的天去景德镇,人确实还行。就不知道天不热了,人会不会多。
景德镇一年四季都没人玩,只是当地人觉得自己是旅游城市到了时间就涨价。不是长假有时间可以选择瓷博会的时候去,可以真正的感受到瓷都的魅力,几个展馆铺满了陶瓷。很壮观很壮观。
不过这个地方本身路灯都是陶瓷做的,下了高速就有感觉了。
还有很多可以自己DIY陶瓷的地方,不过这种东西现在全国各地都有,也没啥好玩的。主要就去逛逛的话,散散心还是很不错的选择。
如果是阴天去古县衙,从边上小路进去,在那地方古色古香的走走意境就来了。
然后景德镇的天经常都是很蓝的蓝天,总体来说是很不错的。
- 2024-09-29
-
上传了资料:
followme 第二季第二期代码合计
-
回复了主题帖:
大家国庆出门不?求推荐一个人不多的地方晃一圈。。。
一直以来最偏门的地方,景德镇、武夷山、黄山、三清山、上饶灵山、这一块都是没人去的。旅游合适,就是当地的人没人去但是酒店一样涨价,逛逛还是很合适的
-
发表了主题帖:
【Follow me第二季第2期】任务汇总
本帖最后由 JectXie 于 2024-11-1 13:20 编辑
【Follow me第二季第2期】任务汇总
1、写在前面
大家好我是Ject,很高兴可以入围并参加这次Follow me第二季第2期的活动,感谢EEWorld、感谢得捷能给这个机会完成所有的任务,其实任务早就做完了,但是这个合集的帖子没弄完,一直拖到今天。视频介绍确实对于我这么一个对剪辑视频有恐惧的人来说有点难,最后还是硬着头皮录完了,(环境声音太吵,录音和录屏分开了,导致视频里面又加了一些别的片段,所以把整件事情都弄复杂了)第一次做这种任务。
2、物料介绍
主控:这次用到的是Arduino UNo R4 WIFI这款板子,高级货,联网模组是ESP32-S3 MINI,我后面才知道正常板子是邮票孔,这个MINI的pin在这块PCB的底部,芯片强悍,但是也确实不好拆,得用加热台才拆得下来。我觉得他选用Mini应该也有防止普通开发者会把他拆下来。毕竟这个ESP32-S3 确实强很多。
传感器:LTR-329是一个光感模块,可以把光的流明以数字形式展示。
传感器:SHT40 这是一个温湿度传感器,是SHT30的升级款。具体参数还需要未来有项目使用到的时候再来对比。
3、完成任务历程
3.1 搭建环境并开启第一步Blink / 串口打印Hello EEWorld!
3.1.1 下载Arduino IDE,
3.1.2 安装开发板、
3.1.3 将开发板插入电脑USB接口、查看电脑识别出来的串口号是多少、
3.1.4 在IDE中设置好串口、完成烧录(后续任务会重复很多遍烧录过程,后面不再介绍烧录流程)
流程图
3.2 驱动12x8点阵LED;用DAC生成正弦波;用OPAMP放大DAC信号;用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
3.2.1 学习UNO4 WIFI开发板对于11个IO控制96个灯的设计思路、
3.2.2 学习DAC、ADC相关基础知识
3.2.3 学习OPAMP相关原理知识
3.2.4 学习使用IDE 串口展示曲线功能
1、驱动12x8点阵LED流程图 2、用DAC生成正弦波流程图 3、用OPAMP放大DAC信号流程图
4、用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线流程图
3.3 通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)
3.3.1 连接WIFI
3.3.2 安装MQTT服务
3.3.3 安装HA
3.3.4 学习设备接入HA的MQTT配置指令
3.4 通过外部LTR-329 环境光传感器,上传光照度到HA,通过HA面板显示数据
3.4.1 使用官方库读取流明数值
3.4.2 串口打印数值
3.4.3 数据接入HA,发布流明数据,HA面板显示
3.5 通过外部SHT40温湿度传感器,上传温湿度到HA,通过HA面板显示数据
3.5.1 使用官方库读取温湿度
3.5.2 串口打印数值
3.5.3 数据接入HA,分别发布温度和湿度数据,HA面板显示
4、完整任务的视频介绍
5、任务过程发帖记录
5.1 开发环境搭建 https://bbs.eeworld.com.cn/thread-1291460-1-1.html
5.2 驱动 12*8 点阵屏 https://bbs.eeworld.com.cn/thread-1292150-1-1.html
5.3 用DAC生成正弦波 https://bbs.eeworld.com.cn/thread-1292151-1-1.html
5.4 用OPAMP放大DAC信号 https://bbs.eeworld.com.cn/thread-1292152-1-1.html
5.5 ADC采集并将数据打印到上位机 https://bbs.eeworld.com.cn/thread-1291640-1-1.html
5.6 开发板使用MQTT接入HA https://bbs.eeworld.com.cn/thread-1292197-1-1.html
5.7 读取LTR-329传感器数据接入HA,并在HA面板展示数据 https://bbs.eeworld.com.cn/thread-1292368-1-1.html
5.8 读取SHT40传感器数据接入HA,并在HA面板展示数据 https://bbs.eeworld.com.cn/thread-1292361-1-1.html
6、各任务详细说明
6.1 入门任务(必做):搭建环境并开启第一步Blink / 串口打印Hello EEWorld!
6.1.1 任务简介
这一部分主要学习了如何搭建Arduino 开发环境,如何串口打印响应数据,这是学习任何Arduio 开发板的第一步。
6.1.2代码片段
void setup() {
Serial.begin(115200);
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
Serial.println("Hello EEWorld!");
}
6.1.3 效果图
6.1.4 帖子链接
https://bbs.eeworld.com.cn/thread-1291460-1-1.html
6.2 基础任务(必做):驱动12x8点阵LED;用DAC生成正弦波;用OPAMP放大DAC信号;用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线
6.2.1 任务简介
说是一个任务,实际里面是4个任务,任务2和3对新手不友好。但是可以学到新知识,很好。相信出题的老师很用心的出的这四题。
6.2.2 代码片段
驱动12x8点阵LED代码
#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
ArduinoLEDMatrix matrix;
int scrollSpeed = 200;
void setup() {
Serial.begin(115200);
matrix.begin();
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
matrix.textFont(Font_4x6);
matrix.beginText(0, 1, 0xFFFFFF);
scrollText("WAIT RECEIVE DATA . . .");
Serial.println("WAIT RECEIVE DATA . . .");
matrix.endText();
matrix.endDraw();
}
void loop() {
if (Serial.available() > 0) {
String inputData = Serial.readString();
Serial.println(inputData);
matrix.clear();
scrollText(inputData);
delay(100);
}
}
void scrollText(const String& text) {
int textWidth = text.length() * 6;
int matrixWidth = matrix.width();
for (int x = matrixWidth; x >= -textWidth; x--) {
matrix.beginDraw();
matrix.stroke(0xFFFFFFFF);
matrix.textFont(Font_5x7);
matrix.beginText(x, 1, 0xFFFFFF);
matrix.println(text);
matrix.endText();
matrix.endDraw();
delay(scrollSpeed);
}
}
用DAC生成正弦波代码
#include <Arduino.h>
#include <math.h>
#define DAC_PIN A0// ESP32 DAC pin (GPIO 25)
void setup() {
pinMode(DAC_PIN, OUTPUT);
}
void loop() {
for(int i = 0; i < 360; i++){
float rad = i * PI / 180.0;
int outputValue = 127 + 127 * sin(rad);// 生成正弦波信号
analogWrite(DAC_PIN, outputValue);// 输出到 DAC
delay(10);// 控制波形频率
}
}
用OPAMP放大DAC信号代码
#include <OPAMP.h>
void setup () {
OPAMP.begin(OPAMP_SPEED_HIGHSPEED);
}
void loop() {}
用ADC采集并且打印数据到串口等其他接口可上传到上位机显示曲线代码
// 定义模拟输入引脚
const int analogPin = A0; // 可以选择A0到A5的任意引脚
void setup() {
// 初始化串口通信
Serial.begin(9600);
}
void loop() {
// 读取模拟输入引脚的值
int sensorValue = analogRead(analogPin);
// 将读取的值发送到串口监视器
//Serial.print("Analog reading: ");
Serial.println(sensorValue);
// 延迟一段时间,以便读取数据的间隔更明显
delay(100); // 延迟0.1秒
}
6.2.3 效果图
1、https://bbsvideo.eeworld.com.cn/2024082623/c/67a0f626316f.mp4
2、
3、
4、
6.2.4 帖子链接
6.2.4.1 https://bbs.eeworld.com.cn/thread-1292150-1-1.html
6.2.4.2 https://bbs.eeworld.com.cn/thread-1292151-1-1.html
6.2.4.3 https://bbs.eeworld.com.cn/thread-1292152-1-1.html
6.2.4.4 https://bbs.eeworld.com.cn/thread-1291640-1-1.html
6.3 通过Wi-Fi,利用MQTT协议接入到开源的智能家居平台HA(HomeAssistant)
6.3.1 任务简介
这个任务主要学习了如果使用HA,HA设备如何接入,因为实验中使用了群晖NAS的Docker,存在一定的缺陷,所以导致只有一种设备接入配置的方式(发送配置的MQTT指令),实际上还可以修改配置文件来达到添加设备的目的。
6.3.2 代码片段
#include <WiFi.h>
char ssid[] = "CMCC-NxAn"; // your network SSID (name)
char pass[] = "mhcsm2m4"; // your network password
void setup() {
Serial.begin(9600);
while (!Serial) {
;
}
// Connect to WiFi
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
// failed, retry
Serial.print(".");
delay(5000);
}
Serial.println("\nYou're connected to the network");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("Gateway IP: ");
Serial.println(WiFi.gatewayIP());
Serial.print("Subnet Mask: ");
Serial.println(WiFi.subnetMask());
Serial.println();
}
void loop() {
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
delay(1000);
}
6.3.3 效果图
6.3.4 帖子链接
https://bbs.eeworld.com.cn/thread-1292197-1-1.html
6.4 通过外部LTR-329 环境光传感器,上传光照度到HA,通过HA面板显示数据
6.4.1 任务简介
首先给Arduino 连接wifi、读取光照数据,显示光照数据。这个任务难度就比较友好,不过可以学习的地方有很多,可以深入了解MQTT协议。
6.4.2 代码片段
#include "Adafruit_LTR329_LTR303.h"
Adafruit_LTR329 ltr = Adafruit_LTR329();
#include <WiFi.h>
#include <ArduinoMqttClient.h>
char ssid[] = "CMCC-NxAn"; // your network SSID (name)
char pass[] = "mhcsm2m4"; // your network password
char mqtt_user[] = "ject";
char mqtt_pass[] = "ject6666";
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
const char broker[] = "192.168.124.4"; // MQTT broker address
int port = 1883;
const char subscribe_topic[] = "/hello";
const char publish_topic_ltr329_visible_light[] = "homeassistant/sensor/ltr329_visible_light/state";
const char publish_topic_ltr329_ir_light[] = "homeassistant/sensor/ltr329_ir_light/state";
void setup() {
Serial.begin(115200);
Serial.println("Adafruit LTR-329 light sensor test");
//连接WIFI
// Connect to WiFi
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
// failed, retry
Serial.print(".");
delay(5000);
}
Serial.println("\nYou're connected to the network");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("Gateway IP: ");
Serial.println(WiFi.gatewayIP());
Serial.print("Subnet Mask: ");
Serial.println(WiFi.subnetMask());
Serial.print("MAC Address: ");
//Serial.println(WiFi.macAddress());
Serial.println();
//连接MQTT
// Set MQTT username and password
mqttClient.setUsernamePassword(mqtt_user, mqtt_pass);
Serial.print("Attempting to connect to the MQTT broker.");
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
while (1);
}
Serial.println("You're connected to the MQTT broker!");
Serial.print("Subscribing to topic: ");
Serial.println(subscribe_topic);
// Subscribe to a topic
mqttClient.subscribe(subscribe_topic);
Serial.print("Waiting for messages on topic: ");
Serial.println(subscribe_topic);
if (!ltr.begin()) {
Serial.println("Couldn't find LTR sensor!");
while (1) delay(10);
}
Serial.println("Found LTR sensor!");
// 设置默认增益、积分时间和测量速率
ltr.setGain(LTR3XX_GAIN_2); // 默认增益
ltr.setIntegrationTime(LTR3XX_INTEGTIME_100); // 默认积分时间
ltr.setMeasurementRate(LTR3XX_MEASRATE_200); // 默认测量速率
}
void loop() {
if (ltr.newDataAvailable()) {
uint16_t visible_plus_ir, infrared;
bool valid = ltr.readBothChannels(visible_plus_ir, infrared);
if (valid) {
Serial.print("CH0 Visible + IR: ");
Serial.print(visible_plus_ir);
Serial.print("\t\tCH1 Infrared: ");
Serial.println(infrared);
publishMessage_ltr329_visible_light(String(visible_plus_ir));
publishMessage_ltr329_ir_light(String(infrared));
}
}
delay(1000); // 延时以避免数据更新过于频繁
}
// Function to publish a message to the MQTT broker
//发布所有可见光信息
void publishMessage_ltr329_visible_light(const String &message) {
mqttClient.beginMessage(publish_topic_ltr329_visible_light);
mqttClient.print(message);
mqttClient.endMessage();
}
// Function to publish a message to the MQTT broker
//发布红外光信息
void publishMessage_ltr329_ir_light(const String &message) {
mqttClient.beginMessage(publish_topic_ltr329_ir_light);
mqttClient.print(message);
mqttClient.endMessage();
}
6.4.3 效果图
6.4.4 帖子链接
https://bbs.eeworld.com.cn/thread-1292368-1-1.html
6.5 通过外部SHT40温湿度传感器,上传温湿度到HA,通过HA面板显示数据
6.5.1 任务简介
这个任务的流程与上一个一模一样,差别在于不同的外设,任务难度比较友好,SHT40是SHT30的升级款,Ada封装的库,更方便开发者应用与集成功能。
6.5.2 代码片段
#include "Adafruit_SHT4x.h"
Adafruit_SHT4x sht4 = Adafruit_SHT4x();
#include <WiFi.h>
#include <ArduinoMqttClient.h>
char ssid[] = "CMCC-NxAn"; // your network SSID (name)
char pass[] = "mhcsm2m4"; // your network password
char mqtt_user[] = "ject";
char mqtt_pass[] = "ject6666";
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
const char broker[] = "192.168.124.4"; // MQTT broker address
int port = 1883;
const char subscribe_topic[] = "/hello";
const char publish_topic_sht40_temperature[] = "homeassistant/sensor/sht40_temperature/state";
const char publish_topic_sht40_humidity[] = "homeassistant/sensor/sht40_humidity/state";
void setup() {
//打开串口
Serial.begin(115200);
while (!Serial)
delay(10); // will pause Zero, Leonardo, etc until serial console opens
//连接WIFI
// Connect to WiFi
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
// failed, retry
Serial.print(".");
delay(5000);
}
Serial.println("\nYou're connected to the network");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.print("Gateway IP: ");
Serial.println(WiFi.gatewayIP());
Serial.print("Subnet Mask: ");
Serial.println(WiFi.subnetMask());
Serial.print("MAC Address: ");
//Serial.println(WiFi.macAddress());
Serial.println();
//连接MQTT
// Set MQTT username and password
mqttClient.setUsernamePassword(mqtt_user, mqtt_pass);
Serial.print("Attempting to connect to the MQTT broker.");
if (!mqttClient.connect(broker, port)) {
Serial.print("MQTT connection failed! Error code = ");
Serial.println(mqttClient.connectError());
while (1);
}
Serial.println("You're connected to the MQTT broker!");
Serial.print("Subscribing to topic: ");
Serial.println(subscribe_topic);
// Subscribe to a topic
mqttClient.subscribe(subscribe_topic);
Serial.print("Waiting for messages on topic: ");
Serial.println(subscribe_topic);
//连接SHT40
Serial.println("SHT40 测试");
if (! sht4.begin()) {
Serial.println("无法访问SHT40");
while (1) delay(1);
}
Serial.println("开始读取SHT40序列号");
Serial.print("SHT40的序列号是:");
Serial.println(sht4.readSerial(), HEX);
sensors_event_t humidity, temp;
uint32_t timestamp = millis();
sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
timestamp = millis() - timestamp;
Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C");
Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH");
Serial.print("Read duration (ms): ");
Serial.println(timestamp);
delay(1000);
}
void loop() {
// put your main code here, to run repeatedly:
sensors_event_t humidity, temp;
uint32_t timestamp = millis();
sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data
timestamp = millis() - timestamp;
Serial.print("Temperature: "); Serial.print(temp.temperature); Serial.println(" degrees C");
Serial.print("Humidity: "); Serial.print(humidity.relative_humidity); Serial.println("% rH");
Serial.print("Read duration (ms): ");
Serial.println(timestamp);
delay(1000);
publishMessage_sht40_temperature(String(temp.temperature));
publishMessage_sht40_humidity(String(humidity.relative_humidity));
}
// Function to publish a message to the MQTT broker
//发布温度信息
void publishMessage_sht40_temperature(const String &message) {
mqttClient.beginMessage(publish_topic_sht40_temperature);
mqttClient.print(message);
mqttClient.endMessage();
}
// Function to publish a message to the MQTT broker
//发布湿度信息
void publishMessage_sht40_humidity(const String &message) {
mqttClient.beginMessage(publish_topic_sht40_humidity);
mqttClient.print(message);
mqttClient.endMessage();
}
6.5.3 效果图
6.5.4 帖子链接
https://bbs.eeworld.com.cn/thread-1292361-1-1.html
7、代码合计
整个任务所有代码合计
8、本次活动心得体会(写在最后)
通过这次Followme的活动,很开心可以顺利的完成,这次活动对于我个人自身,自己的代码水平也在一定程度上有提升,从以前每次点完编译不知道对错,到这一次很轻松的完成这些代码。对Arduino也有更深入的理解,对Adafruit系列的传感器也理解的更多。对HA也有更深入的理解与学习,这与在申请这个项目时写的目的已基本达到。
这次使用到了示波器,学会了如何使用,对今后的开发应该会更进一步。
对于本次的活动建议,我觉得官方虽然已经做了很大的努力为申请的用户提供完成任务的便利,但是如果可以在一个特定区域指出出题的目的,可能可以让学习者更好的理解出题人的用意。这应该属于良性发展的一条途径,中间例如ADC、DAC这种专业词汇以及用法,对于非科班出身真的很陌生,也有一丝丝的迷茫。虽然最后都完成了。但是学习过程中也确实有些坎坷。
-
加入了学习《Follow Me 第二季第二期总结视频》,观看 follow me 集合
- 2024-09-25
-
回复了主题帖:
【2024 DigiKey 创意大赛】开箱帖:树莓派5、ESP32C6和nRF52840 Dongle
walker2048 发表于 2024-9-23 19:54
nRF52840 Dongle其实不大建议买
是因为不好用吗?又贵
-
发表了主题帖:
【2024 DigiKey 创意大赛】基于Raspberry 5工业传感网关系统的设计 物料开箱
本帖最后由 JectXie 于 2024-9-25 13:08 编辑
# 【2024 DigiKey 创意大赛】 基于Raspberry 5工业传感网关系统的设计 物料开箱 系统安装
感谢EE World 感谢得捷,让我可以有这种机会参加这种活动。
这是一个开箱贴,这些物料飘洋过海从太平洋西部一路坐飞机通过UPS到国内再转顺丰,才到我的手上。历尽千辛万苦,昨天终于拿到了。
买了个新内存卡,装了新系统,解锁了个新软件(IDM)昨天晚上学到的多线程下载,真牛
下好了以后,遇到个新问题,没有5V 5A的电源,所以提示电源有问题。后面买的以及在路上了。
开箱贴就先到这了。
- 2024-09-16
-
加入了学习《Follow me第二季第2期视频演示》,观看 演示视频
- 2024-09-14
-
回复了主题帖:
树莓派5开启一直卡在限流,求教各位大佬支招
tagetage 发表于 2024-9-14 09:27
你没说是树莓派几代,没说插在USB2.0还是3.0的口上,没说你USB插了哪些设备,这么关键的问题都没说,没法帮 ...
他不是说了5吗?