Encender LED desde bluetooth i interruptor.

Hola: estoy haciendo una casa domòtica y no consigo encender un led desde android bluetooth i un interruptor alternativamente a modo de un circuito comutado (encender o apagar desde cuaquiera de los dos sitios).
Consigo encender el LED desde el android solamente, pero cuando añado un interruptor en un pin de la placa arduino no consigo encenderlo desde el android, solo se enciende desde el interuptor.

¿Que tendria que cambiar para que funcione?
Gracias

char _ABVAR_1_rebut = ' ' ;

void PortaBalco();

void setup()
{
 pinMode( 4 , OUTPUT);
 Serial.begin(9600);
 digitalWrite( 4 , LOW );

}

void loop()
{
 _ABVAR_1_rebut = Serial.read();
 PortaBalco();
}

void PortaBalco()
{
 if (( ( ( _ABVAR_1_rebut ) == ('1') ) || ( ( analogRead(1) ) > ( 500 ) ) ))
 {
   digitalWrite( 4 , HIGH );
 }
 if (( ( ( _ABVAR_1_rebut ) == ('2') ) || ( ( analogRead(1) ) < ( 500 ) ) ))
 {
   digitalWrite( 4 , LOW );
 }
}

No se tú, pero lo prefiero que el código se vea así:

void setup()
{
  pinMode(4, OUTPUT);
  Serial.begin(9600);
  digitalWrite(4, LOW);

}

void loop()
{
  if (Serial.available())
    PortaBalco(Serial.read());
}

void PortaBalco(char dato)
{
  if (dato == '1')
    digitalWrite( 4 , HIGH );

  if (dato == '2')
    digitalWrite( 4 , LOW );
}

E INCLUSO ENTRE ETIQUETAS GENERADAS POR </> ; COSA QUE DEBES HACER EDITANDO EL PRIMER POST!!!

Lo que no sé, es qué hacían ahí esos analogRead; la más acertada posible causa de no lograr cambiar el estado utilizado comunicación serial.

Con tu còdigo enciendo el LED con el bluetooth del android solamente.
Yo quiero poder encender el led, como comento en mensaje original, desde el bluetooth i desde un pin digital o analògico donde conecto un interruptor a modo de circuito commutado (como si fuera la luz de la habitación que se puede encender desde dos commutadores).
Intento que se active desde bluetooht OR desde un pin analógico.

smarti65:
Con tu còdigo enciendo el LED con el bluetooth del android solamente.
Yo quiero poder encender el led, como comento en mensaje original, desde el bluetooth i desde un pin digital o analògico donde conecto un interruptor a modo de circuito commutado (como si fuera la luz de la habitación que se puede encender desde dos commutadores).
Intento que se active desde bluetooht OR desde un pin analógico.

Lo primero que tienes que cambiar es condicionar la lectura del serial a que haya datos disponible para leer ,si no hay datos para que leer y llamar a la funcion?

if (Serial.available()) { ..........

Si vas a usar un pulsador,usa el pin como digital ,no como analogico ,y comprueba su estado HIGH o LOW.

smarti65:
Intento que se active desde bluetooht OR desde un pin analógico.

Ese es el detalle; mientras tu interruptor se mantenga en cierto estado, el comando por serial lo logra cambiar... pero solo durante unos cuantos microsegundos, porque también hace caso al interruptor físico.

Ahora sí me vas captando?

¿Y porqué mejor no haces que las luces (o led) enciendan con temporizador y se apaguen solas?. Mira yo pensé lo mismo que tu y lo que me pasaba era que podía encender desde web pero no apagar desde el interruptor, por lo que tuve que hacer fué poner un circuito de relés que activara una u otra opción como un circuito 9/24 (busca esquemas de este tipo de circuitos eléctricos domiciliarios en internet).

Finalmente llegué a la conclusión de que lo más sencillo (además de ser más pro) era hacer que los interruptores web y físico, fuesen solo pulsadores y que pasados unos minutos la luz se apague sola.

Por web hice una interfaz que solo me indica si la luz está encendida o apagada, y tengo un botón de "apagado general" que apaga directamente todas las luces desde la web como un reset de sistema.

Lo mejor no es que las luces se apaguen solas por tiempo sino que se apaguen cuando no hay nadie en la habitación.
Tarea para el hogar!!

No consigo que funcione.
Funciona desde el interruptor pero desde el movil (bluetooth) no. Solo se enciente un momento cuando aprieto el boton y se apaga enseguida.
Alguna ayuda?
Gracias

char luzpisci = ' ' ;

void luz();

void setup()
{
  pinMode( 2, INPUT);
  pinMode( 13 , OUTPUT);
  Serial.begin(9600);
  digitalWrite( 13 , LOW );

  luzpisci = Serial.read();

}

void loop()
{
  luz();
}

void luz()
{
  if (( ( Serial.available() ) > ( 0 ) ))
  {
    luzpisci = Serial.read();
    if (( ( luzpisci ) == ('1') ))
    {
      digitalWrite( 13 , HIGH );
    }
    if (( ( luzpisci ) == ('2') ))
    {
      digitalWrite( 13 , LOW );
    }
  }
  if (( ( Serial.available() ) == ( 0 ) ))
  {
    if (( ( digitalRead(2) ) == ( HIGH ) ))
    {
      digitalWrite( 13 , HIGH );
    }
    if (( ( digitalRead(2) ) == ( LOW ) ))
    {
      digitalWrite( 13 , LOW );
    }
  }
}

smarti65:
No consigo que funcione.
Funciona desde el interruptor pero desde el movil (bluetooth) no. Solo se enciente un momento cuando aprieto el boton y se apaga enseguida.
Alguna ayuda?
Gracias

char luzpisci = ' ' ;

void luz();

void setup()
{
  pinMode( 2, INPUT);
  pinMode( 13 , OUTPUT);
  Serial.begin(9600);
  digitalWrite( 13 , LOW );

luzpisci = Serial.read();

}

void loop()
{
  luz();
}

void luz()
{
  if (( ( Serial.available() ) > ( 0 ) ))
  {
    luzpisci = Serial.read();
    if (( ( luzpisci ) == ('1') ))
    {
      digitalWrite( 13 , HIGH );
    }
    if (( ( luzpisci ) == ('2') ))
    {
      digitalWrite( 13 , LOW );
    }
  }
  if (( ( Serial.available() ) == ( 0 ) ))
  {
    if (( ( digitalRead(2) ) == ( HIGH ) ))
    {
      digitalWrite( 13 , HIGH );
    }
    if (( ( digitalRead(2) ) == ( LOW ) ))
    {
      digitalWrite( 13 , LOW );
    }
  }
}

A ver ,que me parece que te estas liando.....Tienes dos puntos que encienden tu luz ,uno a traves de la aplicacion ,y solo debe activarse cuando le mandes desde la aplicacion ,o sea solo te interesa la parte if (Serial.available()) {
Entonces ,arriba hablas de un conmutador para encender fisicamente,pero esto solo funciona si tienes otro conmutador en el otro punto donde enciendes la luz,por lo que si no tienes un conmutador que se pueda activar de alguna manera desde arduino no te vale,luego lo mas sencillo es un pulsador fisico (Como el del timbre por ejemplo)y un pulsador "digital" ,que es el de la aplicacion y los dos hacen lo mismo ,invertir el estado actual...

Quiero encender i apagar un led desde el movil i desde un interruptor físico conectado en un pin digital. Encender o apagar desde el movil solo si que funciona, pero cuando lo intento programar para que encienda i apague desde el movil i desde el interrupor no lo consigo. Solo se enciende desde el interruptor i desde el movil no funciona.
¿Alguna idea o codigo que provar?
Gràcias

smarti65:
Quiero encender i apagar un led desde el movil i desde un interruptor físico conectado en un pin digital. Encender o apagar desde el movil solo si que funciona, pero cuando lo intento programar para que encienda i apague desde el movil i desde el interrupor no lo consigo. Solo se enciende desde el interruptor i desde el movil no funciona.
¿Alguna idea o codigo que provar?
Gràcias

A ver si sacamos algo en claro ...tienes un interruptor de dos posiciones,si solo enciendes y apagas desde un mismo sitio ,esta claro que cada vez que acciones el interruptor ,si esta encendido se apaga y si esta apagado se enciende...hasta ahi bien no? Si queremos accionar desde dos puntos diferentes,necesitamos o bien dos interruptores conmutados ,o bien dos pulsadores tipo timbre (pulsamos y vuelve a su sitio ) .Si usas conmutados , entonces necesitas que de alguna manera el arduino (y la aplicacion mobil) sepa que has accionado el conmutado y viceversa.Si tienes dos pulsadores tipo timbre es mas facil porque simplemente inviertes el estado:si esta encendido se apaga y si esta apagado se enciende desde cualquier punto.Si usas pulsadores:

char luzpisci ;
 bool estado = false;
 #define PINBOTON 2 // Pin de entrada pulsador fisico
 #define LED 13
void setup() {
  pinMode( PINBOTON, INPUT);
  pinMode( LED , OUTPUT);
  Serial.begin(9600);
  digitalWrite( LED , estado );
}

void loop() {
  if ( Serial.available()  >  0  ) {
    luzpisci = Serial.read();
    if (luzpisci == '1') {  // Solo mandas 1
      estado = !estado;
      digitalWrite( LED , estado );
    }
  }
  if (digitalRead(PINBOTON) == HIGH) {
    estado = !estado;
    digitalWrite(LED,estado);
  }
}

Si no ,es un poco mas complicado.

Ahora lo he pillado, jose

Ahora si hace la funcion que quiero. Funciona desde un pulsador y desde el movil a traves de bluetooth.

De todas maneras desde el pulsador a veces falla. Si esta encendido y pulsas no se apaga a la primera y tienes que volver a pulsar para apagarlo (esto pasa algunas veces, no siempre)

surbyte:
Lo mejor no es que las luces se apaguen solas por tiempo sino que se apaguen cuando no hay nadie en la habitación.
Tarea para el hogar!!

Cierto @surbyte, era para ejemplificar la forma más simple, pero si le agregas un sensor IR a cada habitación puedes controlar que se encienda la luz cuando detecte movimiento, le sumas un temporizador de tiempo (contador) y se mantiene la luz encendida por la cantidad de minutos que le programes. Además agregándole un sensor de luminiscencia puedes regular con que luz natural quieres que se encienda. De ese modo las luces solo se encenderían al oscurecer y ahorras luz.

Si te pones creativo se vuelve bien entretenido tu proyecto.

Con un sensor IR no alcanza, necesitas dos.
Una doble barrera, detecta si entras o sales.
SI entras mantienes la luz encendida, y si sales la apagas.
Hasta aca lo que se puede hacer con Arduino, con Raspberry y una cámara se puede detectar con la imagen y hacer lo mismo con mayor nivel.

La doble barrera funciona muy bien.
Si entra 1 enciende, si entran 2, contamos 2, y si sale 1, el contador aún tiene uno entonces no apaga, hasta que diga 0.
Fácil no?

smarti65:
Ahora lo he pillado, jose

Ahora si hace la funcion que quiero. Funciona desde un pulsador y desde el movil a traves de bluetooth.

De todas maneras desde el pulsador a veces falla. Si esta encendido y pulsas no se apaga a la primera y tienes que volver a pulsar para apagarlo (esto pasa algunas veces, no siempre)

Habria que pulir cosillas como rebotes en pulsador (google: arduino debounce) y que de la manera que esta ahora ,manteniendo pulsado el boton fisico ,el estado del led cambia sucesiva y rapidamente de HIGH a LOW.Esto tiene que ver con la velocidad en que se ejecuta el loop (varias veces por segundo) .Habria que añadir una variable en la que guardar el estado actual de la salida (o guardar el valor de estado en otra variable)y solo variarla si el estado anterior es diferente al que se va a cambiar.Es decir si la entrada del boton esta en HIGH ,debe cambiar el estado solo si el nuevo estado es diferente al anterior.Experimenta un poco....