From e525a823dc70f9421a78782c4dc1ae0ffad75be4 Mon Sep 17 00:00:00 2001 From: Austin Morlan Date: Thu, 21 May 2020 21:44:29 -0700 Subject: [PATCH] Part 5: Battery --- src/CMakeLists.txt | 1 + src/main.c | 16 ++++++++++ src/odroid/battery.c | 73 ++++++++++++++++++++++++++++++++++++++++++++ src/odroid/battery.h | 10 ++++++ 4 files changed, 100 insertions(+) create mode 100644 src/odroid/battery.c create mode 100644 src/odroid/battery.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 80e9f56..53ac103 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,7 @@ idf_component_register( SRCS "main.c" + "odroid/battery.c" "odroid/display.c" "odroid/input.c" "odroid/sdcard.c" diff --git a/src/main.c b/src/main.c index 6fc69c8..1b8e607 100644 --- a/src/main.c +++ b/src/main.c @@ -1,3 +1,4 @@ +#include "odroid/battery.h" #include "odroid/display.h" #include "odroid/input.h" #include "odroid/sdcard.h" @@ -16,6 +17,7 @@ void app_main(void) Odroid_InitializeInput(); Odroid_InitializeDisplay(); Odroid_InitializeSdcard(); + Odroid_InitializeBatteryReader(); // Load sprite uint16_t* sprite = (uint16_t*)malloc(64 * 64 * sizeof(uint16_t)); @@ -95,6 +97,20 @@ void app_main(void) fclose(snapFile); } + + uint32_t batteryLevel = Odroid_ReadBatteryLevel(); + ESP_LOGI(LOG_TAG, "Battery level: %u\n", batteryLevel); + + if (batteryLevel < 3600) + { + Odroid_EnableBatteryLight(); + } + else + { + Odroid_DisableBatteryLight(); + } + + Odroid_DrawFrame(gFramebuffer); } diff --git a/src/odroid/battery.c b/src/odroid/battery.c new file mode 100644 index 0000000..b06f23b --- /dev/null +++ b/src/odroid/battery.c @@ -0,0 +1,73 @@ +#include "battery.h" +#include +#include +#include +#include + + +static const char* LOG_TAG = "OdroidBattery"; + +static const adc1_channel_t BATTERY_READ_PIN = ADC1_GPIO36_CHANNEL; +static const gpio_num_t BATTERY_LED_PIN = GPIO_NUM_2; + +static esp_adc_cal_characteristics_t gCharacteristics; + +void Odroid_InitializeBatteryReader() +{ + // Configure LED + { + gpio_config_t gpioConfig = {}; + + gpioConfig.mode = GPIO_MODE_OUTPUT; + gpioConfig.pin_bit_mask = 1ULL << BATTERY_LED_PIN; + + ESP_ERROR_CHECK(gpio_config(&gpioConfig)); + } + + // Configure ADC + { + adc1_config_width(ADC_WIDTH_BIT_12); + adc1_config_channel_atten(BATTERY_READ_PIN, ADC_ATTEN_DB_11); + adc1_config_channel_atten(BATTERY_READ_PIN, ADC_ATTEN_DB_11); + + esp_adc_cal_value_t type = esp_adc_cal_characterize( + ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &gCharacteristics); + + // The ESP32 in the Odroid Go should have its fuse set with a pre-calibrated vref + assert(type == ESP_ADC_CAL_VAL_EFUSE_VREF); + } + + ESP_LOGI(LOG_TAG, "Battery reader initialized"); +} + +uint32_t Odroid_ReadBatteryLevel(void) +{ + const int SAMPLE_COUNT = 20; + + + uint32_t raw = 0; + + for (int sampleIndex = 0; sampleIndex < SAMPLE_COUNT; ++sampleIndex) + { + raw += adc1_get_raw(BATTERY_READ_PIN); + } + + raw /= SAMPLE_COUNT; + + + // Voltage divider reports half actual voltage + uint32_t voltage = 2 * esp_adc_cal_raw_to_voltage(raw, &gCharacteristics); + + return voltage; +} + +void Odroid_EnableBatteryLight(void) +{ + gpio_set_level(BATTERY_LED_PIN, 1); +} + +void Odroid_DisableBatteryLight(void) +{ + gpio_set_level(BATTERY_LED_PIN, 0); +} + diff --git a/src/odroid/battery.h b/src/odroid/battery.h new file mode 100644 index 0000000..607fe46 --- /dev/null +++ b/src/odroid/battery.h @@ -0,0 +1,10 @@ +#pragma once + +#include + + +void Odroid_InitializeBatteryReader(void); +uint32_t Odroid_ReadBatteryLevel(void); +void Odroid_EnableBatteryLight(void); +void Odroid_DisableBatteryLight(void); +