자동 사료 급식기 #2.소스설명
- 윈드마켓
- 2019년 2월 18일
- 2분 분량
이번 강좌에서는 이전 프로젝트에서 진행한 코인 Ticker 의 소스를 응용한 부분을 설명하도록 하겠습니다.
기존 프로젝트와 동일한 부분은 기존 강좌의 링크로 대체하도록 해서
와이파이 연동부분을 제외한 서보모터 제어하는 부분만 보시고자 하는 분들이 쉽게 접근하실 수 있도록 하겠습니다.
우선 코인 Ticker 강좌의 순서대로 진행토록 하겠습니다.
1. (필수) 아두이노 IDE 개발 환경설정 코인 Ticker 만들기 #3.환경설정 강좌를 참조합니다.
2. (필수) 아두이노 IDE 개발환경에 Wemos D1 mini 연결하기
3. (선택) Wifi 목록 확인 코인 Ticker 만들기 #7.Wifi 목록 확인
강좌를 참조합니다.
4. (선택) OLED 사용
코인 Ticker 만들기 #9 강좌를 참조합니다.
5. (선택) EEPROM 제어하기
코인 Ticker 만들기 #10.EEPROM 제어하기 강좌를 참조합니다.
6. (선택) AP모드 사용하기
강좌를 참조합니다.
7. (선택) Station 모드 사용하기
코인 Ticekr 만들기 #13.Station모드 강좌를 참조합니다.
8. (필수) Timer 사용하기
코인 Ticekr 만들기 #14.Timer 강좌를 참조합니다.
9. (필수) 서보모터 제어하기
코인 Ticker 만들기 프로젝트에서 다른점은 이 단락인데요
서보모터는 널리 사용하고 있는 SG90 모델을 사용해 보도록 하겠습니다.
다른 어떤 서보모터를 사용하셔도 무관합니다.
연결하는 법은 아래와 같습니다.
<SG90서보> <Wemos D1 mini>
GND(밤색) <-> GND
VCC(빨간색) <-> VCC 5v
신호(주황색) <-> D8
소스를 보면 기존 코인 Ticker 부분을 제외하고는 아래부분이 다른 부분이며 핵심부분입니다.
#include <Servo.h> —> 서보모터를 구동하기 위한 헤더정보를 참조합니다.
Servo servo; —> 서보모터 객체를 생성합니다.
void setup() {
… 중략 …
servo.attach(D8); —> 서보모터의 신호를 D8 핀과 연동합니다.
… 중략 …
foodt.every(1*24*60*60*1000, foodset); //1days timer init —> 타이머를 세팅합니다.
//소스에서는 1(하루) * 24(시간) * 60(분) * 60(초) 로 하루에 한번씩 fondest 메서드를 호출하도록 합니다.
}
void loop() {
if (cur_mode == ap_set) { //if ap mode
… 중략 …
} else if (cur_mode == station) {
foodt.update(); —> 타이머를 업데이트 합니다.
}
}
void foodset(){
digitalWrite(LED0, LOW); —> 내장 LED 를 깜빡입니다.
delay(50);
digitalWrite(LED0, HIGH);
delay(50);
digitalWrite(LED0, LOW);
delay(50);
digitalWrite(LED0, HIGH);
// 서보모터 돌리
servo.write(180); //180도 —> 서보모터를 180도로 세팅합니다.
delay(500); // 0.5초 —> 사료가 배출되는 시간을 위해 0.5초 기다려 줍니다.
servo.write(90); // 90도 —> 서보모터를 90도로 세팅합니다.
}
10. (선택) 마지막 사료 지급시간과 현재까지의 지급 횟수 표시하기
나중에 추가된 부분이며 Time 라이브러리를 사용하여 NTP 서버로 부터 현재시간을 구조체로 받아 처리하는 방법입니다.
#include <time.h>
const char* ntpServer = "kr.pool.ntp.org"; // NTP서버를 지정합니다.
//3200초는 1시간, 우리나라는 GMT+9 이므로 3600초x9 = 32400 해 줌
const long gmtOffset_sec = 32400;
//섬머타임 적용 시 3600 (시간을 1시간 빠르게 함)
//우리나라는 시행 안하므로 0
const int daylightOffset_sec = 0;
int cntFood = 0; // 사료 급식 카운트 입니다.
void setup() {
… 중략 …
/*******************
* 현재시간 관련 초기화
******************/
//init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); // 현재시간 설정
debug.println("\nWaiting for time");
while (!time(nullptr)) {
debug.print(".");
delay(1000);
}
debug.println("");
debug.println("setting time ok");
}
void foodset(){
… 중략 …
cntFood++; // 사료 지급 건수를 누적한다.
printLocalTime(); // 현재시간과 건수를 OLED에 표시한다.
}
void printLocalTime(){
String a[6];
// 현재시간 정보를 구조체에 담아냅니다.
time_t now = time(nullptr);
struct tm * timeinfo;
timeinfo = localtime(&now);
// 현재시간 정보를 분리하여 문자열 배열에 담아냅니다.
a[0]=String(timeinfo->tm_sec, DEC);
a[1]=String(timeinfo->tm_min, DEC);
a[2]=String((timeinfo->tm_hour), DEC);
a[3]=String((timeinfo->tm_mday), DEC);
a[4]=String((timeinfo->tm_mon+1), DEC);
a[5]=String((timeinfo->tm_year+1900), DEC);
// 10 이하의 숫자 앞에 0을 붙입니다.
if(timeinfo->tm_sec<10) a[0]="0"+a[0];
if(timeinfo->tm_min<10) a[1]="0"+a[1];
if(timeinfo->tm_hour<10) a[2]="0"+a[2];
if(timeinfo->tm_mday<10) a[3]="0"+a[3];
if(timeinfo->tm_mon<10) a[4]="0"+a[4];
// OLED에 현재시간을 출력합니다.
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Last:");
display.print(a[5]);
display.print("-");
display.print(a[4]);
display.print("-");
display.print(a[3]);
display.print(" ");
display.print(a[2]);
display.print(":");
display.println(a[1]);
//display.print(":");
//display.println(a[0]);
// OLED에 횟수를 출력합니다.
display.print("Cnt:");
display.println(cntFood);
display.display();
}
이상으로 자동 사료 급식기에 대해서 강좌를 진행해 보았습니다.
기존 강좌에 서보모터 제어하는 부분만 추가된것이라서 크게 어려움은 없었으리라 생각됩니다.
개선된 버전이 있을때 강좌를 추가해 놓도록 하겠습니다.
감사합니다.
소스파일은 아래 경로에 있습니다.
http://wix.to/LkD7AKQ
コメント