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

단일 LED 매트릭스 Arduino 플립 시계

구성품 및 소모품

Arduino Nano R3
× 1
Maxim 통합 DS3231M - ±5ppm, I2C 실시간 클록
× 1
MAX7219 드라이버가 있는 8x8 Led 매트릭스
× 1
RGB 확산 공통 음극
× 1
저항 220옴
× 2
푸시 버튼이 있는 로터리 인코더
× 1

필요한 도구 및 기계

납땜 인두(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

Adrian Jones가 개발한 이 8x8 LED Matrix Module CLOCK을 제작했습니다. 시간은 왼쪽에서 오른쪽으로 스크롤하거나 소프트웨어 제어 하에 위에서 아래로 스크롤하여 표시됩니다. 시간의 각 자릿수는 오른쪽에서 연속적으로 들어가며 중앙에 오면 순간적으로 멈추고 약간 밝아집니다. 그런 다음 디스플레이의 다음 숫자가 보기로 스크롤되는 동안 왼쪽으로 스크롤됩니다. 주기는 연속된 디스플레이 사이에 짧은 지연으로 반복됩니다. "위에서 아래로" 수직 뒤집기의 경우 다음을 변경해야 합니다.

정적 부울 top2bottom =거짓;

받는 사람:

정적 부울 top2bottom =true;

코드 주석에서 볼 수 있듯이 스크롤 속도, 문자 간 빈 줄 수, 12/24시간 표시, 문자 간 ms, 밝기 등과 같은 많은 매개변수를 변경할 수 있습니다.

시간은 로터리 엔코더를 사용하여 쉽게 설정할 수 있습니다. 2색 다이오드가 설정 모드(분, 시간 또는 일반)를 표시합니다. 두 개의 기본 조각으로 구성된 상자에 시계를 넣어 상자 내부에 쉽게 접근할 수 있습니다. 매우 편리하고 실용적입니다.

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

코드

<울>
  • 코드
  • 코드Arduino
    <사전>//************************************************ ********************************************//// 매트릭스 시계 // Adrian Jones, 2014년 3월//// - 왼쪽에서 오른쪽 및 위에서 아래로 스크롤 가능////********************* ************************************************** ******************//#include // I2C-WIRE 라이브러리#include // RTC-Library// max7219 레지스터 정의 제어 핀 # 1 × 00 # max7219_reg_noop하는 0x01 #가 max7219_reg_digit1는 0x02 # 정의은 0x03 #은은 0x04 #가 0x05 인 #가 0x06 일 #이 0x07 인 #가 max7219_reg_digit7을 0x08 # 정의 max7219_reg_digit6 정의 max7219_reg_digit5 정의 max7219_reg_digit4 정의 max7219_reg_digit3 정의 max7219_reg_digit2 정의은 0x09 #가 max7219_reg_intensity의 0x0a 번호를 정의 max7219_reg_decodeMode 정의 max7219_reg_scanLimit 정의 max7219_reg_digit0 정의 정의 0x0b#define max7219_reg_shutdown 0x0c#define max7219_reg_displayTest 0x0f#define dataIn 12 // DIN#define load 10 // CS #define 시계 11 // CLKcharx00,0x00x0,000 ,0x00,0x00}, // 공백 16진수 12월 32일 {0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10}, // ! 33화 0x50,0x38,0x14,0x54,0x38,0x10}, // $ {0x41,0xA2,0x44,0x08,0x10,0x22,0x45,0x82}, // % {0x38,0x44,0x44,0x 0x44,0x3A}, // &{0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00}, // ' {0x30,0x40,0x80,0x80,0x80,0x80,0x40,0 ( // 40화 0x10,0xFE,0x10,0x10,0x10}, // + {0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10}, // , {0x00,0x00,0x00,0x00,0x7 0x00}, // - {0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18}, // . {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}, // ,0xC1,0xA1,0x91,0x89,0x85,0x83,0x7E}, // 0 {0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x7C}, // 1, {0x38,0x44,x1 ,0x20,0x40,0xFE}, // 2 50 {0x7C,0x82,0x02,0x3C,0x02,0x02,0x82,0x7C}, // 3 {0x08,0x18,0x28,0x48,0xFE,80x08} , // 4 {0xFE,0x80,0xF8,0x04,0x02,0x82,0x44,0x38}, // 5 {0x38,0x44,0x80,0xB8,0xC4 ,0x82,0x44,0x38}, // 6 {0xFE,0x02,0x04,0x08,0x10,0x20,0x20,0x20}, // 7 {0x7C,0x82,0x82,0x7C,0x82,0x82,0x7, // 8 {0x7C,0x82,0x82,0x7E,0x02,0x82,0x44,0x38}, // 9 {0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00}, // :{0x00 0x18,0x18,0x00,0x18,0x18,0x30}, //; {0x00,0x10,0x20,0x40,0x80,0x40,0x20,0x10}, // <60 {0x00,0x00,0x00,0x7E,0x00,0x7E,0x00,0x00}, // ={0x00, 0x20,0x10,0x20,0x40,0x80}, //> {0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20}, // ? {0x7E,0x81,0x99,0xA1,0xA1,0x9E,0x80,0x7E}, // @ {0x3C,0x42,0x81,0x81,0xFF,0x81,0x81,0x81}, // A {0xFE,0x80,x ,0x81,0x81,0x82,0xFC}, // B {0x3C,0x42,0x81,0x80,0x80,0x81,0x42,0x3C}, // C {0xFC,0x82,0x81,0x81,0x81,0x81 }, // D {0xFE,0x80,0x80,0xFC,0x80,0x80,0x80,0xFE}, // E {0xFE,0x80,0x80,0xFC,0x80,0x80,0x80,0x80}, // F 70 {0x3C ,0x42,0x81,0x80,0x87,0x81,0x42,0x3C}, // G {0x81,0x81,0x81,0xFF,0x81,0x81,0x81,0x81}, // H {0xFE,0x10,0x10 ,0x10,0x10,0xFE}, // 나 {0xFF,0x08,0x08,0x08,0x08,0x88,0x88,0x70}, // J {0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88, // K {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFE}, // L {0x81,0xC3,0xA5,0x99,0x81,0x81,0x81,0x81}, // M {0x81,0x 0xA1,0x91,0x89,0x85,0x83,0x81}, // N {0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C}, // O {0xFC,0x82,0x81,0x82 0x80,0x80}, // P 80 {0x3C,0x42,0x81,0x81,0x81,0x85,0x42,0x3D}, // Q {0xFC,0x82,0x81,0x82,0xFC,0x84,0x82,0x R {0x3C,0x42,0x81,0x40,0x3E,0x81,0x42,0x3C}, // S {0xFE,0x10,0x10,0x10,0x10,0x10,0x1 0,0x10}, // T {0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38}, // U {0x82,0x82,0x82,0x82,0x82,0x44,0x28,0x10}, {0x81,0x81,0x81,0x81,0x99,0xA5,0xC3,0x81}, // W {0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81}, // X {0x80x20x4 ,0x10,0x10,0x10,0x10}, // Y {0xFF,0x02,0x04,0x08,0x10,0x20,0x40,0xFF}, // Z 90 {0xE0,0x80,0x80,0x80,0x80,0 0xE0}, // [ {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}, // {0x07,0x01,0x01,0x01,0x01,0x01,0x01,0x007}, // ] 0xA0,0xE0,0xA0,0xAA,0x15,0x15,0x11}, // am ('^'로 코딩됨 {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E}, // _ {0x10,0 0x00,0x00,0x00,0x00,0x00,0x00}, // ' {0x00,0x00,0x38,0x04,0x3C,0x44,0x48,0x34}, // {0x00,0x40,0x40,0x 0x44,0x38}, // b {0x00,0x00,0x18,0x24,0x40,0x40,0x24,0x18}, // c {0x00,0x04,0x04,0x04,0x3C,0x44,0x44,0x3 100화 0x44,0x38,0x04,0x44,0x38}, // g {0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44}, // h {0x0 0,0x00,0x40,0x00,0x40,0x40,0x40,0x40}, // 나는 {0x00,0x08,0x00,0x08,0x08,0x08,0x48,0x30}, // j {0x00,0x40,0 0x50,0x60,0x50,0x48}, // k {0x00,0x40,0x40,0x40,0x40,0x40,0x40,0x20}, // l {0x00,0x00,0x00,0x28,0x54,0x} , // m {0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44}, // n 110 {0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38}, 0x00,0x70,0x48,0x48,0x70,0x40,0x40}, // p {0x00,0x00,0x30,0x48,0x48,0x38,0x08,0x08}, // q {0x00,0x0040x 0x40,0x40,0x40}, // r {0x00,0x30,0x48,0x40,0x30,0x08,0x48,0x30}, // s {0x00,0x20,0x70,0x20,0x20,0x20,0x20,0x20,0 / t {0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x38}, // u {0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10}, // 0x20x0,0 ,0x82,0x82,0x92,0x54,0x28}, // w {0x00,0x00,0x84,0x48,0x30,0x30,0x48,0x84}, // x 120 {0x00,0x48,0x48,0x4 0x48,0x30}, // y {0x00,0x00,0x00,0x7C,0x08,0x10,0x20,0x7C}, // z {0x00,0x30,0x40,0x40,0x80,0x40,0x40, // { {0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20}, // | {0x00,0x60,0x10,0x10,0x08,0x10,0x10,0x60}, // } {0xE0,0xA0,0xE0,0x80,0x8A,0x15,0x15,0x11} // 오후 코드는 7E~' Decx 126 };// RTC 작업 정의RTC_DS1307 RTC; // Tiny RTC(DS1307) 모듈(SDA - A4, SCL - A5)// 로터리 인코더, 스위치 및 LED 제어#define enc_PinA 2 // 인코더 A에서 핀 2(인터럽트 0)#define enc_PinB 4 // 인코더 B에서 핀 4#define enc_Switch 3 // 인코더 스위치를 핀 3으로 전환(인터럽트 1)#define mode_Pin 8 // 모드 LED 핀#define min_Pin 9 // 분 LED pinunsigned char enc_A, enc_B, enc_A_prev=0;static 부울 회전 =false; 정적 부울 시계 방향 =false; 정적 부울 updateFlag =false; 정적 int 모드 =0; // 0 - 없음, 1 - 시간 설정, 2 - 최소 설정// 표시 문자열 정의#define max_array_size 100char ac[max_array_size] ={};byte rc[8] ={};String display_message ="";int arraylen; // 작동 매개변수#define delay_line 75 // 줄 이동 사이의 ms#define delay_char 400 // 문자 간의 ms#define delay_mess 500 // 메시지 간의 ms#define cblanks 1 // 문자 사이의 빈 줄 수#define eblanks 0 // 메시지 끝의 추가 빈 줄 수(8 이상) // display featuresstatic boolean top2bottom =false; // 표시 방향(위에서 아래로, 또는 오른쪽에서 왼쪽으로static 부울 hour24 =false; // 24시간 표시?static 부울 charHI =true; // 전체 문자 강조 표시static 부울 doSerial =true; // 직렬 출력?//*** ************************************************** *********************************//// 초기 설정//****** ************************************************** *********************************// 무효 설정() { Wire.begin(); Serial.begin( 57600); if(doSerial) Serial.print("MATRIX Clock - Adrian Jones, Mar. 2014"); // 8x8 LED 매트릭스 제어 핀 pinMode(dataIn, OUTPUT); pinMode(clock, OUTPUT); pinMode(load, OUTPUT) ); initMatrix(); // LED 매트릭스 초기화 // LED 핀 pinMode(mode_Pin, OUTPUT); // 모드 핀 digitalWrite(mode_Pin, 1); pinMode(min_Pin, OUTPUT); // 미세 핀 digitalWrite(min_Pin, 1); // 인코더 제어 pinMode(enc_PinA, INPUT_PULLUP); digitalWrite(enc_PinA, HIGH); // 로터리 인코더 핀 A pinMode(enc_PinB, INPUT_PULLUP); digitalWrite(enc_PinB, HIGH); // 로터리 인코더 핀 B pinMode(enc_Switch, INPUT_PULLUP);digitalWrite(enc_Switch, HIGH); // 인코더 스위치 attachInterrupt(0, rotEncoder, CHANGE); // 시간 설정 attachInterrupt(1, swEncoder, CHANGE); // 분 / 시간 // RTC RTC.begin(); if (!RTC.isrunning()) { RTC.adjust(DateTime(__DATE__, __TIME__)); if(doSerial) Serial.println("(RTC 재설정)"); } else { if(doSerial) Serial.println("(RTC 실행 중)"); } } //************************************************ *******************************************//// 메인 루프/ /**************************************************** ****************************************//void 루프() { 현재 날짜 시간 =RTC.now(); // show_time_and_date(지금); // 표시 시간 display_message =createMessage(now); arraylen =initDisplayString(디스플레이_메시지); if(updateFlag) { show_time_and_date(지금); 업데이트 플래그 =거짓; } 동안(회전) { 지연(1); // 디바운스 adjTime(지금, 시계 방향); show_time_and_date(RTC.now()); display_message =createMessage(지금); arraylen =initDisplayString(디스플레이_메시지); 지연(1); 회전 =거짓; // 인터럽트 플래그를 다시 false로 재설정 } delay(5); for (int i =0; i <(arraylen-7); i++) { // 메시지 배열을 순환하면서 한 번에 한 바이트씩 전진합니다. for (int j =1; j <9; j++) { maxSingle(j,ac [i+8-j]); } // 1행은 ac[i+8], 2행은 ac[i+7] 등... 8행은 ac[i+0]을 얻습니다. if(i%(8+cblanks) ==0) { / / 디스플레이에 완전한 문자가 있을 때... if(charHI) maxSingle(max7219_reg_intensity, 0x01); // ... 밝기를 높이고 일시적으로 정지 newDelay(delay_char); } else { // 일반 밝기 maxSingle(max7219_reg_intensity, 0x00); newDelay(delay_line); } } if(모드 ==0) newDelay(delay_mess);}// ********************************* ***************************************************** / /// 인터럽트 루틴// ******************************************* *************************************** //// rotEncoder() 함수:ISR이 호출됨 인코더가 회전할 때 무효 rotEncoder(){ delay(1); enc_A =디지털 읽기(enc_PinA); enc_B =디지털 읽기(enc_PinB); if(!enc_A &&enc_A_prev){ // 시계 방향으로 상태 변경 =(!enc_A &&enc_B)? 허위 사실; if(모드 !=0) 회전 =참; } enc_A_prev =enc_A; // 다음 시간을 위해 A 값 저장 }// function swEncoder():인코더 버튼을 눌렀을 때 ISR이 호출됨void swEncoder(){ delay(1); if(digitalRead(enc_Switch) !=LOW) 반환; // 스위치가 눌려지면 delay(1); // 디바운스 if(digitalRead (enc_Switch) !=LOW) return; // 스위치가 여전히 눌러진 모드인 경우++; 모드 =모드 % 3; // 증가 모드 digitalWrite(mode_Pin, !(mode ==1)); // 시간 조정 LED digitalWrite(min_Pin, !(mode ==2)); // 분 조정 LED updateFlag =true;}// ************************************** ******************************************** //// 작동 루틴 // ************************************************ ********************************** //// 함수 newDelayvoid newDelay (int dly) { for (int z =1; z=25) adj_hrs =1; } else { // 감소 if(adj_hrs ==0) adj_hrs =24; if(--adj_hrs <=0) adj_hrs =24; } RTC.adjust(DateTime(now.year(), now.month(), now.day(), adj_hrs, now.minute(), now.second())); } if(mode ==2) { // 분 조정 int adj_mins =now.minute(); if(dir) { if(++adj_mins>=60) adj_mins =0; } else { if(--adj_mins <0) adj_mins =59; } RTC.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), adj_mins, now.second())); }}// function rotChar(char):문자 char의 경우 비트를 90도 전치합니다. (위쪽 - 아래쪽 ==> 왼쪽 - 오른쪽)// 결과를 rc[0] - rc[7].byte에 저장합니다. rotChar(char inLetter) { int ind =int(inLetter) - 0x20; for (int col =0, col <8, col++) { 바이트 마스크 =0x01 <<(7-col); for (int row =0; row <8; row++) { bitWrite(rc[col], 7-row,(alphanum[ind][row] &mask)); } }} // 함수 show_time_and_date:시간 문자열 출력 및 bytesvoid show_time_and_date(DateTime datetime){ if(doSerial) { int minutes =datetime.minute(); 정수 시간 =datetime.hour(); if(시간==0) 시간=24; 정수 초 =datetime.second(); 문자 구분 ='/'; 문자 덴드 =' '; String te ="현재 날짜/시간:"; te =te + datetime.year() + delim + datetime.month() + delim + datetime.day() + dend; Serial.print(te); if(시간<10) Serial.print(0); Serial.print(시간,12월); Serial.print(":"); if(분<10) Serial.print(0); Serial.print(분,DEC); Serial.print(":"); if(초 <10) Serial.print(0); Serial.print(초,DEC); Serial.println(""); } }문자열 createMessage(날짜 시간 날짜 시간) { 문자열 new_mess =" "; int hr =datetime.hour()%24; if(시간 ==0) 시간 =24; int mn =datetime.minute(); if(mode ==0) { // 일반 모드 if(hour24) { new_mess +=hr; } else { new_mess +=(시간> 12)? 시 - 12 :시; } new_mess +=':'; if(mn <10) new_mess +='0'; new_mess +=백만; if(!hour24) new_mess +=(시간> 12)? "~" :"^"; } if(mode ==1) { // 시간 조정 new_mess +=hr; } if(mode ==2) { // 분 조정 if(mn <10) new_mess +='0'; new_mess +=백만; } return new_mess;}// function initDisplayString() :문자 사이와 끝에서 공백이 있는 메시지 문자열 배열을 만듭니다. initDisplayString(String message) { int x =0; for (int y =0; y > 1); // 데이터 넣기 digitalWrite(load,HIGH);}// function putByte() :데이터를 행렬로, MSB를 LSB로 로드 void putByte(byte data) { byte i =8; 바이트 마스크; while(i> 0) { // MSB에서 LSB로 마스크 =0x01 <<(i - 1); // 비트마스크 생성 digitalWrite(clock, LOW); // 틱 if (data &mask){ // 비트 선택 digitalWrite(dataIn, HIGH);// 1 보내기 } else { digitalWrite(dataIn, LOW); // 0 전송 } digitalWrite(clock, HIGH); // 톡 --i; // 하위 비트로 이동 }}

    회로도


    제조공정

    1. Arduino 관점 시계
    2. Arduino로 DIY 가장 간단한 IV9 Numitron 시계
    3. 마스터 시계
    4. 수제 16x8 매트릭스의 Arduino Nano 테트리스 게임
    5. 모션센스
    6. LED 매트릭스 + 모션 센서 도어 디스플레이 [Arduino Holiday]
    7. Arduino Quadruped
    8. 볼트와 Arduino를 사용하여 LED 밝기 제어
    9. Arduino, Yaler 및 IFTTT가 포함된 IoT 게이지
    10. Arduino 반발 전자기 부상