Beginnersvraag, led's bedienen met momentschakelaars

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 9
Geregistreerd: 03 Jul 2020, 23:45

Beginnersvraag, led's bedienen met momentschakelaars

Berichtdoor Oudholland » 04 Jul 2020, 00:19

Hallo allemaal, ik ben nieuw hier. Zal me eerst even voorstellen.
Ik ben Rob, 37, uit de omgeving van Eindhoven.

Ik ben redelijk nieuw met Arduino, en ben wat aan het experimenteren.

Nu wil ik graag een schakeling maken met 2 momentary-drukknoppen die 4 led's aansturen.
De pinnen staan nog niet vast, maar om het duidelijk te maken benoem ik ze nu even. Die wijzig ik later nog wel.

Ik heb een terugverende schakelaar (momentary) op pin 2 en een op pin 3. En 4 LED's, op pin 5, 6, 7 en 8.

Als de loop start, moet LED 8 branden.
Als ik op schakelaar pin 2 druk, moet er kort (en seconde of zoiets, of puur het moment van drukken) een AAN-signaal gaan naar de LED op pin 5, en dan moet dit signaal weer uitgaan. Tegelijk moet LED 8 uit gaan en moet er een AAN-signaal naar de LED op pin 6, maar deze LED moet blijven branden (=statusled).
Tot ik vervolgens op de schakelaar pin 3 druk, dan moet er kort een AAN-signaal naar LED 7 gaan, en moet LED 6 uit gaan en LED 8 juist weer aan (= statusled actie 2).

Het mag eventueel ook met 1 schakelaar, dat bij de 1e keer drukken actie 1 gebeurt en bij de 2e keer drukken actie 2 (en bij de 3e keer weer actie 1, enz), maar liever met 2 aparte.

Het korte signaal van de knoppen, dat is me zelf gelukt. Maar Het aan blijven van de andere led en het uitschakelen van de andere, daarvan heb ik geen idee hoe dat aan te pakken. Is dit uberhaupt mogelijk?

Het is eigenlijk hetzelfde idee als in dit topic: als er een knop wordt ingedrukt moet er een digitalwrite worden uitgevoerd net zolang tot er een andere knop wordt ingedrukt. Maar lukt dit ook bij losse knoppen ipv een keypad?

Zou iemand me hierbij op weg willen helpen?
Alvast bedankt voor het meedenken!

Rob

Advertisement

Gebruikers-avatar
Berichten: 2648
Geregistreerd: 06 Aug 2016, 01:03

Re: Beginnersvraag, led's bedienen met momentschakelaars

Berichtdoor Koepel » 04 Jul 2020, 15:14

Laat eens zien wat je hebt.
Zet de sketch tussen code-tags, dat is met de knop "Code" en je sketch tussen [ code ] en [ / code ] (maar dan zonder de spaties).

Als je iets wilt doen op het moment dat je een knop indrukt of loslaat, daar het StateChangeDetection voorbeeld voor: https://www.arduino.cc/en/Tutorial/StateChangeDetection.
Dat is heel eenvoudig: Hou in een variabele de vorige toestand bij. Als de nieuwe toestand anders is dan is er dus iets gewijzigd. Meer is het niet.

Het is misschien handig als je voor iedere led een 'led state' variabele maakt.

Een knop dendert. Je hebt iets nodig om dat tegen te gaan. Een delay(10) aan het einde van loop() scheelt al, maar dat is niet mooi. De Bounce2 library is veel mooier.

Berichten: 9
Geregistreerd: 03 Jul 2020, 23:45

Re: Beginnersvraag, led's bedienen met momentschakelaars

Berichtdoor Oudholland » 05 Jul 2020, 01:55

Bedankt voor de link naar de StateChangeDetection. Dat heeft me een avondje lees/probeerwerk opgeleverd. Maar ik ben er nog niet helemaal uit.

Op dit moment is de groene statusled aan als ik de arduino opstart, en als ik op de knop druk brandt de blauwe even kort mee en gaat de rode statusled branden.
Het is me nog niet gelukt om met 2 knoppen te werken of om en om een led kort te laten branden (blauw / geel).

Dit heb ik nu aan code:

Code: Alles selecteren
// Vaste waarden:
const int  buttonPin1 = 2;                // Drukknop 1
const int  buttonPin2 = 3;               // Drukknop 2

const int ledPinBlauw = 8;                // LED Blauw
const int ledPinGeel = 9;                 // LED Geel
const int ledPinGroen = 10;               // LED Groen
const int ledPinRood = 11;                // LED Rood
const int ledPin5 = 12;                // LED 5
const int ledPin6 = 13;                // LED 6

// Vaiabele waarden:
int buttonPushCounter = 0;   // counter for the number of button presses
int buttonState = 0;         // current state of the button
int lastButtonState = 0;     // previous state of the button
int switchStateBlauw = LOW;                  // waarde van de drukknop voor LED Blauw

void setup() {
  // initialize the button pin as a input:
  pinMode(buttonPin1, INPUT);
 pinMode(buttonPin2, INPUT);
  // initialize the LED as an output:
  pinMode(ledPinBlauw, OUTPUT);
  pinMode(ledPinGeel, OUTPUT);
 pinMode(ledPinGroen, OUTPUT);
 pinMode(ledPinRood, OUTPUT);
 pinMode(ledPin5, OUTPUT);
 pinMode(ledPin6, OUTPUT);

  // initialize serial communication:
  Serial.begin(9600);
}


void loop() {

    switchStateBlauw = digitalRead(buttonPin1);    // Lees de digitale waarde van de schakelaar (LOW/HIGH)

    if (switchStateBlauw == HIGH) {               // Als de schakelaar is ingedrukt (HIGH)
      digitalWrite(ledPinBlauw, HIGH);          // Zet de blauwe LED aan
    } else {
       digitalWrite(ledPinBlauw, LOW);           // Zet de blauwe LED uit 
    }
 
  // read the pushbutton input pin:
  buttonState = digitalRead(buttonPin1);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button went from off to on:
      buttonPushCounter++;
     
    } else {
      // if the current state is LOW then the button went from on to off:
   
    }
    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state, for next time through the loop
  lastButtonState = buttonState;


  // turns on the LED every button pushes by checking the modulo of the
  // button push counter. the modulo function gives you the remainder of the
  // division of two numbers:
  if (buttonPushCounter % 2 == 0) {
    digitalWrite(ledPinGroen, HIGH);
    digitalWrite(ledPinRood, LOW);
      } else {
    digitalWrite(ledPinGroen, LOW);
    digitalWrite(ledPinRood, HIGH);
  }

}


Ik heb er nu 1 drukknop inzitten (andere heb ik al wel gedefinieerd maar doet nog niets), maar het is nog niet zoals ik het wil. Ik kom er nu ook achter dat de functie iets anders moet dan ik gisteren dacht...

- Ik zou het toch graag aangestuurd hebben met 2 knoppen (fysiek handiger + veiliger, om een drukknop per actie te hebben). Dus bij het indrukken van knop 1 statusled groen aan en kort blauw + led5. Bij knop 2 statusled rood aan (en groen uit) en kort geel + led6. Bij het voor de 2e keer indrukken van dezelfde knop achter elkaar (dus zonder de andere) moet de statusled van die knop aanblijven (maar mogen de korte leds uiteraard wel even aan gaan).
- Bij het opstarten brandt de groene statusled nu. Hoe regel ik het dat deze groene (+ de rode) dan uit is, en er pas een led gaat branden na de eerste druk op een knop?
- Is het mogelijk om bij het opstarten, eerst eenmalig kort (bijv een halve seconde) led 5 + 6 te laten branden?

Alvast bedankt voor de hulp!

Rob

Gebruikers-avatar
Berichten: 2648
Geregistreerd: 06 Aug 2016, 01:03

Re: Beginnersvraag, led's bedienen met momentschakelaars

Berichtdoor Koepel » 05 Jul 2020, 10:20

De State-Change-Detection gaat alleen om deze regel:
Code: Alles selecteren
if (buttonState != lastButtonState)


Als er iets is gewijzigd dan kun je kijken of de knop is ingedrukt of losgelaten:
Code: Alles selecteren
if (buttonState != lastButtonState)
{
  if (buttonState == HIGH)
  {
    // Ingang is nu HIGH, het was LOW
  }
  else
  {
    // Ingang is nu LOW, het was HIGH
  }
}


Welk Arduino board heb je ?

Hoe heb je de knoppen aangesloten ? Met een weerstand ? aan 5V of aan GND ?

Berichten: 9
Geregistreerd: 03 Jul 2020, 23:45

Re: Beginnersvraag, led's bedienen met momentschakelaars

Berichtdoor Oudholland » 05 Jul 2020, 18:30

Ik heb de Uno.
De knop is aangesloten met een pull-down weerstand 10k, zoals hier beschreven.

Het was me dus wel gelukt om te kijken wat de status was, maar nog niet om er een serie acties aan te koppelen.
Of moet ik niet de buttonPushCounter++; gebruiken maar iets anders?

Hoe ik het nu heb, kan ik alleen een een enkele acti laten gebeuren (statusled 1 of statusled 2 aan), maar hoe koppel ik daar meerdere aan? (dus bij de 1e keer drukken led 1 kort knipperen, bij de 2e keer drukken led 2 kort knipperen (dus aan - delay - uit) . Naast het continu gaan branden van de statusled.
En lukt het om bij het opstarten de beide statusled's uit te laten blijven en een tweetal (andere) led's kort te laten branden?

Bij een 'normale' knopfunctie is me het gelukt om een led te laten knipperen bij opstarten, door in de setup de regels toe te voegen:

Code: Alles selecteren
digitalWrite(ledPin, HIGH);          // Zet de opstartLED aan
delay(500);
digitalWrite(ledPin, LOW);          // Zet de opstartLED weer uit

Maar als ik dat hier toevoeg, krijg ik geen actie.

Gebruikers-avatar
Berichten: 2648
Geregistreerd: 06 Aug 2016, 01:03

Re: Beginnersvraag, led's bedienen met momentschakelaars

Berichtdoor Koepel » 05 Jul 2020, 19:46

Die buttonPushCounter++; is zomaar als extraatje er bij, om te tellen hoe vaak de knop wordt ingedrukt. Het gaat om echt alleen maar om die paar regels die ik liet zien.
Die paar regels is het framework of de kapstok voor de drukknoppen.
Dus als een knop is ingedrukt, dan wordt de ingang dus HIGH:
Code: Alles selecteren
if (buttonState != lastButtonState)
{
  if (buttonState == HIGH)
  {
    // De knop is zojuist ingedrukt
  }
  else
  {
    // De knop is zojuist losgelaten
  }
}

Dat voor beide drukknoppen, en dan de akties op de leds toevoegen.

Wat ik eerder schreef: "Het is misschien handig als je voor iedere led een 'led state' variabele maakt", dat is niet nodig.

Dan krijg je dit:
cpp code
// Aanwezige leds:
// Blauw pin 8
// Geel pin 9
// Groen pin 10
// Rood pin 11
// Vijf pin 12
// Zes pin 13

const int buttonPin1 = 2; // Drukknop 1
const int buttonPin2 = 3; // Drukknop 2

int lastButtonState1 = LOW; // default: knop niet ingedrukt
int lastButtonState2 = LOW; // default: knop niet ingedrukt


void setup()
{
Serial.begin( 9600);
Serial.println();
Serial.println( "De sketch is gestart");
Serial.println( "--------------------");

Serial.println( "Blauw aan");
}

void loop()
{
// ---------------------------------------
// State Change Detection voor button 1
// ---------------------------------------
int buttonState1 = digitalRead( buttonPin1);

if (buttonState1 != lastButtonState1)
{
if (buttonState1 == HIGH)
{
// De knop is zojuist ingedrukt
Serial.println( "Vijf aan");
}
else
{
// De knop is zojuist losgelaten
Serial.println( "Vijf uit");
Serial.println( "Blauw uit");
Serial.println( "Zes aan");
}
lastButtonState1 = buttonState1;
}

// ---------------------------------------
// State Change Detection voor button 2
// ---------------------------------------
int buttonState2 = digitalRead( buttonPin2);

if (buttonState2 != lastButtonState2)
{
if (buttonState2 == HIGH)
{
// De knop is zojuist ingedrukt
Serial.println( "Iets met zeven of zo aan");
}
else
{
// De knop is zojuist losgelaten
Serial.println( "Iets met zeven of zo uit");
Serial.println( "Acht aan");
}
lastButtonState2 = buttonState2;
}
}


Eerst had je vier leds, toen zes leds, dus dat begrijp ik niet.
Bij het beschrijven kun je beter niet zeggen "de LED op pin 5" want dat kan veranderen. Maar dan kun je beter "de blauwe led" zeggen. Uiteindelijk komt die led aan een bepaalde pin op de Arduino, maar dat is op het niveau van de hardware.
Een goede beschrijving geven is een vak apart :o Des te beter je de echte wereld kunt opdelen in logische blokken, des te gemakkelijker wordt het programmeren.

Stel dat op pin 4 een relais zit die een pomp aan zet waardoor een fontein aan gaat. Dan noem je dat: "fontein" en wordt het "fonteinPin" of "pinFontein". Dat er een pin 4 en een relais tussen zit, dat doet er niet toe om het eerst goed te beschrijven.

Berichten: 9
Geregistreerd: 03 Jul 2020, 23:45

Re: Beginnersvraag, led's bedienen met momentschakelaars

Berichtdoor Oudholland » 07 Jul 2020, 21:34

Bedankt voor je input.
Ik snap dat ik het een beetje verwarrend maak door te wisselen van aantal led's, maar dat was omdat ik er tussentijds achter was gekomen dat ik bij de eerste beschrijvingen een paar functies was vergeten :oops:

De schets zoals je 'm nu hier wegzet doet nog niet wat ik zou willen. Als ik knop 1 indruk krijg ik de print LED5 aan, als ik de knop loslaat gaan er andere LED's aan. Bij de 2e knop idem.
Wat de bedoeling was, is dat als ik knop 1 indruk + weer loslaat (momentknop) de blauwe led kort knippert + de groene aan gaat en aan blijft. En er geen statusverandering is als dezelfde knop1 opnieuw wordt ingedrukt.
Pas een statusverandering bij het indrukken en weer loslaten van knop 2, dan moet de groene led uit gaan, de rode kort knipperen + de gele aan gaan en blijven branden. Tot knop 1 weer wordt ingedrukt, etc.
En alleen bij het opstarten zouden led 5+6 kort moeten knipperen.

MAAR
Ik denk dat ik te moeilijk heb gedacht, en heb nu een opzetje gemaakt om e.e.a. mechanisch aan te sturen qua statusled's. De functies die ik nu met de kort knipperende led's heb aangegeven, zijn in de uiteindelijke schakelingen aansturingen van een elektrische of pneumatische cilinder of servo, waar ik dus een microswitch als einschakelaar op kan zetten, en deze als drukknop kan laten binnenkomen in de arduino, en daarmee de statusled's kan bedienen.
Dan kan ik alles aansturen als simpele drukknoppen.

Alleen dan nog 1 moeilijkheid. Een van de ingaande schakelingen wordt dan een drukknop op 230 volt (kan niet anders, deze schakelt tegelijk een machine). Maar met het drukken op die knop, moet de arduino ook een input-signaal krijgen. M.a.w. deze 230V-schakelaar moet gaan fungeren als drukknop voor de arduino.
Daar heb ik dan een relais voor nodig met een spoelspanning van 230 volt dat 5 volt kan schakelen. Waarbij ik dus de VCC via de uitgaande kant van het relais naar de inkomende pin van de arduino laat lopen (dus de drukknop vervang door het relais). Kan ik daar deze voor gebruiken? Of adviseer je een ander relais of oplossing?

Afbeelding

En nogmaals, sorry voor de verwarring. Maar door mijn beperkte ervaring kom ik er blijkbaar pas achter dat iets beter anders kan nadat ik het heb uitgeprobeerd...

Rob

Gebruikers-avatar
Berichten: 2648
Geregistreerd: 06 Aug 2016, 01:03

Re: Beginnersvraag, led's bedienen met momentschakelaars

Berichtdoor Koepel » 07 Jul 2020, 21:53

Ja, je kunt zo'n relais gebruiken.
Er zijn ook optocouplers om 230V te detecteren, maar dat is wat lastiger.

Ik schreef al: Een goede beschrijving geven is een vak apart :o
Dat mis ik nog steeds. Een goede beschrijving begint met goede namen voor alles geven zoals ik al aan gaf. Als je iets "LED5" wilt noemen, dan heet die led "LED5", ongeacht op welk pin nummer die led wordt aangesloten.

Ik koos bewust voor de meest eenvoudige optie, en dat is de led uitzetten als de knop wordt losgelaten.
Het lijkt me beter dat je eerst de sketch werkend hebt op die manier.
Wanneer je iets wilt doen, en daarna iets anders, of met dezelfde knop soms iets anders, dat is recht-toe-recht-aan programmeren. Eventueel met een variabele die de status van het programma bijhoudt.

Als jij iets wilt laten knipperen, dan wil ik ook weten hoe snel en hoe lang. Gewoon zichtbaar knipperen ? bijvoorbeeld 200 ms uit en dan 200 ms aan ?

Even kort een drukknopje aantikken, en dan een led een tijdje laten branden of knipperen, dat kan met delay(). Helaas kun je tijdens een delay niets anders doen.
Met millis() kun je van alles door tegelijk doen, en timers in software maken.
Begin daarvoor hier: https://www.arduino.cc/en/tutorial/BlinkWithoutDelay.

Berichten: 9
Geregistreerd: 03 Jul 2020, 23:45

Re: Beginnersvraag, led's bedienen met momentschakelaars

Berichtdoor Oudholland » 09 Jul 2020, 19:09

Ik heb wat spullen besteld om de zaak werkend te krijgen. Want voor het laatste idee heb ik niet alles liggen.
Als ik alles binnen heb, ga ik weer knutselen en uitproberen en zet ik hier e.e.a. neer.

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast