Arduino Nano互換品でデジタル時計を自作
Arduino Nano互換品でデジタル時計を作成しました。
【準備したもの】
・Arduino Nano互換品
・DS3231 AT24C32 高精度リアルタイムクロックモジュール
・GY-68 BMP180 大気圧センサーモジュール
・128×64 OLED LCDディスプレイ SSD1306
・ブレッドボード、ジャンパーピン等
1.DS3231の準備
今回はアマゾンから購入しましたが、レビュー等に記載されているように抵抗を取り外して電池を入れました。
時刻データは下記2か所のサイトを参考にRaspberry Piで書き込みました。
最初書き込んだ時9時間ずれていたので、何故ずれたのか分かりませんでしたが、
UTCからLocal Timeへの切り替えをしたらうまくいきました。
http://ja3rua.ddns.net/html2/raspberrypi/raspberrypi46.html
http://ubiqlog.com/archives/11842
2.組み立て
はんだごてを使用し、各部品にピンを付けます。
その後、Arduino Nano互換品から各モジュールに4本の配線を繋ぎます。
5V→VCC
GND→GND
A4→SDA
A5→SCL
です。
今回購入したものはレギュレータ付きでしたので、5Vに繋いでも問題ありませんでしたが、
ものによっては3.3Vへ繋ぐべきものもあるようなのでご注意ください。
3.スケッチ(プログラム)を書く為の準備
arduino公式サイトから「arduino-1.8.8-windows.zip」をダウンロードして準備しました。
また、Arduino Nano互換品を使用するためにWCH社のCH340Gのドライバ、
「Windows-CH340-Driver.zip」をダウンロードして準備しました。
ドライバはスイッチサイエンスのウェブサイトから入手。
「arduino.exe」を起動した後、「ツール」→「ライブラリを管理」から
Adafruit社のSSD1306とBMP180に関するライブラリをいくつかインストールしました。
おそらく、「Adafruit_GFX.h」「Adafruit_SSD1306.h」「Adafruit_BMP085.h」だと思いますが、
必死でしたので詳しくは憶えておりません。
4.スケッチ(プログラム)作成
ネット上の先人達をものすごく参考にして、下記のスケッチ(プログラム)を作成しました。
素人が作成しておりますので、よりよい作成方法があるかもしれません。
文字表示位置を直接指定し、マジックナンバー状態になっててすいません。
——————————————————————————-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
#include //OLED準備 #include #include #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 #define OLED_RESET 4 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //DS3231準備 #define RTC_addr 0x68 #define ASCII_ZERO 48 //BMP180準備 #include Adafruit_BMP085 bmp; void setup() { //OLED準備 display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.display(); //BMP180準備 Serial.begin(9600); if (!bmp.begin()) { while (1) {} } } //DS3231_日時を取得 void RTC_DS3231(void) { char* pchDate = "1990/01/01"; char* pchTime = "00:00:00"; byte sec = 0; byte mini = 0; byte hour = 0; byte day = 0; byte date = 0; byte month = 0; byte year = 0; Wire.beginTransmission(RTC_addr); Wire.write(0x00); Wire.endTransmission(); Wire.requestFrom(RTC_addr, 7); if (Wire.available() >= 7) { sec = Wire.read(); mini = Wire.read(); hour = Wire.read(); day = Wire.read(); date = Wire.read(); month = Wire.read(); year = Wire.read(); pchTime[0] = bitRead(hour, 5) * 2 + bitRead(hour, 4) + ASCII_ZERO; pchTime[1] = (hour & B00001111) + ASCII_ZERO; pchTime[3] = (mini >> 4) + ASCII_ZERO; pchTime[4] = (mini & B00001111) + ASCII_ZERO; pchTime[6] = (sec >> 4) + ASCII_ZERO; pchTime[7] = (sec & B00001111) + ASCII_ZERO; pchDate[0] = '2'; pchDate[1] = '0'; pchDate[2] = (year >> 4) + ASCII_ZERO; pchDate[3] = (year & B00001111) + ASCII_ZERO; pchDate[5] = bitRead(month, 4) + ASCII_ZERO; pchDate[6] = (month & B00001111) + ASCII_ZERO; pchDate[8] = (date >> 4) + ASCII_ZERO; pchDate[9] = (date & B00001111) + ASCII_ZERO; } display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(5, 5); display.println(pchDate); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(5, 13); display.println(pchTime); } //DS3231_温度を取得 void Temp_DS3231() { byte tMSB, tLSB; float temp3231; Wire.beginTransmission(RTC_addr); Wire.write(0x11); Wire.endTransmission(); Wire.requestFrom(RTC_addr, 2); if (Wire.available()) { tMSB = Wire.read(); tLSB = Wire.read(); temp3231 = ((((short)tMSB << 8) | (short)tLSB) >> 6) / 4.0; } display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(5, 21); display.print(temp3231, 1); display.println(" C"); } ////BMP180温度、高度を取得 void bmp180() { display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(5, 37); display.print(bmp.readTemperature(), 1); display.println(" C"); display.setCursor(5, 45); display.print(bmp.readPressure() / 100); display.println(" hPa"); } //枠の作成 void frame() { display.drawRect(0, 0, 127, 63, WHITE); } //繰り返し実行される指令 void loop() { RTC_DS3231(); Temp_DS3231(); bmp180(); frame(); display.display(); display.clearDisplay(); } |
——————————————————————————-
5.Arduino Nano互換品へ書き込む
アマゾンのレビュー等に記載されているCH340Gのドライバに関するセッティングをして、スケッチを書き込んで完成。
写真のモニタの様に表示されたら動作確認終了。
上に表示された温度がDS3231で測定した温度、下に表示された温度がBMP180で測定した温度です。
DS3231は分解能が0.25℃の為、小数第一位の値は参考程度で。
あとは、文字サイズ、文字表示位置調整、四角を何個か書き込んだりして時計らしくしたら完成です。
電子工作素人でしたが、ネット情報を駆使して何とか形にすることができました。
ほとんど「HiLetgo JP」から購入しました。
Arduino Uno純正品が3200円くらいですが、互換品だと同等の値段で予備の本体やセンサー類まで購入できてしまい、
想像していたより安くてびっくりしました。
スポンサードリンク