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입니다.
아날로그 입력을 읽는 방법을 알아보았습니다. 감사합니다.
'ESP32 > ESP32' 카테고리의 다른 글
ESP32 인터럽트(Interrupt) 구현하기 - PIR(인체감지센서) (2) | 2024.10.17 |
---|---|
ESP32 Timer 구현하기 - millis()함수 사용하기 (4) | 2024.10.16 |
ESP32 버튼,LED 제어하기 (0) | 2024.10.15 |
아두이노에서 ESP32 PWM 알아보기 (1) | 2024.09.27 |
ESP32 PinMap (0) | 2024.09.26 |