DUBBELE FUNCTIE VAN DRUKKNOP ALS SCHAKELAAR

Goededag iedereen,

Ik ben geen crack in het arduinoverhaal maar ik vind het o-zo-leuk om er dingen mee te bouwen. Ik heb reeds simpele voorgekauwde dingetjes gemaakt maar nu wil ik deze theorie in praktijk gaan omzetten en echte functionerende dingen gaan maken.

Ik ben met een project bezig om via een bedieningsunit de verlichting van een 24V trailer te testen. De bedieningsunit kan je zien als de "auto" die je dan aansluit via de stekkerdoos aan de trailer om de verlichting te testen. In de handel zijn hier simpele bakjes voor te koop met schakelaartjes die dan stroom stuurt naar het juiste circuit zoals de standlichten, richtingsaanwijzer, enz...

Maar ik wil het zelf digitaal maken met tal van funties en een propere behuizing. Het moet een beetje robuust zijn voor mij. Ik voeg onderaan enkele foto's toe hoe het tot nu toe gebouwd is.

Even de belangrijkste hardware toelichten :

  • arduino MEGA
  • relayshield 16 relais
  • drukknoppen momentary
  • printplaatje zelf gemaakt met 10K PULL DOWN weerstanden voor de drukknoppen

De reeds gemaakte code werkt en de drukknoppen zijn geDEBOUNCED. Dus als ik een bepaalde drukknop bedien gaat de gewenste relais aantrekken. Als ik nogmaals op de knop druk dan gaat de relais uit. De drukknoppen doen dus dienst als schakelaar.

Tot zover de huidige code.

Mijn issue is 2 volgende functies waar ik reeds 20 verschillende samengestelde codes heb voor geprobeerd maar ik geraak er niet aan uit.

Issue 1 : wanneer ik bijvoorbeeld de drukknop van de richtingsaanwijzer bedien dan gaat de relais aan en bij nogmaals bedienen gaat die uit. Ik wil dit nu zoals echt gaan simuleren dat als je dezelfde knop 1 seconde indrukt de relais aan - uit - aan - uit - ... gaat (zoals een echte richtingsaanwijzer. en wanneer de knop dan nogmaals 1 seconde ingedrukt wordt dat deze knipperfunctie terug uit is. dus kort bedienen is constant aan en lang bedienen is knipperfunctie.

Issue 2 : ik heb een simulatieknop voorzien. Ik begrijp onder simulatie : wanneer ik deze drukknop bedien dat alle circuits om beurten 2 seconden van stroom worden voorzien. Zo kan je achteraan de trailer staan en hoef je geen 10 keer 14meter te wandelen naar de bedieningsbak om alle circuits om beurt te activeren om te kijken of alle verlichting werkt. Dus kort gezegd : als ik de simulatieknop bedien dan moet circuit 1 enkele seconden branden, circuit 1 uit en daarna circuit 2, circuit 2 uit, enz... Ik had al gespeeld met de bestaande code van de debouncedrukknop met enkele digitalWrites bij te zetten en delays maar dat werkt voor geen meter.

Kan of wil iemand mij verder helpen hoe ik deze 2 issues kan gaan vertalen in mijn sketch zodat dit kan werken?

Mijn huidige sketch (vereenvoudigd naar 4 knoppen ipv 13 om de code wat eenvoudig te houden)

//BIBLIOTHEKEN IN TE VOEREN

//INT INPUT KNOPPEN EN RELAISSHIELD
int STLI = 22;  //PIN van RELAIS STANDLICHT LINKS - JD1
int STLIstatus = HIGH;      // the current state of the output pin
int readSTLIKNOP;    // the current reading from the input pin
int previousSTLIKNOP = LOW;     // the previous reading from the input pin
int STLIKNOP = 34;  //PIN van KNOP STANDLICHT LINKS

int PILI = 24;  //PIN van RELAIS PINKER LINKS - JD2
int PILIstatus = HIGH;      // the current state of the output pin
int readPILIKNOP;    // the current reading from the input pin
int previousPILIKNOP = LOW;     // the previous reading from the input pin
int PILIKNOP = 36;  //PIN van KNOP PINKER LINKS

int STOP = 26;  //PIN van RELAIS STOP - JD3
int STOPstatus = HIGH;      // the current state of the output pin
int readSTOPKNOP;    // the current reading from the input pin
int previousSTOPKNOP = LOW;     // the previous reading from the input pin
int STOPKNOP = 38;  //PIN van KNOP STOP

int SIMUstatus = HIGH;      // the current state of the output pin
int readSIMUKNOP;    // the current reading from the input pin
int previousSIMUKNOP = LOW;     // the previous reading from the input pin
int SIMUKNOP = 47;  //PIN van SIMULATIEKNOP
int SIMU; //DIT IS EEN VIRTUELE OUTPUT voor de simulatie echter is deze niet bepaald wat die moet gaan doen - ISSUE 2

//VARIABELEN VOOR KNOPPEN
long time = 0;         // the last time the output pin was toggled
long debounce = 200;   // the debounce time, increase if the output flickers

void setup() {
// put your setup code here, to run once:
pinMode(STLIKNOP, INPUT);
pinMode(PILIKNOP, INPUT);
pinMode(STOPKNOP, INPUT);
pinMode(SIMUKNOP, INPUT);

pinMode(STLI, OUTPUT);
pinMode(PILI, OUTPUT);
pinMode(STOP, OUTPUT);
}

void loop() {
// put your main code here, to run repeatedly:

//KNOP STANDLICHT LINKS
  readSTLIKNOP = digitalRead(STLIKNOP);
  // if the input just went from LOW and HIGH and we've waited long enough
  // to ignore any noise on the circuit, toggle the output pin and remember
  // the time
  if (readSTLIKNOP == HIGH && previousSTLIKNOP == LOW && millis() - time > debounce) {
    if (STLIstatus == HIGH)
      STLIstatus = LOW;
    else
      STLIstatus = HIGH;
    time = millis();    
  }
  digitalWrite(STLI, STLIstatus);
  previousSTLIKNOP = readSTLIKNOP;

//KNOP PINKER LINKS
  readPILIKNOP = digitalRead(PILIKNOP);
   if (readPILIKNOP == HIGH && previousPILIKNOP == LOW && millis() - time > debounce) {
    if (PILIstatus == HIGH)
      PILIstatus = LOW;
    else
      PILIstatus = HIGH;
    time = millis();    
  }
  digitalWrite(PILI, PILIstatus);
  previousPILIKNOP = readPILIKNOP;

//KNOP STOP
  readSTOPKNOP = digitalRead(STOPKNOP);
   if (readSTOPKNOP == HIGH && previousSTOPKNOP == LOW && millis() - time > debounce) {
    if (STOPstatus == HIGH)
      STOPstatus = LOW;
    else
      STOPstatus = HIGH;
    time = millis();    
  }
  digitalWrite(STOP, STOPstatus);
  previousSTOPKNOP = readSTOPKNOP;

//KNOP SIMULATIE
 readSIMUKNOP = digitalRead(SIMUKNOP);
   if (readSIMUKNOP == HIGH && previousSIMUKNOP == LOW && millis() - time > debounce) {
    if (SIMUstatus == HIGH)
      SIMUstatus = LOW;
    else
      SIMUstatus = HIGH;
    time = millis();    
  }
  digitalWrite(SIMU, SIMUstatus);
  previousSIMUKNOP = readSIMUKNOP;
}

Verder staat nog op het programma om bij te bouwen (maar eerst de basisfunties uiteraard :smiley: ) :

  • 24V en 5V en verbruikte stroom (A) uitlezen via I2C OLED
  • bediening via een RF 433Mhz afstandsbediening die dezelfde funties kan uitvoeren als de drukknoppen
  • bediening via een app of bluetooth

Met vriendelijke groeten,
Wouter

Dag Wouter, er is geen simpele oplossing voor je vraag.
Je zal een beetje dieper moeten gaan in het arduino verhaal om te kunnen wat je wil.

Geen paniek het is niet moeilijk het kost gewoon wat meer tijd. Er zijn verschillende manieren om wat jij wil te programmeren. Als ik iets tegen kom, gebruik ik vaak een struct of als je helemaal uit de bol wil gaan, schrijf je je eigen library...

Met een struct maak je van je outputs een soort objectje. Dat Object heeft dan bijvoorbeeld

  • een poortnummer
  • of het aan of uit is
  • wanneer je lampje voor het laatst is geupdate
  • ...

je zou zelfs kunnen bijhouden hoeveel keer je geremd hebt op je rit.

Als je dan een array gebruikt, maakt het ook niet meer uit hoeveel lichtjes je aanstuurt en kan je makkelijk met een knopje al je lichtjes aan laten gaan of uitzetten.

Zo maak je een struct :

// de structuur van je lichtjes
struct TrailerLicht
{
  byte pin                  = 0;
  boolean state             = 0;
  unsigned long lastUpdate  = 0;
};

// maak een array aan van lampjes
TrailerLicht lampje[5];


//voor de leesbaarheid van je code kan je dan bijvoorbeeld elke lamje een naam geven
const byte RECHTER_PINKER = 0;
const byte LINKER_PINKER  = 1;
const byte STOPLICHT      = 2;

void setup() 
{
	Serial.begin(115200);

  // zo steek je een waarde in je struct
  lampje[RECHTER_PINKER].pin=24;
  lampje[LINKER_PINKER].pin=25;
  lampje[STOPLICHT].pin=27;
  // en zo voort

  // zo lees je hem
  Serial.println(lampje[STOPLICHT].pin);
  
}

void loop() 
{
  

}

Hoi wouter, welkom.

Kijk zometeen ook even onder aan mijn antwoord hier; bij alle antwoorden geef ik middels mijn handtekening een aantal universele tips, en die zijn voor jou hier ook van belang.

Je probleem is niet zo heel groot, maar je moet 't maar net ver genoeg ontleden om te zien wat je nog mist.
Het gaat hier om onthouden.
In je code moet je meer onthouden dan wat je nu doet.

Je pinker kun je ook in een variabele zetten.
In zo'n variabele zet je iets wat je wil onthouden voor later gebruik.
De pinker heeft eigenlijk 2 variabelen nodig.
De ene is om bij te houden of de pinker actief is, en de andere is om bij te houden of het lampje aan of uit moet zijn.

Dan heb je nog een door jou gewenste tijd om bepaalde functies te testen.
Eigenlijk is er geen verschil tussen dit verhaal en die van je pinker.
Want je moet bijhouden dat de functie geactiveerd is, en vergelijken of de gewenste tijdsduur van die activatie al verlopen is.

Ik vertel je zometeen nogmaals dat tussen deze 2 zaken geen technisch verschil zit.

Dan heb je nog je simulatie.
Dat ding moet alle testen achtereenvolgens uitvoeren.
Ook hier moet je registreren dat deze test geactiveerd is, en gaan bijhouden hoe ver je bent met die testen.
En das het 3e probleem dat je met dezelfde denkwijze kunt oplossen.

Eventueel kun je elke test in een eigen stukje van je code zetten.
Dat word een functie genoemd.
Die functie kun je dan telkens aanroepen als je het nodig hebt.
Dat maakt de code efficiënter en vooral overzichtelijker.
Maar jouw wensen zijn helemaal niet hoog (tot nog toe), en eenvoudig realiseerbaar.

Nou noemen we pinken in Nederland knipperen, maar veel interessanter is het Engelse woord ervoor: blink.
En laat er nou net een blink sketch in de voorbeelden zitten.
Die laat je zien wat je allemaal moet doen om te pinken en dus ook wat je daar voor bij moet houden.
In principe is dat voor jouw toepassing ruim voldoende.
Maar om het helemaal goed en efficiënt te kunnen doen (bijvoorbeeld om er voor te zorgen dat je drukken op de knoppen ook prompt en accuraat verwerkt kunnen worden), bekijk je beter eerst eens de blink without delay sketch (klik !) (hee, dat komt mij bekend voor...).

Nog even wat bestuderen, en je hebt weer een mooi stukje gereedschap opgeslagen in je brein..

Ik ben het dus helemaal niet eens met Kevin77, die met allerlei moeilijke termen begint te gooien.
Dat is vast een goede weg om in de toekomst bij veel ingewikkelder code te gaan gebruiken.
Maar voor jouw toepassing is dit helemaal niet noodzakelijk.