이 블로그는 Web 환경을 이용한 원격 제어 기술에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 WiFi Module과 Raspberry Pi, Raspberry Pi Pico, ATmega128 보드, Arduino Mega 보드(ATmega2560)를 사용 합니다.

sensors-modules-arduino

ESP8266/ESP32 Sensors and Modules - Arduino
ESP8266/ESP32 센서(Sensors)와 제어모듈 - Arduino


  • 센서에 입력되는 신호가 임계값을 넘으면 Low/High를 출력하는 센서 모듈
    • Low/High를 출력하는 센서 모듈 예
    • 아래 사진은 자주 자용하는 Low/High를 출력하는 센서 모듈의 예 이다. 아래 예 센서는 입력 신호가 미리 정해진 임계치를 넘으면 Low 상태에서 High 상태(or High 상태에서 Low 상태)로 천이(Rising edge or Falling edge)하기 때문에 External Interrupt 처리 방식으로 제어 할 수 있다.

      PIR 센서모듈(HC-SR501)

      Sound 센서모듈(SZH-EK033)

      홀 센서(WSH131)


    • Low/High를 출력하는 센서 모듈을 사용하는 구성도
    • Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예
      • 윗 예의 센서 모듈은 모두 입력 신호가 임계치를 넘기면 Low 상태에서 High 상태로 천이하기 때문에 모두 아래와 같은 External interrupt 방식의 프로그램으로 구현 할 수 있다.

      • Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예: sensor-event-handler-esp8266.ino
      • 이 프로그램에서는 millis(); 함수를 사용하여 시간 지연를 발생시킨다. delay(1000)를 사용하면 이 함수가 실행되는 동안 프로그램이 1초 동안 정지되는 문제가 발생한다.

      • Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예: sensor-event-handler-esp32.ino
      • 이 프로그램에서는 Hardware timer를 사용하여 시간 지연를 발생시킨다.

      • 실험을 위한 준비
        • ESP8266/ESP32 개발보드와 센서 모듈 연결
          • ESP8266/ESP32 개발보드 Event input pin(GPIO14) <-> 센서의 Output pin
          • ESP8266/ESP32 개발보드 VDD <-> 센서 Vdd pin
          • 주: 센서에 따라 전원 전압은 5V 또는 3.3V 일 수 있으니 확인 바람.

          • ESP8266/ESP32 개발보드 GND <-> 센서 GND
      • 실험 방법
        • Arduino IDE를 실행하고 "파일 -> 새 파일"을 클릭한다.
        • 윗 sensor-event-handler-esp32.ino(or sensor-event-handler-esp8266.ino) 프로그램을 프로그램 편집 창에 복사하여 저장한다.
        • "툴 -> 보드: "보오드 이름" 에서 보드를 선택("NodeMCU-32S인 경우에는 "NodeMCU-32S" , ESP8266 NodeMCU인 경우에는 "NodeMCU 1.0(ESP-12E Module)) 한다.
        • "툴 -> 포트: "에서 COM Port(제어판에서 ESP에 연결된 Port 번호를 확인)를 선택 한다.
        • "스케치 -> 확인/컴파일"을 클릭하여 프로그램이 정상으로 컴파일되는지 확인한다.
        • "업 로드"를 실행 한다. 컴파일이 완료되고 Arduino IDE와 개발 보드 사이에 연결이 시작되면 FLASH Switch(NodeMCU-32S 인 경우 BOOT SW)를 약 2초 동안 누른다.
        • 주: ESP8266 NodeMCU 개발보드를 사용하는 경우에는 FLASH Switch와 RST Switch를 누르지 않아도 자동으로 업 로드 된다.

        • Upload 가 완료되면 "툴 -> 시리얼 모니터"를 실행하여 시리얼 모니터 창을 Open 한다.
        • 실험
          • "업 로드"가 완료되면 프로그램이 자동으로 실행된다.
          • 로그램이 실행되면 센서에 임계치 이상의 신호를 인가 한다. 센서에 임계치 이상의 신호를 인가되면 LED가 지정된 시간(2Sec) 동안 Turn on 된다.
          • 센서에 임계치 이상의 신호를 인가하는 방법 예
            • PIR(인체 감지) 센서모듈(HC-SR501): 센서 앞에 손(인체)을 가까이 접근 시킨다.
            • Sound 센서모듈(SZH-EK033): 센서에 큰 소음이나 진동(입으로 후하고 마이크에 진동)을 가한다.
            • 홀 센서(Hall Sensor) WSH131: 먼저 홀 센서 회로를 구성하고 홀 센서 앞에 자성체(자석)를 접근 시킨다.
            • 참고자료: 홀 센서 회로 예


  • Analog 전압을 출력하는 센서 모듈
    • ADC(Analog to Digital Conversion) 관련 유용한 함수
      • ESP32의 ADC 기능은 핀 32-39에서 사용할 수 있다. 기본 구성인 경우 ADC 핀의 입력 전압은 0.0v와 1.0v 사이(1.0v 이상이면 4095로 읽음)이어야 한다. 사용 가능한 전압 범위를 늘리려면 감쇠(Attenuation)를 적용하여야 한다.

        주: ESP8266은 별도의 ADC0 입력 핀을 갖고 있다. ADC0 만 사용가능 함

      • ADC 관련 유용한 함수
        • analogRead(pin): 주어진 Pin의 Analog voltage data를 읽는다.
        • analogReadResolution(resolution): Resolution를 설정한다. 9(0 – 511)와 12비트(0 – 4095) 사이의 값일 수 있습니다. 기본값은 12비트 해상도이다.
        • analogSetWidth(width): Sample bits(Resolution)를 설정한다. 9(0 – 511)와 12비트(0 – 4095) 사이의 값일 수 있습니다. 기본값은 12비트 해상도이다.
        • analogSetCycles(cycles): 샘플 당 사이클 수(Cycles/sample)를 설정(입력을 샘플링하는 시간)한다. 기본값은 8이며 최적의 결과를 얻는다. 범위: 1 ~ 255.
        • analogSetSamples(samples): 샘플 수(여러 샘플을 취하여 결과를 평균화)를 설정한다. 기본값은 1 샘플이다. 고주파 노이즈의 영향과 감도에 영향을 미친다.
        • analogSetClockDiv(attenuation): ADC 클럭 분배기를 설정한다. 기본 값은 1입니다. 범위: 1 ~ 255
        • analogSetAttenuation(attenuation): 모든 ADC 핀에 대한 입력 감쇠를 설정한다. 기본값은 ADC_11db 이다. 허용되는 값은 아래와 같다.
          • ADC_0db: 감쇠를 설정하지 않는다. ADC는 최대 약 800mV까지 측정할 수 있다(1V 입력 = ADC 판독 값 1088).
          • ADC_2_5db: ADC의 입력 전압은 감쇠되어 측정 범위가 약 1100mV 까지 확장된다. (1V 입력 = ADC 판독 값 3722).
          • ADC_6db: ADC의 입력 전압은 감쇠되어 측정 범위가 약 1350mV까지 확장된다. (1V 입력 = ADC 판독 값 3033).
          • ADC_11db: ADC의 입력 전압은 감쇠되어 측정 범위가 약 2600mV까지 확장된다. (1V 입력 = ADC 판독 값 1575).
        • analogSetPinAttenuation(pin, attenuation): 지정된 핀에 대한 입력 감쇠를 설정한다. 기본값은 ADC_11db입니다. 감쇠 값은 이전 기능과 동일하다.
        • adcAttachPin(pin): ADC에 핀을 연결한다(켜져 있을 수 있는 다른 모든 아날로그 모드는 지운다). TRUE 또는 FALSE 결과를 반환한다.
        • adcStart(pin): 연결된 핀의 ADC 변환을 시작한다.
        • adcBusy(pin): 연결된 핀의 ADC 변환이 현재 실행 중인지 확인한다(TRUE 또는 FALSE 반환).
        • resultadcEnd(pin): 변환 결과 가져오기: 16비트 정수를 반환한다.
    • Analog 전압을 출력하는 센서 모듈 예
    • 아래 사진은 자주 자용하는 Analog 전압을 출력하는 센서 모듈의 예 이다. 아래 예 센서는 입력 신호의 크기에 따라 출력 전압이 변동하기 때문에 센서 모듈의 출력 전압을 디지털 값으로 변환하는 A/D 변환기를 사용하여야 한다.

      수위 센서(Water Sensor)

      포토 센서(GL5516)

      온도 센서(LM35DZ)


    • Analog voltage를 출력하는 센서 모듈을 사용하는 구성도
    • Analog voltage를 출력하는 센서 모듈을 사용하는 프로그램 예
      • 윗 예의 센서 모듈은 모두 Analog voltage 신호를 출력하기 때문에 ADC를 사용하여야 한다.

      • ESP8266를 사용하여 Analog voltage를 주기적으로 측정하여 출력하는 프로그램 예: sensor-analog-voltage-esp8266.ino
      • 이 프로그램에서는 millis(); 함수를 사용하여 측정 주기를 발생시킨다.

      • ESP32를 사용하여 Analog voltage를 주기적으로 측정하여 출력하는 프로그램 예: sensor-analog-voltage-esp32.ino
      • 이 프로그램에서는 Hardware timer를 사용하여 측정 주기를 발생시킨다.

      • 실험을 위한 준비
        • 개발보드와 센서 모듈 연결
          • 신호선:
            • ESP32인 경우: 개발보드 ADC input pin(GPIO36) <-> 센서의 Output pin
            • ESP8266인 경우: 개발보드 ADC input pin(ADC0) <-> 센서의 Output pin

            포토 센서(GL5516)를 사용하는 경우: 전원(Vdd) <-> 10K 저항 <-> GL5516 <-> GND를 연결한다. 여기서 10K 저항과 GL5516를 연결한 점이 신호 출력(센서의 Output pin에 해당)이다.

          • 전원: 개발보드 VDD(3.3V or 5V) <-> 센서 Vdd pin. 센서의 종류에 따라 전원 전압을 확인 바람.
          • GND: 개발보드 GND <-> 센서 GND
      • 실험 방법
        • Arduino IDE를 실행하고 "파일 -> 새 파일"을 클릭한다.
        • 윗 프로그램(sensor-analog-voltage-esp32.ino or sensor-analog-voltage-esp8266.ino) 을 프로그램 편집 창에 복사하여 저장한다.
        • "툴 -> 보드: "보오드 이름" 에서 보드를 선택("NodeMCU-32S인 경우에는 "NodeMCU-32S" , ESP8266 NodeMCU인 경우에는 "NodeMCU 1.0(ESP-12E Module)) 한다.
        • "툴 -> 포트: "에서 COM Port(제어판에서 ESP에 연결된 Port 번호를 확인)를 선택 한다.
        • "스케치 -> 확인/컴파일"을 클릭하여 프로그램이 정상으로 컴파일되는지 확인한다.
        • "업 로드"를 실행 한다. 컴파일이 완료되고 Arduino IDE와 개발 보드 사이에 연결이 시작되면 FLASH Switch(NodeMCU-32S 인 경우 BOOT SW)를 약 2초 동안 누른다.
        • 주: ESP8266 NodeMCU 개발보드를 사용하는 경우에는 FLASH Switch와 RST Switch를 누르지 않아도 자동으로 업 로드 된다.

        • Upload 가 완료되면 "툴 -> 시리얼 모니터"를 실행하여 시리얼 모니터 창을 Open 한다.
        • 실험
          • "업 로드"가 완료되면 프로그램이 자동으로 실행된다.
          • 프로그램이 실행되면 센서 출력 전압을 디지털 값으로 변환한 결과가 1초 간격으로 출력된다.
          • 센서 출력 전압을 변동 시키며 실험한다.

  • 펄스폭(Pulse width) 출력 모듈
    • Pulse 폭 측정에 사용하는 함수
      • Arduinod에서 Pulse 폭 측정에 사용하는 함수는 pulseIn과 pulseInLong 두가지 버전이 있다.

      • pulseIn 함수
        • 이 함수는 Assembler code로 작성되었고, 정확도를 높이기 위하여 이 함수의 실행 중에 Interrupts 가 발생하지 않도록(noInterrupts(), interrupts() 함수 사용) 하는 것이 좋다. 2 - 3uSec에서 3분까지 길이의 펄스 폭 측정이 가능하다.

        • 문법(Syntax)
        • pulseIn(pin, value)

          pulseIn(pin, value, timeout)

        • 매개변수(Parameters)
        • pin: 펄스를 읽을 핀 번호. (int)

          value: 읽을 펄스의 유형: HIGH 또는 LOW. (int)

          timeout (옵션): 펄스 시작을 기다릴 시간 (uSec 단위). 기본값은 1초 (unsigned long)

        • 반환(Returns)
        • 펄스의 폭(Microseconds 단위) 또는 0 (timeout이 지날 때까지 펄스가 시작하지 않는 경우) (unsigned long)

      • pulseInLong 함수
        • 이 함수는 Timer0 interrupt를 사용하여 펄스 폭을 측정한다. 이 함수는 Timer interrupt를 사용하기 때문에 Interrupt off 상태에서는 사용할 수 없다. 2 - 3uSec에서 3분까지 길이의 펄스 폭 측정이 가능하다.

          Timer0 interrupt(Hardware interrupt)를 사용하기 때문에 일반적으로 더 좋은 선택일 수 있지만 다른 장치에서 Hardware interrupt를 사용하는 경우 이 장치의 Interrupt가 종료 될 때 까지 지연(오차가 발생)될 수 있다. 2 - 3us에서 3분까지 길이의 펄스 폭 측정이 가능하다. ESP8266인 경우 Timer0를 WiFI 등에서 사용하기 때문에 사용하지 않는 것이 좋다.

        • 문법(Syntax), 매개변수(Parameters), 반환(Returns)은 pulseIn 함수와 같다.
    • 초음파 거리 센서(HC-SR04)
    • 초음파 거리 센서(HC-SR04) 모듈을 사용하는 구성도 예

      • 초음파 거리 센서(HC-SR04) 모듈을 제어하는 프로그램 예
        • 초음파 거리 센서(HC-SR04) 모듈은 초음파를 반사하는 물체까지의 거리에 비례한 Pulse 폭을 출력한다.

        • 초음파 거리 센서(HC-SR04) 모듈을 제어하는 프로그램 예: sensor_pulse_width_HC_SR04-esp8266.ino

        • 초음파 거리 센서(HC-SR04) 모듈을 제어하는 프로그램 예: sensor_pulse_width_HC_SR04-esp32.ino
        • 이 프로그램에서는 Hardware timer(Timer1)를 사용하여 측정 주기를 발생시킨다.

      • 실험을 위한 준비
        • ESP8266/ESP32 개발보드와 센서 모듈 연결
          • ESP8266/ESP32 개발보드 Pulse input pin(GPIO4) <-> 센서의 echo pin
          • ESP8266/ESP32 개발보드 Trigger output pin(GPIO5) <-> 센서의 Trig pin
          • ESP8266/ESP32 개발보드 VDD(3.3V) <-> 센서 Vdd pin(센서에 따라 5V 전원을 사용하는 것도 있음)
          • ESP8266/ESP32 개발보드 GND <-> 센서 GND
      • 실험 방법
        • Arduino IDE를 실행하고 "파일 -> 새 파일"을 클릭한다.
        • 윗 프로그램(sensor_pulse_width_HC_SR04-esp8266.ino or sensor_pulse_width_HC_SR04-esp32.ino.ino)을 프로그램 편집 창에 복사하여 저장한다.
        • "툴 -> 보드: "보오드 이름" 에서 보드를 선택("NodeMCU-32S인 경우에는 "NodeMCU-32S" , ESP8266 NodeMCU인 경우에는 "NodeMCU 1.0(ESP-12E Module)) 한다.
        • "툴 -> 포트: "에서 COM Port(제어판에서 ESP에 연결된 Port 번호를 확인)를 선택 한다.
        • "스케치 -> 확인/컴파일"을 클릭하여 프로그램이 정상으로 컴파일되는지 확인한다.
        • "업 로드"를 실행 한다. 컴파일이 완료되고 Arduino IDE와 개발 보드 사이에 연결이 시작되면 FLASH Switch(NodeMCU-32S 인 경우 BOOT SW)를 약 2초 동안 누른다.
        • 주: ESP8266 NodeMCU 개발보드를 사용하는 경우에는 FLASH Switch와 RST Switch를 누르지 않아도 자동으로 업 로드 된다.

        • Upload 가 완료되면 "툴 -> 시리얼 모니터"를 실행하여 시리얼 모니터 창을 Open 한다.
        • 실험
          • "업 로드"가 완료되면 프로그램이 자동으로 실행된다.
          • 프로그램이 실행되면 거리 측정 결과가 시리얼 모니터 창에 출력된다.
          • 측정 거리를 변동 시키며 실험한다.

  • Single-Wire 통신을 사용하는 센서
    • 온도/습도 센서(DHT11/DHT22) 모듈
    • DHT11/DHT22 센서 모듈을 사용하는 구성도 예

    • 온도/습도 센서(DHT11/DHT22) 모듈을 제어하는 프로그램 예
      • 온도/습도 센서(DHT11/DHT22) 모듈은 측정한 온도/습도 값을 디지털 데이터로 변환하여 Single-Wire 통신 프로토콜로 출력한다.

      • 온도/습도 센서(DHT11/DHT22) 모듈을 제어하는 프로그램 예: sensor_single_wire_comm_DHT11.ino
      • 실험을 위한 준비
        • Sensor Library 설치하기
          • DHT Sensor Library 설치하기
            • DHT Sensor Library "DHT-sensor-library-master.zip"을 다운로드한다.
            • "스케치 -> 라이브러리 포함하기 -> .ZIP 라이브러리 추가..."를 실행하면 라이브러리 검색 창이 열린다.
            • DHT-sensor-library-master.zip를 검색하여 "열기" 클릭하면 스케치북 폴더(스케치북 폴더 위치는 환경설정 창에서 확인할 수 있음) 아래 libraries 폴더에 Library가 설치된다.
          • Adafruit Unified Sensor Driver 설치하기
            • Adafruit Unified Sensor Driver "Adafruit_Sensor-master.zip"을 다운로드한다.
            • "스케치 -> 라이브러리 포함하기 -> .ZIP 라이브러리 추가..."를 실행하면 라이브러리 검색 창이 열린다.
            • Adafruit_Sensor-master.zip를 검색하여 "열기" 클릭하면 스케치북 폴더(스케치북 폴더 위치는 환경설정 창에서 확인할 수 있음) 아래 libraries 폴더에 Library가 설치된다.
        • ESP8266/ESP32 개발보드와 센서 모듈 연결
          • ESP8266/ESP32 개발보드 Data input pin(GPIO14) <-> 센서의 data pin
          • Data input line Pull up 저항(1K - 10K): DHT11/DHT22 모듈에 Pull up 저항이 내장된 경우 생략하여도됨.
          • ESP8266/ESP32 개발보드 VDD(3.3V) <-> 센서 Vcc pin
          • ESP8266/ESP32 개발보드 GND <-> 센서 GND
      • 실험 방법
        • Arduino IDE를 실행하고 "파일 -> 새 파일"을 클릭한다.
        • 윗 프로그램(sensor_single_wire_comm_DHT11.ino)을 프로그램 편집 창에 복사하여 저장한다.
        • "툴 -> 보드: "보오드 이름" 에서 보드를 선택("NodeMCUS-32인 경우에는 "NodeMCU-32S" , ESP8266 NodeMCU인 경우에는 "NodeMCU 1.0(ESP-12E Module)) 한다.
        • "툴 -> 포트: "에서 COM Port(제어판에서 ESP에 연결된 Port 번호를 확인)를 선택 한다.
        • "스케치 -> 확인/컴파일"을 클릭하여 프로그램이 정상으로 컴파일되는지 확인한다.
        • "업 로드"를 실행 한다. 컴파일이 완료되고 Arduino IDE와 개발 보드 사이에 연결이 시작되면 FLASH Switch(NodeMCU-32S 인 경우 BOOT SW)를 약 2초 동안 누른다.
        • 주: ESP8266 NodeMCU 개발보드를 사용하는 경우에는 FLASH Switch와 RST Switch를 누르지 않아도 자동으로 업 로드 된다.

        • Upload 가 완료되면 "툴 -> 시리얼 모니터"를 실행하여 시리얼 모니터 창을 Open 한다.
        • 실험
          • "업 로드"가 완료되면 프로그램이 자동으로 실행된다.
          • 프로그램이 실행되면 온도와 습도 측정 결과가 1초 간격으로 시리얼 모니터 창에 출력된다.
          • 온도와 습도를 변동(센서에 손가락을 대고 있으면 온도와 습도가 변동함) 시키며 실험한다.

  • I2C 통신을 사용하는 모듈