산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

다양한 얼굴의 LCD 알람 시계

구성품 및 소모품

Arduino UNO
포함된 PCB를 사용하는 경우 ATmega328 DIL 마이크로프로세서, 16MHz 크리스탈, 2x22pf 커패시터, 7805 레귤레이터, 100uF 16V 커패시터, 3 x 0.1uF 커패시터 및 1uF 커패시터.
× 1
저항 10k 옴
× 4
스루 홀 저항기, 470옴
× 1
Adafruit Standard LCD - 파란색 바탕에 16x2 흰색
× 1
부저
× 1
커패시터 10μF
× 1
실시간 시계(RTC)
DS1302 RTC
× 1
32.768kHz 수정
× 1
코인 셀 배터리 CR2032
+ 홀더. PCB를 사용하는 경우 CR1220 배터리 및 홀더 사용
× 1
틸트 스위치, 캡슐화
수은 스위치
× 1
트리머 전위차계, 10kohm
× 1

필요한 도구 및 기계

3D 프린터(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

10개의 시계 페이스가 있는 새 버전을 찾을 수 있습니다. 여기 .


뭘 만들까 찾다가 LCD 1602 시계로 결정했습니다. 웹을 정독하고 다양한 구현을 찾은 후, 이 모든 것을 통합하는 하나의 시계를 만들지 않겠습니까?

시계 기능

<울>
  • 8가지 디스플레이 스타일
  • 시간, 현재 날짜, 생년월일 및 알람 설정
  • 알람을 끄는 수은 스위치
  • 역광 제어
  • DHT21 온도 및 습도 센서
  • 브레드보드 버전

    실제 전자 제품은 상당히 간단합니다.

    배선이 완료되면 스케치를 Arduino IDE에 로드하고 Arduino UNO에 업로드합니다. (DHT21이 D9에 연결되어 있는 것은 표시되지 않음)

    시계 사용

    시계에는 SETUP, INCREMENT, DECREMENT 및 TILT 스위치의 세 가지 버튼이 있습니다.

    백라이트가 꺼져 있을 때 아무 버튼이나 누르면 백라이트가 켜집니다. 백라이트가 켜져 있는 동안 버튼을 누르지 않으면 5초 후에 자체적으로 꺼집니다. 백라이트가 켜져 있는 동안 버튼은 다음 작업을 수행합니다.

    설정 - SETUP 화면을 불러옵니다. 오른쪽 꺾쇠 괄호 문자는 커서입니다. INCREMENT 또는 DECREMENT 버튼을 누르면 커서가 있는 값이 각각 증가하거나 감소합니다. SETUP 버튼을 다시 누르면 커서가 시, 분, 일, 월, 년, 생년월일, 생년월일, 생년월일, 알람 시간, 알람 분 사이를 순환하고 다시 시계 모드로 돌아갑니다.

    증가 - SETUP 화면이 아닐 때 이 버튼은 다양한 시계 스타일 사이를 전환합니다.

    감소 - SETUP 화면이 아닐 때 이 버튼은 알람을 켜거나 끕니다.

    틸트 스위치 - 알람이 울릴 때 시계를 기울이거나 아무 버튼이나 누르면 알람이 꺼집니다.

    완성된 시계 만들기

    브레드보드에서 완전히 완성된 시계로 빌드하려면 인쇄 회로 기판과 몇 가지 추가 구성 요소가 필요합니다. PCB를 상업적으로 만들고 싶으시거나 저처럼 직접 만드실 분들을 위해 Eagle 파일을 첨부합니다. 토너 방식을 사용했습니다.

    참고:LCD 1602 디스플레이는 직각 핀 헤더를 사용하여 메인 PCB에 연결되어 있기 때문에 이미 함께 납땜되어 있는 경우 보드와 디스플레이를 케이스에 삽입하는 것이 매우 어려울 수 있습니다. 스루 홀 도금이 있는 양면 보드를 사용하면 디스플레이를 보드에 제자리에 납땜할 수 있습니다.

    워크샵 주변에 있던 부품을 사용하여 Arduino UNO는 ATMega328 DIL 칩, 16MHz 크리스탈 및 2개의 22pf 세라믹 커패시터로 교체되었습니다. 5V 레귤레이터는 7805 TO-220 유형과 평활화를 위한 100uF 16V 커패시터입니다. RTC는 32.768KHz 시계 수정이 있는 DS1302입니다. 스피커는 10uF 16V 커패시터로 DC 절연된 수동 부저입니다. 0.1uF 및 1uF 커패시터는 모놀리식 세라믹 커패시터(5mm 구멍 간격)입니다. 저항은 5% 1/8 와트이거나 원하는 경우 1/4 와트를 사용할 수 있습니다. 수은 스위치는 어떤 크기도 될 수 있습니다. 내 것은 5mm 직경이지만 더 작은 것으로 충분할 것입니다. 보드 뒷면에 장착된 3개의 촉각 버튼은 6mmx6mm이고 샤프트는 13mm입니다.

    케이스는 지지대가 없는 0.2mm 레이어 높이를 사용하여 3D 인쇄됩니다. 2.5mm 드릴로 PCB 마운트 구멍을 뚫고 3mm 탭을 사용하여 나사산을 만듭니다. M3 6mm 나사를 사용하여 보드를 제자리에 고정합니다. 또한 보드를 고정할 때 버튼이 케이스에 달라붙는 것을 방지하기 위해 필요한 조정을 위해 PCB에 있는 4개의 마운트 구멍을 4mm로 뚫었습니다.

    크레딧

    이 시계는 수년 동안 다양한 제조사에서 만든 여러 시계를 매시업한 것입니다.

    이 시계의 기본은 알람 기능이 있는 Arduino 디지털 시계(맞춤형 PCB)입니다. 4장이 아닌 2장으로 인쇄되도록 케이스를 수정했습니다.

    <울>
  • Michalis Vasilakis의 표준 화면 디자인
  • Arduino World의 Dual Thick 글꼴
  • Arduino Forum의 이중 경사 글꼴
  • Carrie Sundra의 Dual Trek 글꼴
  • Arduino World의 Dual Thin 글꼴
  • LAGSILVA의 단어 개념
  • John Bradnam의 바이오리듬 시계
  • ARDUinoautoMOTIVE의 날씨 시계
  • 업데이트

    29/06/20

    - WORD 시계의 철자 오류 수정
    - 백라이트를 제어하기 위해 #defines 추가
    - 백라이트 시간 제한을 5초에서 10초로 증가

    23/11/20

    - 생년월일 설정 및 EEPROM 저장 추가
    - 바이오리듬 시계 페이스 추가
    - 설정 화면 코딩 정리

    생년월일을 기준으로 바이오리듬이 우리 삶의 기복을 결정할 수 있다고 가정합니다. 바이오리듬은 23일의 신체 주기, 28일의 감정 주기 및 33일의 지적 주기의 세 가지 주기로 구성됩니다. 바이오리듬 시계는 각 상태를 막대로 표시합니다.

    막대는 바이오리듬이 양의 주기(상단 막대) 또는 음의 주기(하단 막대)에 있음을 나타냅니다. 막대의 길이는 주기의 양수 또는 음수를 나타냅니다.

    06/12/20

    - DHT21 지원 추가
    - 온도계 및 습도 시계 페이스 추가

    새로운 날씨 시계 페이스가 추가되었습니다. 케이스 뒷면에 추가된 DHT21 온습도 센서를 읽습니다. DHT21 센서에 대한 3핀 커넥터를 포함하도록 PCB가 업데이트되었습니다.


    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • DigitalClockAlarmV7.ino
  • DigitalClockAlarmV7.inoC/C++
    /* 1602 LCD 알람 시계 * John Bradnam ([email protected]) * * 디스플레이 16x2:설정:알람 설정 * +----------------+ +- ---------------+ +----------------+ * |HH:MM:SS | 헉:MM| |>하하:>MM | | 알람 설정 | * |DD/MM/YY | 알람| |>DD />MM />YYYY | |>하하:>MM | * +----------------+ +----------------+ +------------ ----+ * * 2020/06/25 * - Michalis Vasilakis의 시계를 코드 기반으로 사용(https://www.instructables.com/id/Arduino-Digital-Clock-With-Alarm-Function-custom-P/ ) * - 하드웨어에 맞게 수정됨 - DS1302 RTC 및 LCD 백라이트 * - 다양한 디스플레이 스타일에 대한 지원 추가 * - Michalis Vasilakis의 표준 화면 디자인 * - Arduino World의 Dual Thick 글꼴 (https://www.hackster.io/thearduinoworld/ arduino-digital-clock-version-1-b1a328) * - Arduino Forum의 Dual Bevelled 글꼴 (https://forum.arduino.cc/index.php/topic,8882.0.html) * - Carrie Sundra의 Dual Trek 글꼴( https://www.alpenglowindustries.com/blog/the-big-numbers-go-marching-2x2) * - Arduino World의 Dual Thin 글꼴 (https://www.hackster.io/thearduinoworld/arduino-digital-clock) -version-2-5bab65) * - LAGSILVA의 단어 개념 (https://www.hackster.io/lagsilva/text-clock-bilingual-en-pt-with-arduino-881a6e) * 29/06/20 * - WORD 시계의 철자 오류 수정 * - 계속에 #defines 추가 rol 백라이트 * - 백라이트 타임아웃이 5초에서 10초로 증가 * 22/11/20 * - 생년월일 설정 및 EEPROM 저장 추가 * - 바이오리듬 시계 페이스 추가 * - 설정 화면 코딩 정리 * xx/xx/21 * - DHT21 추가 지원 * - 온도계 및 습도 시계 페이스 추가 *///Libraries#include #include #include #include #include # 포함 //두 개의 두꺼운 또는 얇은 디스플레이 변형이 12시간 형식을 표시하도록 하려면 주석 해제//#define DUAL_THICK_12HR//#define DUAL_THIN_12HR//백라이트 제어를 위한 주석 해제//#define NO_BACKLIGHT//#define BACKLIGHT_ALWAYS_ON# BACKLIGHT_TIMEOUT 10000 정의//바이오리듬 그래프 테스트를 위한 주석 해제//#define TEST_BIO_GRAPHS#define LIGHT 2 //PD2#define LCD_D7 3 //PD3#define LCD_D6 4 //PD4#define LCD_D5 5 //PD5#define LCD_D4 6 //PD5#define LCD_D4 6 #define LCD_E 7 //PD7#define LCD_RS 8 //PB0#define BTN_SET A0 //PC0#define BTN_ADJUST A1 //PC1#define BTN_ALARM A2 //PC2#define BTN_TILT A3 //PC3#define SPEAKER 11 //PB3# DHT 정의 21 9 //PB1#define RTC_CE 10 //PB2#define RTC_IO 12 //PB4#define RTC_SCLK 13 //PB5//연결 및 상수 LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);CDS13 RTC_CE, RTC_IO, RTC_SCLK);dht DHT;char daysOfTheWeek[7][12] ={"일요일","월요일", "화요일", "수요일", "목요일", "금요일", "토요일"}; const int monthDays[12] ={ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };긴 간격 =300; int 멜로디[] ={ 600, 800, 1000,1200 };//Variablesint DD, MM, YY, H, M, S, temp, hum, set_state, adjust_state, alarm_state, AH, AM, shake_state, BY, BM, BD;intshakeTimes =0;int i =0;문자열 sDD;문자열 sMM;문자열 sYY;문자열 sH;문자열 sM;문자열 sS;문자열 sBD;문자열 sBM;문자열 sBY;문자열 aH="12";문자열 aM=" 00";문자열 sTMP;문자열 sHUM;//문자열 경보 =" ";long prevAlarmMillis =0;long prevDhtMillis =0;//부울 플래그 부울 setupScreen =false; 부울 alarmON=false; 부울 turnItOn =false; 열거형 STYLE { 표준, DUAL_THICK, DUAL_BEVEL, DUAL_TREK, DUAL_THIN, WORD, BIO, THERMO };STYLE currentStyle =STANDARD;열거 SETUP { CLOCK, TIME_HOUR, TIME_MIN, TIME_DAY, AMLOCK, TIME_YEAR_SET 설정}, AM_MONTH, TIME_YEAR_MIN, BIRTH_DAY, BIRTH_YTH_MON;boolbacklightOn =false;longbacklightTimeout =0;byte customChar[8];//--------------------- EEPROM --------- ----------------------------------#define EEPROM_AH 0 //알람 시간#define EEPROM_AM 1 //알람 분# EEPROM_AO 정의 2 //Alarm On/Off#define EEPROM_CS 3 //현재 스타일#define EEPROM_BY 4 //생년월일#define EEPROM_BM 6 //생년월일#define EEPROM_BD 7 //생일//--------- ------------ 단어 시계 ------------------------ --String units[] ={"HUNDRED", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE"};문자열 teens[] ={"TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"};문자열 10[] ={"", "", "TWENTY", "THIRTY", "FORTY", "FIFTY"};//---------------------- 모래시계 애니메이션 ----------------------------#define HOURGLASS_FRAMES 8#define HOURGLASS_CHAR 0#define FRAME_TIMEOUT 200;int nextFrame =0;long frameTimeout =B0;const 바이트 모래시계[HOURGLASS_FRAMES][8] PROGMEM ={ { B11111, B11111, B01010, B01010, B01010, B01010, B10001, B11111, B10, B10, B10, B10, { B111111, B1 { B11111, B10001, B01110, B01110, B01010, B01010, B10001, B11111 }, { B11111, B10001, B01010, B01110, B01110 , B01010, B10001, B11111}, {B11111, B10001, B01010, B01010, B01110, B01110, B10001, B11111}, {B11111, B10001, B01010, B01010, B01010, B01110, B10101, B11111}, {B11111, B10001, B01010 , B01010, B01010, B01110, B11011, B11111}, {B11111, B10001, B01010, B01010, B01010, B01010, B11111, B11111} // {B11111, B10001, B01010, B01010, B01010, B01010, B10001, B11111}};//--------------------- 알람, 시계 및 DHT 사용자 정의 문자 ------------------ ----------#define BELL_CHAR 1#define CLOCK_CHAR 2#define THERMOMETER_CHAR 3#define DROPLET_CHAR 4const 바이트 벨[8] PROGMEM ={0x4, 0xe, 0xe, 0xe, 0x1f, 0x0, 0x4};const 바이트 시계[8] PROGMEM ={0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0};const 바이트 온도계[8] PROGMEM ={0x4, 0xa, 0xa, 0xe, 0xe, 0x1f, 00x1} 바이트 방울[8] PROGMEM ={0x4, 0x4, 0xa, 0xa, 0x11, 0x11, 0x11, 0xe};#define DHT_UPDATE_INTERVAL 6000//------------------- --- BioRhythm Clock ----------------------------//사용자 지정 문자 상수(M은 MSB 또는 상단 막대 문자입니다. r, L은 LSB 또는 하단 막대 문자입니다.#define PHYSICAL_M 3#define PHYSICAL_L 4#define EMOTIONAL_M 5#define EMOTIONAL_L 6#define INTELLECTUAL_M 7#define INTELLECTUAL_L 8/--------------- ------- 두꺼운 사각형 글꼴 ----------------------------#define C0 3#define C1 4#define C2 5 #define C3 6const byte C_0[8] PROGMEM ={0x1F,0x1F,0x1F,0x00,0x00,0x00,0x00,0x00};const byte C_1[8] PROGMEM ={0x1F,0x1F,0x1F,0x0x00 0x1F,0x1F}; 상수 바이트 C_2[8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x1F}; const 바이트 C_3[8] PROGMEM ={0x00,0x00,0x0E 0x0E,0x00,0x00}; const 바이트 blockChar[11][2][3] ={ {{ 255, C0, 255}, {255, C2, 255}}, //0 {{ C0, 255, 32} , {C2, 255, C2}}, //1 {{ C0, C0, 255}, {255, C1, C2}}, //2 {{ C1, C1, 255}, {C1, C1, 255} }, //3 {{ 255, C2, 255}, {32, 32, 255}}, //4 {{ 255, C1, C1}, {C2, C2, 255}}, //5 {{ 255 , C0, C0}, {255, C1, 255}}, //6 {{ C0, C1, 255}, {32, C0, 255}}, //7 {{ 255, C1, 255}, {255 , C1, 255}}, //8 {{ 255, C1, 255}, {C2, C2, 255}}, //9 {{ 32, 32, 32}, {32, 32, 32}}, //공백};//---------------------- 두꺼운 경사 글꼴 -------------- --------------#define LT 0#define UB 1#define RT 2#define LL 3#define LB 4#define LR 5#define UMB 6#define LMB 7const byte _LT[8 ] PROGMEM ={ B00111, B01111, B11111, B11111, B11111, B11111, B11111, B11111};const 바이트 _UB0,B0,B0,B0바이트[8] PROGMEM ={ B11111, B11101, B1010 [8] PROGMEM ={ B11100, B11110, B11111, B11111, B11111, B11111, B11111, B11111};const 바이트 _LL[8] PROGMEM ={ B11111, B11111, B11 0바이트 _LB[8] PROGMEM ={ B00000, B00000, B00000, B00000, B00000, B11111, B11111, B11111}; const 바이트 _LR[8] PROGMEM ={ B11111, B1111;const 바이트 _UMB[8] PROGMEM ={ B11111, B11111, B11111, B00000, B00000, B00000, B11111, B11, B1, B11, B11111111111111111111111111111111111111111111111111 B11111}; const 바이트 bevelChar[11][2][3] ={ {{LT, UB, RT}, {LL, LB, LR} }, //0 {{UB, RT, 32}, {LB, LMB, LB}}, //1 {{UMB, UMB, RT}, {LL, LB, LB}}, //2 {{UMB , UMB, RT}, {LB, LB, LR}}, //3 {{LL, LB, LMB}, {32, 32, LMB}}, //4 {{LT, UMB, UMB}, {LB , LB, LR}}, //5 {{LT, UMB, UMB}, {LL, LB, LR}}, //6 {{UB, UB, RT}, {32, 32, LT}}, / /7 {{LT, UMB, RT}, {LL, LB, LR}}, //8 {{LT, UMB, RT}, {32, 32, LR}}, //9 {{ 32, 32, 32}, {32, 32, 32}} //공백};//------------------------- Trek 글꼴 -------- --------------------#define K0 0#define K1 1#define K2 2#define K3 3#define K4 4#define K5 5#define K6 6#define K7 7구성 바이트 K_0[8] PROGMEM ={0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00}; 상수 바이트 K_1[8] PROGMEM ={0x18,0x18,0x18,0x18,0x18,0x18,0x 0x18}; 상수 바이트 K_2[8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F}; 상수 바이트 K_3[8] PROGMEM ={0x1F,0x1F,0x03,0x03 0x1F,0x1F}; 상수 바이트 K_4[8] PROGMEM ={0x1F,0x1F,0x18,0x18,0x18,0x18,0x1F,0x1F}; 상수 바이트 K_5[8] PROGMEM ={0x1F,0x1F,0x18 0x18,0x18,0x18}; 상수 바이트 K_6[8] PROGMEM ={0x03,0x03,0x03,0x03, 0x03,0x03,0x1F,0x1F}; const 바이트 K_7[8] PROGMEM ={0x1F,0x1F,0x03,0x03,0x03,0x03,0x03,0x03};const 바이트 trekChar[11][2][2] ={ { K5, K7}, {255, K6}}, //0 {{ K0, K1}, {K2, 255}}, //1 {{ K0, K3}, {255, K2}}, //2 {{ K0, K3}, {K2, 255}}, //3 {{ K1, 255}, {K0, K1}}, //4 {{ K4, K0}, {K2, 255}}, // 5 {{ K5, K0}, {K4, 255}}, //6 {{ K0, 255}, {32, K1}}, //7 {{ 255, K3}, {K4, 255}}, / /8 {{ 255, K3}, {K2, K6}}, //9 {{ 32, 32}, {32, 32}}, //공백};//---------- ------------ 얇은 글꼴 ----------------------------#define T0 0#define T1 1 #define T2 2#define T3 3#define T4 4#define T5 5#define T6 6#define T7 7const 바이트 T_0[8] PROGMEM ={0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02} 바이트 T_1[8] PROGMEM ={0x0E,0x02,0x02,0x02,0x02,0x02,0x02,0x0E}; const 바이트 T_2[8] PROGMEM ={0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x}; 상수 바이트 T_3[8] PROGMEM ={0x0E,0x0A,0x0A,0x0A,0x0A,0x0A,0x0A,0x0E}; 상수 바이트 T_5[8] PROGMEM ={0x0A,0x0A,0x0A,0x0A,0x0x0A 0x0E}; 상수 바이트 T_4[8] PROGMEM ={0x0E,0x0A,0x0A,0x0A,0x0 A,0x0A,0x0A,0x0A}; 상수 바이트 T_6[8] PROGMEM ={0x0E,0x02,0x02,0x02,0x02,0x02,0x02,0x02}; const 바이트 T_7[8] PROGMEM ={0x10,0x1 0x18,0x18,0x1E,0x1F,0x1F};//lcd 문자 그리기 기능 const byte thinChar[11][2] ={ {T4, T5}, //0 {T0, T0}, //1 {T1, T2} , //2 {T1, T1}, //3 {T5, T6}, //4 {T2, T1}, //5 {T2, T3}, //6 {T6, T0}, //7 { T3, T3}, //8 {T3, T1}, //9 {32, 32} //공백}; //---------------------- 일반 초기화 ------------------------ ---- 무효 설정() { Serial.begin(115200); //출력/입력 설정 pinMode(BTN_SET,INPUT); 핀모드(BTN_ADJUST,INPUT); 핀모드(BTN_ALARM, 입력); 핀모드(BTN_TILT, 입력); 핀모드(스피커, 출력); 핀모드(빛, 출력); //RTC에 유효한 시간/날짜가 있는지 확인하고 00:00:00으로 설정하지 않은 경우 2018년 1월 1일. //처음 실행하거나 코인 배터리가 부족한 경우에만 실행됩니다. //setSyncProvider()는 기본적으로 5분마다 RTC.get()을 호출하여 Time 라이브러리가 //외부 RTC와 동기화되도록 합니다. setSyncProvider(rtc.get); if (timeStatus() !=timeSet) { Serial.println("기본 시간 설정"); //RTC 설정 tmElements_t tm; tm.Year =CalendarYrToTm(2020); tm.월 =06; tm.일 =26; 시간 =7; tm.분 =52; tm.초 =0; time_t t =makeTime(tm); // time_t 값을 사용하여 올바른 요일이 설정되었는지 확인합니다. if (rtc.set(t) ==0) { // 성공 setTime(t); } else { Serial.println("RTC 설정 실패!"); } } 지연(100); //EEPROM 메모리에서 알람 시간 읽기 AH =EEPROM.read(EEPROM_AH); AM =EEPROM.read(EEPROM_AM); 바이트 ao =EEPROM.read(EEPROM_AO); 알람ON =(ao !=0); 바이트 cs =EEPROM.read(EEPROM_CS); //읽은 숫자가 유효한지 확인합니다. (시:0-23 및 분:0-59) if (AH> 23) { AH =0; } if (AM> 59){ AM =0; } //EEPROM에서 생년월일 읽기 BY =(EEPROM.read(EEPROM_BY + 0) <<8) | EEPROM.read(EEPROM_BY + 1); if (BY <1900 || BY> 2099) { BY =2000; } BM =EEPROM.read(EEPROM_BM); if (BM <0 || BM> 12) { BM =1; } BD =EEPROM.read(EEPROM_BD); if (BD <0 || BD> 31) { BD =1; } //현재 스타일 설정 lcd.begin(16,2); 현재 스타일 =(cs> (uint8_t)열) ? 표준:(스타일)cs; 스위치(currentStyle) { 케이스 STANDARD:lcdStandardSetup(); 부서지다; 케이스 DUAL_THICK:lcdDualThickSetup(); 부서지다; 케이스 DUAL_BEVEL:lcdDualBevelSetup(); 부서지다; 케이스 DUAL_TREK:lcdDualTrekSetup(); 부서지다; 케이스 DUAL_THIN:lcdDualThinSetup(); 부서지다; 케이스 워드:lcdWordSetup(); 부서지다; 케이스 BIO:lcdBioRhythmSetup(); 부서지다; 케이스 THERMO:lcdThermometerSetup(); 부서지다; } #ifdef BACKLIGHT_ALWAYS_ON switchBacklight(true);#endif}//---------------------- 메인 프로그램 루프 ----------- ------------------ 무효 루프() { readBtns(); //버튼 읽기 getTimeDate(); //RTC에서 시간과 날짜 읽기 getTempHum(); //온도와 습도 읽기 if (!setupScreen) { lcdPrint(); //현재 시간/날짜/알람을 정상적으로 LCD에 출력 if (alarmON) { callAlarm(); // 알람이 켜져 있는지 확인합니다. if (turnItOn) { switchBacklight(true); } } //Serial.println("backlightTimeout=" + String(backlightTimeout) + ", millis()=" + String(millis()) + ",backlightOn=" + String(backlightOn));#ifdef BACKLIGHT_TIMEOUT if( backlightOn &&(millis()>backlightTimeout)) { switchBacklight(false); }#endif } else { timeSetup(); //버튼 세트를 누르면 시간 설정 함수를 호출합니다. switchBacklight(true); }}//---------------------------------------------- ----//읽기 버튼 statevoid readBtns(){ set_state =digitalRead(BTN_SET); 조정 상태 =디지털 읽기(BTN_ADJUST); 알람 상태 =디지털 읽기(BTN_ALARM); if (!backlightOn &&!setupScreen) { if (set_state ==LOW || adjust_state ==LOW || alarm_state ==LOW) { //백라이트 켜기 switchBacklight(true); //버튼을 1/2초 이상 누르고 있어야 함 delay(500); } } else { if(!setupScreen) { if (alarm_state ==LOW) { alarmON =!alarmON; EEPROM.write(EEPROM_AO, (alarmON) ? 1 :0); 지연(500); 스위치 백라이트(참); } else if (adjust_state ==LOW) { currentStyle =(currentStyle ==THERMO) ? 표준 :(스타일)((int)currentStyle + 1); EEPROM.write(EEPROM_CS, (바이트)currentStyle); 스위치(currentStyle) { 케이스 STANDARD:lcdStandardSetup(); 부서지다; 케이스 DUAL_THICK:lcdDualThickSetup(); 부서지다; 케이스 DUAL_BEVEL:lcdDualBevelSetup(); 부서지다; 케이스 DUAL_TREK:lcdDualTrekSetup(); 부서지다; 케이스 DUAL_THIN:lcdDualThinSetup(); 부서지다; 케이스 워드:lcdWordSetup(); 부서지다; 케이스 BIO:lcdBioRhythmSetup(); 부서지다; 케이스 THERMO:lcdThermometerSetup(); 부서지다; } lcd.clear(); LCD 인쇄(); 지연(500); 스위치 백라이트(참); } } if (set_state ==LOW) { setupMode =(setupMode ==ALARM_MIN) ? 클럭 :(SETUP)((int)setupMode + 1); if( setupMode !=시계 ) { setupScreen =true; if (setupMode ==TIME_HOUR) { lcd.clear(); lcd.setCursor(0,0); lcd.print("------SET------"); lcd.setCursor(0,1); lcd.print("-시간과 날짜-"); 지연(2000); lcd.clear(); } } else { lcd.clear(); //RTC 설정 tmElements_t tm; tm.Year =달력YrToTm(YY); tm.월 =MM; tm.일 =DD; 시간 =H; tm.분 =M; tm.초 =0; time_t t =makeTime(tm); // time_t 값을 사용하여 올바른 요일이 설정되었는지 확인합니다. if (rtc.set(t) ==0) { // 성공 setTime(t); } else { Serial.println("RTC 설정 실패!"); } //rtc.adjust(날짜시간(YY, MM, DD, H, M, 0)); //시간과 날짜를 RTC IC에 저장 EEPROM.write(EEPROM_AH, AH); //알람 시간을 EEPROM에 저장 EEPROM.write(EEPROM_AM, AM); //발생된 알람을 EEPROM에 저장 EEPROM.write(EEPROM_BY + 0, BY>> 8); //생년을 EEPROM에 저장 EEPROM.write(EEPROM_BY + 1, BY &0xFF); //생년을 EEPROM에 저장 EEPROM.write(EEPROM_BM, BM); //생년월일을 EEPROM에 저장 EEPROM.write(EEPROM_BD, BD); //생일을 EEPROM에 저장 lcd.print("Saving...."); 지연(2000); lcd.clear(); 설정 화면 =거짓; 설정 모드 =시계; 스위치 백라이트(참); } 지연(500); } }}//--------------------------------------------- -----//rtc에서 시간과 날짜 읽기 icvoid getTimeDate(){ if (!setupScreen) { //DateTime now =rtc.now(); time_t t =지금(); DD =일(t); MM =월(t); YY =연도(t); H =시간(t); M =분(t); S =초(t); } //몇 가지 수정... sDD =((DD <10) ? "0" :"") + String(DD); sMM =((MM <10) ? "0" :"") + 문자열(MM); sYY =문자열(YY-2000); sH =((H <10) ? "0" :"") + 문자열(H); sM =((M <10) ? "0" :"") + 문자열(M); sS =((S <10) ? "0" :"") + 문자열(S); sBD =((BD <10) ? "0" :"") + 문자열(BD); sBM =((BM <10) ? "0" :"") + 문자열(BM); sBY =문자열(BY); aH =((AH <10) ? "0" :"") + 문자열(AH); 오전 =((AM <10) ? "0" :"") + 문자열(AM);}//------------------------- -------------------------//DHT에서 6초마다 온도와 습도를 읽습니다. sensorvoid getTempHum(){ unsigned long currentMillis =millis(); if (currentMillis - prevDhtMillis>=DHT_UPDATE_INTERVAL) { int chk =DHT.read21(DHT21); prevDhtMillis =현재Millis; 험 =min(round(DHT.humidity),99); 온도 =min(round(DHT.온도),99); sTMP =((온도> 9) ? "" :" ") + 문자열(온도); sHUM =((hum> 9) ? "" :" ") + String(hum); }}//---------------------------------------------- ----//backlight를 켜거나 끕니다. 무효 switchBacklight(bool on){ #ifdef NO_BACKLIGHT digitalWrite(LIGHT, LOW); 백라이트 켜짐 =참; // 소프트웨어가 켜져 있다고 생각하는 것은 #else가 아닌데도 #ifdef BACKLIGHT_ALWAYS_ON digitalWrite(LIGHT, HIGH); 백라이트 켜짐 =참; #else digitalWrite(LIGHT, (on) ? HIGH :LOW); 백라이트 켜짐 =켜짐; 백라이트 타임아웃 =밀리() + BACKLIGHT_TIMEOUT; #endif #endif}//------------------------------------------- -------//값을 displayvoid lcdPrint(){ switch (currentStyle) { case STANDARD:lcdStandardLayout(); 부서지다; 케이스 DUAL_THICK:lcdDualThickLayout(); 부서지다; 케이스 DUAL_BEVEL:lcdDualBevelLayout(); 부서지다; 케이스 DUAL_TREK:lcdDualTrekLayout(); 부서지다; 케이스 DUAL_THIN:lcdDualThinLayout(); 부서지다; 케이스 워드:lcdWordLayout(); 부서지다; 케이스 BIO:lcdBioRhythmLayout(); 부서지다; 케이스 THERMO:lcdThermometerLayout(); 부서지다; }}//---------------------------------------------- -- 표준 레이아웃 ------------------------------------------- ----------------------- 무효 lcdStandardSetup(){}무효 lcdStandardLayout(){ 문자열 line1 =sH+":"+sM+":"+sS+" | "+aH+":"+aM; 문자열 line2 =sDD+"/"+sMM+"/"+sYY +" | " + ((alarmON &&(S &0x01)) ? "ALARM" :" "); lcd.setCursor(0,0); //첫 번째 행 lcd.print(line1); lcd.setCursor(0,1); //두 번째 행 lcd.print(line2); }//프로그램 memoryvoid createCharP(byte slot, byte* p){ for (int i =0; i <8; i++) { customChar[i] =pgm_read_byte(p++); } lcd.createChar(slot, customChar);}//------------------------------------ ----------- 이중 두꺼운 레이아웃 ------------------------------------ ---------------------------------- 무효 lcdDualThickSetup(){ createCharP(C0, C_0); createCharP(C1, C_1); createCharP(C2, C_2); createCharP(C3, C_3); createCharP(BELL_CHAR, 벨);} 무효 lcdDualThickLayout(){#ifdef DUAL_THICK_12HR int h =(H>=12) ? H - 12 :H; if (h ==0) { h =12; } lcdDualThickPrintNumber(8, M, 참); lcdDualThickPrintNumber(0, h, 거짓); lcd.setCursor(15,0); lcd.print((H>=12) ? "p" :"a"); lcd.setCursor(15,1); lcd.print("m"); #else lcdDualThickPrintNumber(8, M, true); lcdDualThickPrintNumber(0, H, true); 부울 알람 =(S &0x01); lcdWordShowBell(15, 0, 알람, BELL_CHAR); //오른쪽 하단 모서리 lcdWordShowBell(15, 1, !alarm, BELL_CHAR); //오른쪽 하단 #endif byte c =(S &1) ? C3:32; lcd.setCursor(7,0); lcd.write(c); lcd.setCursor(7,1); lcd.write(c);}//2줄 번호 그리기// pos - 그릴 x 위치 번호// number - 그릴 값//leadingZero - 선행 0을 표시해야 하는지 여부void lcdDualThickPrintNumber(int pos, int number, int LeadingZero){ int t =숫자 / 10; 정수 u =숫자 % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualThickPrintDigit(위치, t); lcdDualThickPrintDigit(pos + 4, u);}//2줄 숫자 그리기// pos - 숫자를 그릴 x 위치// number - 끌기 위한 값 lcdDualThickPrintDigit(int pos, int number){ for (int y =0; y <2; y++) { lcd.setCursor(위치, y); for (int x =0; x <3; x++) { lcd.write(blockChar[숫자][y][x]); } }}//--------------------------------------------- --- 듀얼 베벨 레이아웃 ------------------------------------------ ---------------------- 무효 lcdDualBevelSetup(){ createCharP(LT, _LT); createCharP(UB, _UB); createCharP(RT, _RT); createCharP(LL, _LL); createCharP(LB, _LB); createCharP(LR, _LR); createCharP(UMB, _UMB); createCharP(LMB, _LMB);} 무효 lcdDualBevelLayout(){#ifdef DUAL_THICK_12HR int h =(H>=12) ? H - 12 :H; if (h ==0) { h =12; } lcdDualBevelPrintNumber(8, M, 참); lcdDualBevelPrintNumber(0, h, 거짓); lcd.setCursor(15,0); lcd.print((H>=12) ? "p" :"a"); lcd.setCursor(15,1); lcd.print("m"); #else lcdDualBevelPrintNumber(8, M, true); lcdDualBevelPrintNumber(0, H, 참); 부울 알람 =(S &0x01); lcdWordShowBell(15, 0, 알람, 65); //오른쪽 하단 모서리 lcdWordShowBell(15, 1, !alarm, 65); //오른쪽 하단 #endif byte c =(S &1) ? 58:32; lcd.setCursor(7,0); lcd.write(c); lcd.setCursor(7,1); lcd.write(c);}//Draw a 2 line number// pos - x position to draw number// number - value to draw// leadingZero - whether leading zeros should be displayedvoid lcdDualBevelPrintNumber(int pos, int number, int leadingZero){ int t =number / 10; int u =number % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualBevelPrintDigit(pos, t); lcdDualBevelPrintDigit(pos + 4, u);}//Draw a 2 line digit// pos - x position to draw number// number - value to drawvoid lcdDualBevelPrintDigit(int pos, int number){ for (int y =0; y <2; y++) { lcd.setCursor(pos, y); for (int x =0; x <3; x++) { lcd.write(bevelChar[number][y][x]); } }}//------------------------------------------------ Dual Trek layout ---------------------------------------------------------------------void lcdDualTrekSetup(){ createCharP(K0, K_0); createCharP(K1, K_1); createCharP(K2, K_2); createCharP(K3, K_3); createCharP(K4, K_4); createCharP(K5, K_5); createCharP(K6, K_6); createCharP(K7, K_7);}void lcdDualTrekLayout(){ lcdDualTrekPrintNumber(10, S, true); lcdDualTrekPrintNumber(5, M, true); lcdDualTrekPrintNumber(0, H, true); byte c =(S &1) ? 165 :32; lcd.setCursor(4,0); lcd.write(c); lcd.setCursor(4,1); lcd.write(c); lcd.setCursor(9,0); lcd.write(c); lcd.setCursor(9,1); lcd.write(c); bool alarm =(S &0x01); lcdWordShowBell(15, 0, alarm, 65); //bottonm right corner lcdWordShowBell(15, 1, !alarm, 65); //bottonm right corner}//Draw a 2 line number// pos - x position to draw number// number - value to draw// leadingZero - whether leading zeros should be displayedvoid lcdDualTrekPrintNumber(int pos, int number, int leadingZero){ int t =number / 10; int u =number % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualTrekPrintDigit(pos, t); lcdDualTrekPrintDigit(pos + 2, u);}//Draw a 2 line digit// pos - x position to draw number// number - value to drawvoid lcdDualTrekPrintDigit(int pos, int number){ for (int y =0; y <2; y++) { lcd.setCursor(pos, y); for (int x =0; x <2; x++) { lcd.write(trekChar[number][y][x]); } }}//------------------------------------------------ Dual Thin layout ---------------------------------------------------------------------void lcdDualThinSetup(){ createCharP(T0, T_0); createCharP(T1, T_1); createCharP(T2, T_2); createCharP(T3, T_3); createCharP(T4, T_4); createCharP(T5, T_5); createCharP(T6, T_6); createCharP(T7, T_7);}void lcdDualThinLayout(){ #ifdef DUAL_THIN_12HR int h =(H>=12) ? H - 12 :H; if (h ==0) { h =12; } lcdDualThinPrintNumber(6, S, true); lcdDualThinPrintNumber(3, M, true); lcdDualThinPrintNumber(0, h, false); lcd.setCursor(9,0); lcd.print((H>=12) ? "p" :"a"); lcd.setCursor(9,1); lcd.print("m"); #else lcdDualThinPrintNumber(6, S, true); lcdDualThinPrintNumber(3, M, true); lcdDualThinPrintNumber(0, H, true);#endif byte c =(S &1) ? 165 :32; lcd.setCursor(2,0); lcd.write(c); lcd.setCursor(2,1); lcd.write(c); lcd.setCursor(5,0); lcd.write(c); lcd.setCursor(5,1); lcd.write(c); String line1 =aH+":"+aM; String line2 =(alarmON &&(S &0x01)) ? "ALARM" :" "; lcd.setCursor(11,0); //First row lcd.print(line1); lcd.setCursor(11,1); //Second row lcd.print(line2); }//Draw a 2 line number// pos - x position to draw number// number - value to draw// leadingZero - whether leading zeros should be displayedvoid lcdDualThinPrintNumber(int pos, int number, int leadingZero){ int t =number / 10; int u =number % 10; if (t ==0 &&!leadingZero) { t =11; } lcdDualThinPrintDigit(pos, t); lcdDualThinPrintDigit(pos + 1, u);}//Draw a 2 line digit// pos - x position to draw number// number - value to drawvoid lcdDualThinPrintDigit(int pos, int number){ for (int y =0; y <2; y++) { lcd.setCursor(pos, y); lcd.write(thinChar[number][y]); }}//------------------------------------------------ Word layout ---------------------------------------------------------------------void lcdWordSetup(){ createCharP(BELL_CHAR, &bell[0]);}void lcdWordLayout(){ String line1 =numberToWord(H, false); String line2 =numberToWord(M, true); lcd.setCursor(0,0); //First row printClear(line1, 13); lcd.setCursor(0,1); //Second row printClear(line2, 14); if (millis()> frameTimeout) { frameTimeout =millis() + FRAME_TIMEOUT; //lcd.createChar(HOURGLASS_CHAR, &hourglass[nextFrame][0]); createCharP(HOURGLASS_CHAR, &hourglass[nextFrame][0]); nextFrame =(nextFrame + 1) % HOURGLASS_FRAMES; lcd.setCursor(13,0); //First row lcd.write((int)HOURGLASS_CHAR); lcd.print(sS); } bool alarm =(S &0x01); lcdWordShowBell(14, 1, alarm, BELL_CHAR); //Second row lcdWordShowBell(15, 1, !alarm, BELL_CHAR); //Second row}//Display the bell symbol if alarm is on// x - x position (0..15)// y - y position (0..1)// show - true to showvoid lcdWordShowBell(int x, int y, bool show, byte chr) { lcd.setCursor(x,y); lcd.print(" "); if (alarmON &&show) { lcd.setCursor(x,y); lcd.write(chr); }}//Print character string and clear to right// s - String to print...This file has been truncated, please download it to see its full contents.

    맞춤형 부품 및 인클로저

    stl_files_ZuDXHCHZCl.zip

    회로도

    Schematic and PCB in Eagle files eagle_files_ZN59zdeNf5.zip

    제조공정

    1. t cobbler plus가 포함된 라즈베리 파이 2 물 경보기
    2. 비행 시뮬레이터용 Arduino가 있는 LCD 패널
    3. 아침에 잠자리에서 일어나게 해주는 알람 시계
    4. Arduino로 DIY 가장 간단한 IV9 Numitron 시계
    5. 이슬람 기도 시간이 있는 Arduino 시계
    6. 단어 단위의 시간 분해능이 있는 워드 시계
    7. Arduino Temp. 3.2 디스플레이가 있는 모니터 및 실시간 시계
    8. 시간 설정 및 알람 기능이 있는 TM1637 디지털 시계
    9. Arduino UNO로 LCD TFT 화면에 이미지 표시하기!
    10. DS1302 RTC가 있는 간단한 알람 시계