97 lines
2.7 KiB
C++
97 lines
2.7 KiB
C++
|
|
#include "io.hpp"
|
|
#include "logger.h"
|
|
#include "pins.hpp"
|
|
#include "WiFi.h"
|
|
#include "driver/adc.h"
|
|
#include <esp_wifi.h>
|
|
#include <esp_bt.h>
|
|
|
|
extern logging::Logger logger;
|
|
|
|
|
|
IO::IO() : oneWire(DI_DALLAS), sensors(&oneWire) {
|
|
// Constructor body (if needed)
|
|
}
|
|
|
|
#define uS_TO_S_FACTOR 1000000 /* Conversion factor for micro seconds to seconds */
|
|
#define TIME_TO_SLEEP 600
|
|
|
|
void IO::setup_io()
|
|
{
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "IO", "SETUP IO");
|
|
oneWire.begin(DI_DALLAS);
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "IO", "oneWire.begin");
|
|
sensors.begin();
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "IO", "sensors.begi");
|
|
sensors.setResolution(12);
|
|
}
|
|
|
|
void IO::set_low_power()
|
|
{
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "IO", "Set lower power attrs");
|
|
|
|
pinMode(DI_LED, OUTPUT);
|
|
digitalWrite(DI_LED, LOW); // TODO check if pin 22(ledbuiltin 2) is a led
|
|
setCpuFrequencyMhz(80);
|
|
WiFi.mode(WIFI_OFF);
|
|
btStop();
|
|
esp_wifi_stop();
|
|
esp_bt_controller_disable();
|
|
esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
|
|
adc_power_on();
|
|
}
|
|
|
|
void IO::set_deep_sleep()
|
|
{
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "IO", "Going to sleep");
|
|
esp_deep_sleep_start();
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "IO", "Will not reach");
|
|
}
|
|
|
|
uint8_t IO::read_battery()
|
|
{
|
|
uint8_t percentage = 100;
|
|
|
|
float voltage = analogRead(ADC_BATTERY) / 4096.0 * 7.46;
|
|
// float voltage = analogRead(35) / 4096.0 * 7.46;
|
|
if (voltage > 1)
|
|
{ // Only display if there is a valid reading
|
|
percentage = 2836.9625 * pow(voltage, 4) - 43987.4889 * pow(voltage, 3) + 255233.8134 * pow(voltage, 2) - 656689.7123 * voltage + 632041.7303;
|
|
if (voltage >= 4.20)
|
|
percentage = 100;
|
|
if (voltage <= 3.50)
|
|
percentage = 0;
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "io", "Voltage: %f", voltage);
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "io", "Percentage: %d", percentage);
|
|
}
|
|
|
|
return percentage;
|
|
}
|
|
|
|
float IO::read_temp()
|
|
{
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "IO", "read_temp");
|
|
sensors.requestTemperatures(); // Request temperature readings
|
|
delay(1000);
|
|
float tempC = sensors.getTempCByIndex(0);
|
|
if (tempC != DEVICE_DISCONNECTED_C)
|
|
{
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "io", "Temp: %f", tempC);
|
|
}
|
|
else if(tempC == -127.00) {
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "io", "Couldn't read temp");
|
|
}
|
|
else
|
|
{
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "io", "Couldn't read temp");
|
|
}
|
|
return tempC;
|
|
}
|
|
|
|
float IO::read_internal_temp()
|
|
{
|
|
float chipTemp = temperatureRead();
|
|
logger.log(logging::LoggerLevel::LOGGER_LEVEL_INFO, "io", "chipTemp: %f", chipTemp);
|
|
return chipTemp;
|
|
} |