아두이노:pH미터 만들기(Gravity 아날로그 pH센서): 두 판 사이의 차이
둘러보기로 이동
검색으로 이동
(→사용법) |
(→사용법) |
||
2번째 줄: | 2번째 줄: | ||
==개요== | ==개요== | ||
Gravity에서 나온 pH센서들은 일반, Pro 등 버전이 다르지만 기본적으로 사용법은 같다. | Gravity에서 나온 pH센서들은 일반, Pro 등 버전이 다르지만 기본적으로 사용법은 같다.<br /> | ||
<br /> | |||
==사용법== | ==사용법== | ||
12번째 줄: | 11번째 줄: | ||
#define Offset 0.33 // ph7.0 측정 시 오프셋 | #define Offset 0.33 // ph7.0 측정 시 오프셋 | ||
#define LED 13 | #define LED 13 | ||
#define samplingInterval 20 | #define samplingInterval 20 // 얼마 간격으로 데이터를 모을 것인가.(밀리세컨드 단위) | ||
#define printInterval 800 | #define printInterval 800 // 얼마 간격으로 화면을 갱신할 것인가.(밀리세컨드 단위) | ||
#define ArrayLenth 40 // 측정할 시간 지정 | #define ArrayLenth 40 // 측정할 시간 지정 | ||
int pHArray[ArrayLenth]; | int pHArray[ArrayLenth]; // 센서 피브백의 평균값을 구하기 위해 데이터를 저장할 배열. | ||
int pHArrayIndex = 0; | int pHArrayIndex = 0; | ||
void setup(void) { | void setup(void) { | ||
pinMode(LED, OUTPUT); | pinMode(LED, OUTPUT); | ||
Serial.begin(9600); | Serial.begin(9600); // 시리얼 레이트 설정. | ||
Serial.println("pH meter experiment!"); | Serial.println("pH meter experiment!"); // 제대로 작동하는지 시리얼모니터를 통해 확인. | ||
} | } | ||
void loop(void) { | void loop(void) { | ||
static unsigned long samplingTime = millis(); | static unsigned long samplingTime = millis(); // 샘플링 타임. 언제 샘플링을 했는지 저장. | ||
static unsigned long printTime = millis(); | static unsigned long printTime = millis(); | ||
static float pHValue, voltage; | static float pHValue, voltage; | ||
if (millis() - samplingTime > samplingInterval) { | if (millis() - samplingTime > samplingInterval) { // 샘플링 인터벌이 지나면 실행. | ||
pHArray[pHArrayIndex++] = analogRead(SensorPin); | pHArray[pHArrayIndex++] = analogRead(SensorPin); | ||
if (pHArrayIndex == ArrayLenth) pHArrayIndex = 0; | if (pHArrayIndex == ArrayLenth) pHArrayIndex = 0; | ||
34번째 줄: | 33번째 줄: | ||
samplingTime = millis(); | samplingTime = millis(); | ||
} | } | ||
if (millis() - printTime > printInterval) { | if (millis() - printTime > printInterval) { // 프린트인터벌(기본 800밀리세컨드)이 지나면 LED불빛을 바꾸고 시리얼모니터에 메시지를 띄움. | ||
Serial.print("Voltage:"); | Serial.print("Voltage:"); | ||
Serial.print(voltage, 2); | Serial.print(voltage, 2); | ||
52번째 줄: | 51번째 줄: | ||
return 0; | return 0; | ||
} | } | ||
if (number < 5) { | if (number < 5) { // 아래는 배열을 정리하는 코드. | ||
for (i = 0; i < number; i++) { | for (i = 0; i < number; i++) { | ||
amount += arr[i]; | amount += arr[i]; |
2021년 8월 19일 (목) 13:34 판
아두이노 관련 정보를 모으기 위한 틀. 틀:아두이노
- 아두이노:개요
- 아두이노:하드웨어
- 아두이노:코드
- 아두이노:핀 사용
- 아두이노:시리얼 통신
- 아두이노:편의함수
- 센서 사용
- 아두이노:LCD 사용
- 아두이노:스위치 사용
- 아두이노:릴레이
- 아두이노:WIFI
- 아두이노:해결되지 않은 다양한 의문들
- 수업용 간단 실습
- 분류:아두이노 프로젝트
개요
Gravity에서 나온 pH센서들은 일반, Pro 등 버전이 다르지만 기본적으로 사용법은 같다.
사용법
메카솔루션에서 잘 정리해두었다. https://blog.naver.com/roboholic84/222252612286
코드만 따로 떼어 여기에 둔다.
#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;
}