123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- #include <stdio.h>
- #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);
- // }
|