Battery voltage read implemented (TTGOv2.1)
This commit is contained in:
		
							parent
							
								
									428db80073
								
							
						
					
					
						commit
						9c60a237cf
					
				@ -221,11 +221,15 @@ device answers with it's current configuration. The configuration is a C structu
 | 
			
		||||
 | 
			
		||||
0x81 get device uptime
 | 
			
		||||
 | 
			
		||||
	bytes 1-7:		Uptime in seconds (little endian format)
 | 
			
		||||
	bytes 1-7:		uptime in seconds (little endian format)
 | 
			
		||||
 | 
			
		||||
0x82 get device cpu temperature
 | 
			
		||||
 | 
			
		||||
	bytes 1-3:		chip temperature in celsius (little endian format)
 | 
			
		||||
	bytes 1-3:		chip temperature in degrees celsius (little endian format)
 | 
			
		||||
 | 
			
		||||
0x83 get device battery voltage
 | 
			
		||||
 | 
			
		||||
	bytes 1-4:		battery voltage in millivolt, 0 if unreadable (little endian format)
 | 
			
		||||
 | 
			
		||||
# License
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,7 @@
 | 
			
		||||
 | 
			
		||||
; ---> SELECT TARGET PLATFORM HERE! <---
 | 
			
		||||
[platformio]
 | 
			
		||||
env_default = heltec
 | 
			
		||||
;env_default = heltec
 | 
			
		||||
;env_default = ttgov1
 | 
			
		||||
;env_default = ttgov2
 | 
			
		||||
;env_default = ttgov21
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										89
									
								
								src/adcread.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								src/adcread.cpp
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,89 @@
 | 
			
		||||
#ifdef HAS_BATTERY_PROBE
 | 
			
		||||
 | 
			
		||||
/* ADC1 Example
 | 
			
		||||
   This example code is in the Public Domain (or CC0 licensed, at your option.)
 | 
			
		||||
   Unless required by applicable law or agreed to in writing, this
 | 
			
		||||
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
 | 
			
		||||
   CONDITIONS OF ANY KIND, either express or implied.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "globals.h"
 | 
			
		||||
 | 
			
		||||
#include <driver/adc.h>
 | 
			
		||||
#include <esp_adc_cal.h>
 | 
			
		||||
 | 
			
		||||
#define DEFAULT_VREF    1100        // we use adc2_vref_to_gpio() to obtain a better estimate
 | 
			
		||||
#define NO_OF_SAMPLES   64          // we do multisampling
 | 
			
		||||
 | 
			
		||||
// Local logging tag
 | 
			
		||||
static const char TAG[] = "main";
 | 
			
		||||
 | 
			
		||||
static const adc_channel_t channel = (adc_channel_t) HAS_BATTERY_PROBE;
 | 
			
		||||
static const adc_atten_t atten = ADC_ATTEN_DB_0;
 | 
			
		||||
static const adc_unit_t unit = ADC_UNIT_1;
 | 
			
		||||
 | 
			
		||||
static void check_efuse()
 | 
			
		||||
{
 | 
			
		||||
    //Check if two point calibration values are burned into eFuse
 | 
			
		||||
    if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_TP) == ESP_OK) {
 | 
			
		||||
        ESP_LOGI(TAG,"eFuse Two Point: Supported");
 | 
			
		||||
    } else {
 | 
			
		||||
        ESP_LOGI(TAG,"eFuse Two Point: NOT supported");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //Check Vref is burned into eFuse
 | 
			
		||||
    if (esp_adc_cal_check_efuse(ESP_ADC_CAL_VAL_EFUSE_VREF) == ESP_OK) {
 | 
			
		||||
        ESP_LOGI(TAG,"eFuse Vref: Supported");
 | 
			
		||||
    } else {
 | 
			
		||||
        ESP_LOGI(TAG,"eFuse Vref: NOT supported");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void print_char_val_type(esp_adc_cal_value_t val_type)
 | 
			
		||||
{
 | 
			
		||||
    if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) {
 | 
			
		||||
        ESP_LOGI(TAG,"Characterized using Two Point Value");
 | 
			
		||||
    } else if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF) {
 | 
			
		||||
        ESP_LOGI(TAG,"Characterized using eFuse Vref");
 | 
			
		||||
    } else {
 | 
			
		||||
        ESP_LOGI(TAG,"Characterized using Default Vref");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint16_t read_voltage(void)
 | 
			
		||||
{
 | 
			
		||||
    //Check if Two Point or Vref are burned into eFuse
 | 
			
		||||
    check_efuse();
 | 
			
		||||
 | 
			
		||||
    //Configure ADC
 | 
			
		||||
    if (unit == ADC_UNIT_1) {
 | 
			
		||||
        adc1_config_width(ADC_WIDTH_BIT_12);
 | 
			
		||||
        adc1_config_channel_atten((adc1_channel_t)channel, atten);
 | 
			
		||||
    } else {
 | 
			
		||||
        adc2_config_channel_atten((adc2_channel_t)channel, atten);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //Characterize ADC
 | 
			
		||||
    esp_adc_cal_characteristics_t *adc_chars = (esp_adc_cal_characteristics_t *) calloc(1, sizeof(esp_adc_cal_characteristics_t));
 | 
			
		||||
    esp_adc_cal_value_t val_type = esp_adc_cal_characterize(unit, atten, ADC_WIDTH_BIT_12, DEFAULT_VREF, adc_chars);
 | 
			
		||||
    print_char_val_type(val_type);
 | 
			
		||||
 | 
			
		||||
    //sample ADC
 | 
			
		||||
    uint32_t adc_reading = 0;
 | 
			
		||||
    //Multisampling
 | 
			
		||||
    for (int i = 0; i < NO_OF_SAMPLES; i++) {
 | 
			
		||||
        if (unit == ADC_UNIT_1) {
 | 
			
		||||
            adc_reading += adc1_get_raw((adc1_channel_t)channel);
 | 
			
		||||
        } else {
 | 
			
		||||
            int raw;
 | 
			
		||||
            adc2_get_raw((adc2_channel_t)channel, ADC_WIDTH_BIT_12, &raw);
 | 
			
		||||
            adc_reading += raw;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    adc_reading /= NO_OF_SAMPLES;
 | 
			
		||||
    //Convert adc_reading to voltage in mV
 | 
			
		||||
    uint32_t voltage = esp_adc_cal_raw_to_voltage(adc_reading, adc_chars);
 | 
			
		||||
    ESP_LOGI(TAG,"Raw: %d\tVoltage: %dmV", adc_reading, voltage);
 | 
			
		||||
    return voltage;
 | 
			
		||||
}
 | 
			
		||||
#endif // HAS_BATTERY_PROBE
 | 
			
		||||
@ -5,6 +5,7 @@
 | 
			
		||||
#define HAS_DISPLAY U8X8_SSD1306_128X64_NONAME_HW_I2C
 | 
			
		||||
#define DISPLAY_FLIP  1 // rotated display
 | 
			
		||||
#define HAS_LED 23 // green on board LED_G3 (not in initial board version)
 | 
			
		||||
#define HAS_BATTERY_PROBE ADC1_GPIO35_CHANNEL // battery probe GPIO pin -> ADC_CHANNEL_7
 | 
			
		||||
 | 
			
		||||
// re-define pin definitions of pins_arduino.h
 | 
			
		||||
#define PIN_SPI_SS    18 // ESP32 GPIO18 (Pin18) -- HPD13A NSS/SEL (Pin4) SPI Chip Select Input
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
 | 
			
		||||
// program version - note: increment version after modifications to configData_t struct!!
 | 
			
		||||
#define PROGVERSION                     "1.3.7"    // use max 10 chars here!
 | 
			
		||||
#define PROGVERSION                     "1.3.71"    // use max 10 chars here!
 | 
			
		||||
#define PROGNAME                        "PAXCNT"
 | 
			
		||||
 | 
			
		||||
//--- Declarations ---
 | 
			
		||||
 | 
			
		||||
@ -24,6 +24,12 @@ typedef struct {
 | 
			
		||||
    void antenna_select(const uint8_t _ant);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// function defined in adcread.cpp
 | 
			
		||||
#ifdef HAS_BATTERY_PROBE
 | 
			
		||||
    uint32_t read_voltage(void);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// help function to assign LoRa datarates to numeric spreadfactor values
 | 
			
		||||
void switch_lora (uint8_t sf, uint8_t tx) {
 | 
			
		||||
    if ( tx > 20 ) return;
 | 
			
		||||
@ -235,6 +241,21 @@ void get_cputemp (uint8_t val) {
 | 
			
		||||
    ESP_LOGI(TAG, "%d bytes queued in send queue", size-1);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void get_voltage (uint8_t val) {
 | 
			
		||||
    ESP_LOGI(TAG, "Remote command: get battery voltage");
 | 
			
		||||
    #ifdef HAS_BATTERY_PROBE
 | 
			
		||||
        uint32_t voltage = read_voltage();
 | 
			
		||||
    #else
 | 
			
		||||
        uint32_t voltage = 0;
 | 
			
		||||
    #endif
 | 
			
		||||
    int size = sizeof(voltage);
 | 
			
		||||
    unsigned char *sendData = new unsigned char[size];
 | 
			
		||||
    memcpy(sendData, (unsigned char*)&voltage, size);
 | 
			
		||||
    LMIC_setTxData2(RCMDPORT, sendData, size-1, 0); // send data unconfirmed on RCMD Port
 | 
			
		||||
    delete sendData; // free memory
 | 
			
		||||
    ESP_LOGI(TAG, "%d bytes queued in send queue", size-1);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// assign previously defined functions to set of numeric remote commands
 | 
			
		||||
// format: opcode, function, flag (1 = do make settings persistent / 0 = don't)
 | 
			
		||||
// 
 | 
			
		||||
@ -257,7 +278,8 @@ cmd_t table[] = {
 | 
			
		||||
                {0x10, set_rgblum, true},
 | 
			
		||||
                {0x80, get_config, false},
 | 
			
		||||
                {0x81, get_uptime, false},
 | 
			
		||||
                {0x82, get_cputemp, false}
 | 
			
		||||
                {0x82, get_cputemp, false},
 | 
			
		||||
                {0x83, get_voltage, false}
 | 
			
		||||
                };
 | 
			
		||||
 | 
			
		||||
// check and execute remote command
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user