Skip to content
Snippets Groups Projects
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;
}