【发布时间】:2022-01-03 21:29:39
【问题描述】:
我正在为我的 ESP32 绘制一个非常复杂且大型的草图,并将其划分为线程和类,将所有内容拆分到不同的文件中。为简单起见,我将向您展示我的项目设置的想法。
例如,我使用 BME280 传感器来读取温度、湿度和压力值。因此,我创建了一个名为bme280.h 的头文件和一个名为bme280.cpp 的关联cpp 文件。这是两个文件的内容。
bme280.h
#ifndef BME280_H
#define BME280_H
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
typedef struct {
float temperature;
float pressure;
float humidity;
}bmeData;
class BME280_sensor {
public:
BME280_sensor();
bmeData readBmeData();
private:
Adafruit_BME280 bme;
};
#endif
bme280.cpp
#include "bme280.h"
BME280_sensor::BME280_sensor() {
bool status;
status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring!");
while (1);
}
Serial.println("BME280 sensor correctly initialized!");
}
bmeData BME280_sensor::readBmeData() {
bmeData bmeValues;
bmeValues.temperature = bme.readTemperature();
bmeValues.pressure = bme.readPressure() / 100.0F;
bmeValues.humidity = bme.readHumidity();
return bmeValues;
}
这基本上就是我使用每个传感器的方式。
现在,我的.ino 文件正忙于做其他工作,所以我使用pthread 库来创建一个不同的线程来负责读取传感器值。因此,我的.ino 文件在完成工作之前启动了这个线程,我将其命名为mainThread。这是一个例子:
file.ino
#include <pthread.h>
#include "main.h"
void setup() {
delay(1000);
Serial.begin(115200);
Serial.println("Serial initialized");
pthread_t mainThreadRef;
int mainValue;
mainValue = pthread_create(&mainThreadRef, NULL, mainThread, (void*)NULL);
if (mainValue) {
Serial.println("Main thread error occured");
}
}
void loop() {
// Some other job
}
相反,主线程是使用main.h 文件和main.cpp 文件实现的。这是一个例子:
main.h
#ifndef MAIN_H
#define MAIN_H
#include <Arduino.h>
void *mainThread();
#endif
main.cpp
#include "main.h"
#include "bme280.h"
void *mainThread() {
BME280_sensor bme;
while (1) {
bmeData bmeValues = bme.readBmeData();
Serial.println(bmeValues.temperature);
Serial.println(bmeValues.humidity);
Serial.println(bmeValues.pressure);
delay(3000);
}
}
现在,我想知道这个项目的整个结构是否良好,因为我面临着奇怪的读数,比如温度超过 100 或压力低于 0,以及其他一些奇怪的东西。更准确地说:
- 让一个线程充当主线程来完成所有工作是否“安全”?
- 为我正在使用的每个传感器设置不同的类别是不是很好,还是会干扰传感器读数?
提前感谢大家的帮助!
【问题讨论】:
标签: c++ multithreading arduino microcontroller esp32