Arduino :: Lecture & TIPs

[Smart Garden] 스마트 정원 구현하기 (2) – ESP32 MCU 에 IoT 기능 추가하기

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 번 PinI2C_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 &lt; 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) {

Leave a Reply

Discover more from Dream big, Achieve more.

Subscribe now to keep reading and get access to the full archive.

Continue reading