Pin digitali finiti, modulo xbee wirless per arduino uno o arduino mega

Salve a tutti, siccome ho bisogno di fare un progetto con molte uscite ed entrate digitali ho bisogno di avere una scheda più grande. sono a conoscenza che i pin analogici si possono usare anche come digitali ma purtroppo mi servono tutti. Esistono shield che ti fanno aumentare i pin? se non esistono in tal caso vorrei prendere un arduino mega 2560 cosi non avrei problemi. L'unica cosa è che piu avanti andrò a comprare i moduli per la comunicazione wireless tra arduino e pc, ma non so se esistono shield compatibili per arduino mega 2560. Qualcuno mi può aiutare?

Puoi usare degli expander I2C.
Cosa devi comandare?

Ci sono anche shield già pronte ma costano uno sproposito --> http://www.robotshop.com/en/i-o-port-expander-shield-arduino.html oppure http://www.goshield.es/en/goshield/89-io-expander-32-bits-i2c.html
L'I2C usa i pin A4 e A5 che quindi non dovranno essere utilizzati per altre funzioni, però ne guadagni molti di più.

Perfetto, allora comprero l'expander.

ultima domanda, se ho un codice tipo cosi:

void loop() {
    //motore
  switchState=digitalRead(switchPin);
  if (switchState == HIGH) {
    digitalWrite(motorPin, HIGH);
  }
  else{
    digitalWrite(motorPin, LOW);
  }
  //FINE MOTORE
//porta bassa l'uscita del trigger
digitalWrite( triggerPort, LOW );
 
//invia un impulso di 10microsec su trigger
digitalWrite( triggerPort, HIGH );
delayMicroseconds( 10 );
digitalWrite( triggerPort, LOW );
 
long duration = pulseIn( echoPort, HIGH );
 
long r = 0.034 * duration / 2;
 
Serial.print( "durata: " );
Serial.print( duration );
Serial.print( " , " );
Serial.print( "distanza: " );
 
//dopo 38ms è fuori dalla portata del sensore
if( duration > 38000 ) Serial.println( "fuori portata");
else { Serial.print( r );
Serial.println( "cm" );
lcd.clear();
lcd.print(r);}
 
//aspetta 1.5 secondi
delay( 500 );

if(r<=30){
  tone(speaker, 350);
delay(1000);
noTone(speaker);
delay(1000);
}
else{noTone(speaker);}
}

dove il loop è piuttosto lungo, in pratica a volte quando premo il tasto e la distanza del sensore è maggiore di 30 il motore si spenge e si accende se pigio il tasto, ma quando la distanza è sotto i 30cm, ovvero quando lo speaker suona se premo il tasto il motore non si avvia e devo aspettare circa 3-4 secondi, tempo che lo speaker abbia finito tutto, come posso fare?

ps. per intertire il motore devo usare un ponte h? perche sto controllando per ora 1 motore, ma dovrei aggiungere 1 altro motore e di conseguenza, siccome è una macchinina ho bisogno di invertire la direzione di tutti e due i motori (avanti indietro, destra sinistra)uso un ponte h oppure?

Leggi il Regolamento al punto 7 e riedita il post precedente includendo il codice con i tag CODE.

Se usi il delay il micro si ferma e aspetta. Nessun sensore è letto in quel lasso di tempo.
Se vuoi un codice più interattivo vedi l'esempio dell'IDE "blink without delay".

Mi scuso.

const int ledPin =  13;      // the number of the LED pin

// Variables will change:
int ledState = LOW;             // ledState used to set the LED
long previousMillis = 0;        // will store last time LED was updated

// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000;           // interval at which to blink (milliseconds)

void setup() {
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);      
}

void loop()
{
  // here is where you'd put code that needs to be running all the time.

  // check to see if it's time to blink the LED; that is, if the 
  // difference between the current time and last time you blinked 
  // the LED is bigger than the interval at which you want to 
  // blink the LED.
  unsigned long currentMillis = millis();
 
  if(currentMillis - previousMillis > interval) {
    // save the last time you blinked the LED 
    previousMillis = currentMillis;   

    // if the LED is off turn it on and vice-versa:
    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
  }
}

ok il codice è questo, solo non riesco a capirne il funzionamento