Files

156 lines
4.3 KiB
Arduino
Raw Permalink Normal View History

2026-03-31 13:17:21 +02:00
#include <Adafruit_LPS35HW.h>
const int sender = A0;
const int highThreshold = 30;
const int lowThreshold = -30;
const int time_in_ms = 10000;
bool state = false;
float offset = 0.0;
float conductance1;
float temperature = 0.0;
float pressure = 0.0;
#define LPS33_ADDRESS 0x5D
#define CTRL_REG1 0x10
#define PRESS_OUT_XL 0x28
#define PRESS_OUT_L 0x29
#define PRESS_OUT_H 0x2A
class SensorController {
public:
SensorController(int analogPin, int highThreshold, int lowThreshold, int time_in_ms)
: analogPin(analogPin), highThreshold(highThreshold), lowThreshold(lowThreshold), time_in_ms(time_in_ms) {}
void begin() {
Serial.begin(115200); // Utilisez le port série matériel (RX/TX)
Wire.begin();
Wire.beginTransmission(LPS33_ADDRESS);
Wire.write(CTRL_REG1);
Wire.write(0x90);
Wire.endTransmission();
}
void calculateOffset() {
Serial.print("Calculating offset...");
unsigned long startTime = millis();
unsigned long lastPrintTime = startTime;
float sum = 0.0;
int count = 0;
while (millis() - startTime <= time_in_ms) {
sum += analogRead(analogPin);
count++;
if (millis() - lastPrintTime >= 500) {
Serial.print('.');
lastPrintTime = millis();
}
}
offset = sum / count;
Serial.println("End!");
}
void stateUpdate() {
float newConductance = analogRead(analogPin) - offset;
if (newConductance > highThreshold && !state) {
state = true;
} else if (newConductance < lowThreshold && state) {
state = false;
}
}
float readPressure() {
Wire.beginTransmission(LPS33_ADDRESS);
Wire.write(PRESS_OUT_XL | (1 << 7));
Wire.endTransmission(false);
Wire.requestFrom(LPS33_ADDRESS, 3);
if (Wire.available() >= 3) {
uint8_t pxl = Wire.read();
uint8_t pl = Wire.read();
uint8_t ph = Wire.read();
int32_t pressure_raw = (int32_t)(int8_t)ph << 16 | (uint16_t)pl << 8 | pxl;
pressure = (float)pressure_raw / 4096.0;
}
return pressure;
}
private:
const int analogPin;
const int highThreshold;
const int lowThreshold;
const int time_in_ms;
};
SensorController sensorController(sender, highThreshold, lowThreshold, time_in_ms);
int DE_Pin = 4;
int RE_Pin = 5;
char receivedMessage[64];
int receivedMessageIndex = 0;
void send_data(const String data, const String answer) {
data.replace("\r", "");
data.replace("\n", "");
Serial.println(data + answer);
}
void rebootArduino() {
asm volatile(" jmp 0");
}
void get_message() {
while (Serial.available()) {
char receivedChar = Serial.read();
if (receivedChar == '\n') {
receivedMessage[receivedMessageIndex] = '\0'; // Null-terminate the string
receivedMessageIndex = 0;
if (strstr(receivedMessage, "#7V") != NULL) {
send_data(receivedMessage, " ARDU_RS485_07-09-2023");
} else if (strstr(receivedMessage, "#7CO") != NULL) {
send_data(receivedMessage, " progress");
sensorController.calculateOffset();
} else if (strstr(receivedMessage, "#7O") != NULL) {
send_data(receivedMessage, String(offset).c_str());
} else if (strstr(receivedMessage, "#7C") != NULL) {
send_data(receivedMessage, String(conductance1).c_str());
} else if (strstr(receivedMessage, "#7S") != NULL) {
send_data(receivedMessage, String(state).c_str());
} else if (strstr(receivedMessage, "#7RS") != NULL) {
send_data(receivedMessage, " progress");
rebootArduino();
} else if (strstr(receivedMessage, "#7P") != NULL) {
float p = sensorController.readPressure();
char pressureStr[10];
dtostrf(p, 4, 2, pressureStr);
send_data(receivedMessage, String(pressure));
} else {
send_data(receivedMessage, "?");
}
} else {
receivedMessage[receivedMessageIndex++] = receivedChar;
}
}
}
unsigned long lastSerialCheckTime = 0;
const unsigned long serialCheckInterval = 8;
void setup() {
pinMode(DE_Pin, OUTPUT);
pinMode(RE_Pin, OUTPUT);
digitalWrite(DE_Pin, 0);
digitalWrite(RE_Pin, 1);
sensorController.begin();
Serial.println("Begin");
}
void loop() {
get_message();
if (millis() - lastSerialCheckTime >= serialCheckInterval) {
lastSerialCheckTime = millis();
sensorController.stateUpdate();
sensorController.readPressure();
}
}