Arduino Nano互換品で7セグメントLED時計作成
Arduino Nano互換品で7セグメントLED時計作成しました。
今回は赤外線LEDも使用して、設定した時刻にシーリングライトがONする機能も付けました。
赤外線受信器とスイッチも付けましたが、今回は使用していません。
赤外線の使い方は過去の記事を参照ください。
Arduino Nano互換品で赤外線受信、送信
裏側はこんな感じです。
配線が沢山ありますが、特に過去ブログ内容からそんなに目新しいことはしていませんので配線図は省略します。
たぶん、プログラム読んでもらえれば分かると思います。
DS3231はアマゾンレビュー等に記載されているように抵抗を取り外して電池を入れています。
構成部品はこんな感じです。
ケースはカセットテープ用を加工しました。ダイソーやハードオフで手に入ります。
電源供給用にmicro USB Type-Bのコネクタを取り付けました。
これでスマホを充電する感じで手軽に電源を供給できます。
スケッチは下記になります。
設定した時刻にシーリングライトがONする時の7セグ表示処理がしょぼいです。
7セグにonとか表示させることは面倒なので断念しました。
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 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 |
//タイマー時間 int timea = 6; //時 int timeb = 20; //分 int a = 2; //7セグメントLEDのa接続ピン int b = 4; //7セグメントLEDのb接続ピン int c = 5; //7セグメントLEDのc接続ピン int d = 6; //7セグメントLEDのd接続ピン int e = 7; //7セグメントLEDのe接続ピン int f = 8; //7セグメントLEDのf接続ピン int g = 9; //7セグメントLEDのg接続ピン int seg1 = A0; //1桁目のANODE int seg2 = A1; //2桁目のANODE int seg3 = A2; //3桁目のANODE int seg4 = A3; //3桁目のANODE int bl = 12; //点滅部接続ピン int delaytime = 5; //7セグ各桁間の待ち時間 //7セグ表示設定 bool Num_Array[10][7] = { {0, 0, 0, 0, 0, 0, 1}, {1, 0, 0, 1, 1, 1, 1}, {0, 0, 1, 0, 0, 1, 0}, {0, 0, 0, 0, 1, 1, 0}, {1, 0, 0, 1, 1, 0, 0}, {0, 1, 0, 0, 1, 0, 0}, {0, 1, 0, 0, 0, 0, 0}, {0, 0, 0, 1, 1, 0, 1}, {0, 0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0}, }; //赤外線使用 #include IRsend irsend; int khz = 38; // 38kHz carrier frequency for the NEC protocol //赤外線の送信信号(パナソニックシーリングライトON) unsigned int irSignal[] = {3450, 1750, 400, 450, 450, 400, 500, 1250, 450, 1250, 450, 450, 450, 1250, 450, 450, 450, 400, 450, 400, 450, 1300, 450, 400, 450, 450, 400, 1300, 450, 450, 400, 1300, 450, 450, 400, 1300, 450, 400, 500, 400, 450, 1250, 450, 450, 450, 400, 450, 400, 450, 400, 500, 400, 450, 400, 450, 1300, 450, 1300, 450, 400, 450, 1300, 400, 450, 450, 400, 450, 1300, 450, 400, 450, 1250, 500, 400, 450, 400, 450, 1300, 450, 400, 450, 450, 400 }; //DS3231準備 #include #define RTC_addr 0x68 #define ASCII_ZERO 48 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; const char *Week[] = {"", "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; int hun = 0; int ji = 0; int flag = 0; void setup() { Wire.begin(); pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(seg1, OUTPUT); pinMode(seg2, OUTPUT); pinMode(seg3, OUTPUT); pinMode(seg4, OUTPUT); pinMode(bl, OUTPUT); } //数字の表示 void LightNumber(int number) { digitalWrite(a, Num_Array[number][0]); digitalWrite(b, Num_Array[number][1]); digitalWrite(c, Num_Array[number][2]); digitalWrite(d, Num_Array[number][3]); digitalWrite(e, Num_Array[number][4]); digitalWrite(f, Num_Array[number][5]); digitalWrite(g, Num_Array[number][6]); } //DS3231_日時を取得 void RTC_DS3231(void) { 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(); hun = ((int) (mini >> 4)) * 10 + (int) (mini & B00001111); ji = ((int) (bitRead(hour, 5) * 2 + bitRead(hour, 4))) * 10 + (int)(hour & B00001111); 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; } } //表示する数字の分解と桁の指定 int NumSwitching(int number, int s) { int LightNum; switch (s) { case 1: LightNum = number % 10; break; case 2: LightNum = number / 10; } return LightNum; } void loop() { //DS3231から時刻を読み出して変数を更新する RTC_DS3231(); //点滅 if ( sec % 2 == 0 ) { digitalWrite(bl, HIGH); } else { digitalWrite(bl, LOW); } //設定した時刻で赤外線送信 if (ji == timea && hun == timeb) { irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array. } //7セグ4桁に時刻を表示 digitalWrite(seg3, LOW); LightNumber(NumSwitching(ji, 2)); digitalWrite(seg4, LOW); digitalWrite(seg1, HIGH); digitalWrite(seg2, LOW); delay(delaytime); digitalWrite(seg1, LOW); LightNumber(NumSwitching(ji, 1)); digitalWrite(seg2, HIGH); digitalWrite(seg3, LOW); digitalWrite(seg4, LOW); delay(delaytime); digitalWrite(seg2, LOW); LightNumber(NumSwitching(hun, 2)); digitalWrite(seg3, HIGH); digitalWrite(seg4, LOW); digitalWrite(seg1, LOW); delay(delaytime); digitalWrite(seg3, LOW); LightNumber(NumSwitching(hun, 1)); digitalWrite(seg4, HIGH); digitalWrite(seg1, LOW); digitalWrite(seg2, LOW); delay(delaytime); } |
スポンサードリンク
ディスカッション
コメント一覧
まだ、コメントがありません