ESP32 란?
Wi-Fi 와 BLE (Bluetooth Low Energy) 기능을 동시에 지원하는 IoT 개발 보드입니다. CP210x 드라이버 를 사용하며 단일 프로세서가 통신 중인 경우 다른 프로세서가 I/O 제어를 담당하는 듀얼코어 지원으로 기존의 ESP8266 보드가 가지던 치명적인 단점을 개선하였습니다.
아두이노 통합 개발환경 (Arduino IDE) 을 지원하므로 아두이노 (Arduino) 를 이용하여 IoT 프로젝트를 구현하기에 적합합니다.
ESP32 기능 블록 다이어그램 (Functional Block Diagram)

1. BH1750test
I2C_Data Port 25 번 Pin 과 I2C_Communication Port 26 번 핀을 사용합니다.
– IIC 통신을 초기화하는 코드는 아래와 같습니다.
Wire.begin(I2C_SDA, I2C_SCL);
– 전원 VCC digitalWrite(GPIO 4번 Pin, 1) :
조도 센서, 온도 / 습도 센서, 토양 습도 센서, 염도 센서, 배터리 잔량 감지 회로
2. BH1750test2
– RAW 데이터에서 노이즈 제거 후 신뢰성 있는 데이터로 필터링하는 코드입니다.
– 노이즈 제거 샘플링 코드 [함수 인자 값 : sort(배열 시작 위치, 배열의 크기)]
//1 초당 2 ms 씩 samples 배열 크기 만큼 값을 도출.
for(int i=0; i<samples; i++) {
array[i] = lightMeter.readLightLevel();
delay(2);
}
// 표준 라이브러리에서 제공하는 sort 함수로 샘플 데이터 정렬.
std::sort(array, array + samples);
// 샘플데이터에서 Max 값, Min 값 제거 후 합계 데이터 저장.
for(int i=0; i<samples; i++) {
if (i == 0 || i == samples-1)
continue;
lux += array[i];
}
– 신뢰성 있는 대표 데이터 값을 기준으로 보정합니다.
lux /= samples - 2;
3. DHT12test
– 아날로그 데이터를 읽는 동시에 샘플링데이터에 추가되는 코드.
for (int i = 0; i < samples; i++) {
while (1) {
float _t12 = 0.0;
_t12 = dht12.readTemperature();
//아날로그 데이터 누락 시 데이터를 추가합니다.
if (!isnan(_t12)) {
array[i] = _t12;
break;
}
delay(100);
}
delay(2);
}
4. SoilMoistureTest
5. SoilSalinityTest
– 토양 습도 데이터를 백분율 (%) 로 변환하는 과정은 아래 코드와 같습니다.
#define PERVALUE 0.0244141 // 100 ÷ 4096
...
mapsoil = map(soil, 0, 4095, 4095, 0);
per_soil = mapsoil * PERVALUE;
6. BattADCtest
– 배터리 잔량 측정의 경우 최대 값이 3.3V 이기 때문에, 현재 작동 전압인 3.7V 를 표시하거나 확인 할 수 없음에 따라, 회로가 병렬로 구성되어 있는 관계로 결과값에 x2 한 값을 출력하여야 올바른 수치를 계산할 수 있습니다.
float battery_voltage = ((float)volt / 4095.0) * 2.0 * 3.3 * (vref);
7. deepSleep (절전 모드)
Deep Sleep 절전 모드 실행 후 지정된 시간이 경과하면 setup() 함수가 자동으로 실행되도록 구현되어 있습니다.
– esp_deep_sleep_start();
8. watchDogTimer 작동 절차
//Watchdog 특정한 시간 내에 성공적으로 수행되지 않아서 진행이 자동적으로 중단되는 타이밍을 3초로 지정합니다.
– esp_task_wdt_init(3, true);
//현재 프로세스 Thread (쓰레드) 를 Watchdog 에 등록합니다.
– esp_task_wdt_add(NULL);
// 매 2 초 경과 후, 5 회 반복 전일때만 esp_task_wdt_reset(); 함수를 실행합니다.
– if (millis() – last >= 2000 && i < 5) {
// 함수 호출 후 2 초 이내 실행됩니다.
– esp_task_wdt_reset();
//5번 반복되면, esp_task_wdt_reset(); 을 지나치므로, Watchdog 타이밍이 재설정되지 않아 프로세스가 리셋되어 setup() 함수 부분부터 다시 시작되게 됩니다.
– if (i == 5) {
