diff --git a/client/client_central_mast/src/main.cpp b/client/client_central_mast/src/main.cpp index 98783b035219fb3441f97f913c932030bf01461c..c1cdd98da0cee65b8520472999c78d70ec7d442a 100644 --- a/client/client_central_mast/src/main.cpp +++ b/client/client_central_mast/src/main.cpp @@ -3,82 +3,132 @@ #include "NoDataAvailableException.hpp" #include "rs485.hpp" #include <list> +#include <ina219.hpp> static const char *TAG = "MAIN"; #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) */ +#define TIME_TO_SLEEP 5 * 1 /* Time ESP32 will go to sleep (in seconds) */ Forte_RS485 rs485; +ForteINA219 ina219; -float getBatteryVoltage() -{ - //************ Measuring Battery Voltage *********** - // 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; +float getBatteryVoltage() { + //************ Measuring Battery Voltage *********** + // 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; } // FIXME: put this in ESPNow.hpp and let stupid Markus Rampp know how you did it. After years of Python he moved past // the idea of types and declarations -void send_msgs(const std::__cxx11::list<Message> msgs) -{ - for (const Message &msg : msgs) { - - if (msg.send() != ESP_OK) { - RtcMemory::store_data(msg.getMessageAsMinifiedJsonString()); - } - unsigned long ts = millis(); - // it takes ~110ms for receiving an acknowledgement by the host in perfect conditions - uint16_t message_timeout = 2000; - while (!was_msg_received()) { - if ((millis() - ts) > message_timeout) { - RtcMemory::store_data(msg.getMessageAsMinifiedJsonString()); - ESP_LOGE(TAG, "Timeout: Host not available\n"); - break; - } - } - ESP_LOGD(TAG, "Time until acknowledgement: %ld", millis() - ts); - } +void send_msgs(const std::__cxx11::list<Message> msgs) { + for (const Message &msg: msgs) { + + if (msg.send() != ESP_OK) { + RtcMemory::store_data(msg.getMessageAsMinifiedJsonString()); + } + unsigned long ts = millis(); + // it takes ~110ms for receiving an acknowledgement by the host in perfect conditions + uint16_t message_timeout = 2000; + while (!was_msg_received()) { + if ((millis() - ts) > message_timeout) { + RtcMemory::store_data(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) { - std::cerr << e.what() << '\n'; - } - - ESP_LOGD(TAG, "Going to sleep for %d seconds", TIME_TO_SLEEP); - - esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); - esp_deep_sleep_start(); +void setup() { + // whole loop should be around ~3000 ms + Serial.begin(115200); + rs485.setup(); + + getBatteryVoltage(); + + + ina219.setup(); + ina219.setPinSetup({21, 22}); + + // ~2100ms + try { + auto messages = rs485.buildMessages(); + // split into arrays of 6 messages TODO: Make this cleaner with default constructor + std::array<Message, 6> messages_1 = + {Message::nullMessage(), Message::nullMessage(), Message::nullMessage(), + Message::nullMessage(), Message::nullMessage(), + Message::nullMessage()}; + std::array<Message, 6> messages_2 = + {Message::nullMessage(), Message::nullMessage(), Message::nullMessage(), + Message::nullMessage(), Message::nullMessage(), + Message::nullMessage()}; + + auto ina219_messages = ina219.buildMessages(); + + std::array<Message, 6> ina_array = + {Message::nullMessage(), Message::nullMessage(), Message::nullMessage(), + Message::nullMessage(), Message::nullMessage(), + Message::nullMessage()}; + + // log ina messages + for (const auto &msg: ina219_messages) { + ESP_LOGI(TAG, + "INA219 Message: %s", + msg.getMessageAsMinifiedJsonString().c_str()); + } + + + int i = 0; + for (const auto &msg: messages) { + if (i < 6) { + messages_1[i] = msg; + } else { + messages_2[i - 6] = msg; + } + i++; + } + + i = 0; + for (const auto &msg: ina219_messages) { + ina_array[i] = msg; + i++; + } + + espnow_setup(); + Message::sendMessages(messages_1); + Message::sendMessages(messages_2); + Message::sendMessages(ina_array); + + } catch (const NoDataAvailableException &e) { + std::cerr << e.what() << '\n'; + } + + ESP_LOGD(TAG, "Going to sleep for %d seconds", TIME_TO_SLEEP); + + esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); + esp_deep_sleep_start(); } void loop() {} diff --git a/client/libs/ina219/ina219.cpp b/client/libs/ina219/ina219.cpp index 6253c034074687a7919f0b7f66afde1415bf37b5..1a39ff58e7c28aa573cf864159c5efe18e93ac03 100644 --- a/client/libs/ina219/ina219.cpp +++ b/client/libs/ina219/ina219.cpp @@ -1,7 +1,7 @@ #include "ina219.hpp" void ForteINA219::setup() { - Wire.begin(I2C_SDA, I2C_SCL); + Wire.begin(pinSetup.sda, pinSetup.scl); if (!ina219.init()) { // Sensor init went wrong ESP_LOGW(sensorInformation.getHardwareNameString().c_str(), @@ -56,6 +56,11 @@ std::list<Message> ForteINA219::buildMessages() { return messages; } +void ForteINA219::setPinSetup(pin_setup_ina219 pins){ + this->pinSetup = pins; +} + + SensorInformation ForteINA219::getSensorInformation() const { return sensorInformation; } diff --git a/client/libs/ina219/ina219.hpp b/client/libs/ina219/ina219.hpp index a360948d0d98ab0b5030bb5aa8b8c4c38419cec8..3e7375cf794fd05c48f3f3a5c1c0530776391354 100644 --- a/client/libs/ina219/ina219.hpp +++ b/client/libs/ina219/ina219.hpp @@ -19,16 +19,23 @@ struct out_data_ina219 { bool ina219_overflow = false; }; +struct pin_setup_ina219 { + uint8_t sda; + uint8_t scl; +}; + class ForteINA219: public ForteSensor<out_data_ina219> { public: void setup() override; out_data_ina219 readData() override; std::list<Message> buildMessages() override; [[nodiscard]] SensorInformation getSensorInformation() const override; + void setPinSetup(pin_setup_ina219 pinSetup); private: INA219_WE ina219; out_data_ina219 data; + pin_setup_ina219 pinSetup{21, 22}; const SensorInformation sensorInformation{HardwareName::INA219, SensorProtocol::I2C}; const uint8_t INA219_BASE_ADDRESS = 0x40;