工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

シングルLEDマトリックスArduinoフリップクロック

コンポーネントと消耗品

>
Arduino Nano R3
× 1
Maxim Integrated DS3231M-±5ppm、I2Cリアルタイムクロック
× 1
8x8LEDマトリックスとMAX7219ドライバー
× 1
RGB拡散コモンカソード
× 1
抵抗220オーム
× 2
プッシュボタン付きロータリーエンコーダー
× 1

必要なツールとマシン

>
はんだごて(汎用)

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

AdrianJonesによって開発されたこの8x8LEDマトリックスモジュールCLOCKを作成します。時間は、左から右にスクロールするか、ソフトウェア制御の下で上から下にスクロールすることで表示されます。時間の各桁は右側から連続してスライドし、中央に来ると一時的に停止し、わずかに明るくなります。次に、左にスクロールし、ディスプレイの次の桁がスクロールして表示されます。このサイクルは、連続する表示の間に短い遅延で繰り返されます。「上から下へ」の垂直反転の場合は、変更する必要があります:

static boolean top2bottom =false;

宛先:

static boolean top2bottom =true;

コードのコメントでわかるように、スクロールスプリード、文字間の空白行数、12/24時間表示、文字間のミリ秒、明るさなど、多くのパラメータを変更できます。

ロータリーエンコーダーで簡単に時刻を設定できます.2色のダイオードで設定モード(分、時、通常)を表示します.2つの基本部品で構成された箱に時計を入れて、箱の内側にアクセスできるようにしましたとても便利で実用的です。

<図>

コード

  • コード
コード Arduino
 // ********************************************* ******************************************** //// MATRIX CLOCK // Adrian Jones、2014年3月////-左から右および上から下へのスクロールを許可//// ********************* ************************************************** ****************** //#include  // I2C-WIRE library#include  // RTC-Library // max7219レジスタを定義そして制御ピン位max7219_reg_noopは0x00#max7219_reg_digit0 0x01の#max7219_reg_digit1 0x02の#max7219_reg_digit2 0x03の#max7219_reg_digit3 0x04の#max7219_reg_digit4 0x05の#max7219_reg_digit5 0x06の#max7219_reg_digit6 0x07の#max7219_reg_digit7 0x08に#max7219_reg_decodeMode 0x09の#はmax7219_reg_intensityは0x0A#max7219_reg_scanLimitを定義定義定義定義定義定義定義定義定義定義定義定義します0x0b#define max7219_reg_shutdown 0x0c#define max7219_reg_displayTest 0 x0f#define dataIn 12 // DIN#define load 10 // CS #define clock 11 // CLKchar alphanum [] [8] ={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}、//空白の16進数20Dec 32 {0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10}、//! 33 {0x00,0x28,0x28,0x28,0x00,0x00,0x00,0x00}、// "34 {0x00,0x28,0x7C、0x28,0x7C、0x28,0x00,0x00}、//#35 {0x10,0x38、 0x50,0x38,0x14,0x54,0x38,0x10}、// $ {0x41,0xA2,0x44,0x08,0x10,0x22,0x45,0x82}、//%{0x38,0x44,0x44,0x38,0x50,0x4A、 0x44,0x3A}、//&{0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00}、// '{0x30,0x40,0x80,0x80,0x80,0x80,0x40,0x30}、//( 40 {0xC0,0x20,0x10,0x10,0x10,0x10,0x20,0xC0}、//){0x28,0x10,0xAA、0x54,0xAA、0x10,0x28,0x00}、// * {0x00,0x10,0x10、 0x10,0xFE、0x10,0x10,0x10}、// + {0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10}、//、{0x00,0x00,0x00,0x00,0x7E、0x00,0x00、 0x00}、//-{0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18}、//。{0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}、 // / {0x7E、0xC1,0xA1,0x91,0x89,0x85,0x83,0x7E}、// 0 {0x10,0x30,0x10,0x10,0x10,0x10,0x10,0x7C}、// 1 {0x38,0x44、 0x82,0x04,0x18,0x20,0x40,0xFE}、// 2 50 {0x7C、0x82,0x02,0x3C、0x02,0x02,0x82,0x7C}、// 3 {0x08,0x18,0x28,0x48,0xFE、0x08 、0x08,0x08}、// 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,0x82,0x7C}、// 8 {0x7C、0x82,0x82、 0x7E、0x02,0x82,0x44,0x38}、// 9 {0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00}、//:{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,0x80,0x40、 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 {0xFC、0x82,0x81,0xFE 、0x81,0x81,0x82,0xFC}、// B {0x3C、0x42,0x81,0x80,0x80,0x81,0x42,0x3C}、// C {0xFC、0x82,0x81,0x81,0x81,0x81,0x82,0xFC }、// 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 、0x10,0x10,0xFE}、// I {0xFF、0x08,0x08,0x08,0x08,0x88,0x88,0x70}、// J {0x88,0x90,0xA0,0xC0,0xA0,0x90,0x88,0x84}、 // K {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFE}、// L {0x81,0xC3,0xA5,0x99,0x81,0x81,0x81,0x81}、// M {0 x81,0xC1,0xA1,0x91,0x89,0x85,0x83,0x81}、// N {0x3C、0x42,0x81,0x81,0x81,0x81,0x42,0x3C}、// O {0xFC、0x82,0x81,0x82、 0xFC、0x80,0x80,0x80}、// P 80 {0x3C、0x42,0x81,0x81,0x81,0x85,0x42,0x3D}、// Q {0xFC、0x82,0x81,0x82,0xFC、0x84,0x82,0x81 }、// R {0x3C、0x42,0x81,0x40,0x3E、0x81,0x42,0x3C}、// S {0xFE、0x10,0x10,0x10,0x10,0x10,0x10,0x10}、// T {0x82、 0x82,0x82,0x82,0x82,0x82,0x44,0x38}、// U {0x82,0x82,0x82,0x82,0x82,0x44,0x28,0x10}、// V {0x81,0x81,0x81,0x81,0x99、 0xA5,0xC3,0x81}、// W {0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81}、// X {0x82,0x44,0x28,0x10,0x10,0x10,0x10,0x10}、/ / Y {0xFF、0x02,0x04,0x08,0x10,0x20,0x40,0xFF}、// Z 90 {0xE0,0x80,0x80,0x80,0x80,0x80,0x80,0xE0}、// [ {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}、// {0x07,0x01,0x01,0x01,0x01,0x01,0x01,0x07}、//] {0xE0,0xA0,0xE0,0xA0、 0xAA、0x15,0x15,0x11}、// am( '^' {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E}、// _ {0x10,0x08,0x00,0x00,0x00、 0x00,0x00,0x00}、// '{0x00,0x00,0x38,0x04,0x3C、0x44,0x48,0x34}、// {0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x38}、/ / b {0x00,0x00,0x18,0x24,0x40,0x40,0x24,0x18}、// c {0x00,0x04,0x04,0x04,0x3C、0x44,0x44,0x38}、// d 100 {0x00,0x00、 0x38,0x44,0x7C、0x40,0x44,0x38}、// e {0x00,0x18,0x20,0x20,0x78,0x20,0x20,0x20}、// f {0x00,0x38,0x44,0x44,0x38,0x04、 0x44,0x38}、// g {0x00,0x40,0x40,0x40,0x78,0x44,0x44,0x44}、// h {0x00,0x00,0x40,0x00,0x40,0x40,0x40,0x40}、// i{0x00,0x08,0x00,0x08,0x08,0x08,0x48,0x30}、// j {0x00,0x40,0x40,0x48,0x50,0x60,0x50,0x48}、// k {0x00,0x40,0x40,0x40 、0x40,0x40,0x40,0x20}、// l {0x00,0x00,0x00,0x28,0x54,0x44,0x44,0x44}、// m {0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x44 }、// n 110 {0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38}、// o {0x00,0x00,0x70,0x48,0x48,0x70,0x40,0x40}、// p {0x00 、0x00,0x30,0x48,0x48,0x38,0x08,0x08}、// q {0x00,0x00,0x00,0x30,0x48,0x40,0x40,0x40}、// r {0x00,0x30,0x48,0x40,0x30 、0x08,0x48,0x30}、// s {0x00,0x20,0x70,0x20,0x20,0x20,0x28,0x10}、// t {0x00,0x00,0x44,0x44,0x44,0x44,0x44,0x38}、 // u {0x00,0x00,0x44,0x44,0x44,0x44,0x28,0x10}、// v {0x00,0x00,0x82,0x82,0x82,0x92,0x54,0x28}、// w {0x00,0x00,0x84,0x48,0x30,0x30,0x48,0x84}、// x 120 {0x00,0x48,0x48,0x48,0x38,0x08,0x48,0x30}、// y {0x00,0x00,0x00、 0x7C、0x08,0x10,0x20,0x7C}、// z {0x00,0x30,0x40,0x40,0x80,0x40,0x40,0x30}、// {{0x00,0x20,0x20,0x20,0x20,0x20,0x20、 0x20}、// | {0x00,0x60,0x10,0x10,0x08,0x10,0x10,0x60}、//} {0xE0,0xA0,0xE0,0x80,0x8A、0x15,0x15,0x11} // pmコードは '〜' Hex 7E、Dec 126}; // RTC操作を定義RTC_DS1307RTC; //小型RTC(DS1307)モジュール(SDA-A4、SCL-A5)//ロータリーエンコーダー、スイッチ、LED制御#define enc_PinA 2 //エンコーダーAからピン2(割り込み0)#define enc_PinB 4 //エンコーダーBからpin 4#define enc_Switch 3 //ピン3へのエンコーダスイッチ(割り込み1)#define mode_Pin 8 //モードLEDpin#define min_Pin 9 //分LEDpinunsigned char enc_A、enc_B、enc_A_prev =0; static boolean rotation =false; static boolean clockly =false; static boolean updateFlag =false; static int mode =0; // 0-なし、1-時間設定、2-分設定//表示文字列の定義#definemax_array_size 100char ac [max_array_size] ={}; byte rc [8] ={}; String display_message =""; int arraylen; //操作パラメータ#definedelay_line75 //行シフト間のミリ秒#definedelay_char 400 //文字間のミリ秒#definedelay_mess 500 //メッセージ間のミリ秒#define cblanks 1 //文字間の空白行の数#defineeblanks 0 //メッセージの最後にある追加の空白行の数(8を超える)//表示機能static boolean top2bottom =false; //表示方向(上から下、または右から左静的ブール時間24 =false; // 24時間表示?静的ブールcharHI =true; //文字全体を強調表示静的ブールdoSerial =true; //シリアル出力?// *** ************************************************** ************************************ ////初期設定// ****** ************************************************** ********************************* // void setup(){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_Pin A、INPUT_PULLUP); digitalWrite(enc_PinA、HIGH); //ロータリーエンコーダピンApinMode(enc_PinB、INPUT_PULLUP); digitalWrite(enc_PinB、HIGH); //ロータリーエンコーダピンBpinMode(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 running)"); }} // ********************************************** ******************************************* ////メインループ/ / ************************************************* **************************************** // void loop(){DateTime now =RTC.now(); // show_time_and_date(now); //表示時間display_message =createMessage(now); arraylen =initDisplayString(display_message); if(updateFlag){show_time_and_date(now); updateFlag =false; } while(rotating){delay(1); // adjTime(今、時計回り);をデバウンスします。 show_time_and_date(RTC.now()); display_message =createMessage(now); arraylen =initDisplayString(display_message); delay(1);回転=false; //割り込みフラグをfalseにリセットします} delay(5); for(int i =0; i <(arraylen-7); i ++){//メッセージ配列をループし、一度に1バイトずつ進みます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(mode ==0)newDelay(delay_mess);} // ********************************* ************************************************* / ///割り込みルーチン// ******************************************* *************************************** ////関数rotEncoder():ISRが呼び出されましたエンコーダーが回転したときvoidrotEncoder(){delay(1); enc_A =digitalRead(enc_PinA); enc_B =digitalRead(enc_PinB); if(!enc_A &&enc_A_prev){//状態変化を時計回りに=(!enc_A &&enc_B)?真/偽; if(mode!=0)rotating =true; } enc_A_prev =enc_A; //次回のためにAの値を保存します} // function swEncoder():エンコーダボタンが押されたときに呼び出されるISR void swEncoder(){delay(1); if(digitalRead(enc_Switch)!=LOW)return; //スイッチが押された場合delay(1); //デバウンスif(digitalRead(enc_Switch)!=LOW)return; //スイッチがまだ押されている場合mode ++;モード=モード%3; //インクリメントモードdigitalWrite(mode_Pin、!(mode ==1)); //時間調整LEDdigitalWrite(min_Pin、!(mode ==2)); //分調整LEDupdateFlag =true;} // ************************************** ******************************************** ////操作ルーチン// ************************************************ ********************************** //// function 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:時間文字列とバイトを出力しますvoid show_time_and_date(DateTime datetime){if(doSerial){int minutes =datetime.minute(); int hours =datetime.hour(); if(hours ==0)hours =24; int seconds =datetime.second(); char delim ='/'; char dend =''; String te ="現在の日付/時刻:"; te =te + datetime.year()+ delim + datetime.month()+ delim + datetime.day()+ dend; Serial.print(te); if(hours <10)Serial.print(0); Serial.print(hours、DEC); Serial.print( ":"); if(minutes <10)Serial.print(0); Serial.print(minutes、DEC); Serial.print( ":"); if(seconds <10)Serial.print(0); Serial.print(seconds、DEC); Serial.println( ""); }} String createMessage(DateTime datetime){String new_mess =""; int hr =datetime.hour()%24; if(hr ==0)hr =24; int mn =datetime.minute(); if(mode ==0){//通常モードif(hour24){new_mess + =hr; } else {new_mess + =(hr> 12)?時間-12:時間; } new_mess + =':'; if(mn <10)new_mess + ='0'; new_mess + =mn; if(!hour24)new_mess + =(hr> 12)? "〜": "^"; } if(mode ==1){//時間の調整new_mess + =hr; } if(mode ==2){//分を調整するif(mn <10)new_mess + ='0'; new_mess + =mn; } return new_mess;} // function initDisplayString():文字間およびendintに空白を含むメッセージ文字列の配列を作成しますinitDisplayString(String message){int x =0; for(int y =0; y > 1); //データを置くdigitalWrite(load、HIGH);} //関数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); // tock --i; //小さいビットに移動します}} 

回路図


製造プロセス

  1. Arduinoハメ撮りビジョンクロック
  2. Arduinoを使用したDIYの最もシンプルなIV9Numitron時計
  3. マスタークロック
  4. 自家製16x8マトリックス上のArduinoNanoTetr​​isゲーム
  5. MotionSense
  6. LEDマトリックス+モーションセンサードアディスプレイ[ArduinoHoliday]
  7. Arduino Quadruped
  8. BoltとArduinoを使用したLEDの明るさの制御
  9. Arduino、Yaler、IFTTTを使用したIoTゲージ
  10. Arduinoの反発電磁浮上
  11. Arduino Powered Weather Balloon Datalogger