Bagaimana cara menggunakan anoda umum 7-segmen, tampilan 4 digit?

9

Silakan ambil pertanyaan ini sebagai contoh untuk jawaban (saya sendiri) di bawah ini.

Saya memiliki 7 segmen, layar LED 4 digit, tetapi saya tidak tahu bagaimana cara menghubungkannya.

Saya tidak mengerti perbedaan antara anoda / katoda umum, dan saya tidak memiliki 2 pin per LED, yang aneh. Baru-baru ini, sebuah pertanyaan tentang "7 segmen 4 digit anoda umum" dihapus. Pada saat itu saya sedang mengetik jawaban.

Padahal, saya masih ingin membagikan jawaban saya dengan Anda, atau orang yang menanyakannya. Harap verifikasi / perbarui jawaban saya dengan informasi lebih lanjut. Secara khusus, dapatkah seseorang menambahkan kode kerja, saya tidak bisa saat ini.

Paul
sumber
Hanya penasaran. Apakah Anda memposting pertanyaan sehingga Anda dapat menjawabnya?
PhillyNJ
Sebenarnya ada opsi untuk itu. Namun, komentar dalam pertanyaan saya juga menceritakan "kisah latar belakang". Saya menjawab pertanyaan, yang terhapus. Dan saya merasa perlu mengirimkan jawaban saya. Jadi ya, saya lakukan. Tapi ini metode yang valid dan saya punya jawaban sebelum pertanyaan. Jadi masuk akal bagi saya. Jika Anda memiliki pertanyaan (dan jawaban) yang sangat bagus, saya hanya bisa mendorong Anda untuk melakukan hal yang sama, karena mungkin bermanfaat bagi seseorang di beberapa titik.
Paul

Jawaban:

7

Persis sebagai pelengkap jawaban Paul, saya menulis sebuah program singkat untuk menunjukkan bagaimana menggerakkan tampilan 7-digit 4-digit sosoknya:

skema pengkabelan

Ini sebenarnya adalah tampilan katoda umum, sehingga program mengasumsikan itu, serta kabel khusus dari gambar tersebut. Bagian yang menarik adalah refresh_display()fungsinya, yang harus disebut secara berkala. Algoritma adalah sebagai berikut:

  • kendalikan 7 anoda dengan sinyal yang sesuai untuk salah satu digit yang ingin kami tampilkan
  • atur HIGHoutput yang mengontrol katoda digit itu melalui transistor NPN
  • tunggu 2,5 ms (untuk kecepatan refresh 100 Hz)
  • mengatur LOWoutput pengendali katoda
  • pindah ke digit berikutnya.

Perlu dicatat bahwa penantian dilakukan tanpa memblokir CPU, dengan menggunakan teknik yang dijelaskan dalam tutorial Blink Without Delay Arduino. Inilah programnya:

const int NB_DIGITS     = 4;  // 4-digit display
const int FIRST_ANODE   = 2;  // anodes a..g on pins 2..8
const int FIRST_CATHODE = 9;  // cathodes, right to left, on pins 9..12

// Digits to display, from right to left.
uint8_t digits[NB_DIGITS];

// Set all the used pins as outputs.
void init_display()
{
    for (int i = 0; i < 7; i++)
        pinMode(FIRST_ANODE + i, OUTPUT);
    for (int i = 0; i < NB_DIGITS; i++)
        pinMode(FIRST_CATHODE + i, OUTPUT);
}

// This should be called periodically.
void refresh_display()
{
    // Our 7-segment "font".
    static const uint8_t font[10] = {
        //abcdefg
        0b1111110, // 0
        0b0110000, // 1
        0b1101101, // 2
        0b1111001, // 3
        0b0110011, // 4
        0b1011011, // 5
        0b1011111, // 6
        0b1110000, // 7
        0b1111111, // 8
        0b1111011  // 9
    };

    // Wait for 2.5 ms before switching digits.
    static uint32_t last_switch;
    uint32_t now = micros();
    if (now - last_switch < 2500) return;
    last_switch = now;

    // Switch off the current digit.
    static uint8_t pos;
    digitalWrite(FIRST_CATHODE + pos, LOW);

    // Set the anodes for the next digit.
    pos = (pos + 1) % NB_DIGITS;
    uint8_t glyph = font[digits[pos]];
    for (int i = 0; i < 7; i++)
        digitalWrite(FIRST_ANODE + i, glyph & 1 << (6-i));

    // Switch digit on.
    digitalWrite(FIRST_CATHODE + pos, HIGH);
}

/***********************************************************************
 * Example usage.
 */

void setup()
{
    init_display();
}

void loop()
{
    uint32_t now = millis();

    // Change the number displayed every second.
    static uint32_t last_change;
    if (now - last_change >= 1000) {
        digits[3] = digits[2];
        digits[2] = digits[1];
        digits[1] = digits[0];
        digits[0] = (digits[0] + 1) % 10;
        last_change = now;
    }

    refresh_display();
}

Paul memberikan tautan ke tutorial tentang Parallax yang menyarankan penggunaan perpustakaan Multiplex7Seg Arduino. Pustaka itu lebih umum daripada kode contoh di atas, karena tidak membuat asumsi tentang pin yang digunakan. Tetapi perbedaan besar antara perpustakaan dan kode ini adalah cara pengaturan waktu:

  • Perpustakaan didorong oleh Timer 2 meluap interupsi. Ini harus memberikan waktu yang sangat mantap, dengan biaya satu timer didedikasikan untuk pekerjaan ini.
  • Kode di atas cukup bergantung pada panggilan pengguna refresh_display(). Itu tidak memerlukan sumber daya perangkat keras khusus, tetapi tidak cocok dengan program yang membutuhkan waktu terlalu lama loop(): tidak akan suka Anda menelepon delay().
Edgar Bonet
sumber
Inilah sebabnya saya suka hal-hal open-source. Anda dapat berbagi beban kerja dengan seluruh dunia dan menciptakan sesuatu yang sangat menyenangkan. Yang kemudian dibagikan dengan seluruh dunia lagi :) Anda dapat belajar banyak dari pengembang lain dan pengetahuan itu akan gigih dan tidak hanya disembunyikan dari orang lain.
Paul
Saya punya pertanyaan tentang nilai resistor basis Tranistor. Saya punya masalah besar dengan menghitung nilai resistor. Apa alasan menggunakan resistor 4.7K dalam empat transistor 2N2222? Jika satu segmen mengkonsumsi 10mA maka akan ada maksimum menggambar saat ini 80mA untuk semua segmen termasuk DP. Jika V (BE * sat) = 1.3v dan I (B) = 15mA maka 300ohm akan cukup. Apakah ada yang salah dengan perhitungan saya?
maruf
@maruf: I_B minimum yang diperlukan adalah I_C yang diharapkan dibagi dengan gain transistor minimum. Jika Anda ingin 80 mA pada kolektor dan mengharapkan kenaikan minimal 100 (mungkin optimis, saya tidak memeriksa datasheet), maka Anda memerlukan setidaknya 80/100 = 0,8 mA di pangkalan. Kemudian nilai maksimum dari resistor dasar adalah drop tegangan melintasinya (sekitar 5 V - 0,7 V) dibagi dengan arus itu, atau sekitar 5,3 kΩ.
Edgar Bonet
5

Saya akan mencoba dan membawa Anda melalui dasar-dasar lengkap LED, dll. Karena tampilan 4-segmen 7-digit adalah kombinasi dari beberapa "teknik LED".

LED kabel

LED, atau Light Emitting Diode, adalah salah satu hal yang menyenangkan dari Arduino.

Pada dasarnya, mereka mudah digunakan, daya mereka dan mereka akan menyala.

Mereka dapat menjengkelkan, karena mereka memiliki semacam polaritas, yang berarti bahwa mereka hanya akan bekerja ketika Anda menghubungkannya dengan benar. Jika Anda membalikkan tegangan positif dan negatif, mereka tidak akan menyala sama sekali.

Mengganggu karena itu, itu juga sangat berguna.

Cathode vs Anode

Pada LED tradisional, lead panjang adalah (+), Anode. Pemimpin lainnya adalah (-) Katoda.

"Atau, jika seseorang memangkas kakinya, coba cari tepi rata pada casing luar LED. Pin yang terdekat dengan tepi datar akan menjadi negatif, pin katoda." - Sparkfun

Sumber: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity

Sparkfun

Kabel dasar

Saya tidak yakin apakah ini benar, karena saya merobek gambar dari internet.

Kabel LED dasar

Pengkabelan LED cukup mudah, Anoda (+) terhubung ke tegangan positif, lebih disukai melalui resistor pembatas arus. Katoda (-) terhubung ke ground (dengan resistor pembatas arus, jika Anda tidak memilikinya di sisi positif).

Resistor pembatas arus akan menghindari LED dari korslet, merusak LED atau Mikrokontroler / Arduino.

Beberapa LED, matriks, led RGB

Dengan beberapa LED, Anda sering memilikinya dengan sisi positif terhubung (+), "common Anode" atau semua terhubung ke (-) "common Cathode".

Pada dasarnya ini akan menjadi seperti ini.

RGB umum katoda / anoda

Untuk katoda umum, Anda memasok arus ke pin yang ingin Anda miliki.

Untuk anoda umum, Anda menenggelamkan arus melalui LED.

Multiplexing (beberapa digit, 7-segmen)

Anda harus memeriksa tutorial parallax: http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo

Parallax 4digit7seg

Ketika Anda memiliki banyak LED, sering kali pintar untuk "multiplex" mereka. Biasanya Anda melalui "kelompok" LED dengan cepat, sehingga sepertinya mereka semua menyala pada saat yang sama.

Biasanya Anda menenggelamkan arus dari kolom LED dan memasok arus ke masing-masing LED berturut-turut.

Atau, Anda memasok arus ke kolom LED dan menenggelamkan arus dari masing-masing LED berturut-turut.

Sehingga Anda dapat memilih kolom mana yang akan diaktifkan, dan LED mana dari kolom itu yang menyala. Mengubah kolom / baris ini dengan cepat akan memungkinkan Anda untuk mengontrol beberapa LED dengan pin yang jauh lebih sedikit.

Bahkan ada pengontrol tampilan untuk ini, jika Anda tidak ingin mengurus peralihan di perangkat lunak Anda.

Jadi, ketika Anda memiliki 4 digit, segmen 7 multiplex, anoda umum

Diagram akan lebih seperti ini:

masukkan deskripsi gambar di sini

http://www.mytutorialcafe.com/Microcontroller%20Application%20C%207segmen.htm

Paul
sumber