Incomingdata , getal hoger dan 9 invoeren ???

Hallo,

Ik ben een beetje aan het experimenteren met een Servo , en kom er niet uit om via de Serieel poort de servo aan te sturen met b.v 45 Graden,
Ik kan alleen maar een getal 0 - 9 invoeren maar wil eigenlijk dus de graden invoeren , zodat de Servo hierop wordt ingesteld:

Hieronder een stukje code , zodra ik nu 1 indruk via de serieel monitor , zal de Servo naar 45 graden gaan, maar wil dus 45 in kunnen voeren in de serieel monitor.

if (incomingData == '1'){
   myservo.write(45);
   Serial.println(message1);
   Serial.println();

Wie kan mij hiermee op weg helpen ?

Alvast hartelijk dank !!

Patrick,

Dag Patrick
Ik heb daar een blog post en een library voor geschreven.
De bedoeling van de blog post serie is om veel verder te gaan maar de eerste (en de tweede die ik nog moet schrijven) gaan over lijn per lijn over de seriele poort communiceren.
Hier kan je het vinden http://blog.baeyens.it/#post16
Vanaf dit stukje wordt het interressant voor jou

Lets get started:
As you probably know the easiest way to communicate with an arduino is the serial port. However the serial port is a byte by byte protocol and as such needs another layer to communicate at a higher level.

Met vriendelijke groet
Jantje

Hi Jantje,

Bedankt voor jou reply, alle respect voor jou blog link, maar kom er nog niet over uit hoe ik hiermee mijn probleem kan oplossen ,
Ik neem aan dat ik de iets moet aanpassen dat er een 10 tallen en honderdtallen worden herkend , maar zou iemand mij hiermee op weg kunnen helpen.

alvast hartelijk dank !!

Groet,

Patrick,

het probleem is dat je nu character per character leest.
Voor een getal heb je meerdere characters nodig. Dan is het probleem wanneer stoppen de characters.
Wat mensen doen is lijn per lijn lezen. En hoe je dat kan doen met men library leg ik dus uit in die blog post.
Met vriendelijke groet
Jantje

Hi Jantje ,

Dat is stap 1 , character per character is dus op dit moment HET probleem,
Zal nog eens goed naar jou Blog kijken of het mij nu wel duidelijker wordt ,
Ik wist niet in welke "hoek " ik mijn probleem moest zoeken,

Thanks !!

Patrick,

Als je serieel een aantal cijfers wil doorsturen voordat je er iets mee doe (dusb bijvoorbeel 145) dan moet jouw programma weten wanneer je gestopt bent met het invoeren van het getal. Een mogelijkheid die veel wordt toegepast is testen of het teken een CR(carriage return) of LF (line-feed of newline). In de Arduino kun je een teken testen op '\r'of '\n'. Als jij op de seriele monitor de enter indrukt, dan hoeft er niet perse een CR en/of LF meegegeven worden. Dat moet je instellen op de seriele monitor. De monitor zal vervolgens na het bijv. intypen van 145 "145\r\n" doorsturen naar jouw programma.
In jouw programma moet je dus:
a) tekens blijven accepteren in een buffer (en maak die niet te klein)
b) als je weet dat je een \r en \n gaat doorsturen hoef je de \r niet op te slaan (je doet er immers niets mee)
c) als de \n binnen komt dan zet je direct na het laatste teken dat je hebt ontvangen een '\0' zijn de "string terminator".
d) met de functie atoi(buffer) krijg je een int waarde terug van de string.

voorbeeld:

char buffer[10];     // ontvangst buffer
uint8_t index = 0;  // index in buffer
uint8_t waarde;     // resultaat
while(Serial.available() {
   char c = Serial.read();
   if (c == '\n') {
      //
      // we hebben een newline ontvangen
      //
      buffer[bufferIndex] = '\0';
   } else {
      if (c != '\r'){
         //
         // alles wat niet een CR is opslaan in de buffer
         //
         buffer[bufferIndex] = c;
         //
         // verhoog de buffer index
         //
         bufferIndex++;
         if (bufferIndex == (sizeof(buffer) -1) {
            //
            // een positie terug anders zitten we buiten de buffer te schrijven
            // 
            bufferIndex--;
            //
            // we krijgen meer binnen dan de buffer aankan
            //
            buffer[bufferIndex] = '\0';     // forceer einde inlezen van serieel
            break;
        }
    }
}
//
// converteer de string in een integer waarde
//
waarde = atoi(buffer);                     // waarde bevat nu de geconverteerde waarde van de string

zo ff uit de losse pols

nico
dit staat in de blog waar ik naar verwijs.

#include "SerialStringReader.h"
//for the stream you want to read info from you need to declare a SerialStringReader
//you can only have one
SerialStringReader myCommunicator;

//Define that the USB serial (pin 0 and 1 on the uno) is to be used by the mySerialReader
//If you want to use the yun with the bridge use Serial1
#define THESERIAL Serial
Stream &SerialInput = THESERIAL;
Stream &SerialOutput = THESERIAL;



void setup()
{
delay(2000);
THESERIAL.begin(115200);
SerialOutput.println("serialStringReaderDemo2");
myCommunicator.setup();
}

void loop()
{
//always add the following line to your loop
myCommunicator.loop();
//mySerialReader.messageReceived() will only return true when a line of data has arrived
if (myCommunicator.messageReceived())
{
SerialOutput.println("You have send a message to Arduino.");
SerialOutput.println("And the message is:");
// with mySerialReader.getMessage() we get the actual message
// for the demo we simply play it back.
SerialOutput.println(myCommunicator.getMessage());
}
}

gewoon

waarde = atoi(myCommunicator.getMessage());

toevoegen op de juiste plaats en klaar is kees.

Met vriendelijke groet
Jantje