2x LED 2x drukknop.

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 10
Geregistreerd: 23 Okt 2018, 21:28

2x LED 2x drukknop.

Berichtdoor sjef » 23 Okt 2018, 22:09

Beste forumleden,

Ik ben Antoon, en nieuw hier op het forum.

Ik hoop hier in de toekomst nog flink wat informatie op te doen.

Na wat geprobeerd te hebben met de Ardruino uno, kom ik er niet uit.

Na wat LEDs en motortjes te hebben aangestuurd stuiten ik toch op het geen wat mij niet lukt:
Het geen wat ik werkend wil hebben:

1x een Rode LED en 1x een Groene LED, deze worden bedient door 2 knoppen.
De rode LED moet aangaan als er op de rechtse drukknop wordt gedrukt.
Laat ik de rechtse knop weer los, dan moet de rode LED uitgaan.
Dit moet eindeloos door kunnen gaan.

Als ik nu op de rechtse knop druk en daaropvolgend de linkse knop indruk (dus alle 2 knoppen in), dan moet door middel van een AND? functie een teller gaan werken met verschillende case's.
Als de 2 knoppen zijn bedient, moet de groene LED aangaan.
Laat ik nu beide knoppen los ongeacht in welke volgorde, dan moet de Groene LED aanblijven en de rode uitgaan.

Druk ik nu een 2e maal op de rechtse drukknop dan moet de Groene LED uitgaan, ook als ik deze drukknop ingedrukt blijft.
Laat ik nu de rechtse drukknop los, dan moet de 'teller' resseten en weer naar de normale functie gaan ( als de Rechtse drukknop ingedrukt wordt moet de rode LED aan gaan, laat ik de knop los, dan moet de rode LED uitgaan).
Dit geld ook voor de linker drukknop, als deze weer ingedrukt wordt na dat de beide knoppen zijn ingedrukt, dan moet de groene LED ook uitgaan en als de knop weer wordt losgelaten dan moet deze ook de teller resseten.

Als volgt het geen wat ik tot zo ver heb geprobeerd: (hier zit ook wat knip en plak werk in):

----------------------------------------------------------------------------------------------------------

/* 2 x LED en 2 Drukknoppen,
* Als er op de Rechtste drukknop gedrukt is, dan moet de RODE LED aangaan.
* Wordt de knop weer losgelaten, dan gaat de RODE LED uit.
* Druk op de LINKSE en RECHTSE knop tegelijk en laat deze allebij los, dan gaat de GROENE LED aan en moet deze aanblijven (AND functie).
* Met de AND functie moet ook de teller geactiveerd worden die telt hoeveel keren er op de rechtse knop gedrukt wordt.
* De teller wordt doorlopen doormiddel van de RECHTSE drukknop.
* Druk je na de AND functie 1 x op de RECHTSE drukknop, dan moet de RODE LED en de GROENE LED uitgaan ook al blijft de rechtse knop ingedrukt.
* Druk in nu een 2e maal op de RECHTSE drukknop, dan moet de teller RESETTEN en weer zijn oude functie oppakken ( RECHTSE drukknop drukken = RODE LED aan, laat de RECHTSE drukknop los, dan RODE LED uit).
* ALS er op de LINKSE knop gedrukt wordt, moet de RODE en GROENE LED allebij uit gaan en uit blijven tot dat er los gelaten is tevens wordt dan de teller weer gereset.
*
* Aansluiting op de Arduino uno:
* 5v gaat naar 1 zijde van de drukknop links en rechts.
* De andere zijde van de rechtse drukknop gaat naar digitaal pin 2, "schakel" draad zit een weerstand van 10Kohm naar de GRND.
* De linkse ddrukknop is hetzelfde aangesloten alleen dan gaat de "schakel" draad naar pin 3.
* De Rode LED wordt met de anode aangesloten op digitaal pin 4.
* De kathode wordt via een weerstand van 220ohm op de GRND aangesloten.
* De Groene LED wordt met de anode aangesloten op digitaal pin 5.
* De kathode wordt via een weerstand van 180ohm op de GRND aangesloten.
*/




#define knopRechts 2 //geeft aan dat de rechtste knop aangesloten zit op digitaal pin 2
#define knopLinks 3 //geeft aan dat de linkse knop aangesloten zit op digitaal pin 3
#define ledGroen 4 //geeft aan dat de groene LED aangesloten zit op digitaal pin 4
#define ledRood 5 //geeft aan dat de groene LED aangesloten zit op digitaal pin 5




int stand = 0; //huidige van de teller defineren
int oudeStand = 0; //oudestand van de teller defineren
int knopTeller = 0; //knop[teller defineren

void setup() {
//enkele keer de setup doorlopen:

pinMode(knopRechts, INPUT); //geef aan dat de rechtse knop een input is
pinMode(knopLinks, INPUT); //geef aan dat de linkse knop een input is
pinMode(ledGroen, OUTPUT); //geef aan dat de groene LED een output is
pinMode(ledRood, OUTPUT); //geef aan dat de Rode LED een output is

digitalWrite(ledGroen, LOW); //door geen onverwachtse dingen te laten gebeuren bij het opstarten wordt de groene led uitgezet
digitalWrite(ledRood, LOW); //dit geld hetzelfde voor de rode led


}

void loop() {
// de loop doorlopen:

if(digitalRead(knopRechts) == HIGH && digitalRead(knopLinks) == LOW){ //als de rechtste knop wordt ingedrukt maar links niet,
digitalWrite(ledRood, HIGH);} //dan zet de rode led aan de normale functie


}

if(digitalRead(knopRechts) == HIGH && digitalRead(knopLinks) == HIGH){ //de uitkomst van deze AND moet de teller (case 1 starten) ( hier kom ik dus niet uit)


knopTeller = digitalRead(knopRechts); //kijken naar de staat van de rechtste drukknop
if(knopTeller == 1){ //kijken of de drukknop is ingedrukt
delay(50); //wacht 50ms (debounce)
knopTeller = digitalRead(knopRechts); //nog een keer kijken naar de staat van de rechtse drukknop
if(knopTeller == 0){ //als de drukknop LOW is (losgelaten) tel dan op
stand = oudeStand +1; //tel op met 1x
}}
else{ //als de knop niet is ingedrukt
delay(100);} //wacht dan 100ms (debounce)


switch (stand) { //reageer op de drukknop & stand ervan
case 1: //als de stand 1 is
digitalWrite(ledRood, LOW); //zet de rode LED uit
digitalWrite(ledGroen, HIGH); //zet de groene LED aan
oudeStand = stand; //zet de oude stand als de huidigestand
break;



default: //als de stand niet 1 of 2 is
digitalWrite(ledRood, LOW); //zet dan alle LEDs uit
digitalWrite(ledGroen, LOW);
oudeStand = 0; //reset naar de teller 0 stand
break;}
}



-------------------------------------------------------------------------------------------

Na avonden gezocht te hebben, krijg ik niet gevonden hoe de sketch juist te maken. En met name het stukje als de AND functie is ingegaan dat de case functies in moeten gaan.

Iemand die mij hier mee kan helpen?

Alvast bedankt.

Advertisement

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

Re: 2x LED 2x drukknop.

Berichtdoor Koepel » 24 Okt 2018, 01:22

Druk eens op Ctrl+T in de Arduino IDE.
Of in het menu: Hulpmiddelen / Automatische opmaak

De loop() heeft maar een paar regels, de meeste code staat buiten de loop(). Dat is niet de bedoeling.

Ik zie door de bomen het bos niet meer, dus ik heb hetzelfde als jij. Je kunt zoveel if-statements toevoegen als je wilt, maar dan kom je niet dichter bij een oplossing.

Je doet bijvoorbeeld vaak een digitalRead(). Dat maakt de code minder duidelijk. Eenmaal per loop() een digitalRead() en een goede structuur van de code zou beter zijn.
De code met de 'knopTeller' samen met de rechter knop is onduidelijk. Als je dat zelf over een jaar ziet, dan weet je misschien niet meer wat de bedoeling was.

Het is misschien mogelijk om het met een kleine wijziging te laten werken, maar het lijkt me beter om dit gestructureerd op te lossen. Dan wordt de code helaas een stuk groter.

Hebben de verschillende standen ook een naam?
Ik bedoel, als de rode led aan is, heet dat bijvoorbeeld "kippenluik open". En de groene led aan bijvoorbeeld "vaar achteruit".
Als dat niet zo is, kun je dan namen bedenken? Bijvoorbeeld "state red" en "state green".

Een manier om iets overzichtelijk te houden is bijvoorbeeld om eerst alle gegevens die binnen komen te verzamelen. Dus de knoppen lezen en debouncen en alle sensoren lezen. Met die informatie de rest van de sketch in gaan.

De rest van de sketch kan bijvoorbeeld een state machine zijn: https://hackingmajenkoblog.wordpress.com/2016/02/01/the-finite-state-machine/ en https://majenko.co.uk/blog/finite-state-machine.

Je kunt beginnen om even niet in programmeer-taal te denken. Leun eens rustig achterover. Schrijf op papier of zie het voor je hoe er een blokje is dat de knoppen bekijkt. Een tweede blokje dat een saai grijs blokje in rust kan zijn of fluoriserend groen oplicht of rood staat te stuiteren. Kun je binnenin het tweede blokje kijken hoe de knopinformatie van het eerste blokje daar wordt verwerkt ? Die verwerking hangt af van de staat van het blokje. Voor iedere mogelijkheid (saai grijs, fluoriserend groen, stuiterend rood) worden de knoppen anders verwerkt. Dat is een finite-state-machine met drie 'states'.
Nu ik zelf over de inhoud van dat tweede blokje ga nadenken, dan zie ik vier of vijf 'states'.

Dat ik de woorden "saai" en "fluoriserend" en "stuiterend" gebruik is niet zomaar. Ik zie het visueel voor me, en dan helpt het om duidelijk de verschillen te zien.

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

Re: 2x LED 2x drukknop.

Berichtdoor Koepel » 24 Okt 2018, 09:39

Ik ben er uit. Er zijn vijf 'states':

- in rust, er wordt gewacht op de rechter knop (dan naar volgende 'state').
- de rode led is aan, de rechter knop is blijvend ingedrukt, wachten op linker knop (dan naar volgende 'state'). Ook kijken of rechter knop wordt losgelaten (dan terug naar rust).
- beide leds zijn aan, wachten totdat beide de knoppen niet meer ingedrukt zijn (dan naar volgende 'state').
- de groene led is aan, wachten totdat de rechter knop wordt ingedrukt (dan naar volgende 'state').
- een extra 'state' na de groene led, wachten totdat de rechter knop wordt losgelaten (dan terug naar naar rust).

Deze beschrijving van de verschillende 'states' is volledig. Dit is precies hoe de code er uit ziet om het te laten werken.
In de hele sketch zit dan maar één AND. Dat is wanneer er gekeken wordt of beide knoppen niet meer ingedrukt zijn.

Berichten: 10
Geregistreerd: 23 Okt 2018, 21:28

Re: 2x LED 2x drukknop.

Berichtdoor sjef » 24 Okt 2018, 19:37

Top deze snelle reactie!

Ik ga mij verdiepen in hoe ik het allemaal in mijn sketch krijg.
Wordt vervolgd...!

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: 2x LED 2x drukknop.

Berichtdoor benvo » 25 Okt 2018, 19:50

Zou het probleem van Ts zo op een flowchart moeten staan?

http://www.dumpnow.nl/img=1e7748ea2e

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 2x LED 2x drukknop.

Berichtdoor shooter » 25 Okt 2018, 21:01

je schrijft best netjes met commentaar etc.
als je : knopteller= digitalRead(knoprechts) dan mag je ook zeggen if (knopteller && etc.
als een situatie waar is dan kun je beter naar een bepaalde state springen. en vandaar kijken wat je wilt doen.
maar zoals de rest schrijft is het handig om een stroomdiagram te maken.
dan zul je ook zien dat je hier nog geen state machine nodig hebt, alhoewel ik het een prima idee vind om het op deze manier te leren.
laat vooral weten hoe het gaat.
paul deelen
shooter@home.nl

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

Re: 2x LED 2x drukknop.

Berichtdoor Koepel » 25 Okt 2018, 21:45

@benvo, probeer je de bestaande sketch in een flowchart te zetten ?
Daar kom ik niet uit om dat werkend te maken.
Ik gebruikte niet de sketch, niet de beschrijving binnen de sketch, maar de beschrijving daarboven.
Onderaan de flowchart: om de groene led uit te zetten, moet een knop ingedrukt worden, en pas bij het loslaten de groene led uit.

@sjef, mijn beschrijving is toch nog niet helemaal volledig, ik ben de groene knop op het laatst vergeten. Dus er komt toch nog een OR en een AND bij. Gelukkig blijft het bij die 5 'states'.
Wat als de knoppen niet zijn ingedrukt en de groene led is aan, en vervolgens worden beide knoppen ingedrukt? Mag dat ook ? De groene led gaat pas uit als alle knoppen niet zijn ingedrukt, ongeacht de volgorde?

Dan wordt het dit:
- in rust, er wordt gewacht op de rechter knop (dan naar volgende 'state').
- de rode led is aan, de rechter knop is blijvend ingedrukt, wachten op linker knop (dan naar volgende 'state'). Ook kijken of rechter knop wordt losgelaten (dan terug naar rust).
- beide leds zijn aan, wachten totdat beide de knoppen niet meer ingedrukt zijn (dan naar volgende 'state').

- de groene led is aan, wachten totdat een knop (rechter of linker-knop of beide) wordt ingedrukt (dan naar volgende 'state').
- een extra 'state' na de groene led, wachten totdat beide knoppen niet zijn ingedrukt (dan terug naar naar rust).

Berichten: 340
Geregistreerd: 23 Okt 2016, 20:29

Re: 2x LED 2x drukknop.

Berichtdoor benvo » 26 Okt 2018, 16:11

@koepel.

Inderdaad heb ik geprobeerd om de vraag van Ts in een flowchart te zetten. Eigenlijk heb ik dit topic dus "misbruikt" om ook dit een beetje onder de knie te krijgen. Wat je opmerking betreft: Om bij de laatste stop de groene led uit te doen had ik staan, "Rode knop ingedrukt" er van uitgaande dat je de knop niet vast blijft houden. Daar had ik dus in het beslissingsmoment moeten schrijven "Rode knop indrukken en bij loslaten groene led uit"? Of het zo werkend zou zijn weet ik niet. Ik heb getracht op te schrijven in een stroomdiagram wat Ts zou willen en dus gewoon overgenomen wat hij schreef. Maar ik heb niet het recht om dit topic te vervuilen. Excuses daarvoor!

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: 2x LED 2x drukknop.

Berichtdoor shooter » 26 Okt 2018, 18:27

zullen we even afwachten wat sjef ervan maakt?
paul deelen
shooter@home.nl

Berichten: 10
Geregistreerd: 23 Okt 2018, 21:28

Re: 2x LED 2x drukknop.

Berichtdoor sjef » 26 Okt 2018, 21:22

@koepel

ik citeer:
- in rust, er wordt gewacht op de rechter knop (dan naar volgende state)
- de rode led is aan, de rechter knop is blijvend ingedrukt,wachten op de linker knop (dan
naar de volgende state). ook kijken of rechter knop wordt losgelaten (dan terug naar rust) <<< de groene led moet geactiveerd worden als er kort/of lang beide knoppen ingedrukt
[b]worden, dus als de linker of rechter knop eerder los wordt gelaten moet dat niet uitmaken.

Dus deze regel schrappen?[/b]

-beide leds zijn aan, wachten totdat beide de knoppen niet meer ingedrukt zijn (dan door
naar volgende state)
-de groene led is aan, wachten totdat de rechter knop wordt losgelaten (dan terug naar
rust).
-een extra 'state' na de groene led, wachten totdat de rechter knop wordt losgelaten (dan terug naar naar rust).

Ik heb geprobeerd om de FSM te verwoorden in de sketch, nog lang niet goed maar ik moet weer ergens beginnen.
ik heb het nu met if statements geprobeerd maar er moet waarschijnlijk een andere manier zijn.
ik ben uitgekomen op 6 'states'

Poging 2 :

int knopLinks = 2; // pinnen declareren
int knopRechts = 3;
int ledRood = 4;
int ledGroen = 5;




void setup() {
pinMode(knopLinks, INPUT); // linkerknop = een input
pinMode(knopRechts, INPUT); // rechterknop = een input
pinMode(ledRood, OUTPUT); // rode LED = een output
pinMode(ledGroen, OUTPUT); // groene LED = een output


}

void loop() {

static int state = 1; //geef aan dat state 1 de normale state is

switch(state)

{

case 1:

if(digitalRead(knopRechts) == HIGH && digitalRead(knopLinks) == LOW) {
state = 2; // wachten totdat alleen de rechter knop wordt ingedrukt, zo ja dan naar vogende state
}
break;


break;

case 2:

digitalWrite(ledRood, HIGH); // zet de rode LED aan
digitalWrite(ledGroen, LOW); // laat groene LED uit
if( digitalRead(knopLinks) == HIGH && digitalRead(knopRechts) == HIGH) { // als de knoppen allebei ingedrukt zijn dan door naar de volgende state
state = 3;
break;

case 3: digitalWrite(ledRood, HIGH); // beide LEDs zijn aan
digitalWrite(ledGroen, HIGH);
state = 4;
break;
case 4:

if(digitalRead(knopLinks) == LOW && digitalRead(knopRechts) == LOW){ // als de knoppen los zijn gelaten
state = 5;}
break;

case 5:

digitalWrite(ledGroen, HIGH); // laat groene led aan
digitalWrite(ledRood, LOW); // zet rode led uit
state = 6;

case 6:
if( digitalRead(knopLinks) == HIGH or digitalRead(knopRechts) == HIGH){ // wordt er links of rechts gedrukt
state = 1;
}
break;

default:

state = 1;

break;

}

}

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 4 gasten