(Anfänger) Einfache "Ampelanzeige"

Vorerst: Ich habe bisher noch keine Hardware und absolut keine Erfahrung, möchte nur einmal vorfühlen...

Ziel: Drei per USB (virtueller serieller Port) schaltbare Lämpchen.
Frage: Kann folgendes Programm funktionieren, wenn ich erreichen möchte per Ausgabe an den virtuellen COM Port der Zeichen "0", "1", "2" und "3" die Lampen 1=auf grün, 2=orange, 3=rot, alles andere also auch "0" ausschalten möchte, wobei nie 2 Lampen gleichzeitig leuchten sollen.

int newByte=0;
int lastByte=0;
int redLight=13;
int orangeLight=12;
int greenLight=11;

void setup() {
  pinMode(redLight, OUTPUT);
  pinMode(orangeLight, OUTPUT);
  pinMode(greenLight, OUTPUT);
  Serial.begin(9600)
}

void loop() {
  if (Serial.available()>0) {
    newByte=Serial.read();
    newByte-=38; // "1","2","3" -> 11,12,13
    if (newByte!=lastByte) {
      if (lastByte==redLight || lastByte==orangeLight || lastByte==greenLight) {
        digitalWrite(lastByte, LOW);
      }
      if (newByte==redLight || newByte==orangeLight || newByte==greenLight) {
        digitalWrite(newByte, HIGH);
      }
      lastByte=newByte;
    }
  }
}

Als Hardware scheint mir das UNO board recht geeignet, dabei dachte ich die Lämpchen mit GND sowie digital io 11-13 zu verbinden (bzw. einen Widerstand dazwischen, falls nötig). Da ich aber von der Materie so wenig Ahnung habe, frage ich lieber mal ob ich mir das eventuell alles viel zu einfach vorstelle?
Und falls das so halbwegs klappt: ist ein delay im loop sinvoll, egal oder dumm? Bzw. werden die Bytes von "serial" gebuffert? (Nehme ich eigentlich an...)

Danke fürs lesen und hoffentlich auch eine Antwort! :slight_smile:

Dafür, daß Du "absolut keine Ahnung" hast, ist Dein softwaremässiger Ansatz (und somit Deine Denkweise) im Prinzip schon sehr stimmig - ins Detail will ich aber jetzt nicht gehen, die eine oder andere Erfahrung wirst Du noch machen.

Aber mit diesem Programmansatz wirst Du sicher keinen Fehlkauf machen und geholfen wird Dir hier ja immer wieder gerne.
Viel Spaß mit dem Arduino!

Gruß, mmi.

Wenn Du das Programm so anlegst wird aber immer nur eine LED gleichzeitig leuchten können, da diese bei der nächsten abweichenden Zahl über lastByte wieder ausgeschaltet wird.

delay() kannst Du in Deinem Fall zwar machen, bringt Dir aber nichts.

Statt sich irgendwie zu merken was Du an Kommandos bekommen hast oder wie der Zustand der LEDs ist könntest Du auch sowas machen:

digitalWrite(newByte, !digitalRead(newByte));

Damit wird dann der Pin umgesetzt, wenn er vorher an war wird er ausgeschaltet und umgekehrt.
Vorteil wäre dass Dein Programm kürzer wird und auch weniger RAM braucht, und Du kannst jede Lampe in beliebiger Reihenfolge ein- und ausschalten.

Sicherer wären allerdings unterschiedliche Codes fürs Ein- und Ausschalten pro LED, das könntest Du z.B. mit if/else- oder switch/case-Blöcken machen.
Effizienter wären aber z.B. Bitmasken: Z.B. könntest Du '1' fürs Einschalten der ersten LED benutzen und 'A' oder 'a' fürs Ausschalten, z.B. so:

  if (Serial.available()>0) {
    char input = Serial.read();
    digitalWrite((input & 0x0f)+10, (input & 0x10)>0);
  }

Analog 2/B(b) und 3/C(c).
Erweiterung (4/D(d) etc.) wäre so problemlos auch möglich ("Port 14" ist beim Arduino der A0-Port, digital angesprochen)... :slight_smile:
Die "10" fungiert als Offset, wenn da statt dessen z.B. "8" eingetragen wird, würde er bei Port D9 anfangen.

Das funktioniert dadurch, dass sich die HEX-Werte für diese Zeichen nur in einem Nibble unterscheiden, 0x31 steht für '1' und 0x41 für 'A' bzw. 0x61 für 'a' (siehe Wikipedia). Damit ist die Zahl im hinteren Nibble der Port und die Bitstellung im vorderen Nibble sagt aus ob er ein- oder ausgeschaltet werden soll. :wink:

mmi:
Dafür, daß Du "absolut keine Ahnung" hast, ist Dein softwaremässiger Ansatz (und somit Deine Denkweise) im Prinzip schon sehr stimmig - ins Detail will ich aber jetzt nicht gehen, die eine oder andere Erfahrung wirst Du noch machen.

Mit Programmierung für PC habe ich auch einige Erfahrung, Versuche per PC irgendwas zu steuern (lange her, noch via LPT-Port) endeten nach verschmorten LEDs und Vorwürfen ich mache alles falsch mit Frust und Aufgeben meinerseits... :wink:
Dass keine "omg, was machst du da" Antworten aufgetaucht sind hilft schon mal sich eher aufzuraffen was zu probieren.

Joghurt:
Wenn Du das Programm so anlegst wird aber immer nur eine LED gleichzeitig leuchten können, da diese bei der nächsten abweichenden Zahl über lastByte wieder ausgeschaltet wird.

Das ist mir klar und so gewollt ("wobei nie 2 Lampen gleichzeitig leuchten sollen", direkt vor meinem Code).
Trotzdem Danke für den zweiten Ansatz, war interessant für mich zu lesen

Joghurt:
delay() kannst Du in Deinem Fall zwar machen, bringt Dir aber nichts.

Ok, gut, das habe ich auch vermutet - da muss ich mich noch von der Vorstellung lösen, dass ich Leistung "verschwende"... :wink:

Vielen Dank für die aufbauenden Antworten! :slight_smile:

anatol_at:
Das ist mir klar und so gewollt ("wobei nie 2 Lampen gleichzeitig leuchten sollen", direkt vor meinem Code).

Äh, jetzt, wo Dus sagst... :blush: XD

Wie ich befürchtet habe ist es doch nicht ganz so einfach. Da ich für den BA15d-Sockel keine (leistbaren) 5V Lämpchen finden konnte dachte ich mir dass es doch nicht so schwer sei einfach ein 12V-Netzteil, 12V Lämpchen zu nehmen und Halbleiterrelais zur Schaltung zu benutzen. Tja, das dachte ich. :wink:

Eines meiner Probleme scheint zu sein, dass ich bei den Daten zu den Relais aus den Begriffen Last-Strom, Schaltstrom, Steuerspannung, Schaltspannung nicht ganz Schlau werde... soweit ich mir das bisher zusammen gereimt habe, scheinen sich Schaltstrom und Schaltspannung in meinem Fall auf das Board zu beziehen und Last-Strom sowie Steuerspannung auf die Lämpchen?
Darauf aufbauend, müsste ich also ein Bauteil finden, dass eine Steuerspannung von 12V aushält und mit einer Schaltspannung von 5V sowie einem Schaltstrom von 40mA auskommt?! Aber was ist mit dem Last-Strom, was fange ich mit dem Wissen an, dass es sich um ein 21 Watt-Lämpchen handelt und was habe ich noch alles nicht bedacht?

Da ich jetzt seit 3 Stunden durch Halbleiterrelais stöbere, sich alle angegebenen Daten ständig von einander Unterscheiden (nicht die Werte, das wäre ja klar sondern tatsächlich was überhaupt angegeben wird) und überall entweder Daten fehlen (bedeutet ja kaum dass diese nicht relevant sind?!) oder der Preis unmenschlich wirkt oder Begriffe/Einheiten angegeben sind mit denen ich selbst mit Hilfe von Google nichts anfangen kann und mir mittlerweile der Schädel brummt frage ich doch lieber um Hilfe bevor ich ohne Ahnung irgendwelche Teile kaufe und dann auf einem Haufen kaputter Netzteile, Relais und Lämpchen sitze...

Etwas ernüchternd, die Grundzüge der Arduinoprogrammierung waren in 1 Minute kapiert, das Programm oben in kaum 5 Minuten geschrieben und dann sucht man stundenlang ergebnislos nach Bauteilen und es wird einem bewusst, dass man genau gar nix versteht.
Irgendwie ging es mir bisher immer so wenn ich versucht habe irgendwas, egal wie primitives zu basteln - vieleicht sollte ich doch lieber bei dem bleiben was ich kann und mich damit abfinden, dass Elektrizität mir weiterhin ein Rätsel bleibt... :frowning:

(spätestens dieser Post beweist, dass ich mit "absolut keine Erfahrung" nicht im geringsten übertrieben habe...)

Wenn Du mit herkömmlichen "Lämpchen" und Relais anfangen möchtest, machst Du es Dir für den Anfang nur unnötig schwer.

Der erste Schritt wären kleine LED's, die Du (mit Vorwiderstand) direkt an den Arduino anschliessen kannst. Dann kann schon mal die Software getestet werden und ein Erfolgserlebnis ist Dir sicher. Beispiele dafür gibt es viele im Netz.

Wenn Du dann doch die Lämpchen anschliessen möchtest (zweiter Schritt), spendierst Du jedem Lämpchen einen Transistor und einen 12V Stromkreis (vergiss die Relais). Über die Basis des Transistors kannst Du dann die Lämpchen entsprechend vom Arduino schalten lassen. Welche Transistoren in Frage kommen und wie sie zu schalten sind - diese Fragen wurden schon häufig gestellt und auch beantwortet. Ich würde an Deiner Stelle einfach mal ein bisschen hier im Forum "blättern".

Hat man mal diese kleinen Erfolgserlebnisse, macht es zunehmend mehr Spaß. Da Du von der Softwareseite kommst, hast Du schon mal einen Riesenvorteil! Fertige Schaltungsvorschläge zum Nachbau gibt es viele - aber die Software macht's ! :wink:

Gruß, mmi.

Sorry fürs gestrige Frustablassen hier!

Habe aber immerhin mittlerweile gelernt, dass ich einen Logic Level Mosfet brauche und LED-Cluster sinnvoller sind als Glühlämpchen und habe eine Vorstellung davon wie ich das alles in etwa realisieren könnte.

Danke für die aufbauenden Worte und die nützlichen Infos! :slight_smile:

So, ich hab mir jetzt so einiges zusammengereimt und (hoffentlich) so halbwegs gelernt (manche) Schaltpläne zu lesen und dachte ich zeichne es mal gaaanz einfach auf, sodass ich Missverständnisse (meinerseits) auf jeden Fall vermeide...

Und diese Teile habe ich (bzw. hat man) mir rausgesucht:
http://www.amazon.de/Kleinlampe-Lampe-Birne-Leuchte-Cluster/dp/B00605A6Q2/ (LED)
http://www.conrad.at/ce/de/product/162869/TRANSISTOR-HEXFET-IRLZ24N-TO-220-IR (FET)
http://www.conrad.at/ce/de/product/405256/WIDERSTAND-KOHLE-05-W-5-1K-BF-0411 (Widerstand, aber da kann ich ja kaum was falsches kaufen oder?)

Meine Fragen hierzu:

  1. Kann das funktionieren oder hab ich was grundsätzlich falsch verstanden?
  2. Für den LED-Cluster brauche ich keinen Vorwiderstand, da ich davon ausgehe, dass diese in der Lampe bereits vorhanden sind?
  3. Brauche ich sonst noch irgendwo einen Widerstand zum Schutz des FET?
  4. Ich brauche nicht zwingend einen Kondensator weil ich die LEDs nicht dimmen sondern nur schalten möchte, habe ich das richtig verstanden?
  5. Bitte nicht köpfen für diese Frage, bin blutiger Anfänger und möchte gerne verschmorte LEDs vermeiden...: Gehört der +pol des 12V-Netzteils eh an den +pol der LED und nicht an den -pol? (Also LED-Cluster umgedreht?)

Ich bin gespannt! :slight_smile:

anatol_at:
(Widerstand, aber da kann ich ja kaum was falsches kaufen oder?)

Doch man kann; aber in diesem Fall nicht.

anatol_at:
Meine Fragen hierzu:

  1. Kann das funktionieren oder hab ich was grundsätzlich falsch verstanden?
  2. Für den LED-Cluster brauche ich keinen Vorwiderstand, da ich davon ausgehe, dass diese in der Lampe bereits vorhanden sind?
  3. Brauche ich sonst noch irgendwo einen Widerstand zum Schutz des FET?
  4. Ich brauche nicht zwingend einen Kondensator weil ich die LEDs nicht dimmen sondern nur schalten möchte, habe ich das richtig verstanden?
  5. Bitte nicht köpfen für diese Frage, bin blutiger Anfänger und möchte gerne verschmorte LEDs vermeiden...: Gehört der +pol des 12V-Netzteils eh an den +pol der LED und nicht an den -pol? (Also LED-Cluster umgedreht?)

Ich bin gespannt! :slight_smile:

  1. funktioniert; Du hast nur die MSOFETS etwas unkonformistisch gezeichnet...
  2. ja, müßten integriert sein, da die Betriebsspannung 12V ist.
  3. nein
  4. Keinen Kondensator
  5. plus Pol Netzteil an plus Pol LED und minus pol Netzteil an GND Arduino un Source MOSFET.
    Wieso LED Cluster umgekehrt?
    Grüße Uwe

uwefed:

anatol_at:
5. Bitte nicht köpfen für diese Frage, bin blutiger Anfänger und möchte gerne verschmorte LEDs vermeiden...: Gehört der +pol des 12V-Netzteils eh an den +pol der LED und nicht an den -pol? (Also LED-Cluster umgedreht?)

  1. plus Pol Netzteil an plus Pol LED und minus pol Netzteil an GND Arduino un Source MOSFET.
    Wieso LED Cluster umgekehrt?

Das "umgedreht" bezog sich noch auf das "nicht"...
Aber jetzt ist alles klar, vielen Dank!

aha, jetzt ist alles klar.
Grüße Uwe