아두이노 우노 Q 레인 센서

레인 센서는 비나 눈을 감지하고 강우 강도를 측정할 수 있습니다. 디지털 출력(비/비 없음)과 아날로그 출력(강도 수준)을 모두 제공합니다. Arduino UNO Q에서 MCU의 12비트 ADC는 더 높은 해상도의 강도 읽기를 제공합니다. Bridge와 Telegram을 사용하면 휴대폰에서 즉시 비 알림을 받을 수 있습니다.

이 튜토리얼에서는 다음을 배우게 됩니다:

Arduino UNO Q rAIn sensor

필요한 하드웨어

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

레인 센서 소개

레인 센서는 두 부분으로 구성됩니다: 감지 패드전자 모듈.

rAIn sensor 사용법 핀아웃

감지 패드: 옥외에 배치됩니다(지붕이나 창틀에). 교대로 배치된 전원 및 센서 구리선이 있으며, 비가 내릴 때 물이 이 선들을 연결합니다.

전자 모듈: 패드 신호를 읽을 수 있는 출력으로 변환합니다:

  • VCC 핀: 3.3V ~ 5V 전원
  • GND 핀: 접지
  • DO 핀: 디지털 출력 — HIGH = 비 없음, LOW = 비 감지됨. 감도는 기판 상의 포텐셔미터로 설정합니다.
  • AO 핀: 아날로그 출력 — 값이 낮음 = 비가 더 많음, 값이 높음 = 비가 덜함. 포텐셔미터는 AO에 영향을 주지 않습니다.

또한 두 개의 LED가 있습니다:

  • PWR-LED: 전원 표시기
  • DO-LED: 비가 감지될 때(DO 핀 LOW) 켜집니다

작동 방식

  • DO 핀: 포텐셔미터가 임계값을 설정합니다. 비가 임계값을 초과하면 DO는 LOW가 됩니다. 감도를 설정하려면 포텐셔미터를 조정하세요.
  • AO 핀: 패드의 물의 양에 비례하는 아날로그 전압을 계속 출력합니다. Arduino UNO Q에서 MCU는 이를 12비트 값(0–4095)으로 읽습니다 — 더 낮은 값은 더 많은 비를 의미합니다.

※ 주의:

VCC를 디지털 출력 핀에 연결하세요(항상 켜져 있는 5V가 아님). 읽기 중에만 센서에 전원을 공급하세요. 이것은 전화학적 부식을 줄이고 센서 수명을 연장합니다.

배선도

Arduino UNO Q rAIn sensor 연결 배선도

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

Rain Sensor Pin Arduino UNO Q MCU
GND GND
VCC D3 (controlled power)
DO D4
AO A0

레인 센서 프로그래밍 방법

  • 핀 설정:
pinMode(POWER_PIN, OUTPUT); pinMode(DO_PIN, INPUT);
  • 센서에 전원 공급, 두 출력 읽기, 그 다음 전원 차단:
digitalWrite(POWER_PIN, HIGH); // power on delay(10); // stabilize int do_state = digitalRead(DO_PIN); // HIGH = no rain, LOW = rain int ao_value = analogRead(AO_PIN); // 0-4095, lower = more rain digitalWrite(POWER_PIN, LOW); // power off
  • 디지털 출력에서 비 확인:
if (do_state == LOW) { Serial.println("Rain DETECTED"); } else { Serial.println("No rain"); }

Arduino UNO Q 코드

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

  • STM32 MCU는 매초 레인 센서의 DO(디지털) 및 AO(아날로그) 출력을 모두 읽습니다
  • Qualcomm MPU는 Debian Linux를 실행하고 Wi-Fi, Python 및 클라우드 연결을 처리합니다
  • 이 섹션에서는 MCU만 프로그래밍됩니다 — Linux 쪽은 유휴 상태로 유지됩니다. 이후 섹션에서는 두 프로세서가 Bridge를 통해 함께 작동하는 방식을 보여줍니다.

※ 주의:

Arduino UNO Q MCU는 12비트 ADC(0–4095)를 사용합니다. AO 강도 값은 이 범위에 있을 것입니다 — 감지 임계값을 적절히 조정하세요.

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-rain-sensor */ // Rain sensor has two outputs: // DO: digital — HIGH = no rain, LOW = rain detected // AO: analog — lower value = more rain (12-bit ADC: 0-4095) // POWER_PIN: power sensor only when reading to reduce corrosion #define POWER_PIN 3 // The Arduino UNO Q MCU pin providing power to the rain sensor #define DO_PIN 4 // The Arduino UNO Q MCU pin connected to DO of the rain sensor #define AO_PIN A0 // The Arduino UNO Q MCU pin connected to AO of the rain sensor void setup() { Serial.begin(9600); pinMode(POWER_PIN, OUTPUT); pinMode(DO_PIN, INPUT); digitalWrite(POWER_PIN, LOW); // start with sensor powered off Serial.println("Arduino UNO Q Rain Sensor ready"); } void loop() { digitalWrite(POWER_PIN, HIGH); // power the sensor delay(10); // allow sensor to stabilize int do_state = digitalRead(DO_PIN); // HIGH = no rain, LOW = rain int ao_value = analogRead(AO_PIN); // 0-4095: lower = more rain digitalWrite(POWER_PIN, LOW); // power off sensor // Digital output if (do_state == LOW) { Serial.print("Rain DETECTED | "); } else { Serial.print("No rain | "); } // Analog output Serial.print("Intensity (AO): "); Serial.println(ao_value); delay(1000); }

빠른 단계

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

  • 연결: 배선도에 표시된 대로 레인 센서를 Arduino UNO Q MCU에 배선하세요.
  • Arduino App Lab 열기: Arduino App Lab을 시작하고 Arduino UNO Q가 감지될 때까지 기다리세요.
  • 새 앱 만들기: Create New App 버튼을 클릭하세요.
create new app in 아두이노 app lab on Arduino UNO Q
  • 앱에 이름을 지정하세요. 예를 들어: RainSensor
  • Create를 클릭하여 확인하세요.
아두이노 app lab app folders and files on Arduino UNO Q
  • 스케치 붙여넣기: 위의 MCU 코드를 복사하여 sketch/sketch.ino에 붙여넣으세요. 다른 파일은 기본값으로 유지하세요.
  • 라이브러리가 필요하지 않습니다 — 내장된 digitalRead()analogRead()만 사용합니다.
  • 업로드: Arduino App Lab에서 Run 버튼을 클릭하세요.
click run 버튼 in 아두이노 app lab on Arduino UNO Q
  • 감지 패드에 몇 방울의 물을 놓고 Serial Monitor에서 출력을 관찰하세요.
  • DO LED가 올바르게 응답하지 않으면 모듈의 포텐셔미터를 조정하세요.

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 Rain Sensor ready [2026-04-29 09:00:02] No rain | Intensity (AO): 4090 [2026-04-29 09:00:03] No rain | Intensity (AO): 4088 [2026-04-29 09:00:04] Rain DETECTED | Intensity (AO): 1243 [2026-04-29 09:00:05] Rain DETECTED | Intensity (AO): 876 [2026-04-29 09:00:06] Rain DETECTED | Intensity (AO): 512 [2026-04-29 09:00:07] No rain | Intensity (AO): 3950

Bridge: Linux + MCU

이 섹션에서는 Arduino UNO Q의 두 프로세서를 모두 프로그래밍하여 Linux 쪽이 Bridge를 통해 빗 상태를 읽고 비 시작 이벤트를 수신할 수 있도록 하는 방법을 보여줍니다:

  • 레인 센서는 MCU에 연결됩니다 — MCU는 매초 DO와 AO를 읽고 값을 캐시합니다
  • MPU는 센서 핀을 직접 읽을 수 없습니다 — 상태, 아날로그 값 또는 이벤트를 얻기 위해 Bridge 함수를 호출합니다
  • MPU에는 Wi-Fi가 있습니다 — 전체 Debian Linux를 실행하여 비가 감지되는 순간 Telegram 알림을 보낼 수 있습니다
  • Arduino_RouterBridge는 두 프로세서 간의 RPC 통신을 활성화합니다
  • ⚠️ /dev/ttyHS1(Linux)과 Serial1(MCU)은 라우터에 의해 예약됨 — 사용자 코드에서 절대 열지 마세요

요약하면: MCU가 DO 핀을 통해 비를 감지 → 이벤트 플래그 설정 → MPU가 Bridge 폴링 → MPU가 Telegram 알림 전송.

MCU 코드 (Bridge)

/* * 이 Arduino UNO Q 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino UNO Q 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-q/arduino-uno-q-rain-sensor */ #include "Arduino_RouterBridge.h" #define POWER_PIN 3 // The Arduino UNO Q MCU pin providing power to the rain sensor #define DO_PIN 4 // The Arduino UNO Q MCU pin connected to DO of the rain sensor #define AO_PIN A0 // The Arduino UNO Q MCU pin connected to AO of the rain sensor // Cache int cached_ao = 4095; // start at max (dry) bool cached_rain = false; // from DO pin bool rain_event = false; bool prev_rain = false; unsigned long last_read_ms = 0; const unsigned long READ_INTERVAL = 1000; String get_state(String arg) { return cached_rain ? "rain" : "no_rain"; } String get_value(String arg) { return String(cached_ao); } String get_event(String arg) { if (rain_event) { rain_event = false; return "rain_detected"; } return "none"; } void setup() { Bridge.begin(); Monitor.begin(); pinMode(POWER_PIN, OUTPUT); pinMode(DO_PIN, INPUT); digitalWrite(POWER_PIN, LOW); Bridge.provide("get_state", get_state); Bridge.provide("get_value", get_value); Bridge.provide("get_event", get_event); Monitor.println("Arduino UNO Q Rain 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); int do_state = digitalRead(DO_PIN); cached_ao = analogRead(AO_PIN); digitalWrite(POWER_PIN, LOW); cached_rain = (do_state == LOW); // LOW = rain detected if (cached_rain && !prev_rain) { rain_event = true; Monitor.print("Rain detected! AO value: "); Monitor.println(cached_ao); } else if (!cached_rain && prev_rain) { Monitor.println("Rain stopped."); } prev_rain = cached_rain; } }

Python 코드 (Bridge)

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

빠른 단계

  • 연결: 배선도에 표시된 대로 레인 센서를 Arduino UNO Q에 배선하세요.
  • Arduino App Lab 열기: Arduino App Lab을 시작하고 보드가 감지될 때까지 기다리세요.
  • 새 앱 만들기: Create New App을 클릭하고, RainSensorBridge라는 이름을 입력한 다음 Create를 클릭하세요.
  • MCU 스케치 붙여넣기: 위의 MCU Bridge 코드를 복사하여 sketch/sketch.ino에 붙여넣으세요.
  • Python 코드 붙여넣기: 위의 Python Bridge 코드를 복사하여 앱의 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 Rain Sensor Bridge ready [2026-04-29 09:00:05] Rain detected! AO value: 987 [2026-04-29 09:00:08] Rain stopped.
DIYables_Apps
Stop
sketch.ino
1#include "Arduino_RouterBridge.h"
Serial Monitor
Python
[2026-04-29 09:00:02] Rain state: no_rain AO value: 4090 [2026-04-29 09:00:05] Rain state: rain AO value: 987 [2026-04-29 09:00:08] Rain state: no_rain AO value: 4080

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-rain-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(): # Auto-alert when rain starts event = Bridge.call("get_event") if event == "rain_detected": value = Bridge.call("get_value") print(f"Rain detected! AO value: {value}") send_message(CHAT_ID, f"🌧️ Rain detected! Intensity (AO): {value}") # 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 Rain Sensor Bot\n" "/state - Rain detected or not (digital)\n" "/value - Read analog intensity (0-4095)\n" "Automatic alert when rain starts") elif text == "/state": result = Bridge.call("get_state") send_message(chat_id, f"Rain state: {result}") elif text == "/value": result = Bridge.call("get_value") send_message(chat_id, f"AO intensity value: {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 코드를 앱의 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] Rain detected! AO value: 875 [2026-04-29 09:10:12] Received: /state
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
/state
10:15 AM ✓✓
Rain state: no_rain
10:16 AM
🌧️ Rain detected! Intensity (AO): 875
10:17 AM
/value
10:18 AM ✓✓
AO intensity value: 875
10:19 AM
/state
10:20 AM ✓✓
Rain state: rain
10:21 AM

OpenClaw

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

프로젝트 아이디어

레인 센서와 Arduino UNO Q로 많은 유용한 프로젝트를 구축할 수 있습니다:

  • 비 경고 시스템: 감지 패드를 지붕에 설치하세요 — 비가 시작되면 MPU가 AO 강도 값과 함께 Telegram 알림을 보내므로 어디에서나 조치를 취할 수 있습니다(창을 닫고, 세탁물을 안으로 가져오세요)
  • 자동 차양 컨트롤러: 레인 센서를 모터/릴레이와 함께 사용하세요 — 비가 감지되면 MCU는 Bridge를 통해 자동으로 차양 또는 블라인드를 닫고 Telegram 알림을 보냅니다
  • 강우 로거: 매 비 감지 이벤트를 타임스탬프와 AO 강도와 함께 Linux의 CSV 파일에 기록하세요 — 일일 강우량 요약을 생성하고 자정에 Telegram으로 보내세요
  • 스마트 관개 억제 장치: 펌프 튜토리얼과 결합하세요 — 비가 감지되면 Python은 예정된 관개 사이클을 건너뛰어 물을 절약하고 이유를 설명하는 Telegram 메시지를 보냅니다
  • 옥상 정원 모니터: AO 값을 사용하여 시간에 따른 비 강도를 추적하세요 — Python은 매 15분마다 평균 강우량을 계산하고 정기적인 Telegram 요약을 보냅니다

당신의 실력을 시험해보세요

Arduino UNO Q의 레인 센서로 더 나아갈 준비가 되었나요? 이 과제들을 시도해보세요:

  • 쉬움: Python에서 AO 강도를 분류하세요: int(value) > 3000"dry", > 1500"light rain", > 500"moderate rain", 그 외 "heavy rain" — 모든 Telegram 알림에 이 라벨을 포함하세요.
  • 중간: 비 지속 시간 추적기 구현: 비가 감지될 때 시작 시간을 기록하고 비가 멈췌을 때 종료 시간을 기록하세요 — 비가 멈춘 경우 지속된 시간을 보고하는 Telegram 메시지를 보내세요.
  • 고급: 24시간 강우 차트 구축: 매분 Python의 목록에 AO 값을 기록하세요 — 지난 24시간 동안 시간당 강우 강도의 텍스트 기반 막대 차트를 보내는 /chart Telegram 명령을 구현하세요.