Go Down

Topic: Help reading a number over serial? (Read 992 times) previous topic - next topic

Cybot

I wanted a simple control of voltage over USB serial, where i type in a number in the serial moniter and it sets that number to the pin, but i know that the serial is sending the ascii numbers or something... anyway here's my code.

Quote


void setup(void) {
 // initialize inputs/outputs
 pinMode(8,OUTPUT);
 pinMode(9,OUTPUT);
 pinMode(10,OUTPUT);
 pinMode(11,OUTPUT);
 int val;
 digitalWrite(8,LOW);
 digitalWrite(10,LOW);

 // begin the serial communication
 Serial.begin(9600);
}

void loop()
{
 int val;
 val == 0;
 if (Serial.available()) {
  val = Serial.read();
   analogWrite(9, val);
   analogWrite(11, val);
   delay(200);}
  Serial.print(val);
}




Is there any way to get it so that i type 225 into a serial program and it sends that value to the board?
Thanks in advance, Cybot.
Cybot

mem

#1
Mar 09, 2009, 08:55 am Last Edit: Mar 09, 2009, 09:00 am by mem Reason: 1
Try something like this:
Code: [Select]

// code for receiving a value followed by a letter
// that writes the value to an analog pin corrosponding to that letter

int analogPins[] = {3, 5, 6, 9, 10, 11};  // 'a','b','c','d','e','f'

void setup()
{
 Serial.begin(9600);
}


void loop()
{
 serviceSerial();
}

// serviceSerial expects data in the form:
// "255a"  - analog writes 255 to pin 3
// "127c"  - analog writes 127 to pin 6
// "0f"    - analog writes 0 to pin 11
void serviceSerial()
{
 static int val = 0;

 if ( Serial.available()) {
   char ch = Serial.read();

   if(ch >= '0' && ch <= '9')              // is ch a number?  
     val = val * 10 + ch - '0';            // yes, accumulate the value
   else if(ch >= 'a' && ch <= 'f'){        // is ch a letter for one of the analog pins?
      int pin = analogPins[ch - 'a'];      // use the letter to index into the pin array
      analogWrite(pin, val);               // write the previously received val to the pin  
   }
 }
}


sending a value followed by a letter writes the value to an analog pin corrosponding to the letter :

send: "255a" to analog writes 255 to pin 3
send  "127c"  to analog writes 127 to pin 6
send: "0f"   to analog write 0 to pin 11

I have not run the code but it should get you going in the right direction.

Have fun!

Cybot

works better but it isnt writing the value i give it, eg i think that when i send 450d it write 200 to pin 9...
Cybot

mem

#3
Mar 09, 2009, 11:02 am Last Edit: Mar 09, 2009, 11:09 am by mem Reason: 1
try setting val to 0 after the pin identifer is received
you may also want to add some print statments immediatly after the analogWrite
Code: [Select]

  analogWrite(pin, val); // the exisiting analogWrite statement      
  Serial.print(pin,DEC);
  Serial.print("->");
  Serial.println(val,DEC);
   val = 0;

     
edit: added suggestion to reset val to 0 

Anachrocomputer

Quote
when i send 450d


450 is out of the legal range of 0-255 (decimal).  You'll need to either add some error-checking and reject numbers greater than 255, or accept that the code will truncate the number to 8 bits.

Cybot

Now that makes sence, Thanks for all your help!
Cybot

Go Up