Arduino Uno alle Ausgänge eines Ports gleichzeitig einschalten?
Hallo zusammen,
Ich habe ein Arduino Uno Board und möchte daran 8 LEDs anschließen. Diese 8 LEDs sollen aber nun gemeinsam ein bzw. ausgeschaltet werden.
Es soll so eine Art Blinkleiste werden.
Die Frage ist jetzt nur, wie programmiere ich das?
Wie man einen Port ein bzw. ausschaltet, ist mir geläufig, aber wie geht das mit allen Ausgängen eines Ports?
Ein erster Anfang, aber es funktioniert.
```cpp
/*
Lauflicht
*/
int led1 = 9;
int led2 = 8;
int led3 = 7;
int led4 = 6;
int led5 = 5;
int led6 = 4;
int led7 = 3;
int led8 = 2;
int pinsGesamt = 8; // deklariert die ganzzahlige Variable pinsGesamt
int pins[] = { 2, 3, 4, 5, 6, 7, 8, 9 }; // deklariert das Array pins[]
void setup() {
//Startsequenz
//Beginn
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
pinMode(led7, OUTPUT);
pinMode(led8, OUTPUT);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
digitalWrite(led3, HIGH);
digitalWrite(led4, HIGH);
digitalWrite(led5, HIGH);
digitalWrite(led6, HIGH);
digitalWrite(led7, HIGH);
digitalWrite(led8, HIGH);
delay(1500);
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
delay(1500);
//Startsequenz
//Ende
for (int i = 0; i < pinsGesamt; i = i + 1) { // zählt die Variable i von 0 bis 7
pinMode(pins[i], OUTPUT); // initialisiert den Pin an der pins-Array-Stelle i als OUTPUT
}
}
void loop() {
for (int i = 0; i < pinsGesamt; i = i + 1) { // Lauflicht Hin
digitalWrite(pins[i], HIGH); // LED an der Stelle i einschalten
delay(100); // hält das Programm für 100 Millisekunden an
digitalWrite(pins[i], LOW); // LED an der Stelle i ausschalten
}
for (int i = 6; i > 0; i = i - 1) { // Lauflicht Zurück (die äußeren LEDs werden nicht angesteuert)
digitalWrite(pins[i], HIGH); // LED an der Stelle i einschalten
delay(100); // hält das Programm für 100 Millisekunden an
digitalWrite(pins[i], LOW); // LED an der Stelle i ausschalten
}
}
```
3 Antworten
In dem Du den Befehl mehrfach nacheinander schreibst.
{
....anderer Code....
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
....weiterer Code....
}
Die Verzögerung wirst Du nicht merken... Kannst Du nur mit einem Oszilloskop messtechnisch darstellen. Sonst musst Du in Richtung Assembler gehen, da sprichst Du einen ganzen Port an, statt nur einen Pin... Ob die dann aber tatsächlich gleichzeitig gesetzt werden oder auch schnell nacheinander? So tief stecke ich nicht drin...
Funfakt, ein Port bezeichnet mehrere I/O in Assembler. Daher kritisch, einen Pin als Port zu bezeichnen, kann zur Verwechslung führen...
2. Möglichkeit wären adressierbare LED. Da benötigt man nur einen Ausgang. WS2812 LEDs zum Beispiel.
Das funktioniert natürlich, aber verursacht sinnloser Weise zu großen Code. Auf dem Arduino hast du nicht so viel davon. Ports direkt ansprechen geht auch viel schneller
Ich habe meine Frage mit dem Code ergänzt. Wird sicherlich nicht das Optimum sein, aber es funktioniert schon wie gewünscht.
Wozu machst du die PIN MODE For SChleife. Du hast vorher doch schon alles von Hand gemacht?
In Assembler schickst du immer ein Byte gleichzeitig über den internen Bus, also 8 Pins gleichzeitig.
Wie gleichzeitig brauchst du es denn ?
Du kannst delay (100) variiieren oder sogar ganz weglassen.
Bei delay(0) oder delay(10) wird das Auge schon alle gleichzeitig wahrnehmen.
delay(1500) wartet bei leuchtenden LED 1.5 Sekunden, dann kommt der Befehl zum ausmachen. . Dann wieder delay (1500) 1500millisekunden. Solange sind die LED sicher aus, bevor der nächste Befehl kommt. Fehlt dir jetzt noch etwas? Wie gesagt , die Ports als Ausgang zu definieren machst du eigentlich doppelt.
Wenn ich es besser wüsste, hätte ich es sicher anders geschrieben.
Beschäftige dich damit, wie du Pin und Ports direktmanipulieren kannst.
Google nach "Ports bei dem Atmega" du bekommst Anleitungen ohne Ende.
Beispiel aus einem meiner Quellcodes:
//digitalWrite(clockPin, HIGH);
PORTA |= (1 << _clockPin);
//digitalWrite(clockPin, LOW);
PORTA &= ~(1 << _clockPin);
Nun ja, ich mache das so, weil ich es nicht besser weiß. So firm bin ich im Programmieren noch nicht. Klar ist der Code etwas umständlich. Aber es funktioniert ja schon.
Nach jedem Einschalten leuchten alle LEDs gleichzeitig auf und gehen nach kurzer Zeit wieder aus. Das wird nur einmal ausgeführt.
Danach geht das eigentliche Lauflicht los.