工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
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標準LCD-16x2白地に青
× 1
ブザー
× 1
コンデンサ10µF
× 1
リアルタイムクロック(RTC)
DS1302 RTC
× 1
32.768kHzクリスタル
× 1
コイン型電池CR2032
+ホルダー。 PCBを使用する場合は、CR1220バッテリーとホルダーを使用してください
× 1
チルトスイッチ、カプセル化
水銀スイッチ
× 1
トリマポテンショメータ、10キロオーム
× 1

必要なツールとマシン

>
3Dプリンター(汎用)

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

>
Arduino IDE

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

10個の文字盤を備えた新しいバージョンが見つかります ここ


何かを作るために探し回って、私はLCD1602時計に決めました。 Webを熟読し、さまざまな実装を見つけた後、それらすべてを組み込んだ1つの時計を作成してみませんか。

時計の機能

  • 8つの異なる表示スタイル
  • 時刻、現在の日付、生年月日、アラームを設定します
  • アラームをオフにする水銀スイッチ
  • バックライト制御
  • DHT21温度および湿度センサー

ブレッドボードバージョン

実際の電子機器はかなり単純です。

<図>

配線したら、スケッチをArduino IDEにロードし、ArduinoUNOにアップロードします。 (DHT21はD9に配線されています)

時計を使う

時計には、セットアップ、インクリメント、デクリメント、チルトスイッチの3つのボタンがあります。

バックライトがオフのときに、いずれかのボタンを押すとバック​​ライトがオンになります。バックライトがオンのときにボタンが押されない場合、5秒後に自動的にオフになります。バックライトがオンになっている間、ボタンは次のタスクを実行します。

セットアップ -これにより、セットアップ画面が表示されます。直角角かっこ文字がカーソルです。 INCREMENTボタンまたはDECREMENTボタンを押すと、カーソルが置かれている値がそれぞれ増減します。もう一度SETUPボタンを押すと、カーソルが時、分、日、月、年、生年月日、生年月日、生年月日、目覚まし時間、目覚まし分の間で循環し、時計モードに戻ります。

<図>

増分 -セットアップ画面が表示されていない場合、このボタンはさまざまな時計スタイルを切り替えます。

<図>

デクリメント -セットアップ画面が表示されていない場合、このボタンはアラームのオンとオフを切り替えます。

チルトスイッチ -目覚ましが鳴っているときに、時計を傾けたり、いずれかのボタンを押すと、目覚ましがオフになります。

完全に完成した時計を作る

ブレッドボードから完全に完成した時計にビルドを行うには、プリント回路基板といくつかの追加コンポーネントが必要になります。 PCBを商業的に作成したい場合、または私が行ったように自分で作成したい場合は、Eagleファイルを添付します。トナー法を使用しました。

注:LCD 1602ディスプレイは直角のピンヘッダーを使用してメインPCBに接続されているため、ボードとディスプレイがすでにはんだ付けされている場合、ボードとディスプレイをケースに挿入するのは非常に難しい場合があります。スルーホールメッキを施した両面ボードを使用すると、ディスプレイをボードに所定の位置にはんだ付けできます。

<図>

私がワークショップの周りに持っていた部品を使用して、Arduino UNOは、ATMega328 DILチップ、16MHzクリスタル、および2つの22pfセラミックコンデンサに置き換えられました。 5Vレギュレータは7805TO-220タイプで、平滑化用の100uF16Vコンデンサです。 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枚で印刷されるようにしました。

  • MichalisVasilakisによる標準の画面デザイン
  • ArduinoWorldによるDualThickフォント
  • Arduinoフォーラムによるデュアルベベルフォント
  • CarrieSundraによるデュアルトレックフォント
  • ArduinoWorldによるデュアルシンフォント
  • LAGSILVAによる単語の概念
  • ジョンブラッドナムによるバイオリズム時計
  • ARDUinoautoMOTIVEによる天気時計

更新

29/06/20

  -WORDクロックのスペルミスを修正しました
-バックライトを制御するための#definesを追加しました
-バックライトのタイムアウトを5秒から10秒に増やしました

<コード> 23/11/20

 -誕生日の設定とEEPROMストレージを追加しました
-バイオリズムの文字盤を追加しました
-設定画面のコーディングをクリーンアップしました

私たちの誕生日に基づいて、バイオリズムが私たちの人生の最高と最低を決定するかもしれないという仮説が立てられています。バイオリズムは、23日間の身体的サイクル、28日間の感情的サイクル、33日間の知的サイクルの3つのサイクルで構成されます。バイオリズム時計は、各状態をバーとして表示します。

<図>

バーは、バイオリズムが正のサイクル(上のバー)または負のサイクル(下のバー)のいずれかにあることを示しています。バーの長さは、サイクルの正または負の長さを示しています。

06/12/20

  -DHT21サポートを追加
-温度計と湿度時計の文字盤を追加

新しい天気時計の文字盤が追加されました。ケースの背面に追加されたDHT21温度および湿度センサーを読み取ります。 PCBが更新され、DHT21センサーへの3ピンコネクタが含まれるようになりました。

<図>


コード

  • DigitalClockAlarmV7.ino
DigitalClockAlarmV7.ino C / C ++
 / * 1602LCD目覚まし時計* John Bradnam([email protected])* *ディスプレイ16x2:セットアップ:アラームのセットアップ* + ---------------- + +- --------------- + + ---------------- + * | HH:MM:SS | HH:MM | |> HH:> MM | |アラームを設定| * | DD / MM / YY |アラーム| |> DD /> MM /> YYYY | |> HH:> MM | * + ---------------- + + ---------------- + + ------------ ---- + * * 2020年6月25日* -Michalis Vasilakisの時計をコードベースとして使用しました(https://www.instructables.com/id/Arduino-Digital-Clock-With-Alarm-Function-custom-P/ )*-ハードウェアに合わせて変更-DS1302RTCおよびLCDバックライト*-さまざまな表示スタイルのサポートを追加* -MichalisVasilakisによる標準画面デザイン* -ArduinoWorldによるデュアルシックフォント(https://www.hackster.io/thearduinoworld/ arduino-digital-clock-version-1-b1a328)*-Arduinoフォーラムによるデュアルベベルフォント(https://forum.arduino.cc/index.php/topic,8882.0.html)*-キャリーサンドラによるデュアルトレックフォント( https://www.alpenglowindustries.com/blog/the-big-numbers-go-marching-2x2)*-Arduino Worldによるデュアルシンフォント(https://www.hackster.io/thearduinoworld/arduino-digital-clock -バージョン-2-5bab65)* --LAGSILVAによるワードコンセプト(https://www.hackster.io/lagsilva/text-clock-bilingual-en-pt-with-arduino-881a6e)* 29/06/20 *-スペルmiを修正WORDクロックの賭け*-バックライトを制御するための#definesを追加* -5から10秒にバックライトタイムアウトを増加* 22/11/20 *-生年月日設定とEEPROMストレージを追加*-バイオリズムクロックフェースを追加*-設定画面コーディングをクリーンアップ* xx / xx / 21 * --DHT21サポートを追加*-温度計と湿度クロックフェースを追加* /// Libraries#include  #include  #include  #include  #include  #include  //デュアルシックまたはシンディスプレイバリアントで12時間フォーマットを表示する場合はコメント解除//#defineDUAL_THICK_12HR //#define DUAL_THIN_12HR //バックライトを制御するコメント解除/ /#define NO_BACKLIGHT //#define BACKLIGHT_ALWAYS_ON#define BACKLIGHT_TIMEOUT 10000 //バイオリズムグラフをテストするためのコメント解除//#defineTEST_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 // PD6#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#define DHT21 9 // PB1#define RTC_CE 10 / / PB2#define RTC_IO 12 // PB4#define RTC_SCLK 13 // PB5 //接続と定数LiquidCrystallcd(LCD_RS、LCD_E、LCD_D4、LCD_D5、LCD_D6、LCD_D7); DS1302RTC rtc(RTC_CE、RTC_IO、RTC_SCLK); char daysOfTheWeek [7] [12] ={"Sunday"、 "Monday"、 "Tuesday"、 "Wednesday"、 "Thursday"、 "Friday"、 "Saturday"}; const int monthDays [12] ={31、28 、31、30、31、30、31、31、30、31、30、31};長い間隔=300; int melody [] ={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; int shakeTimes =0; int i =0; String sDD; String sMM; String sYY; String sH; String sM; String sS; String sBD; String sBM; String sBY; String aH ="12"; String aM =" 00 "; String sTMP; String sHUM; // String alarm =" "; long prevAlarmMillis =0; long prevDhtMillis =0; // Boolean flagsboolean setupScreen =false; boolean alarmON =false; boolean turnItOn =false; enum STYLE {STANDARD、 DUAL_THICK、DUAL_BEVEL、DUAL_TREK、DUAL_THIN、WORD、BIO、THERMO}; STYLE currentStyle =STANDARD; enum SETUP {CLOCK、TIME_HOUR、TIME_MIN、TIME_DAY、TIME_MONTH、TIME_YEAR、BIRTH_DAY、BIRTH_MONTH、; boolbackbackOn =false; longbackbackTimeout =0; byte customChar [8]; // --------------------- EEPROM --------- ---------------------------------#define EEPROM_AH 0 //アラーム時間#defineEEPROM_AM 1 //アラーム分# EEを定義するPROM_AO 2 //アラームオン/オフ#defineEEPROM_CS3 //現在のスタイル#defineEEPROM_BY4 //生年#defineEEPROM_BM 6 //生月#defineEEPROM_BD7 //生日// -------- -------------ワードクロック----------------------------------- --- String units [] ={"HUNDRED"、 "ONE"、 "TWO"、 "THREE"、 "FOUR"、 "FIVE"、 "SIX"、 "SEVEN"、 "EIGHT"、 "NINE"}; String teens [] ={"TEN"、 "ELEVEN"、 "TWELVE"、 "THIRTEEN"、 "FOURTEEN"、 "FIFTEEN"、 "SIXTEEN"、 "SEVENTEEN"、 "EIGHTEEN"、 "NINETEEN"}; String tens [ ] ={""、 ""、 "TWENTY"、 "THIRTY"、 "FORTY"、 "FIFTY"}; // ----------------------砂時計のアニメーション----------------------------#define HOURGLASS_FRAMES 8#define HOURGLASS_CHAR 0#define FRAME_TIMEOUT 200; int nextFrame =0; long frameTimeout =0; const byte hourglass [HOURGLASS_FRAMES] [8] PROGMEM ={{B11111、B11111、B01010、B01010、B01010、B01010、B10001、B11111}、{B11111、B11011、B01110、B01010、B01010、B01010、B10001、B11111} 、{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 byte bell [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、0x1f、0xe}; constバイトドロップレット[8] PROGMEM ={0x4、0x4、0xa、0xa、0x11、0x11、0x11、0xe}; #define DHT_UPDATE_INTERVAL 6000 // ------- --------------- BioRhythm Cl ock ---------------------------- //カスタム文字定数(MはMSBまたは上位バー文字、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 C36constバイトC_0 [8] PROGMEM ={0x1F、0x1F、0x1F、0x00,0x00,0x00,0x00,0x00}; constバイトC_1 [8] PROGMEM ={0x1F、0x1F、0x1F、0x00,0x00,0x1F、0x1F、0x1F}; const byte C_2 8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x1F、0x1F、0x1F}; constバイトC_3 [8] PROGMEM ={0x00,0x00,0x0E、0x0A、0x0A、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 LMB7constバイト_LT [8] PROGMEM ={B00111、B01111、B11111、B11111、B11111、B11111、B11111、B11111}; constバイト_UB [8] PROGMEM ={B11111、B11111、B11111、B00000、B00000、B00000、B00000、 B00000}; const byte _RT [8] PROGMEM ={B11100、B11110、B11111、B11111、B11111、B11111、B11111、B11111}; const byte _LL [8] PROGMEM ={B11111、B11111、B11111、B11111、B11111、B11111、 B01111、B00111}; const byte _LB [8] PROGMEM ={B00000、B00000、B00000、B00000、B00000、B11111、B11111、B11111}; const byte _LR [8] PROGMEM ={B11111、B11111、B11111、B11111、B11111、 B11111、B11110、B11100}; const byte _UMB [8] PROGMEM ={B11111、B11111、B11111、B00000、B00000、B00000、B11111、B11111}; const byte _LMB [8] PROGMEM ={B11111、B11111、B11111、 B11111、B11111、B11111、B11111、B11111}; const byte 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 }} //空白}; // ----------------------トレックフォント----------------- -----------#define K0 0#define K1 1#define K2 2#define K3 3#define K4 4#define K5 5#define K6 6#define K77constバイトK_0 [8] PROGMEM ={0x1F、0x1F、0x00,0x00,0x00,0x00,0x00,0x00}; constバイトK_1 [8] PROGMEM ={0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18}; constバイトK_2 [8] PROGMEM ={0x00,0x00,0x00,0x00,0x00,0x00,0x1F、0x1F}; constバイトK_3 [8] PROGMEM ={0x1F、0x1F、0x03,0x03,0x03,0x03,0x1F、0x1F}; constバイトK_4 [ 8] PROGMEM ={0x1F、0x1F、0x18,0x18,0x18,0x18,0x1F、0x1F}; constバイトK_5 [8] PROGMEM ={0x1F、0x1F、0x18,0x18,0x18,0x18,0x18,0x18}; constバイトK_6 [8] PROGMEM ={0x03,0x03,0x03,0x03,0x03,0x03,0x1F、0x1F}; const byte K_7 [8] PROGMEM ={0x1F、0x1F、0x03,0x03,0x03,0x03,0x03,0x03}; const byte 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 T77constバイトT_0 [8] PROGMEM ={0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02}; constバイトT_1 [8] PROGMEM ={ 0x0E、0x02,0x02,0x02,0x02,0x02,0x02,0x0E}; constバイトT_2 [8] PROGMEM ={0x0E、0x08,0x08,0x08,0x08,0x08,0x08,0x0E}; constバイトT_3 [8] PROGMEM ={0x0E、0x0A、0x0A、0x0A、0x0A、0x0A、0x0A、0x0 E}; constバイトT_5 [8] PROGMEM ={0x0A、0x0A、0x0A、0x0A、0x0A、0x0A、0x0A、0x0E}; constバイトT_4 [8] PROGMEM ={0x0E、0x0A、0x0A、0x0A、0x0A、 0x0A、0x0A}; constバイトT_6 [8] PROGMEM ={0x0E、0x02,0x02,0x02,0x02,0x02,0x02,0x02}; constバイトT_7 [8] PROGMEM ={0x18,0x18,0x18,0x18,0x18、 0x1E、0x1F、0x1F}; // lcd描画文字関数constbyte 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} //空白}; // ----------------------一般的な初期化------------------------ ---- void setup(){Serial.begin(115200); //出力/入力を設定しますpinMode(BTN_SET、INPUT); pinMode(BTN_ADJUST、INPUT); pinMode(BTN_ALARM、INPUT); pinMode(BTN_TILT、INPUT); pinMode(SPEAKER、OUTPUT); pinMode(LIGHT、OUTPUT); // RTCに有効な時刻/日付があるかどうかを確認します。ない場合は、00:00:0001/01/01に設定します。 //これは、最初に実行されるか、コイン電池が少ない場合にのみ実行されます。 // setSyncProvider()は、デフォルトで5分ごとにRTC.get()を呼び出すことにより、Timeライブラリを//外部RTCと同期させます。 setSyncProvider(rtc.get); if(timeStatus()!=timeSet){Serial.println( "デフォルト時間の設定"); // RTCを設定しますtmElements_ttm; tm.Year =CalendarYrToTm(2020); tm.Month =06; tm.Day =26; tm.Hour =7; tm.Minute =52; tm.Second =0; time_t t =makeTime(tm); // time_t値を使用して、正しい平日が設定されていることを確認しますif(rtc.set(t)==0){//成功setTime(t); } else {Serial.println( "RTCセットが失敗しました!"); }} delay(100); // EEPROMメモリからアラーム時間を読み取りますAH =EEPROM.read(EEPROM_AH); AM =EEPROM.read(EEPROM_AM);バイトao =EEPROM.read(EEPROM_AO); alarmON =(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); currentStyle =(cs>(uint8_t)THERMO)?標準:(スタイル)cs; switch(currentStyle){case 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} // ----------------------メインプログラムループ----------- ----------------- void loop(){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);を呼び出します。 }} // ---------------------------------------------- ---- //読み取りボタンstatevoidreadBtns(){set_state =digitalRead(BTN_SET); Adjust_state =digitalRead(BTN_ADJUST); alarm_state =digitalRead(BTN_ALARM); if(!backlightOn &&!setupScreen){if(set_state ==LOW || Adjust_state ==LOW || alarm_state ==LOW){//バックライトスイッチをオンにするBacklight(true); //ボタンを少なくとも1/2秒delay(500);押し続ける必要があります。 }} else {if(!setupScreen){if(alarm_state ==LOW){alarmON =!alarmON; EEPROM.write(EEPROM_AO、(alarmON)?1:0); delay(500); switchBacklight(true); } else if(adjust_state ==LOW){currentStyle =(currentStyle ==THERMO)?標準:(STYLE)((int)currentStyle + 1); EEPROM.write(EEPROM_CS、(byte)currentStyle); switch(currentStyle){case STANDARD:lcdStandardSetup();壊す;ケースDUAL_THICK:lcdDualThickSetup();壊す;ケースDUAL_BEVEL:lcdDualBevelSetup();壊す;ケースDUAL_TREK:lcdDualTrekSetup();壊す;ケースDUAL_THIN:lcdDualThinSetup();壊す;ケースワード:lcdWordSetup();壊す;ケースBIO:lcdBioRhythmSetup();壊す;ケースTHERMO:lcdThermometerSetup();壊す; } lcd.clear(); lcdPrint(); delay(500); switchBacklight(true); }} if(set_state ==LOW){setupMode =(setupMode ==ALARM_MIN)?時計:(セットアップ)((int)setupMode + 1); if(setupMode!=CLOCK){setupScreen =true; if(setupMode ==TIME_HOUR){lcd.clear(); lcd.setCursor(0,0); lcd.print( "------ SET ------"); lcd.setCursor(0,1); lcd.print( "-TIME and DATE-"); delay(2000); lcd.clear(); }} else {lcd.clear(); // RTCを設定しますtmElements_ttm; tm.Year =CalendarYrToTm(YY); tm.Month =MM; tm.Day =DD; tm.Hour =H; tm.Minute =M; tm.Second =0; time_t t =makeTime(tm); // time_t値を使用して、正しい平日が設定されていることを確認しますif(rtc.set(t)==0){//成功setTime(t); } else {Serial.println( "RTCセットが失敗しました!"); } //rtc.adjust(DateTime(YY、MM、DD、H、M、0)); //時間と日付をRTCICに保存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 ...."); delay(2000); lcd.clear(); setupScreen =false; setupMode =CLOCK; switchBacklight(true); } delay(500); }}} // ------------------------------------------------- ----- // rtcから時刻と日付を読み取るicvoidgetTimeDate(){if(!setupScreen){// DateTime now =rtc.now(); time_t t =now(); DD =day(t); MM =月(t); YY =year(t); H =時間(t); M =分(t); S =second(t); } //いくつかの修正を行います... sDD =((DD <10)? "0": "")+ String(DD); sMM =((MM <10)? "0": "")+ String(MM); sYY =String(YY-2000); sH =((H <10)? "0": "")+ String(H); sM =((M <10)? "0": "")+ String(M); sS =((S <10)? "0": "")+ String(S); sBD =((BD <10)? "0": "")+ String(BD); sBM =((BM <10)? "0": "")+ String(BM); sBY =String(BY); aH =((AH <10)? "0": "")+ String(AH); aM =((AM <10)? "0": "")+ String(AM);} // ------------------------- ------------------------- // DHTセンサーから6秒ごとに温度と湿度を読み取りますvoidgetTempHum(){unsigned long currentMillis =millis(); if(currentMillis --prevDhtMillis> =DHT_UPDATE_INTERVAL){int chk =DHT.read21(DHT21); prevDhtMillis =currentMillis; hum =min(round(DHT.humidity)、99); temp =min(round(DHT.temperature)、99); sTMP =((temp>
 9)? "": "")+ String(temp); sHUM =((hum> 9)? "": "")+ String(hum); }} // ---------------------------------------------- ---- //バックライトをオンまたはオフに切り替えますvoidswitchBacklight(bool on){#ifdef NO_BACKLIGHT digitalWrite(LIGHT、LOW); backlightOn =true; //ソフトウェアをだまして考えさせます#else#ifdef BACKLIGHT_ALWAYS_ON digitalWrite(LIGHT、HIGH); backlightOn =true; #else digitalWrite(LIGHT、(on)?HIGH:LOW); backbackOn =オン;バックライトタイムアウト=ミリ秒()+ BACKLIGHT_TIMEOUT; #endif #endif} // ------------------------------------------- ------- //値をdisplayvoidlcdPrint(){switch(currentStyle){case STANDARD:lcdStandardLayout();に出力します。壊す;ケースDUAL_THICK:lcdDualThickLayout();壊す;ケースDUAL_BEVEL:lcdDualBevelLayout();壊す;ケースDUAL_TREK:lcdDualTrekLayout();壊す;ケースDUAL_THIN:lcdDualThinLayout();壊す;ケースワード:lcdWordLayout();壊す;ケースBIO:lcdBioRhythmLayout();壊す;ケースTHERMO:lcdThermometerLayout();壊す; }} // ---------------------------------------------- -標準レイアウト---------------------------------------------- ----------------------- void lcdStandardSetup(){} void lcdStandardLayout(){String line1 =sH + ":" + sM + ":" + sS + "| "+ aH +": "+ aM; String line2 =sDD + "/" + sMM + "/" + sYY + "|" +((alarmON &&(S&0x01))? "ALARM": ""); lcd.setCursor(0,0); //最初の行lcd.print(line1); lcd.setCursor(0,1); // 2行目lcd.print(line2); } //プログラムメモリからカスタム文字を作成するvoidcreateCharP(byte slot、byte * p){for(int i =0; i <8; i ++){customChar [i] =pgm_read_byte(p ++); } lcd.createChar(slot、customChar);} // ------------------------------------- -----------デュアルシックレイアウト------------------------------------ --------------------------------- void lcdDualThickSetup(){createCharP(C0、C_0); createCharP(C1、C_1); createCharP(C2、C_2); createCharP(C3、C_3); createCharP(BELL_CHAR、bell);} void lcdDualThickLayout(){#ifdef DUAL_THICK_12HR int h =(H> =12)? H-12:H; if(h ==0){h =12; } lcdDualThickPrintNumber(8、M、true); lcdDualThickPrintNumber(0、h、false); 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、alarm、BELL_CHAR); //ボットン右隅lcdWordShowBell(15、1、!alarm、BELL_CHAR); // bottonm右隅#endifbyte c =(S&1)? C3:32; lcd.setCursor(7,0); lcd.write(c); lcd.setCursor(7,1); lcd.write(c);} // 2行の数値を描画します// pos-xの位置を描画します// number-値を描画します// leadingZero-先行ゼロを表示するかどうかvoidlcdDualThickPrintNumber(int pos、int number、int LeadingZero){int t =数値/ 10; int u =数値%10; if(t ==0 &&!leadingZero){t =11; } lcdDualThickPrintDigit(pos、t); lcdDualThickPrintDigit(pos + 4、u);} // 2行の数字を描画します// pos-数値を描画するx位置//数値-描画する値voidlcdDualThickPrintDigit(int pos、int number){for(int y =0; y <2; y ++){lcd.setCursor(pos、y); for(int x =0; x <3; x ++){lcd.write(blockChar [number] [y] [x]); }}} // ------------------------------------------------- ---デュアルベベルレイアウト-------------------------------------------- ------------------------- void 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);} void lcdDualBevelLayout(){#ifdef DUAL_THICK_12HR int h =(H> =12)? H-12:H; if(h ==0){h =12; } lcdDualBevelPrintNumber(8、M、true); lcdDualBevelPrintNumber(0、h、false); 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、true);ブールアラーム=(S&0x01); lcdWordShowBell(15、0、alarm、65); //ボットン右隅lcdWordShowBell(15、1、!alarm、65); // bottonm右隅#endifbyte c =(S&1)? 58:32; lcd.setCursor(7,0); lcd.write(c); lcd.setCursor(7,1); lcd.write(c);} // 2行の数値を描画します// pos-xの位置を描画します// number-値を描画します// leadingZero-先行ゼロを表示するかどうかvoidlcdDualBevelPrintNumber(int pos、int number、int LeadingZero){int t =数値/ 10; int u =数値%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コブラープラス付きラズベリーパイ2ウォーターアラーム
  2. フライトシミュレータ用のArduinoを備えたLCDパネル
  3. 朝、本当にベッドから出る目覚まし時計
  4. Arduinoを使用したDIYの最もシンプルなIV9Numitron時計
  5. イスラムの祈りの時間とArduino時計
  6. 単語単位の時間の分分解能を備えた世界時計
  7. ArduinoTemp。 3.2ディスプレイを備えたモニターとリアルタイムクロック
  8. 時間設定とアラーム機能を備えたTM1637デジタル時計
  9. Arduino UNOを使用してLCDTFTスクリーンに画像を表示する!
  10. リアルタイムクロック付きArduinoOLED温度ディスプレイ
  11. DS1302RTCを備えたシンプルな目覚まし時計