Casa inteligente- modulo ICSE014A Reles RX TX Ayuda! Adjunto código!

Buenas a todos.

LES AGRADEZCO A TODOS POR AYUDARME TANTO HASTA AHORA.

De seguro esto suena muy complejo pero al ver los códigos, para ustedes sea una tonteria :smiley:

Soy muy nuevo en esto, apenas tengo 15 años de edad, pero tengo muchas ganas de aprender.

La idea es controlar algunas cosas de la casa “cortinas, luces, regadores” mediante un modulo de reles.

ADJUNTO CODIGOS AL FINAL

tengo un modulo ICSE014A

conectado mediante RX TX a un arduino uno.

La idea es que al enviar una letra por el monitor serial se activen o apaguen los reles

Ej:

“A” se encienda el rele 1 al enviar “B” se apague
“C” se encienda el rele 1 al enviar “C” se apague

Debo admitir que esto de comunicarme con un modulo mediante RX TX en algo complejo para mi, hasta ahora usaba 5 reles conectados por pines individuales al arduino uno. PERO TENGO MUCHAS GANAS DE APRENDER.

Hasta ahora usaba “If” si

if (Serial.available()>0){
 
    input=Serial.read();
 
    if (input=='b'){

      digitalWrite(13, HIGH);//piloto de relay encendido en ON
   
      Serial.print("Reley 1 encendido");
 
    }
 
    else
 
    {
 
      Serial.print("..");
 
    }

ahora me gustaria usar If pero diciendo si es Ej:
si if (input==‘b’){ ENCENDER SOLO RELE 1) sino no hacer nada
si if (input==‘b’){ apagar SOLO RELE 1)

Adjunto los dos codigos.

codigo_ejemplo_1.ino (1.17 KB)

EJEMPLO_2.ino (1.01 KB)

.

Eso que propones no puede hacerse.
Ese módulo tiene un protocolo de comunicación que no puedes saltarte.
Ese protocolo esta al final de esta pagina.
Es sencillo enviando los códigos en Hexadecimal. Con un conversor Binario a Hexadecimal podrás activar o desactivar cualquier rele. En el ejemplo que se muestra están activados los relés K1, K6 y K8.

Lo primero es que te familiarices con el funcionamiento del modulo,segun esto: https://github.com/hwiguna/g33k/blob/master/ArduinoProjects/2015/_Done/108-Playing_with_relays/USB_Serial_Relay_Module/USB_Serial_Relay_Module.ino no parece muy complicado.Cuando el numero de opciones aumenta
es mejor usar switch,o por lo menos el codigo queda mas limpio.No me queda claro si lo que quieres hacer es un pulsador ,osea cada vez que recibe 'b' ,invierte el estado de la salida.Este ejemplo lo puedes hacer con solo un pulsador conectado a gnd y al pin 2 (o un cable ):

#define PIN_BUTTON 2
void setup() {
  Serial.begin(9600);
  pinMode(PIN_BUTTON,INPUT_PULLUP);
  // put your setup code here, to run once:

}

void loop() {
  if(Serial.available() > 0){
    char letra = Serial.read();
    switch(letra) {
      case 'b' :
        digitalWrite(LED_BUILTIN,! digitalRead(LED_BUILTIN));
        break;
      default:
        Serial.println("Caracter no reconocido");
    }
  }
}

Es solo un ejemplo ,deberas adaptarlo para enviarlo al modulo.

Jopapa:
Eso que propones no puede hacerse.
Ese módulo tiene un protocolo de comunicación que no puedes saltarte.
Ese protocolo esta al final de esta pagina.
Es sencillo enviando los códigos en Hexadecimal. Con un conversor Binario a Hexadecimal podrás activar o desactivar cualquier rele. En el ejemplo que se muestra están activados los relés K1, K6 y K8.

Primero MUCHAS GRACIAS POR AYUDARME
Ya he leido ese coigo muchas veces y aun asi no logro como hacerlo. no necesariamente tengo que enviar A o B, puedo enviar lo que tenga que enviar
puede ser 00000001 y que eso solo encienda el reley 8

enviar 00000000 y que eso apague el relay 8.
pero no logro hacerlo

#include <SoftwareSerial.h> //libreria para usar el puerto rx tx

SoftwareSerial mySerial(10, 11); // RX, TX //declaro pin10 como rx y pin11 tx

int input;
 
void setup(){
 
  pinMode(13, OUTPUT); // Declaramos que utilizaremos el pin 13 como salida lo usaremos de piloto // relat encendido
 
  Serial.begin(9600);
  mySerial.begin(9600);
  mySerial.write( (byte)0x50);
  delay(1000);
}
 
void loop(){

 
    input=Serial.read();
 
    if (input=='b'){

      digitalWrite(13, HIGH);//piloto de relay encendido en ON
      mySerial.write( (byte)0x51);
      mySerial.write( (byte)0XAA); //Enciende el relay (10101010) k1 k3 k5 k7??
      Serial.print("Reley  encendido");
 
    }
 
    else
 
    {
 
      digitalWrite(13, LOW); //piloto de relay encendido en OOF
      mySerial.write((byte)0x51);
      mySerial.write((byte)0x55); //apaga el relay (10101010) k1 k3 k5 k7 ??
 
    }}

Estoy intentando esto pero aun asi no puedo

jose:
Lo primero es que te familiarices con el funcionamiento del modulo,segun esto: https://github.com/hwiguna/g33k/blob/master/ArduinoProjects/2015/_Done/108-Playing_with_relays/USB_Serial_Relay_Module/USB_Serial_Relay_Module.ino no parece muy complicado.Cuando el numero de opciones aumenta
es mejor usar switch,o por lo menos el codigo queda mas limpio.No me queda claro si lo que quieres hacer es un pulsador ,osea cada vez que recibe 'b' ,invierte el estado de la salida.Este ejemplo lo puedes hacer con solo un pulsador conectado a gnd y al pin 2 (o un cable ):

#define PIN_BUTTON 2

void setup() {
  Serial.begin(9600);
  pinMode(PIN_BUTTON,INPUT_PULLUP);
  // put your setup code here, to run once:

}

void loop() {
  if(Serial.available() > 0){
    char letra = Serial.read();
    switch(letra) {
      case 'b' :
        digitalWrite(LED_BUILTIN,! digitalRead(LED_BUILTIN));
        break;
      default:
        Serial.println("Caracter no reconocido");
    }
  }
}



Es solo un ejemplo ,deberas adaptarlo para enviarlo al modulo.

Muchas gracias por ayudar.

Es que el modulo recibe los datos por una comunicación serial RX TX.

tengo que enviarle la senial para encender el rele que yo quiero encender

Es que el modulo recibe los datos por una comunicación serial RX TX.

Ya lo se ,el ejemplo es para que vieras el modo de hacerlo con switch case.

A ver hay varias maneras de enfocarlo,una de ellas podria ser una variable de tipo byte que almacene el estado de tus reles (los 8 bits que representan los 8 reles ).Para simplificarlo envio por serial directamente el numero de rele a modificar ,se lee su estado y se invierte (si esta encendido se apaga y si esta apagado se enciende) y se actualiza el estado de la imagen.No lo he probado ,no tengo esa placa,pero la salida por serial parece correcta.

#include <SoftwareSerial.h> //libreria para usar el puerto rx tx
SoftwareSerial mySerial(10, 11); // RX, TX //declaro pin10 como rx y pin11 tx
const byte RELE1 = 0;
const byte RELE2 = 1;
const byte RELE3 = 2;
const byte RELE4 = 3;
const byte RELE5 = 4;
const byte RELE6 = 5;
const byte RELE7 = 6;
const byte RELE8 = 7;
byte imagen = B11111111; // Variable que guarda el estado de los reles

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  mySerial.write( (byte)0x50);
  delay(1000);
}

void outRele(byte numRele){
  byte aux = bitRead(imagen,numRele);
  aux = ! aux;
  bitWrite(imagen,numRele,aux);
  mySerial.write((byte)0x51);
  mySerial.write(imagen);
  Serial.println(imagen,BIN);
}
void loop() {
  if(Serial.available() > 0){
    char c = Serial.read();
    switch (c) {
      case '1':
        outRele(RELE1);
      break;
      case '2':
        outRele(RELE2);
      break;
      case '3':
        outRele(RELE3);
      break;
      case '4':
        outRele(RELE4);
      break;
      case '5':
        outRele(RELE5);
      break;
      case '6':
        outRele(RELE6);
      break;
      case '7':
        outRele(RELE7);
      break;
      case '8':
        outRele(RELE8);
      break;
      default:
        Serial.println("Comando no valido");
    }
  }
  // put your main code here, to run repeatedly:

}