Arduino + shield gsm sim900

Amigos, tengo conectado a mi arduino uno un shield gsm sim900, con el programa hago que se activen 3 reles para controlar focos en mi casa, los mismos se activan por un mensaje de texto, pero cuando quiero incluir otro relé u otro foco solo puedo encenderlo y no lo puedo apagar, los comandos funcionan con los tres reles perfectamente pero los mismos comandos no funcionan con el cuarto rele en lo que respecta apagar el foco.

Este es el código que utilizo:

void loop()
{
// Si un caracter entra desde el módulo celular ...
if(SIM900.available()>0)
{
inchar=SIM900.read();
if (inchar == '#')
{
delay(10);
inchar=SIM900.read();
if (inchar == 'a')
{
delay(10);
inchar=SIM900.read();
if (inchar == '0')
{
digitalWrite(led1, LOW);
}
else if (inchar == '1')
{
digitalWrite(led1, HIGH);
}
delay(10);
inchar=SIM900.read();
if (inchar == 'b')
{
inchar=SIM900.read();
if (inchar == '0')
{
digitalWrite(led2, LOW);
}
else if (inchar == '1')
{
digitalWrite(led2, HIGH);
}
delay(10);
inchar=SIM900.read();
if (inchar == 'c')
{
inchar=SIM900.read();
if (inchar == '0')
{
digitalWrite(led3, LOW);
}
else if(inchar == '1')
{
digitalWrite(led3, HIGH);
}
delay (10);
inchar=SIM900.read();
if (inchar == 'd')
{
delay(10);
inchar=SIM900.read();
if (inchar == '0')
{
digitalWrite(led4, LOW);
}
else if (inchar == '1');
{
digitalWrite(led4, HIGH);
}
delay(10);

}
}
SIM900.println("AT+CMGD=1,4"); //Borra todos los mensajes
}

}
}
}
}

a ver si esto resuelve tu problema

void loop() {
   char accion;
  // Si un caracter entra desde el módulo celular ...
     char comando = leoSIM900();

     switch(comando){
    	case 'a': controlLED(led1);
    	          break;
    	case 'b': controlLED(led2);
    	          break;

    	case 'c': controlLED(led3);
    	          break;

    	case 'd': controlLED(led4);
    	          break;

        default:  SIM900.println("AT+CMGD=1,4"); //Borra todos los mensajes
    		 	  break;
    }
}

char leoSIM900() {
    delay(10);
    if (SIM900.available()>0)   {
      char inchar=SIM900.read();
      return inchar;
    }
}

void controlLEDs(const char pinLed){
    delay(10);
	if (SIM900.available()>0)   {
		char accion = SIM900.read();
		switch (accion) {
			case '1': digitalWrite(pinLed, HIGH);
					  break;
			case '0': digitalWrite(pinLed, LOW);
					  break;
		}
	}
}

Me detuve en 'd' pero puedes seguir agregando condicones al switch case
ejemplo

    	case 'e': controlLED(led5);
    	          break;

Estimado surbyte, muchas gracias por la información, he implementado la variación que me recomiendas pero no me funciona, envio un mensaje de texto "a1" se supone que debe encender el led 1, pero no sucede, talves mi problema esta en la declaración del pinLed. Como tendría que declararlo en en el void setup?? yo lo tengo actualmente así antes del void loop:

#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Suli.h>

#define PIN_TX 7
#define PIN_RX 8
#define BAUDRATE 19200

char inchar; //Llevará a cabo el carácter entrante del escudo GSM (ya no seria necesario)
SoftwareSerial SIM900(7, 8);

int led1 = 2;
int led2 = 3;
int led3 = 4;
int led4 = 5;

void setup()
{
Serial.begin(19200);
// configurar los pines digitales para controlar
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);

digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);

// Despertar el shield GSM
SIM900power();
SIM900.begin(19200);
delay(2000); // Dará tiempo para iniciar sesión en la red .
SIM900.print("AT+CMGF=1\r"); // Modo de SMS texto
delay(100);
Serial.println("Listo...");
}

void SIM900power()
// Botón de "encendido" equivalente en software de pulsar el boton de "power"en el shield GSM
{
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(7000);
}

Espero tus comentarios Gracias

DXMP7:
Estimado surbyte, muchas gracias por la información, he implementado la variación que me recomiendas pero no me funciona, envio un mensaje de texto "a1" se supone que debe encender el led 1, pero no sucede, talves mi problema esta en la declaración del pinLed. Como tendría que declararlo en en el void setup?? yo lo tengo actualmente así antes del void loop:

#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Suli.h>

#define PIN_TX 7
#define PIN_RX 8
#define BAUDRATE 19200

char inchar; //Llevará a cabo el carácter entrante del escudo GSM (ya no seria necesario)
SoftwareSerial SIM900(7, 8);

int led1 = 2;
int led2 = 3;
int led3 = 4;
int led4 = 5;

void setup()
{
Serial.begin(19200);
// configurar los pines digitales para controlar
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);

digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);

// Despertar el shield GSM
SIM900power();
SIM900.begin(19200);
delay(2000); // Dará tiempo para iniciar sesión en la red .
SIM900.print("AT+CMGF=1\r"); // Modo de SMS texto
delay(100);
Serial.println("Listo...");
}

void SIM900power()
// Botón de "encendido" equivalente en software de pulsar el boton de "power"en el shield GSM
{
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(7000);
}

Espero tus comentarios Gracias

Edita el post y añade las etiqueta para codigo, asi evitamos que salga el hombecillo amarillo con las gafas de sol y te podemos ayudar mejor

Bueno para aproximarlo mas a tu idea quita el

if (SIM900.available()>0)   {

prueba con esto

void controlLEDs(const char pinLed){
      delay(10);
  	 char accion = SIM900.read();
	switch (accion) {
			case '1': digitalWrite(pinLed, HIGH);
					 break;
			case '0': digitalWrite(pinLed, LOW);
					 break;
	}
}
[color=#222222][/color]

Estimado surbyte, te comento que el código no funciona, ya le realice las ultimas modificaciones y la verdad me perdi, no se en donde esta el problema, te escribo todo el código para que lo revices y si tienes alguna idea de como solucionar que funcione para 4 leds te agradecería. Gracias y saludos.

#include <GPRS_Shield_Arduino.h>
#include <SoftwareSerial.h>
#include <Wire.h>
#include <Suli.h>

#define PIN_TX 7
#define PIN_RX 8
#define BAUDRATE 19200

char inchar; //Llevará a cabo el carácter entrante del escudo GSM
SoftwareSerial SIM900(7, 8);

int led1 = 2;
int led2 = 3;
int led3 = 4;
int led4 = 5;

void setup()
{
Serial.begin(19200);
// configurar los pines digitales para controlar
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);

digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);

// Despertar el shield GSM
SIM900power();
SIM900.begin(19200);
delay(2000); // Dará tiempo para iniciar sesión en la red .
SIM900.print("AT+CMGF=1\r"); // Modo de SMS texto
delay(100);
Serial.println("Listo...");
}

void SIM900power()
// Botón de "encendido" equivalente en software de pulsar el boton de "power"en el shield GSM
{
digitalWrite(9, HIGH);
delay(1000);
digitalWrite(9, LOW);
delay(7000);
}

void loop()
{
char accion;
// Si un caracter entra desde el m'odulo celular...
char comando = leoSIM900();

switch(comando)
{
case 'a': controlLED(led1);
break;
case 'b': controlLED(led2);
break;
case 'c': controlLED(led3);
break;
case 'd': controlLED(led4);
break;
default: SIM900.println("AT+CMGD=1,4"); //Borra todos los mensajes
break;
}
}

char leoSIM900()
{
delay(10);
if (SIM900.available()>0)
{
char inchar=SIM900.read();
return inchar;
}
}

void controlLED(const char pinLed)
{
delay(10);
char accion = SIM900.read();

switch (accion)
{
case '1': digitalWrite(pinLed, HIGH);
break;
case '0': digitalWrite(pinLed, LOW);
break;
}
}

Por favor usa los tags!! Lee las normas y sabrás como hacerlo.
Te mandé privado para intentar por whatsapp.

Estimados,

Les comento que buscando solución a mi problema, porfín logre arreglarlo, había un problema en unas librerías, las quite y funcionó mi programa original !!!, les agradezco el interés por ayudar de todos modos expongo la solución:

Elimine las librerias

#include <GPRS_Shield_Arduino.h>
#include <Wire.h>
#include <Suli.h>

Solo mantuve

#include <SoftwareSerial.h>

En el resto lo puse igual