arduino loop 1 keer laten afspelen met button

best fcapri

ik heb het geprobeert maar krijg deze foutmelding

exit status 1
'pin' was not declared in this scope

dit is een foto wat ik nu gebruik om te testen of het werkt dus ik wil graag elke keer de loop opnieuw starten met de schakelaar

benleentje

Golden Member

c code:

 if (digitalRead(pin)){
     speelAf();

Waar hierboven pin staat moet je jouw pin vermelden waar je de drukknop op aansluit of je vult hier de naam button in. En aan het begin van het programma moet je button nog declareren en er een pinnummer aanhangen. En deze als ingang zetten.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

nu heb ik dit geprobeerd maar het blijft gewoon door gaan de loop
ik heb een draad van 12 naar de schakelaar daarvandaan naar 220ohm weerstand en dan naar de gnd klopt dit

int coilOnder = 10; // hamer ram laag
int coilBoven = 11; // hamer ram hoog
int button = 12; // start button

void setup() {
pinMode(coilOnder, OUTPUT);
pinMode(coilBoven, OUTPUT);
pinMode(button, INPUT);
}

void loop() {
if (digitalRead(button)) {
speelAf();
}
delay(400); //dan kan de delay op einde van je speelAf komen te vervallen
}

void speelAf() {
digitalWrite(coilOnder, LOW); //hamer rust moment onder //
digitalWrite(coilBoven, LOW);
delay(50);
digitalWrite(coilOnder, LOW); //ram kan der 3 sec over doen om boven te komen en te stabiliseren//
digitalWrite(coilBoven, HIGH);
delay(800);
digitalWrite(coilOnder, LOW); //hamer slaat //
digitalWrite(coilBoven, LOW);
delay(50);
digitalWrite(coilOnder, HIGH); //hamer ram onder //
digitalWrite(coilBoven, LOW);

}

Ben nog even aan het rommelen geweest heb het werkend.
Er gaat nu vanaf de 3.3volt aansluiting naar de druk schakelaar daar vandaan naar poort 7 en heb een weerstandje naar de gnd gemaakt zodra ik met me hand in de buurt van de arduino kwam ging die al af

code:


int coilOnder = 10; // hamer ram laag
int coilBoven = 11; // hamer ram hoog
int button = 7; // start button

void setup() {
  pinMode(coilOnder, OUTPUT);
  pinMode(coilBoven, OUTPUT);
  pinMode(button, INPUT);
}

void loop() {
  if (digitalRead(button)) {
    speelAf();
  }
  delay(500); //dan kan de delay op einde van je speelAf komen te vervallen
}

void speelAf() {
  digitalWrite(coilOnder, LOW); //hamer rust moment onder //
  digitalWrite(coilBoven, LOW);
  delay(50);
  digitalWrite(coilOnder, LOW); //ram kan der 3 sec over doen om boven te komen en te stabiliseren//
  digitalWrite(coilBoven, HIGH);
  delay(1000);
  digitalWrite(coilOnder, LOW); //hamer slaat //
  digitalWrite(coilBoven, LOW);
  delay(50);
  digitalWrite(coilOnder, HIGH); //hamer ram onder //
  digitalWrite(coilBoven, LOW);
  delay(1000);
  digitalWrite(coilOnder, LOW); //hamer rust moment onder //
  digitalWrite(coilBoven, LOW);
  
}

benleentje

Golden Member

Als je het programma in code tag zet kies dan voor C.
code=c ..... /code (maar dan met haken er omheen

Er gaat nu vanaf de 3.3volt aansluiting naar de druk schakelaar daar vandaan naar poort 7 en heb een weerstandje naar de gnd gemaakt zodra ik met me hand in de buurt van de arduino kwam ging die al af

Dat is altijd erg belangrijk om eerst je schakeling goed en betrouwbaar te maken. Draden moeten goed vaswtzitten en goed contact maken anders werkt het nooit. Eigenlijk moet je wel gewoon 5V gebruiken, maar als het zo ook werkt is het ok.

[Bericht gewijzigd door benleentje op zondag 24 juni 2018 16:21:30 (11%)

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Met een delay(500) zal het wel werken, maar dit is een blokkerende functie : tijdens de delay kan de arduino niets anders meer doen ! Een andere manier is werken met een "flank", dat wil zeggen dat je de ingang bekijkt op een toestand die veranderd (in dit geval van laag naar hoog), en dan één maal de functie uitvoeren. Dit is erg eenvoudig, je moet wel een "hulp" variabele gebruiken :
setup
int hulpvariabele
loop{
if ((input==high)&(hulpvariabele==low) speelaf();
hulpvariabele=input;
}

Heb hem nu op de 5 volt gezet werkt goed bedankt voor de hulp.

Graag zou ik weten hoe je een c code kopieert

hier is nog een klein filmpje van de werking

benleentje

Golden Member

Graag zou ik weten hoe je een c code kopieert

Met knippen en plakken. IK werk met een PC en dan is het gewoon met de muis de tekst selecteren en dan ctrl+c en daarna ctrl+v

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
Lucky Luke

Golden Member

Op 24 juni 2018 17:32:05 schreef bas65:
Graag zou ik weten hoe je een c code kopieert

C code kopiëren kun je al, ik neem tenminste aan dat je het niet hebt overgetikt in je vorige posts...

Maar als je er code-tags omheen zet, wordt het ook goed weergegeven.

(Dat kan redelijk makkelijk met het een-na-meest rechtste symbooltje in het tekst-edit venster. Dus niet dat blauwe ohmteken, maar die links daarvan, met de rode < en > haakjes voor een stuk papier met rolrandjes)

Voorbeeldje (Je kunt mijn post bekijken door 'm te "quoten" en dat dan niet te posten):

c code:


#include <zwerk.h>
#inclode <sport.h>
#include <harry.h>
#include <stdio.h>


spel = zwerkbal(&Harry, &Zwerk);

spel.Start();

if(Spel.gewonnen()){
cout<<"joepie!";
}else cout<<"balen!";
Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

c code:

[/int coilOnder = 10; // hamer ram laag
int coilBoven = 11; // hamer ram hoog
int button = 7; // start button

void setup() {
  pinMode(coilOnder, OUTPUT);
  pinMode(coilBoven, OUTPUT);
  pinMode(button, INPUT);
}

void loop() {
  if (digitalRead(button)) {
    speelAf();
  }
  delay(500); //dan kan de delay op einde van je speelAf komen te vervallen
}

void speelAf() {
  digitalWrite(coilOnder, LOW); //hamer rust moment onder //
  digitalWrite(coilBoven, LOW);
  delay(50);
  digitalWrite(coilOnder, LOW); //ram kan der 3 sec over doen om boven te komen en te stabiliseren//
  digitalWrite(coilBoven, HIGH);
  delay(1000);
  digitalWrite(coilOnder, LOW); //hamer slaat //
  digitalWrite(coilBoven, LOW);
  delay(50);
  digitalWrite(coilOnder, HIGH); //hamer ram onder //
  digitalWrite(coilBoven, LOW);
  delay(1000);
  digitalWrite(coilOnder, LOW); //hamer rust moment onder //
  digitalWrite(coilBoven, LOW);

}
]

Het is gelukt bedankt voor de hulp

[Bericht gewijzigd door bas65 op zondag 24 juni 2018 19:09:27 (89%)

En nu nog even de [edit] knop ontdekken zodat het topic niet zo'n puinhoop wordt als nu :-)

Misschien is het hierboven al gezegd (dan heb ik het gemist): een loop kun je nooit maar 1x uitvoeren, want dan is het geen loop. In Arduino IDE is het de bedoeling dat die loop continu loopt, zolang er spanning op de micro staat. Als jij iets maar 1x wilt uitvoeren, moet je dat zelf zo programmeren, bv zoals hierboven aangedragen.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Lucky Luke

Golden Member

@ flipflop:

[code=C]
do {
dingen();
}while(false);
[/code]

Is dat (g)een loop?
En hoe vaak wordt 'ie uitgevoerd?

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)
KGE

Golden Member

Op 24 juni 2018 19:19:55 schreef Lucky Luke:
@ flipflop:

[code=C]
do {
dingen();
}while(false);
[/code]

Is dat (g)een loop?
En hoe vaak wordt 'ie uitgevoerd?

Dat is geen loop (de voorwaarde is tenslotte altijd niet waar) maar hij wordt wel 1 keer uitgevoerd (dus ook geen loop) omdat de voorwaarde pas achteraf wordt getest.

Nu word de loop gestopt zodra je de button los laat.
Maar dit is puur om te kijken of het werk.
Waar ik het in ga zetten heb ik twee schakelaars een push button en een andere schakelaar die gewoon ingedrukt blijft dus blijft de loop draaien
Het is erg belangrijk dat de loop pas stopt op het end en dat werkt nu goed.

Hoezo "loop wordt gestopt"? In die code van je hierboven loopt de loop gewoon door. Je doet alleen sommige dingen wel of niet terwijl de micro gewoon z'n rondjes blijft lopen in die loop. Stel, de loop zou eindigen, waar gaat de micro dan heen, welke instructies gaat ie daarna uitvoeren denk je?

@Lucky: als jij zulke code schrijft ben je een oelewapper :-)

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Zelf heb ik er geen verstand van maar als ik nu stroom op de arduino zet gebuurt er niks zolang de button niet in gedrukt word.
Als je hem in drukt gaat hij de loop rond en als je hem vast blijft houden gblijft die rond gaan.
Het werkt goed ik ben der blij mee

als je stroom op een arduino zet, gaat die eerst setup 1x doorlopen, en daarna gaat die de loop functie eeuwig en eeuwig doorlopen.

hij zal telkens zeggen:
-de knop is niet ingedrukt, ik wacht 400ms
400ms later:
-de knop is niet ingedrukt, ik wacht 400ms
400ms later:
-de knop is niet ingedrukt, ik wacht 400ms
400ms later:
-de knop is niet ingedrukt, ik wacht 400ms
400ms later:
-de knop is niet ingedrukt, ik wacht 400ms
400ms later:
...
tot jij de knop eens indrukt, dan zegt die
-de knop is wel ingedrukt, ik voer de functie 'speelAf' uit.
2100ms later gaat die weer kijken of de knop nog ingedrukt is....
hij stopt niet, hij blijft alles herhalen tot je een delay zet of hem op een andere weg stuurt (andere functie)

ik schrijf nu al iets anders. ik laat hem supersnel rondjes draaien in de loop.
en bv elke sec zeg ik eens: controlleer eens of er een knop is ingedrukt
elke 5sec zeg ik eens: refresh uw display informatie eens.
...
zodoende hoef ik nooit te wachten op delays in een functie, hij voert alles supersnel uit, alleen laat ik bepaalde delen slecht om de x tijd uitvoeren.dit voorkomt ook knipperen van het display.
als jij zou een procedure maken:
1) als de knop is ingedrukt, voer dit uit... en dit duurt 5sec.
2) refresh de getallen op u display.

als je de knop dan indrukt, gaat die elke 5sec het display refreshen. als je de knop echter niet indrukt, dan zit die 10keer per seconden het display te refreshen (want hij heeft niks anders te doen) en dan knippert de boel. dat merk je nog wel als je voor het probleem komt te staan ;-)

[Bericht gewijzigd door fcapri op maandag 25 juni 2018 00:05:11 (17%)

ik hou van werken ..., ik kan er uren naar kijken

Beste fcapri

Ik snap wel wat je bedoelt maar het werkt goed zo heb het net geprobeerd geen problemen
Ik gebruik de arduino echt alleen voor deze toepassing heb geen display of iets anders er aan hangen denk dat je het te goed wil maken maar bedank

nee, ik toon je alleen maar aan dat er geen moment is dat de arduino 'niks' doet.
die is continue door die loop aan het gaan. zonder die 400ms delay in je loop zou die 10000den keer per seconden door die loop gaan

ik hou van werken ..., ik kan er uren naar kijken
Lucky Luke

Golden Member

Op 24 juni 2018 21:05:23 schreef flipflop:
@Lucky: als jij zulke code schrijft ben je een oelewapper :-)

Werkt dat ook andersom? Dan hoop ik dat het de enige voorwaarde is :P

----

Trouwens @bas65, als je wil dat 'ie sneller op de schakelaar reageert is het helemaal niet erg om sneller te pollen, en dus

[code=C]
void loop() {
if (digitalRead(button)) {
speelAf();
delay(500); //dan kan de delay op einde van je speelAf komen te vervallen
}
}
[/code]
te doen.

Al vind ik het dan duidelijker de delay die bij speelAf hoort ook daar neer te zetten, zodat het

[code=C]
void loop() {
if (digitalRead(button)) speelAf();
}
[/code]

wordt.

Met het verhaal van die schakelaar die ingedrukt blijft erbij, begrijp ik dat het niet de bedoeling is. Maar als de bedoeling was dat de loop maar 1 keer zo lo(o)pen als de schakelaar wordt ingedrukt, en pas weer mag starten als 'ie wordt losgelaten en opnieuw ingedrukt, zou je het ook zo kunnen doen:

[code=C]
void loop() {
if (digitalRead(button)) {
speelAf();
while(digitalRead(button)) delay(150); // wait until button release w. debounce
}
}
[/code]
waarbij de delay wél belangrijk is, omdat als je een knop indrukt of loslaat deze niet direct een 1 of een 0 geeft, maar nog een tijdje blijft "twijfelen" en een reeks enen en nullen geeft (op de grens van wel/geen contact maken), door contactdender. Als die delay er niet stond, zou zo gauw de button is losgelaten die "if (digitalRead(button))" weer worder uitgevoerd, en als de knop dan nog aan het stuiteren is, is die if waar, en heb je dus dat speelAf nogmaals wordt uitgevoerd ondanks dat je de knop nu juist net losliet.

150ms is trouwens behoorlijk lang voor debouncing, een goede schakelaar is veel sneller uitgedenderd.

Oh, hehehehe >:), en als je sowiso een keer die debounce delay wilt, ook als je de knop allang hebt losgelaten tijdens speelAf, dan kan

[code=C]
void loop() {
if (digitalRead(button)) {
speelAf();
do delay(150) while(digitalRead(button)); // wait until button release w. at least one debounce period
}
}
[/code]
ook nog, en dan komt die oelewappercode nog van pas ook.

(Maar flipflop heeft gelijk. Het voorbeeld wat ik gaf van "deze loop wordt maar 1 keer uitgevoerd" is absurd. Als het echt maar 1 keer hoeft, zet je er natuurlijk geen do-while loop omheen.)

@KGE: die do-while constructie vind ik ongeacht de voorwaarde een loop-constructie, maar in dit simpele scenario zou 'ie weggeoptimaliseerd kunnen worden. Als de voorwaarde zou kunnen veranderen kan dat niet, en dan kan die voorwaarde alsnog af-en-toe false zijn... Maar het is natuurlijk een flauw voorbeeldje.

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

debouncing is hier niet echt nodig omdat de code opzich ook al genoeg delays had.
debouncing heb je nodig als je bij het indrukken bv een getal met 1 verhoogd. dan zou je per druk veeeel verhogen bij een korte loop.

of als je met interupts werkt, dan kan je niet anders (delays werken niet dan. tip: delayMicroseconds(150000) wel :-) )

ik hou van werken ..., ik kan er uren naar kijken

ja, en? daar slijt hij niet van hoor ;) en moe wordt ie ook niet :)