編集履歴一覧に戻る
HomeMadeGarbageのアイコン画像

HomeMadeGarbage が 2020年03月01日15時49分50秒 に編集

初版

タイトルの変更

+

LED リストウォッチ

タグの変更

+

Leafonyプレゼントキャンペーン

+

LED

+

時計

+

Arduino

記事種類の変更

+

製作品

本文の変更

+

フルカラーLEDで時計を作ってみました。 # 構成 ![キャプションを入力できます](https://camo.elchika.com/603618545fcd0fd4edabd72479f6036fe058439f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f35393262396664612d353062332d343138372d626533362d646339613134326132363632/) ## 部品 - [NeoPixel Ring – 16連フルカラーシリアルLED](https://amzn.to/2wS4DpU) ![キャプションを入力できます](https://camo.elchika.com/c1fa91084ce33c84f9b4bf0402ad80cd4815811c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f33373635626335622d303661372d343537322d393236332d666562353634303164626134/) - [Adafruit I2C通信の8×8ミニLEDマトリックス基板(緑色)](https://amzn.to/3aeArUr) 時刻や日付などを表示 Arduino向けライブラリは以下の2点使用  [https://github.com/adafruit/Adafruit_LED_Backpack](https://github.com/adafruit/Adafruit_LED_Backpack)  [https://github.com/adafruit/Adafruit_LED_Backpack](https://github.com/adafruit/Adafruit-GFX-Library) - [リアルタイムクロックモジュール(RTC) DS3231](https://amzn.to/2PDrDjb) 正確に時間を計測してくれる。温度センサも内蔵 Arduino向けライブラリは以下  [https://github.com/jarzebski/Arduino-DS3231](https://github.com/jarzebski/Arduino-DS3231) - 制御用マイコン [Adafruit Pro Trinket – 3V 12MHz](https://amzn.to/38doxJ8) - [Adafruit Pro Trinket バッテリーモジュール](https://amzn.to/3afmGVn) Pro TrinketとLiPoバッテリー間に接続し、USB接続時は充電してくれる - [リチウムイオンポリマー電池400mAh](https://amzn.to/2TdDvdP) ![キャプションを入力できます](https://camo.elchika.com/7e85e88576d0f84d34cb22167f4916382f0812cb/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f38626530346136632d303032622d343865342d623461612d643861373630356234326538/) # 動作 タクトスイッチを押すと8x8LEDマトリックスディスプレイに各種モードで表示します。 - 時刻表示 @[twitter](https://twitter.com/H0meMadeGarbage/status/1234004897227407360)   - 日付, 温度表示 @[twitter](https://twitter.com/H0meMadeGarbage/status/1234005819265409030)   - グラフィック表示 時刻が切り替わる際に干支の絵がピコピコ表示します。   1時 子 ![キャプションを入力できます](https://camo.elchika.com/94f4548e0a03c60b945ecad607ada9445b77a760/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f38646431393861382d323866632d346561382d613831622d643163616634663261313039/)   2時 牛 ![キャプションを入力できます](https://camo.elchika.com/02a401b8f0d8a9b46878ca7ad6f8b4a75a2457c9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f33653935303330352d326231622d346331652d393830622d316137396561336531633664/)   3時 寅 ![キャプションを入力できます](https://camo.elchika.com/4d1232c00a0b065dc57235567d9576bf3dbf09d9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f64643164653835662d653761302d343237632d383135302d646336393662643335333935/)   4時 卯 ![キャプションを入力できます](https://camo.elchika.com/2152e5f6c15bc0b0d67e0d3b0e629d9ab8166cdf/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f62633066303437662d363562332d343165662d393831372d613263376261373938316236/)   5時 辰 ![キャプションを入力できます](https://camo.elchika.com/27afc7be052d298f0b71d96545cde686f022cfa0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f30323738396334362d656436322d346131322d613733332d373062646633363136336236/)   6時 巳 ![キャプションを入力できます](https://camo.elchika.com/612cc9e277951f1b343760d2efd1accff3111831/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f66323135303330312d336665612d346264362d613338362d363535303330343166373034/)   7時 午 ![キャプションを入力できます](https://camo.elchika.com/a734497a952d258487f16e7a54506e42a9df1b22/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f33396232646261612d373534362d346466632d393736612d313832643439343134336339/)   8時 未 ![キャプションを入力できます](https://camo.elchika.com/6b4b2502cd4e2b7223660949991ca3efa9134d13/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f35363839656333332d656538622d343337612d393231632d336363653861376162613664/)   9時 申 ![キャプションを入力できます](https://camo.elchika.com/0580a20de5a0947010f7b6c022ffc1681fb84419/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f34363631666464642d653261652d343930352d613833382d623834343532663839373532/)   10時 酉 ![キャプションを入力できます](https://camo.elchika.com/743916cec16f7bd81ccb3a8ae0b2c91afff19ee0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f62643330663330392d363735632d343866372d626532392d356665323130653530626461/)   11時 戌 ![キャプションを入力できます](https://camo.elchika.com/e26d17f86dd5e266ff5d267eaa92ea706a2dd4b1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f65636639396531322d333265392d346365662d393465662d646533626661366661306135/)   12時 亥 ![キャプションを入力できます](https://camo.elchika.com/a7ad15b926d79bf5bf5532a3eab7a19bc11ec8bf/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39396533383932642d313165622d346636362d393638622d3230623961353138303030652f35373131653935382d623833662d343132352d393861362d633833663434353937356336/) # Arduino IDE用コード ```arduino:watch_men.ino #include <Wire.h> #include <DS3231.h> //https://github.com/jarzebski/Arduino-DS3231 #include <Adafruit_NeoPixel.h> #ifdef __AVR__ #include <avr/power.h> #endif #include "Adafruit_LEDBackpack.h" #include "Adafruit_GFX.h" int mode, mode_ori; DS3231 clock; RTCDateTime dt; // Which pin on the Arduino is connected to the NeoPixels? #define PIN 6 // How many NeoPixels are attached to the Arduino? #define NUMPIXELS 16 int hr1, hr2, mg, sb; int r[NUMPIXELS] = {0}, g[NUMPIXELS] = {0}, b[NUMPIXELS] = {0}; int demoState = 0; unsigned long time = 0; Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); Adafruit_8x8matrix matrix = Adafruit_8x8matrix(); static const uint8_t PROGMEM //子 ne_bmp[] = { B01100110, B10011001, B10011001, B01000010, B10000001, B00100100, B10000001, B01011010}, //丑 ushi_bmp[] = { B01100110, B01100110, B11111111, B11110000, B01010100, B11110001, B10000001, B10100101}, //寅 tora_bmp[] = { B00011000, B01011010, B01111110, B00011000, B01011010, B00011000, B11000011, B00011000}, //卯 u_bmp[] = { B01100110, B10011001, B10011001, B10011001, B10000001, B00000000, B00100100, B00000000}, //辰 tatsu_bmp[] = { B10011001, B10011001, B00000000, B10100101, B10000001, B01100110, B10011001, B10100101}, //巳 mi_bmp[] = { B01111111, B01000000, B00100010, B10010000, B01001000, B00100100, B01111000, B01000000}, //午 uma_bmp[] = { B00111100, B00011000, B10100101, B10000001, B11000011, B11000011, B10000001, B10100101}, //未 hitsu_bmp[] = { B11111111, B11111111, B10011001, B00000000, B00100100, B10000001, B11000011, B11100111}, //申 saru_bmp[] = { B01111110, B11011011, B10000001, B10100101, B10000001, B00000000, B10011001, B01100110}, //酉 tori_bmp[] = { B00000000, B00000000, B01000010, B00011000, B00100100, B01111110, B00100100, B00011000}, //戌 inu_bmp[] = { B10111101, B00011000, B00000000, B00000000, B01000010, B00011000, B00011000, B00000000}, //亥 i_bmp[] = { B10100101, B00011000, B00000000, B11000011, B0011000, B01100110, B10000001, B10100101}; void modeCnt() { delay(200); if(digitalRead(3) == 0) { mode++; } if(mode > 4) { mode = 0; } } void setup() { #if defined (__AVR_ATtiny85__) if (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif pixels.setBrightness(20); pixels.begin(); // This initializes the NeoPixel library. pixels.show(); matrix.begin(0x70); matrix.setBrightness(6); Serial.begin(115200); pinMode(3, INPUT_PULLUP); attachInterrupt(1, modeCnt, FALLING); mode = 0; // Initialize DS3231 //Serial.println("Initialize DS3231"); clock.begin(); // Set sketch compiling time //clock.setDateTime(__DATE__, __TIME__); // Manual (Year, Month, Day, Hour, Minute, Second) //clock.setDateTime(2014, 4, 25, 12, 59, 54); } void loop() { dt = clock.getDateTime(); if (dt.hour >= 12) { hr1 = dt.hour - 12; } else{ hr1 = dt.hour; } hr2 = map(hr1, 0, 12, 0, NUMPIXELS); mg = map(dt.minute, 0, 60, 0, NUMPIXELS); sb = map(dt.second, 0, 60, 0, NUMPIXELS); hr2 = NUMPIXELS - hr2; if (hr2 == NUMPIXELS) { hr2 = 0; } mg = NUMPIXELS - mg; if (mg == NUMPIXELS) { mg = 0; } sb = NUMPIXELS - sb; if (sb == NUMPIXELS) { sb = 0; } for (int i=0; i<NUMPIXELS; i++) { r[i] = 0; } if (mg == 0) { for (int i=0; i<NUMPIXELS; i++) { g[i] = 0; } } if (sb == 0) { for (int i=0; i<NUMPIXELS; i++) { b[i] = 0; } } r[hr2] = 63; g[mg] = 88; b[sb] = 87; for (int i=0; i<NUMPIXELS; i++) { pixels.setPixelColor(i, pixels.Color(r[i], g[i], b[i])); } pixels.show(); //Serial.println(clock.dateFormat("Y/m/d (l) H:i:s", dt)); //Serial.println(mode); //Serial.println(clock.readTemperature()); if (mode == 0) { mode_ori = mode; matrix.clear(); matrix.writeDisplay(); } //デジタル時刻 if (mode == 1) { mode_ori = mode; matrix.setTextSize(1); matrix.setTextWrap(false); // we dont want text to wrap so it scrolls nicely matrix.setTextColor(LED_ON); for (int8_t x=8; x>=-29; x--) { if (mode != 1){return;} matrix.clear(); matrix.setCursor(x,0); //matrix.print(String(dt.hour) + ":" + String(dt.minute)); matrix.print(clock.dateFormat("H:i", dt)); matrix.writeDisplay(); delay(50); } } //日付 if (mode == 2) { mode_ori = mode; matrix.setTextSize(1); matrix.setTextWrap(false); // we dont want text to wrap so it scrolls nicely matrix.setTextColor(LED_ON); for (int8_t x=8; x>=-58; x--) { if (mode != 2){return;} matrix.clear(); matrix.setCursor(x,0); //matrix.print(clock.dateFormat("m/d l", dt)); matrix.print(clock.dateFormat("m/d D.", dt)); matrix.writeDisplay(); delay(40); } } //気温 if (mode == 3) { clock.forceConversion(); mode_ori = mode; matrix.setTextSize(1); matrix.setTextWrap(false); // we dont want text to wrap so it scrolls nicely matrix.setTextColor(LED_ON); for (int8_t x=8; x>=-23; x--) { if (mode != 3){return;} matrix.clear(); matrix.setCursor(x,0); matrix.print(String(clock.readTemperature(),1)); matrix.writeDisplay(); delay(50); } } //DEMO if (mode == 4) { mode_ori = mode; switch (demoState) { case 0: matrix.clear(); switch (hr1) { case 0: matrix.drawBitmap(0, 0, ne_bmp, 8, 8, LED_ON); break; case 1: matrix.drawBitmap(0, 0, ushi_bmp, 8, 8, LED_ON); break; case 2: matrix.drawBitmap(0, 0, tora_bmp, 8, 8, LED_ON); break; case 3: matrix.drawBitmap(0, 0, u_bmp, 8, 8, LED_ON); break; case 4: matrix.drawBitmap(0, 0, tatsu_bmp, 8, 8, LED_ON); break; case 5: matrix.drawBitmap(0, 0, mi_bmp, 8, 8, LED_ON); break; case 6: matrix.drawBitmap(0, 0, uma_bmp, 8, 8, LED_ON); break; case 7: matrix.drawBitmap(0, 0, hitsu_bmp, 8, 8, LED_ON); break; case 8: matrix.drawBitmap(0, 0, saru_bmp, 8, 8, LED_ON); break; case 9: matrix.drawBitmap(0, 0, tori_bmp, 8, 8, LED_ON); break; case 10: matrix.drawBitmap(0, 0, inu_bmp, 8, 8, LED_ON); break; case 11: matrix.drawBitmap(0, 0, i_bmp, 8, 8, LED_ON); break; } matrix.writeDisplay(); break; case 1: matrix.clear(); matrix.writeDisplay(); break; } demoState++; if (demoState > 1) { demoState = 0; } } if (mg == 0 && dt.second < 10) { mode = 10; switch (demoState) { case 0: matrix.clear(); switch (hr1) { case 0: matrix.drawBitmap(0, 0, ne_bmp, 8, 8, LED_ON); break; case 1: matrix.drawBitmap(0, 0, ushi_bmp, 8, 8, LED_ON); break; case 2: matrix.drawBitmap(0, 0, tora_bmp, 8, 8, LED_ON); break; case 3: matrix.drawBitmap(0, 0, u_bmp, 8, 8, LED_ON); break; case 4: matrix.drawBitmap(0, 0, tatsu_bmp, 8, 8, LED_ON); break; case 5: matrix.drawBitmap(0, 0, mi_bmp, 8, 8, LED_ON); break; case 6: matrix.drawBitmap(0, 0, uma_bmp, 8, 8, LED_ON); break; case 7: matrix.drawBitmap(0, 0, hitsu_bmp, 8, 8, LED_ON); break; case 8: matrix.drawBitmap(0, 0, saru_bmp, 8, 8, LED_ON); break; case 9: matrix.drawBitmap(0, 0, tori_bmp, 8, 8, LED_ON); break; case 10: matrix.drawBitmap(0, 0, inu_bmp, 8, 8, LED_ON); break; case 11: matrix.drawBitmap(0, 0, i_bmp, 8, 8, LED_ON); break; } matrix.writeDisplay(); break; case 1: matrix.clear(); matrix.writeDisplay(); break; } demoState++; if (demoState > 1) { demoState = 0; } } if (mg == 0 && dt.second > 10) { mode = mode_ori; } delay(800); } ```