Skip to content
Snippets Groups Projects
rs485.cpp 4.35 KiB
Newer Older
Zoe Pfister's avatar
Zoe Pfister committed
#include "rs485.hpp"
#include "SentecSoilMoistureSensor.h"
#include "SentecRainGaugeSensor.h"
#include "SentecSolarRadiationSensor.h"
Zoe Pfister's avatar
Zoe Pfister committed
// RS485 control
#define RS485Serial Serial2
Zoe Pfister's avatar
Zoe Pfister committed
#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";

Zoe Pfister's avatar
Zoe Pfister committed
// 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); //.....
Zoe Pfister's avatar
Zoe Pfister committed
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);
Zoe Pfister's avatar
Zoe Pfister committed
}

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.solar = solarSensor.readData();
  output.soil3 = soilSensor3.readData();
  output.soil4 = soilSensor4.readData();
  output.soil5 = soilSensor5.readData();
  output.precipitation = rainGauge.readData();
  digitalWrite(POWER_SWITCH_PIN_12V, LOW);
  digitalWrite(POWER_SWITCH_PIN_5V, LOW);
Zoe Pfister's avatar
Zoe Pfister committed

  gpio_hold_en((gpio_num_t) POWER_SWITCH_PIN_12V);
  gpio_hold_en((gpio_num_t) POWER_SWITCH_PIN_5V);
  return output;
Zoe Pfister's avatar
Zoe Pfister committed
}

std::list<Message> Forte_RS485::buildMessages() {
  std::list<Message> messages;
  out_data_rs485 output = readData();

  Measurement solarRadiation{output.solar.solarRadiation, 1, NO_I2C_ADDRESS,
                             MeasurementType::SOLAR_RADIATION,
                             output.solar.solarError};
  Measurement precipitation
      {output.precipitation.precipitation, 2, NO_I2C_ADDRESS,
       MeasurementType::PRECIPITATION, output.precipitation.precipitationError};
  Measurement soilTemp3{output.soil3.temperature, 3, NO_I2C_ADDRESS,
                        MeasurementType::SOIL_TEMPERATURE,
                        output.soil3.soilError};
  Measurement soilTemp4{output.soil4.temperature, 4, NO_I2C_ADDRESS,
                        MeasurementType::SOIL_TEMPERATURE,
                        output.soil4.soilError};
  Measurement soilTemp5{output.soil5.temperature, 5, NO_I2C_ADDRESS,
                        MeasurementType::SOIL_TEMPERATURE,
                        output.soil5.soilError};
  Measurement soilMoisture3
      {output.soil3.moisture, 3, NO_I2C_ADDRESS, MeasurementType::SOIL_MOISTURE,
       output.soil3.soilError};
  Measurement soilMoisture4
      {output.soil4.moisture, 4, NO_I2C_ADDRESS, MeasurementType::SOIL_MOISTURE,
       output.soil4.soilError};
  Measurement soilMoisture5
      {output.soil5.moisture, 5, NO_I2C_ADDRESS, MeasurementType::SOIL_MOISTURE,
       output.soil5.soilError};

Zoe Pfister's avatar
Zoe Pfister committed

  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());
Zoe Pfister's avatar
Zoe Pfister committed

Zoe Pfister's avatar
Zoe Pfister committed
}

SensorInformation Forte_RS485::getSensorInformation() const {
  return sensorInformation;
Zoe Pfister's avatar
Zoe Pfister committed
}