ArduinoのOLEDウォッチ

先日、OLEDディスプレイに時刻、現在の日付、曜日、気温を表示するarduinoの時計を作成することにしました。 それの由来は、ビデオを見てください。




必要なコンポーネントのリスト:


まず、必要なライブラリをダウンロードしてインストールする必要があります。


次に、スキームに従ってすべてを接続します

画像

最初のテストスケッチをロードして、ディスプレイとクロックモジュールをテストします

スケッチ
#include <OLED_I2C.h> //     OLED myOLED(SDA, SCL, 8); extern uint8_t MegaNumbers[]; //    extern uint8_t SmallFont[]; //    #include <DS1307.h> //      DS1307 rtc(A0, A1); void setup() { myOLED.begin(); rtc.halt(false); rtc.setDOW(SUNDAY); //    rtc.setTime(12, 0, 0); //   rtc.setDate(10, 05, 2015); //   } void loop(){ myOLED.setFont(SmallFont); myOLED.print(rtc.getDOWStr(), CENTER, 0); //    String stringOne = rtc.getTimeStr(); myOLED.setFont(MegaNumbers); myOLED.print(stringOne.substring(0,2), 4, 12); //   myOLED.print("/", 51, 12); //   myOLED.print(stringOne.substring(3,5), 75, 12); //   myOLED.setFont(SmallFont); myOLED.print(rtc.getDateStr(), CENTER, 57); //   myOLED.update(); delay(500); myOLED.setFont(MegaNumbers); //   myOLED.print("-", 51, 12); myOLED.update(); delay(500); } 


スケッチを読み込んだ後、写真のように時計がディスプレイに表示されます

画像

ご覧のとおり、すべてが正常に表示されますが、曜日のロシア語の名前を追加するには、スケッチに線を追加してロシア語のフォントを初期化する必要があります

 extern uint8_t RusFont[]; 

行を追加して、曜日を決定し、ロシア語で曜日を表示できるようにします。

 switch (t.dow) { case 1: myOLED.print("GJYTLTKMYBR", CENTER, 0); break; case 2: myOLED.print("DNJHYBR", CENTER, 0); break; case 3: myOLED.print("CHTLF", CENTER, 0); break; case 4: myOLED.print("XTNDTHU", CENTER, 0); break; case 5: myOLED.print("GZNYBWF", CENTER, 0); break; case 6: myOLED.print("CE<<JNF", CENTER, 0); break; case 7: myOLED.print("DJCRHTCTYMT", CENTER, 0); break; } 

そして、まだ行をコメントアウトします

 // rtc.setDOW(MONDAY); // rtc.setTime(13, 25, 0); // rtc.setDate(27, 04, 2015); 

スケッチをリロードするときに、時間を再度設定しないでください。 その後、曜日がロシア語でディスプレイに表示されます。

画像

スケッチに線を追加して、月の表示を変更します

 switch (t.mon) { case 1: myOLED.print(String(t.date), 30, 57); myOLED.print("ZYDFHZ", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 2: myOLED.print(String(t.date), 26, 57); myOLED.print("ATDHFKZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 3: myOLED.print(String(t.date), 30, 57); myOLED.print("VFHNF", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 4: myOLED.print(String(t.date), 30, 57); myOLED.print("FGHTKZ", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 5: myOLED.print(String(t.date), 36, 57); myOLED.print("VFZ", CENTER, 57); myOLED.print(String(t.year), 82, 57); break; case 6: myOLED.print(String(t.date), 35, 57); myOLED.print("B>YZ", CENTER, 57); myOLED.print(String(t.year), 81, 57); break; case 7: myOLED.print(String(t.date), 35, 57); myOLED.print("B>KZ", CENTER, 57); myOLED.print(String(t.year), 81, 57); break; case 8: myOLED.print(String(t.date), 28, 57); myOLED.print("FDUECNF", CENTER, 57); myOLED.print(String(t.year), 90, 57); break; case 9: myOLED.print(String(t.date), 24, 57); myOLED.print("CTYNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 94, 57); break; case 10: myOLED.print(String(t.date), 26, 57); myOLED.print("JRNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 11: myOLED.print(String(t.date), 28, 57); myOLED.print("YJZ<HZ", CENTER, 57); myOLED.print(String(t.year), 90, 57); break; case 12: myOLED.print(String(t.date), 26, 57); myOLED.print("LTRF<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; } 

スケッチの碑文が理解できない文字のセットで表示される理由、この記事でOLED I2Cディスプレイ用のロシア語とウクライナ語のフォントを読む


これで、時計は写真のようになります。

画像

スケッチを編集するのが面倒だった人のために、既製のスケッチが下にあります。

スケッチ
 #include <OLED_I2C.h> OLED myOLED(SDA, SCL, 8); extern uint8_t MegaNumbers[]; extern uint8_t RusFont[]; extern uint8_t SmallFont[]; #include <DS1307.h> DS1307 rtc(A0, A1); Time t; void setup() { myOLED.begin(); rtc.halt(false); // rtc.setDOW(WEDNESDAY); // rtc.setTime(10, 02, 0); // rtc.setDate(29, 4, 2015); } void loop() { myOLED.setFont(RusFont); t = rtc.getTime(); switch (t.dow) { case 1: myOLED.print("GJYTLTKMYBR", CENTER, 0); break; case 2: myOLED.print("DNJHYBR", CENTER, 0); break; case 3: myOLED.print("CHTLF", CENTER, 0); break; case 4: myOLED.print("XTNDTHU", CENTER, 0); break; case 5: myOLED.print("GZNYBWF", CENTER, 0); break; case 6: myOLED.print("CE<<JNF", CENTER, 0); break; case 7: myOLED.print("DJCRHTCTYMT", CENTER, 0); break; } String stringOne = rtc.getTimeStr(); myOLED.setFont(MegaNumbers); myOLED.print(stringOne.substring(0, 2), 4, 12); myOLED.print("/", 51, 12); myOLED.print(stringOne.substring(3, 5), 75, 12); myOLED.setFont(RusFont); switch (t.mon) { case 1: myOLED.print(String(t.date), 30, 57); myOLED.print("ZYDFHZ", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 2: myOLED.print(String(t.date), 26, 57); myOLED.print("ATDHFKZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 3: myOLED.print(String(t.date), 30, 57); myOLED.print("VFHNF", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 4: myOLED.print(String(t.date), 30, 57); myOLED.print("FGHTKZ", CENTER, 57); myOLED.print(String(t.year), 88, 57); break; case 5: myOLED.print(String(t.date), 36, 57); myOLED.print("VFZ", CENTER, 57); myOLED.print(String(t.year), 82, 57); break; case 6: myOLED.print(String(t.date), 35, 57); myOLED.print("B>YZ", CENTER, 57); myOLED.print(String(t.year), 81, 57); break; case 7: myOLED.print(String(t.date), 35, 57); myOLED.print("B>KZ", CENTER, 57); myOLED.print(String(t.year), 81, 57); break; case 8: myOLED.print(String(t.date), 28, 57); myOLED.print("FDUECNF", CENTER, 57); myOLED.print(String(t.year), 90, 57); break; case 9: myOLED.print(String(t.date), 24, 57); myOLED.print("CTYNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 94, 57); break; case 10: myOLED.print(String(t.date), 26, 57); myOLED.print("JRNZ<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; case 11: myOLED.print(String(t.date), 28, 57); myOLED.print("YJZ<HZ", CENTER, 57); myOLED.print(String(t.year), 90, 57); break; case 12: myOLED.print(String(t.date), 26, 57); myOLED.print("LTRF<HZ", CENTER, 57); myOLED.print(String(t.year), 92, 57); break; } myOLED.update(); delay(500); myOLED.setFont(MegaNumbers); myOLED.print("-", 51, 12); myOLED.update(); delay(500); } 


さて、今、私たちはOLEDウォッチをさらに改良し、温度表示を追加します。温度表示はDS18B20温度センサーから読み取ります。

OLEDディスプレイに温度計付きの画像と度アイコンを表示するには、温度計の画像付きの画像を選択し、グラフィカルエディタを使用してterm.gifという名前のGIF形式で保存し、度アイコン付きの画像で同じ操作を行います-grad.gifとして保存します。

画像は2色(白と黒)であり、利用可能な画像形式はpng、jpg、gif

サイズが19×40ピクセルのterm.bmp画像と、13×12ピクセルのgrad.bmp画像があります。 次に、オンラインサービスwww.rinkydinkelectronics.comを使用して2つの写真を変換する必要があります

画像

画像ファイルを選択し、[ ファイルの作成 ] クリックします

画像

ここをクリックして、ファイルをダウンロードしgrad.cファイルをスケッチと共にフォルダーに保存します。他の画像でも同じ操作を行います。 スケッチを保存して閉じます。 再度開くと、画像ファイルを含むタブがさらに2つあります。

画像

その後、画像ファイルを初期化する2行をスケッチに追加します。

 extern uint8_t term[]; extern uint8_t grad[]; 


そして、OLED画面に画像を表示し、線を追加します

  myOLED.drawBitmap(4, 12, term, 19, 40); myOLED.drawBitmap(92, 12, grad, 13, 12); 


2サイクルのスケッチに追加します。 最初のサイクルでは、時間を表示します-それをvoid watch()と呼びましょう 2番目のループは、温度void temp()を読み取って表示します。

メインループではvoid loop(); サイクルの回転のために数行のコードを書く

  if (x >= 10) { temp(); x=0; } else { watch(); } x++; 


ループ内でvoid temp(); 温度を読み取って表示するためのコードを書く

 for(int x = 0; x < 10; x++){ byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); delay(150); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); int Temp = (data[1] << 8) + data[0]; Temp = Temp >> 4; String stringOne = rtc.getTimeStr(); myOLED.clrScr(); myOLED.setFont(SmallFont); myOLED.print(stringOne.substring(0, 5), 98, 0); myOLED.print(rtc.getDateStr(), 0, 0); myOLED.setFont(RusFont); myOLED.print("NTVGTHFNEHF", CENTER, 57); myOLED.drawBitmap(4, 12, term, 19, 40); myOLED.setFont(MegaNumbers); myOLED.print(String(Temp), CENTER, 12); myOLED.drawBitmap(92, 12, grad, 13, 12); myOLED.update(); myOLED.clrScr(); } 

ループ内でvoid watch(); 時間の表示を担当するコードを記述します

スケッチを記入した後、OLED時計は最初に時間を表示し、次に記事の冒頭のビデオのように温度を表示する必要があります。

画像

完全なスケッチはOLED_watch_temp.rarからダウンロードできます。

記事のディスカッションは、グループvk.comで利用できます。

Source: https://habr.com/ru/post/J257659/


All Articles