#include #include "Decection.h" #include "esp_log.h" #include "esp_adc/adc_oneshot.h" #include "esp_adc/adc_cali.h" #include "esp_adc/adc_cali_scheme.h" #include "esp_heap_caps.h" #include "hal/adc_hal.h" #include "driver/gpio.h" #include "esp_sleep.h" const static char *TAG = "Decection"; // #include "LED.h" static int adc_raw[2][10]; static int voltage[2][10]; #define USER_KEY_CHANNEL ADC_CHANNEL_7 #define USER_ADC_CHANNEL ADC_CHANNEL_2 #define USER_ADC_UNIT ADC_UNIT_1 static bool adc_calibration_init(adc_unit_t unit, adc_atten_t atten, adc_cali_handle_t *out_handle); static void adc_calibration_deinit(adc_cali_handle_t handle); adc_cali_handle_t adc2_cali_handle = NULL; // void adc1_deinit(adc_oneshot_unit_handle_t adc_handle) // { // ESP_ERROR_CHECK(adc_oneshot_del_unit(adc_handle)); // if (do_calibration) { // adc_calibration_deinit(adc2_cali_handle); // } // } int adc_read_power_pin(adc_oneshot_unit_handle_t adc_handle) { bool do_calibration; adc_oneshot_chan_cfg_t config = { .bitwidth = ADC_BITWIDTH_DEFAULT, .atten = ADC_ATTEN_DB_11, }; do_calibration = adc_calibration_init(USER_ADC_UNIT, ADC_ATTEN_DB_11, &adc2_cali_handle); //-------------ADC Config---------------// adc_oneshot_config_channel(adc_handle, USER_ADC_CHANNEL, &config); // adc_ll_set_power_manage(ADC_POWER_BY_FSM); adc_oneshot_read(adc_handle, USER_ADC_CHANNEL, &adc_raw[0][0]); // adc_ll_set_power_manage(ADC_POWER_SW_OFF); ESP_LOGD(TAG, "ADC%d Channel[%d] Raw Data: %d", USER_ADC_UNIT + 1, USER_ADC_CHANNEL, adc_raw[0][0]); if (do_calibration) { ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc2_cali_handle, adc_raw[0][0], &voltage[0][0])); ESP_LOGD(TAG, "ADC%d Channel[%d] Cali Voltage: %d mV", USER_ADC_UNIT + 1, USER_ADC_CHANNEL, voltage[0][0]); adc_calibration_deinit(adc2_cali_handle); } int batt_percent; // 电量范围映射 float result_voltage = (float)(voltage[0][0]) / 1000.0 /*4095.0 * 3.3*/; // 假设ADC参考电压为3.3V float battery_percentage = ((result_voltage - 1.8) / (2.2 - 1.8)) * 100.0; // 限制电量范围在0%到100%之间 if (battery_percentage <= 0) { battery_percentage = 0; } else if (battery_percentage >= 100) { battery_percentage = 100; } batt_percent = (int)battery_percentage; #if 0 ESP_LOGI(TAG,"batt_percent = [%d],voltage[0][0] = [%d]",batt_percent, voltage[0][0]); #else // printf("batt_percent = [%d],voltage[0][0] = [%d],adc value %d\r\n",batt_percent, voltage[0][0],(int)battery_percentage); #endif return batt_percent; } int adc_read_left_key_pin(adc_oneshot_unit_handle_t adc_handle) { bool do_calibration; adc_oneshot_chan_cfg_t config = { .bitwidth = ADC_BITWIDTH_DEFAULT, .atten = ADC_ATTEN_DB_0, }; do_calibration = adc_calibration_init(USER_ADC_UNIT, ADC_ATTEN_DB_0, &adc2_cali_handle); //-------------ADC Config---------------// ESP_ERROR_CHECK(adc_oneshot_config_channel(adc_handle, USER_KEY_CHANNEL, &config)); // adc_ll_set_power_manage(ADC_POWER_BY_FSM); ESP_ERROR_CHECK(adc_oneshot_read(adc_handle, USER_KEY_CHANNEL, &adc_raw[0][0])); // adc_ll_set_power_manage(ADC_POWER_SW_OFF); ESP_LOGD(TAG, "ADC%d Channel[%d] Raw Data: %d", USER_ADC_UNIT + 1, USER_KEY_CHANNEL, adc_raw[0][0]); if (do_calibration) { ESP_ERROR_CHECK(adc_cali_raw_to_voltage(adc2_cali_handle, adc_raw[0][0], &voltage[0][0])); ESP_LOGD(TAG, "ADC%d Channel[%d] Cali Voltage: %d mV", USER_ADC_UNIT + 1, USER_KEY_CHANNEL, voltage[0][0]); adc_calibration_deinit(adc2_cali_handle); } int batt_percent; #if 0 //电量范围映射 float result_voltage = (float)(voltage[0][0]) / 1000.0/*4095.0 * 3.3*/; // 假设ADC参考电压为3.3V float battery_percentage = ((result_voltage - 1.5) / (2.2 - 1.5)) * 100.0; // 限制电量范围在0%到100%之间 if (battery_percentage < 0) { battery_percentage = 0; } else if (battery_percentage > 100) { battery_percentage = 100; } batt_percent = (int )battery_percentage; #if 0 ESP_LOGI(TAG,"batt_percent = [%d],voltage[0][0] = [%d]",batt_percent, voltage[0][0]); #else printf("batt_percent = [%d],voltage[0][0] = [%d],adc value %d\r\n",batt_percent, voltage[0][0],(int)battery_percentage); #endif #else printf("left key voltage:%d\r\n", voltage[0][0]); batt_percent = voltage[0][0]; #endif return batt_percent; } extern adc_oneshot_unit_handle_t adc1_handle; int read_battery_voltage() { // printf("读电量\n"); return adc_read_power_pin(adc1_handle); } /*--------------------------------------------------------------- ADC Calibration ---------------------------------------------------------------*/ static bool adc_calibration_init(adc_unit_t unit, adc_atten_t atten, adc_cali_handle_t *out_handle) { adc_cali_handle_t handle = NULL; esp_err_t ret = ESP_FAIL; bool calibrated = false; if (!calibrated) { ESP_LOGD(TAG, "calibration scheme version is %s", "Curve Fitting"); adc_cali_curve_fitting_config_t cali_config = { .unit_id = unit, .atten = atten, .bitwidth = ADC_BITWIDTH_DEFAULT, }; ret = adc_cali_create_scheme_curve_fitting(&cali_config, &handle); if (ret == ESP_OK) { calibrated = true; } } *out_handle = handle; if (ret == ESP_OK) { ESP_LOGD(TAG, "Calibration Success"); } else if (ret == ESP_ERR_NOT_SUPPORTED || !calibrated) { ESP_LOGW(TAG, "eFuse not burnt, skip software calibration"); } else { ESP_LOGE(TAG, "Invalid arg or no memory"); } return calibrated; } static void adc_calibration_deinit(adc_cali_handle_t handle) { ESP_LOGD(TAG, "deregister %s calibration scheme", "Curve Fitting"); ESP_ERROR_CHECK(adc_cali_delete_scheme_curve_fitting(handle)); } // 返回充电中状态 int decection_state_0(void) { return gpio_get_level(2); } // 返回充满状态 int decection_state_1(void) { return 0; // gpio_get_level(38); } #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" #include "SPIFFS.h" extern RTC_FAST_ATTR Machine_info_t Machine_info; static void IRAM_ATTR gpio_isr_handler(void *arg) { uint32_t gpio_num = (uint32_t)arg; switch (gpio_num) { case 2: // beep_blink(100,3); // printf("----------------gpio_num%ld中断------------------------\r\n",gpio_num); break; case 38: // beep_blink(100,4);//rintf("----------------gpio_num%ld中断------------------------\r\n",gpio_num); break; default: break; } } void decection_charging_init(void) { // zero-initialize the config structure. gpio_config_t io_conf = {}; // interrupt of rising edge io_conf.intr_type = GPIO_INTR_NEGEDGE; // 下降沿 // bit mask of the pins io_conf.pin_bit_mask = ((1ULL << 2) | (1ULL << 38)); // set as input mode io_conf.mode = GPIO_MODE_INPUT; io_conf.pull_up_en = GPIO_PULLUP_DISABLE; // 禁用上拉电阻 io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE; // 禁用下拉电阻 // configure GPIO with the given settings gpio_config(&io_conf); ESP_LOGW(TAG, "decection_charging_init"); // install gpio isr service gpio_install_isr_service(ESP_INTR_FLAG_EDGE); gpio_isr_handler_add(2, gpio_isr_handler, (void *)2); gpio_isr_handler_add(38, gpio_isr_handler, (void *)38); } // void decection_charging_deinit(void) // { // gpio_isr_handler_remove(2); // gpio_isr_handler_remove(38); // }