아틀라스 사이언티픽 센서로 정밀 아두이노 pH 미터 만들기 – 부품 & 가이드
부품 및 소모품
| 아두이노 우노 (Arduino UNO) |
×1 |
| 아틀라스 사이언티픽 Gravity™ 아날로그 pH 센서 |
×1 |
| 아틀라스 사이언티픽 컨슈머 등급 pH 프로브 |
×1 |
| 20×4 LCD 모듈 |
×1 |
| 158×90×60mm 인클로저 |
×1 |
| 미니 브레드보드 |
×1 |
| 저항 220Ω |
×1 |
| 저항 1kΩ |
×1 |
| 11mm 스탠드오프 및 나사 (pH 센서 동봉) |
×4 |
| 점퍼 와이어 |
×1 |
| 아크릴 시트 (플렉시글라스) |
×1 |
필요한 도구 및 장비
- 드릴, 드릴 비트, 드라이월 커터 비트, 줄, 드라이버, 벤치 바이스, 밴드 쏘, 글루건 및 글루 스틱, 납땜 인두 및 납, 디지털 캘리퍼스, 자
앱 및 온라인 서비스
프로젝트 소개
이 프로젝트에서는 아틀라스 사이언티픽의 Gravity 아날로그 pH 회로와 프로브, 아두이노 우노를 사용하여 벤치탑 pH 미터를 만듭니다. 측정값은 액정 디스플레이(LCD)에 표시됩니다.
참고:
- 이 미터는 윈도우 컴퓨터에서 개발되었습니다. 맥에서는 테스트되지 않았습니다.
- 인클로저는 방수가 아닙니다.
1단계: 하우징 준비
안전: 공구/기계 사용 시 주의하고 고글, 장갑, 호흡기 등 보호구 착용 필수.
ABS 플라스틱 인클로저를 pH 미터용으로 개조합니다.
LCD용 개구부 절단
- 인클로저 커버(윗부분) 중앙에 98×40mm 직사각형 표시
- 바이스에 고정하고 직사각형 내부에 3.2mm(1/8") 파일럿 홀 드릴링
- 이 홀을 시작점으로 3.2mm 드라이월 커터 비트로 절단 (핸드 드릴 사용, 직선 절단 어려우니 내부에서 작업)
- 줄로 여분 제거 후 직사각형 크기로 다듬기
BNC 커넥터 및 아두이노 포트용 개구부 절단
아래쪽 인클로저 측면에 BNC 커넥터용 원형 개구부와 아두이노 포트용 직사각형 개구부 2개를 만듭니다.
- 제공된 치수로 중심점과 외곽선 표시
- 바이스에 고정 후 절단. 원형은 드릴 비트, 직사각형은 LCD 개구부와 같은 방식으로 작업
베이스 플레이트 제작 및 부품 장착 준비
아두이노, pH 센서, 미니 브레드보드 장착용 베이스 플레이트에는 3.2mm 두께 아크릴 시트 사용.
- 밴드 쏘로 아크릴 시트를 135×62.5mm로 절단
- 아래 그림과 같이 4개 홀 위치 표시. 2.38mm(3/32") 홀 드릴링. 한 면은 카운터싱크(깊이 3mm, 직경 4.4mm/11/64")로 가공해 나사 머리 들어갈 공간 확보
- 제공된 11mm 스탠드오프를 나사로 고정. pH 센서에 동봉된 4개 중 2개는 아두이노용으로 사용
2단계: 하우징에 전자부품 장착
- 베이스 플레이트를 하우징 아래쪽에 넣고 나사나 핫글루로 고정
- pH 센서를 베이스 플레이트에 장착, 스탠드오프에 나사로 고정
- 아두이노 우노를 베이스 플레이트에 장착, 스탠드오프에 나사로 고정
- 미니 브레드보드를 베이스 플레이트에 부착
- LCD에 헤더 핀 납땜 (동봉). LCD를 위쪽 하우징에 끼우고 핫글루로 고정
3단계: 전자부품 배선
위 회로도와 같이 배선합니다.
- 미니 브레드보드에 1kΩ, 220Ω 저항 장착 및 아두이노 5V/GND 분배
- 두 저항은 LCD 대비 조절용
데이터시트: Gravity pH 센서, pH 프로브
4단계: 조립 마무리
- 제공된 나사로 위/아래 하우징 결합
- 프로브를 BNC 커넥터에 연결
5단계: 아두이노 우노에 코드 업로드
이 프로젝트 코드는 커스텀 라이브러리와 헤더 파일을 사용합니다. 아두이노 IDE에 추가해야 합니다.
- 아두이노를 컴퓨터에 연결하고 IDE 열기 (없으면 여기서 다운로드). 도구 → 보드 → Arduino/Genuino Uno 선택. 도구 → 포트에서 아두이노 연결 포트 선택.
- LiquidCrystal 라이브러리 추가: IDE에서 스케치 → 라이브러리 포함 → 라이브러리 관리. 검색창에 "liquidcrystal" 입력. "LiquidCrystal Built-in by Arduino, Adafruit" 패키지 찾아 설치 (이미 설치됐을 수 있음).
- 아틀라스 Gravity 센서 라이브러리 추가: 여기서 ZIP 다운로드 ("Atlas_gravity.zip"로 저장). IDE에서 스케치 → 라이브러리 포함 → .ZIP 라이브러리 추가로 파일 선택.
- pH 미터 코드 복사: 이 링크에서 코드 복사 후 IDE 작업 패널에 붙여넣기.
- 컴파일 및 업로드
- 시리얼 모니터 열기 (도구 → 시리얼 모니터 또는 Ctrl+Shift+M). 보드레이트 9600, "Carriage return" 선택.
6단계: pH 센서 캘리브레이션
참고: 외부 전원 공급 장치 사용 시 캘리브레이션 전에 아두이노에 연결하세요. 기준 레벨이 적절히 설정되어 정확한 캘리브레이션에 도움이 됩니다.
이 pH 미터는 1점, 2점, 3점 캘리브레이션을 지원합니다. 표준 완충 용액(pH 4, 7, 10) 필요.
시리얼 모니터로 캘리브레이션 진행. 읽기값이 안정화되는 과정 관찰 후 적절한 명령 전송.
캘리브레이션 데이터는 아두이노 EEPROM에 저장됩니다.
캘리브레이션 명령
- 저점:
cal, 4
- 중점:
cal, 7
- 고점:
cal, 10
- 캘리브레이션 초기화:
cal, clear
절차
- 수분 보관 병 제거 후 pH 프로브 헹구기
- pH 4 용액을 컵에 붓고 프로브 감지 부분이 잠기게 함
- 프로브를 컵에 넣고 저어 갇힌 공기 제거. 시리얼 모니터 읽기값 관찰. 읽기값이 안정될 때까지 대기 (약간 변동은 정상)
- 안정되면 시리얼 모니터에
cal, 4 입력. pH 4 캘리브레이션 완료.
pH 7, pH 10도 동일하게 반복. 다른 완충 용액으로 넘어갈 때마다 프로브 헹구기 필수.
온도 보상은?
이 프로젝트의 센서 정확도는 ±0.2%. 7~46°C 범위에서 이 정확도로 동작. 이 범위 밖에서는 온도 보상 기능 추가 필요. 참고: pH 프로브 자체는 1~60°C 범위에서 사용 가능.
코드
C/C++
/* 업로드 후 시리얼 모니터 열기, 보드레이트 9600, "Carriage return" 추가
실시간 pH 읽기 및 센서 캘리브레이션 가능. 1/2/3점 캘리브레이션 지원.
캘리브레이션 명령:
low-point: "cal,4"
mid-point: "cal,7"
high-point: "cal,10"
clear calibration: "cal,clear"
*/
#include "ph_grav.h" // 아틀라스 사이언티픽 Gravity pH 센서 헤더
#include "LiquidCrystal.h" // LCD 헤더
String inputstring = "";
boolean input_string_complete = false;
char inputstring_array[10];
Gravity_pH pH = A0; // 아날로그 핀 A0을 Gravity_pH 클래스에 할당 (pH 센서 출력을 A0에 연결)
LiquidCrystal pH_lcd(2, 3, 4, 5, 6, 7); // LCD 핀 할당 (2→RS, 3→E, 4~7→D4~D7)
void setup() {
Serial.begin(9600);
pH_lcd.begin(20, 4); // LCD 인터페이스 시작, 크기 20열 4행
pH_lcd.setCursor(0, 0);
pH_lcd.print("--------------------");
pH_lcd.setCursor(0, 3);
pH_lcd.print("--------------------");
pH_lcd.setCursor(5, 1);
pH_lcd.print("pH Reading");
if (pH.begin()) {
Serial.println("Loaded EEPROM");
}
Serial.println(F("Use commands \"CAL,4\", \"CAL,7\", and \"CAL,10\" to calibrate the circuit to those respective values"));
Serial.println(F("Use command \"CAL,CLEAR\" to clear the calibration"));
}
void serialEvent() {
if (Serial.available()) {
inputstring = Serial.readStringUntil(13); // 까지 읽기
input_string_complete = true;
}
}
void loop() {
if (input_string_complete == true) {
inputstring.toCharArray(inputstring_array, 30);
parse_cmd(inputstring_array);
input_string_complete = false;
inputstring = "";
}
Serial.println(pH.read_ph()); // 시리얼 모니터에 pH 출력
pH_lcd.setCursor(8, 2); // 9열, 3행
pH_lcd.print(pH.read_ph()); // LCD에 pH 출력
delay(1000);
}
void parse_cmd(char* string) {
strupr(string); // 대문자 변환
if (strcmp(string, "CAL,4") == 0) {
pH.cal_low();
Serial.println("LOW CALIBRATED");
} else if (strcmp(string, "CAL,7") == 0) {
pH.cal_mid();
Serial.println("MID CALIBRATED");
} else if (strcmp(string, "CAL,10") == 0) {
pH.cal_high();
Serial.println("HIGH CALIBRATED");
} else if (strcmp(string, "CAL,CLEAR") == 0) {
pH.cal_clear();
Serial.println("CALIBRATION CLEARED");
}
}
회로도
