산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

강 건강 모니터: 아두이노 기반 수질 측정 시스템

부품 및 소모품

Arduino MKR1000 (MKR FOX 1200)×1
수위 센서×1
pH 센서×1
LED (백색 권장)×1
220옴 저항×2
포토레지스터 (조도 센서)×1
점퍼 와이어×1세트

필수 도구

앱 및 온라인 서비스

프로젝트 개요

개요

강이나 호수는 훌륭한 휴식처지만, 오염되면 모든 즐거움이 사라집니다. 많은 사람들이 강물을 가축 음용수로 쓰는데, 오염된 물을 줄 수는 없죠. 집 옆이 강이라면 한밤중 홍수로 집이 잠기는 일도, 이웃이 기름을 버려 가축이 병드는 일도 막고 싶을 것입니다.

MyRiver가 이 모든 문제를 해결합니다. Sigfox 덕분에 외딴 지역에서도 작동하며, 누구나 기기에 접근할 수 있습니다. 장치는 물의 pH, 혁신적인 방식으로 오염도(불용성 물질), 수위를 측정합니다. Wia 덕분에 휴대폰이나 컴퓨터로 어디서든 실시간 모니터링이 가능하며, 강에 문제가 생기면 즉시 알림을 받습니다.

강 건강 모니터: 아두이노 기반 수질 측정 시스템

기능 설명

장치는 아두이노 MKR FOX 기반으로 원격 설치용으로 설계되었습니다. SAM D 프로세서의 저전력 모드 덕분에 2개 AA 배터리로 장기간 작동합니다.

30분마다 센서 값을 읽고 다시 슬립 모드로 진입합니다(최소 슬립 20분, 조정 가능).

MKR FOX는 다음을 측정합니다:

모든 데이터는 Sigfox로 전송→Wia로 릴레이→처리 및 시각화→사용자 알림 순으로 전달됩니다.

강 건강 모니터: 아두이노 기반 수질 측정 시스템

데이터는 12바이트 HEX 버퍼로 Sigfox에 전송되며, Wia에서 문자열로 변환 후 센서 값으로 파싱됩니다. 값이 정상 범위를 벗어나면 사용자에게 알림.

강 건강 모니터: 아두이노 기반 수질 측정 시스템

코드 3대 핵심 파트

MKR FOX는 Sigfox로 12바이트만 보낼 수 있어, 모든 센서 값을 12바이트에 담아야 합니다. 각 센서 최대 raw 값은 1024(10비트 ADC)로, 센서당 4바이트(1/3) 할당. 아두이노가 정수값을 문자열로 변환 후 앞에 0을 채워 4바이트로 만듭니다(예: 620→"0620", 24→"0024"). 이를 합쳐 12바이트 버퍼 생성 후 Sigfox 전송.

강 건강 모니터: 아두이노 기반 수질 측정 시스템

장치 작동 모습

아래 사진들은 프로젝트 기능을 보여줍니다. 더 자세한 건 위 영상 참조.

강 건강 모니터: 아두이노 기반 수질 측정 시스템
강 건강 모니터: 아두이노 기반 수질 측정 시스템
강 건강 모니터: 아두이노 기반 수질 측정 시스템
강 건강 모니터: 아두이노 기반 수질 측정 시스템

장점

프로젝트 제작 과정

1단계: 필요 장비

모든 부품을 납땜으로 연결하며, 센서 외 별도 부품은 적습니다.

강 건강 모니터: 아두이노 기반 수질 측정 시스템

2단계: 회로 연결

브레드보드 없이 부품이 직접 연결돼 회로도가 복잡해 보일 수 있습니다. 어려우면 프리칭 파일을 다운로드해 와이어를 옮겨보며 확인하세요.

강 건강 모니터: 아두이노 기반 수질 측정 시스템
강 건강 모니터: 아두이노 기반 수질 측정 시스템

MKR FOX 준비: 배터리 박스와 안테나 연결(센서 연결 후 배터리 박스 연결). 나머지 배선은 '최종 단계' 참조.

강 건강 모니터: 아두이노 기반 수질 측정 시스템

3단계: 코드 이해

코드는 위 3개 핵심 파트(Read Sensors, Format Buffer, Parse Data)로 구성됩니다.

센서 읽기
struct GetValue {
  int riverLevel() { // 강 수위
    const int val = analogRead(A2);
    if(proDebug) { Serial.print(" River Level "); Serial.println(val); }
    return val;
  }
  int riverPh() { // 강 pH
    const int val = (analogRead(A1) / 5 * 3.3);
    if(proDebug) { Serial.print(" River Ph "); Serial.println(val); }
    return val;
  }
  int riverPol() { // 강 오염도
    const int val = analogRead(A3);
    if(proDebug) { Serial.print(" River Pollution "); Serial.println(val); }
    return val;
  }
};
버퍼 포맷팅
String data(int level, int ph, int pol) {
  int values[3] = {level, ph, pol};
  String newValues;
  for(int i = 0; i < 3; i++) {
    if(values[i] < 10) { newValues += "000"; }
    else if(values[i] < 100) { newValues += "00"; }
    else if(values[i] < 1000) { newValues += "0"; }
    newValues += values[i];
  }
  return newValues;
}
데이터 파싱 및 전송
void parseData(String data) {
  SigFox.beginPacket();
  SigFox.print(data);
  int ret = SigFox.endPacket();
}

4단계: Wia-Sigfox 연동 설정

Sigfox 계정과 Wia 계정 필요. Wia 앱(iOS/Android) 설치로 알림 수신 가능. 아래 이미지들로 연동 과정 설명.

강 건강 모니터: 아두이노 기반 수질 측정 시스템

웹훅 설정 요약:

5단계: Wia 플로우 설정

데이터를 HEX→문자열 변환→3개 센서 값 파싱→정수 변환→오염도/수위 'High/OK' 판정, pH 실제 값 변환→임계값 초과 시 알림 발송하는 플로우 구성. 단계별 가이드 이미지 참조.

Wia Functions 코드:

processPayload (HEX→문자열)
if(input.body) {
  output.body.name = "value";
  output.body.data = toByteArrayStr(input.body.data.sigfoxData);
}
function toByteArrayStr(sigfoxData) {
  let result = Buffer(sigfoxData, 'hex');
  return result.toString('utf8');
}
riverPollution (오염도 판정)
let minVal = 200; let maxVal = 0;
if(input.body.data.sigfoxData) {
  let data = input.body.data.sigfoxData;
  let processedData = toByteArrayStr(data);
  let newData = cutString(processedData);
  output.body.name = "waterPollution";
  output.body.data = processData(newData);
}
function cutString(data) {
  let newVal = data[8]+data[9]+data[10]+data[11];
  return parseInt(newVal);
}
function processData(data) {
  return (data < minVal) ? "POLLUTED" : "OK";
}
riverPh (pH 값 변환 및 판정)
let minVal = 300; let maxVal = 600;
if(input.body.data.sigfoxData) {
  let data = input.body.data.sigfoxData;
  let processedData = toByteArrayStr(data);
  let newData = cutString(processedData); // data[4]~[7]
  let finalVal = (newData / 73.1428571);
  let valueToSend = finalVal.toFixed(2);
  output.body.name = "waterPh";
  output.body.data = valueToSend;
}
function cutString(data) {
  let newVal = data[4]+data[5]+data[6]+data[7];
  return parseInt(newVal);
}
riverLevel (수위 판정)
let minVal = 0; let maxVal = 200;
if(input.body.data.sigfoxData) {
  let data = input.body.data.sigfoxData;
  let processedData = toByteArrayStr(data);
  let newData = cutString(processedData); // data[0]~[3]
  output.body.name = "waterLevel";
  output.body.data = processData(newData);
}
function cutString(data) {
  let newVal = data[0]+data[1]+data[2]+data[3];
  return parseInt(newVal);
}
function processData(data) {
  return (data > maxVal) ? "HIGH" : "OK";
}

알림 이메일 템플릿:

변수 설정

포토레지스터 임계값은 현장 테스트로 결정해야 합니다. 아래 테스트 코드로 깨끗한 물/오염된 물에서 값 측정 후 minVal 설정:

void setup() { pinMode(1, OUTPUT); Serial.begin(9600); while(!Serial); digitalWrite(1, HIGH); }
void loop() { const int val = analogRead(A3); Serial.println(val); delay(5000); }

proDebug 변수: true 시 시리얼 모니터로 디버깅 출력(필드 테스트용), false가 기본(실제 운용 시).

라이브러리

최종 단계

아두이노를 PC에 연결해 스케치 업로드. 배터리 박스 연결 및 회로 확인. 인클로저는 페트병을 재활용해 제작(생태적, 저렴).

강 건강 모니터: 아두이노 기반 수질 측정 시스템

인클로저 제작 과정 사진 참조. 마지막 단계: 만조 때 강에 장치 설치(조위 상승을 홍수로 오인 방지). 병 입구 테이프로 밀봉. 수위 센서 하단이 물에 닿고 포토레지스터가 완전히 잠기게 고정. 테이프나 나사로 고정.

강 건강 모니터: 아두이노 기반 수질 측정 시스템

배경 이야기

창밖의 아름다운 강이 녹조로 뒤덮이거나, 한밤중 홍수로 집이 잠기는 악몽을 막고자 MyRiver를 구상했습니다. 도시든 농촌이든 강 옆에 사는 누구나 안심할 수 있게 돕습니다.

단순 pH 측정만으론 불용성 물질(수은 등 금속) 감지 불가해, LED 빛이 물을 통과해 포토레지스터에 도달하는 양으로 불순물 검출하는 독창적 방식을 고안했습니다. 어떤 수질 불순물도 감지 가능합니다.

강 건강 모니터: 아두이노 기반 수질 측정 시스템

제조공정

  1. 산소(O2) 센서 이해하기: 역할, 위치, 고장 징후
  2. MCP9808, InfluxDB, Grafana로 라즈베리 파이 홈 온도 모니터 구축하기
  3. 감정 센서 & EEG: 실시간 감정 감지를 위한 저비용 하드웨어
  4. 아날로그 센서로 정밀 압력 및 공기유속 측정 장치 만들기
  5. DHT11 온습도 센서 + LED 표시등 + 피에조 부저 프로젝트
  6. UnifiedWater v1 - 아두이노 MKR GSM 1400 기반 완전 수질 모니터링 센서 키트
  7. 3D RGB 아두클락(Arduclock) - 블루투스 제어 LED 타임피스 with RTC
  8. 아두이노로 간단한 장애물 센서 만들기 - IR LED & 포토다이오드 튜토리얼
  9. 아두이노 조이스틱 인터랙티브 게임 - LED 피드백으로 방향 감지
  10. 아두이노와 블루투스로 만드는 스마트 물건 찾기 'Find Me'