Skip to content
Snippets Groups Projects
Commit d273fdef authored by Moritz Perschke's avatar Moritz Perschke
Browse files

Merge branch 'rs485_finalization' into 'develop'

Rs485 finalization

See merge request !15
parents 920deb65 c3cbbd46
No related branches found
No related tags found
4 merge requests!39Merge Develop into Main,!19development into master,!17Inital Host, initial Client,!15Rs485 finalization
......@@ -317,29 +317,31 @@ String RainGaugeSensor::getPrecipitationStr()
return getValueStr((float)(precipitation / 10.0));
}
word SoilMoistureSensor::getMoistureTemp()
float SoilMoistureSensor::getMoistureTemp()
{
readRegister(0, 2); // start register at 0, read 2 variables (vwc, soil temp)
moistureRaw = word(answerFrame[3], answerFrame[4]);
moistureRaw = (answerFrame[3] << 8) + answerFrame[4];
// TODO: neg. temp check
if (answerFrame[5] < 0x80)
{
temperatureRaw = word(answerFrame[5], answerFrame[6]);
temperatureRaw = (answerFrame[5] << 8) + answerFrame[6];
}
else
{
temperatureRaw = word(answerFrame[5], answerFrame[6]) - 65536;
temperatureRaw = (answerFrame[5]<<8) + answerFrame[6] - 65536;
}
Serial.begin(115200);
Serial.print("Soil moisture: ");
Serial.print((moistureRaw - moistureOffset) / 10.0, 1);
Serial.println(" %");
Serial.print("Temperature: ");
Serial.print((temperatureRaw - temperatureOffset) / 10.0 , 1);
Serial.println(" °C");
return temperatureRaw;
return (temperatureRaw - temperatureOffset) / 10.0;
}
word SoilMoistureSensor::getMoisture(){
return moistureRaw - moistureOffset;
float SoilMoistureSensor::getMoisture(){
return (moistureRaw - moistureOffset) / 10.0;
}
String SoilMoistureSensor::getMoistureStr()
......
......@@ -60,17 +60,17 @@ class SoilMoistureSensor : public SentecSensorRS485
public:
using SentecSensorRS485::SentecSensorRS485;
// vwc: volumetric water content [%]
word moistureRaw = 0;
uint16_t moistureRaw = 0;
int moistureOffset = 0;
// soil temperature [deg C]
int temperatureRaw = 0;
int temperatureOffset = 0;
word getMoistureTemp();
word getMoisture();
float getMoistureTemp();
float getMoisture();
String getMoistureStr();
String getTemperatureStr();
};
#endif
\ No newline at end of file
#endif
......@@ -64,11 +64,11 @@ void on_data_recv(const uint8_t *mac, const uint8_t *incomingData, int len)
received_msg.epoch_seconds); // see https://www.esp32.com/viewtopic.php?t=9965, maybe this needs an offset
Serial.println(Time::getInstance().getEpochSeconds());
if (!preferences.isKey("host")) {
preferences.putBytes("host", received_msg.host, sizeof(received_msg.host));
ESP_LOGI(TAG, "host MAC address saved to flash");
preferences.putBytes("host", received_msg.host, sizeof(received_msg.host));
ESP_LOGI(TAG, "host MAC address saved to flash");
// add host to peers
add_host_to_peers(received_msg);
// add host to peers
add_host_to_peers(received_msg);
}
}
case hostChange:{
......@@ -80,10 +80,17 @@ void on_data_recv(const uint8_t *mac, const uint8_t *incomingData, int len)
esp_now_del_peer(old);
}
// add new host
preferences.putBytes("host", received_msg.host, sizeof(received_msg.host));
ESP_LOGI(TAG, "Host Mac address saved to flash:");
for(int i=0; i<6; i++){
Serial.print(received_msg.host[i], HEX);
Serial.print(":");
}
Serial.println();
add_host_to_peers(received_msg);
}
default:{
return;
break;
}
}
preferences.end();
......@@ -110,7 +117,6 @@ esp_err_t espnow_setup()
hostInfo.encrypt = false;
esp_now_add_peer(&hostInfo);
preferences.clear();
esp_now_register_recv_cb(on_data_recv);
esp_now_register_send_cb(on_data_sent);
......
......@@ -8,7 +8,7 @@
#define POWER_SWITCH_PIN_12V 12
#define POWER_SWITCH_PIN_5V 13
// Configer sensors
// Configure sensors
SoftwareSerial RS485Serial(TXPin, RXPin);
SolarRadiationSensor solarSensor(&RS485Serial, 1, RE_DE_PIN);
RainGaugeSensor rainGauge = RainGaugeSensor(&RS485Serial, 2, RE_DE_PIN); // Give 2 Sensor Adress 2
......@@ -35,33 +35,43 @@ out_data_rs485 Forte_RS485::readData()
// Wait for sensors to power up
// TODO minimize delay
delay(500);
data.solarRadiation = solarSensor.getSolarRadiation();
data.moisture = soilSensor4.getMoisture();
data.moisture_temperature = soilSensor3.getMoistureTemp();
data.moisture_temperature = soilSensor4.getMoistureTemp();
data.moisture_temperature = soilSensor5.getMoistureTemp();
data.precipitation = rainGauge.getInstantaneousPrecipitation();
out_data_rs485 output;
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 data;
return output;
}
std::list<Message> Forte_RS485::buildMessages()
{
std::list<Message> messages;
MeasurementData moisture {data.moisture,0,{},measurementTypeToString.at(MeasurementType::MOISTURE)};
MeasurementData moisture_temperature {data.moisture_temperature,0,{},measurementTypeToString.at(MeasurementType::MOISTURE_TEMPERATURE)};
MeasurementData solarRadiation {data.solarRadiation,0,{},measurementTypeToString.at(MeasurementType::SOLARRADIATION)};
MeasurementData precipation {data.precipitation,0,{},measurementTypeToString.at(MeasurementType::PRECIPITATION)};
messages.emplace_back(Message{moisture ,sensorInformation, 0});
messages.emplace_back(Message{moisture_temperature ,sensorInformation, 0});
messages.emplace_back(Message{solarRadiation ,sensorInformation, 0});
messages.emplace_back(Message{precipation,sensorInformation, 0});
ESP_LOGE(sensorInformation.getSensorName().c_str(), "test");
out_data_rs485 output = readData();
MeasurementData solarRadiation {output.solarRadiation, measurementTypeToString.at(MeasurementType::SOLAR_RADIATION)};
MeasurementData soilTemp3{output.soilTemperature3, measurementTypeToString.at(MeasurementType::SOIL_TEMPERATURE_3)};
MeasurementData soilTemp4 {output.soilTemperature4, measurementTypeToString.at(MeasurementType::SOIL_TEMPERATURE_4)};
MeasurementData soilTemp5 {output.soilTemperature5, measurementTypeToString.at(MeasurementType::SOIL_TEMPERATURE_5)};
MeasurementData soilMoisture3 {output.soilMoisture3, measurementTypeToString.at(MeasurementType::SOIL_MOISTURE_3)};
MeasurementData soilMoisture4 {output.soilMoisture4, measurementTypeToString.at(MeasurementType::SOIL_MOISTURE_4)};
MeasurementData soilMoisture5 {output.soilMoisture5, measurementTypeToString.at(MeasurementType::SOIL_MOISTURE_5)};
messages.emplace_back(Message{solarRadiation,sensorInformation, Time::getInstance().getEpochSeconds()});
messages.emplace_back(Message{soilTemp3,sensorInformation, Time::getInstance().getEpochSeconds()});
messages.emplace_back(Message{soilTemp4,sensorInformation, Time::getInstance().getEpochSeconds()});
messages.emplace_back(Message{soilTemp5,sensorInformation, Time::getInstance().getEpochSeconds()});
messages.emplace_back(Message{soilMoisture3,sensorInformation, Time::getInstance().getEpochSeconds()});
messages.emplace_back(Message{soilMoisture4,sensorInformation, Time::getInstance().getEpochSeconds()});
messages.emplace_back(Message{soilMoisture5,sensorInformation, Time::getInstance().getEpochSeconds()});
return messages;
}
......
......@@ -5,29 +5,20 @@
// RTC (I2C)
#include "RTClib.h"
#include "Message.hpp"
#include "Protocol.hpp"
#include "SensorInformation.hpp"
#include "SentecSensors.h"
#include "ForteSensor.hpp"
#include "SentecSensors.h"
struct out_data_rs485{
word solarRadiation;
word moisture;
word moisture_temperature;
word precipitation;
float solarRadiation;
float soilMoisture3;
float soilTemperature3;
float soilMoisture4;
float soilTemperature4;
float soilMoisture5;
float soilTemperature5;
float precipitation;
};
/*
class Forte_RS485 : public ForteSensor<out_data_rs485> {
public:
void setup();
out_data_rs485 read_data();
private:
out_data_rs485 data;
};
*/
class Forte_RS485 : public ForteSensor <out_data_rs485> {
public:
void setup() override;
......@@ -37,15 +28,27 @@ class Forte_RS485 : public ForteSensor <out_data_rs485> {
private:
const SensorInformation sensorInformation{"RS485", Protocol::RS485};
out_data_rs485 data;
enum class MeasurementType { MOISTURE,MOISTURE_TEMPERATURE,SOLARRADIATION,PRECIPITATION};
enum class MeasurementType {
SOLAR_RADIATION,
SOIL_MOISTURE_3,
SOIL_TEMPERATURE_3,
SOIL_MOISTURE_4,
SOIL_TEMPERATURE_4,
SOIL_MOISTURE_5,
SOIL_TEMPERATURE_5,
PRECIPITATION
};
std::map<MeasurementType, const char *> measurementTypeToString = {
{MeasurementType::MOISTURE, "MOISTURE"},
{MeasurementType::MOISTURE_TEMPERATURE, "MOISTURE_TEMPERATURE"},
{MeasurementType::SOLARRADIATION, "SOLARRADIATION"},
{MeasurementType::PRECIPITATION, "PRECIPATION"}
{MeasurementType::SOLAR_RADIATION, "SOLAR_RADIATION"},
{MeasurementType::SOIL_MOISTURE_3, "SOIL_MOISTURE_3"},
{MeasurementType::SOIL_TEMPERATURE_3, "SOIL_TEMPERATURE_3"},
{MeasurementType::SOIL_MOISTURE_4, "SOIL_MOISTURE_4"},
{MeasurementType::SOIL_TEMPERATURE_4, "SOIL_TEMPERATURE_4"},
{MeasurementType::SOIL_MOISTURE_5, "SOIL_MOISTURE_5"},
{MeasurementType::SOIL_TEMPERATURE_5, "SOIL_TEMPERATURE_5"},
{MeasurementType::PRECIPITATION, "PRECIPATION"}
};
};
#endif
\ No newline at end of file
......@@ -8,33 +8,18 @@
Forte_RS485 rs485;
void setup()
{
rs485.setup();
espnow_setup();
out_data_rs485 data_rs485 = rs485.readData();
Serial.println("***********************************************************");
Serial.print("Moisture: ");
Serial.println(data_rs485.moisture);
Serial.print("Moisture Temperature: ");
Serial.println(data_rs485.moisture_temperature);
Serial.print("Solar: ");
Serial.println(data_rs485.solarRadiation);
Serial.print("Rain mm: ");
Serial.println(data_rs485.precipitation);
// send the data
// moistere 1
// moisture_temperature 2
// solarRadiation 3
// precipitation 4
try {
espnow_setup();
}
void loop() {
try {
auto messages = rs485.buildMessages();
for (const Message &message : messages) {
if(message.send() != ESP_OK){
RtcMemory::store(message.getMessageAsMinifiedJsonString());
......@@ -55,5 +40,3 @@ try {
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
esp_deep_sleep_start();
}
void loop() {}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment