본문 바로가기
ESP32/ESP32

ESP32 ADC - 아날로그 값 읽기

by 빈이쥬 2024. 10. 16.

ESP32로 아날로그 입력을 통해 가변저항의 값을 읽어보겠습니다.

 

ESP32로 아날로그 값을 읽는다는 것은 0V와 3.3V 사이의 다양한 전압 레벨을 측정할 수 있습니다. 

측정된 전압은 0~4095 사이의 값으로 출력됩니다. 0V는 0에 해당하고 3.3V는 4095에 해당합니다. 

 

ADC는 비선형입니다

이상적으로는 ESP32 ADC 핀을 사용할 때 선형적인 동작을 기대해야 합니다. 하지만 그런 일은 일어나지 않습니다.

ESP32는 3.3V와 3.2V를 구별할 수 없습니다. 두 전압에 대해 같은 값인 4095를 얻게 됩니다.

매우 낮은 전압 값에도 동일한 일이 발생합니다. 0V와 0.1V의 경우 동일한 값인 0을 얻습니다.

 

analogRead() 함수

esp32에서 analogRead()함수를 이용하여 간단하게 값을 입력받을 수 있습니다.

analogRead(GPIO);

 

ESP32는 18개의 다른 채널에서 아날로그 값을 읽을 수 있습니다. 

ESP32 보드 핀아웃을 잡고 ADC 핀을 찾으세요.

 

 

아날로그 핀은 12비트 해상도를 가지고 있습니다. 즉, 아날로그 입력을 읽을 때 범위는 0에서 4095 입니다. 

 

참고
ADC2 핀은 Wi-Fi를 사용할 때는 사용할 수 없습니다. 따라서 Wi-Fi를 사용하고 ADC2 GPIO에서 값을 가져오는 데 문제가 있다면 ADC1 GPIO를 사용하는 것을 고려해 보세요. 

기타 유용한 기능

ADC 핀에는 유용할 수 있는 더욱 고급 기능이 많이 있습니다.

  • analogReadResolution(resolution): 샘플 비트와 해상도를 설정합니다. 9(0~511)에서 12비트(0~4095) 사이의 값이 될 수 있습니다. 기본값은 12비트 해상도입니다.
  • analogSetWidth(width): 샘플 비트와 해상도를 설정합니다. 9(0~511)에서 12비트(0~4095) 사이의 값이 될 수 있습니다. 기본값은 12비트 해상도입니다.
  • analogSetCycles(cycles): 샘플당 사이클 수를 설정합니다. 기본값은 8입니다. 범위: 1~255.
  • analogSetSamples(samples): 범위 내 샘플 수를 설정합니다. 기본값은 1개 샘플입니다. 민감도를 높이는 효과가 있습니다.
  • analogSetClockDiv(attenuation): ADC 클록의 분배기를 설정합니다. 기본값은 1입니다. 범위: 1~255.
  • analogSetAttenuation(attenuation): 모든 ADC 핀에 대한 입력 감쇠를 설정합니다. 기본값은 다음과 같습니다.ADC_11db.       허용된 값:
    • ADC_0db: 감쇠를 설정하지 않습니다. ADC는 최대 약 800mV(1V 입력 = 1088의 ADC 판독값)까지 측정할 수 있습니다.
    • ADC_2_5db: ADC의 입력 전압이 감쇠되어 측정 범위가 최대 약 1100mV까지 확장됩니다. (1V 입력 = 3722의 ADC 판독값).
    • ADC_6db: ADC의 입력 전압이 감쇠되어 측정 범위가 최대 약 1350mV까지 확장됩니다. (1V 입력 = 3033의 ADC 판독값).
    • ADC_11db: ADC의 입력 전압이 감쇠되어 측정 범위가 최대 약 2600mV까지 확장됩니다. (1V 입력 = ADC 판독값 1575).
  • analogSetPinAttenuation(pin, attenuation): 지정된 핀에 대한 입력 감쇠를 설정합니다. 기본값은 다음과 같습니다.ADC_11db. 감쇠 값은 이전 함수와 동일합니다.
  • adcAttachPin(pin): ADC에 핀을 연결합니다. TRUE 또는 FALSE 결과를 반환합니다.
  • adcStart(pin),adcBusy(pin)그리고resultadcEnd(pin): 연결된 핀의 버스에서 ADC 변환을 시작합니다. 핀의 ADC 버스에서 변환이 현재 실행 중인지 확인합니다(TRUE 또는 FALSE를 반환합니다). 변환 결과를 가져옵니다. 16비트 정수를 반환합니다.

ESP32를 사용하여 가변저항의 아날로그 값 읽기

다음과 같은 부품이 필요합니다.

  • ESP32
  • 가변저항
  • 브레드보드
  • 점퍼와이어

회로도

 

예제 코드

// 가변저항은 GPIO 34 에 연결 (Analog ADC1_CH6) 
const int potPin = 34;

// 가변저항의 값을 저장 할 변수 선언
int potValue = 0;

void setup() {
  Serial.begin(115200);
  delay(1000);
}

void loop() {
  // 가변저항의 값을 읽어옵니다. 
  potValue = analogRead(potPin);
  Serial.println(potValue);
  delay(500);
}

 

시리얼 모니터에 해당 값을 출력합니다. 

글자가 출력되지 않는다면 9600 baud 에서 115200 baud로 변경해주세요

 

코드 설명

가변저항 핀을 정의 합니다. 

const int potPin = 34;

 

Serial.begin()함수를 통해 115200의 통신 속도로 직렬 통신을 초기화합니다.

Serial.begin(115200);

 

변수에 가변저항의 값을 읽어 저항합니다. 

potValue = analogRead(potPin);

 

가변저항의 읽은 값을 직렬 모니터에 인쇄합니다.

Serial.println(potValue);

 

최대값은 4095이고 최소값은 0입니다.

 

아날로그 입력을 읽는 방법을 알아보았습니다. 감사합니다.