아두이노:pH미터 만들기(Gravity 아날로그 pH센서)
편집하기
둘러보기로 이동
검색으로 이동
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
{{아두이노}} ==개요== Gravity에서 나온 pH센서들은 일반, Pro 등 버전이 다르지만 기본적으로 사용법은 같다. ===Pro 스펙=== 작동전압 : 5V 측정온도 : 0-60 ℃ 정확도 : ± 0.1pH (25 ℃) 측정응답시간 : 1분 미만 <br /> ==사용법== 메카솔루션에서 잘 정리해두었다. https://blog.naver.com/roboholic84/222252612286 제조사 공식 설명은 다음 링크에 있다. https://wiki.dfrobot.com/PH_meter_SKU__SEN0161_ 코드만 따로 떼어 여기에 둔다.(코드는 제조사 공식 튜토리얼 코드에 주석 덧붙임.)<syntaxhighlight lang="c"> #define SensorPin A0 // 센서 핀은 아날로그0번에 꽂겠다는 지정. #define Offset 0.33 // ph7.0 측정 시 오프셋 #define LED 13 #define samplingInterval 20 // 얼마 간격으로 데이터를 모을 것인가.(밀리세컨드 단위) #define printInterval 800 // 얼마 간격으로 화면을 갱신할 것인가.(밀리세컨드 단위) #define ArrayLenth 40 // 측정할 시간 지정 int pHArray[ArrayLenth]; // 센서 피드백의 평균값을 구하기 위해 데이터를 저장할 배열. int pHArrayIndex = 0; void setup(void) { pinMode(LED, OUTPUT); Serial.begin(9600); // 시리얼 레이트 설정. Serial.println("pH meter experiment!"); // 제대로 작동하는지 시리얼모니터를 통해 확인. } void loop(void) { static unsigned long samplingTime = millis(); // 샘플링 타임. 언제 샘플링을 했는지 저장. static unsigned long printTime = millis(); static float pHValue, voltage; if (millis() - samplingTime > samplingInterval) { // 샘플링 인터벌이 지나면 실행. pHArray[pHArrayIndex++] = analogRead(SensorPin); if (pHArrayIndex == ArrayLenth) pHArrayIndex = 0; voltage = avergearray(pHArray, ArrayLenth) * 5.0 / 1024; pHValue = 3.5 * voltage + Offset; samplingTime = millis(); } if (millis() - printTime > printInterval) { // 프린트인터벌(기본 800밀리세컨드)이 지나면 LED불빛을 바꾸고 시리얼모니터에 메시지를 띄움. Serial.print("Voltage:"); Serial.print(voltage, 2); Serial.print(" pH value: "); Serial.println(pHValue, 2); digitalWrite(LED, digitalRead(LED) ^ 1); printTime = millis(); } } double avergearray(int* arr, int number) { int i; int max, min; double avg; long amount = 0; if (number <= 0) { Serial.println("Error number for the array to avraging!/n"); return 0; } if (number < 5) { // 아래는 배열을 정리하는 코드. for (i = 0; i < number; i++) { amount += arr[i]; } avg = amount / number; return avg; } else { if (arr[0] < arr[1]) { min = arr[0]; max = arr[1]; } else { min = arr[1]; max = arr[0]; } for (i = 2; i < number; i++) { if (arr[i] < min) { amount += min; min = arr[i]; } else { if (arr[i] > max) { amount += max; max = arr[i]; } else { amount += arr[i]; } } } avg = (double)amount / (number - 2); } return avg; } </syntaxhighlight>측정된 ph 정보를 LCD판에 띠워 확인할 수 있도록 코딩하였다. 이때 pH센서의 A핀은 아두이노 보드의 A0핀에 연결하고 LCD판의 SDA는 아두이노 보드의 A4에, SCL은 A5에 연결한다. 모든 핀은 브레드 보드를 통해 연결해주었다.<syntaxhighlight lang="c"> #include <Wire.h> #include <hd44780.h> #include <hd44780ioClass/hd44780_I2Cexp.h> // pH 센서 설정 #define SensorPin A0 // pH 미터 아날로그 출력이 Arduino의 아날로그 핀에 연결됨 unsigned long int avgValue; // 센서 피드백의 평균 값을 저장 int buf[10], temp; // LCD 설정 hd44780_I2Cexp lcd; // LCD 객체 void setup() { Serial.begin(9600); lcd.begin(16, 2); // LCD 통신 사용, 16x2 크기 설정 lcd.clear(); lcd.print("Ready"); // LCD에 초기 메시지 출력 delay(1000); lcd.clear(); } void loop() { for(int i = 0; i < 10; i++) // 센서에서 값을 10번 샘플링하여 값을 부드럽게 만듦 { buf[i] = analogRead(SensorPin); delay(10); } for(int i = 0; i < 9; i++) // 아날로그 값을 작은 값부터 큰 값 순으로 정렬 { for(int j = i + 1; j < 10; j++) { if(buf[i] > buf[j]) { temp = buf[i]; buf[i] = buf[j]; buf[j] = temp; } } } avgValue = 0; for(int i = 2; i < 8; i++) // 중앙 6개의 샘플 값의 평균을 계산 avgValue += buf[i]; float phValue = (float)avgValue * 5.0 / 1024 / 6; // 아날로그 값을 밀리볼트로 변환 phValue = 3.5 * phValue; // 밀리볼트 값을 pH 값으로 변환 Serial.print("pH: "); Serial.print(phValue, 2); Serial.println(" "); // LCD에 pH 값 출력 lcd.clear(); lcd.setCursor(0, 0); // 첫 번째 줄의 첫 번째 칸에 커서 위치 lcd.print("pH Value:"); lcd.setCursor(0, 1); // 두 번째 줄의 첫 번째 칸에 커서 위치 lcd.print(phValue, 2); // pH 값을 소수점 둘째 자리까지 출력 delay(800); // 원래 코드의 타이밍을 맞추기 위해 딜레이 추가 } </syntaxhighlight> ===사용법=== ====기준용액==== 사용하기 전에 항상 기준점을 맞춰야 한다. 다음과 같은 사이트 등에서 기준용액을 구매하자. [https://smartstore.naver.com/mirae-sc/products/242508105?NaPm=ct%3Dksig1660%7Cci%3Dfc11875fb0c6df1cfdc7026a45fc57b68d84195c%7Ctr%3Dslsl%7Csn%3D240247%7Chk%3Deb0017f3b828076f1ec4b1b818864dd5113fd3ee 링크] ====유의==== 측정하고자 하는 용액에 1분 정도 담근 후에 측정한다.(너무 길어도 용액에 센서가 상할 수 있다.)
요약:
학교의 모든 지식. SMwiki에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
학교의 모든 지식. SMwiki:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)
이 문서에서 사용한 틀:
틀:아두이노
(
편집
)
둘러보기 메뉴
개인 도구
로그인하지 않음
토론
기여
로그인
이름공간
문서
토론
한국어
보기
읽기
편집
원본 편집
역사 보기
더 보기
검색
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
도구
여기를 가리키는 문서
가리키는 글의 최근 바뀜
특수 문서 목록
문서 정보