집 베란다에 있는 화분들이 많아지다 보니 물을 주는 것이 힘들 때가 있다. 아침 해가 뜨는 무렵에 물을 주고 싶은데, 계절의 변화에 맞춰 제 시간에 주는 것도 꽤 신경 써야 하는 일이다. 무엇보다도 여행 등으로 장기간 집을 비워야 하는 경우에는 좀 난감해진다. 그래서 자동으로 화분에 물을 주는 장치를 아두이노를 이용해 만들기로 했다.
시계 모듈을 사용해서 여름에는 매일, 그 외에는 2,3일에 한 번씩 물을 주게 하고, 물을 주는 시간도 계절 별로 달리 예약할 수 있게 한다. 예약 시간을 사용자가 셋팅하는 기능을 넣어볼까도 생각했지만, 초기에 한 번 셋팅하고 나면 그 후로는 변동이 거의 없을 거 같아서 그냥 프로그램 코드에 하드코딩해 업로드 하는 식으로 간단하게 하려고 한다.
교재에 나온 예제들중에서 다음의 두 가지를 응용해보기로 했다.
13장 RTC 시계 모듈 실습
16장 16X2 텍스트 LCD 모듈(I2C) 실습
13장 RTC 시계 모듈 실습
사용할 시계 모듈은 DS1302 라는 모델로, 교재에 예제가 나와 있는데다가 인터넷을 찾아봐도 가장 많이 사용되는 모델인거 같아서 선택했다.
이 모듈을 사용하기 위한 라이브러리는 virtuabotixRTC.h 가 가장 많이 사용되는 거 같은데, 이 라이브러리는 아두이노 IDE 의 Library Manager 에서 검색해 설치할 수가 없었다. 인터넷을 찾아보니 gitHub 에 홈페이지가 있길래, zip 파일을 다운로드 받아 수동으로 설치해줬다.
https://github.com/chrisfryer78/ArduinoRTClibrary
GitHub - chrisfryer78/ArduinoRTClibrary: An easy to use real time clock library for Arduino, it was in the public domain, but no
An easy to use real time clock library for Arduino, it was in the public domain, but not on GitHub, so I uploaded it. - GitHub - chrisfryer78/ArduinoRTClibrary: An easy to use real time clock libra...
github.com
설치 방법은 아두이노 IDE 의 메뉴에서 Sketch -> Include Library > Add .Zip Library 에서 다운로드 받은 zip 파일을 선택해주면된다.
RTC 모듈에는 총 5개의 핀이 있다. VCC 와 GND 는 아두이노 보드의 5V 와 GND 에 연결하고, 나머지 3개(CLK, DAT, RST)는 보드의 디지털 4,3,2 번에 연결했다.
DS1302 모듈은 CR2032 수은건전지를 이용해서 현재 시각을 기억해 놓기 때문에, 처음에 한번만 시간 셋팅을 해주면 그 이후로는 전원을 다시 켜거나 아두이노 보드의 리셋 버튼을 눌러도 현재 시각이 계속 보여진다. 현재 시각을 셋팅하는 건 아래와 같이 하드코딩 해서 해결했다.
#include <virtuabotixRTC.h>
virtuabotixRTC myRTC(4,3,2);
void setup() {
Serial.begin(9600);
myRTC.setDS1302Time(00, 20, 18, 3, 11, 7, 2023);
}
void loop() {
myRTC.updateTime();
Serial.print("현재 날짜 / 시각 : ");
Serial.print(myRTC.dayofmonth);
Serial.print("/");
Serial.print(myRTC.month);
Serial.print("/");
Serial.print(myRTC.year);
Serial.print(" ");
Serial.print(myRTC.hours);
Serial.print(":");
Serial.print(myRTC.minutes);
Serial.print(":");
Serial.print(myRTC.seconds);
Serial.println("");
delay(1000);
}
virtuabotixRTC myRTC() 에서 핀 번호를 등록해주는데, 순서대로 CLK, DAT, RST 와 연결된 보드의 디지털 핀번호를 입력해줘야 한다.
현재 시각 셋팅에 사용하는 함수는 setDS1302Time() 이고, 현재 시각을 '초, 분, 시, 요일, 일, 월, 년도' 순으로 쉼표로 구분해 파라미터로 넘긴다. 네 번째의 '요일' 파라미터의 숫자는 일요일이 1, 월요일이 2, 화요일이 3, 수요일이 4, 목요일이 5, 금요일이 6, 토요일이 7 이다.
위 코드에서와 같이 파라미터로 입력해 놓은 현재 시각의 20초 전쯤에 먼저 위 코드를 아두이노 보드에 업로드한다. 내 컴퓨터에서는 보통 업로드하는데 10초 정도 걸리기 때문에, 업로드 후 작동 시켜보면 실제 현재 시각보다 10여초 빠른 시각을 보여준다. 이 상태에서 코드에 입력해 놓은 현재 시각의 2초 전쯤에 아두이노 보드의 리셋 버튼을 클릭한다. 리셋 되는데 대략 2초 정도가 걸리기 때문에, 이 때부터는 실제 현재 시각과 거의 동일한 시각을 보여주게 된다.
위 코드를 업로드한 결과는 다음과 같다.
이제, 위 코드에서 myRTC.setDS1302Time(00, 20, 18, 3, 11, 7, 2023); 부분을 주석처리를 한 후 다시 업로드한다.
#include <virtuabotixRTC.h>
virtuabotixRTC myRTC(4,3,2);
void setup() {
Serial.begin(9600);
// myRTC.setDS1302Time(00, 20, 18, 3, 11, 7, 2023);
}
void loop() {
myRTC.updateTime();
Serial.print("현재 날짜 / 시각 : ");
Serial.print(myRTC.dayofmonth);
Serial.print("/");
Serial.print(myRTC.month);
Serial.print("/");
Serial.print(myRTC.year);
Serial.print(" ");
Serial.print(myRTC.hours);
Serial.print(":");
Serial.print(myRTC.minutes);
Serial.print(":");
Serial.print(myRTC.seconds);
Serial.println("");
delay(1000);
}
Serial Monitor 에 현재 시각이 정확히 잘 나오는 것을 확인할 수 있다. 이후로도 아두이노 보드의 전원을 다시 켜거나 리셋 버튼을 눌러도 현재 시각이 계속 잘 나오게 된다.
16장 16X2 텍스트 LCD 모듈(I2C) 실습
제품을 사용할 때 현재 시각이나 예약한 시각을 Serial Monitor 로 확인하게 해서는 안 되고, 사용자가 쉽게 볼 수 있도록 디스플레이 화면에 출력을 해줘야 할 거 같다.
먼저 교재에 포함된 16X2 텍스트 LCD 모듈을 사용해서 테스트 해보기로 한다. 16X2 는 1줄당 16개의 글자를 표시할 수 있고, 이게 총 2줄이 있다는 뜻이다. 특별한 제품명은 없고 여러 회사에서 동일한 제품을 생산하는 거 같다.
이 모듈을 사용하기 위한 라이브러리는 LiquidCrystal_I2C.h 를 많이 사용하는 거 같은데, 다행히 아두이노 IDE 의 Library Manager 에서 검색해 설치가 가능했다.
모듈에는 총 4개의 핀이 있는데, VCC 와 GND 는 보드의 5V 와 GND 에 연결하고 나머지는 각각 아날로그 4번과 5번 핀에 연결했다.
#include <virtuabotixRTC.h>
#include <LiquidCrystal_I2C.h>
virtuabotixRTC myRTC(4,3,2);
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(9600);
//myRTC.setDS1302Time(00, 20, 18, 3, 11, 7, 2023);
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Current time is");
lcd.setCursor(0, 1);
lcd.print("on setting");
}
void loop() {
myRTC.updateTime();
String ctime = String(myRTC.dayofmonth) + "/" + String(myRTC.month) + " " + myRTC.hours + ":" + myRTC.minutes + ":" + myRTC.seconds;
Serial.println(ctime);
delay(1000);
lcd.setCursor(0, 1);
lcd.print(ctime);
}
lcd(0x27, 16, 2) 함수의 첫 번째 파라미터 0x27 은 해당 LCD 모듈의 제작사에서 요구하는 것이라서 항상 이 값으로 코딩해야 한다. 만약 다른 제작사의 제품에서 위 코드가 오작동 한다면 이 값을 변경해줘야 한다.
인터넷을 검색해보니 각 제품들에서 이 값을 찾아주는 프로그램 코드가 있다. 직접 테스트해보지는 않았는데, 혹시라도 나중에 필요할 거 같아 올려둔다.
https://github.com/todbot/arduino-i2c-scanner
GitHub - todbot/arduino-i2c-scanner: Simple Arduino I2C scanner as described at http://todbot.com/blog/2009/11/29/i2cscanner-pde
Simple Arduino I2C scanner as described at http://todbot.com/blog/2009/11/29/i2cscanner-pde-arduino-as-i2c-bus-scanner/ - GitHub - todbot/arduino-i2c-scanner: Simple Arduino I2C scanner as describe...
github.com
'아두이노 > 자동 화분 급수기' 카테고리의 다른 글
#5 제작 - 스케쥴링, unix time(epoch, POSIX) 변환 (0) | 2024.01.29 |
---|---|
#4 제작 - 릴레이 멈춤 현상, RC스너버 (0) | 2024.01.03 |
#3 기획 및 검토 - 솔레노이드 밸브, 릴레이 (0) | 2023.08.23 |
#2 기획 및 검토 - SSD1306 OLED 모듈(I2C) (0) | 2023.08.13 |