ik heb onderstaand sketch gemaakt maar het probleem is dat deze opdracht niet reageert op de schakelaar van van mijn rc controller
het is de bedoeling dat door de schakelaar op ON te zetten er 4 elektra motoren op een volgend gaan draaien maar dit mag maar 1x alleen als de schakelaar is omgezet op ON, hoe de motoren te laten draaien is het probleem niet het zit hem juist in de actie van de schakelaar
zie hier de code
int switchPin = 2; // Pin voor de schakelaar
int switchState = 0; // Variabele om de staat van de schakelaar op te slaan
bool switchDetected = false; // Vlag om te controleren of de schakelaar is gedetecteerd
bool executed = false; // Vlag om te controleren of de code al is uitgevoerd
void setup() {
pinMode(switchPin, INPUT); // Stel de switchPin in als input
Serial.begin(9600); // Start de seriële communicatie
}
void loop() {
switchState = digitalRead(switchPin); // Lees de staat van de schakelaar
// Controleer of de schakelaar AAN is
if (switchState == HIGH && !switchDetected) {
switchDetected = true; // Markeer dat de schakelaar is gedetecteerd
}
// Voer de code uit als de schakelaar is gedetecteerd en de code nog niet is uitgevoerd
if (switchDetected && !executed) {
Serial.println("Schakelaar AAN! De code wordt uitgevoerd.");
// Voer hier de code uit die je slechts eenmaal wilt uitvoeren
// ...
executed = true; // Stel de vlag in op 'true' zodat de code niet opnieuw wordt uitgevoerd
}
// Voer hier de rest van je programma uit
// ...
}
Je vertelt dat de code niet werkt en de schakelaar niet gezien wordt.
Je code vertelt dat je gaat kijken of er een HIGH binnenkomt.
Maar ik mis informatie over hoe de schakelaar aangesloten is.
Daarom moet ik er van uit gaan dat het hier een hardware fout is en daarom de schakelaar niet juist afgehandeld kan worden.
Ik raad je aan om de schakelaar aan de ene kant met de GND ("min") te verbinden en de andere kant met jouw pin 2.
Daarna verander je je code naar deze regels in plaats van de bijna corresponderende regels die er nu staan:
pinMode(switchPin, INPUT_PULLUP); // Stel de switchPin in als input en maak die standaard HOOG
En if (switchState == LOW && !switchDetected) {
Hierdoor zorg je dat wanneer de schakelaar geen verbinding maakt, de Arduino pin 2 niet zweeft en daardoor niet bekend is wat er binnenkomt, maar een HIGH ziet.
Dat doe je door intern in je Arduino een weerstand aan te zetten die aan de 5 volt hangt (en dus omhoog trekt; PULLUP) .
Wanneer je nu je schakelaar verbinding laat maken, trekt die die ingang harder naar GND dan de weerstand 'm aan 5 volt kan houden, en kan er daarom een LOW geregistreerd worden.
Op deze manier kun je pin 2 betrouwbaar uitlezen.
In de elektronica bestaat er ook een PULLDOWN, maar dat ondersteunt de Arduino niet (dan moet je dat zelf zo maken, maar waarom zou je dat doen als het op deze manier ook kan).
Zoals je ziet, ziet de code die ik getypt heb er anders uit dan de gewone tekst.
Als je naar je eerste bericht kijkt en daar de code opzoekt, dan zie je dat er daar halverwege iets vreemds gebeurt.
Ik heb hier gebruik gemaakt van "code tags".
Dat kun je doen door in de editor waarin je je bericht typt, op het knopje <code/> te klikken.
Hiermee voorkom je ongewenste effecten en kan je code beter gelezen en / of gekopieerd worden naar de Arduino IDE om jou beter te kunnen helpen.
Dus de volgende keer graag dat knopje gebruiken wanneer je weer code gaat plaatsen.
Laat even weten of dit antwoord je probleem oplost.
Beste,
het is niet zo dat hij de schakelaar niet ziet het probleem zit er in het niet onthouden dat een opdracht is uitgevoerd
ik heb onderstaande deel sketch gemaakt en dit werkt perfect op de schakelaar alleen is deze niet eenmalig maar moet zelf op off gezet worden
typ of plak hier code
int led1 = 10;
int led2 = 11;
const int Switchpin = 2;
int Switchstate = 0;
void setup() {
// put your setup code here, to run once:
pinMode (led1, OUTPUT);
pinMode (led2, OUTPUT);
pinMode (Switchpin, INPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
int pulseWidth = pulseIn(Switchpin,HIGH);
if (pulseWidth >1000){
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
Serial.print("schakelaar aan ");
Serial.println("gele led is uit");
delay(500);
} else {
digitalWrite(led1, LOW);
Serial.print("schakelaar is uit ");
digitalWrite(led2, HIGH);
Serial.println("gele led brand nu");
delay(500);
}Gebruik code tags om code te formatteren voor het forum
In je testsketch gebruik je de seriële verbinding om te zien wat er gebeurt.
Dat heet debugging, en het is een heel sterk hulpmiddel.
Pak je originele sketch er weer bij en maak daar ook (tijdelijk) gebruik van de seriële verbinding om zo te weten te komen wat er gebeurt met de variabelen switchState, switchDetected en executed.
Ik verwacht dat je dan dichter bij de oorzaak gaat komen.
Je kunt deze debug methode ook gebruiken om te zien dat je aan je voorwaarden voldoet (de regels die beginnen met "if"), maar daar heb je ook al wat mee gedaan zie ik.
Executed staat in de eerste door jou geplaatste code.
Executed betekent uitgevoerd.
Het doel van executed is dat je onthoudt dat de knop is ingedrukt, en in dit geval (de getoonde code) zal het daarna verhinderen dat de code voor je 4 motoren ooit nog zal worden uitgevoerd.
Jouw beschrijving van wat je wil, geeft dat ook aan.
Maar shooter's antwoord beschrijft wat je moet doen wanneer je telkens als de knop opnieuw wordt ingedrukt, dat stukje code moet worden uitgevoerd.
Het zou dus kunnen dat dat werkelijk is wat je wil bereiken.
Hier zie je weer dat het heel belangrijk is dat je exact omschrijft wat je wil.
Niet alleen hier op het forum, maar ook voor jezelf als je je code aan het schrijven bent.
Mijn vraag is dus: wil je dat de 4 motoren maar 1 keer worden ingeschakeld sinds het aanzetten van je Arduino ?
Of wil je dat de 4 motoren telkens 1 keer worden aangezet na het opnieuw indrukken van de knop ?
En of het probleem wat je ziet is dat je knopdruk 1 keer werkt en daarna nooit meer ?
Je hebt gelijk ,sorry voor de onduidelijkheid
Het is inderdaad zo dat elke keer de schakelaar omgezet is de 4 motoren opeen volgend gaan draaien en daarna wachten totat de schakelaar weer omgezet wordt
Ik hoop dat het zo duidelijker is,sorry voor het ongemak
Excuses zijn niet nodig hoor.
En ik ben een zeurneus, dus nu krijg ik van je door dat je telkens de motoren wil laten draaien wanneer de schakelaar is omgezet.
Omgezet betekent voor mij dat ie van uit naar aan gaat, maar ook dat ie van aan naar uit gaat.
Wanneer dat je bedoeling is, kan dat ook gemaakt worden, maar dan is weer een net iets andere aanpak nodig dan degene die ik hier onder beschrijf.
Maar eerst; klopt het dan wel dat de motoren 1 keer gaan lopen, of lukt dat ook niet ?
In het geval dat je 1 keer de motoren wil laten draaien nadat de schakelaar van uit naar aan is gegaan (en dus niet van aan naar uit), heeft shooter dus gelijk, en moet je executed weer op false zetten, maar ook switchDetected.
Dat kan bijvoorbeeld door deze controle uit te voeren:
Dit is een kopie uit jouw code die ik heb aangepast, jij moet dan dat stukje nog in jouw code zetten op een geschikte plaats.
Hierna zouden de motoren netjes moeten reageren telkens wanneer je knop ingedrukt is, en nog een keer bij de volgende knopdruk enzovoorts.
Wil je dat er telkens als de schakelaar verandert en het daarbij niet uitmaakt of ie daarna aan of uit staat, dan moet het dus net iets anders worden afgehandeld.
Laat even weten of je hiermee geholpen bent.