diff --git a/latest/Firmware/WiFiAdapter/bsp/bsp.h b/latest/Firmware/WiFiAdapter/bsp/bsp.h index 11003c4..d7cbf2f 100644 --- a/latest/Firmware/WiFiAdapter/bsp/bsp.h +++ b/latest/Firmware/WiFiAdapter/bsp/bsp.h @@ -14,5 +14,6 @@ void bsp_set_uart_rx_cb(uart_rx_cb_t *cb); void bsp_set_button_isr_cb(button_isr_cb_t *cb); void bsp_set_timer_cb(timer_cb_t *cb); void bsp_uart_write(const char *txt); +int bsp_read_vbat(); #endif diff --git a/latest/Firmware/WiFiAdapter/bsp/bsp_1_0.c b/latest/Firmware/WiFiAdapter/bsp/bsp_1_0.c index 4083141..0103106 100644 --- a/latest/Firmware/WiFiAdapter/bsp/bsp_1_0.c +++ b/latest/Firmware/WiFiAdapter/bsp/bsp_1_0.c @@ -2,10 +2,14 @@ #include "nvs_flash.h" #include "driver/uart.h" #include "driver/gpio.h" +#include "driver/i2c.h" #include "hal/gpio_hal.h" #include #include "freertos/timers.h" #include "esp_intr_alloc.h" +#include + +#define TAG "bsp" static uart_rx_cb_t *uart_cb = NULL; static button_isr_cb_t *btn_cb = NULL; @@ -24,6 +28,10 @@ uint8_t dtmp[RD_BUF_SIZE]; #define GPIO_GREEN_LED GPIO_NUM_4 #define GPIO_STM32_RESET_N GPIO_NUM_12 #define GPIO_STM32_TX_EN GPIO_NUM_13 +#define I2C_MASTER_SCL_IO GPIO_NUM_22 +#define I2C_MASTER_SDA_IO GPIO_NUM_21 +#define I2C_MASTER_FREQ_HZ 100000 +#define I2C_ADC_ADDRESS 0x48 void uart_rx_task(void *params) { @@ -106,15 +114,31 @@ void bsp_timer_init() xTimerStart(timer_h, 0); } +static esp_err_t i2c_master_init(void) +{ + i2c_config_t conf = + { + .mode = I2C_MODE_MASTER, + .sda_io_num = I2C_MASTER_SDA_IO, + .sda_pullup_en = GPIO_PULLUP_ENABLE, + .scl_io_num = I2C_MASTER_SCL_IO, + .scl_pullup_en = GPIO_PULLUP_ENABLE, + .master.clk_speed = I2C_MASTER_FREQ_HZ, + }; + + esp_err_t err = i2c_param_config(I2C_NUM_0, &conf); + if (err != ESP_OK) + { + return err; + } + + return i2c_driver_install(I2C_NUM_0, I2C_MODE_MASTER, 0, 0, 0); +} void bsp_hw_init() { bsp_uart_init(); - //config_gpio(GPIO_TX_BUTTON, GPIO_MODE_INPUT, false, false); - //gpio_set_direction(GPIO_TX_BUTTON, GPIO_MODE_INPUT); - //gpio_set_intr_type(GPIO_TX_BUTTON, GPIO_INTR_NEGEDGE); - config_gpio(GPIO_RED_LED, GPIO_MODE_OUTPUT, false, false); config_gpio(GPIO_GREEN_LED, GPIO_MODE_OUTPUT, false, false); config_gpio(GPIO_STM32_RESET_N, GPIO_MODE_OUTPUT_OD, false, false); @@ -122,21 +146,15 @@ void bsp_hw_init() config_gpio(GPIO_STM32_TX_EN, GPIO_MODE_OUTPUT_OD, false, false); gpio_set_level(GPIO_STM32_TX_EN, 1); + // Force a reset of the STM32 just in case gpio_set_level(GPIO_STM32_RESET_N, 0); usleep(2000); gpio_set_level(GPIO_STM32_RESET_N, 1); -#if 0 - gpio_set_direction(GPIO_RED_LED, GPIO_MODE_OUTPUT); - gpio_set_direction(GPIO_GREEN_LED, GPIO_MODE_OUTPUT); - - gpio_set_level(GPIO_RED_LED, 1); - gpio_set_level(GPIO_GREEN_LED, 1); -#endif - - //gpio_install_isr_service(0); - //gpio_isr_handler_add(GPIO_TX_BUTTON, btn_isr, NULL); bsp_timer_init(); + + if ( i2c_master_init() != ESP_OK ) + ESP_LOGE(TAG, "Unable to initialize I2C master 0"); } void bsp_reboot() @@ -144,3 +162,27 @@ void bsp_reboot() esp_restart(); } +int bsp_read_vbat() +{ + int sum = 0, cnt = 0; + + for ( int i = 0; i < 16; ++i ) + { + uint8_t result[2] = {0}; + esp_err_t err = i2c_master_read_from_device(I2C_NUM_0, I2C_ADC_ADDRESS, result, sizeof(result), 100/portTICK_PERIOD_MS); + if ( err != ESP_OK ) + { + ESP_LOGE(TAG, "Error reading from ADC: %s", esp_err_to_name(err)); + return -1; + } + int mV = (result [0] << 8 | result[1]) * 3284 / 4095; + //ESP_LOGI(TAG, "ADC reading: %.2x %.2x", result[0], result[1]); + sum += mV; + ++cnt; + } + + int v = sum/cnt * 2; // Voltage is divided by two on the board + + //return mV * 2; + return v; +} diff --git a/latest/Firmware/WiFiAdapter/main/MaianaWiFiAdapter.c b/latest/Firmware/WiFiAdapter/main/MaianaWiFiAdapter.c index eca0d4e..91a34c5 100755 --- a/latest/Firmware/WiFiAdapter/main/MaianaWiFiAdapter.c +++ b/latest/Firmware/WiFiAdapter/main/MaianaWiFiAdapter.c @@ -18,6 +18,24 @@ void one_sec_timer() esp_event_isr_post(MAIANA_EVENT, ONE_SEC_TIMER_EVENT, NULL, 0, NULL); } +static int sec_count = 0; +static float voltage = 0.0f; +static float alpha = 0.1; + +static void one_sec_handler(void *args, esp_event_base_t base, int32_t id, void *data) +{ + float v = bsp_read_vbat() / 1000.0f; + if ( sec_count == 0 ) + voltage = v; + else + voltage = alpha * v + (1.0 - alpha)*v; + + ++sec_count; + + if ( sec_count % 10 == 0 ) + ESP_LOGI("main", "Battery voltage: %.3f V", voltage); +} + void reboot_handler(void *args, esp_event_base_t base, int32_t id, void *data) { sleep(2); @@ -28,6 +46,8 @@ void app_main(void) { esp_event_loop_create_default(); esp_event_handler_register(MAIANA_EVENT, REBOOT_EVENT, reboot_handler, NULL); + esp_event_handler_register(MAIANA_EVENT, ONE_SEC_TIMER_EVENT, one_sec_handler, NULL); + //sleep(5); config_init(); @@ -36,10 +56,10 @@ void app_main(void) bsp_set_timer_cb(one_sec_timer); bsp_hw_init(); - + //bsp_read_vbat(); wifi_start(); start_httpd(); - button_init(); + //button_init(); nmea_gateway_start();