Skip to content
Snippets Groups Projects

Allow setting custom pins for ina219.cpp, add ina to main central mast

Merged Zoe Michaela Dietmar Pfister requested to merge ina-changes into develop
3 files
+ 126
64
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -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() {}
Loading