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

마이리버

구성품 및 소모품

Arduino MKR1000
× 1
수위 센서
× 1
Ph 센서
× 1
LED(일반)
가능한 경우 흰색
× 1
저항 221옴
× 2
포토 저항기
× 1
점퍼 와이어(일반)
× 1

필요한 도구 및 기계

납땜 인두(일반)
쇠톱

앱 및 온라인 서비스

Arduino 웹 편집기
Sigfox
위아

이 프로젝트 정보

개요

강이나 호수는 재미와 휴식의 훌륭한 원천이 될 수 있습니다. 그러나 강이 더러워지고 오염되면 모든 즐거움이 사라집니다. 많은 사람들이 가축을 먹이기 위해 강물에 의존하고 있으며 가축에게 더러운 물을 줄 여유가 없습니다.

강 바로 옆에 산다고 상상해 보세요(그렇지 않은 경우). 한밤중에 강으로 인해 집이 범람하여 잠에서 깨어나고 싶지 않을 것입니다. 또는 이웃이 강에 휘발유를 버리기로 결정했다면 동물이 병에 걸리는 것을 원하지 않을 것입니다.

MyRiver는 이러한 모든 문제를 해결하고 Sigfox 덕분에 격리된 영역에서도 작동할 수 있으므로 모든 사람이 장치에 액세스할 수 있습니다. 이 장치는 물의 pH, 혁신적인 방법을 사용하여 오염 수준 및 수위를 읽습니다. Wia 덕분에 어디서든 휴대폰이나 컴퓨터로 강의 실시간 모니터링이 가능합니다. 이렇게 하면 스트림에 문제가 있는지 알 수 있고 너무 늦기 전에 조치를 취할 수 있습니다. 강에 문제가 있으면 즉시 알려줍니다.

동영상

이미지

기능

이 장치는 Arduino MKR FOX를 기반으로 하며 원격 사용을 위해 설계되었으며 사용자는 장치를 강이나 호수에 놓고 어디에서나 모니터링할 수 있습니다. SAM D의 저전력 모드 덕분에 장치는 2AA 배터리로 장기간 작동할 수 있습니다.

장치는 30분마다 판독을 수행하고 그 이후에 절전 모드로 전환되며 최소 절전 시간은 20분이어야 하지만 절전 기간을 재설정할 수 있습니다.

MKR FOX는 pH 센서를 이용하여 강의 pH를 읽고, 수위 센서를 이용하여 강의 수위도 파악하고, 포토레지스트 판독값이 다음과 같을 경우 포토레지스터에 LED를 비추어 불용성 물질로 오염되었는지 감지한다. 낮으면 강에 고체 물질(기름, 휘발유, 수은 등)이 존재한다는 의미입니다. 그런 다음 장치는 모든 데이터를 Sigfox로 보내고 Wia로 중계되고 처리 및 시각화됩니다. 사용자는 강의 상태를 알려줍니다. 아래는 기능 개요의 이미지입니다.

버퍼는 HEX로 인코딩된 Sigfox로 전송되고, Sigfox는 데이터를 Wia로 중계하고, 데이터는 흐름을 통해 전달되고, 데이터는 다시 문자열로 변환된 다음 센서 값으로 변환됩니다. 그런 다음 값이 처리되고 값이 범위를 벗어날 경우 사용자에게 알림이 전송됩니다.

아래는 아래에 설명된 프로젝트의 코드 개요를 보여주는 또 다른 이미지입니다.

<울>
  • 센서 읽기 pH, 수위 및 포토레지스터 센서 값을 읽고 변수에 저장합니다.
  • 포맷 버퍼 모든 값을 Sigfox로 보낼 수 있는 12바이트 버퍼로 병합합니다.
  • 데이터 분석 버퍼를 Sigfox로 구문 분석합니다.
  • MKR FOX는 Sigfox를 통해 12바이트만 보낼 수 있습니다. 즉, 모든 센서 값을 12바이트로 병합해야 하며 각 센서의 최대 원시 값은 1024(모두 아날로그이므로)이므로 각 센서는 1/3을 나타냅니다. 버퍼(4바이트). Arduino는 값을 병합하고 값이 4바이트가 될 때까지 각 값의 시작 부분에 0을 추가해야 합니다. 아래 이미지는 이 과정을 보여줍니다.

    Arduino는 센서 값을 정수로 수신한 다음 정수를 문자열로 변환하고 4바이트가 될 때까지 각 값의 시작 부분에 0을 추가합니다. 예를 들어 포토 레지스터 값이 620이면 0 하나가 추가됩니다. 0 620. 그러나 수위 센서가 24와 같으면 두 개의 0이 추가됩니다. 00 24. 그런 다음 장치는 값을 12바이트 버퍼로 병합하고 데이터를 SigFox로 보냅니다.

    작동 중인 장치

    아래는 프로젝트의 기능을 보여주는 여러 장의 사진이며, 더 잘 보려면 위의 동영상을 참조하십시오.

    혜택

    사용자 운영 프로젝트 이점 in:

    <울>
  • 언제 어디서나 강의 수위, pH, 오염도를 손쉽게 모니터링
  • 수용성 또는 불용성 물질로 하천이 오염되거나 범람하는 경우 알림 수신
  • 사용 및 장착 용이
  • Sigfox가 적용되는 모든 국가에서 작동
  • 프로젝트 구성

    1단계:필수 장비

    이 프로젝트는 모든 구성 요소를 함께 납땜해야 하며 센서 외에는 그다지 많지 않습니다. 자료 목록은 아래에 나와 있습니다.

    <울>
  • 1, Arduino MKR FOX 1200
  • 1, pH 센서
  • 1, 수위 센서
  • 1, 포토레지스터
  • 1, 백색 LED
  • 2, 저항기(220Ω)
  • 점퍼 와이어
  • 2단계:회로 연결

    프로젝트의 회로도는 구성 요소가 브레드보드에 배치되지 않아 다소 혼란스러울 수 있습니다. 문제가 있으면 아래 Fritzing 파일을 다운로드하고 컴퓨터에서 전선을 이동해 보세요.

    <울>
  • 회로 개요
  • 아래 이미지는 회로가 완성되었을 때의 모습을 보여줍니다.

    <울>
  • 준비 MKR 여우
  • 아래 이미지는 배터리 박스와 안테나를 MKR FOX에 연결하는 과정을 안내할 것입니다. 배터리 박스는 센서를 연결한 후에 연결해야 합니다. 기타 배선 및 설정은 프로젝트 구성 / 최종에서 찾을 수 있습니다.

    3단계:코드 승인

    코드에는 3가지 주요 부분이 있습니다.

    <울>
  • 센서 읽기
  • 포맷 버퍼
  • 데이터 분석
  • 이 섹션은 아래에 설명되어 있습니다.

    <울>
  • 센서 읽기
  • struct GetValue // 루프를 완화하기 위해 구조 생성{ int riverLevel() // 강의 수위 가져오기 { const int val =analogRead(A2); if(proDebug) { Serial.print(" 강 수위 "); Serial.println(val); } 반환 값; } int riverPh() // 강의 ph를 구합니다. const int val =(analogRead(A1) / 5 * 3.3); if(proDebug) { Serial.print(" 강 Ph "); Serial.println(val); } 반환 값; } int riverPol() // 강의 오염도 얻기 { const int val =analogRead(A3); if(proDebug) { Serial.print(" 강 오염 "); Serial.println(val); } 반환 값; }}; 

    위의 구조는 각 센서 값을 읽는 루프를 포함하며 각 값에 대해 별도의 루프가 있습니다.

    <울>
  • 포맷 버퍼
  • String data(int level, int ph, int pol) // 센서 값을 버퍼에 병합 { int values[3] ={level, ph, pol}; 문자열 newValues; for(int i =0; i <3; i++) // 시작 부분에 0을 추가하여 모든 값을 실행합니다. { if(values[i] <10) { newValues ​​+="000"; Serial.println("옵션 1"); } else if(값[i] <100) { newValues ​​+="00"; Serial.println("옵션 2"); } else if(값[i] <1000) { newValues ​​+="0"; Serial.println("옵션 3"); } 또 다른 {}; newValues ​​+=값[i]; Serial.print(" 실행 "); Serial.print(i); Serial.print("/3 "); Serial.println(newValues); } 반환 newValues; }  

    위의 루프는 3개의 센서 값을 가져와 어레이에 배치합니다. 그런 다음 각 값을 반복하여 값의 크기가 4바이트가 될 때까지 각 값의 시작 부분에 0을 추가한 다음 반환되는 문자열에 각 값을 추가합니다.

    <울>
  • 데이터 파싱
  • void parseData(String data) // SigFox에 버퍼 보내기 { SigFox.beginPacket(); SigFox.print(데이터); int ret =SigFox.endPacket(); } 

    이 섹션은 구문 분석할 문자열을 받은 다음 값을 Sigfox로 보냅니다.

    4단계:Wia Sigfox 통합 설정

    이 단계에서는 Sigfox에서 메시지를 수신하도록 Wia를 설정하는 방법을 설명합니다. Wia는 사용자가 웹 또는 모바일 앱에서 위젯을 사용하여 데이터를 시각화할 수 있는 전문 IoT 플랫폼이며 사용자가 사용자가 데이터를 처리할 수 있도록 하는 흐름입니다. 데이터는 이벤트로 표현됩니다.

    시작하려면 Sigfox 계정과 Wia 계정이 있어야 합니다. 또한 iOS 또는 Android에서 Wia 앱을 다운로드하여 알림을 받을 수 있습니다. 아래 이미지는 Sigfox와 Wia를 연결하는 방법을 보여줍니다.

    <울>
  • 유형 설정 데이터 업링크
  • 채널 설정 URL
  • 사용자 지정 페이로드 구성을 작성할 필요가 없습니다.
  • URL 설정 "https://api.wia.io/v1/events"에 대한 패턴
  • HTTPMethod 설정 POST
  • Authorization이라는 헤더 생성 Bearer 값으로 (이 값은 나중에 수정됩니다)
  • 콘텐츠 유형 설정 application/json으로
  • 이 링크의 코드를 웹훅 본문에 복사합니다.
  • 마지막으로 확인을 클릭하면 완료됩니다.
  • 5단계:Wia 흐름 설정

    이 섹션은 완료하는 데 조금 더 오래 걸리며 흐름은 HEX에서 받은 데이터를 문자열로 변환한 다음 문자열을 3개의 센서 값으로 구문 분석한 다음 정수로 변환한 다음 강 오염 값을 변환하고 강 수위를 High 또는 Ok 설명자로 변경하고 원시 ph 값을 실제 ph 값으로 변경하면 값이 범위를 벗어나면 사용자에게 알립니다.

    아래 가이드에서는 이 프로세스를 단계별로 설명합니다. Wia Functions에 특정 코드 조각을 삽입하라는 지시가 있을 것입니다. 이 코드 조각은 아래에 삽입되어 있습니다. 코드를 복사하여 함수에 붙여넣기만 하면 됩니다. 이메일에 포함할 데이터도 아래에 삽입되어 기능과 같이 작업합니다.

    Wia 기능

    <울>
  • 프로세스 페이로드
  • if(input.body){ output.body.name ="값"; output.body.data =toByteArrayStr(input.body.data.sigfoxData);}함수 toByteArrayStr(sigfoxData){ let result =Buffer(sigfoxData, 'hex'); return result.toString('utf8');} 
    <울>
  • 공정 오염
  • if(input.body.data){ let data =input.body.data; if(data =="POLLLUTED") { output.body.name ="waterLevel"; output.body.data =데이터; } else { 동안(1); }} 
    <울>
  • 프로세스Ph
  • 최소값 =6.5; 최대값 =8.5; if(input.body.data){ 데이터 =input.body.data를 둡니다. if(data> maxVal || data  
    <울>
  • 프로세스 수준
  • if(input.body.data){ let data =input.body.data; if(data =="HIGH") { output.body.name ="waterLevel"; output.body.data =데이터; } else { 동안(1); }} 
    <울>
  • 강 오염
  • 최소값 =200;최대값 =0;if(input.body.data.sigfoxData){데이터 =input.body.data.sigfoxData로 하자; 처리 데이터 =toByteArrayStr(데이터); let newData =cutString(processedData); output.body.name ="물 오염"; output.body.data =processData(newData);} 함수 toByteArrayStr(sigfoxData){ let result =Buffer(sigfoxData, 'hex'); return result.toString('utf8');} function cutString(data){ let newVal =data[8]; newVal +=데이터[9]; newVal +=데이터[10]; newVal +=데이터[11]; let finalVal =parseInt(newVal); return finalVal;}함수 processData(data){ if(data  
    <울>
  • 최소값 =300; 최대값 =600; if(input.body.data.sigfoxData){ 데이터 =input.body.data.sigfoxData로 둡니다. 처리 데이터 =toByteArrayStr(데이터); let newData =cutString(processedData); let finalVal =(newData / 73.1428571); let valueToSend =finalVal.toFixed(2); output.body.name ="waterPh"; output.body.data =valueToSend;} 함수 toByteArrayStr(sigfoxData){ let result =Buffer(sigfoxData, 'hex'); return result.toString('utf8');} function cutString(data){ let newVal =data[4]; newVal +=데이터[5]; newVal +=데이터[6]; newVal +=데이터[7]; let finalVal =parseInt(newVal); return newVal;} 
    <울>
  • 강수위
  • <사전><코드>최소값 =0;최대값 =200;if(input.body.data.sigfoxData){자료 =input.body.data.sigfoxData; 처리 데이터 =toByteArrayStr(데이터); let newData =cutString(processedData); output.body.name ="수위"; output.body.data =processData(newData);} function cutString(data){ let newVal =data[0]; newVal +=데이터[1]; newVal +=데이터[2]; newVal +=데이터[3]; let finalVal =parseInt(newVal); return finalVal;} function toByteArrayStr(sigfoxData){ let result =Buffer(sigfoxData, 'hex'); return result.toString('utf8');}function processData(data){ if(data> maxVal) { return "HIGH"; } else { "확인"을 반환합니다. }}

    Wia 이메일

    <울>
  • 강오염 이메일
  • 자동 메시징 SystemDataWarning - myWater 장치 ${trigger.source.device.id}가 스트림에서 문제를 감지했습니다. 경고 - 물이 불용성 물질에 의해 오염되었습니다.InformationDevice ${trigger.source.device.id}Raw 데이터 ${input.body.data} 
    <울>
  • riverPhEmail
  • 자동 메시징 SystemDataWarning - myWater 장치 ${trigger.source.device.id}가 스트림에서 문제를 감지했습니다. 경고 - Water Ph가 적절하지 않습니다. 물이 오염되었습니다.InformationDevice ${trigger.source.device.id}원시 데이터 ${input.body.data} 
    <울>
  • riverLevelEmail
  • 자동 메시징 SystemDataWarning - myWater 장치 ${trigger.source.device.id}가 스트림에서 문제를 감지했습니다. 경고 - 수위가 너무 높아 강이 범람할 수 있습니다.InformationDevice ${trigger.source.device .id}원시 데이터 ${input.body.data} 

    변수 설정

    Wia에서 데이터를 수신하면 처리해야 하며 데이터가 최소값과 최대값 사이이면 값이 안전하고 pH 및 수위 센서의 한계가 설정되어 있지만 사용자가 수동으로 포토레지스터의 값을 설정해야 합니다. 제한, 이 값을 결정하기 위해 테스트를 수행해야 합니다. 아래 단계에서 이를 수행하는 방법을 알려줍니다.

    void setup(){ pinMode(1, OUTPUT); Serial.begin(9600); 동안(! 직렬) {}; digitalWrite(1, HIGH);} 무효 루프(){ const int val =analogRead(A3); Serial.println(val); 지연(5000);} 

    사용자가 설정해야 하는 또 다른 변수가 있습니다. proDebug , 활성화된 경우 Arduino는 USB를 통해 컴퓨터에 연결해야 하며 직렬 모니터는 열려 있어야 하며 Arduino는 이 모드에서 직렬 모니터로 인쇄하므로 문제 해결에 이상적입니다. proDebug의 기본값은 false입니다. 현장 운영을 위해.

    라이브러리

    <울>
  • Sigfox - copyright (c) 2016 Arduino LLC GNU Lesser General Public License 이 라이브러리는 공개 도메인입니다.
  • ArduinoLowPower (c) 2016 Arduino LLC GNU Lesser General Public License 이 라이브러리는 공개 도메인입니다.
  • 최종

    마지막 단계는 Arduino를 PC/Mac에 연결하고 스케치를 업로드하는 것입니다. 배터리 상자가 Arduino에 연결되어 있고 회로가 정상인지 확인하십시오. 다음 단계에서는 프로젝트를 위한 인클로저를 만드는 과정을 안내합니다.

    저는 물병으로 인클로저를 만들기로 결정했습니다. 프로젝트를 수용할 수 있는 훌륭하고 생태학적인 방법이라고 생각합니다. 장치는 아래 그림과 같습니다.

    인클로저에 대한 아이디어가 마음에 들면 아래 이미지를 스크롤하여 인클로저가 어떻게 만들어졌는지 설명하고 자유롭게 직접 만드십시오.

    The last thing to do is place the device in the river. To do this, go to the river you wish to implement MyRiver on during High Tide , this is essential to ensure that the device is not alerting that the river is flooding when it is actually just the tide.

    Place some tape on the top of the water bottle to prevent water from seeping into the bottle and destroying everything.

    We went to a local, dirty river to test the project out, all the alarms went off correctly.

    When placing the probe in the water, ensure that the water is at the bottom of the water level sensor but is covering the photoresistor entirely. Secure the project to the shore using tape or a hammer and screws, and it should look like this (or better).

    Background

    Relaxing in your house, looking out the window at the once beautiful and delightful river rushing in front of you. But instead of the beautiful fresh river, you see a green slimy one, you might want to move house in that case.

    And if the river decides to flood into your house in the middle of the night while you are sleeping, you will certainly decide to move.

    I thought of these problems and how to solve them all in one device, and I came up with MyRiver.

    If you are in the city and living beside a river, it will warn you in time if the river decides to ruin your day in any way or if your neighbour is dumping oil in the river. Or if you are on a farm, MyRiver will warn you that the river is dirty before you give the water to your animals, and will give you time to bring the animals in before the river floods.

    But just reading the pH of the river was not enough, as insoluble substances like mercury or other metals do not effect the Ph of the water. So we came up with a new method to detect those substances, unique to this project, a photoresistor reading the amount of light from an LED penetrating the water. This way any water impurity can be detected.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    MyRiver
    The Full Code

    회로도

    schematics_lXO5SiusZO.fzz

    제조공정

    1. O2 센서란 무엇입니까?
    2. 라즈베리 파이 온도 센서
    3. 감정 센서 / EEG
    4. 아날로그 센서가 있는 기압 측정 장치
    5. DHT11 센서(LED 및 피에조 스피커 포함)
    6. UnifiedWater v1
    7. 3D RGB Arduclock
    8. Arduino를 사용한 간단한 장애물 센서
    9. 조이스틱 게임
    10. 나를 찾기