como hago mi codigo mas inteligente?

Hola!

Llevo un tiempo construyendo este robot basado en arduino
, he trabajado en varios de sus sectores tales como comunicaciones,hardware, codigo, ahora la parte mecanica esta relativamente terminada y deseo enfocarme un poco mas en el codigo, el codigo que posteo mas abajo ejecuta de manera basica los componentes de hardware a fin de probar motores posicones y comunicacion inalambrica pero tiene la limitacion de ser incapaz de realizar varias acciones a la vez es decir no puedo pestañear y abrir la boca simultaneamente, sino que debo esperar a que cada secuencia condicionada termine para que comience otra.

como se trata este problema a nivel de codigo?
como puedo ejecutar un proceso antes de que termine el anterior?
como se llamaria esta metodologia?, (para ir aprendiendo conceptos)

#include <SoftwareSerial.h>;

#define rxPin 2
#define txPin 1

char prevChar = 0;
int i = 0;

int a = 0;
SoftwareSerial rfSerial = SoftwareSerial(rxPin, txPin);

void setup(){

pinMode(rxPin, INPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
pinMode(9, OUTPUT);
pinMode(8, OUTPUT);
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);

rfSerial.begin(2400); // begin serial connection with RF Link unit
Serial.begin(2400); // begin serial communication over USB to the computer
digitalWrite(13, HIGH);
digitalWrite(4, HIGH);
digitalWrite(3, HIGH);
}

void loop(){

byte someChar = 0;
someChar = rfSerial.read(); // read whatever the RF Link has to offer

if(someChar==45){
//adelante
digitalWrite(12, HIGH);
digitalWrite(9, HIGH);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(8, HIGH);
digitalWrite(7, LOW);
delay(200);
}

if(someChar==54){
//atras
digitalWrite(12, HIGH);
digitalWrite(9, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(8, LOW);
digitalWrite(7, HIGH);
delay(200);
}

if(someChar==73){
//derecha
digitalWrite(12, HIGH);
digitalWrite(9, HIGH);
digitalWrite(11, HIGH);
digitalWrite(10, LOW);
digitalWrite(8, HIGH);
digitalWrite(7, LOW);// sets the LED on
delay(200);
}

if(someChar==77){
//izq
digitalWrite(12, HIGH);
digitalWrite(9, HIGH);
digitalWrite(11, LOW);
digitalWrite(10, HIGH);
digitalWrite(8, LOW);
digitalWrite(7, HIGH);// sets the LED on
delay(200);
}

if(someChar==34){
//ojos
for(i=0;i<20;i++){

digitalWrite(6, HIGH); // Turn the L motor on
delayMicroseconds(850); // Length of the pulse sets the motor position
digitalWrite(6, LOW); // Turn the L motor off
delay(20);
}
delay(50);

for(i=0;i<20;i++){
digitalWrite(6, HIGH); // Turn the L motor on
delayMicroseconds(300); // Length of the pulse sets the motor position
digitalWrite(6, LOW); // Turn the L motor off
delay(20);
}
delay(50);
}

if(someChar==43){
//boca
for(i=0;i<20;i++){

digitalWrite(5, HIGH); // Turn the L motor on
delayMicroseconds(750); // Length of the pulse sets the motor position
digitalWrite(5, LOW); // Turn the L motor off
delay(20);
}
delay(50);

for(i=0;i<20;i++){
digitalWrite(5, HIGH); // Turn the L motor on
delayMicroseconds(550); // Length of the pulse sets the motor position
digitalWrite(5, LOW); // Turn the L motor off
delay(20);
}
delay(50);
}

// digitalWrite(12,LOW);
digitalWrite(11,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(8,LOW);
digitalWrite(7,LOW);
Serial.println(someChar,DEC);

}

Hola
Si utilizas delays,estaras bloqueando todo el proceso

Echa un vistazo a este eejmplo a ver si te da una luz
http://svn.berlios.de/svnroot/repos/arduinolibs/trunk/I2C_SRF08n/examples/test_SRF08n_array.pde

Utilza tres dispositivos que se van refrescando con una frecuencia dada (200ms) y un 4o "proceso" que envia al puerto serie cada 500 ms. La idea es no utilizar nunca DELAYS sino contadores

Espero que te sirva

Revisa el codigo para el robot Asuro. No es lo mismo, está claro, pero puedes obtener ideas interesantes y de gran utilidad.

Hola,

lo mas sencillo es que hagas que cada una de tus funciones opere mediante contadores de tiempo. En lugar de ejecutar el codigo secuencialmente, lo que tienes que hacer es que se compruebe secuencialmente si lo has de ejecutar o no.

Ejemplo:

long timer = 0;
long alarm = 10000;
int status = 0;

void setup() {
  pinMode(13,OUTPUT);  // configura el pin 13 como salida
}

void loop() {
  long counter = millis();  // toma el tiempo desde que se inicio el sistema
  if (counter - timer >= alarm && !status) {
    digitalWrite(13, HIGH);
    status = 1;
  }
  if (counter - timer >= alarm*2 && status == 1) {
   digitalWrite(13, LOW);
   status = 0;
   timer = counter;
  }
}

Este programa es como el ejemplo blink, pero haciendo que el sistema no se pare al no haber ninguna llamada a la funcion delay()

/d