Ich habe die folgende LED-Anzeige, die ich an Arduino UNO anschließen möchte.
Laut Datenblatt gibt es einen Uhrstift. Muss ich dafür eine externe Taktquelle bauen oder kann ich sie von Arduino speisen?
Wir freuen uns über jeden praktischen Rat zum Anschließen.
Aktualisieren:
Dank Oli Glaser habe ich eine Skizze für Arduino erstellt und präsentiere sie hier, nur für den Fall, dass jemand die gleiche Art von LED-Anzeige hat.
const int CLOCK_PIN = 2;
const int DATA_PIN = 3;
const int DATA_EN_PIN = 4;
const byte numbers[16] = {
0b11111100,
0b01100000,
0b11011010,
0b11110010,
0b01100110,
0b10110110,
0b10111110,
0b11100000,
0b11111110,
0b11100110,
0b11101110,
0b00111110,
0b10011100,
0b01111010,
0b10011110,
0b10001110
};
void loadLed(byte d1, byte d2, byte d3)
{
digitalWrite(DATA_EN_PIN, 0);
digitalWrite(DATA_PIN, 1);
digitalWrite(CLOCK_PIN, 1);
delayMicroseconds(5);
digitalWrite(CLOCK_PIN, 0);
delayMicroseconds(5);
for (int i=7; i >= 0; i--)
{
if(d1 & (1 << i))
digitalWrite(DATA_PIN, 1);
else
digitalWrite(DATA_PIN, 0);
digitalWrite(CLOCK_PIN, 1);
delayMicroseconds(5);
digitalWrite(CLOCK_PIN, 0);
delayMicroseconds(5);
}
for (int i=7; i >= 0; i--)
{
if(d2 & (1 << i))
digitalWrite(DATA_PIN, 1);
else
digitalWrite(DATA_PIN, 0);
digitalWrite(CLOCK_PIN, 1);
delayMicroseconds(5);
digitalWrite(CLOCK_PIN, 0);
delayMicroseconds(5);
}
for (int i=7; i >= 0; i--)
{
if(d3 & (1 << i))
digitalWrite(DATA_PIN, 1);
else
digitalWrite(DATA_PIN, 0);
digitalWrite(CLOCK_PIN, 1);
delayMicroseconds(5);
digitalWrite(CLOCK_PIN, 0);
delayMicroseconds(5);
}
for (int i=0; i <= 10; i++)
{
digitalWrite(DATA_PIN, 0);
digitalWrite(CLOCK_PIN, 1);
delayMicroseconds(5);
digitalWrite(CLOCK_PIN, 0);
delayMicroseconds(5);
}
digitalWrite(DATA_EN_PIN, 1);
}
void setup()
{
pinMode(CLOCK_PIN, OUTPUT);
pinMode(DATA_PIN, OUTPUT);
pinMode(DATA_EN_PIN, OUTPUT);
delay(100);
loadLed(numbers[7], numbers[8], numbers[3]);
}
void loop()
{
}
Dies kann natürlich optimiert werden, aber es gibt ein kleines Problem - jeder fünfte Reset des Boards zeigt zufälligen Müll an. Versucht, mit Verzögerung zu spielen, auf 50 eingestellt - nicht gut. Suche nach Lösung.
Die Takt- und Datenpins sind für Ihren seriellen Eingang. Diese können direkt vom Arduino aus gesteuert werden, verbinden Sie einfach jeden mit einem digitalen Ausgang.
Für die Datenroutine gibt es laut Datenblatt ein Startbit, gefolgt von 35 Datenbits, die der Tabelle "Serial Input Sequence" in Ihrer Frage entsprechen.
Erstellen Sie eine Funktion in Ihrer "Skizze", um das serielle Laden zu steuern, etwa wie unten - ich habe diesen Code nicht überprüft. Sie müssen es nur aufrufen, wenn Sie die Anzeige aktualisieren möchten.
Sie müssen die set_data_pin
und set_clock_pin
durch die richtigen Arduino-Aufrufe an die GPIO-Pins ersetzen, die Sie an die Taktdaten-Pins auf dem Display angeschlossen haben (ich verwende kein Arduino, daher kenne ich sie nicht). Dasselbe gilt für die (Mikrosekundenverzögerung) delay_us
. kann an jedes gewünschte Timing angepasst werden, bis zu einer Taktrate von 500 kHz - Sie können eine Definition für den Wert hinzufügen, um das Ändern jedes einzelnen zu sparen.
Jedes Segment wird von MSB nach LSB verschoben, was A(MSB) nach DP(LSB) für jedes Eingabezeichen entspricht:
void load_data(char seg1, char seg2, char seg3)
{
char i, temp;
char position = 0;
set_data_pin(1); // clock start bit in
set_clock_pin(1);
delay_us(5);
set_clock_pin(0);
delay_us(5);
temp = seg1;
while(i<8)
{
set_data_pin(temp & 0x80); // set data pin
set_clock_pin(1);
delay_us(5);
set_clock_pin(0);
delay_us(5);
i++;
temp = temp << i; // shift next bit out
}
temp = seg2;
while(i<8)
{
set_data_pin(temp & 0x80); // set data pin
set_clock_pin(1);
delay_us(5);
set_clock_pin(0);
delay_us(5);
i++;
temp = temp << i; // shift next bit out
}
temp = seg3;
while(i<8)
{
set_data_pin(temp & 0x80); // set data pin
set_clock_pin(1);
delay_us(5);
set_clock_pin(0);
delay_us(5);
i++;
temp = temp << i; // shift next bit out
}
// Last 11 bits - do something here if needed
while(i<11)
{
set_data_pin(0); // set data pin
set_clock_pin(1);
delay_us(5);
set_clock_pin(0);
delay_us(5);
i++;
}
}
Verbindungen
Für den BC-Pin (Helligkeitssteuerung) können Sie nur einen Widerstand verwenden, um die Helligkeit zu fixieren, oder ein Potentiometer und einen Widerstand, um die Helligkeit des Displays zu steuern.
Um den Wert zu ermitteln, können wir die Informationen im Datenblatt verwenden:
Mit diesen Informationen können wir also den besten Wert für den Pot ermitteln. Wenn wir ein typisches Betriebsmaximum von 20 mA anstreben, dann:
Dies ist der Mindestwiderstandswert, den wir verwenden würden (verbunden zwischen +5 V und BC-Pin).
Wenn wir den Strom variieren möchten, sagen wir von
, dann können wir a hinzufügen
Topf in Reihe mit dem Widerstand, dessen Schleifer an einem Ende (an beiden Enden) angeschlossen ist. Dann variiert der Strom zwischen:
mit dem Topf ganz in die andere Richtung gedreht
Beachten Sie, dass das Datenblatt mit Details zum Helligkeitssteuerstift nicht besonders hilfreich ist - es zeigt den Topf, der für eine variierende Spannungssteuerung im Diagramm eingerichtet ist, was die Dinge ein wenig verwirrt. Ich habe dieses Diagramm einfach ignoriert und das Geschriebene für richtig gehalten. Ich gehe auch davon aus, dass der Widerstand über die vollen 5 V liegt (dh der BC-Pin liegt knapp über 0 V), was wahrscheinlich nicht der Fall ist, aber es ist besser, auf der konservativen Seite zu sein, wenn keine Details angegeben werden.
Dies bedeutet, dass Sie möglicherweise ein wenig experimentieren müssen, um die Helligkeit richtig einzustellen. Wenn es zu dunkel ist, versuchen Sie, auf einen niedrigeren Widerstand zu wechseln.
Olin Lathrop