Via de serial monitor een command geven om de een methode te stoppen

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 "); 
      }

  }
}

Add trim()

 if(Serial.available()>0)
 {
    command = Serial.readStringUntil('\n');
    command.trim(); // remove \r\n

dus het wordt
command = Serial.readStringUntil('\n');
command.trim(parkeersysteem); // remove \r\n

ik begrijp zo niet wat die .trim doet
hij moet de de programma void parkeersysteem(); stoppen

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

zien
Arduino Software Solutions
How to write Timers and Delays in Arduino
Multi-tasking in Arduino

bedankt ik heb deze pagina's al eerder gevonden alleen wordt er niet wijzer op

Hoi opelvectra.

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.

1 Like

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 :slight_smile: 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()

void serieelmonitor()
{

  String command;
  if (Serial.available() > 0)
  {
    ...
    ...
  }
  else
  {
    if (command == "buzzer uit")
    {
      ...
      ...
    }
  }
}

De else hoort bij if(Serial.available()>0). Als er geen seriele data beschikbaar is ga je controleren of command gelijk is aan buzzer uit ?

Je kunt een vlag gebruiken die aangeeft of pakeersysteem() moet worden uitgevoerd. Voeg het onderstaande toe voor setup()

bool parkeersysteemUitvoeren = true;

In serieelmonitor kun je nu de vlag zetten of wissen

void serieelmonitor()
{
  String command;
  if (Serial.available() > 0)
  {
    command = Serial.readStringUntil('\n');
    command.trim();
    if (command == "buzzer aan")
    {
      parkeersysteemUitvoeren = false;
      buzzertoeter.setbuzzerOn();
      Serial.println("buzzer is aan ");
    }
    else if (command == "buzzer uit")
    {
      parkeersysteemUitvoeren = true;
      buzzertoeter.setbuzzerOff();
      Serial.println("buzzer is uit ");
    }
  }
}

En je kunt nu op twee manieren voorkomen dat pakeersysteem() doet wat het moet doen.

1) pakeersysteem() niet aanroepen gebaseerd op de vlag

void loop()
{
  if (pakeersysteemUitvoeren == true)
  {
    parkeersysteem();
  }
  deuropen();
  deurdicht();
  serieelmonitor();
}

2) in pakeersysteem() de vlag controleren en de funktie afbreken

void pakeersysteem()
{
  if (parkeersysteemUitvoeren == false)
  {
    return;
  }

  // bestaande code hier
}
1 Like

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 :smiley:

Maar dat terzijde.

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.

dus het wordt zoals dit

void serieelmonitor()

{
 String tekstRegel = "#""%";
if(Serial.available()>0)
  {
    char readByte = Serial.read();	
    tekstRegel += readByte;			
    if(readByte == "#""%")		 
    {
      Serial.println(tekstRegel);	
      tekstRegel = ""; 			
    }
  }
  String command;
  if (Serial.available() > 0)
  {
    //command = Serial.readStringUntil('\n');
   // command.trim();
    if (char == "buzzer aan")
    {
      pakeersysteemUitvoeren = false;
      buzzertoeter.setbuzzerOn();
      greenled.setLedOff();
      yellowled.setLedOff();
      redled.setLedOff();
      Serial.println("buzzer is aan ");
    }
    else if (char == "buzzer uit")
    {
      pakeersysteemUitvoeren = true;
      buzzertoeter.setbuzzerOff();
      Serial.println("buzzer is uit ");
    }
  }
}

ik heb ook een andere voorbeeld gevonden

String message = "";            // Essential! Initialize to empty string

void loop() 
{
  if (Serial.available() > 0)
  {     
    char readChar = (char) Serial.read(); // 'Convert' to needed type
    message = message + readChar;         // concatenate char to message
  }

  if(message.length() == 5)               // dumb but just as example
  {
    Serial.print("The last 5 characters I received: ");   
    Serial.println(message); 
    message = "";    
  }
}

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.

sterretje ik heb het bijna werkend gekregen alleen werkt de code niet ik krijg een foutmelding van 'HandleMessage' was not declared in this scope

void serieelmonitor()
{
String SerieelCommando = "";
bool   communicatieGestart = false;

const char  startKarakter = '#';
const char  eindKarakter  = '%';

  if (Serial.available() > 0)
  {
    char readByte = Serial.read();  // lees karakter als deze beschikbaar is
    if (readByte == startKarakter)
    {
      SerieelCommando = "";              // leeg buffer
      communicatieGestart = true;        // markeer als gestart
    }
    else if (communicatieGestart)
    {
      if (readByte == eindKarakter)
      {
        communicatieGestart = false;      // Stop communicatie
        HandleMessage(SerieelCommando);   // Voor actie uit op basis van bericht
      }
      else
      {
        SerieelCommando += readByte;      // voeg toe aan opgebouwde string
      }
    }
  }
}
void HandleMessage(String Message)
{
  if (Message.equals("buzzer is aan"))       // bericht moet hetzelfde als commando zijn
  {
    pakeersysteemUitvoeren = false;
      buzzertoeter.setbuzzerOn();
      greenled.setLedOff();
      yellowled.setLedOff();
      redled.setLedOff();
      Serial.println("buzzer is aan ");
  }
  else if (Message.equals("buzzer is uit")) // bericht moet hetzelfde als commando zijn
  {
   pakeersysteemUitvoeren = false;
      buzzertoeter.setbuzzerOn();
      greenled.setLedOff();
      yellowled.setLedOff();
      redled.setLedOff();
      Serial.println("buzzer is uit ");
  }

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.