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
 myservo.attach(10);
myservo.write(90);
}


void loop()
{
while (Serial.available() == 0); // do nothing if nothing sent
int val = Serial.read() - '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


 myservo.write(val);   
 delay(50);

 
}

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

 myservo.write(val);   
 

}


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

}
Serial.println(val);
//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".

Mark

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() {
  Serial.begin(9600);

  //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 = Serial.read();  //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: ");
          Serial.println(n);
          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);
        }
        else
        {   
          Serial.print("writing Angle: ");
          Serial.println(n);
          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
    }
  }
}