/* serial_pin_control_with_breathing - take commands from serial and light or
extinguish leds based on it
Demonstration of taking serial commands while doing something else.
*/
int max_led=7;
int min_led=2;
int state=0;
int position=0;
// the setup routine runs once when you press reset:
void setup() {
// initialize the digital pin as an output.
for (int pin=min_led;pin<=max_led;pin++)
{
pinMode(pin, OUTPUT);
digitalWrite(pin,LOW);
}
Serial.begin(115200);
pinMode(11, OUTPUT);
}
void loop(){
// breathing effect from http://sean.voisen.org/blog/2011/10/breathing-led-with-arduino/ to test using serialEvent to
// "multitask".
float val = (exp(sin(millis()/2000.0*PI)) - 0.36787944)*108.0;
analogWrite(11, val);
delay(1); // needed so that the digitalWrites in serialEvent() go through. I do not know why this is needed!
}
void serialEvent() {
Serial.println(state);
switch(state) {
case 0: {
char inChar = (char)Serial.read();
if (inChar!='\n') { // ignore newlines
position=atoi(&inChar);
state++;
}
break;
}
case 1: {
char inChar = (char)Serial.read();
if (inChar=='+') {
digitalWrite(min_led+position,HIGH);
} else if (inChar=='-') {
digitalWrite(min_led+position,LOW);
}
state=0;
Serial.println("command done");
break;
}
}
}
If I remove delay(1) from the loop, the serial routine works, but the LEDs do
not go on or off. If I remove both delay(1) and analogWrite(11, val) then the
LEDs work. The LEDs also work if loop() is blank.
Original issue reported on code.google.com by bmi...@gmail.com on 1 Nov 2012 at 2:46
Original issue reported on code.google.com by
bmi...@gmail.com
on 1 Nov 2012 at 2:46