공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
수위 센서에 관하여
물 수위 센서 핀배열
물 수위 센서에는 3개의 핀이 있습니다:
S (신호) 핀: 아날로그 출력으로 아두이노의 아날로그 입력 중 하나에 연결됩니다.
+ (VCC) 핀: 센서에 전력을 공급합니다. 3.3V – 5V 사이로 센서에 전력을 공급하는 것이 권장됩니다.
- (GND) 핀: 접지 연결입니다.
※ 주의:
센서의 VCC 핀에 공급되는 전압에 따라 신호 핀의 아날로그 출력 값이 변합니다.
수위 센서가 작동하는 방식
단순히 말해서, 센서가 물에 더 많이 잠길수록 신호 핀의 출력 전압이 더 높아집니다.
더 깊이 살펴보자.
이 섹션에는 압도될 수 있는 고급 정보가 포함되어 있습니다. 내용에 대해 확신이 없다면 건너뛰어 다음 섹션으로 이동하십시오.
센서에는 노출된 구리 트레이스가 열 개 있습니다. 다섯 개는 전원 트레이스이고 다섯 개는 센스 트레이스입니다. 이 트레이스들은 서로 교차하도록 병렬로 배치되어 있어서, 두 개의 전원 트레이스 사이마다 하나의 센스 트레이스가 있습니다. 이 트레이스들은 물에 잠겼을 때 물이 다리를 형성할 때만 연결됩니다.
물의 높이에 따라 저항이 변하는 가변 저항기(포텐쇼미터와 같이)처럼 흔적이 작용합니다.
저항의 변화는 센서 상단부터 물 표면까지의 거리에 해당합니다.
저항은 물의 높이에 반비례합니다:
센서가 잠긴 물의 양이 많을수록 전도성이 좋아지고, 저항은 낮아집니다.
센서가 잠긴 물의 양이 적을수록 전도성이 나빠지고, 저항은 높아집니다.
센서는 저항에 따라 출력 전압을 생산합니다.
전압을 측정함으로써 우리는 수위를 결정할 수 있습니다.
선연결
이론적으로 센서에 전력을 공급하기 위해 센서의 VCC와 GND 핀을 아두이노의 5v와 GND 핀에 각각 연결할 수 있습니다.
실제로는 그 방법이 권장되지 않습니다. 습한 환경에서 센서에 지속적으로 전력을 공급하면, 센서가 전기화학적으로 더 빨리 부식되어 센서의 수명이 단축됩니다. 이 문제를 해결하기 위해, 센서의 값을 읽을 때만 센서에 전원을 공급하고, 그 외의 시간에는 센서에 전원을 공급하지 않는 것이 좋습니다. 이는 아두이노의 디지털 핀에 센서의 VCC 핀을 연결하고, 읽기 전후로 아두이노의 핀을 각각 HIGH와 LOW로 설정함으로써 수행할 수 있습니다.
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-water-sensor */#define POWER_PIN 7#define SIGNAL_PIN A5int value = 0; // 센서 값 저장 변수voidsetup() {Serial.begin(9600);pinMode(POWER_PIN, OUTPUT); // D7 핀을 출력으로 설정digitalWrite(POWER_PIN, LOW); // 센서 끄기}voidloop() {digitalWrite(POWER_PIN, HIGH); // 센서 켜기delay(10); // 10밀리초 기다림 value = analogRead(SIGNAL_PIN); // 센서에서 아날로그 값 읽기digitalWrite(POWER_PIN, LOW); // 센서 끄기Serial.print("Sensor value: ");Serial.println(value);delay(1000);}
사용 방법
위 코드를 복사하고 Arduino IDE로 엽니다.
Arduino IDE에서 Upload 버튼을 클릭하여 코드를 Arduino로 업로드합니다.
센서를 천천히 물에 담그세요(한 잔의 물).
시리얼 모니터에서 결과를 확인하세요. 센서가 아무것도 만지지 않을 때 값은 0입니다.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-water-sensor */#define LED_PIN 2#define POWER_PIN 7#define SIGNAL_PIN A5#define THRESHOLD 300int value = 0; // 센서 값 저장 변수voidsetup() {Serial.begin(9600);pinMode(LED_PIN, OUTPUT); // D2 핀을 출력으로 설정pinMode(POWER_PIN, OUTPUT); // D7 핀을 출력으로 설정digitalWrite(POWER_PIN, LOW); // 센서 끄기digitalWrite(LED_PIN, LOW); // LED 끄기}voidloop() {digitalWrite(POWER_PIN, HIGH); // 센서 켜기delay(10); // 10 밀리초 기다리기 value = analogRead(SIGNAL_PIN); // 센서에서 아날로그 값 읽기digitalWrite(POWER_PIN, LOW); // 센서 끄기if (value > THRESHOLD) {Serial.print("The water is detected");digitalWrite(LED_PIN, HIGH); // LED 켜기 } else {digitalWrite(LED_PIN, LOW); // LED 끄기 }}
수위 측정 방법
만약 최대 수위를 몇 단계로 나누어 현재의 높이를 측정하고 싶다면, 아래 코드에 있는 방법을 사용할 수 있습니다. 최대 수위는 센서의 높이와 동일하다는 점을 유의하세요. 아래 코드는 최대 높이를 4단계로 나눕니다.
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-water-sensor */#define POWER_PIN 7#define SIGNAL_PIN A5#define SENSOR_MIN 0#define SENSOR_MAX 521int value = 0; // 센서 값 저장 변수int level = 0; // 수위 저장 변수voidsetup() {Serial.begin(9600);pinMode(POWER_PIN, OUTPUT); // D7 핀을 출력으로 설정digitalWrite(POWER_PIN, LOW); // 센서 끄기}voidloop() {digitalWrite(POWER_PIN, HIGH); // 센서 켜기delay(10); // 10밀리초 기다림 value = analogRead(SIGNAL_PIN); // 센서에서 아날로그 값 읽기digitalWrite(POWER_PIN, LOW); // 센서 끄기 level = map(value, SENSOR_MIN, SENSOR_MAX, 0, 4); // 4 단계Serial.print("Water level: ");Serial.println(level);delay(1000);}
※ 주의:
SENSOR_MIN 및 SENSOR_MAX는 보정 과정을 통해 결정됩니다.
위의 매핑 방법은 정확하지 않습니다. 그러나 많은 응용 프로그램에서는 받아들일 수 있습니다. 정확하게 하고 싶다면 각 레벨에 대한 임계값을 측정할 수 있습니다. 보정 부분을 참조하십시오.
수위 센서 교정
센서의 출력 값은 물의 수위뿐만 아니라 물의 전도성에도 달려 있습니다. 순수한 물은 전도성이 없습니다. 물속에 미네랄과 불순물이 포함되어 있으면 전도성이 있습니다. 물의 전도성이 클수록 센서는 더 민감합니다. 한편, 출력 값은 센서의 VCC 핀에 공급된 전압에 따라서도 달라집니다.
물 센서의 정확한 판독 값을 얻기 위해, 모니터링할 특정 유형의 물에 대해 센서를 보정할 것을 권장합니다.
액션을 촉발하는 임계값을 결정하기 전에, 테스트를 수행하여 센서에서 읽은 실제 값을 측정해야 합니다.
테스트하는 방법:
위의 스케치를 센서 값을 읽기 위해 사용하세요.
원하는 수준을 임계값으로 설정하려면 센서를 물에 담그세요.
센서가 시리얼 모니터에 출력하는 값을 기록하세요.
그 값을 트리거할 동작의 임계값으로 사용하세요.
이 테스트는 몇 번의 시행착오가 필요할 수 있습니다.
이 검사는 또한 다음을 찾는 데 사용될 수 있습니다:
센서가 물에 잠기지 않았을 때 SENSOR_MIN 값
센서가 완전히 물에 잠겼을 때의 SENSOR_MAX 값
누수 감지를 위한 임계값
당신의 정도 척도 각 레벨에 대한 임계값
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
아래 동영상 데모는 아래 코드를 사용합니다:
/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-water-sensor */#include <Wire.h>#include <LiquidCrystal_I2C.h>LiquidCrystal_I2C lcd(0x27, 20, 4);// Water sensor pins#define SENSOR_POWER_PIN 5#define SENSOR_SIGNAL_PIN A0// Status indicator pins#define GREEN_LED_PIN 6#define YELLOW_LED_PIN 7#define RED_LED_PIN 8#define BUZZER_PIN 9// Calibrated sensor range#define SENSOR_MIN 30#define SENSOR_MAX 470// Exponential moving average filterfloat filteredSensor = 0.0;constfloat FILTER_ALPHA = 0.75;// Sensor sampling intervalunsignedlong lastSensorRead = 0;constunsignedlong SENSOR_INTERVAL = 100;// LCD refresh intervalunsignedlong lastLCDUpdate = 0;constunsignedlong LCD_INTERVAL = 250;// Buzzer timingunsignedlong lastBuzzerTime = 0;constunsignedlong BUZZER_INTERVAL = 300;bool buzzerState = false;/** * Read the water sensor while powering it only during measurement. * This helps reduce sensor corrosion during long-term operation. */int readWaterSensor() {digitalWrite(SENSOR_POWER_PIN, HIGH);delayMicroseconds(500);int val = analogRead(SENSOR_SIGNAL_PIN);digitalWrite(SENSOR_POWER_PIN, LOW);return val;}voidsetup() {Serial.begin(115200);// Use 10-bit ADC resolution for Arduino UNO R4. #if defined(ARDUINO_UNOR4_MINIMA) || defined(ARDUINO_UNOR4_WIFI)analogReadResolution(10); #endif// Configure sensor power and signal pins.pinMode(SENSOR_POWER_PIN, OUTPUT);digitalWrite(SENSOR_POWER_PIN, LOW);// Configure LEDs and buzzer.pinMode(GREEN_LED_PIN, OUTPUT);pinMode(YELLOW_LED_PIN, OUTPUT);pinMode(RED_LED_PIN, OUTPUT);pinMode(BUZZER_PIN, OUTPUT);// Ensure all indicators are OFF at startup.digitalWrite(GREEN_LED_PIN, LOW);digitalWrite(YELLOW_LED_PIN, LOW);digitalWrite(RED_LED_PIN, LOW);digitalWrite(BUZZER_PIN, LOW);// Initialize LCD. lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(4, 0); lcd.print("WATER LEVEL"); lcd.setCursor(6, 1); lcd.print("MONITOR"); lcd.setCursor(5, 3); lcd.print("Starting...");delay(1500); lcd.clear();// Initialize the filter with the first sensor reading. filteredSensor = readWaterSensor();}voidloop() {// Read and filter the sensor periodically.if (millis() - lastSensorRead >= SENSOR_INTERVAL) { lastSensorRead = millis();int rawSensor = readWaterSensor();// Apply exponential moving average to reduce sensor noise. filteredSensor = FILTER_ALPHA * rawSensor + (1.0 - FILTER_ALPHA) * filteredSensor;// Limit the sensor value to the calibrated range.int clampedSensor = constrain( (int)filteredSensor, SENSOR_MIN, SENSOR_MAX );// Convert the sensor value into a water level from 0 to 4.int level = map( clampedSensor, SENSOR_MIN, SENSOR_MAX, 0, 4 );// Update the LED indicator according to the water level.if (level == 0) {digitalWrite(GREEN_LED_PIN, LOW);digitalWrite(YELLOW_LED_PIN, LOW);digitalWrite(RED_LED_PIN, LOW); }elseif (level <= 2) {digitalWrite(GREEN_LED_PIN, HIGH);digitalWrite(YELLOW_LED_PIN, LOW);digitalWrite(RED_LED_PIN, LOW); }elseif (level == 3) {digitalWrite(GREEN_LED_PIN, LOW);digitalWrite(YELLOW_LED_PIN, HIGH);digitalWrite(RED_LED_PIN, LOW); }else {digitalWrite(GREEN_LED_PIN, LOW);digitalWrite(YELLOW_LED_PIN, LOW);digitalWrite(RED_LED_PIN, HIGH); } }// Convert the filtered sensor value into the current water level.int currentLevel = map(constrain( (int)filteredSensor, SENSOR_MIN, SENSOR_MAX ), SENSOR_MIN, SENSOR_MAX, 0, 4 );// Activate the buzzer when the water level reaches the maximum.if (currentLevel == 4) {if (millis() - lastBuzzerTime >= BUZZER_INTERVAL) { lastBuzzerTime = millis(); buzzerState = !buzzerState;digitalWrite(BUZZER_PIN, buzzerState ? HIGH : LOW); } } else {// Immediately stop the buzzer when the level drops below maximum.digitalWrite(BUZZER_PIN, LOW); buzzerState = false; }// Refresh the LCD periodically to avoid unnecessary screen updates.if (millis() - lastLCDUpdate >= LCD_INTERVAL) { lastLCDUpdate = millis(); lcd.setCursor(0, 0); lcd.print("Water Level "); lcd.setCursor(0, 1); lcd.print("Level: "); lcd.print(currentLevel); lcd.print(" / 4 ");// Output sensor data for debugging and calibration.Serial.print("ADC: ");Serial.print((int)filteredSensor);Serial.print(" | Level: ");Serial.print(currentLevel);Serial.println(" / 4"); }}