ik ben bezig om om via de seriele monitor een command te geven als ik buzzer aan type hij de methode parkeersysteem(); uit zet ik ga werken met state is er iemand die mij kan helpen om dit werkend te krijgen ik heb al serial.read en state = command gedaan allen krijg ik een error ik zal hieronder mijn code toevoegen . om het simpel te houden als ik buzzer aan type via de seriele monitor moet hij de void parkeer syteem even stoppen en mijn code van serieelmonitor uitvoeren zodra ik buzzer uit zet moet hij de programma weer hervatten .
void serieelmonitor()
{
String command;
if(Serial.available()>0)
{
command = Serial.readStringUntil('\n');
if(command == "buzzer aan")
{
buzzertoeter.setbuzzerOn();
Serial.println("buzzer is aan ");
}
}
else
{
if (command == "buzzer uit")
{
buzzertoeter.setbuzzerOff();
Serial.println("buzzer is uit ");
}
}
}
Terwijl readStringUntil('\n') de '\n' niet retourneert als je regeleinden CR en LF hebt, zal er een afsluitende \r zijn die trim() zal verwijderen.
Opmerking command.trim() werkt op de opdracht en neemt geen enkel argument aan
ik zie het al ik heb een type foutje gemaakt inplaats methode moet het een functie zijn . hij moet de functie void parkeersysteem(); stoppen en mijn programma van buzzer aan uitvoeren totdat ik buzzer uit zet . nu was ik aan het experimenten met state zoals als buzzer aan is dan moet deze functie stoppen . als het makkelijker is om de gehele code erbij te zetten om te begrijpen was ik wil maken zou ik het kunnen doen
De antwoorden van drmpf kunnen wat lastig te lezen zijn, omdat drmpf niet in het Nederlands communiceert, maar in hun eigen taal dat dan via een online translator (google translate waarschijnlijk) naar het Nederlands omzet.
Google Translate werkt heel goed, maar zeer zeker niet perfect.
Daarom is het bijvoorbeeld wat lastig om antwoord 3 in deze thread goed te begrijpen, maar toch is de poging je te helpen lovenswaardig.
Zou je inderdaad je echte code kunnen laten zien ?
Want de pseudocode die ik boven zie verraadt niet echt wat er nu mis is.
sorry voor de late reactie ik zal even me gehele code toevoegen ik ben nu aan het leren en mocht een eigen project maken . de bedoeling is zodra ik buzzer aan in de serieel monitor type dan zou de programma van parkeersysteem(); even op stop gezet moeten worden , zodra ik buzzer uit type dan mag de programma zich weer herhalen.
#include <Arduino.h>
#include "../include/Led.h"
#include "../include/ultrasoon.h"
#include "../include/Motor.h"
#include "../include/button.h"
#include "../include/buzzer.h"
Led redled;
Led greenled;
Led yellowled;
Ultrasoon ultrasoonSensor;
motor myMotor;
buzzer buzzertoeter;
Button button1;
Button button2;
void pakeersysteem();
void deuropen();
void deurdicht();
void serieelmonitor();
void setup()
{
Serial.begin(9600);
redled.init(4);
yellowled.init(5);
greenled.init(6);
ultrasoonSensor.init(2, 3);
myMotor.init(9);
buzzertoeter.init(10);
button1.init(7);
button2.init(8);
}
void loop()
{
pakeersysteem();
deuropen();
deurdicht();
serieelmonitor();
}
void pakeersysteem()
{
long distance = ultrasoonSensor.readDistance();
if ((distance > 50) && (distance <= 200))
{ // groene led gaat aan
greenled.setLedOn();
yellowled.setLedOff();
redled.setLedOff();
buzzertoeter.setbuzzerOff();
}
else if ((distance> 20) && (distance <= 50))
{ // geele led gaat aan
greenled.setLedOff();
yellowled.setLedOn();
redled.setLedOff();
buzzertoeter.setbuzzerOff();
}
else if (distance <= 10)
{ // rode led gaat aan
greenled.setLedOff();
yellowled.setLedOff();
redled.setLedOn();
buzzertoeter.setbuzzerOn();
}
Serial.print(distance);
Serial.println(" cm ");
delay(1000);
}
void deuropen()
{
if (button1.isPressed())
{
myMotor.getDegree();
}
}
void deurdicht()
{
if (button1.isPressed())
{
myMotor.getDegree();
}
}
void serieelmonitor()
{
String command;
if(Serial.available()>0)
{
command = Serial.readStringUntil('\n');
command.trim();
if(command == "buzzer aan")
{
buzzertoeter.setbuzzerOn();
Serial.println("buzzer is aan ");
//Serial.print(freq);
// state gewoon variable
}
}
else
{
if (command == "buzzer uit")
{
buzzertoeter.setbuzzerOff();
Serial.println("buzzer is uit ");
}
}
}
Moeten wij raden wat de fout is Gezien alle files die je include wordt het erg moeilijk voor ons om dat te bepalen aangezien wij die niet hebben. Het is ook vrij ongebruikelijk in de Arduino wereld om header files in en aparte directory te hebben. Maar OK.
Verder zit er vermoedelijk een fout in je logica in serieelmonitor()
sterretje bedankt voor de informatie . Dat de header files in en aparte directory zit vind het zelf ook raar en moeilijk allen voor de opleiding moet er geprogrammeerd worden in visual studio code , want de code moet object georiënteerd geprogrammeerd zijn. Ik ga zometeen aan de slag met de code/advies die ik kreeg van u. Als het werkt of ik heb nog wat vragen zal ik het hier melden.
De plaats van de header files heeft niks te maken met object georienteerd programmeren; ook het gebruik van visual studio code niet. Als je geen klassen (en bijbehorende zaken gebruikt) zal je programma nooit object georienteerd zijn
sterretje ik heb de code aan gepast en wat aangepast en het werkt nu na behoren. hierbij ben ik vergeten om een protocool in te maken er moeten
Marker voor start van bericht : ‘#’
Marker voor einde van bericht : ‘%’
Voorbeeld compleet bericht: “#SET_LED_ON%”
dit moet ik aanpassen in mijn programma van serieelmonitor . hieronder zet ik een code wat ik als voor beeld heb gevonden . zou dit misschien wat makkelijker kunnen uitleggen
De karakters # en % mogen niet in een bericht ‘payload’, boodschap, gebruikt worden.
String tekstRegel = "";
void setup() {
Serial.begin(115200); // Start seriële communicatie op 115200 baud
}
void loop() {
if(Serial.available()>0)
{
char readByte = Serial.read(); // lees karakter als deze beschikbaar is
tekstRegel += readByte; // voeg toe aan opgebouwde string
if(readByte == '.') // is gelezen karakter het eind karakter
{
Serial.println(tekstRegel); // dan string afdrukken
tekstRegel = ""; // en nieuwe string opbouwen
}
}
// Hier kun je de rest van jou programma uitvoeren
}
Pas als je een compleet bericht hebt gevonden, kan je er ook iets mee doen.
Wat moet je doen? Stel jezelf de volgende vragen:
Is het gereconstrueerde bericht, een bericht van je protocol?
Wat is de betekenis van dat ontvangen bericht? En wat moet er dus gebeuren?
Voorbeeld:
Na het ontvangen van “#SET_buzzer_ON%” moet er een buzzer aan gaan. of uit
Dat is duidelijk, want anders kun je niet meer onderscheiden of het je start- of stopteken is.
Je mag dus niet zeggen "#SET_LED_75%%" om die LED met 75% helderheid te laten oplichten.
In het voorbeeld dat je hebt gevonden, word het einde van een regel opgezocht door te zoeken naar een punt '.' .
Maar in het voorbeeld word ook eerst het gelezen karakter toegevoegd aan je tekstregel, en daarna pas gekeken of het misschien een punt was.
Dus in dat voorbeeld word de punt netjes mee afgedrukt.
Jij mag de # en de % niet meenemen, aldus jouw opdracht.
Dus moet je eerst kijken of je een verboden teken hebt, daarna kun je pas besluiten of het binnengekomen teken ook aan de regel toegevoegd moet worden.
Het stukje in het voorbeeld waar de regel na het afdrukken wordt gewist heb je ook niet nodig.
Want je weet van te voren dat er nu een nieuwe regel aankomt.
Dus wanneer je hebt geconcludeerd dat dit een nieuwe regel is, dan kun je de oude regel (of wat er ook in je buffertje zit) wissen.
Lees een voorbeeld zoals dit heel goed door, en maak een plaatje in je hoofd van wat dat doet.
Doe dat een paar keer achter elkaar, en dan ook nog een paar keen met je opdracht er bij.
Dan kun je alvast bedenken wat je wel, misschien een beetje aangepast, in jouw code kunt gebruiken.
Het voorbeeld dat je hebt gevonden kan je dus heel goed helpen precies te doen wat er van je gevraagd word.
Dat compileert niet echt geweldig; in de Arduino IDE krijg ik de volgende waarschuwing als ik die regel in in een programma plak:
C:\Users\sterretje\AppData\Local\Temp\arduino_modified_sketch_754369\sketch_jun19a.ino: In function 'void setup()':
C:\Users\sterretje\AppData\Local\Temp\arduino_modified_sketch_754369\sketch_jun19a.ino:4:21: warning: comparison with string literal results in unspecified behavior [-Waddress]
if(readByte == "#""%")
^~~
readByte is een karakter; een karakter kun je niet vergelijken met een c-string of String.
En deze geeft een fout
if (char == "buzzer aan")
Dat geeft
C:\Users\sterretje\AppData\Local\Temp\arduino_modified_sketch_587854\sketch_jun19a.ino: In function 'void setup()':
sketch_jun19a:4: error: expected primary-expression before 'char'
if (char == "buzzer aan")
^~~~
Hoewel het onderstaande geen waarschuwingen of fouten geeft heb ik geen idee wat het echt zal doen.
String tekstRegel = "#""%";
En dit betekent waarschijnlijk dat na het eerste karakter (bv de #), tekstregel nu #%# is.
...
...
tekstRegel += readByte;
Als je op zoekt bent naar voorbeelden, stel ik voor dat je voorbeeld 3 in Robin's updated [serial input basics[(Serial Input Basics - updated) eens bestudeert. Bestudeer het, begrijp het en masseer het in een vorm die je kunt gebruiken met bv. een String object.