Skip to content
Snippets Groups Projects

Develop central mast client

Merged User expired requested to merge develop-central-mast-client into develop
9 files
+ 1172
522
Compare changes
  • Side-by-side
  • Inline
Files
9
#include "Arduino.h"
#include "Arduino.h"
#include "ESPNow.hpp"
#include "ESPNow.hpp"
#include "rs485.hpp"
#include "NoDataAvailableException.hpp"
#include "NoDataAvailableException.hpp"
 
#include "rs485.hpp"
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */
static const char *TAG = "MAIN";
#define TIME_TO_SLEEP 60 /* Time ESP32 will go to sleep (in seconds) */
 
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */
 
#define TIME_TO_SLEEP 5 * 60 /* Time ESP32 will go to sleep (in seconds) */
Forte_RS485 rs485;
Forte_RS485 rs485;
void setup()
float getBatteryVoltage()
{
{
rs485.setup();
//************ Measuring Battery Voltage ***********
espnow_setup();
// reference voltage of microcontroller 3.3v for esp32
 
const float reference_vcc = 3.3;
 
// value of R2 resistor [kOhm]
 
const float bat_res_gnd = 20;
 
// value of R1 resistor [kOhm]
 
const float bat_res_vcc = 68;
 
// max ADC value
 
const int adc = 4095;
 
float sample = 0;
 
// Get 100 analog read to prevent unusefully read
 
for (int i = 0; i < 100; i++) {
 
sample = sample + analogRead(35); // read the voltage from the divider circuit
 
delay(2);
 
}
 
sample = sample / 100;
 
float battery_voltage = (sample / 4095 * reference_vcc * (bat_res_vcc + bat_res_gnd) / bat_res_gnd);
 
ESP_LOGI(TAG, "Battery Voltage: %4.2f V", battery_voltage);
 
ESP_LOGD(TAG, "ADC mean Value: %4.2f", sample);
 
return battery_voltage;
}
}
void loop() {
// FIXME: put this in ESPNow.hpp and let stupid Markus Rampp know how you did it. After years of Python he moved past
try {
// the idea of types and declarations
 
void send_msgs(const std::__cxx11::list<Message> msgs)
 
{
 
for (const Message &msg : msgs) {
auto messages = rs485.buildMessages();
if (msg.send() != ESP_OK) {
RtcMemory::store(msg.getMessageAsMinifiedJsonString());
for (const Message &message : messages) {
}
if(message.send() != ESP_OK){
unsigned long ts = millis();
RtcMemory::store(message.getMessageAsMinifiedJsonString());
// it takes ~110ms for receiving an acknowledgement by the host in perfect conditions
}
uint16_t message_timeout = 2000;
delay(5000);
while (!was_msg_received()) {
if(!was_msg_received()){
if ((millis() - ts) > message_timeout) {
RtcMemory::store(message.getMessageAsMinifiedJsonString());
RtcMemory::store(msg.getMessageAsMinifiedJsonString());
 
ESP_LOGE(TAG, "Timeout: Host not available\n");
 
break;
}
}
}
}
 
ESP_LOGD(TAG, "Time until acknowledgement: %ld", millis() - ts);
 
}
 
}
 
void setup()
 
{
 
// whole loop should be around ~3000 ms
 
Serial.begin(115200);
 
rs485.setup();
 
 
getBatteryVoltage();
 
 
// ~2100ms
 
try {
 
auto messages = rs485.buildMessages();
 
espnow_setup();
 
send_msgs(messages);
} catch (const NoDataAvailableException &e) {
} catch (const NoDataAvailableException &e) {
std::cerr << e.what() << '\n';
std::cerr << e.what() << '\n';
}
}
Serial.print("Going to sleep for secounds:");
Serial.println(TIME_TO_SLEEP);
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
ESP_LOGD(TAG, "Going to sleep for %d seconds", TIME_TO_SLEEP);
esp_deep_sleep_start();
 
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
 
esp_deep_sleep_start();
}
}
 
 
void loop() {}
Loading