-
Zoe Michaela Dietmar Pfister authoredZoe Michaela Dietmar Pfister authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
rs485.cpp 3.94 KiB
#include "rs485.hpp"
// RS485 control
#define RS485Serial Serial2
#define RXPin 14 // Serial Receive pin
#define TXPin 15 // Serial Transmit pin
#define RE_DE_PIN 19 // Line to pull high or low to receive or send data from RS485
#define POWER_SWITCH_PIN_12V 12
#define POWER_SWITCH_PIN_5V 13
static const char *TAG = "RS485";
// Configure sensors
SolarRadiationSensor solarSensor(&RS485Serial, 1, RE_DE_PIN);
RainGaugeSensor rainGauge = RainGaugeSensor(&RS485Serial,
2,
RE_DE_PIN); // Give 2 Sensor Adress 2
SoilMoistureSensor
soilSensor3 = SoilMoistureSensor(&RS485Serial, 3, RE_DE_PIN); //.....
SoilMoistureSensor soilSensor4 = SoilMoistureSensor(&RS485Serial, 4, RE_DE_PIN);
SoilMoistureSensor soilSensor5 = SoilMoistureSensor(&RS485Serial, 5, RE_DE_PIN);
void Forte_RS485::setup() {
// configure the pins to be output only
pinMode(RE_DE_PIN, OUTPUT);
pinMode(POWER_SWITCH_PIN_12V, OUTPUT);
pinMode(POWER_SWITCH_PIN_5V, OUTPUT);
RS485Serial.begin(4800, SERIAL_8N1, TXPin, RXPin);
}
out_data_rs485 Forte_RS485::readData() {
// Power on sensor
digitalWrite(POWER_SWITCH_PIN_12V, HIGH);
digitalWrite(POWER_SWITCH_PIN_5V, HIGH);
// Wait for sensors to power up
// TODO minimize delay
delay(300);
out_data_rs485 output;
unsigned long ts = millis();
output.solarRadiation = solarSensor.getSolarRadiation();
output.soilTemperature3 = soilSensor3.getMoistureTemp();
output.soilTemperature4 = soilSensor4.getMoistureTemp();
output.soilTemperature5 = soilSensor5.getMoistureTemp();
output.soilMoisture3 = soilSensor3.getMoisture();
output.soilMoisture4 = soilSensor4.getMoisture();
output.soilMoisture5 = soilSensor5.getMoisture();
output.precipitation = rainGauge.getInstantaneousPrecipitation();
digitalWrite(POWER_SWITCH_PIN_12V, LOW);
digitalWrite(POWER_SWITCH_PIN_5V, LOW);
gpio_hold_en((gpio_num_t) POWER_SWITCH_PIN_12V);
gpio_hold_en((gpio_num_t) POWER_SWITCH_PIN_5V);
return output;
}
std::list<Message> Forte_RS485::buildMessages() {
std::list<Message> messages;
out_data_rs485 output = readData();
MeasurementData
solarRadiation{output.solarRadiation, MeasurementType::SOLAR_RADIATION};
MeasurementData
soilTemp3{output.soilTemperature3, MeasurementType::SOIL_TEMPERATURE_3};
MeasurementData
soilTemp4{output.soilTemperature4, MeasurementType::SOIL_TEMPERATURE_4};
MeasurementData
soilTemp5{output.soilTemperature5, MeasurementType::SOIL_TEMPERATURE_5};
MeasurementData
soilMoisture3{output.soilMoisture3, MeasurementType::SOIL_MOISTURE_3};
MeasurementData
soilMoisture4{output.soilMoisture4, MeasurementType::SOIL_MOISTURE_4};
MeasurementData
soilMoisture5{output.soilMoisture5, MeasurementType::SOIL_MOISTURE_5};
MeasurementData
precipitation{output.precipitation, MeasurementType::PRECIPITATION};
messages.emplace_back(solarRadiation, sensorInformation,
Time::getInstance().getEpochSeconds());
messages.emplace_back(soilTemp3, sensorInformation,
Time::getInstance().getEpochSeconds());
messages.emplace_back(soilTemp4, sensorInformation,
Time::getInstance().getEpochSeconds());
messages.emplace_back(soilTemp5, sensorInformation,
Time::getInstance().getEpochSeconds());
messages.emplace_back(soilMoisture3, sensorInformation,
Time::getInstance().getEpochSeconds());
messages.emplace_back(soilMoisture4, sensorInformation,
Time::getInstance().getEpochSeconds());
messages.emplace_back(soilMoisture5, sensorInformation,
Time::getInstance().getEpochSeconds());
messages.emplace_back(precipitation,
sensorInformation,
Time::getInstance().getEpochSeconds());
return messages;
}
SensorInformation Forte_RS485::getSensorInformation() const {
return sensorInformation;
}