Control servo from serial port

I don’t understand why my servo will only execute once.

It’s like it locks into the first posision I type and wont move.

This is my code:

#include <Servo.h> 
Servo myservo;  // create servo object to control a servo 

int val;    // variable to read the value from the analog pin 

void setup() {
Serial.begin(9600); // set serial speed

void loop()
while (Serial.available() == 0); // do nothing if nothing sent
int val = - '0'; // deduct ascii value of '0' to find numeric value of sent number

val = map(val, 0, 1023, 0, 179);  

if (val == 180) { // test for command 1 then turn on LED



if (val == 0) // test for command 0 then turn off LED



else // if not one of above command, do nothing

//Serial.flush(); // clear serial port

First to send the string "180" is at least 3 chars you need to get all the chars in the number. You also need a delimiter, something to tell you you have the whole string. That way you can tell the difference between 18 and 180.

Second drop the while it's pointless use

if (serial.available()>0){
  code to deal with the chars.

Third don't re-declare var's in the way you have for the int val and lookup "scope".


Servo test code.

//zoomkat 11-22-12 simple delimited ',' string parse 
//from serial port input (via serial monitor)
//and print result out serial port
//multi servos added 

String readString;
#include <Servo.h> 
Servo myservoa, myservob, myservoc, myservod;  // create servo object to control a servo 

void setup() {

  //myservoa.writeMicroseconds(1500); //set initial servo position if desired

  myservoa.attach(6);  //the pin for the servoa control
  myservob.attach(7);  //the pin for the servob control
  myservoc.attach(8);  //the pin for the servoc control
  myservod.attach(9);  //the pin for the servod control 
  Serial.println("multi-servo-delimit-test-dual-input-11-22-12"); // so I can keep track of what is loaded

void loop() {

  //expect single strings like 700a, or 1500c, or 2000d,
  //or like 30c, or 90a, or 180d,
  //or 30c,180b,70a,120d,

  if (Serial.available())  {
    char c =;  //gets one byte from serial buffer
    if (c == ',') {
      if (readString.length() >1) {
        Serial.println(readString); //prints string to serial port out

        int n = readString.toInt();  //convert readString into a number

        // auto select appropriate value, copied from someone elses code.
        if(n >= 500)
          Serial.print("writing Microseconds: ");
          if(readString.indexOf('a') >0) myservoa.writeMicroseconds(n);
          if(readString.indexOf('b') >0) myservob.writeMicroseconds(n);
          if(readString.indexOf('c') >0) myservoc.writeMicroseconds(n);
          if(readString.indexOf('d') >0) myservod.writeMicroseconds(n);
          Serial.print("writing Angle: ");
          if(readString.indexOf('a') >0) myservoa.write(n);
          if(readString.indexOf('b') >0) myservob.write(n);
          if(readString.indexOf('c') >0) myservoc.write(n);
          if(readString.indexOf('d') >0) myservod.write(n);
         readString=""; //clears variable for new input
    else {     
      readString += c; //makes the string readString