- 센서에 입력되는 신호가 임계값을 넘으면 Low/High를 출력하는 센서 모듈
- Low/High를 출력하는 센서 모듈 예
- PIR(인체 감지) 센서모듈(HC-SR501)
- Sound 센서모듈(SZH-EK033)
- 홀 센서(Hall Sensor) WSH131
- Low/High를 출력하는 센서 모듈을 제어하는 구성도
- Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예
- Analog 전압을 출력하는 센서 모듈
- ADC(Analog to Digital Conversion) 관련 유용한 함수
- Analog 전압을 출력하는 센서 모듈 예
- 물 수위 센서(Water Level Sensor)
- 포토 센서(GL5516)
- 온도 센서(LM35DZ)
- Analog voltage를 출력하는 센서 모듈을 사용하는 구성도
- Analog voltage를 출력하는 센서 모듈을 사용하는 프로그램 예
- 펄스폭(Pulse width) 출력 모듈
- Single-Wire 통신을 사용하는 센서
- I2C 통신을 사용하는 모듈
- ESP8266/ESP32 센서와 제어모듈 관련 페이지 보기
- Low/High를 출력하는 센서 모듈 예
- Low/High를 출력하는 센서 모듈을 사용하는 구성도
- Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예
- Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예: sensor-event-handler-esp8266.ino
- Low/High를 출력하는 센서 모듈을 제어하는 프로그램 예: sensor-event-handler-esp32.ino
- 실험을 위한 준비
- ESP8266/ESP32 개발보드와 센서 모듈 연결
- ESP8266/ESP32 개발보드 Event input pin(GPIO14) <-> 센서의 Output pin
- ESP8266/ESP32 개발보드 VDD <-> 센서 Vdd pin
- 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초 동안 누른다.
- Upload 가 완료되면 "툴 -> 시리얼 모니터"를 실행하여 시리얼 모니터 창을 Open 한다.
- 실험
- "업 로드"가 완료되면 프로그램이 자동으로 실행된다.
- 로그램이 실행되면 센서에 임계치 이상의 신호를 인가 한다. 센서에 임계치 이상의 신호를 인가되면 LED가 지정된 시간(2Sec) 동안 Turn on 된다.
- 센서에 임계치 이상의 신호를 인가하는 방법 예
- PIR(인체 감지) 센서모듈(HC-SR501): 센서 앞에 손(인체)을 가까이 접근 시킨다.
- Sound 센서모듈(SZH-EK033): 센서에 큰 소음이나 진동(입으로 후하고 마이크에 진동)을 가한다.
- 홀 센서(Hall Sensor) WSH131: 먼저 홀 센서 회로를 구성하고 홀 센서 앞에 자성체(자석)를 접근 시킨다.
아래 사진은 자주 자용하는 Low/High를 출력하는 센서 모듈의 예 이다. 아래 예 센서는 입력 신호가 미리 정해진 임계치를 넘으면 Low 상태에서 High 상태(or High 상태에서 Low 상태)로 천이(Rising edge or Falling edge)하기 때문에 External Interrupt 처리 방식으로 제어 할 수 있다.
윗 예의 센서 모듈은 모두 입력 신호가 임계치를 넘기면 Low 상태에서 High 상태로 천이하기 때문에 모두 아래와 같은 External interrupt 방식의 프로그램으로 구현 할 수 있다.
이 프로그램에서는 millis(); 함수를 사용하여 시간 지연를 발생시킨다. delay(1000)를 사용하면 이 함수가 실행되는 동안 프로그램이 1초 동안 정지되는 문제가 발생한다.
이 프로그램에서는 Hardware timer를 사용하여 시간 지연를 발생시킨다.
주: 센서에 따라 전원 전압은 5V 또는 3.3V 일 수 있으니 확인 바람.
주: ESP8266 NodeMCU 개발보드를 사용하는 경우에는 FLASH Switch와 RST Switch를 누르지 않아도 자동으로 업 로드 된다.
참고자료: 홀 센서 회로 예
- ADC(Analog to Digital Conversion) 관련 유용한 함수
- 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 voltage를 출력하는 센서 모듈을 사용하는 구성도
- Analog voltage를 출력하는 센서 모듈을 사용하는 프로그램 예
- ESP8266를 사용하여 Analog voltage를 주기적으로 측정하여 출력하는 프로그램 예: sensor-analog-voltage-esp8266.ino
- ESP32를 사용하여 Analog voltage를 주기적으로 측정하여 출력하는 프로그램 예: sensor-analog-voltage-esp32.ino
- 실험을 위한 준비
- 개발보드와 센서 모듈 연결
- 신호선:
- ESP32인 경우: 개발보드 ADC input pin(GPIO36) <-> 센서의 Output pin
- ESP8266인 경우: 개발보드 ADC input pin(ADC0) <-> 센서의 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초 동안 누른다.
- Upload 가 완료되면 "툴 -> 시리얼 모니터"를 실행하여 시리얼 모니터 창을 Open 한다.
- 실험
- "업 로드"가 완료되면 프로그램이 자동으로 실행된다.
- 프로그램이 실행되면 센서 출력 전압을 디지털 값으로 변환한 결과가 1초 간격으로 출력된다.
- 센서 출력 전압을 변동 시키며 실험한다.
ESP32의 ADC 기능은 핀 32-39에서 사용할 수 있다. 기본 구성인 경우 ADC 핀의 입력 전압은 0.0v와 1.0v 사이(1.0v 이상이면 4095로 읽음)이어야 한다. 사용 가능한 전압 범위를 늘리려면 감쇠(Attenuation)를 적용하여야 한다.
주: ESP8266은 별도의 ADC0 입력 핀을 갖고 있다. ADC0 만 사용가능 함
아래 사진은 자주 자용하는 Analog 전압을 출력하는 센서 모듈의 예 이다. 아래 예 센서는 입력 신호의 크기에 따라 출력 전압이 변동하기 때문에 센서 모듈의 출력 전압을 디지털 값으로 변환하는 A/D 변환기를 사용하여야 한다.
윗 예의 센서 모듈은 모두 Analog voltage 신호를 출력하기 때문에 ADC를 사용하여야 한다.
이 프로그램에서는 millis(); 함수를 사용하여 측정 주기를 발생시킨다.
이 프로그램에서는 Hardware timer를 사용하여 측정 주기를 발생시킨다.
포토 센서(GL5516)를 사용하는 경우: 전원(Vdd) <-> 10K 저항 <-> GL5516 <-> GND를 연결한다. 여기서 10K 저항과 GL5516를 연결한 점이 신호 출력(센서의 Output pin에 해당)이다.
주: ESP8266 NodeMCU 개발보드를 사용하는 경우에는 FLASH Switch와 RST Switch를 누르지 않아도 자동으로 업 로드 된다.
- Pulse 폭 측정에 사용하는 함수
- pulseIn 함수
- 문법(Syntax)
- 매개변수(Parameters)
- 반환(Returns)
- pulseInLong 함수
- 문법(Syntax), 매개변수(Parameters), 반환(Returns)은 pulseIn 함수와 같다.
- 초음파 거리 센서(HC-SR04)
- 초음파 거리 센서(HC-SR04) 모듈을 제어하는 프로그램 예
- 초음파 거리 센서(HC-SR04) 모듈을 제어하는 프로그램 예: sensor_pulse_width_HC_SR04-esp8266.ino
- 초음파 거리 센서(HC-SR04) 모듈을 제어하는 프로그램 예: sensor_pulse_width_HC_SR04-esp32.ino
- 실험을 위한 준비
- 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초 동안 누른다.
- Upload 가 완료되면 "툴 -> 시리얼 모니터"를 실행하여 시리얼 모니터 창을 Open 한다.
- 실험
- "업 로드"가 완료되면 프로그램이 자동으로 실행된다.
- 프로그램이 실행되면 거리 측정 결과가 시리얼 모니터 창에 출력된다.
- 측정 거리를 변동 시키며 실험한다.
Arduinod에서 Pulse 폭 측정에 사용하는 함수는 pulseIn과 pulseInLong 두가지 버전이 있다.
이 함수는 Assembler code로 작성되었고, 정확도를 높이기 위하여 이 함수의 실행 중에 Interrupts 가 발생하지 않도록(noInterrupts(), interrupts() 함수 사용) 하는 것이 좋다. 2 - 3uSec에서 3분까지 길이의 펄스 폭 측정이 가능하다.
pulseIn(pin, value)
pulseIn(pin, value, timeout)
pin: 펄스를 읽을 핀 번호. (int)
value: 읽을 펄스의 유형: HIGH 또는 LOW. (int)
timeout (옵션): 펄스 시작을 기다릴 시간 (uSec 단위). 기본값은 1초 (unsigned long)
펄스의 폭(Microseconds 단위) 또는 0 (timeout이 지날 때까지 펄스가 시작하지 않는 경우) (unsigned long)
이 함수는 Timer0 interrupt를 사용하여 펄스 폭을 측정한다. 이 함수는 Timer interrupt를 사용하기 때문에 Interrupt off 상태에서는 사용할 수 없다. 2 - 3uSec에서 3분까지 길이의 펄스 폭 측정이 가능하다.
Timer0 interrupt(Hardware interrupt)를 사용하기 때문에 일반적으로 더 좋은 선택일 수 있지만 다른 장치에서 Hardware interrupt를 사용하는 경우 이 장치의 Interrupt가 종료 될 때 까지 지연(오차가 발생)될 수 있다. 2 - 3us에서 3분까지 길이의 펄스 폭 측정이 가능하다. ESP8266인 경우 Timer0를 WiFI 등에서 사용하기 때문에 사용하지 않는 것이 좋다.
초음파 거리 센서(HC-SR04) 모듈을 사용하는 구성도 예
초음파 거리 센서(HC-SR04) 모듈은 초음파를 반사하는 물체까지의 거리에 비례한 Pulse 폭을 출력한다.
이 프로그램에서는 Hardware timer(Timer1)를 사용하여 측정 주기를 발생시킨다.
주: ESP8266 NodeMCU 개발보드를 사용하는 경우에는 FLASH Switch와 RST Switch를 누르지 않아도 자동으로 업 로드 된다.
- 온도/습도 센서(DHT11/DHT22) 모듈
- 온도/습도 센서(DHT11/DHT22) 모듈을 제어하는 프로그램 예
- 온도/습도 센서(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초 동안 누른다.
- Upload 가 완료되면 "툴 -> 시리얼 모니터"를 실행하여 시리얼 모니터 창을 Open 한다.
- 실험
- "업 로드"가 완료되면 프로그램이 자동으로 실행된다.
- 프로그램이 실행되면 온도와 습도 측정 결과가 1초 간격으로 시리얼 모니터 창에 출력된다.
- 온도와 습도를 변동(센서에 손가락을 대고 있으면 온도와 습도가 변동함) 시키며 실험한다.
DHT11/DHT22 센서 모듈을 사용하는 구성도 예
온도/습도 센서(DHT11/DHT22) 모듈은 측정한 온도/습도 값을 디지털 데이터로 변환하여 Single-Wire 통신 프로토콜로 출력한다.
주: ESP8266 NodeMCU 개발보드를 사용하는 경우에는 FLASH Switch와 RST Switch를 누르지 않아도 자동으로 업 로드 된다.
- 디지털 출력 온도 센서(DS1621)
- 디지털 출력 온도 센서(DS1621)를 제어하는 프로그램 예
- ESP8266/ESP32 센서와 제어모듈 관련 페이지 보기
I2C 통신을 이용한 측정 과 제어 시스템 구성도
주: I2C Pull-Up 저항은 ESP 모듈에 내장되어 있기 때문에 이 구성도에는 생략되었음.
디지털 출력 온도 센서(DS1621)를 사용하는 시스템 구성과 프로그램 예는 "ESP32 I2C(Inter-Integrated Circuit) 통신"에서 설명하였으니 참고하기 바람.