프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

LCD와 피에조부저, 스위치를 사용하여 알람시계만들기

2014-08-18 10:15:44

개요

개요

각 센서들과 LCD를 이용하여 간단한 LCD알람시계를 만들어 보자.
100줄 내외의 소스코드와 몇개의 센서와 LCD를 통해 구현이 가능하다.
시간은 swRTC라이브러리를 이용하여 간단하게 구현이 가능하고 나머지 LCD나 스위치, 피에조부저의 사용법은 튜토리얼을 통해 간단히 익히고 사용 할 수 있다.

LCD에서는 현재 시간과 알람시간을 지정했을 경우 지정된 알람시간이 뜨게되고 현재시간이 알람시간과 동일할 경우에 피에조부저에서 소리가 나며 알람이 울리게 된다.
스위치를 1초간 누르거나 현재시간에서 1분이 경과할 경우 피에조부저의 알람은 꺼지게 된다.

원리는 일반 디지털 알람시계와 비슷하기 때문에 만들면서 디지털시계에 대한 지식도 공부할 수 있을 것이라 생각한다.


동영상

필요한 사전지식

LCD사용
피에조 부저
스위치
swRTC 라이브러리




부품 목록

NO 부품명 수량 상세정보
1 아두이노 보드 1  
2 브레드 보드 1  
3 LCD 1  
4 가변 저항기 1  
5 피에조 부저 1  
6 스위치 1  
7 케이블 약 20개  


부품명 아두이노 보드 브레드 보드 LCD 가변 저항기 피에조 부저
부품사진
부품명 스위치 케이블      
부품사진      








하드웨어 making

브레드 보드



전자회로도

소프트웨어 coding

/*
 LCD 연결해서 글자 출력하기
 
 이 스케치는 KocoaFab에서 만들었습니다.
 이 스케치는 누구든 무료로 사용할 수 있습니다.
*/

#include <LiquidCrystal.h>
#include <core_build_options.h>
#include <swRTC.h>

LiquidCrystal lcd(12,11,5,4,3,2);        //RS 핀, E핀, 데이터 핀 4개
String lcdString = "";                   //객체 선언 : 출력 할 글자 저장

swRTC rtc; 

int piezo = 6;
int switchPin = 9;
int temp;

//AM PM을 구분해 주는 함수
void Set_AMPM(int hour) {
  if(hour >=12) 
    lcd.print("PM");
  else 
    lcd.print("AM");

  lcd.print(hour%12, DEC);     //시간 출력
}

//10보다 작은수를 출력할때 앞에 0을 출력하게 하는 함수
void Set_lowThanTen(int time) {
  if(time < 10) {
    lcd.print("0");
    lcd.print(time%10);
  }
  else
    lcd.print(time);
}

//유효한 알람시간인지 체크하는 함수
int checkTheAlarmClock(int time) {
  if(time/100 < 24 && time %100 < 60) {
    Serial.println("Success");
    return time;
  }
  else {
    Serial.println("Failed");
    return 0;
  }  
}

//알람이 울릴시간인지 체크하는 함수
void checkTheAlarmTime(int alarmHour, int alarmMinute) {
  if(alarmHour == rtc.getHours() && alarmMinute == rtc.getMinutes()) {
        analogWrite(piezo, 128);
    }
}

void setup() {                   
  lcd.begin(16,2);         //LCD 크기 지정, 2줄 16칸
  lcd.clear();             //화면 초기화
  
  rtc.stopRTC();           //정지
  rtc.setTime(14,05,0);    //시간, 분, 초 초기화
  rtc.setDate(24, 8, 2014);  //일, 월, 년 초기화 
  rtc.startRTC();          //시작
  
  pinMode(piezo, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP); 
  Serial.begin(9600);      //시리얼 포트 초기화 
  Serial.begin(9600);                    //시리얼 통신 초기화
}

void loop() {
  int day;
  lcd.setCursor(0,0);                    //커서를 0,0에 지정 
  
  //1초 단위로 갱신하며 현재시간을 LCD에 출력
  Set_AMPM(rtc.getHours()); 
  lcd.print(":");
  Set_lowThanTen(rtc.getMinutes());
  lcd.print(":");
  Set_lowThanTen(rtc.getSeconds());
  //날짜를 LCD에 출력
  lcd.print("[");
  Set_lowThanTen(rtc.getMonth());
  lcd.print("/");
  Set_lowThanTen(rtc.getDay());
  lcd.print("]");
  //세팅된 알람시간을 LCD에 출력
  lcd.setCursor(0,1);
  lcd.print("Alarm ");
  Set_AMPM(temp/100);
  lcd.print(":");
  Set_lowThanTen(temp%100); 
  
  //1초마다 LCD갱신
  lcdString = "";                      //문자열 초기화
  lcd.print("               ");        //전 글씨 삭제
  delay(1000);
  
  //알람이 울릴 시간인지 체크
  checkTheAlarmTime(temp/100, temp%100);
   
  //스위치버튼이 눌렸을 경우 피에조센서의 소리를 0으로 하고 알람시간을 초기화 한다 
  if(!digitalRead(switchPin)) {
    temp = 0;
    day = 0;
    analogWrite(piezo, 0);
    Serial.println("Alarm clock initialize");
    Serial.println("AM0:00");
  }
  //시리얼 통신을 통해 알람시간을 입력받고 시리얼 모니터에 출력 
  char theDay[4];
  int i = 0;
  if(Serial.available()) {
    while(Serial.available()) {
      theDay[i] = Serial.read();
      i++;
  }
    day = atoi(theDay);
    if(day/100 >= 12) {
      Serial.print("PM");
      Serial.print((day/100)-12);
    }
    else {
      Serial.print("AM");
      Serial.print(day/100);
    }
    Serial.print(":");
    if(day%100 < 10)
      Serial.print("0");
    Serial.println(day%100);
    temp = checkTheAlarmClock(day);
  }
}
구조를 보면 크게
1. setup함수내에서 날짜, 시간을 초기화하는 부분
2. 초기화된 날짜, 시간을 가지고 LCD에 날짜와 시간을 뿌려주는 부분
3. 알람시간의 유효성을 검사하고 알람이 울릴시간인지 체크하는 부분
4. 알람시간을 시리얼통신을 통해 사용자에게 입력받고 지정해주는 부분

이렇게 4부분으로 볼 수 있고  소스 내에 함수가 4개 존재한다.

첫 번째 함수는 24시간 함수를 AM PM으로 변환하여 12시간으로 변환하는 함수이고 (Set_AMPM())
두 번째 함수는 시간이 10보다 작을 경우 앞자리에 0을 출력하는함수이고 (Set_lowThanTen())
세 번째 함수는 지정된 알람시간이 시간규칙(시는 24시간, 분은 60분)을 위배하지 않았는지 체크하는 함수이고 (checkTheAlarmClock())
네 번째 함수는 알람이 울릴시간인지 체크하는 함수이다.(CheckTheAlarmTime())

세 번째, 네 번째 알람관련 함수들은 알람시계를 만들기 위하여 필요한 함수이고 첫 번째, 두 번째 함수는 보기 좋은 LCD시계를 만들기 위해 필요한 함수이다. 대부분이 if문이나 라이브러리의 멤버함수들로 꾸며져있기 때문에 어느정도 프로그래밍능력이 되는 사용자는 쉽게 만들 수 있다.
LCD또한 LCD.print()를 통해 한글을 제외하고 쉽게 문자를 LCD상으로 출력이 가능하기 때문에 쉽게 따라할 수 있을 것이다.

1. Setup함수 영역

시간을 구현하는 방법으로는 swRTC라이브러리를 사용하였고 사용자가 직접 초기시간을 지정해 줄 수 있다. 
아래 부분이 시간과 날짜를 지정해주는 rtc라이브러리의 멤버함수이다. setTime()함수와 setDate()함수를 통해 현재 날짜와 시간을 지정해 준다.
  rtc.stopRTC();           //정지
  rtc.setTime(14,05,0);    //시간, 분, 초 초기화
  rtc.setDate(24, 8, 2014);  //일, 월, 년 초기화 
  rtc.startRTC();          //시작


2. 시간출력 영역

아래 부분은 지정된 날짜와 시간으로 부터 계속적으로 시간과 날짜를 받아와서 LCD에 출력해주는 부분이다.
getHours(), getMinutes(), getSeconds(), getMonth(), getDay()함수가 모두 시간과 날짜를 불러오는 함수이다.
여담이지만 보통 라이브러리에서 get함수와 set함수가 세트로 대개 존재하는데 get함수는 특정 값을 불러오는 함수로 많이 쓰이고, set함수는 get함수로 불러올 값들을 지정해주는 함수로 많이 쓰인다.
예를 들어 프로그래밍으로 사람을 만들기 위해 사람이라는 클래스를 생성하였는데 생성한 객체의 사람의 이름을 지정하고 싶을때는 setName(ashley)이런식으로 set함수를 써서 사람 이름을 지정할 수 있다. 그리고 ashley라고 이름을 지은 객체의 이름 ashley를 출력하고 싶을때는 getName()을 쓰면 대개 ashley라는 객체의 이름을 가져올 수 있다. 대부분의 프로그래밍 방식에서 set함수가 존재하면 그와 비슷한 get함수가 존재하니 참고해 두면 좋다.
특정값을 불러오고 싶지만 불러올 방법이 없을때는 대부분 get함수를 사용해 보면 답이 나온다.
  Set_AMPM(rtc.getHours()); 
  lcd.print(":");
  Set_lowThanTen(rtc.getMinutes());
  lcd.print(":");
  Set_lowThanTen(rtc.getSeconds());
  //날짜를 LCD에 출력
  lcd.print("[");
  Set_lowThanTen(rtc.getMonth());
  lcd.print("/");
  Set_lowThanTen(rtc.getDay());
  lcd.print("]");
  //세팅된 알람시간을 LCD에 출력
  lcd.setCursor(0,1);
  lcd.print("Alarm ");
  Set_AMPM(temp/100);
  lcd.print(":");
  Set_lowThanTen(temp%100); 


위의 코드를 읽다보면 get함수로 불러온 현재시간들을 Set_lowThanTen함수에 매개변수 값으로 넣어줬는데, Set_lowThanTen함수는 불러온 값들이 10보다 작을 경우에 앞에 0을 붙여주는 함수이다. LCD내에서 시간이 좀 더 보기 좋게 하도록 쓰이는 함수로 보면 된다.
예를 들면 오전 6시 1분을 표현하고 싶을때 AM6:1로 출력될 모습을 AM06:01로 앞에 0을 붙여서 출력하게 된다.
원리는 간단하게 10보다 작을 경우 0을 먼저 출력하고 그 다음에 출력할 시간을 표현하는 방법을 통해 구현한다.  
void Set_lowThanTen(int time) {
  if(time < 10) {
    lcd.print("0");
    lcd.print(time%10);
  }
  else
    lcd.print(time);
}


Set_AMPM함수는 오전, 오후를 표현해주는 함수로 시간이 12시간 이상일 경우에는 PM을 출력하고 12시간 전에는 AM을 출력한다.
출력한 다음에는 24시간 표현을 12시간으로 나타내기 위해 12를 빼준다.
void Set_AMPM(int hour) {
  if(hour >=12) 
    lcd.print("PM");
  else 
    lcd.print("AM");
lcd.print(hour-12, DEC); //시간 출력 }

3. 알람시간 유효성 검사 및 시간 체크 영역


checkTheAlarmClock은 지정한 알람시간이 유효한 시간인지를 검사하게 된다. 시 단위는 24보다 작고 분 단위는 60보다 작아야 success를 출력하고 두 조건 중 하나라도 불만족 할 경우에는 Failed를 출력한다.
int checkTheAlarmClock(int time) {
  if(time/100 < 24 && time %100 < 60) {
    Serial.println("Success");
    return time;
  }
  else {
    Serial.println("Failed");
    return 0;
  }  
}


CheckTheAlarmTime은 맞춰놓은 알람시간이 현재시간과 맞는지 비교하여 시와 분이 일치 할 경우 피에조 센서를 통해 알람이 울리게 한다.
void checkTheAlarmTime(int alarmHour, int alarmMinute) {
  if(alarmHour == rtc.getHours() && alarmMinute == rtc.getMinutes()) {
        analogWrite(piezo, 255);
        Serial.println("buzzzzzzzzzzzzzzzzzzz");
    }
}

4. 시리얼 통신을 통해 알람시간을 입력받는 영역


아래는 시리얼 통신으로 알람시간을 입력받는 부분으로 Serial.available()을 통해 데이터가 들어왔을 경우에만 실행된다. 
while문을 통해 입력된 알람시간을 theday라는 버퍼에 읽어 저장하고 시리얼통신으로 들어온 char형 변수를 숫자로 변환하기 위해 atoi()함수를 사용하여 알람시간을 숫자로 변환한다.
변환한 알람시간은  AM PM 형식으로 변환되고 알람시간은 temp라는 변수에 저장되어 checkTheAlarmTime()함수의 매개변수로 쓰인다.

알람시간을 입력할때에는 24시간방법으로 시분을 그대로 입력하게 된다. 
예를들어 2345를 입력하게 되면 23시 45분을 입력한 것과 같으며 0630을 입력하게 되면 6시 30분을 입력한 것과 같게 된다.
입력한 3~4자리 숫자는 /100을 하면 시부분만 따로 떼어 낼 수 있으면 %100으로 나머지를 구하면 분부분만 따로 떼어 낼 수 있다.
예를 들어 1530을 입력받으면 15시 30분을 나타내고 1530/100을 하면 15를 구해 시간을 구할 수 있다.
그 다음 1530%100을 하면 나머지 30을 구할 수 있으면 30은 분이 된다.
이 방법으로 입력된 숫자를 시간과 분으로 구분하여 사용하게 된다.
if(Serial.available()) {
    while(Serial.available()) {
      theDay[i] = Serial.read();
      i++;
    }
    day = atoi(theDay);
    if(day/100 >= 12) {
      Serial.print("PM");
      Serial.print((day/100)-12);
    }
    else {
      Serial.print("AM");
      Serial.print(day/100);
    }
    Serial.print(":");
    if(day%100 < 10)
      Serial.print("0");
    Serial.println(day%100);
    temp = checkTheAlarmClock(day);
  }

기술문서

  • 부품목록
  • 회로도
  • 브레드보드 레이아웃
  • 스케치

수박쨈

LCD, 피에조부저, 스위치, 가변저항기, 알람시계, 초중급
profileimge

인터랙 2014-11-21 20:09:37

피에조 부저에서 소리가 안나요 ㅠㅠ
다른 코드 사용해서 피에조 부저 소리나나 확인 해봤는데 그렇게 하면 나는데 여기서는 안나네요 뭐가 문제일까요?

profileimage

수박쨈 2014-11-24 10:01:54

소스 재수정하여 올렸습니다. 피에조부저의 핀번호가 8번이었는데 8번은 PWM이 아닌 디지털핀인 관계로 analogWrite()이 제대로 작동하지 않았습니다. 그래서 PWM핀 중에 남는핀인 6번으로 피에조부저의 핀번호를 수정하였습니다. analogWrite()의 값도 255에서 128로 수정하였습니다. 수정하고 다시 실행시켜 본 결과 제대로 작동하는걸 확인하였으니 피에조부저의 입출력핀을 디지털6번으로 다시 연결하고 재수정된 소스 실행시켜보세요!(피에조 부저의 소리가 시끄러워서 바꿔놓은것을 그냥 올린거 같습니다. 제보 감사해요~!!)

profileimge

인터랙 2014-11-28 12:38:28

감사합니다!!

profileimge

인터랙 2014-12-05 17:03:31

스위치 대신에 아날로그센서를 사용해서 알람을 끄려고 하는데 가능한가요? 아날로그 데이터값을 읽어서 map으로 0-255값으로 치환한 후에 데이터값이 200이하면 알람을 끄려고 코드를 짜 봤는데 잘 안되네요 ㅠㅠ

profileimage

수박쨈 2014-12-05 17:32:56

RTC의 경우 딜레이를 통해 시간을 증가시킵니다. 1초가 증가한다는 것은 소스 내부에서 Delay(1000)을 통해 1초를 체크하고 그 1초를 증가시키는 것인데 아날로그센서로 값을 받아올 경우 딜레이 때문에 제때에 원하는 값을 읽어올 수 없습니다. 예를 들어 사운드 센서로 소리의 크기를 받고 싶을 경우 나는 현재 소리를 질러 사운드센서를 통해 값을 읽어오고 싶은데 내부에서는 현재 Delay()에 걸려 소스가 더이상 진행되지 않을 경우 원하는 때에 analogRead()를 실행하지 못해 제때에 원하는 값을 읽어 올 수 없습니다. 이 문제를 해결하기 위해서는 RTC의 시간을 관리하는 흐름하나와 별도의 아날로그센서를 체크하는 흐름 하나가 필요한데(쓰레드라고 표현합니다) 현재 아두이노 자체에서는 쓰레드를 지원하지 않기 때문에 RTC와 아날로그센서를 통해 값을 읽어오는 두가지의 실행을 하기에는 어려움이 있어 보입니다. p.s 만약 loop안에 알람이 울릴 경우 별도의 loop문(while문)같은 것을 만들어서 별도로 아날로그 센서를 읽어 오게 한다면 가능 할지도 모르겠습니다만 RTC로 흐르는 시간이 whilea문을 돌 동안에는 멈춰있을 거라 봅니다.

profileimge

아듀이노 2014-12-12 21:43:54

아두이노 우노를 이용해서 만들려고 하는데요 lcd가 시리얼 lcd를 사용하려 하는데 어떻게 해야하나요??

profileimage

수박쨈 2014-12-15 13:30:49

시리얼 lcd가 정확히 어떤것을 말하시는지를 모르겠습니다. 위에 있는 lcd가 시리얼 lcd인거 같은데 다른 종류인건가요??

profileimge

아듀이노 2014-12-15 15:02:22

아두이노 우노 확장팩에 있는 LCD인데 핀이 +,-,TX,RX 4개로 되있어요ㅠㅜ 그래서 위에 사진이랑 연결자체가 다르네요

profileimage

수박쨈 2014-12-15 17:32:34

프로그램내에서 주요한 시간을 받아오는 주요한 코드는 SWrtc(RealTimeClock)이며 이것은 LCD의 모델명이나 연결과는 무관하게 작동하게 됩니다. LCD의 역할은 시간을 띄워주는 역할만 하기 때문에 LCD만 제대로 연결하시면 오류없이 작동하게 됩니다. 핀이 위에 말한 4개의 핀만 있다면 +는 5v에 -는 GND에 TX는 아두이노의 RX에 RX는 아두이노의 TX에 연결해 주면 될듯합니다.(보통 핀이 저렇게 나열돼 있을 경우 이렇게 연결합니다.) 위 프로젝트에서 사용한 LCD 경우에는 LiquidCrystal이라는 내장 라이브러리를 사용하게 되는데, 질문자님께서 말한 LCD또한 이 라이브러리를 통해 제어하는 지는 모르겠습니다. 라이브러리가 별도로 존재하는 경우에는 그 라이브러리를 받아 LCD에 띄워주는 함수를 사용해야 합니다. 위 프로젝트에서 lcd.print()라는 함수가 LCD에 지정한 값을 띄워주는 역할을 하게 되는데 이런 역할을 하는 함수를 찾아 lcd.print()함수를 지우고 사용하면 됩니다. 이때 ()안에 들어가 있는 변수값은 그대로 옮겨서 사용하시면 됩니다. 별도의 라이브러리가 있거나 가지고 있는 모델에 대한 정보가 있는 사이트를 적어주시면 한번 보고 설명이 가능하면 간단하게 설명만 해드리겠습니다.

profileimge

아듀이노 2014-12-15 17:54:40

void setup() {             
      
 softSerial.begin(9600);      
 Serial.begin(9600);  
 softSerial .write("$GO 2 16\r\n"); // lcd 크기지정
 softSerial .write("$CLEAR\r\n"); //lcd화면 초기화

  rtc.stopRTC();           //정지
  rtc.setTime(14,05,0);    //시간, 분, 초 초기화
  rtc.setDate(24, 8, 2014);  //일, 월, 년 초기화
  rtc.startRTC();          //시작
 
  pinMode(piezo, OUTPUT);
  pinMode(switchPin, INPUT_PULLUP);

}

이렇게 셋업함수를 작성 했구요 lcd에 'PM : : [  /  ] 이렇게 틀은 출력이 되는데 그안에 시간이 나오지를 않네요
swrtc 라이브러리 사용했구요....왜이렇죠ㅜㅜ

profileimge

코코아두이노 2014-12-15 17:55:21

#include <core_build_options.h>
이게 어떤 곳에 쓰이는 라이브러리인가요? 나머지 라이브러리는 다운 받았는데 이 라이브러리만 못 찾고
헤매고 있어요ㅠㅠ 이 라이브러리의 쓰이는 용도 좀 알려주세요

profileimage

수박쨈 2014-12-16 10:08:39

core_build_options.h는 새로운 라이브러리가 아닌 SWrtc안에 들어있는 헤더파일로 real time clock을 사용하는데 쓰이는 라이브러리 입니다. libraries에서 SWrtc에 보시면 core_build_options.h를 보실 수 있습니다.

profileimage

수박쨈 2014-12-16 10:14:48

시간 출력은 Setup()에서 하는것이 아닌 loop()에서 출력해 주어야 합니다. rtc.stopRTC(); //정지 rtc.setTime(14,05,0); //시간, 분, 초 초기화 rtc.setDate(24, 8, 2014); //일, 월, 년 초기화 rtc.startRTC(); //시작 이 부분은 시간을 초기화 하는 함수이고 rtc.startRTC();를 하는 순간부터 RTC는 작동하게 됩니다. 시간을 출력하는 부분은 loop에서 rtc.getHours()나 rtc.getMinutes(), rtc.getSeconds()를 통해 시간, 분, 초를 불러오게 됩니다.

profileimge

코코아두이노 2014-12-17 13:13:00

void Set_AMPM(int hour) {

  if(hour >=12)

  softSerial.write("$PRINT PM \r");

  else

   softSerial.write("$PRINT AM \r");

  softSerial.print(hour%12, DEC);  //시간 출력

}

이 코드에서  DEC가 의미하는 게 무엇인가요? 아무리 해도 LCD에 시간이 출력되지 않습니다ㅠㅠ
나머지 글자는 뜨는데 시간만 출력이 안 되네요 무엇이 문제일까요... 빠른 답변 부탁드립니다...

profileimage

수박쨈 2014-12-17 13:19:16

DEC은 DECIMAL을 줄인 것으로 출력할 숫자를 10진법으로 나타내겠다는 것입니다. DEC만 외에도 BIN, HEX, OCT정도가 들어갈 수 있으며 BIN는 BINARY로 2진법으로 표현 HEX는 HEXADECIMAL로 16진법, OCT는 OCTAL로 8진법으로 표현하겠다는 것입니다. softSerial이 무엇을 의미하는지는 모르겠습니다.한번 DEC을 지우고 ()안에 시간 변수 하나만 넣고 출력해 보시기 바랍니다.

profileimge

코코아두이노 2014-12-17 13:33:36

저희는 softSerial(LCD 용)과 Serial(시리얼 모니터 용)
이렇게 두 개로 나누어 사용하고 있습니다.
DEC를 지우고 어떤 시간 변수를 넣어야 하나요?
지금 0 밖에 출력이 되지 않고 있습니다 ㅠㅠ
시간은 돌아가는 것 같은데 rtc의 문제일까요..?

profileimge

코코아두이노 2014-12-17 14:02:41

귀찮게 해서 죄송한데 혹시 이것보다 좀 더 빠르게 연락 드릴 수 있는 방법이 없을까요...?

profileimage

수박쨈 2014-12-17 14:16:53

시리얼 모니터에서도 0 밖에 출력이 되지 않는건가요?? #include #include swRTC rtc; //swRTC 객체 선언 void setup() { rtc.stopRTC(); //정지 rtc.setTime(9,48,10); //시간, 분, 초 초기화 rtc.setDate(11,8,2014); //일, 월, 년도 초기화 rtc.startRTC(); //시작 Serial.begin(9600); //시리얼 포트 초기화 } void loop() { Serial.print(rtc.getHours()); //시간 출력 Serial.print(":"); Serial.print(rtc.getMinutes()); //분 출력 Serial.print(":"); Serial.println(rtc.getSeconds()); //초 출력 Serial.print(rtc.getDay(), DEC); //일 출력 Serial.print("/"); Serial.print(rtc.getMonth(), DEC); //월 출력 Serial.print("/"); Serial.println(rtc.getYear(), DEC); //년도 출력 delay(1000); } 위의 소스를 그냥 아두이노에 업로드 시켜서 시리얼모니터에서 제대로 뜨나 돌려보세요.

profileimage

수박쨈 2014-12-17 14:23:16

가입하실때 작성하신 메일주소로 메일 보내드렸어요. 확인해 보세요~~

profileimge

신옥 2015-01-11 22:02:39

아.. 컴파일 에러도 안났고... 회로도 위와 같이 한 것 같은데...

왜 LCD 불만 켜지고 안에 시간이 나오지 않을까요..ㅠ

profileimage

수박쨈 2015-01-12 09:34:23

시간에 관련된 숫자만 안나오고 괄호 표시나 ':' 이런 기호같은것은 LCD에 표시되는 건가요?

profileimge

쇼나 2015-01-13 17:29:40

위에 소스 그대로복사해서 코딩했는데 이렇게 오류가 납니다.
어떻게 해야할까요?


sketch_jan13b:15: error: 'swRTC' does not name a type
sketch_jan13b.ino: In function 'void checkTheAlarmTime(int, int)':
sketch_jan13b:55: error: 'rtc' was not declared in this scope
sketch_jan13b.ino: In function 'void setup()':
sketch_jan13b:65: error: 'rtc' was not declared in this scope
sketch_jan13b.ino: In function 'void loop()':
sketch_jan13b:81: error: 'rtc' was not declared in this scope

profileimage

수박쨈 2015-01-14 08:26:06

아두이노IDE가 설치된 디렉토리에 가서 libraries폴더에 들어가신 다음에 swRTC폴더가 존재하는지 확인해보세요!. 위 에러는 swRTC라이브러리를 찾지못해 생기는 에러인거 같습니다. 라이브러리 폴더에 swRTC라이브러리폴더가 존재하는지, 소스코드를 작성할 때 상단부분에 swRTC.h를 include시켰는지 확인해보세요.

profileimge

쇼나 2015-01-14 12:44:13

감사합니다ㅠㅠ
근데 말씀하신데로 찾아봤더니 swRTC라이브러리폴더가 없더라구요, 그래서 다운을 받으려고 찾아봤는데 못찾았습니다. 여기 같은 페이지에 swRTC다운로드가 있어서 클릭하였는데 삭제되었다고 나오구요. 어디서 다운해야 할까요?
혹시 편하시다면 메일로 연락주셔도 감사하겠습니다.

profileimage

수박쨈 2015-01-15 09:41:25

가입하실때 작성하신 메일주소로 보내드렸어요! 확인해보세요~

profileimge

쇼나 2015-01-15 10:34:24

감사합니다!! 좋은 하루되세요 ㅎㅎㅎ

profileimge

아두이노 2015-01-15 11:30:44

상세하게 잘 올려주셔서 회로도에 부저 핀번호 착각한것 빼고는 잘 따라할수있었습니다.
제가 부저소리 말고 노래가 나올수있게 아두이노 쉴드를 이용하려고 하는데 그대로 붙이기면 하면 됩니까?
어떻게 해야할지 알려주실수 있는지...? 

profileimage

수박쨈 2015-01-15 12:11:33

부저소리가 아닌 노래소리를 나오게 하려면 일단 프로그램의 흐름에 대해 알아야 합니다. swRTC의 경우에는 아두이노 스케치에서 작성한 프로그램이 반복하는 타이밍을 1초로 잡아서 한번 loop문을 돌게되면 +1초 또 한번 돌게되면 +1초 이런식으로 시간이 증가하게 되어 있으며 위 프로그램에서도 delay(1000)을 주어 1초에 한번씩 프로그램이 반복할 수 있도록 작성되어 있습니다. 이 때 부저가 아닌 노래소리를 나오게 하려면 노래소리에 의해 이 routine이 끊기지 않아야 하는데 노래재생 때문에 지연시간이 1초 이상으로 늘어나게 된다면 시간계산에 오차가 생기게 됩니다. 예를 들어 노래소리를 재생하는 함수가 sing()이라고 하고 재생하려는 노래의 길이가 10초라 할 때, 알람이 울릴 시간이 되어 sing()이라는 함수를 불러 원하는 노래를 재생할 때 노래의 길이가 10초이기 때문에 10초동안 프로그램은 sing()이라는 함수에 머물러 노래를 재생하게 됩니다. 이렇게 되면 1초에 한번 돌아야할 프로그램이 10초동안 한번을 돌지 못하게 되어 시간계산 기능을 제대로 수행하지 못하게 됩니다. 이런 기능을 해결하려면 쓰레드(Thread)라는 기능이 필요한데 스케치에서는 기본적으로 Thread를 지원해주지 않습니다. 쓰레드라는 기능을 간단히 설명하면 프로그램 하나에서 독립적인 loop()문 여러개가 동시에 각자의 기능을 수행하는 그런 흐름을 말합니다.

profileimage

수박쨈 2015-01-15 12:16:50

저희도 노래를 재생하는 mp3쉴드나, 악기쉴드가 존재하지만 아직까지는 쉴드 프로그램에 대해 자세히 알아보지 못했기 때문에 제가 위에 작성한 댓글이 틀릴 수도 있습니다. 하지만 일반적으로 한번 아날로그 값을 주면 다음부터는 명령값을 주지 않아도 계속 울리게 되는 피에조와 달리 mp3노래는 계속 명령문을 통해 반복 실행해서 노래를 재생해야 하기 때문에 위 방식으로는 어렵다고 생각합니다. 차후에 시간이 될 경우 노래소리를 재생하는 알람시계에 대해 구상해보겠습니다~!

profileimge

아두이노 2015-01-16 09:06:24

아하 감사합니다 !ㅎㅎㅎ

profileimge

한영우 2015-03-03 14:20:45

swRTC라이브러리폴더가 없는데 메일로 받을 수 있을까요

profileimge

한영우 2015-03-03 15:35:05

In file included from CLOCK.ino:10:0: C:\Program Files (x86)\Arduino\libraries\swRTC/swRTC.h:524:6: error: prototype for 'byte swRTC::setClockWithTimestamp(long unsigned int, int)' does not match any in class 'swRTC' byte swRTC::setClockWithTimestamp(unsigned long timeT, int yearRef) { ^ C:\Users\HanYoungwoo\Documents\Arduino\libraries\swRTC/swRTC.h:92:11: error: candidate is: boolean swRTC::setClockWithTimestamp(long unsigned int, int) boolean setClockWithTimestamp(unsigned long timeT, int yearT = 0); 상기와 같은 에러 발생은 어찌 해결하나요

profileimge

Gearhead 2015-04-30 14:09:41

한영우님과 동일한 에러발생하였는데 구글링해도 답이 없더라구요.
소뒷걸음질 치면서 버그를 잡았는데요. swRTC.h 파일에서
boolean setClockWithTimestamp(unsigned long timeT, int yearT = 0);을 찾아서 (제 파일은 88번째라인)
boolean을 byte로 바꾸니 되네요.

profileimge

최훈서 2015-09-10 23:38:52

swRTC라이브러리 폴더 보내주시면 감사하겠습니다 ㅠ hunseo11@gmail.com

profileimge

안송학 2015-11-09 10:46:06

아두이노 초보입니다. 컴파일에서 에러가 나네요..흑흑 swTRC라이브러리 좀 보내주세요.. 혹시 모르니 core_build_options.h 도 보내주세요.

profileimge

황대은 2015-11-27 19:11:51

swRTC라이브러리 폴더좀 보내주세요 eodms789789@naver.com

profileimge

황대은 2015-11-27 19:20:53

In file included from C:\Users\USER\Desktop\sketch_nov27a\sketch_nov27a\sketch_nov27a\sketch_nov27a\sketch_nov27a.ino:3:0:

C:\Program Files (x86)\Arduino\libraries\swRTC/core_build_options.h:152:0: warning: "INITIALIZE_ANALOG_TO_DIGITAL_CONVERTER" redefined [enabled by default]

#define INITIALIZE_ANALOG_TO_DIGITAL_CONVERTER 0

^

C:\Program Files (x86)\Arduino\libraries\swRTC/core_build_options.h:32:0: note: this is the location of the previous definition

#define INITIALIZE_ANALOG_TO_DIGITAL_CONVERTER 1

^

In file included from C:\Users\USER\Desktop\sketch_nov27a\sketch_nov27a\sketch_nov27a\sketch_nov27a\sketch_nov27a.ino:4:0:

C:\Program Files (x86)\Arduino\libraries\swRTC/swRTC.h:524:6: error: prototype for 'byte swRTC::setClockWithTimestamp(long unsigned int, int)' does not match any in class 'swRTC'

byte swRTC::setClockWithTimestamp(unsigned long timeT, int yearRef) {

^

C:\Program Files (x86)\Arduino\libraries\swRTC/swRTC.h:92:11: error: candidate is: boolean swRTC::setClockWithTimestamp(long unsigned int, int)

boolean setClockWithTimestamp(unsigned long timeT, int yearT = 0);

^

exit status 1
컴파일 오류 발생.


라고 오류가 뜨면서 컴파일이 안되는데 문제가 뭔가요?

profileimge

김우원 2016-02-14 22:56:06

가변저항기는 몇 ohm인가요?

profileimge

정희진 2016-05-31 15:21:59

안녕하세요 수박쨈님! 제가 이 프로그램을 Atmega328 아두이노보드로 구현하려고 하는데
보드 안에 피에조, VR가변저항, 스위치가 다 들어가있는데 올리신 회로도에는 브레드보드에 다 따로 구현하셔서
어떻게 연결해야하는지 잘 모르겠어요ㅠㅠ 혹시 도움을 주실 수 있다면 메일로 연락 부탁드려요!
o94_11_16@naver.com 입니다

profileimge

LJY 2016-09-19 17:22:09

안녕하세요 ㅎㅎ 제가 아두이노 프로젝트를 학교에서 진행하는데 소스구현도 되고 시리얼 모니터에서도 시간 설정이 된다고 하는데 LCD에 불이 안 들어오네요 ㅠㅠ 하드웨어 상의 문제도 아닌것 같은데(확실하진 않아요) 어떻게 해야할까요? 도움 주실수 있으시다면 suncol7685@naver.com 으로 연락 부탁드립니다!

profileimage

수박쨈 2016-09-20 10:40:09

아 메일로는 직접적인 도움을 드리기는 힘들고 LCD에 불이 안들어온다면 회로 연결에서의 문제거나 아두이노 코드상에서 LCD핀을 설정할때 연결된 핀번호와 맞게 설정했는지 확인해보세요

profileimage

수박쨈 2016-09-20 10:40:34

그리고 가변저항을 통해 LCD의 밝기를 조절할 수 있습니다.

profileimge

LJY 2016-09-20 13:23:47

그렇군요 감사합니다 ^^

profileimge

윤동빈 2016-11-01 18:49:25

좋은 프로젝트네요ㅎ

profileimge

김주성 2016-11-08 05:17:17

core_build_options.h:152:0: warning: "INITIALIZE_ANALOG_TO_DIGITAL_CONVERTER" redefined 이런 에러가 뜨는데
라이브러리 문제 인거 같은데 .... 해결방법이 없네요 버젼 문제 인건지... swRTC 보내주실수 있을까요?
glqgkq34@naver.com 입니다

profileimge

김용남 2016-11-24 20:46:21

헤더파일 관련 에러가 자꾸 뜨는데요 다른곳에서 swRTC 받아서 해도 안되구요 ㅠㅠ
혹시 선생님께서 쓰신 헤더파일 보내주실 수 있나요?? dydska922@naver.com 입니다. 부탁드립니다 ㅠㅠ

profileimge

김천수 2016-11-29 14:17:45

피에조 부저 대신에 피에조 소자 ( Piezo Element ) 를 사용 할 수 있나요? 사용 할 수 있다면 어떻게 사용하나요?? ㅠ

profileimge

김천수 2016-11-29 14:17:54

피에조 부저 대신에 피에조 소자 ( Piezo Element ) 를 사용 할 수 있나요? 사용 할 수 있다면 어떻게 사용하나요?? ㅠ

profileimge

오윤화 2016-11-30 14:16:45

swRTC 라이브러리좀 보내주시면 안될까요? 다른곳에서 받아서 하니깐 에러나네요ㅠㅠ
dhdbsghk0522@naver.com

profileimge

오윤화 2016-11-30 14:16:48

swRTC 라이브러리좀 보내주시면 안될까요? 다른곳에서 받아서 하니깐 에러나네요ㅠㅠ
dhdbsghk0522@naver.com