【2024 DigiKey创意大赛】基于Raspberry 5工业传感网关系统的设计-各项传感器数据采集
[复制链接]
本帖最后由 JectXie 于 2024-10-21 23:03 编辑
本项目用到的各项传感器,
1、FST红外温度传感器(主要用于无法安装接触式传感器测温场景)
1.2 这是一个工业级Modbus红外测温传感器。下面是ESP32 驱动串口、写入接收Modbus数据,拿到温度数据的代码
- #include <SoftwareSerial.h>
-
-
- SoftwareSerial mod(16, 17);
-
-
- 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;
- }
- }
- return result;
- }
-
-
- float IEEE754_to_decimal(uint32_t source) {
- uint8_t sign = (uint8_t)((source & 0x80000000) >> 31);
- uint8_t index = (uint8_t)((source & 0x7F800000) >> 23);
- uint32_t mantissa = (source & 0x007FFFFF);
- float decimal = tow_to_ten(mantissa);
-
-
- return pow(-1, sign) * (1 + decimal) * pow(2, (index - 127));
- }
-
-
- void GetfstSenesorData() {
- float fstTemperature, FstTemperatureFahrenheit;
-
- Serial.println("state=2常规工作模式-------------菲尔斯特探头工作模式");
- unsigned int data[9];
- delay(10);
-
-
- if (mod.write(ModFstReadBuffer, sizeof(ModFstReadBuffer)) == 8) {
- Serial.println("写入串口数据成功");
- Serial.println("----------1----------↓");
-
-
- 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;
-
-
- 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() {
-
- Serial.begin(115200);
- mod.begin(9600);
- }
-
- void loop() {
-
- 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>
-
-
-
-
-
-
-
- Adafruit_SGP30 sgp;
-
- void setup() {
- Serial.begin(115200);
-
-
- if (!sgp.begin()) {
- Serial.println("Failed to find SGP30 chip");
- while (1) {
- delay(10);
- }
- }
-
-
- sgp.IAQinit();
- }
-
- void loop() {
-
- 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、BME680模组 (这是我的第二个必选模组)

BME680 是一款由 Bosch Sensortec 生产的多合一环境传感器,可以测量温度、湿度、气压、气体
下面是ESP32 读取这些参数的代码
- #include <Wire.h>
- #include <Adafruit_Sensor.h>
- #include <Adafruit_BME680.h>
-
- Adafruit_BME680 bme;
-
- 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);
- }
-
4、SHT40 这是一款高精度的温湿度传感器,可以读取温度和湿度。I2C协议,
这是SHT30的升级款,代码也有改动。下面是示例代码
- #include <Wire.h>
- #include <Adafruit_SHT4x.h>
-
- Adafruit_SHT4x sht4x;
-
- void setup() {
- Serial.begin(115200);
-
-
- 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);
- }
-
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通过网络将数据传输到工业传感器网关
|