DUBBELE FUNCTIE VAN DRUKKNOP ALS SCHAKELAAR

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 2
Geregistreerd: 05 Aug 2018, 12:09

DUBBELE FUNCTIE VAN DRUKKNOP ALS SCHAKELAAR

Berichtdoor woutertsl » 05 Aug 2018, 14:12

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)

Code: Alles selecteren
//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 :D ) :
- 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

enkele foto's :
hardware :
20180805_100842743_iOS.jpg
20180805_100842743_iOS.jpg (90.75 KiB) 4164 keer bekeken


knoppen :
20180805_102326182_iOS.jpg
20180805_102326182_iOS.jpg (72.09 KiB) 4164 keer bekeken


paneel (in de franse versie maar dat maakt geen verschil) :
20180805_102336424_iOS.jpg
20180805_102336424_iOS.jpg (61.05 KiB) 4164 keer bekeken




Met vriendelijke groeten,
Wouter

Advertisement

Gebruikers-avatar
Berichten: 210
Geregistreerd: 03 Sep 2013, 10:03
Woonplaats: Katwijk ZH

Re: DUBBELE FUNCTIE VAN DRUKKNOP ALS SCHAKELAAR

Berichtdoor baco1978 » 06 Aug 2018, 08:35

Issue 1: kan je oplossen doorde tijd te meten vanaf het moment van indrukken, houd je de knop langer dan 1000millis ingedrukt activeer dan de 2de functie.

Issue 2: om er voor te zorgen dat je de simulatie stand werkende te krijgen zal je iedere stap in een functie moeten stoppen.
deze roep je dan vervolgens aan met StandLichtLinks();
als je simulatie knop is aangezet, kan je daarna met een FOR loop de fucties doorlopen
if (simul==1) StandLichtLinks();
if (simul==2) StandLichtRechts()


Code: Alles selecteren
void StandLichtLinks() {

//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;
}



bovenstaande is maar een voorbeeld hoe het te doen.
hierdoor zal je je heel je sketch moeten omgooien, maar uiteindelijk heb je er meer profijt van.

hopelijk kan je hier wat mee
Met vriendelijke groet Arjan

Berichten: 2
Geregistreerd: 05 Aug 2018, 12:09

Re: DUBBELE FUNCTIE VAN DRUKKNOP ALS SCHAKELAAR

Berichtdoor woutertsl » 06 Aug 2018, 19:54

@ Baco1978 : ik ben u nu al eeuwig dankbaar. Voor issue 2 : het deeltje Functions en For Loop was nog niet in mijn zelfstudie voorgekomen. Ik ga effe FWD naar dit hoofdstuk en dit onder de loep nemen en proberen.

voor issue 1 zal ik dit nogmaals heel goed moeten lezen en zoeken om dit op mijn knoppen te integreren.

Ik mag dan wel truckspecialist zijn maar de electronica-microbe heeft me al veel eerder gebeten zonder opleiding ;)

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten