検索コード

Arduinoを使ったセブンセグメントLEDディスプレイの使い方

Arduinoを使ったセブンセグメントLEDディスプレイの使い方

七セグメントLEDディスプレイは、デジタル時計やキッチン家電、エレベーターの階数表示、スコアボードなど、私たちの周りの至る所にあります。これらは数値情報を表示する最も直感的な方法の一つであり、Arduinoを使って制御することを学ぶことは、電子機器愛好家にとって基本的なスキルです。このチュートリアルでは、0から9までカウントできるシンプルでありながら多用途の七セグメントディスプレイドライバーの構築方法を案内します。これは共通陽極および共通陰極のディスプレイの両方で動作するように設計されています。このプロジェクトを、作業場用のデジタルカウンター、気象ステーション用の温度表示器、ボードゲーム用のタイマー、あるいは次の家族ゲームナイトのためのシンプルなスコアキーパーなど、さまざまな実用デバイスを構築するための基礎として利用できます。

Arduinoで七セグメントLEDディスプレイを使用する方法
Arduinoで七セグメントLEDディスプレイを使う方法

ハードウェアコンポーネント

このプロジェクトに従うためには、以下のコンポーネントが必要です。配線は簡単で、コンポーネントリストも最小限のため、初心者に優しいビルドとなっています。

  • Arduino Uno(または互換性のあるボード)
  • 7セグメントLEDディスプレイ(コモンカソードまたはコモンアノード)
  • 8個の1kΩ抵抗器(560Ωから1kΩが適しています)
  • ジャンパーワイヤー
  • ブレッドボード
    Arduinoを使って7セグメントLEDディスプレイを使用する方法
    Arduinoを使った7セグメントLEDディスプレイの使い方

配線ガイド

このプロジェクトの配線は、ディスプレイの各セグメントをArduinoのデジタルピンに接続し、各セグメントには直列に定電流抵抗が配置されています。配線の主要な違いは、共通アノードディスプレイか共通カソードディスプレイかによります。共通アノードディスプレイでは、内部LEDのすべてのアノード(陽極)が一緒に接続され、5V電源に接続されるべきです。共通カソードディスプレイでは、すべてのカソード(陰極)が一緒に接続され、グラウンドに接続されるべきです。コードは、特定のディスプレイタイプに必要な論理反転を自動的に処理するため、物理的な配線が正しいことを確認するだけで済みます。

Arduino code to update the I2C address on the VL53L0X
VL53L0XのI2Cアドレスを更新するためのArduinoコード — Arduino code to update the I2C address on the VL53L0X

ビデオで示されているように、ディスプレイのセグメントピン(AからG、および小数点)をArduinoのピン2から9に順番に接続します。各セグメントピンには1kΩの抵抗を直列に接続する必要があります。共通ピン(アノードまたはカソード、ディスプレイによります)は、それぞれ5VまたはGNDに接続する必要があります。各セグメントに個別の抵抗を使用することが重要で、共有の抵抗を使用しないようにしてください。これにより、一度に点灯するセグメントの数に関わらず、すべてのセグメントで均一な明るさが確保されます。単一の抵抗では、電流が不均等に分配され、一部の数字が他よりも暗く見える原因になります。

コードの説明

このプロジェクトのコードはゼロから書かれており、外部ライブラリは必要ありません。特定のディスプレイに合わせて簡単に構成および適応できるように設計されています。主なユーザー設定可能部分はファイルの先頭にあります。

#define type 1 // 0 for common cathode and 1 for common anode

const int displayPins[7] = {2,3,4,5,6,7,8}; // define pins
const int dicimalPoint = 9;// decimal point

最初の行が最も重要な設定です。あなたは設定しなければなりません。type変数に1共通アノードディスプレイを使用している場合は、0共通カソードディスプレイを使用している場合。この単一の値は、論理信号を反転させるべきかどうかをコードに伝え、正しいセグメントが点灯することを保証します。

次の2行は、ディスプレイに接続されたArduinoのピンを定義します。displayPins配列はセグメントAからGまでのピン番号を保持しています。dicimalPoint小数点のピンを定義します。異なるピンを使用したい場合は、これらの値を変更できますが、簡素さのために順番を保つことをお勧めします。

コードにはカスタム関数が含まれています。writeDigit(int digit), これは数を表示する主な方法です。0から9までの任意の数字を表示するために、自分のコードからこの関数を呼び出すことができます。たとえば、数字5を表示するには、単に呼び出すだけです。writeDigit(5);その関数は、正しいセグメントパターンを検索し、それに応じてピンを設定するという複雑なタスクを処理します。別のヘルパー関数、convertHighLow(int v)共通アノードと共通カソードディスプレイ間の論理変換を処理するので、内部論理について心配する必要はありません。

ライブプロジェクトデモンストレーション

配線が完了し、コードがアップロードされると、Arduinoは0から9までカウントを始め、各桁を7セグメントディスプレイに1秒間表示します。9に達すると、カウントが再開される前に小数点が3秒間点灯します。動画で示されているように、個別の抵抗を使用することで、単一のセグメント(数字1のように)を表示しているときでも、すべての7セグメント(数字8のように)を表示しているときでも、桁の明るさが一定に保たれます。これは、1つの抵抗を使用するよりも大幅な改善です。その場合、明るさに顕著な変動が生じる可能性があります。

  • [00:00] 7セグメントディスプレイの紹介
  • [00:22] セグメントディスプレイの理解
  • 共通アノードと共通カソードの配線
  • [03:25] 抵抗器を使ったステップバイステップの配線
  • [06:07] デモンストレーションと明るさの考慮事項
  • [08:26] コードの説明と設定
  • [14:25] セットアップおよびメインループ関数
  • [16:33] 結論と応用

画像

Arduinoで7セグメントLEDディスプレイを使用する方法
Arduinoで7セグメントLEDディスプレイを使用する方法
VL53L0XのI2Cアドレスを更新するためのArduinoコード
VL53L0XのI2Cアドレスを更新するためのArduinoコード
Arduinoを使ったセブンセグメントLEDディスプレイの使い方
Arduinoを使ったセブンセグメントLEDディスプレイの使い方
Arduinoを使ったセグメントLEDディスプレイの使い方
Arduinoを使ったセグメントLEDディスプレイの使い方
74HC595 LEDディスプレイ:七セグメントの解説
74HC595 LEDディスプレイ:七セグメントの解説
558-Lesson 21: Using a Seven-Segment Display | Arduino Step-by-Step Course
言語: C++
/*
 *  Robojax Arduino Step-by-Step Course
 * Lesson 21: Seven-Segment Display
 * Display number on seven-segment display with Arduino

   Please watch video instruction here: https://youtu.be/pxUjEsJQW2M
   or watch this https://youtu.be/f3GqRMQ8jYs

 * Written by Ahmad Shamshiri for Robojax (Robojax.com)
 * on December 07, 2018 at 22:34 in Ajax, Ontario, Canada

 * 
  * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


#define type 1 // 0 for common cathode and 1 for common anode

const int displayPins[7] = {2,3,4,5,6,7,8}; // define pins
const int dicimalPoint = 9;// decimal point

// array for seven-segment LED values. Do not change. 
//This is used for both common anode and common cathode
byte displayLEDs[10][7] = { 
        { 0,0,0,0,0,0,1 },  // = 0
        { 1,0,0,1,1,1,1 },  // = 1
        { 0,0,1,0,0,1,0 },  // = 2
        { 0,0,0,0,1,1,0 },  // = 3
        { 1,0,0,1,1,0,0 },  // = 4
        { 0,1,0,0,1,0,0 },  // = 5
        { 0,1,0,0,0,0,0 },  // = 6
        { 0,0,0,1,1,1,1 },  // = 7
        { 0,0,0,0,0,0,0 },  // = 8
        { 0,0,0,0,1,0,0 }   // = 9     
        }; 
/*
 * 
 * @brief Writes digit to display 
 * @param digit (integer)
 * @return no return value
 * Written by Ahmad Shamshiri on Friday, December 7, 2018 for Robojax.com
 */        
void writeDigit(int digit) {
  // Robojax Seven-Segment Display for Arduino
  Serial.print(digit);
  Serial.print(" ");

   int digitValue;
  for (int i=0; i < 7; i++) 
  {

      digitalWrite(displayPins[i], convertHighLow(displayLEDs[digit][i]));// write the HIGH or LOW (depending on the type) to output pin
      Serial.print(convertHighLow(displayLEDs[digit][i]));// print the result to the Serial monitor

  }// for i
}//writeDigit ends here

/*
 * 
 * @brief Converts HIGH and LOW based on the "type" variable value
 * if type is 1, converts the "V" to LOW, or returns it as it is if type is 0 (zero)
 * @param v (integer)
 * @return the convertedValue
 * Written by Ahmad Shamshiri (Robojax.com) on Friday, December 8, 2018 for Robojax.com
 */  
int convertHighLow(int v)
{
  int convertedValue;
    if(type ==0)
    {
      convertedValue = 1 - v;// if common anode, change the HIGH to LOW and LOW to HIGH
    }else{
      convertedValue = v;// if common cathode, keep it the same
    } 

    return convertedValue;
}

void setup() {
  // Robojax Seven-Segment Display for Arduino
//Robojax Arduino Step-by-Step Course http://robojax.com/L/?id=338  
  for(int d=0; d<8; d++)
  {
    pinMode(displayPins[d], OUTPUT);// set pin as output
    
  }
   pinMode(dicimalPoint,OUTPUT);// define a pin for decimal point
   digitalWrite(dicimalPoint,HIGH);// turn decimal point OFF. Set to LOW if common Anode and HIGH for common cathode

  Serial.begin(9600);// initialize serial monitor with 9600 baud
}// setup ends here


void loop() {
  // Robojax Seven-Segment Display for Arduino
//Robojax Arduino Step-by-Step Course http://robojax.com/L/?id=338  
 for (int i=0; i<=9 ; i++) {
   writeDigit(i); 
   Serial.println("=====");
   delay(1000);
  }
  digitalWrite(dicimalPoint,LOW);// turn decimal point ON
  delay(3000);
 // writeDigit(4);
  // delay(3000);

}// loop ends here

必要かもしれないもの

ファイル📁

他のファイル