Anfänger Fragen zum Adruino...

Guten Abend zusammen,

da ich mich nun auch mal an die sache herantrauen möchte und schon sehr viel gelesen habe hab ich noch immer offene Fragen. Erstmal was ich genau vorhabe,

Ich habe ein Dart gerät was sehr alt und leider keine ersatzteile mehr gibt möchte ich die Boardbeleuchtung (vorher NEON Röhre) mittels LED Stripes beleuchten dazu bei Spiel ende soll ein RGB Led Stripe für effekte sorgen.

Die beleuchtung wird aktuel gesteuert durch ein 12v Signal was ein Relai schaltet und die Neonröhre mit strom versorgt. Dies soll dann weg.

jetzt zu meiner Frage besteht die möglichkeit mit dem Adruino es so zu steuern:

LED Stripe Weiß auf Pin 10

RGB Stripes auf Pins 3, 5, 6

Steursignal auf Pin X

Steuersignal ist aktiv ----- Pin 10 Output //LED Stripe Weiß leuchtet Dauerhaft
Steuersignal ist deaktiv ---- Pin 3, 5, 6, 10 blinken so im takt wie man es vorher definiert hat.

Hierfür habe ich schon mal ein wenig experimentiert.

int redPin = 3;
int greenPin = 5;
int bluePin = 6;
int whitePin = 10;

void setup()
{
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  pinMode(whitePin, OUTPUT);
}

void loop()
{
  blinkLed();
}

void setColor(int red, int green, int blue, int white)
{
#ifdef COMMON_ANODE
  red = 255 - red;
  green = 255 - green;
  blue = 255 - blue;
  white = 255 - white;
#endif
  analogWrite(redPin, red);
  analogWrite(greenPin, green);
  analogWrite(bluePin, blue);
  analogWrite(whitePin, white);

}

void blinkLed()
{
  setColor(0, 0, 0, 255);  // white
  delay(10);
  setColor(0, 0, 0, 0);  // off
  delay(10);
   setColor(255, 0, 0, 0);  // green
  delay(50);
  setColor(0, 0, 0, 0);  // off
  delay(50);
  setColor(0, 0, 255, 0);  // blue
  delay(150);
  setColor(0, 0, 0, 0);  // off
  delay(150);
  setColor(0, 255, 0, 0);  // green
  delay(50);
  setColor(0, 0, 0, 0);  // off
  delay(50);
}

So wie es mit dem Code blinkt und soweiter passt mir perfekt.

kommt dann wider das Steuersignal auf Pin X an soll wieder nur Pin 10 aktiviert sein

habe mit hilfe des Steckboards, diesen Sketch am laufen die Outputs gehen dann auf Transistoren und schalten dann die Led Stripes auf 12 Volt laufen.

ich bin für jeden Tipp / Hilfestellug dankbar da ich absoluter anfänger was das Pogramieren angeht.

Und bedanke mich schon mal im Vorraus...

mit besten Grüßen Dennis

Wenn es dir reicht, dass der Umschalter zwischen Weiß-Dauerlicht und Bunt-Blinken im Blink-Zustand nur alle halbe Sekunde erfasst wird (so lange dauert ein blinkLed-Aufruf), ist es trivial:

void loop( ) {
  if ( digitalRead ( SchalterX ) ) {
     digitalWrite(whitePin, LOW ); 
     blinkLed ();
  } else {
      digitalWrite(whitePin, HIGH);
  }
}

Die Aufgabe ist eher, den Schalter richtig anzuschließen: Pullup: externer Widerstand oder pinMode

Delay() hält den Controller an. Er kann nichts in dieser Wartezeit machen. Du könntest ma das blink_without_delay Beispiel der IDE anschauen oder nach der Nachtwächter Erklährung hier in Forun suchen. Auch solltest Du dich mit dem Konzept eines endlichen Automaten bekanntmachen.

Wenn Du statt den einfarbigen bzw mehrfarbigen LED-strips solche mit eingebauten Controller nimmst (zB WS2812 oder Baugleiche) kannst Du jedes LED einzeln in Farbe und Helligkeit ansteuern und auch Regenbogen oder Lauflichter programmieren.
Die WS2812 ( = Neopixel) werden mit einem Pin angesteuert und alle in Reihe geschaltet. Du braucht ein sterken 5V Netzteil da jedes LED bis zu 60mA ziehen kann und bei langen Strips schon was zusammenkommt.

Grüße Uwe

Zunächst schließe ich mich Uwes Vorschlag an, wobei ich eher zu APA102 (= DotStar) tendiere, weil dann auch noch problemlos eine IR-Fernbedienung ergänzt werden kann, wenn Du die Animationen umschalten möchtest. Das habe ich so bei meiner LED-Uhr gemacht.

Guten Morgen,

erstmal danke für die Tips, Infos das ganze Projekt scheint mir über denn Kopf zu wachsen :slight_smile: ist alles unbegreiflich... :slight_smile:

Ich habe gelesen, gelsen und komme nicht damit zu recht habe es soweit hinbekommen das ich mit einen Optokopler 4N35 ein High/LOW Signal bekomme damit habe ich es auch schon geschaft zwischen 2 LED hin und her zu schalten.. nur 2 verschiende Sketche nein... die geschichte mit den blink_without_delay klappt über haupt nicht.

Mir ist es auch egal ob es sich für 1-2 sec verzögert das umschalten von Flash mode zu voll an.

Die sache mit den Neopixel ist für diese Projekt nicht interessant. möchte auch keine IR Fernbedienung oder sonst was mit einbinden. Ich denke werde es wohl anders lösen müssen bedanke mich trotzdem bei euch..

mit besten grüßen Dennis

giGa977:
Guten Morgen,

erstmal danke für die Tips, Infos das ganze Projekt scheint mir über denn Kopf zu wachsen :slight_smile: ist alles unbegreiflich... :slight_smile:

Einfach mal klein anfangen, In Teilstücken; einzelne Funktionalitäten aufteilen und einzeln programmieren dann zu einem großen ganze zusammenfügen.

giGa977:
... die geschichte mit den blink_without_delay klappt über haupt nicht.

erzähl mal was Du nicht verstehst und wir erklähren es Dir sodaß Du es verstehst. Millis() ist eines der wichtigen Konzepte im Sketch weil damit ale Timing/Verzögerungen gemacht werden können. Auch ob ein Taster lange oder kurz gedrückt wurde.

Grüße Uwe

Hi,

mir ist es bewust das man stück für stück machen muss... dann alles zusammen füren...

Teil 1 Weiss dauer haft leuchte lassen ---> Check
Teil 2 RGB verschieden Farben Flashen lassen ---> Check
Teil 3 RGB & Weiss Flashen lassen Random nach auswahl ---> Check

Sketch 1 & Sketch 2 via signal hin und her switchen ---> fail

das mit den blink without delay... ja es klappt ja nur leider alle farben zugleich nicht durch einander....

dies ja total einfach dank anelitung.. nur wie bekomme ich ihm dabei gesagt wenn Pin 9 high das pin 10,11,12,2 low usw...... da finde ich weder beispiele noch verstehe ich system dahinter da der Code komplett anders aufgebaut millis sketch habe ich so genommen wie im beispiel

// constants won't change. Used here to set a pin number:
const int redledPin =  9;// the number of the Red LED pin
const int greledPin =  10;// the number of the Green LED pin
const int bluledPin =  11;// the number of the Blue LED pin
const int whiledPin =  9;// the number of the White LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED

// Generally, you should use "unsigned long" for variables that hold time
// The value will quickly become too large for an int to store
unsigned long previousMillis = 0;        // will store last time LED was updated

// constants won't change:
const long interval = 80;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(redledPin, OUTPUT);
  pinMode(greledPin, OUTPUT);
  pinMode(bluledPin, OUTPUT);
  pinMode(whiledPin, OUTPUT);
  
}

void loop() {
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the difference
  // between the current time and last time you blinked the LED is bigger than
  // the interval at which you want to blink the LED.
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    // save the last time you blinked the LED
    previousMillis = currentMillis;

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW) {
      ledState = HIGH;
    } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(redledPin, ledState);
    digitalWrite(greledPin, ledState);
    digitalWrite(bluledPin, ledState);
    digitalWrite(whiledPin, ledState);
    
  }
}

der delay code war ja noch simple zu verstehen ich gebe an wie lange high und wie lange low dementsprechen austesten bis die blink zeit optisch toll war..

mit besten grüßen

der delay code war ja noch simple zu verstehen ich gebe an wie lange high und wie lange low dementsprechen austesten bis die blink zeit optisch toll war..

BlinkWithoutDelay musst du leider auch verstehen, um das Beispiel sinnvoll anwenden zu können. Das ist ein komplett anderer Programmier-Ansatz und Denkweise.

Frag dich mal, wie lange ein Durchlauf von loop() im Delay-Beispiel dauert. Und wie lange bei BlinkWithoutDelay?

giGa977:
das mit den blink without delay... ja es klappt ja nur leider alle farben zugleich nicht durch einander....

Was Du für eine LED machst, kannst Du auch für viele LEDs verwenden.

Was Du für eine LED machst, packst Du in eine Funktion, die Du für jede Farbe aufrufst. Da Du die Konstanten und Variablen auch je Farbe benötigst, erstellst Du eine Struktur. Je Farbe übergibst Du die Struktur an die Funktion, die dann damit arbeitet. Da die Variablen von der Funktion verändert werden, ist es wichtig, daß die Funktion einen Zeiger auf die Struktur und keine Kopie der Struktur verwendet. Das macht "&" bei LEDS &b.

const int ledPinW =  12;              // the number of the White LED pin
const int schalterPin =  2;
unsigned long currentMillis;

struct LEDS {
  const int ledPin;                     // the number of the LED pin
  unsigned long previousMillis;         // will store last time LED was updated
  unsigned long interval;
};

LEDS led[] {
  {9, 0, 0}, // Rot
  {10, 0, 0}, // Gruen
  {11, 0, 0} // Blau
};

void blink (LEDS &b) {
  if (currentMillis - b.previousMillis >= b.interval) {
    b.previousMillis = currentMillis;
    b.interval = random(50, 500);
    digitalWrite(b.ledPin, !digitalRead(b.ledPin));
  }
}

void setup() {
  pinMode(schalterPin, INPUT_PULLUP);
  pinMode(ledPinW, OUTPUT);
  for (LEDS &l : led) pinMode(l.ledPin, OUTPUT);
}

void loop() {
  currentMillis = millis();
  if (digitalRead(schalterPin)) {
    digitalWrite(ledPinW, HIGH);
    for (LEDS &l : led) digitalWrite(l.ledPin, LOW);
  } else {
    digitalWrite(ledPinW, LOW);
    for (LEDS &l : led) blink(l);
  }
}

Nach einer Idee von combie kann man zur Initialisierung auch einen Contructor verwenden:

const int ledPinW =  12;              // the number of the White LED pin
const int schalterPin =  2;
unsigned long currentMillis;

struct LEDS {
  LEDS(const int ledPin): ledPin(ledPin), previousMillis(0), interval(0) {}
  
  const int ledPin;                     // the number of the LED pin
  unsigned long previousMillis;         // will store last time LED was updated
  unsigned long interval;
};

LEDS led[] {
  {9}, // Rot
  {10}, // Gruen
  {11} // Blau
};

void blink (LEDS &b) {
  if (currentMillis - b.previousMillis >= b.interval) {
    b.previousMillis = currentMillis;
    b.interval = random(50, 500);
    digitalWrite(b.ledPin, !digitalRead(b.ledPin));
  }
}

void setup() {
  pinMode(schalterPin, INPUT_PULLUP);
  pinMode(ledPinW, OUTPUT);
  for (LEDS &l : led) pinMode(l.ledPin, OUTPUT);
}

void loop() {
  currentMillis = millis();
  if (digitalRead(schalterPin)) {
    digitalWrite(ledPinW, HIGH);
    for (LEDS &l : led) digitalWrite(l.ledPin, LOW);
  } else {
    digitalWrite(ledPinW, LOW);
    for (LEDS &l : led) blink(l);
  }
}

Nun kann man die Funktiuon noch zur Methode machen:

const int ledPinW =  12;              // the number of the White LED pin
const int schalterPin =  2;
unsigned long currentMillis;

struct LEDS {
  LEDS(const int ledPin): ledPin(ledPin), previousMillis(0), interval(0) {}
  
void blink () {
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    interval = random(50, 500);
    digitalWrite(ledPin, !digitalRead(ledPin));
  }
}

  const int ledPin;                     // the number of the LED pin
  unsigned long previousMillis;         // will store last time LED was updated
  unsigned long interval;
};

LEDS led[] {
  {9},	// Rot
  {10},	// Gruen
  {11}	// Blau
};

void setup() {
  pinMode(schalterPin, INPUT_PULLUP);
  pinMode(ledPinW, OUTPUT);
  for (LEDS &l : led) pinMode(l.ledPin, OUTPUT);
}

void loop() {
  currentMillis = millis();
  if (digitalRead(schalterPin)) {
    digitalWrite(ledPinW, HIGH);
    for (LEDS &l : led) digitalWrite(l.ledPin, LOW);
  } else {
    digitalWrite(ledPinW, LOW);
    for (LEDS &l : led) l.blink();
  }
}

Suche Dir was aus, dann laß es schön blinken :slight_smile:

Hi Vielen Dank dafür... habe es mal hoch geladen... leuchten tut es aber blinken tat es nicht habe mittlerweile ein paar beispiele gefunden die eher passten.. habe es zusammen gewürfelt :slight_smile: etwas getüfftelt und nun klappt es so wie ich es gerne hätte ob es perfekt ist steht auf einem anderen blatt..

const int buttonPin = 8;
const int ledPin1 =  2;  // white
const int ledPin2 =  9; //red
const int ledPin3 =  10; //green
const int ledPin4 =  11;  //blue

void setup()
{
       pinMode(ledPin1, OUTPUT);
       pinMode(ledPin2, OUTPUT);
       pinMode(buttonPin, INPUT);
       pinMode(ledPin3, OUTPUT);
       pinMode(ledPin4, OUTPUT);
}

void loop()
{
  //Set everything low at the beginning  
 digitalWrite(ledPin1, LOW);
 digitalWrite(ledPin2, LOW);
 digitalWrite(ledPin3, LOW);
 digitalWrite(ledPin4, LOW);
   
if (digitalRead(buttonPin))
  {
   // Light LED 1,2,3 and 4 - White,Red,Green & Blue at Flashmode !!!
   digitalWrite(ledPin1, HIGH); // white
   delay(20);
   digitalWrite(ledPin1, LOW);
   delay(30);
   
   digitalWrite(ledPin2, HIGH);  // red
   delay(50);
   digitalWrite(ledPin2, LOW);
   delay(30);
   digitalWrite(ledPin1, HIGH); // white
   delay(20);
   digitalWrite(ledPin1, LOW);
   delay(30);
   
   digitalWrite(ledPin2, HIGH);  //red/green
   digitalWrite(ledPin3, HIGH);
   delay(50);
   digitalWrite(ledPin2, LOW);
   digitalWrite(ledPin3, LOW);
   delay(30);
   
   digitalWrite(ledPin1, HIGH); // white
   delay(20);
   digitalWrite(ledPin1, LOW);
   delay(30);
   
   digitalWrite(ledPin4, HIGH); // blue
   delay(50);
   digitalWrite(ledPin4, LOW);
   delay(30);

   digitalWrite(ledPin1, HIGH); // white
   delay(20);
   digitalWrite(ledPin1, LOW);
   delay(30);
   
   digitalWrite(ledPin3, HIGH);  //green
   delay(30);
   digitalWrite(ledPin3, LOW);
   delay(30);
   
   digitalWrite(ledPin1, HIGH); // white
   delay(20);
   digitalWrite(ledPin1, LOW);
   delay(30);

   digitalWrite(ledPin2, HIGH);  // red
   delay(50);
   digitalWrite(ledPin2, LOW);
   delay(30);
   digitalWrite(ledPin1, HIGH); // white
   delay(20);
   digitalWrite(ledPin1, LOW);
   delay(30);
   
   digitalWrite(ledPin3, HIGH); // green/blue
   digitalWrite(ledPin4, HIGH);
   delay(50);
   digitalWrite(ledPin3, LOW);
   digitalWrite(ledPin4, LOW);
   delay(30);
  
   digitalWrite(ledPin1, HIGH); // white
   delay(20);
   digitalWrite(ledPin1, LOW);
   delay(30);

   digitalWrite(ledPin4, HIGH); // blue
   delay(50);
   digitalWrite(ledPin4, LOW);
   delay(30);

   digitalWrite(ledPin1, HIGH); // white
   delay(20);
   digitalWrite(ledPin1, LOW);
   delay(30);

   digitalWrite(ledPin4, HIGH); // blue rot
   digitalWrite(ledPin2, HIGH);
   delay(50);
   digitalWrite(ledPin4, LOW);
   digitalWrite(ledPin2, LOW);
   delay(30);
  }
else
  {
   // Light just LED 1 White until button is HIGH
   digitalWrite(ledPin1, HIGH);

  }
}

Nun jetzt alles verlöten verdrahten und einbauen ... wenn es komplettiert ist werde ich mal ein Video Posten.. Bedanke mich bei allen beteiligten :wink:

mit besten grüßen

giGa977:
... leuchten tut es aber blinken tat es nicht ...

Erstaunlich, denn bei mir blinkt es mit einem zufälligen Muster.

Danke für die Rückmeldung :slight_smile:

agmue:
Danke für die Rückmeldung :slight_smile:

Gerne Doch, also ich habe es noch mal auf dem Adruino geladen. High / Low ist auch vertauscht..

Das ist ja eine kleinigkeit aber habe dir mal ein Video gemacht wie es bei mir ist, also es kommt das weiße licht wenn der Spannung nicht da ist. Wenn Spannung an liegt dann kommen alle Farben ausser weiß.

wenn ich das ganze jetzt schnell an aus an aus mache dann verändern sich die RGB
Video GoogleDrive

const int ledPinW =  2;      statt 12 hab ich 2   // the number of the White LED pin
const int schalterPin =  8;           tatt 2 hab ich 8 
unsigned long currentMillis;

struct LEDS {
  LEDS(const int ledPin): ledPin(ledPin), previousMillis(0), interval(0) {}
 
void blink () {
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    interval = random(50, 500);
    digitalWrite(ledPin, !digitalRead(ledPin));
  }
}

  const int ledPin;                     // the number of the LED pin
  unsigned long previousMillis;         // will store last time LED was updated
  unsigned long interval;
};

LEDS led[] {
  {9},  // Rot
  {10}, // Gruen
  {11}  // Blau
};

void setup() {
  pinMode(schalterPin, INPUT_PULLUP);
  pinMode(ledPinW, OUTPUT);
  for (LEDS &l : led) pinMode(l.ledPin, OUTPUT);
}

void loop() {
  currentMillis = millis();
  if (digitalRead(schalterPin)) {
    digitalWrite(ledPinW, HIGH);
    for (LEDS &l : led) digitalWrite(l.ledPin, LOW);
  } else {
    digitalWrite(ledPinW, LOW);
    for (LEDS &l : led) l.blink();
  }
}

evtl können wir da den fehler finden. wenn es jedes mal anders blinkt wäre auch geil.. nur das weiss sollte dann mit blinken..

gruss Dennis

giGa977:
... also es kommt das weiße licht wenn der Spannung nicht da ist. Wenn Spannung an liegt dann kommen alle Farben ausser weiß.

Genau so wollte ich es :slight_smile:

Wenn Du weiß noch ergänzen möchtest, dann kannst Du das Feld led[] um ein Element ergänzen. Dann blinkt auch weiß mit.

Der Zufall ist dank random() drin.

Ok und wieso blinkt es bei mir dann nicht ? ! ? nur wenn die schalter schnell an aus mache ?? dann erkennt man was vom blinken aber das mach ich ja dann selber :wink:

Wie hast Du den Schalter angeschlossen?

Das Video kann ich mir leider nicht ansehen, es kommt eine Fehlermeldung.

mit einem 4n35 Optokopler.
+12V -> 270Ohm-Widerstand -> 4N35 Pin1
4N35 Pin2 -> Minus der 12V Versorgung
+5V Ausgang vom Arduino -> 1KOhm-Widerstand (Strombegrenzer) ->4N35 Pin5 UND an einem Eingangs-Pin vom Arduino
4N35 Pin4 -> Masse am Arduino

das ist mein simulierter schalter :wink: da ich ja kaum mit 12 Volt denn Adruino schalten kann :wink:

Mit dem Video habe ich auch musst du auf Download gehen GoogleDrive bekommt es wohl nicht umgewandelt :frowning:

ich habe den sketch noch mal hochgeladen, und so gepinnt wie du es geschrieben hast, und nur mit LED und zwar so Pin 9-12 zum vorwiderstand zur LED zur Masse und das Pogram laufen lassen.. und siehe da es blinkt... kann es sein das es daran liegt das ich Pin 9-11 ein - habe um den Transistor zum verstärker der masse habe für die Stripes ?! Auf grund dessen alle nur an sind statt blinken ?!

häh?

auch häh?

postmaster-ino:
häh?

auch häh?

@giGa977
Übersetzt soll das wohl heißen:

TO, bitte deine Erklärung nochmal in besserem Wortlaut (evtl. hochdeutsch) und verständlicher erklären.

Ich muss sagen, ich verstehe deine Beschreibung auch nicht.