Arduino Nano互換品で7セグメントLEDを使う その2
Arduino Nano互換品で7セグメントLEDを使う方法です。
シフトレジスタを使う方が多いようですが、この方法では不要です。
ちょっとしたテクニックですが、「pinMode(A0, OUTPUT);」のように指定すれば、アナログピンをデジタルピンとして使用できます。
また、前の記事では3桁ですが今回は最終的に時計にしたいと思い4桁に増やしました。
完成品はこんな感じです。数字が縦に並んでいてみづらいですが、23時16分を表示しています。
まずは、4桁それぞれに違う数字を表示するスケッチです。
今回は「1234」を表示するスケッチになります。
「1234」は変数int seg1~4で指定しています。
簡単に説明すると、1表示→5ms待つ→1消す→2表示→5ms待つ→2消す→3表示→5ms待つ→3消す→4表示→5ms待つ→4消す→1表示…
とずっとループしているだけです。
「int delaytime = 5;」のところを1000とかに変更してもらうと、何をやってるか簡単に理解できると思います。
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 |
int a = 2; //7セグメントLEDのaピン int b = 3; //7セグメントLEDのbピン int c = 4; //7セグメントLEDのcピン int d = 5; //7セグメントLEDのdピン int e = 6; //7セグメントLEDのeピン int f = 7; //7セグメントLEDのfピン int g = 8; //7セグメントLEDのgピン int seg1 = A0; //1桁目のANODE int seg2 = A1; //2桁目のANODE int seg3 = A2; //3桁目のANODE int seg4 = A3; //3桁目のANODE int delaytime = 5; int digit1 = 1; int digit2 = 2; int digit3 = 3; int digit4 = 4; 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}, }; void setup() { 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); } //数字の表示 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]); } void loop() { digitalWrite(seg3, LOW); LightNumber(digit1); digitalWrite(seg4, LOW); digitalWrite(seg1, HIGH); digitalWrite(seg2, LOW); delay(delaytime); digitalWrite(seg1, LOW); LightNumber(digit2); digitalWrite(seg2, HIGH); digitalWrite(seg3, LOW); digitalWrite(seg4, LOW); delay(delaytime); digitalWrite(seg2, LOW); LightNumber(digit3); digitalWrite(seg3, HIGH); digitalWrite(seg4, LOW); digitalWrite(seg1, LOW); delay(delaytime); digitalWrite(seg3, LOW); LightNumber(digit4); digitalWrite(seg4, HIGH); digitalWrite(seg1, LOW); digitalWrite(seg2, LOW); delay(delaytime); } |
部品箱を漁ってたら7セグが4個揃ったので、DS3231も使って時計にしてみました。
DS3231に関するスケッチは過去のものを流用しています。
スケッチは下記です。
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 |
int a = 2; //7セグメントLEDのaピン int b = 3; //7セグメントLEDのbピン int c = 4; //7セグメントLEDのcピン int d = 5; //7セグメントLEDのdピン int e = 6; //7セグメントLEDのeピン int f = 7; //7セグメントLEDのfピン int g = 8; //7セグメントLEDのgピン int seg1 = A0; //1桁目のANODE int seg2 = A1; //2桁目のANODE int seg3 = A2; //3桁目のANODE int seg4 = A3; //3桁目のANODE int delaytime = 5; 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}, }; //DS3231準備 #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; #include void setup() { 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); Wire.begin(); } //数字の表示 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(); 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); } |
スポンサードリンク
ディスカッション
コメント一覧
まだ、コメントがありません