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 @@
@@ -3,82 +3,132 @@
#include "NoDataAvailableException.hpp"
#include "NoDataAvailableException.hpp"
#include "rs485.hpp"
#include "rs485.hpp"
#include <list>
#include <list>
 
#include <ina219.hpp>
static const char *TAG = "MAIN";
static const char *TAG = "MAIN";
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to 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) */
#define TIME_TO_SLEEP 5 * 1 /* Time ESP32 will go to sleep (in seconds) */
Forte_RS485 rs485;
Forte_RS485 rs485;
 
ForteINA219 ina219;
float getBatteryVoltage()
float getBatteryVoltage() {
{
//************ Measuring Battery Voltage ***********
//************ Measuring Battery Voltage ***********
// reference voltage of microcontroller 3.3v for esp32
// reference voltage of microcontroller 3.3v for esp32
const float reference_vcc = 3.3;
const float reference_vcc = 3.3;
// value of R2 resistor [kOhm]
// value of R2 resistor [kOhm]
const float bat_res_gnd = 20;
const float bat_res_gnd = 20;
// value of R1 resistor [kOhm]
// value of R1 resistor [kOhm]
const float bat_res_vcc = 68;
const float bat_res_vcc = 68;
// max ADC value
// max ADC value
const int adc = 4095;
const int adc = 4095;
float sample = 0;
float sample = 0;
// Get 100 analog read to prevent unusefully read
// Get 100 analog read to prevent unusefully read
for (int i = 0; i < 100; i++) {
for (int i = 0; i < 100; i++) {
sample =
sample = sample + analogRead(35); // read the voltage from the divider circuit
sample + analogRead(35); // read the voltage from the divider circuit
delay(2);
delay(2);
}
}
sample = sample / 100;
sample = sample / 100;
float battery_voltage = (sample / 4095 * reference_vcc * (bat_res_vcc + bat_res_gnd) / bat_res_gnd);
float battery_voltage =
ESP_LOGI(TAG, "Battery Voltage: %4.2f V", battery_voltage);
(sample / 4095 * reference_vcc * (bat_res_vcc + bat_res_gnd)
ESP_LOGD(TAG, "ADC mean Value: %4.2f", sample);
/ bat_res_gnd);
return battery_voltage;
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
// 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
// the idea of types and declarations
void send_msgs(const std::__cxx11::list<Message> msgs)
void send_msgs(const std::__cxx11::list<Message> msgs) {
{
for (const Message &msg: msgs) {
for (const Message &msg : msgs) {
if (msg.send() != ESP_OK) {
if (msg.send() != ESP_OK) {
RtcMemory::store_data(msg.getMessageAsMinifiedJsonString());
RtcMemory::store_data(msg.getMessageAsMinifiedJsonString());
}
}
unsigned long ts = millis();
unsigned long ts = millis();
// it takes ~110ms for receiving an acknowledgement by the host in perfect conditions
// it takes ~110ms for receiving an acknowledgement by the host in perfect conditions
uint16_t message_timeout = 2000;
uint16_t message_timeout = 2000;
while (!was_msg_received()) {
while (!was_msg_received()) {
if ((millis() - ts) > message_timeout) {
if ((millis() - ts) > message_timeout) {
RtcMemory::store_data(msg.getMessageAsMinifiedJsonString());
RtcMemory::store_data(msg.getMessageAsMinifiedJsonString());
ESP_LOGE(TAG, "Timeout: Host not available\n");
ESP_LOGE(TAG, "Timeout: Host not available\n");
break;
break;
}
}
}
}
ESP_LOGD(TAG, "Time until acknowledgement: %ld", millis() - ts);
ESP_LOGD(TAG, "Time until acknowledgement: %ld", millis() - ts);
}
}
}
}
void setup()
void setup() {
{
// whole loop should be around ~3000 ms
// whole loop should be around ~3000 ms
Serial.begin(115200);
Serial.begin(115200);
rs485.setup();
rs485.setup();
getBatteryVoltage();
getBatteryVoltage();
// ~2100ms
ina219.setup();
try {
ina219.setPinSetup({21, 22});
auto messages = rs485.buildMessages();
espnow_setup();
// ~2100ms
send_msgs(messages);
try {
} catch (const NoDataAvailableException &e) {
auto messages = rs485.buildMessages();
std::cerr << e.what() << '\n';
// 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(),
ESP_LOGD(TAG, "Going to sleep for %d seconds", TIME_TO_SLEEP);
Message::nullMessage(), Message::nullMessage(),
Message::nullMessage()};
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
std::array<Message, 6> messages_2 =
esp_deep_sleep_start();
{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() {}
void loop() {}
Loading