본문 바로가기
Arduino(아두이노) 활용 강좌

Arduino Uno 로 아날로그 TDS 메터 모듈을 사용해서 수질 측정해 보기

by 오마이엔지니어 2024. 12. 5.
반응형

Arduino Uno 로 아날로그 TDS 메터 모듈을 사용해서 수질을 측정해 보고 활용해서 측정한 수질을
I2C 1602 캐릭터 LCD에 출력해 보는 프로젝트 입니다

<아두이노 TDS 메터 모듈 이미지>


아두이노 TDS 메터 모듈
은 3.3 ~ 5.5V의 넓은 전압 입력을 받고 0 ~ 2.3V의 아날로그 전압 출력을 제공하여 
Arduino, AVR, STM, ARM 등과 같은 5V 또는 3.3V 전압의 마이크로 컨트롤 보드와 호환됩니다
사용된 예제소스는 AC 신호로 프로브의 분극을 효과적으로 방지하고 프로브의 수명을 연장할 수 있으며, 
동시에 출력 신호의 안정성을 높이는 데 도움이 될 수 있습니다 
TDS 프로브는 방수 기능이 있어 물에 담가 장시간 측정할 수 있습니다

주의!
프로브는 섭씨 55도 이상의 물에서 사용할 수 없습니다

프로브를 용기 가장자리에 너무 가깝게 두어서는 안 됩니다 판독에 영향을 미칠수 있습니다
프로브의 헤드와 케이블은 방수 처리되어 있지만 커넥터와 신호 전송 보드는 방수 처리되어 있지 않습니다
 
TDS란?
TDS는 Total Dissolved Solid(총용존고형물)의 약자입니다
오염된 물을 여과지에 여과시켰을 경우 여과지에 걸러지는 것이 있고 통과하는 것이 있습니다
여과지에 걸려지는 것을 SS(Suspended Solid 부유물질)라고 하며 이를 건조하여 무게를 측정하게 됩니다
여과지를 통과한 용액 속에 있는 용해된 물질을 바로 용존고형물(TDS)이라고 합니다
TDS(Total Dissolved Solids)는 1리터의 물에 얼마나 많은 밀리그램의 용해성 고체가 포함되어 있는지를 표현하는 
용어로 TDS 값이 높을 수록 더 많은 고용물질이 있어 물이 덜 깨끗하고, 낮을수록 물이 깨끗하다는 의미입니다

측정원리는 측정기의 끝에 있는 감응센서 2개 사이를 흐르는 전기의 양에 의하여 TDS 수치가 변하는데
이것은 물속에 이온 물질이 많을수록 전기가 흐르는 양이 많기 때문입니다
즉 이온물질이 많을수록 전기가 잘흐르게 되고 높은 수치를 나타내게 되는 원리를 활용한것입니다

*TDS 수치 ppm(mg/L)
생수: 40~130
수돗물: 40~200
쥬스류: 3,000
어항물: 350
바닷물: 20,000
지하수: 30~1,000
역삼투수: 3~200


사용된 부품

Arduino Uno R3 (Italy)
아두이노 TDS 메터 모듈
I2C 1602 캐릭터 LCD

점퍼케이블(숫놈-암놈)
점퍼케이블(숫놈-숫놈)

사용된 키트
아두이노 TDS 수질 측정 키트

구성 배선도 - TSD 메터로 수질을 측정해 시리얼 모니터로 출력해 보기


구성 배선도 - TSD 메터로 수질을 측정해 I2C 1602 캐릭터 LCD에 출력해 보기



사용된 예제소스

TDS Meter 테스트.txt
0.00MB
TDS Meter_I2C LCD.txt
0.00MB


사용된 라이브러리

LiquidCrystal_I2C.zip
0.02MB


라이브러리를 다운 받아서 설치해야 합니다
라이브러리 추가 방법은 Arduino IDE 설치하기 포스팅을 참조해 주세요


테스트 방법
LiquidCrystal_I2C 라이브러리 설치가 필요합니다
기존의 다른 버전의  LiquidCrystal 라이브러리가 이미 설치되어 있으면 컴파일 에러가 날수 있습니다
이점 주의해서 중복 설치되지 않도록 주의해서 테스트 합니다
두번째 예제를 테스트 할때는 배선도를 보면알수 있듯이 I2C 1602 LCD는 전류 소모가 많으므로 5V로 연결해 줍니다
TDS 메터는 3.3V로도 동작 시킬수 있으므로 3.3V로 연결해 줍니다

위 예제를 다운로드 해서 업로드 후 생수나 수돗물 음료수 등을 용기에 담아
프로브를 용기 중앙에 잘 담구어 시리얼 모니터(보드레이트 통신속도는 115200)로 TDS 값을 확인해 보면 됩니다

첫번째 TDS Meter 테스트 예제코드를 살펴보면

#define TdsSensorPin A1   // TDS센서 핀은 아날로그 A1으로 세팅
#define VREF 5.0      // 아날로그 기준전압(Volt) of the ADC
#define SCOUNT  30     // 샘플 포인트의 합
int analogBuffer[SCOUNT];    // 배열에 아날로그 값을 저장하고, ADC로 부터 읽음
int analogBufferTemp[SCOUNT];
int analogBufferIndex = 0,copyIndex = 0;
float averageVoltage = 0,tdsValue = 0,temperature = 25;


void setup()
{
    Serial.begin(115200);  // 시리얼 통신 속도는 115200
    pinMode(TdsSensorPin,INPUT);  // TSD센서핀의 측정값을 입력받아서 출력
}

void loop()
{
   static unsigned long analogSampleTimepoint = millis();
   if(millis()-analogSampleTimepoint > 40U)     // 40밀리초 마다 ADC에서 아날로그 값을 읽음
   {
     analogSampleTimepoint = millis();
     analogBuffer[analogBufferIndex] = analogRead(TdsSensorPin);    // TDS 센서핀의 아날로그 값을 읽고 버퍼에 저장
     analogBufferIndex++;
     if(analogBufferIndex == SCOUNT) 
         analogBufferIndex = 0;
   }   

     printTimepoint = millis();
      for(copyIndex=0;copyIndex<SCOUNT;copyIndex++)
        analogBufferTemp[copyIndex]= analogBuffer[copyIndex];
      averageVoltage = getMedianNum(analogBufferTemp,SCOUNT) * (float)VREF / 1024.0;   // 중간값 필터링 알고리즘을 통해 보다 안정적인 아날로그 값을 읽고 전압 값으로 변환
      float compensationCoefficient=1.0+0.02*(temperature-25.0);    // 온도 보상 공식: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0));
      float compensationVolatge=averageVoltage/compensationCoefficient;  // 온도 보상 공식
      tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5;  // 전압값을 TDS 값으로 변환
      //Serial.print("voltage:");
      //Serial.print(averageVoltage,2);
      //Serial.print("V   ");
      Serial.print("TDS Value:");
      Serial.print(tdsValue,0);
      Serial.println("ppm");
변환된 TDS 값 ppm 을 시리얼 모니터에 출력


두번째 TDS Meter_I2C LCD 예제코드를 살펴보면
첫번째 예제코드와 온도보상 공식은 동일하지만 TDS 측정값을 시리얼 모니터 대신 I2C 1602 캐릭터 LCD에
출력을 해줘야 하기 때문에 세팅에서 약간 틀린 부분이 있습니다

#include <LiquidCrystal_I2C.h>  // LiquidCrystal_I2C 라이브러리를 사용
LiquidCrystal_I2C lcd(0x27, 16, 2);  // I2C 주소 0x27, 16열 2행

void setup()
{
    Serial.begin(115200);   // 시리얼 통신 속도는 115200
    pinMode(TdsSensorPin,INPUT);   // TSD센서핀의 측정값을 입력받아서 출력
    lcd.init();  // LCD 초기화
  lcd.backlight();
}

  lcd.setCursor(0, 0);
  lcd.print("TDS Value : "); 
  lcd.print(tdsValue,0);
  lcd.setCursor(3, 1);
  lcd.print("TDS PPM"); 
변환된 TDS 값 ppm 을 LCD에 출력


프로젝트 동영상 - TSD 메터로 수질을 측정해 시리얼 모니터로 출력해 보기


프로젝트 동영상 - TSD 메터로 수질을 측정해 I2C 1602 캐릭터 LCD에 출력해 보기


이렇게 아두이노 TDS 메터 모듈을 사용해서 간단하게 수질을 측정해 볼수 있습니다
물론 임베디드 교육용 모듈이라 산업용 TDS 측정기와 비교하면 정확도는 많이 떨어지는 편입니다 
하지만 DFRobot 라이브러리를 사용한다면 조금더 정밀하게 보정을 해서 테스트를 해볼수도 있습니다
보정 방법은 아래 DFRobot Wiki 링크를 참조해 주세요

https://wiki.dfrobot.com/Gravity__Analog_TDS_Sensor___Meter_For_Arduino_SKU__SEN0244

반응형

댓글