제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 1 | ||||
| × | 36 | ||||
| × | 18 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
| ||||
|
|
Hackaday.io를 탐색하는 동안 Frugha의 7-세그먼트 디스플레이 배열로 만든 아름다운 시계를 발견했습니다. 정말 만들고 싶었지만 Frugha의 버전은 0.56" 7-세그먼트 디스플레이를 사용하기 때문에 상당히 큽니다. 제 디자인은 0.28" 7-세그먼트 디스플레이를 사용하여 크기의 4분의 1에 불과합니다.
알람 시계와 시간, 날짜 및 알람을 설정하는 구성 화면을 통합하도록 소프트웨어가 다시 작성되었습니다.
동영상
구성 화면
시계는 4개의 버튼으로 제어됩니다. SELECT 버튼(맨 위)은 구성 화면을 표시합니다. 현재 선택 항목이 깜박입니다. 선택 버튼을 다시 누르면 다른 구성 섹션(즉, 시간, 날짜, 알람, 조정, 밝기, 날짜 형식 및 시계)이 순환됩니다.
메뉴 항목 중 하나가 선택된 상태에서 ENTER 버튼(위에서 아래로 두 번째)을 누르면 설정을 변경할 수 있습니다. 메뉴 항목에 대해 둘 이상의 설정이 있는 경우 ENTER 버튼이 설정 사이를 순환합니다. 활성 설정이 깜박입니다.
설정이 깜박이면 UP 및 DOWN 버튼(하단 두 개의 버튼)이 설정을 변경합니다.
날짜 화면
시계가 표시된 상태에서 ENTER 버튼(위에서 아래로 두 번째)을 누르면 날짜 화면이 5초간 표시됩니다.
구성 화면의 날짜 형식 섹션에서 날짜 형식(DD-MM 또는 MM-DD)과 사용된 글꼴을 설정할 수 있습니다.
디자인 고려 사항
보드 디자인을 간단히 하자면, 제 버전은 원래 버전에서 사용된 한 자리 숫자가 아닌 4자리 디스플레이를 사용합니다. 0.28" 디스플레이가 작기 때문에 MAX7219 칩을 별도의 보드에 올려야 했습니다. 간단히 배선하려면 기계가공된 암수 핀 헤더를 사용하여 보드를 연결하고,
보드를 상업적으로 만들고 싶거나 내가 한 것처럼 직접 만들고 싶다면 Eagle 파일이 포함되어 있습니다. 저는 토너법을 이용해서 만들었습니다.
칼럼 보드
모든 디스플레이를 수용하는 6개의 기둥 보드를 만들어야 합니다. 수 기계 헤더를 납땜할 때 중간 세트에서 시작하여 바깥쪽 가장자리까지 작업합니다. 성냥개비 또는 이와 유사한 것을 사용하여 소켓을 충분히 들어 올려 핀을 쉽게 납땜할 수 있습니다. 끝이 가는 작은 인두와 0.5mm 땜납을 사용하십시오.
열 모듈을 만든 후에는 무광 검정 페인트로 표시 테두리를 칠하는 것이 좋습니다. 이렇게 하면 디스플레이가 인접 항목과 완벽하게 정렬되지 않은 경우 흰색 가장자리가 표시되지 않습니다. 또한 마커 펜을 사용하여 각 열 모듈에 번호를 지정합니다. 이것은 MAX7219 마더보드에 삽입될 때 도움이 됩니다.
MAX7219 마더보드
마더보드와 컬럼 보드를 설계할 때 올바른 MAX7219 세그먼트 또는 숫자를 해당 디스플레이 핀에 매핑하지 않았습니다. PCB 레이아웃을 최대한 단순하게 유지하고 소프트웨어의 차이에 맞게 조정하고 싶었습니다.
암 가공 소켓의 경우 먼저 컬럼 보드의 수 핀에 배치한 다음 연결되어 있는 동안 어셈블리를 제자리에 납땜하는 것이 좋습니다. 이것은 열 핀이 해당 소켓과 정확히 정렬됨을 의미합니다. 제거해야 하는 경우 열 모듈에 번호를 지정하면 동일한 위치로 돌아갈 수 있습니다.
MPU 보드
마이크로프로세서 보드에는 다른 모든 구성 요소가 포함되어 있습니다. 4개의 버튼과 2개의 SMD 커패시터는 보드 후면에 장착되고 다른 모든 구성 요소는 보드 전면에 장착됩니다. 로우 프로파일을 유지하기 위해 일반적으로 Arduino Pro Mini에 납땜되는 FTDI 핀 헤더가 이제 PCB에 직접 납땜됩니다. 두 개의 와이어는 DTR 및 VCC 핀에서 PCB로 직접 연결됩니다.
사례 만들기
앞면과 뒷면에 대한 STL 파일이 포함되어 있습니다. 둘 다 0.2 레이어 높이와 테두리를 사용하여 인쇄되었습니다. 전면에는 제작판에만 닿는 지지대가 활성화되어 있습니다.
컬럼 모듈이 있는 MAX7219 마더보드는 전면에서 밀어 넣습니다. 조금 헐렁한 느낌이 든다면 마스킹 테이프를 한두 겹 더 발라주세요.
MPU 보드는 뒷면에 뜨겁게 접착되어 있습니다.
소프트웨어
소프트웨어를 사용하려면 Arduino IDE에 MD_MAX72XX 라이브러리가 설치되어 있어야 합니다. 테스트를 위해 Hardware_Test_V1 스케치를 제공했습니다. 단락이나 끊어진 배선을 확인할 수 있도록 모든 세그먼트에 불이 들어옵니다. 디스플레이가 작동하면 Clock_V4 스케치를 업로드하세요.
<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">/*--------------------------------------------------- * 7 Segment array clock * define each digit in a 6x6 byte array *--------------------------------------------------*/ #pragma once//---------------------------------------------------// Standard MAX7219 wiring// Digit order 0,1,2,3,4,5/*// Segment order _ a b c d e f g#define _______ B00000000#define __cd___ B00011000#define _bcde_g B00111101#define abcdefg B01111111#define __cdefg B00011111#define __c____ B00010000#define ab__efg B01100111#define abcd_fg B01111011#define abcde_g B01111101#define ab_defg B01101111#define _bc____ B00110000#define a__defg B01001111#define ____ef_ B00000110#define ___defg B00001111#define abc__fg B01110011#define a___ef_ B01000110#define _b_____ B00100000#define ab___f_ B01100010#define _bcd___ B00111000#define a___ef_ B01000110#define ab_____ B01100000#define ____e__ B00000100#define __cde_g B00011101#define a____f_ B01000010#define a_cdefg B01011111#define ___de__ B00001100#define _____f_ B00000010#define ab___fg B01100011#define a__def_ B01001110#define __cde__ B00011100#define a___efg B01000111#define a__d___ B01001000#define abc____ B01110000#define _bc_ef_ B00110110#define ___def_ B00001110#define abc_ef_ B01110110#define _bcdef_ B00111110#define a__def_ B01001110#define abcd___ B01111000*///Segment order d e f b c a _ g#define _______ B00000000#define __cd___ B10001000#define _bcde_g B11011001#define abcdefg B11111101#define __cdefg B11101001#define __c____ B00001000#define ab__efg B01110101#define abcd_fg B10111101#define abcde_g B11011101#define ab_defg B11110101#define _bc____ B00011000#define a__defg B11100101#define ____ef_ B01100000#define ___defg B11100001#define abc__fg B00111101#define a___ef_ B01100100#define _b_____ B00010000#define ab___f_ B00110100#define _bcd___ B10011000#define a___ef_ B01100100#define ab_____ B00010100#define ____e__ B01000000#define __cde_g B11001001#define a____f_ B00100100#define a_cdefg B11101101#define ___de__ B11000000#define _____f_ B00100000#define ab___fg B00110101#define a__def_ B11100100#define __cde__ B11001000#define a___efg B01100101#define a__d___ B10000100#define abc____ B00011100#define _bc_ef_ B01111000#define ___def_ B11100000#define abc_ef_ B01111100#define _bcdef_ B11111000#define a__def_ B11100100#define abcd___ B10011100//Square Numbers//ASCII Character Set//Numbers 0 - 9//Letters A - Z//Segment order d e f b c a _ guint8_t ascii[] ={ B11111100, B00011000, B11010101, B10011101, B00111001, B10101101, B11101101, B00011100, B11111101, B10111101, B00000000, B00000000, B00000000, B00000001, B00000000, B00000000, B00000000, B01111101, B11101001, B11100100, B11011001, B11100101, B01100101, B10111101, B01111001, B00011000, B11011000, B00000000, B11100000, B00000000, B01001001, B11001001, B01110101, B00000000, B01000001, B10101101, B11100001, B11001000, B00000000, B00000000, B00000000, B10111001, B00000000, B11001100, B01010001, B10011100, B00000000, B10000000};//Digit sequence for each device (MAX7219)uint8_t digitMap[] ={5, 2, 6, 4, 1, 7, 3, 0};//------------------------------------------------------------// Digits using logical coordinates//------------------------------------------------------------const int8_t largeDigits[11][6][6] PROGMEM ={ { //0 { _______, _______, __cd___, _bcde_g, abcdefg, __cdefg }, { _______, __c____, abcdefg, ab__efg, abcd_fg, abcdefg }, { _______, abcde_g, ab_defg, _______, _bc____, a__defg }, { _______, abcdefg, ____ef_, __c____, abcdefg, ____ef_ }, { _______, abcdefg, __cdefg, abcdefg, a___efg, _______ }, { _______, abc__fg, abcdefg, ab__efg, _______, _______ } }, { //1 { _______, _______, _______, __c____, abcdefg, __cdefg }, { _______, _______, _______, abcdefg, abcdefg, ____ef_ }, { _______, _______, _bcde_g, abcdefg, a__defg, _______ }, { _______, _bc____, abcdefg, abcdefg, ____ef_, _______ }, { _______, abcdefg, abcdefg, a___ef_, _______, _______ }, { _b_____, abcdefg, abcdefg, _______, _______, _______ } }, { //2 { _______, _______, __cd___, _bcde_g, abcdefg, __cdefg }, { _______, _bc____, abcdefg, ab___f_, abcd_fg, abcdefg }, { _______, _______, _______, _bcd___, abcdefg, a___ef_ }, { _______, _______, _bcde_g, abcdefg, a___ef_, _______ }, { __c____, abcdefg, abcdefg, a___ef_, _______, _______ }, { _b_____, abc__fg, abcdefg, abcdefg, ab__efg, _______ } }, { //3 { _______, _______, __cd___, abcdefg, abcdefg, __cdefg }, { _______, _b_____, abcdefg, ab___f_, abcd_fg, abcdefg }, { _______, _______, __cd___, _bcde_g, abcdefg, a___ef_ }, { _______, _______, ab_____, abc__fg, abcdefg, ____e__ }, { _______, __cd___, __cde_g, _bcde_g, abcdefg, ____ef_ }, { _b_____, abc__fg, abcdefg, abcdefg, a____f_, _______ } }, { //4 { _______, _______, _bcd___, abcdefg, __c____, abcdefg }, { _______, __c____, abcdefg, a___ef_, abcde_g, a__defg }, { _______, abcde_g, abcdefg, _bcd___, abcdefg, ____ef_ }, { __c____, abcdefg, abcdefg, abcdefg, abcdefg, _______ }, { _______, _______, __c____, abcdefg, ____ef_, _______ }, { _______, _______, abcdefg, ab__efg, _______, _______ } }, { //5 { _______, _______, _bcde_g, abcdefg, abcdefg, abcdefg }, { _______, _bc____, abcdefg, a_cdefg, ___de__, _______ }, { _______, _______, abc__fg, abcdefg, abcdefg, ____ef_ }, { _______, _______, _______, _bc____, abcdefg, ____ef_ }, { _______, __cde_g, __cde_g, _bcde_g, abcdefg, _____f_ }, { _b_____, abcdefg, abcdefg, ab__efg, a____f_, _______ } }, { //6 { _______, _______, _______, __cd___, abcdefg, ____ef_ }, { _______, _______, _bcde_g, abcdefg, a____f_, _______ }, { _______, _bcd___, abcdefg, abcdefg, abcdefg, ____e__ }, { __c____, abcdefg, a___ef_, ab_____, abcdefg, ____ef_ }, { _bc____, abcdefg, __cdefg, _bcde_g, abcdefg, _______ }, { _______, abc__fg, abcdefg, ab__efg, _______, _______ } }, { //7 { _______, _bc____, abcdefg, abcdefg, abcdefg, __cdefg }, { _______, _b_____, ab___fg, ab___fg, abcdefg, abcdefg }, { _______, _______, _______, _bcde_g, abcdefg, a___ef_ }, { _______, _______, _bcde_g, abcdefg, ab__efg, _______ }, { _______, _bcde_g, abcdefg, a___ef_, _______, _______ }, { _b_____, abcdefg, abcdefg, _______, _______, _______ } }, { //8 { _______, _______, __cd___, abcdefg, abcdefg, __cdefg }, { _______, _bc____, abcdefg, ab___f_, abcd_fg, abcdefg }, { _______, _b_____, abcdefg, _bcde_g, abcdefg, a___ef_ }, { _______, _bcde_g, ab__efg, abc__fg, abcdefg, ____e__ }, { _bc____, abcdefg, __cde_g, _bcde_g, abcdefg, ____ef_ }, { _______, abc__fg, abcdefg, abcdefg, a____f_, _______ } }, { //9 { _______, _______, __cde_g, abcdefg, __cdefg, ___de__ }, { _______, _bcd___, abcdefg, ab___fg, abcd_fg, abcdefg }, { _______, abcdefg, a_cdefg, __cde__, abcdefg, a__defg }, { _______, ab_____, abcd_fg, abcdefg, abcdefg, _____f_ }, { _______, __cd___, abcdefg, ab__efg, _______, _______ }, { _b_____, abcdefg, a___ef_, _______, _______, _______ } }, { //Colon { _______, _______, _______, _______, _______, _______ }, { _______, __cde_g, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, _______ }, { __cde_g, _______, _______, _______, _______, _______ }, { _______, _______, _______, _______, _______, _______ } }};const int8_t smallDigits[11][5][3] PROGMEM ={ { //0 { a___ef_, a__d___, abc____ }, { _bc_ef_, _______, _bc_ef_ }, { _bc_ef_, _______, _bc_ef_ }, { _bc_ef_, _______, _bc_ef_ }, { ___def_, a__d___, _bcd___ } }, { //1 { _______, abc_ef_, _______ }, { _______, _bc_ef_, _______ }, { _______, _bc_ef_, _______ }, { _______, _bc_ef_, _______ }, { _______, _bcdef_, _______ } }, { //2 { a__def_, a__d___, abc____ }, { _______, _______, _bc_ef_ }, { a___ef_, a__d___, _bcd___ }, { _bc_ef_, _______, _______ }, { ___def_, a__d___, abcd___ } }, { //3 { a__def_, a__d___, abc____ }, { _______, _______, _bc_ef_ }, { _______, a__def_, _bc____ }, { _______, _______, _bc_ef_ }, { a__def_, a__d___, _bcd___ } }, { //4 { abc_ef_, _______, abc_ef_ }, { _bc_ef_, _______, _bc_ef_ }, { ___def_, a__d___, _bc____ }, { _______, _______, _bc_ef_ }, { _______, _______, _bcdef_ } }, { //5 { a___ef_, a__d___, abcd___ }, { _bc_ef_, _______, _______ }, { ___def_, a__d___, abc____ }, { _______, _______, _bc_ef_ }, { a__def_, a__d___, _bcd___ } }, { //6 { a___ef_, a__d___, abcd___ }, { _bc_ef_, _______, _______ }, { ____ef_, a__d___, abc____ }, { _bc_ef_, _______, _bc_ef_ }, { ___def_, a__d___, _bcd___ } }, { //7 { a__def_, a__d___, abc____ }, { _______, _______, _bc_ef_ }, { _______, _bc_ef_, _______ }, { _______, _bc_ef_, _______ }, { _______, _bcdef_, _______ }, }, { //8 { a___ef_, a__d___, abc____ }, { _bc_ef_, _______, _bc_ef_ }, { ____ef_, a__d___, _bc____ }, { _bc_ef_, _______, _bc_ef_ }, { ___def_, a__d___, _bcd___ } }, { //9 { a___ef_, a__d___, abc____ }, { _bc_ef_, _______, _bc_ef_ }, { ___def_, a__d___, _bc____ }, { _______, _______, _bc_ef_ }, { a__def_, a__d___, _bcd___ } }, { //Hyphen { _______, _______, _______ }, { _______, _______, _______ }, { a__def_, a__d___, abcd___ }, { _______, _______, _______ }, { _______, _______, _______ } }};
No preview (download only).
/*Class:ButtonAuthor:John Bradnam (jbrad2089@gmail.com)Purpose:Arduino library to handle buttons*/#pragma once#include "Arduino.h"#define DEBOUNCE_DELAY 10//Repeat speed#define REPEAT_START_SPEED 500#define REPEAT_INCREASE_SPEED 50#define REPEAT_MAX_SPEED 50class Button{ public://Simple constructor Button(int pin); Button(int name, int pin); Button(int name, int pin, int analogLow, int analogHigh, bool activeLow =true); //Background function called when in a wait or repeat loop void Background(void (*pBackgroundFunction)()); //Repeat function called when button is pressed void Repeat(void (*pRepeatFunction)()); //Test if button is pressed bool IsDown(void); //Test whether button is pressed and released //Will call repeat function if one is provided bool Pressed(); //Return button state (HIGH or LOW) - LOW =Pressed int State(); //Return button name int Name(); private:int _name; int _pin; bool _range; int _low; int _high; bool _activeLow; void (*_repeatCallback)(void); void (*_backgroundCallback)(void);};
/*Class:ButtonAuthor:John Bradnam (jbrad2089@gmail.com)Purpose:Arduino library to handle buttons*/#include "Button.h"Button::Button(int pin){ _name =pin; _pin =pin; _range =false; _low =0; _high =0; _backgroundCallback =NULL; _repeatCallback =NULL; pinMode(_pin, INPUT_PULLUP);}Button::Button(int name, int pin){ _name =name; _pin =pin; _range =false; _low =0; _high =0; _backgroundCallback =NULL; _repeatCallback =NULL; pinMode(_pin, INPUT_PULLUP);}Button::Button(int name, int pin, int analogLow, int analogHigh, bool activeLow){ _name =name; _pin =pin; _range =true; _low =analogLow; _high =analogHigh; _activeLow =activeLow; _backgroundCallback =NULL; _repeatCallback =NULL; pinMode(_pin, INPUT);}//Set function to invoke in a delay or repeat loopvoid Button::Background(void (*pBackgroundFunction)()){ _backgroundCallback =pBackgroundFunction;}//Set function to invoke if repeat system requiredvoid Button::Repeat(void (*pRepeatFunction)()){ _repeatCallback =pRepeatFunction;} bool Button::IsDown(){ if (_range) { int value =analogRead(_pin); return (value>=_low &&value <_high); } else { return (digitalRead(_pin) ==LOW); }}//Tests if a button is pressed and released// returns true if the button was pressed and released// if repeat callback supplied, the callback is called while the key is pressedbool Button::Pressed(){ bool pressed =false; if (IsDown()) { unsigned long wait =millis() + DEBOUNCE_DELAY; while (millis()=time) { _repeatCallback(); unsigned long faster =speed - REPEAT_INCREASE_SPEED; if (faster>=REPEAT_MAX_SPEED) { speed =faster; } time =millis() + speed; } } pressed =true; } } return pressed;}//Return current button stateint Button::State(){ if (_range) { int value =analogRead(_pin); if (_activeLow) { return (value>=_low &&value <_high) ? LOW :HIGH; } else { return (value>=_low &&value <_high) ? HIGH :LOW; } } else { return digitalRead(_pin); }}//Return current button nameint Button::Name(){ return _name;}
No preview (download only).
제조공정
구성품 및 소모품 Arduino Nano R3 × 1 Maxim 통합 DS3231M - ±5ppm, I2C 실시간 클록 × 1 푸시버튼 스위치, 순간 × 2 LED 매트릭스 모듈 32x8 × 1 필요한 도구 및 기계 납땜 인두(일반) 앱 및 온라인 서비스 Arduino IDE 이 프로젝트 정보 Nick의 LED 프로젝트 페이지에서 시계 프로젝트 마녀가 8x8 LED가 있는
이 Arduino Tutorial에서는 DS3231 Real Time Clock Module을 사용하는 방법을 배웁니다. 다음 비디오를 보거나 아래에 작성된 튜토리얼을 읽을 수 있습니다. 개요 여기에 오는 첫 번째 질문은 Arduino 자체에 내장된 시간 측정기가 있는 경우 Arduino 프로젝트에 대해 실제로 별도의 RTC가 필요한 이유입니다. 요점은 RTC 모듈이 배터리로 실행되며 마이크로컨트롤러를 다시 프로그래밍하거나 주 전원을 분리하더라도 시간을 추적할 수 있다는 것입니다. DS3231 실시간 시계 DS3231은 시