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

Arduino Uno 로 토양 수분센서를 사용해서 I2C 1602 캐릭터 LCD에 토양 수분 출력값 출력해 보기

by 오마이엔지니어 2018. 9. 8.
반응형

 

Arduino Uno 로 토양 수분센서를 사용해서 I2C 1602 캐릭터 LCD에 토양 수분 출력값을

출력해 보는 프로젝트 입니다

 

 

토양 수분센서는 아두이노 AVR, STM, ARM 등의 마이크로 컨트롤 보드와 간단하게 연결해서
DO 디지털 출력이나 AO 아날로그 출력 방식으로 테스트 가능합니다

(물론 산업용 센서가 아니고 테스트용 교육용 센서기 때문에 아주 정밀한 테스트에는 적합하지 않습니다)
SCL, SDA 2개의 통신 선을 사용해서 통신하는 I2C 1602 캐릭터 LCD를 사용해서 LCD 디스플레이를 통해 출력값을 확인해 볼수 있습니다

사용된 부품
아두이노 우노
토양 수분 센서 모듈
I2C / IIC 1602 캐릭터 LCD 모듈

점퍼케이블
미니 브래드보드
막대저항 220Ohm
5mm LED 블루

사용된 키트
아두이노 토양 수분 센서 키트


구성 배선도-토양수분 감지시 LED 점등시키기


구성 배선도-토양수분 감지시 I2C 1602 LCD로 출력값 확인해 보기

사용된 예제파일

example code1.txt

example code2.txt

 

사용된 라이브러리

LiquidCrystal_I2C.zip


주의사항
위 첨부된 LiquidCrystal_I2C 라이브러리를 사용해서 테스트 하도록 합니다
PC에 기존에 다른 LiquidCrystal_I2C 라이브러리가 사전에 설치되어 있다면 충돌해서 컴파일 에러가 날수 있으니 주의 하도록 합니다

전압은 꼭 5V를 사용 하도록 합니다, LCD를 사용하기 때문에 A(전류)가 충분히 공급되지 않는다면 화면 출력이 안될수도 있습니다
example code1 예제가 "토양수분 감지시 LED 점등시키기" 입니다
example code2 예제가 "토양수분 감지시 I2C 1602 LCD로 출력값 확인해 보기" 입니다
5mm LED 배선시 다리가 긴쪽이 (+) 짧은쪽이 (-) 입니다
I2C 1602 캐릭터 LCD 배선시 SCL (아두이노 우노 A5에 연결) 과 SDA (아두이노 우노 A4에 연결) 핀이

배선이 정확하게 잘 되어 있는지 주의 하도록 합니다


첫번째 예제코드는 아주 간단합니다

 

int led = 3;
int sensor = 2;

void setup()
{
pinMode(led, OUTPUT);
pinMode(sensor, INPUT);
}

void loop()
{
if( digitalRead(sensor) == LOW )
digitalWrite(led, HIGH);
else
digitalWrite(led, LOW);

delay(100);
}

LED 핀은 3번이고 센서 핀은 2번으로 세팅되어 있습니다
delay(100); 딜레이 타임이 있고, 2번핀 센서 토양 수분 일정 감지시 3번핀 LED가 HIGH (ON) 됩니다


두번째 예제코드를 살펴보겠습니다

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
위 두가지 라이브러리를 사용합니다


LiquidCrystal_I2C lcd(0x27,16,2); 
I2C 1602 캐릭터 LCD의 기본 I2C 주소는 0X27 입니다, 당사는 제품을 출고할때 I2C 주소 0X27 를 확인해서 출고하고 있습니다만
거의 대부분의 무책임한 도매 판매 업체들은 I2C 주소 확인없이 그냥 보내는 경우가 많습니다
이경우 I2C 스캐너 예제로 I2C 주소를 확인해서 맞는 I2C 주소로 수정해 주고 테스트 해야 합니다
만약 I2C 주소가 0X3F 이라면 LiquidCrystal_I2C lcd(0x3F,16,2); 이렇게 수정해 주고 테스트 하면 됩니다 

I2C 스캐너 예제 테스트는 아래 포스팅을 참조해 주세요
Arduino Uno 로 I2C 1602/2004 캐릭터 LCD 를 사용해보고 I2C 주소 확인해 보기

Serial.begin(9600); 
pinMode(3,INPUT);
시리얼 통신속도는 9600 이며, 핀모드 3번 입니다

soil_mos=1023-analogRead(0);//get soil moisture value from A0 pin
soil_mos=map(soil_mos, 0, 1023, 0, 100); //convert moisture value in percentage format
아날로그 출력 0번핀으로 세팅되어 있으며, 아날로그 0~1023 범위를 퍼센트로 측정값을 출력 합니다

lcd.setCursor(0,0);
lcd.print("Soil Moist.:");
lcd.print(soil_mos);
lcd.print("%");
LCD 출력 부분 입니다


프로젝트 동영상-토양수분 감지시 LED 점등시키기

프로젝트 동영상-토양수분 감지시 I2C 1602 LCD로 출력값 확인해 보기


만약 I2C 1602 캐릭터 말고 배선이 다소 복잡하지만
일반 1602 캐릭터 LCD로 테스트 하고자 한다면 아래 링크의 포스팅을 참조하면 됩니다
https://rockjjy.tistory.com/347

추가로 토양 수분 감지센서를 사용해서 서보모터를 제어해 보는 프로젝트 입니다

구성 배선도

 

사용된 예제소스

Soil Servo.txt
0.00MB

 

주의사항
가장 주의해야 할 점은 마이크로 서보모터이긴 하지만 SG90 서보모터 역시 제대로 동작하려면
안정적인 전압과 전류가 필요하므로 토양 수분 감지센서와 별도의 전압으로 5V로 연결해 줍니다
토양 수분 감지센서는 3.3V 에도 동작하므로 SG90 서보모터와 별도로 3.3V로 연결해 줍니다

예제코드를 살펴보면
 #include <Servo.h>
기본 Servo.h 라이브러리를 사용합니다

 
 int pinIR=5; //IR sensor digital pin
 int pinServo=3; //servo motor pin
 int pinLED=2;
 int val=0;

토양 수분 감지센서는 아두이노 5번핀
SG90 서보모터는 아두이노 3번핀

LED는 아두이노 2번핀에 연결합니다
2번핀에는 부저를 연결해도 무관합니다 (부저의 소리를 크게 하기 위해서는 저항을 빼고 연결합니다)

void setup(){
  Serv.attach(pinServo);
  pinMode(pinLED,OUTPUT);
}
셋업에서 센싱값을 받아서 서보모터와 LED를 동작시킵니다


void loop(){
  val = digitalRead(pinIR);
  
  if (val ==0) { 
    Serv.write(10);
    digitalWrite(pinLED,HIGH);
    delay(100);
  }
  else{
    Serv.write(150);
    digitalWrite(pinLED,LOW);
    delay(100);
  }
}
루프에서 if문을 사용해서 디지털 센서값을 읽어서
토양 수분이 감지되었을 때는 서보모터가 10도 복귀하며 LED가 켜집니다

else문을 사용해서 그밖의 토양 수분이 감지되지 않았을 때는 서보모터가 150도로 움직이고 LED가 꺼집니다

예제코드의 Serv.write(10); 
10도 또는  Serv.write(150); 150도를 적당하게 바꾸어서 테스트 가능합니다
하단 동영상에서는 150도로 테스트 해보았습니다 (SG90 서보모터는 180도 회전이 가능하니 수정해서 테스트 해보세요)

프로젝트 동영상


이렇게 아두이노로 토양 수분이 감지되면 LED가 켜지거나 경보가 울리면서 모터가 동작하는 방법을 응용하여
식물하우스 등의 토양수분이 부족할때 모터가 구동되거나 멈추면서  물을 뿌려주는 스프링클러 제작원리를
공부해 볼수 있습니다


 
example code1.txt
0.0MB
 
example code2.txt
0.0MB
 
LiquidCrystal_I2C.zip
0.02MB
반응형

댓글