Skip to content
Snippets Groups Projects
Commit 17adcdcd authored by Zoe Michaela Dietmar Pfister's avatar Zoe Michaela Dietmar Pfister :gay_pride_flag:
Browse files

Merge branch 'ina-changes' into 'develop'

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

See merge request !29
parents 1f7f284a 6977432d
No related branches found
No related tags found
2 merge requests!39Merge Develop into Main,!29Allow setting custom pins for ina219.cpp, add ina to main central mast
...@@ -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() {}
#include "ina219.hpp" #include "ina219.hpp"
void ForteINA219::setup() { void ForteINA219::setup() {
Wire.begin(I2C_SDA, I2C_SCL); Wire.begin(pinSetup.sda, pinSetup.scl);
if (!ina219.init()) { if (!ina219.init()) {
// Sensor init went wrong // Sensor init went wrong
ESP_LOGW(sensorInformation.getHardwareNameString().c_str(), ESP_LOGW(sensorInformation.getHardwareNameString().c_str(),
...@@ -56,6 +56,11 @@ std::list<Message> ForteINA219::buildMessages() { ...@@ -56,6 +56,11 @@ std::list<Message> ForteINA219::buildMessages() {
return messages; return messages;
} }
void ForteINA219::setPinSetup(pin_setup_ina219 pins){
this->pinSetup = pins;
}
SensorInformation ForteINA219::getSensorInformation() const { SensorInformation ForteINA219::getSensorInformation() const {
return sensorInformation; return sensorInformation;
} }
...@@ -19,16 +19,23 @@ struct out_data_ina219 { ...@@ -19,16 +19,23 @@ struct out_data_ina219 {
bool ina219_overflow = false; bool ina219_overflow = false;
}; };
struct pin_setup_ina219 {
uint8_t sda;
uint8_t scl;
};
class ForteINA219: public ForteSensor<out_data_ina219> { class ForteINA219: public ForteSensor<out_data_ina219> {
public: public:
void setup() override; void setup() override;
out_data_ina219 readData() override; out_data_ina219 readData() override;
std::list<Message> buildMessages() override; std::list<Message> buildMessages() override;
[[nodiscard]] SensorInformation getSensorInformation() const override; [[nodiscard]] SensorInformation getSensorInformation() const override;
void setPinSetup(pin_setup_ina219 pinSetup);
private: private:
INA219_WE ina219; INA219_WE ina219;
out_data_ina219 data; out_data_ina219 data;
pin_setup_ina219 pinSetup{21, 22};
const SensorInformation const SensorInformation
sensorInformation{HardwareName::INA219, SensorProtocol::I2C}; sensorInformation{HardwareName::INA219, SensorProtocol::I2C};
const uint8_t INA219_BASE_ADDRESS = 0x40; const uint8_t INA219_BASE_ADDRESS = 0x40;
......
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