Knipperlicht

Hallo allemaal, ik ben voor een project bezig om een knipperlicht te maken. Hij bestaat uit 4 verschillende led's (zie schakeling).
Hierin is LED_links T1, LED_rechts is T2, R is LED_achter en RX1 en RX2 zijn aangesloten op LED_zij.
Ik heb nu een uitgebreide code geschreven die werkt, maar nog zonder knipperende LED's. Dus wat ik eigenlijk graag wil is ervoor zorgen dat wanneer LED_links of LED_rechts "HIGH" is deze zal knipperen in plaats van alleen aan staat. Ik heb "Blinkin without Delay" al een aantal keer bestudeerd, maar ik kom er niet helemaal uit hoe ik dat in mijn code kan verwerken zodat dat het enige is wat verandert.
Ik zou het waarderen als ik hier advies in zou kunnen krijgen.

Groeten HC

Mijn sketch:

So I have managed to produce a code that works for the system, but without the timer and the blinking:

[code]//LED's
const int LED_links = 12;           // T1 in image
const int LED_rechts = 11;          // T2 in image
const int LED_achter = 10;         // R in image
const int LED_zij = 9;

// Buttons
const int button_aan = 2;        
const int button_links = 3;
const int button_rechts = 4;

//Buttonstate waarden
int buttonstate_aan;
int buttonstate_links;
int buttonstate_rechts;
int lastbuttonstate_aan;
int lastbuttonstate_links;
int lastbuttonstate_rechts;

// LED states
int LED_links_state = LOW;
int LED_rechts_state = LOW;
int LED_achter_state = LOW;
int LED_zij_state = LOW;

void setup() {

  Serial.begin(9600);

  pinMode(button_aan, INPUT); 
  pinMode(LED_links, OUTPUT);   
  pinMode(button_links, INPUT);
  pinMode(LED_rechts, OUTPUT);
  pinMode(button_rechts, INPUT);
  pinMode(LED_achter, OUTPUT);
  pinMode(LED_zij, OUTPUT);

  digitalWrite(button_links, LOW);
  digitalWrite(button_rechts, LOW);  
}


void loop(){
  buttonstate_aan = digitalRead(button_aan);
  buttonstate_links = digitalRead(button_links);
  buttonstate_rechts = digitalRead(button_rechts);

  if (buttonstate_links != lastbuttonstate_links && buttonstate_links == HIGH){     
    functie_links();
  }

  if (buttonstate_rechts != lastbuttonstate_rechts && buttonstate_rechts == HIGH){     
    functie_rechts();
  }

  if (buttonstate_aan != lastbuttonstate_aan && buttonstate_aan == HIGH){
    functie_aan();
  }
  lastbuttonstate_aan = buttonstate_aan; 
  lastbuttonstate_links = buttonstate_links; 
  lastbuttonstate_rechts = buttonstate_rechts; 

}

void functie_links(){
  if (LED_zij_state == HIGH){
    digitalWrite(LED_zij, LOW);
    LED_zij_state == LOW;
  }
  if(LED_rechts_state == HIGH){
    digitalWrite(LED_rechts, LOW);
    lastbuttonstate_rechts = LOW;
  }
  if(LED_links_state == LOW){
    digitalWrite(LED_links,HIGH);
    LED_links_state = HIGH;
  }
  else
  {
    digitalWrite(LED_links,LOW);
    LED_links_state = LOW;
    if (LED_achter_state == HIGH){
      digitalWrite(LED_zij,HIGH);
      LED_zij_state = HIGH;
    }
    else {
      digitalWrite (LED_rechts,LOW);
      LED_rechts_state = LOW;
    }
  }        
}

void functie_rechts(){
  if (LED_zij_state == HIGH){
    digitalWrite(LED_zij, LOW);
    LED_zij_state == LOW;
  }
  if(LED_links_state == HIGH){
    digitalWrite(LED_links, LOW);
    lastbuttonstate_links = LOW;
  }
  if(LED_rechts_state == LOW){
    digitalWrite(LED_rechts,HIGH);
    LED_rechts_state = HIGH;
  }
  else {
    digitalWrite(LED_rechts,LOW);
    LED_rechts_state = LOW;
    if (LED_achter_state == HIGH){
      digitalWrite(LED_zij,HIGH);
      LED_zij_state = HIGH;
    }
    else {
      digitalWrite (LED_rechts,LOW);
      LED_rechts_state = LOW;
    }
  }        
}


void functie_aan(){

  if (LED_achter_state == LOW)
  {
    digitalWrite(LED_achter, HIGH);
    LED_achter_state = HIGH;
    digitalWrite(LED_zij, HIGH);
    LED_zij_state = HIGH;
  }
  else
  {
    digitalWrite(LED_achter, LOW);
    LED_achter_state = LOW;
    digitalWrite(LED_zij, LOW);
    LED_zij_state = LOW;
  }
  Serial.println(LED_achter_state);

}

[/code]

Hoi HC, welkom.

Ik heb heel even je code bekeken, en ik zie het probleem eigenlijk niet.
Er zit gewoon helemaal niets in je code dat knippert.
Maar mag ik er van uitgaan dat je oranje lichten altijd knipperen en de remlichten nooit ?
(Dat maakt ook eigenlijk niet uit, want er is een situatie waar een knipperend remlicht wel wenselijk is (namelijk bij een noodstop)).

De blink without delay sketch gaat er om dat je netjes bijhoudt hoe alles er voor staat, en dat je je realiseert dat void loop steeds weer uitgevoerd word (what's in a name) en dat zijn gang laat gaan zonder vertraging.
En dat je gaat tellen hoe lang iets al duurt en het niet eens tijd word iets te veranderen.
Is niet veel ingewikkelder dan je het nu hebt.
Overigens zie ik de noodzaak van de aparte functies niet helemaal, maar dat terzijde.

Wat je kunt doen is een code maken die altijd knippert, dus ook als er geen knipperaars aan staan.
Dat knipperen kun je dan blinkstate noemen.
Daarna hoef je je bestaande code maar een klein beetje aan te passen, namelijk als je de controleert of een knipperaar aan moet, dat je dan tegelijk controleert hoe het met blinkstate staat.
Klinkt misschien te ingewikkeld, maar dat valt best mee.
Grote voordeel hiervan, is dat je geen verschillende knipper ritmes krijgt als je twee knipperaars aan hebt staan (en wellicht niet tegelijkertijd gestart hebt).
Heb je je alarmlichten aan, dan zou je kunnen krijgen dat eerst links aan gaat, dan rechts dan links weer uit en dan rechts uit (feitelijk gebeurt dat altijd zo, maar dan zo snel dat je het verschil niet kunt zien).
Je wil dat zoveel mogelijk synchroon hebben lijkt me.

Zorg er voor dat je absoluut geen delays in je loop of andere voids hebt staan (ben er nog geen tegengekomen).

Succes ermee.

HC
Ik dacht de jpongen heeft al flink zijn best gedaan dus ik klaar dat even snel .... en dan zie ik heel wat foutjes.

in setup:

  pinMode(button_aan, INPUT); 
  pinMode(button_links, INPUT);
  pinMode(button_rechts, INPUT);

  digitalWrite(button_links, LOW);
  digitalWrite(button_rechts, LOW);

Ik veronderstel dat je weet dat button aan geen pull-up heeft en de andere knoppen wel.

in functie_links()

LED_zij_state == LOW;

meestal is het goed dus ik vermoed dat je weet dat het = moet zijn en niet ==

  if(LED_rechts_state == HIGH){
    digitalWrite(LED_rechts, LOW);
    lastbuttonstate_rechts = LOW;
  }

moet dat niet

  if(LED_rechts_state == HIGH){
    digitalWrite(LED_rechts, LOW);
    LED_rechts_state = LOW;
  }

zijn zoals erboven? Je gebruikt de variabele LED_rechts_state anders niet.
Hetzelfde gebeurd in functie_rechts

Als men begrip juist is kom je dan bij volgende code uit

// Do not remove the include below
#include "new_project.h"

//LED's
const int LED_links = 12;           // T1 in image
const int LED_rechts = 11;          // T2 in image
const int LED_achter = 10;         // R in image
const int LED_zij = 9;

// Buttons
const int button_aan = 2;        
const int button_links = 3;
const int button_rechts = 4;

//Buttonstate waarden
int buttonstate_aan;
int buttonstate_links;
int buttonstate_rechts;
int lastbuttonstate_aan;
int lastbuttonstate_links;
int lastbuttonstate_rechts;

// LED states
int LED_links_state = LOW;
int LED_rechts_state = LOW;
int LED_achter_state = LOW;
int LED_zij_state = LOW;

void setup() {

  Serial.begin(9600);

  pinMode(button_aan, INPUT); 
  pinMode(LED_links, OUTPUT);   
  pinMode(button_links, INPUT);
  pinMode(LED_rechts, OUTPUT);
  pinMode(button_rechts, INPUT);
  pinMode(LED_achter, OUTPUT);
  pinMode(LED_zij, OUTPUT);

  digitalWrite(button_links, LOW);
  digitalWrite(button_rechts, LOW);  

}




void functie_links(){
  if (LED_zij_state == HIGH){
    LED_zij_state = LOW;
  }
  if(LED_rechts_state == HIGH){
    LED_rechts_state = LOW;
  }
  if(LED_links_state == LOW){
    LED_links_state = HIGH;
  }
  else
  {
    LED_links_state = LOW;
    if (LED_achter_state == HIGH){
      LED_zij_state = HIGH;
    }
    else {
      LED_rechts_state = LOW;
    }
  }        
}

void functie_rechts(){
  if (LED_zij_state == HIGH){
    LED_zij_state = LOW;
  }
  if(LED_links_state == HIGH){
    LED_links_state = LOW;
  }
  if(LED_rechts_state == LOW){
    LED_rechts_state = HIGH;
  }
  else {
    LED_rechts_state = LOW;
    if (LED_achter_state == HIGH){
      LED_zij_state = HIGH;
    }
    else {
      LED_rechts_state = LOW;
    }
  }        
}


void functie_aan(){

  if (LED_achter_state == LOW)
  {
    LED_achter_state = HIGH;
    LED_zij_state = HIGH;
  }
  else
  {
    LED_achter_state = LOW;
    LED_zij_state = LOW;
  }
  Serial.println(LED_achter_state);

}

void loop(){
  buttonstate_aan = digitalRead(button_aan);
  buttonstate_links = digitalRead(button_links);
  buttonstate_rechts = digitalRead(button_rechts);

  if (buttonstate_links != lastbuttonstate_links && buttonstate_links == HIGH){     
    functie_links();
  }

  if (buttonstate_rechts != lastbuttonstate_rechts && buttonstate_rechts == HIGH){     
    functie_rechts();
  }

  if (buttonstate_aan != lastbuttonstate_aan && buttonstate_aan == HIGH){
    functie_aan();
  }
  lastbuttonstate_aan = buttonstate_aan; 
  lastbuttonstate_links = buttonstate_links; 
  lastbuttonstate_rechts = buttonstate_rechts; 
  
  /*blink the leds */
  static long previousMillis = 0;        // will store last time LED was updated
  static int ledState = LOW; 

  // the follow variables is a long because the time, measured in miliseconds,
  // will quickly become a bigger number than can be stored in an int.
  long interval = 1000;  
  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)
    {
      digitalWrite(LED_zij, LOW);
      digitalWrite(LED_rechts, LOW);
      digitalWrite(LED_links,LOW);
      digitalWrite(LED_achter,LOW);    	
    }
    else
    {
      digitalWrite(LED_zij, LED_zij_state);
      digitalWrite(LED_rechts, LED_rechts_state);
      digitalWrite(LED_links,LED_links_state);
      digitalWrite(LED_achter,LED_achter_state);
    }

  }
}

Wat ik gedaan heb is het volgende:
De code voor het aan en uit zetten los gekoppelt van je logica of de led moet knipperen of niet.
met andere woorden als LED_state_xx HIGH is dan knippert led xx.
Het knipperen zit in de blink without delay die ik aan de loop heb toegevoegd.
Ik heb de code niet getest dus ik hoop dat ze werkt.
Met vriendelijke groet
Jantje