아두이노:pH미터 만들기(Gravity 아날로그 pH센서): 두 판 사이의 차이

학교의 모든 지식. SMwiki
둘러보기로 이동 검색으로 이동
 
(사용자 2명의 중간 판 5개는 보이지 않습니다)
3번째 줄: 3번째 줄:
==개요==
==개요==
Gravity에서 나온 pH센서들은 일반, Pro 등 버전이 다르지만 기본적으로 사용법은 같다.
Gravity에서 나온 pH센서들은 일반, Pro 등 버전이 다르지만 기본적으로 사용법은 같다.
===Pro 스펙===
작동전압 : 5V
측정온도 : 0-60 ℃
정확도 : ± 0.1pH (25 ℃)
측정응답시간 : 1분 미만
<br />
<br />
==사용법==
==사용법==
메카솔루션에서 잘 정리해두었다. https://blog.naver.com/roboholic84/222252612286
메카솔루션에서 잘 정리해두었다. https://blog.naver.com/roboholic84/222252612286


코드만 따로 떼어 여기에 둔다.<syntaxhighlight lang="c">
제조사 공식 설명은 다음 링크에 있다. https://wiki.dfrobot.com/PH_meter_SKU__SEN0161_
 
코드만 따로 떼어 여기에 둔다.(코드는 제조사 공식 튜토리얼 코드에 주석 덧붙임.)<syntaxhighlight lang="c">
#define SensorPin A0  // 센서 핀은 아날로그0번에 꽂겠다는 지정.
#define SensorPin A0  // 센서 핀은 아날로그0번에 꽂겠다는 지정.
#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번째 줄: 44번째 줄:
     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번째 줄: 62번째 줄:
     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];
83번째 줄: 93번째 줄:
   return avg;
   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>
</syntaxhighlight>
===사용법===
====기준용액====
사용하기 전에 항상 기준점을 맞춰야 한다. 다음과 같은 사이트 등에서 기준용액을 구매하자. [https://smartstore.naver.com/mirae-sc/products/242508105?NaPm=ct%3Dksig1660%7Cci%3Dfc11875fb0c6df1cfdc7026a45fc57b68d84195c%7Ctr%3Dslsl%7Csn%3D240247%7Chk%3Deb0017f3b828076f1ec4b1b818864dd5113fd3ee 링크]
====유의====
측정하고자 하는 용액에 1분 정도 담근 후에 측정한다.(너무 길어도 용액에 센서가 상할 수 있다.)

2024년 8월 12일 (월) 22:15 기준 최신판

아두이노 관련 정보를 모으기 위한 틀. 틀:아두이노

  1. 아두이노:개요
  2. 아두이노:하드웨어
    1. 아두이노:우노보드
  3. 아두이노:코드
    1. 아두이노:기초 문법
    2. 아두이노:라이브러리
    3. 아두이노:컴퓨터에서 보드로
    4. 아두이노:안드로이드에서 보드로
  4. 아두이노:핀 사용
    1. 아두이노:전원공급
  5. 아두이노:시리얼 통신
    1. 아두이노:엑셀기록
    2. 아두이노:파이썬과 통신
  6. 아두이노:편의함수
  7. 센서 사용
    1. 아두이노:모션센서
    2. 아두이노:온습도센서
    3. 아두이노:조도센서
    4. 아두이노:pH미터 만들기(Gravity 아날로그 pH센서)
  8. 아두이노:LCD 사용
  9. 아두이노:스위치 사용
  10. 아두이노:릴레이
  11. 아두이노:WIFI
  12. 아두이노:해결되지 않은 다양한 의문들
  13. 수업용 간단 실습
    1. 아두이노:LED
    2. 아두이노:초음파센서
  14. 분류:아두이노 프로젝트

개요[편집 | 원본 편집]

Gravity에서 나온 pH센서들은 일반, Pro 등 버전이 다르지만 기본적으로 사용법은 같다.

Pro 스펙[편집 | 원본 편집]

작동전압 : 5V

측정온도 : 0-60 ℃

정확도 : ± 0.1pH (25 ℃)

측정응답시간 : 1분 미만

사용법[편집 | 원본 편집]

메카솔루션에서 잘 정리해두었다. https://blog.naver.com/roboholic84/222252612286

제조사 공식 설명은 다음 링크에 있다. https://wiki.dfrobot.com/PH_meter_SKU__SEN0161_

코드만 따로 떼어 여기에 둔다.(코드는 제조사 공식 튜토리얼 코드에 주석 덧붙임.)

#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;
}

측정된 ph 정보를 LCD판에 띠워 확인할 수 있도록 코딩하였다. 이때 pH센서의 A핀은 아두이노 보드의 A0핀에 연결하고 LCD판의 SDA는 아두이노 보드의 A4에, SCL은 A5에 연결한다. 모든 핀은 브레드 보드를 통해 연결해주었다.

#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);  // 원래 코드의 타이밍을 맞추기 위해 딜레이 추가
}

사용법[편집 | 원본 편집]

기준용액[편집 | 원본 편집]

사용하기 전에 항상 기준점을 맞춰야 한다. 다음과 같은 사이트 등에서 기준용액을 구매하자. 링크

유의[편집 | 원본 편집]

측정하고자 하는 용액에 1분 정도 담근 후에 측정한다.(너무 길어도 용액에 센서가 상할 수 있다.)