아두이노 우노 Q 물 센서

물 센서는 물 누수, 강우량 및 탱크 오버플로우를 감지할 수 있습니다. Arduino UNO Q에서 센서의 아날로그 신호는 12비트 MCU ADC(0-4095 범위)로 읽힙니다. Bridge와 Telegram을 사용하면 물이 감지되는 즉시 휴대폰에서 즉시 알림을 받습니다.

이 튜토리얼에서 배우게 될 내용:

Arduino UNO Q water sensor

필요한 하드웨어

1×Arduino UNO Q 아마존
1×USB Cable for Arduino Uno Q 아마존
1×Water level sensor 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 아두이노 우노용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino Uno 쿠팡 | 아마존
1×(추천) 아두이노 우노용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

물 센서에 대해

핀 배치

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

  • S (Signal): 아날로그 출력 — MCU의 아날로그 입력 핀에 연결합니다.
  • + (VCC): 전원 공급 — 3.3V 또는 5V에 연결합니다. 이 튜토리얼에서는 전원 제어를 위해 디지털 핀에 연결됩니다.
  • - (GND): 그라운드
water sensor 사용법 핀아웃

※ 주의:

VCC를 항상 켜져 있는 5V 대신 디지털 출력 핀에 연결하는 것이 좋습니다. 습한 환경에서 구리 패드의 부식을 줄이기 위해 읽을 때만 센서에 전원을 공급하세요.

작동 원리

센서에는 10개의 구리 트레이스가 있습니다 - 교대로 전원과 신호 선입니다. 건조할 때는 분리되어 있습니다. 물에 잠그면 물이 간격을 연결하고 저항을 변경합니다.

  • 물이 더 많음 → 저항이 낮음 → 출력 전압이 높음 → ADC 판독값이 높음
  • 물이 적음 → 저항이 높음 → 출력 전압이 낮음 → ADC 판독값이 낮음

Arduino UNO Q MCU는 3.3V 기준의 12비트 ADC를 사용하므로 판독값은 0에서 4095 범위입니다 (일반 Arduino Uno의 0-1023이 아님). 임계값을 특정 센서 및 물 유형에 맞게 조정하세요.

※ 주의:

노출된 구리 트레이스만 물에 닿아야 합니다. 전체 센서 보드 또는 구성 요소를 완전히 물에 잠그지 마세요. 센서 패드가 액체를 향하도록 설치하세요.

배선도

Arduino UNO Q water sensor 연결 배선도

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

Water Sensor Pin Arduino UNO Q MCU
* (GND) GND
+ (VCC) D5 (controlled power)
S (Signal) A0

물 센서를 위한 프로그래밍 방법

  • 핀 설정:
pinMode(POWER_PIN, OUTPUT); digitalWrite(POWER_PIN, LOW); // off by default
  • 센서 값 읽기:
digitalWrite(POWER_PIN, HIGH); // power on delay(10); // stabilize int value = analogRead(SIGNAL_PIN); // 0-4095 (12-bit ADC) digitalWrite(POWER_PIN, LOW); // power off
  • 물 감지:
if (value > THRESHOLD) { Serial.println("Water detected!"); }

Arduino UNO Q 코드

Arduino UNO Q에는 함께 작동하는 두 개의 프로세서가 있습니다:

  • STM32 MCU는 12비트 ADC를 통해 매초 물 센서를 읽고 결과를 출력합니다.
  • Qualcomm MPU는 Debian Linux를 실행하고 Wi-Fi, Python 및 클라우드 연결을 처리합니다.
  • 이 섹션에서는 MCU만 프로그래밍됩니다 - Linux 측은 유휴 상태로 유지됩니다. 나중 섹션에서는 Bridge를 통해 두 프로세서가 함께 작동하는 방법을 보여줍니다.

※ 주의:

Arduino UNO Q MCU는 3.3V 기준의 12비트 ADC(0-4095)를 사용합니다. 이는 5V 기준의 10비트 ADC(0-1023)를 사용하는 일반 Arduino Uno와 다릅니다. 보정할 때 THRESHOLD 값을 적절히 조정하세요.

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-water-sensor */ // Arduino UNO Q has a 12-bit ADC (0-4095) with 3.3V reference. // The water sensor VCC is powered only when reading to reduce corrosion. #define POWER_PIN 5 // The Arduino UNO Q MCU pin connected to VCC of water sensor #define SIGNAL_PIN A0 // The Arduino UNO Q MCU pin connected to the signal pin of water sensor // Threshold for detecting water (calibrate for your sensor and water) // With 12-bit ADC (0-4095), typical dry=0, partial=300-800, fully wet>1500 #define THRESHOLD 500 int value = 0; void setup() { Serial.begin(9600); pinMode(POWER_PIN, OUTPUT); digitalWrite(POWER_PIN, LOW); // start with sensor powered off Serial.println("Arduino UNO Q Water Sensor ready"); } void loop() { digitalWrite(POWER_PIN, HIGH); // power the sensor delay(10); // allow sensor to stabilize value = analogRead(SIGNAL_PIN); // read 12-bit ADC value (0-4095) digitalWrite(POWER_PIN, LOW); // power off the sensor Serial.print("Sensor value: "); Serial.print(value); if (value > THRESHOLD) { Serial.println(" => Water detected!"); } else { Serial.println(" => No water"); } delay(1000); }

빠른 단계

처음 Arduino UNO Q를 사용하시나요? 계속하기 전에 아두이노 우노 Q 시작하기 튜토리얼을 따르세요.

  • 연결: 배선도에 표시된 대로 물 센서를 Arduino UNO Q MCU에 배선합니다.
  • Arduino App Lab 열기: Arduino App Lab을 시작하고 Arduino UNO Q가 감지될 때까지 기다립니다.
  • 새 App 만들기: Create New App 버튼을 클릭합니다.
create new app in 아두이노 app lab on Arduino UNO Q
  • App에 이름을 지정합니다(예: WaterSensor).
  • Create를 클릭하여 확인합니다.
아두이노 app lab app folders and files on Arduino UNO Q
  • 스케치 붙여넣기: 위의 MCU 코드를 복사하여 sketch/sketch.ino에 붙여넣습니다. 다른 파일은 기본값으로 유지합니다.
  • 라이브러리 필요 없음 - 내장 analogRead()digitalWrite() 함수만 사용합니다.
  • 업로드: Arduino App Lab에서 Run 버튼을 클릭합니다.
click run 버튼 in 아두이노 app lab on Arduino UNO Q
  • 센서 패드를 물 한잔에 천천히 낮추고 Serial Monitor에서 ADC 값이 증가하는 것을 관찰합니다.

보정

업로드 후 센서 값을 관찰하세요:

  • 완전히 건조: 값 ≈ 0
  • 부분적으로 물에 잠김: 값 ≈ 300-1000
  • 대부분 물에 잠김: 값 ≈ 1500-3000

THRESHOLD를 건조 노이즈 수준 위로 설정하세요 (예: 500). 이렇게 하면 물의 존재를 안정적으로 감지할 수 있습니다.

App Lab 콘솔 출력

DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
Message (Enter to send a message to "Newbiely" on usb(2820070321))
New Line
9600 baud
[2026-04-29 09:00:01] Arduino UNO Q Water Sensor ready [2026-04-29 09:00:02] Sensor value: 0 => No water [2026-04-29 09:00:03] Sensor value: 0 => No water [2026-04-29 09:00:04] Sensor value: 312 => No water [2026-04-29 09:00:05] Sensor value: 875 => Water detected! [2026-04-29 09:00:06] Sensor value: 1943 => Water detected! [2026-04-29 09:00:07] Sensor value: 2501 => Water detected!

Bridge: Linux + MCU

이 섹션에서는 Arduino UNO Q의 두 프로세서를 모두 프로그래밍하여 Linux 측이 Bridge를 통해 센서 값을 읽고 물 감지 이벤트를 수신할 수 있도록 합니다:

  • 물 센서는 MCU에 연결됩니다 - MCU는 매초 ADC를 읽고 값을 캐시합니다.
  • MPU는 ADC를 직접 읽을 수 없습니다 - Bridge 함수를 호출하여 센서 값, 상태 또는 이벤트를 가져옵니다.
  • MPU는 Wi-Fi를 가지고 있습니다 - 전체 Debian Linux를 실행하므로 물이 처음 감지될 때 Telegram 알림을 보낼 수 있습니다.
  • Arduino_RouterBridge는 두 프로세서 간의 RPC 통신을 가능하게 합니다.
  • ⚠️ /dev/ttyHS1 (Linux)과 Serial1 (MCU)은 라우터에서 예약됨 - 사용자 코드에서 절대 열지 마세요.

요약: MCU가 매초 ADC를 읽음 → 상태 변화를 감지 → 이벤트 플래그를 설정 → MPU가 폴링하고 Telegram 알림을 보냅니다.

MCU 코드 (Bridge)

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-water-sensor */ // Arduino UNO Q has a 12-bit ADC (0-4095) with 3.3V reference. #include "Arduino_RouterBridge.h" #define POWER_PIN 5 // The Arduino UNO Q MCU pin connected to VCC of water sensor #define SIGNAL_PIN A0 // The Arduino UNO Q MCU pin connected to the signal pin of water sensor #define THRESHOLD 500 int cached_value = 0; bool water_event = false; bool prev_water_detected = false; unsigned long last_read_ms = 0; const unsigned long READ_INTERVAL = 1000; String get_value(String arg) { return String(cached_value); } String get_status(String arg) { return cached_value > THRESHOLD ? "water_detected" : "no_water"; } String get_event(String arg) { if (water_event) { water_event = false; return "water_detected"; } return "none"; } void setup() { Bridge.begin(); Monitor.begin(); pinMode(POWER_PIN, OUTPUT); digitalWrite(POWER_PIN, LOW); Bridge.provide("get_value", get_value); Bridge.provide("get_status", get_status); Bridge.provide("get_event", get_event); Monitor.println("Arduino UNO Q Water Sensor Bridge ready"); } void loop() { unsigned long now = millis(); if (now - last_read_ms >= READ_INTERVAL) { last_read_ms = now; digitalWrite(POWER_PIN, HIGH); delay(10); cached_value = analogRead(SIGNAL_PIN); digitalWrite(POWER_PIN, LOW); bool water_detected = cached_value > THRESHOLD; if (water_detected && !prev_water_detected) { water_event = true; Monitor.print("Water detected! Sensor value: "); Monitor.println(cached_value); } else if (!water_detected && prev_water_detected) { Monitor.println("Water gone. Sensor dry."); } prev_water_detected = water_detected; } }

Python 코드 (Bridge)

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-water-sensor */ from arduino.app_utils import * import time def loop(): value = Bridge.call("get_value") status = Bridge.call("get_status") print(f"Sensor value: {value} Status: {status}") time.sleep(1) App.run(user_loop=loop)

빠른 단계

  • 연결: 배선도에 표시된 대로 물 센서를 Arduino UNO Q에 배선합니다.
  • Arduino App Lab 열기: Arduino App Lab을 시작하고 보드가 감지될 때까지 기다립니다.
  • 새 App 만들기: Create New App을 클릭하고, WaterSensorBridge라고 이름을 지정한 후 Create를 클릭합니다.
  • MCU 스케치 붙여넣기: 위의 MCU Bridge 코드를 복사하여 sketch/sketch.ino에 붙여넣습니다.
  • Python 코드 붙여넣기: 위의 Python Bridge 코드를 복사하여 App의 Python 파일에 붙여넣습니다.
  • Install the library: Click the Add sketch library button (the open book icon with a + sign) in the left sidebar.
add sketch 라이브러리 in 아두이노 app lab on Arduino UNO Q
  • Search for Arduino_RouterBridge created by Arduino and click the Install button.
My Apps / DIYables Apps
Run
Bricks
No bricks added...
Sketch Libraries
No sketch libra...
Files
python
sketch
.gitignore
README.md
app.yaml
sketch.ino
Add sketch library
Arduino_RouterBridge Arduino

This library provides a simple RPC bridge for Arduino UNO Q boards, allowing communication between the board and other devices using MsgPack serialization.

0.4.1
Install
More Info
  • 업로드: Arduino App Lab에서 Run 버튼을 클릭합니다.
click run 버튼 in 아두이노 app lab on Arduino UNO Q
  • 센서 패드를 물에 담그고 두 콘솔에서 상태 변화를 관찰합니다.

App Lab 콘솔 출력

DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
Message (Enter to send a message to "Newbiely" on usb(2820070321))
New Line
9600 baud
[2026-04-29 09:00:01] Arduino UNO Q Water Sensor Bridge ready [2026-04-29 09:00:06] Water detected! Sensor value: 1243 [2026-04-29 09:00:09] Water gone. Sensor dry.
DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
[2026-04-29 09:00:02] Sensor value: 0 Status: no_water [2026-04-29 09:00:03] Sensor value: 0 Status: no_water [2026-04-29 09:00:06] Sensor value: 1243 Status: water_detected [2026-04-29 09:00:09] Sensor value: 12 Status: no_water

Telegram

Arduino UNO Q의 센서가 물을 감지했을 때 즉시 Telegram 알림을 받습니다.

MCU 스케치: 이전 Bridge 섹션에서와 동일한 MCU 스케치를 유지합니다.

Python 코드 (Telegram)

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-water-sensor */ from arduino.app_utils import * import requests import time TELEGRAM_BOT_TOKEN = "YOUR_TELEGRAM_BOT_TOKEN" CHAT_ID = "YOUR_CHAT_ID" last_update_id = 0 def get_updates(): global last_update_id url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/getUpdates" params = {"offset": last_update_id + 1, "timeout": 5} try: response = requests.get(url, params=params, timeout=10) data = response.json() if data["ok"]: return data["result"] except Exception as e: print(f"Error getting updates: {e}") return [] def send_message(chat_id, text): url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage" payload = {"chat_id": chat_id, "text": text} try: requests.post(url, data=payload, timeout=10) except Exception as e: print(f"Error sending message: {e}") def loop(): # Check for water event event = Bridge.call("get_event") if event == "water_detected": value = Bridge.call("get_value") print(f"Water event! Sensor value: {value}") send_message(CHAT_ID, f"💧 Water detected! Sensor value: {value}") # Check for Telegram commands updates = get_updates() for update in updates: last_update_id = update["update_id"] if "message" not in update: continue message = update["message"] chat_id = message["chat"]["id"] text = message.get("text", "").strip() print(f"Received: {text}") if text == "/start": send_message(chat_id, "Arduino UNO Q Water Sensor Bot\n" "/value - Read raw sensor value (0-4095)\n" "/status - Read water detection status\n" "Automatic alert when water is detected") elif text == "/value": result = Bridge.call("get_value") send_message(chat_id, f"Sensor value: {result}") elif text == "/status": result = Bridge.call("get_status") send_message(chat_id, f"Status: {result}") else: send_message(chat_id, "Unknown command. Send /start for help.") time.sleep(0.5) App.run(user_loop=loop)

빠른 단계

  • YOUR_TELEGRAM_BOT_TOKEN을 BotFather에서 받은 실제 봇 토큰으로 바꿉니다.
  • YOUR_CHAT_ID를 Telegram 채팅 ID로 바꿉니다.
  • 이 Python 코드를 App의 Python 파일에 붙여넣습니다 (동일한 MCU 스케치 유지).
  • Run 버튼을 클릭합니다. 센서를 물에 담그면 - Telegram 알림을 즉시 받습니다.

App Lab 콘솔 출력

DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
[2026-04-29 09:10:00] Waiting for Telegram messages... [2026-04-29 09:10:05] Water event! Sensor value: 1567 [2026-04-29 09:10:12] Received: /status
Telegram
Telegram 12:45
Welcome to Telegram!
ArduinoBot 10:19
Chatting with Arduino...
telegram-botfather
BotFather Yesterday
Your bot has been created.

ArduinoBot

bot
Today
/value
10:15 AM ✓✓
Sensor value: 0
10:16 AM
💧 Water detected! Sensor value: 1567
10:17 AM
/status
10:18 AM ✓✓
Status: water_detected
10:19 AM
/value
10:20 AM ✓✓
Sensor value: 1567
10:21 AM

OpenClaw

You can adapt the OpenClaw to this tutorial by refering the instruction on 아두이노 우노 Q - OpenClaw Tutorial

프로젝트 아이디어

물 센서와 Arduino UNO Q로 많은 유용한 프로젝트를 만들 수 있습니다:

  • 누수 경보 시스템: 싱크대, 세탁기 또는 온수기 아래에 물 센서를 배치합니다 - 누수가 감지되면 즉시 Telegram 알림을 받으며, 심각도 평가를 위해 원시 ADC 값이 포함됩니다.
  • 빗 게이지: 개방형 대피소 아래의 야외에 센서를 장착합니다. 강우량 시작을 감지합니다 - Python이 타임스탬프와 함께 빗 이벤트를 파일에 기록하고 일일 강우량 요약을 Telegram으로 보냅니다.
  • 수족관 오버플로우 방지: 탱크 가장자리에 센서를 배치합니다 - 수위가 센서에 닿으면 MPU가 Telegram으로 알려주고 선택적으로 Bridge를 통해 릴레이를 트리거하여 수펌프를 끕니다.
  • 식물 급수 모니터: 물 센서로 토양 수분을 확인합니다 - 건조함이 감지되면(낮은 ADC 판독값) Telegram 알림을 보내 식물에 물을 줄 시간을 알립니다.
  • 지하실 홍수 모니터: 지하실 전체 바닥 수준에 여러 센서를 설치합니다 - 각 센서는 별도의 아날로그 핀에 연결되고 Python은 어느 영역이 침수되었는지 Telegram을 통해 보고합니다.

스스로 도전해보세요

Arduino UNO Q의 물 센서로 더 나아가고 싶으신가요? 이러한 도전 과제를 시도해보세요:

  • 쉬움: Python에 수위 범주를 추가합니다: int(value) < 200"dry", < 800"damp", < 2000"wet", 그 외 "flooded" - 모든 Telegram 상태 답변과 함께 범주를 보냅니다.
  • 중간: 쿨다운 타이머를 구현합니다: 물 감지 이벤트가 Telegram 알림을 트리거한 후 동일한 이벤트에 대해 다른 알림을 보내기 전에 60초를 기다립니다 - 지속적인 누수 중 스팸을 방지합니다.
  • 고급: Linux의 CSV 파일에 10초마다 타임스탐프와 함께 모든 센서 판독값을 기록하고, 지난 시간의 요약을 보내는 /report Telegram 명령을 구현합니다: 최소값, 최대값, 물 감지 이벤트 수 및 물 접촉 시간.