วิธีการใช้งานทั่วไปหน้าจอ 7-เซ็กเมนต์ 4 หลักขั้วบวก?


9

โปรดใช้คำถามนี้เป็นตัวอย่างสำหรับคำตอบ (ของฉัน) ด้านล่าง

ฉันมีจอแสดงผล LED 7 ส่วน 4 หลัก แต่ฉันไม่มีความคิดเกี่ยวกับวิธีเชื่อมต่อ

ฉันไม่เข้าใจความแตกต่างระหว่างขั้วบวก / แคโทดทั่วไปและฉันไม่มี 2 พินต่อ LED ซึ่งแปลก ค่อนข้างเร็ว ๆ นี้คำถามเกี่ยวกับ "ขั้วบวกทั่วไป 7 ส่วน 4 หลัก" ถูกลบ ในขณะนั้นฉันกำลังพิมพ์คำตอบ

แม้ว่าฉันยังต้องการแบ่งปันคำตอบของฉันกับคุณหรือคนที่ถาม โปรดยืนยัน / อัปเดตคำตอบของฉันด้วยข้อมูลเพิ่มเติม โดยเฉพาะใครบางคนสามารถเพิ่มรหัสทำงานฉันไม่สามารถในขณะนี้


แค่สงสัย. คุณโพสต์คำถามเพื่อให้คุณสามารถตอบได้หรือไม่
PhillyNJ

มีตัวเลือกสำหรับสิ่งนั้น อย่างไรก็ตามความคิดเห็นในคำถามของฉันก็บอกว่า "เรื่องราวเบื้องหลัง" ฉันตอบคำถามที่ถูกลบไปแล้ว และรู้สึกว่าจำเป็นต้องโพสต์คำตอบของฉันไม่เคย ใช่ฉันทำ แต่มันเป็นวิธีที่ถูกต้องและฉันได้รับคำตอบก่อนคำถาม ดังนั้นมันสมเหตุสมผลสำหรับฉัน หากคุณมีคำถามที่ดีจริงๆ (และตอบ) ฉันขอแนะนำให้คุณทำเช่นเดียวกันเพราะอาจเป็นประโยชน์กับบางคน
พอล

คำตอบ:


7

เช่นเดียวกับส่วนเติมเต็มของคำตอบของ Paul ฉันได้เขียนโปรแกรมสั้น ๆ เพื่อแสดงวิธีการแสดงตัวเลข 7 หลัก 4 ส่วน:

แผนผังการเดินสาย

นี่คือการแสดงแคโทดทั่วไปดังนั้นโปรแกรมสันนิษฐานว่าเช่นเดียวกับการเดินสายเฉพาะของรูป ส่วนที่น่าสนใจคือrefresh_display()ฟังก์ชั่นซึ่งควรจะเรียกเป็นระยะ อัลกอริทึมมีดังนี้:

  • ขับ 7 anodes ด้วยสัญญาณที่เหมาะสมสำหรับหนึ่งในตัวเลขที่เราต้องการแสดง
  • ตั้งHIGHเอาท์พุทที่ควบคุมแคโทดของตัวเลขผ่านทรานซิสเตอร์ NPN
  • รอ 2.5 ms (สำหรับอัตราการรีเฟรชที่ 100 Hz)
  • ตั้งค่าLOWเอาต์พุตควบคุมแคโทด
  • ย้ายไปที่ตัวเลขถัดไป

ควรสังเกตว่าการรอจะทำโดยไม่ปิดกั้น CPU โดยใช้เทคนิคที่อธิบายไว้ในการกวดวิชาBlink Without Delay Arduino นี่คือโปรแกรม:

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();
}

พอลได้ให้ลิงก์ไปยังบทช่วยสอนเกี่ยวกับ Parallax ที่แนะนำให้ใช้ ห้องสมุดMultiplex7Seg Arduino ไลบรารี่นั้นกว้างกว่าโค้ดตัวอย่างด้านบนเนื่องจากมันไม่ได้ตั้งสมมติฐานเกี่ยวกับพินที่ใช้ แต่ความแตกต่างใหญ่ระหว่างไลบรารีและรหัสนี้คือวิธีการจัดการเวลา:

  • ห้องสมุดถูกขับเคลื่อนโดยการขัดจังหวะตัวตั้งเวลาล้น 2 สิ่งนี้ควรให้เวลาที่มั่นคงอย่างมากโดยมีเวลาหนึ่งตัวสำหรับงานนี้
  • รหัสข้างต้นอาศัยการโทรของผู้ใช้refresh_display()บ่อยครั้ง มันไม่จำเป็นต้องทุ่มเททรัพยากรฮาร์ดแวร์ แต่มันก็ไม่ได้เล่นดีกับโปรแกรมที่ใช้เวลานานเกินไปที่จะloop(): delay()มันจะไม่เหมือนที่คุณเรียก

นี่คือเหตุผลที่ฉันชอบสิ่งโอเพนซอร์ซ คุณสามารถแบ่งปันภาระงานกับส่วนที่เหลือของโลกและสร้างสิ่งที่ดีจริงๆ ซึ่งจะถูกแชร์กับส่วนที่เหลือของโลกอีกครั้ง :) คุณสามารถเรียนรู้มากมายจากนักพัฒนาคนอื่น ๆ และความรู้นั้นจะคงอยู่และไม่เพียงซ่อนตัวจากคนอื่น
พอล

ฉันมีคำถามในใจเกี่ยวกับค่าตัวต้านทานพื้นฐานของ Tranistor ฉันมีปัญหาอย่างมากกับการคำนวณค่าตัวต้านทาน อะไรคือสาเหตุของการใช้ตัวต้านทาน 4.7K ในทรานซิสเตอร์ 2N2222 สี่ตัว ถ้าเซ็กเมนต์เดียวกิน 10mA ดังนั้นจะมีการวาดภาพกระแสสูงสุด 80mA สำหรับทุกเซ็กเมนต์รวมถึง DP ถ้า V (BE * sat) = 1.3v และ I (B) = 15mA ดังนั้น 300ohm จะเพียงพอ มีการคำนวณของฉันผิดหรือเปล่า?
maruf

@maruf: I_B ขั้นต่ำที่ต้องการคือ I_C ที่คาดไว้หารด้วยกำไรขั้นต่ำของทรานซิสเตอร์ หากคุณต้องการ 80 mA บนตัวสะสมและคาดว่าจะได้รับอย่างน้อย 100 (อาจเป็นแง่ดีฉันไม่ได้ตรวจสอบแผ่นข้อมูล) ดังนั้นคุณต้องมีอย่างน้อย 80/100 = 0.8 mA บนฐาน จากนั้นค่าสูงสุดของตัวต้านทานพื้นฐานคือแรงดันตกคร่อม (ประมาณ 5 V - 0.7 V) หารด้วยกระแสนั้นหรือประมาณ 5.3 kΩ
Edgar Bonet

5

ฉันจะลองและนำคุณไปสู่พื้นฐานที่สมบูรณ์ของ LED และอื่น ๆ เนื่องจากจอแสดงผล 7 หลัก 7 ส่วนนั้นเป็นการผสมผสานของ "เทคนิค LED" หลายอย่าง

การเดินสายไฟ LED ของ

LED หรือ Light Emitting Diodes เป็นหนึ่งในสิ่งที่สนุกของ Arduino

โดยพื้นฐานแล้วพวกมันใช้งานง่ายเพิ่มพลังให้พวกมันและพวกมันก็จะสว่างขึ้น

พวกมันน่ารำคาญเพราะพวกมันมีขั้วบางชนิดซึ่งหมายความว่าพวกมันจะทำงานได้ก็ต่อเมื่อคุณต่อสายให้ถูกต้อง หากคุณย้อนกลับแรงดันไฟฟ้าบวกและลบมันจะไม่สว่างขึ้นเลย

น่ารำคาญอย่างที่มันเป็นมันค่อนข้างมีประโยชน์

แคโทดกับแอโนด

บน LED แบบดั้งเดิมตะกั่วที่มีความยาวคือ (+), แอโนด สิ่งที่นำไปสู่การเป็นแคโทด (-)

"หรือถ้ามีคนขลิบขาลองหาขอบแบนบนปลอกด้านนอกของหลอด LED ขาที่ใกล้ที่สุดขอบแบนจะเป็นขั้วลบแคโทด" - Sparkfun

ที่มา: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity

Sparkfun

สายไฟพื้นฐาน

ฉันไม่แน่ใจว่าสิ่งนี้ถูกต้องหรือไม่เพราะฉันฉีกรูปจากอินเทอร์เน็ต

การเดินสายไฟ LED พื้นฐาน

การเดินสายไฟ LED นั้นค่อนข้างง่าย Anode (+) เชื่อมต่อกับแรงดันไฟฟ้าบวกโดยเฉพาะอย่างยิ่งผ่านตัวต้านทาน จำกัด กระแส Cathode (-) เชื่อมต่อกับกราวด์ (มีตัวต้านทาน จำกัด ปัจจุบันหากคุณไม่มีขั้วบวก)

ตัวต้านทานที่ จำกัด ในปัจจุบันจะหลีกเลี่ยง LED จากการลัดวงจรทำให้ LED เสียหายหรือ Microcontroller / Arduino

ไฟ LED หลายดวง, เมทริกซ์, ไฟ LED RGB

ด้วย LED หลาย ๆ ตัวคุณมักจะมีพวกมันอยู่ด้านบวก (+), "ขั้วบวกทั่วไป" หรือทั้งหมดที่เชื่อมต่อกับ (-) "แคโทดทั่วไป"

โดยทั่วไปมันจะลงมาที่นี่

RGB แคโทดทั่วไป / แอโนด

สำหรับแคโทดทั่วไปคุณให้กระแสกับพินที่คุณต้องการ

สำหรับขั้วบวกทั่วไปคุณจะจมกระแสผ่าน LED

มัลติเพล็กซ์ (หลายหลัก, 7 ส่วน)

คุณควรตรวจสอบบทแนะนำของ parallax: http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo

Parallax 4digit7seg

เมื่อคุณมี LED จำนวนมากมักจะฉลาดที่จะ "ทวีคูณ" พวกมัน โดยปกติแล้วคุณจะต้องผ่าน "กลุ่ม" ของ LED อย่างรวดเร็วเพื่อให้ดูเหมือนว่าพวกเขาทั้งหมดพร้อมกัน

โดยปกติแล้วคุณจะจมกระแสจากคอลัมน์ของ LED และจ่ายกระแสให้กับ LED ของแต่ละแถว

หรือคุณจ่ายกระแสให้กับคอลัมน์ของ LED และจมกระแสจากแต่ละแถวของ LED

เพื่อให้คุณสามารถเลือกคอลัมน์ที่จะเปิดใช้งานและ LED ของคอลัมน์นั้นจะสว่างขึ้น การเปลี่ยนคอลัมน์ / แถวเหล่านี้อย่างรวดเร็วจะช่วยให้คุณควบคุม LED หลายรายการด้วยหมุดน้อยกว่ามาก

แม้จะมีตัวควบคุมการแสดงผลสำหรับสิ่งนี้หากคุณไม่ต้องการดูแลการสลับในซอฟต์แวร์ของคุณ

ดังนั้นเมื่อคุณมี 4 หลัก, 7 ส่วนมัลติเพล็กซ์, ขั้วบวกทั่วไป

แผนภาพจะเป็นดังนี้:

ป้อนคำอธิบายรูปภาพที่นี่

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.