#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; }