공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
수위 센서에 대하여
수위 센서 핀아웃
수위 센서는 세 개의 핀을 포함합니다:
S (Signal) 핀: 아날로그 출력입니다. 이를 Arduino UNO R4의 아날로그 입력에 연결하세요.
+ (VCC) 핀: 이 핀은 센서에 전원을 공급합니다. 3.3V에서 5V를 사용하여 전원을 공급하세요.
- (GND) 핀: 이 핀은 접지 연결입니다.
※ 주의:
센서 신호 핀의 출력은 VCC 핀에 공급된 전압에 따라 변합니다.
수위 센서의 작동 원리
센서가 더 많은 물에 있을 때, 신호 핀의 출력 전압이 증가합니다.
자세히 살펴봅시다.
이 섹션에는 압도될 수 있는 고급 정보가 포함되어 있습니다. 내용에 대해 확신이 없다면 건너뛰어 다음 섹션으로 이동하십시오.
센서는 볼 수 있는 열 개의 구리선을 포함하고 있습니다. 다섯 개의 전원선과 다섯 개의 센서선이 있습니다. 이 선들은 각각 옆에 배열되어 있으며, 두 전원선 사이에 하나의 센서선이 번갈아가며 있습니다. 보통은 이 선들이 서로 닿지 않지만, 센서가 물에 넣어지면 물이 이 선들을 연결합니다.
그러나 센서를 항상 습한 환경에서 전원 공급하는 것은 권장되지 않습니다. 이는 센서가 빠르게 부식되어 수명이 단축될 수 있습니다. 이를 피하기 위해 센서의 데이터를 읽을 필요가 있을 때만 전원을 공급하는 것을 권장합니다. 센서의 VCC 핀을 Arduino UNO R4의 디지털 핀에 연결하여 이를 수행할 수 있습니다. 센서를 읽기 위해 Arduino의 핀을 HIGH로 설정하고, 완료되면 LOW로 설정하십시오.
Arduino Uno R4와 기타 부품에 전원을 공급하는 가장 효과적인 방법을 확인하시려면, 아래 링크를 참조하세요: 아두이노 우노 R4 전원 공급 방법.
Arduino UNO R4 코드 - 수위 센서에서 값 읽기
/* * 이 아두이노 우노 R4 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 우노 R4 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-r4/arduino-uno-r4-water-sensor */#define POWER_PIN 5 // 아두이노 UNO R4 핀은 전력 제어를 위해 센서의 VCC 핀에 연결되어 있습니다.#define SIGNAL_PIN A0 // 아두이노 UNO R4 핀은 센서의 신호 핀에 연결되어 있습니다.int value = 0; // 센서에서 읽은 값을 저장하는 변수voidsetup() {Serial.begin(9600); // 9600 baud로 시리얼 통신 시작pinMode(POWER_PIN, OUTPUT); // POWER_PIN을 출력으로 설정digitalWrite(POWER_PIN, LOW); // 초기에는 POWER_PIN을 LOW로 설정하여 센서를 끔}voidloop() {digitalWrite(POWER_PIN, HIGH); // POWER_PIN을 HIGH로 설정하여 센서에 전원 공급delay(10); // 센서가 안정화될 시간을 줌 (10ms 지연) value = analogRead(SIGNAL_PIN); // 센서에서 값을 읽음digitalWrite(POWER_PIN, LOW); // POWER_PIN을 LOW로 설정하여 센서를 끔Serial.print("Sensor value: "); // 시리얼 모니터에 센서 값을 출력Serial.println(value); // 센서 값을 표시delay(1000); // 다시 읽기 전에 1초 대기}
센서는 물에 완전히 잠기지 않아야 하며, 회로 기판의 노출된 부분만 물에 닿아야 합니다. 설치 시 주의해 주세요.
물 누수를 감지하는 방법
물 누수, 비 또는 탱크 넘침이 있는지 확인하려면 측정값을 설정된 한계와 비교합니다. 이 한계는 이 튜토리얼의 보정 단계에서 설정합니다.
Arduino UNO R4 코드 - 누수 감지
/* * 이 아두이노 우노 R4 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 우노 R4 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-r4/arduino-uno-r4-water-sensor */#define POWER_PIN 5 // 물 센서의 VCC 핀에 연결된 Arduino UNO R4 핀으로 전원을 제어#define SIGNAL_PIN A0 // 물 센서의 신호 핀에 연결된 Arduino UNO R4 핀#define THRESHOLD 300int value = 0; // 센서에서 읽은 값을 저장할 변수를 초기화voidsetup() {Serial.begin(9600);pinMode(POWER_PIN, OUTPUT); // 전원 핀을 출력으로 설정digitalWrite(POWER_PIN, LOW); // 처음에 전원을 끔}voidloop() {digitalWrite(POWER_PIN, HIGH); // 센서에 전원 공급delay(10); // 센서가 안정화될 시간을 줌 value = analogRead(SIGNAL_PIN); // 센서 출력을 읽음digitalWrite(POWER_PIN, LOW); // 센서 전원을 끔if (value > THRESHOLD) { // 센서 출력이 임계값을 초과하는지 확인Serial.print("The water is dedected"); // 시리얼 모니터에 메시지를 보냄 }}
물 높이를 측정하는 방법
최고 수위 수준을 다른 단계로 나누고 현재 단계를 확인하려면 다음 코드에 있는 기술을 사용하세요. 최고 수위는 센서의 높이와 일치한다는 것을 기억하세요. 이 코드는 최고 높이를 4단계로 나눕니다.
/* * 이 아두이노 우노 R4 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 우노 R4 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-r4/arduino-uno-r4-water-sensor */#define POWER_PIN 5 // 물 센서의 VCC 핀에 연결된 Arduino UNO R4 핀으로 전원을 제어#define SIGNAL_PIN A0 // 물 센서의 신호 핀에 연결된 Arduino UNO R4 핀#define SENSOR_MIN 0 // 센서의 최소값#define SENSOR_MAX 521 // 센서의 최대값int value = 0; // 현재 센서 값을 저장int level = 0; // 수위 표시기를 저장voidsetup() {Serial.begin(9600); // 시리얼 통신 초기화pinMode(POWER_PIN, OUTPUT); // 전원 핀을 출력으로 설정digitalWrite(POWER_PIN, LOW); // 처음에 센서를 끔}voidloop() {digitalWrite(POWER_PIN, HIGH); // 센서 활성화delay(10); // 센서가 안정화될 때까지 대기 value = analogRead(SIGNAL_PIN); // 센서 출력 읽기digitalWrite(POWER_PIN, LOW); // 센서 비활성화 level = map(value, SENSOR_MIN, SENSOR_MAX, 0, 4); // 센서 값을 0-4 범위로 매핑Serial.print("Water level: "); // 레이블 출력Serial.println(level); // 매핑된 수위 출력delay(1000); // 작업을 반복하기 전 1초 대기}
※ 주의:
SENSOR_MIN 및 SENSOR_MAX는 보정 과정에서 설정됩니다.
위의 매핑 방법이 정확하지 않을 수 있지만, 많은 경우에 잘 작동합니다. 정확성을 향상시키려면 보정 섹션에서 설명한 대로 각 레벨의 임계값을 측정하십시오.
수위 센서 보정
센서의 출력은 수위와 물이 얼마나 전도성이 있는지에 영향을 받습니다. 순수한 물은 전기를 통하지 않지만, 미네랄과 불순물이 섞인 물은 전기를 통합니다. 물의 전도성이 높을수록 센서의 감도가 더 높아집니다. 또한, 센서의 VCC 핀에 다른 전압이 적용될 때 출력 값이 변합니다.
정확한 수질 센서 판독을 위해, 모니터링할 특정 수질 유형에 맞춰 센서를 보정할 것을 권장합니다.
행동에 대한 한계를 설정하기 전에, 테스트를 통해 센서로부터 실제 값을 먼저 측정하십시오.
테스트 수행 방법:
제공된 도면을 사용하여 센서의 값을 읽으세요.
센서를 원하는 수준까지 물에 담그세요.
시리얼 모니터에 표시된 값을 기록하세요.
이 값을 액션을 활성화할 한계값으로 설정하세요.
이 테스트는 제대로 하려면 몇 번의 시도가 필요할 수 있습니다.
그 테스트는 또한 발견하는 데 도움이 될 수 있습니다:
물 밖에 있을 때의 최소 센서 값.
물에 완전히 잠겼을 때의 최대 센서 값.
물 누출을 감지하기 위한 임계값.
스케일의 각 레벨에 대한 임계값.
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
아래 동영상 데모는 아래 코드를 사용합니다:
/* * 이 아두이노 우노 R4 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 우노 R4 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-uno-r4/arduino-uno-r4-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"); }}