Hoe een 7-segments, 4-cijferig display met een gemeenschappelijke anode gebruiken?

Neem deze vraag alstublieft als een voorbeeld voor (mijn eigen) antwoord hieronder.

Ik heb een 7 segment, 4-cijferig LED-display, maar ik heb geen idee hoe ik het moet aansluiten.

Ik begrijp het verschil niet tussen gewone anode/kathode, en ik heb geen 2 pins per LED, wat vreemd is. Heel recent is een vraag over een "7-cijferige 4-cijferige gemeenschappelijke anode" verwijderd. Op dat moment was ik een antwoord aan het typen.

Ik wil echter nog steeds mijn antwoord met u delen, of de persoon die het heeft gesteld. Verifieer/update mijn antwoord met meer informatie. In het bijzonder, kan iemand werkende code toevoegen, ik kan dit op dit moment niet.

6
Daar is eigenlijk een optie voor. De opmerkingen in mijn vraag vertellen echter ook het "achtergrondverhaal". Ik was een vraag aan het beantwoorden, die werd verwijderd. En voelde de behoefte om mijn antwoord ononderbroken te posten. Dus ja, dat deed ik. Maar het is een geldige methode en ik had het antwoord vóór de vraag. Dus het was logisch voor mij. Als je een heel goede vraag (en antwoord) hebt, kan ik je alleen maar aanmoedigen om hetzelfde te doen, omdat het op een bepaald moment nuttig kan zijn voor iemand.
toegevoegd de auteur dotnetengineer, de bron
Gewoon nieuwsgierig. Heb je een vraag geplaatst, zodat je deze kunt beantwoorden?
toegevoegd de auteur anu, de bron

2 antwoord

Net als een aanvulling op het antwoord van Paul, schreef ik een kort programma om te laten zien hoe de 7-segments 4-cijferige weergave van zijn figuur te rijden:

wiring schematic

Dit is eigenlijk een algemeen kathodescherm, dus het programma gaat ervan uit dat, evenals de specifieke bedrading van de figuur. Het interessante deel is de functie refresh_display() , die periodiek moet worden aangeroepen. Het algoritme is als volgt:

  • rijd de 7 anodes met de juiste signalen voor een van de cijfers we willen laten zien
  • zet HIGH op de output die de kathode van dat cijfer via de NPN-transistor
  • wacht 2,5 ms (voor een vernieuwingsfrequentie van 100 Hz)
  • stel LAAG in voor de kathoderegelinguitgang
  • ga naar het volgende cijfer.

Opgemerkt moet worden dat het wachten gebeurt zonder de CPU te blokkeren, door met behulp van de techniek beschreven in de Knippert zonder Vertraging Arduino tutorial. Hier is het programma:

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 gaf een link naar een tutorial on Parallax dat suggereert het gebruik van de Multiplex7Seg Arduino-bibliotheek. Die bibliotheek is meer algemeen dan de voorbeeldcode hierboven, omdat het geen aannames maakt over de gebruikte pinnen. Maar de grote verschil tussen de bibliotheek en deze code ligt in de manier waarop de timings worden beheerd:

  • De bibliotheek wordt aangestuurd door de overloop-interrupt Timer 2. Dit zou zorg voor een zeer constante timing, ten koste van één timer opgedragen aan deze baan.
  • De bovenstaande code is afhankelijk van de gebruiker die vaak refresh_display() aanroept genoeg. Het vereist geen speciale hardwarebronnen, maar het werkt niet goed met programma's die te lang duren om loop() : it zal het niet leuk vinden als je delay() aanroept.
6
toegevoegd
Dit is waarom ik open-source dingen leuk vind. Je kunt werklast delen met de rest van de wereld en iets heel leuks maken. Die wordt dan weer gedeeld met de rest van de wereld :) Je kunt veel van andere ontwikkelaars leren en die kennis zal aanhoudend zijn en niet alleen verborgen voor alle anderen.
toegevoegd de auteur dotnetengineer, de bron

Ik zal proberen en neem je mee door de complete basis van LED's enz. Als 4-cijferige 7-segment displays zijn een combinatie van meerdere "LED-technieken".

Bedradings-LED's

LED's, of Light Emitting Diodes, zijn een van de leuke dingen van Arduino.

In wezen zijn ze eenvoudig te gebruiken, voeden ze op en lichten ze op.

Ze kunnen vervelend zijn, omdat ze een soort polariteit hebben, wat betekent dat ze alleen werken als je ze goed aansluit. Als u positieve en negatieve spanning omkeert, lichten ze helemaal niet op.

Vervelend als het is, het is ook heel nuttig.

Kathode versus anode

Op een traditionele LED is de lange lead de (+), Anode. De andere lead is de (-) kathode.

"Of, als iemand de benen bijgesneden heeft, probeer dan de platte rand op de buitenste behuizing van de LED te vinden, de pin die het dichtst bij de vlakke rand ligt, is de negatieve kathodepin." - Sparkfun

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

Sparkfun

Basisbedrading

Ik weet niet zeker of dit correct is, omdat ik de afbeelding van internet heb geript.

Basic LED wiring

Het bedraden van een LED is vrij eenvoudig, de Anode (+) maakt verbinding met een positieve spanning, bij voorkeur via een stroombegrenzende weerstand. De kathode (-) maakt verbinding met aarde (met een stroombegrenzende weerstand, als u er geen aan de positieve kant had).

De stroombegrenzende weerstand zal voorkomen dat de LED kortsluiting veroorzaakt, waardoor de LED of Microcontroller/Arduino wordt beschadigd.

Meerdere leds, matrices, RGB-leds

Met meerdere LED's heb je ze vaak met de positieve zijde aangesloten (+), "gewone Anode" of allemaal verbonden met de (-) "gemeenschappelijke kathode".

Eigenlijk komt het hierop aan.

RGB common cathode/anode

Voor een gemeenschappelijke kathode, levert u stroom aan de pinnen die u wilt hebben.

Voor een gemeenschappelijke anode zinkt u de stroom door de LED.

Multiplexen (uit meerdere cijfers, 7 segmenten)

You should check out the tutorial of parallax: http://learn.parallax.com/4-digit-7-segment-led-display-arduino-demo

Parallax 4digit7seg

Als je veel LED's hebt, is het vaak slim om ze te "multiplexen". Meestal doorloop je snel 'groepen' van LED's, zodat het lijkt alsof ze allemaal tegelijkertijd branden.

Meestal zink je stroom uit een kolom met LED's en geef je stroom aan individuele LED's van een rij.

Of u levert stroom aan een kolom met LED's en zinkt stroom van afzonderlijke LED's van een rij.

Zodat u kunt kiezen welke kolom moet worden geactiveerd en welke LED's van die kolom oplichten. Door deze kolommen/rijen snel te veranderen, kun je meerdere LED's besturen met veel minder pins.

Er zijn zelfs displaycontrollers hiervoor, als u niet wilt zorgen voor de omschakeling in uw software.

Dus wanneer u een algemene 4-cijferige, gemultiplexte anode heeft

Het diagram zal meer als volgt zijn:

enter image description here

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

5
toegevoegd