ESP32 마이크로파이썬 물 센서

이 가이드는 ESP32와 MicroPython을 사용하여 물 센서를 활용하는 방법을 안내합니다. 이를 통해 누수 감지, 강우량 측정, 탱크의 넘침 여부 확인 또는 수위 모니터링을 할 수 있습니다. 자세히 알아보겠습니다.

ESP32 마이크로파이썬 및 물 센서 모듈

준비물

1×ESP32 ESP-WROOM-32 개발 모듈 쿠팡 | 아마존
1×USB 케이블 타입-A to 타입-C (USB-A PC용) 쿠팡 | 아마존
1×USB 케이블 타입-C to 타입-C (USB-C PC용) 아마존
1×Water level sensor 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) ESP32용 스크루 터미널 확장 보드 쿠팡 | 아마존
1×(추천) ESP32용 전원 분배기 쿠팡 | 아마존
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

물 수위 센서에 대하여

수위 센서 핀아웃

수위 센서에는 세 개의 핀이 있습니다:

  • S (Signal) 핀: 아날로그 출력입니다. ESP32의 아날로그 입력에 연결하세요.
  • + (VCC) 핀: 센서에 전원을 공급합니다. 3.3V에서 5V 사이를 사용하세요.
  • - (GND) 핀: 접지 연결입니다.
물 센서 핀 배치

※ 주의:

센서에서 나오는 신호는 VCC 핀의 전압이 조정될 때 변합니다.

수위 센서 작동 원리

센서는 당신이 볼 수 있는 열 개의 구리선으로 구성되어 있습니다. 이 선 중 다섯 개는 전원용이고, 나머지 다섯 개는 감지용입니다. 두 전선 사이마다 하나의 감지선이 위치한 패턴으로 배열되어 있습니다. 보통 이 선들은 서로 닿지 않지만, 센서가 물에 닿으면 물이 이 선들 사이의 다리 역할을 합니다.

와이어를 주변의 물의 양에 따라 저항이 변하는 특별한 종류의 노브처럼 생각해 보세요.

  • 수위가 높을수록 저항이 낮습니다.
  • 물이 많으면 전도성이 좋아져 저항이 낮아집니다.
  • 물이 적으면 전도성이 떨어져 저항이 높아집니다.

센서는 이 저항을 사용하여 출력 전압을 생성합니다. 이 전압을 측정함으로써, 우리는 수위가 얼마나 높은지 확인할 수 있습니다.

선연결

센서의 VCC 핀을 ESP32의 5V 핀에 연결하고 GND 핀을 ESP32의 GND 핀에 연결하여 전원을 공급합니다. 젖은 환경에서 센서의 전원을 계속 켜두는 것은 센서를 빠르게 손상시키고 수명을 단축시킬 수 있으므로 좋은 방법이 아닙니다. 이를 피하기 위해 센서의 데이터를 확인할 때만 전원을 켜세요. 센서의 VCC 핀을 ESP32의 디지털 핀에 연결합니다. 센서를 읽으려면 ESP32의 핀을 HIGH로 설정한 후, 읽은 다음 LOW로 설정하세요.

  • ESP32와 물 센서를 브레드보드를 사용하여 연결하는 방법
ESP32 마이크로파이썬 물 센서 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

ESP32와 물 센서를 연결하는 방법

ESP32 MicroPython 코드 - 수분 센서 값 읽기

/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-water-sensor */ from machine import Pin, ADC import time POWER_PIN = 17 # The ESP32 pin GPIO17 connected to the VCC pin of water sensor SIGNAL_PIN = 36 # The ESP32 pin GPIO36 (ADC0) connected to the S pin of water sensor # Setup power pin power = Pin(POWER_PIN, Pin.OUT) power.value(0) # Initially turn off the sensor # Setup ADC for reading the water sensor signal = ADC(Pin(SIGNAL_PIN)) # Set the ADC width (resolution) to 12 bits signal.width(ADC.WIDTH_12BIT) # Set the attenuation to 11 dB, allowing input range up to ~3.3V signal.atten(ADC.ATTN_11DB) while True: power.value(1) # Power on the sensor time.sleep(0.01) # Wait 10ms for sensor to stabilize value = signal.read() # Read the analog value (0-4095 range on ESP32) power.value(0) # Power off the sensor print("Sensor value:", value) # Print the value time.sleep(1) # Wait for a second before next read

자세한 사용 방법

ESP32에서 Thonny IDE를 사용하여 MicroPython 코드를 설정하고 실행하는 방법에 대한 지침은 다음과 같습니다:

  • 컴퓨터에 Thonny IDE가 설치되어 있는지 확인하세요.
  • ESP32 보드에 MicroPython 펌웨어가 로드되어 있는지 확인하세요.
  • MicroPython이 탑재된 ESP32를 처음 사용한다면 단계별 안내를 위해 ESP32 마이크로파이썬 - 시작하기 가이드를 확인하세요.
  • 제공된 다이어그램에 따라 ESP32 보드를 수위 센서에 연결하세요.
  • USB 케이블을 사용하여 ESP32 보드를 컴퓨터에 연결하세요.
  • 컴퓨터에서 Thonny IDE를 실행하세요.
  • Thonny IDE에서 도구 옵션으로 이동하세요.
  • 인터프리터 탭에서 드롭다운 메뉴에서 MicroPython (ESP32)를 선택하세요.
  • 올바른 포트가 선택되어 있는지 확인하세요. Thonny IDE는 보통 자동으로 감지하지만, 수동으로 선택해야 할 수도 있습니다(예: Windows에서는 COM12, Linux에서는 /dev/ttyACM0).
  • 제공된 MicroPython 코드를 복사하여 Thonny의 에디터에 붙여넣으세요.
  • 다음 단계를 따라 ESP32에 코드를 저장하세요:
    • 저장 버튼을 클릭하거나 Ctrl+S를 누르세요.
    • 저장 대화 상자에서 MicroPython 장치를 선택하세요.
    • 파일 이름을 main.py로 지정하세요.
  • 녹색 실행 버튼을 클릭하거나 F5를 눌러 스크립트를 실행하세요.
  • 센서를 천천히 물이 담긴 유리잔에 넣으세요.
  • Thonny의 하단 Shell에서 메시지를 확인하세요.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot Sensor value: 0 Sensor value: 0 Sensor value: 99 Sensor value: 387 Sensor value: 1135 Sensor value: 1711 Sensor value: 1737 Sensor value: 1763 Sensor value: 1819 Sensor value: 1865 Sensor value: 2082 Sensor value: 2111 Sensor value: 2210
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

※ 주의:

센서를 완전히 담그지 말고 전자 보드의 보이는 부분만 물에 닿게 하십시오. 설치 시 주의하십시오.

※ 주의:

이 튜토리얼은 수중 센서에 연결된 ADC(아날로그-디지털 컨버터)에서 값을 읽기 위해 adc.read() 함수를 사용하는 방법을 보여줍니다. ESP32의 ADC는 높은 정밀도가 필요하지 않은 프로젝트에 적합합니다. 그러나 프로젝트에 정확한 측정이 필요한 경우 다음 사항을 유의하십시오:

  • ESP32 ADC는 완벽하게 정확하지 않으며 정밀한 결과를 위해 보정(calibration)이 필요할 수 있습니다. 각 ESP32 보드는 약간의 차이가 있을 수 있으므로 각 보드별로 보정이 필요합니다.
  • 보정은 특히 초보자에게는 어려울 수 있으며, 항상 원하는 정확한 결과를 얻지 못할 수도 있습니다.

높은 정밀도가 필요한 프로젝트의 경우 ESP32와 함께 외부 ADC(e.g., ADS1115)를 사용하거나, 더 신뢰할 수 있는 ADC를 가진 아두이노(Arduino)를 고려하십시오. 여전히 ESP32 ADC의 보정을 원하신다면 ESP32 ADC Calibration Driver를 참고하십시오.

물 누수를 감지하는 방법

물 누수, 비 또는 탱크 넘침을 확인하기 위해, 판독값을 미리 설정된 한계와 비교합니다. 이 한계는 이 튜토리얼의 교정 과정에서 설정됩니다. 아래의 ESP32 MicroPython 코드는 물 누수를 감지하는 방법을 보여줍니다.

/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-water-sensor */ from machine import Pin, ADC import time POWER_PIN = 17 # The ESP32 pin GPIO17 connected to the VCC pin of water sensor SIGNAL_PIN = 26 # The ESP32 pin GPIO36 (ADC0) connected to the S pin of water sensor THRESHOLD = 1000 # Setup the power pin power = Pin(POWER_PIN, Pin.OUT) power.value(0) # Initially turn off the sensor # Setup ADC for reading the water sensor signal = ADC(Pin(SIGNAL_PIN)) # Set the ADC width (resolution) to 12 bits signal.width(ADC.WIDTH_12BIT) # Set the attenuation to 11 dB, allowing input range up to ~3.3V signal.atten(ADC.ATTN_11DB) # Initialize the power pin to off power.value(0) while True: power.value(1) # Turn on power to the sensor time.sleep_ms(10) # Short delay to allow sensor to stabilize value = signal.read() # Read the analog value from sensor power.value(0) # Turn off power to the sensor if value > THRESHOLD: # Check if the water level exceeds the threshold print("Water detected") time.sleep(1) # Delay for a second before the next reading

물 수위 측정 방법

최고 수위를 여러 단계로 나누어 현재 단계를 식별하려면 아래 코드의 방법을 따르십시오. 최고 수위는 센서가 물에 완전히 잠긴 상태에 해당함을 명심하십시오. 이 코드는 전체 높이를 4단계로 분할합니다.

/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-water-sensor */ from machine import Pin, ADC import time POWER_PIN = 17 # The ESP32 pin GPIO17 connected to the VCC pin of water sensor SIGNAL_PIN = 26 # The ESP32 pin GPIO36 (ADC0) connected to the S pin of water sensor SENSOR_MIN = 0 SENSOR_MAX = 2088 # Setup the power pin power = Pin(POWER_PIN, Pin.OUT) # Setup ADC for reading the water sensor signal = ADC(Pin(SIGNAL_PIN)) # Set the ADC width (resolution) to 12 bits signal.width(ADC.WIDTH_12BIT) # Set the attenuation to 11 dB, allowing input range up to ~3.3V signal.atten(ADC.ATTN_11DB) # Function to map the sensor value from one range to another def map_value(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min power.value(0) # Initially turn off the sensor while True: power.value(1) # Activate the sensor time.sleep_ms(10) # Wait for the sensor to stabilize value = signal.read() # Read the sensor output power.value(0) # Deactivate the sensor # Map the value to a 0-4 scale, adjusting for 16-bit ADC value level = map_value(value, SENSOR_MIN, SENSOR_MAX * 4095, 0, 4) # Print the water level print("Water level:", level) time.sleep(1) # Delay for one second before repeating

※ 주의:

  • SENSOR_MIN과 SENSOR_MAX는 보정 중에 설정됩니다.
  • 설명된 매핑 방식은 완전히 정밀하지 않을 수 있지만 대부분의 용도에는 충분합니다. 보다 정확한 결과를 원한다면 보정 섹션에 설명된대로 각 레벨에 대한 임계값을 측정하세요.

수위 센서 보정

센서의 출력은 수위와 전도도 모두에 따라 달라집니다. 순수한 물은 전기를 전도하지 않지만, 미네랄과 불순물이 있는 물은 전기를 전도합니다. 물이 더 전도성이 높을수록 센서가 더 민감해집니다. 또한, 센서의 VCC 핀에 공급되는 전압에 따라 출력이 달라질 수 있습니다.

정확한 물 센서 측정을 위해 모니터링하려는 특정한 유형의 물에 대해 캘리브레이션하는 것이 가장 좋습니다. 동작을 트리거할 임계값을 설정하기 전에 센서가 읽는 실제 값을 테스트해야 합니다.

테스트 수행 방법:

  • 위의 스케치를 사용하여 센서의 값을 읽습니다.
  • 센서를 원하는 임계값을 설정할 위치의 물에 담급니다.
  • Thonny 하단의 Shell에 표시된 값을 적어 둡니다.
  • 이 값을 임계값으로 사용하여 동작을 트리거합니다.
  • 제대로 맞추기 위해 이 테스트를 몇 번 시도해야 할 수도 있습니다.

이 테스트는 또한 당신이 찾을 수 있도록 도와줍니다:

  • 센서가 물에 있지 않을 때의 SENSOR_MIN 값
  • 센서가 완전히 잠겼을 때의 SENSOR_MAX 값
  • 누수를 감지하기 위한 임계값
  • 눈금의 서로 다른 수준에 대한 임계값