Comunicacion Serial por RF con APC220 plz

Hola estimados soy nuevo en el forito :slight_smile:

Resulta que estoy realizando un proyecto con arduino y los m贸dulos de radiofrecuencia APC220 que son bidireccionales.
Necesito hacer que con un boton del emisor haga prender una salida de rele ubicada en el receptor, la cual esta ligada a una condici贸n de temperatura, es decir que cuando llegue a una cierta temperatura (que esto lo tengo pensado hacer con una termocupla) se desactive la salida de rele y a su ves me mande un mensaje al control (emisor) y prenda un led o un spiker para avisar que esta a la temperatura adecuada.

Mi problema es el siguiente:

Logre coneccion entre un arduino y el otro pero al parecer cuando doy la se帽al de encender, el receptor prende y apaga mi salida de rele pero no hace nada mas :c, le pongo 2 leds 1 para ver si prende y apaga y otro que lo tengo ligado a un registro para hacer que apague con el sensor de temperatura pero este queda prendido y no apaga con nada :C, resulta que pareciera que no toma ninguna otra funci贸n mas que prender y apagar una salida :C, creo que es problema del programa pero en realidad no se como solucionarlo.

 programa emisor
聽  
int btn = 2; // Bot贸n Contacto 
int almacenamiento;

//C贸digo para el transmisor

void setup ()聽  {聽 
聽 Serial.begin (9600);聽 // abrir el puerto serie, 9600
pinMode (btn, OUTPUT);聽  // establece como salida 
pinMode (13, OUTPUT);
pinMode (12, OUTPUT); 

}

void loop ()聽  {
 
if (digitalRead (btn) == HIGH){聽 // si se pulsa el bot贸n - enviar 1 
digitalWrite (13, HIGH);
delay (10);
Serial.println (1); 
delay(20);聽 
almacenamiento=1;

}
else聽 聽 聽 聽 聽 聽 聽 聽  // de lo contrario - 0 
 Serial.println (0);
 delay(20);
 digitalWrite (13,LOW);
if (almacenamiento == 1) {
聽  digitalWrite (12,HIGH);
}
 else
聽 digitalWrite (12,LOW);
 

}

y este es el programa del receptor donde iria el rele y la termocupla

int val; // Variable para almacenar el car谩cter 
int caso;
int sensor= A0;
int LED = 13; // Contacto LED 
int encendido =10; // Contacto Tweeters 


void setup ()聽  {

Serial.begin (9600);聽  // abre el puerto serie, 9600聽 
pinMode (sensor, INPUT); 
pinMode (LED, OUTPUT); // conjunto el rendimiento 
pinMode (encendido, OUTPUT);

} 
void loop () {

if (Serial.available ()>0)聽 { // leer los datos recibidos 
val = Serial.read ();聽 聽  
}
if ( val == '1') {聽 // si el s铆mbolo "1", el LED y zumbador

caso=1;
Serial.flush();
//digitalWrite(LED, HIGH);聽 聽 聽  
//digitalWrite(encendido,HIGH);

}聽 聽 
if (val == '0') { // si el s铆mbolo "0" apagar el LED y zumbador聽  

caso=2;
//digitalWrite (LED, LOW) ; 

}

if ( sensor == '1') {
聽 caso=3;

}

switch (caso) {
聽 case 1:
聽  digitalWrite(LED, HIGH);聽 聽 聽  
聽  digitalWrite(encendido,HIGH); 
聽  break;

聽  case 2:
聽 聽  digitalWrite (LED, LOW) ; 
聽  break;

聽  case 3:
聽 聽  digitalWrite (encendido, LOW);
聽 聽  break;
}

聽 聽 
 
}

no se en que estare fallando porfavor si me pudiesen ayudar se los agradeceria, saludos

UP, alguien que pueda ayudarme ? que sepa utilizar bn el puerto serial? :S creo q por ahi va la cosa D= el como mandar un dato por serial y que el otro arduino tome ese dato lo almacene y ese registro pueda manejar las las salidas sujeto a condiciones :C.

mmmmm :S enserio nadie me puede ayudar? :/.... u orientar? u_u

Creo que el problema lo.tienes en la.declaraci贸n de variables. Si val tiene que almacenar un car谩cter debe ser char no int. Y sensor si es int no puede almacenar el valor A0

Saludos

Juanjo

en realidad val tiene que almacenar un 0 o un 1 y el int del sensor dice q A0(salida analogica) es = a sensor

ya logre hacer que me apague la salida con la condicion si el sensor es HIGH mi problema es que ahora necesito mandar al arduino emisor un mensaje que le diga que esta listo para que este encienda un spiker o un led de aviso.

puse que cuando el sensor sea alto apague la salida y imprima con Serial.println (3) osea q en el puerto serial imprima el valor 3 pero no se como hacer que el emisor lea ese 3 para almacenarlo, ya que constante mente esta enviando un 0 al serial indicando que el pulsador no esta siendo ejecutado :C, alguien sabe como puedo hacer para que deje de mandar los 0 y se ponga en modo receptor? para recibir el 3 del otro arduino?

este es el codigo del transmisor (o control remoto)

int btn = 2; // Bot贸n Contacto 
byte listo;
int almacenamiento;

//C贸digo para el transmisor

void setup () 聽 { 聽
 聽Serial.begin (9600); 聽// abrir el puerto serie, 9600
pinMode (btn, OUTPUT); 聽 // establece como salida 
pinMode (13, OUTPUT);
pinMode (12, OUTPUT); 

}

void loop () 聽 {
 
if (digitalRead (btn) == HIGH){ 聽// si se pulsa el bot贸n - enviar 1 
digitalWrite (13, HIGH);
delay (10);
Serial.println (1); 
delay(20); 聽
almacenamiento=1;

}
else 聽 聽 聽 聽 聽 聽 聽 聽 // de lo contrario - 0 
 Serial.println (0);
 delay(20);
 digitalWrite (13,LOW);
if (almacenamiento == 1) {
 聽 digitalWrite (12,HIGH);
}
 else
 聽digitalWrite (12,LOW);

if (Serial.available()) {
 聽listo=Serial.read();
}
 if ((listo == '3')) {
 聽almacenamiento = 0;
 }
}

al final el if q puse es para que lea el 3 del puerto serial pero no lo hace :c

y asi quedo el el codigo del receptor que maneja la salida de rele

byte val; // Variable para almacenar el car谩cter 
int caso;
//int sensor= 3;
int LED = 13; // Contacto LED 
int encendido =10; // Contacto Tweeters 


void setup () 聽 {


pinMode (3, INPUT); 
pinMode (LED, OUTPUT); // conjunto el rendimiento 
pinMode (encendido, OUTPUT);
Serial.begin (9600); 聽 // abre el puerto serie, 9600 聽
} 
void loop () {

if (Serial.available ()) 聽{ // leer los datos recibidos 
val = Serial.read (); 聽 聽 
}
if ((val == '1')) { 聽// si el s铆mbolo "1", el LED y zumbador

caso=1;

//digitalWrite(LED, HIGH); 聽 聽 聽 
//digitalWrite(encendido,HIGH);

} 聽 聽
if ((val == '0')) { // si el s铆mbolo "0" apagar el LED y zumbador 聽 

caso=2;
//digitalWrite (LED, LOW) ; 
}

switch (caso) {
 聽 case 0:
 聽 digitalWrite(LED, LOW); 
 聽 digitalWrite (encendido, LOW);
 聽 聽
 聽 break;
 聽 
 聽case 1:
 聽 digitalWrite(LED, HIGH); 聽 聽 聽 
 聽 digitalWrite(encendido,HIGH); 

 聽 break;

 聽 case 2:
 聽 聽 digitalWrite (LED, LOW) ;
 聽 聽 if (digitalRead(3)==HIGH){
 聽 聽 聽digitalWrite (encendido, LOW);
 聽 聽 聽Serial.println('3');
 聽 聽 聽delay(20);
 聽 聽 }

 聽 
 聽 聽 break;

}
 聽 聽
}

PD: gracias por responder T-T me sentia dejado de lado :C

realmente nadie sabe??? :S

驴Por qu茅 declaras el pin btn como OUTPUT? Entiendo que deber铆a ser INPUT, pues despu茅s lo lees, 驴no?
He visto adem谩s varias cosillas m谩s que no has controlado, como un else sin llaves despu茅s:

else聽 聽 聽 聽 聽 聽 聽 聽  // de lo contrario - 0
 Serial.println (0);
 delay(20);
 digitalWrite (13,LOW);

驴Sabes que el 煤nico comando que se ejecutar谩 dentro de else es el primero? (serial.println(0))
Los otros dos se ejecutar谩n siempre, pues se consideran fuera del if/else.
Veo adem谩s que eval煤as el bot贸n y act煤as seg煤n su estado en todos los loop, en lugar de detectar y comunicar s贸lo los cambios de estado, con lo que tu transmisor estar谩 constantemente enviando unos o ceros. Yo me centrar铆a en enviar un solo dato cuando sea necesario, pero establecer una conversaci贸n para asegurar que se ha recibido ese comando. Hay m谩s cosillas, pero primero deber铆as explicar mejor qu茅 deseas exactamente que hagan tu emisor y receptor, porque yo al menos no lo he entendido.

La verdad es que no tengo nada claro que debe hacer tu programa

Veamos...

  1. Cada vez que env铆as un 1 del transmisor al receptor se deben activar un el rel茅 (PIN10) y un led(PIN13)

  2. Dices que tienes un sensor de temperatura en el PIN3, con lo que se supone que esperas una se帽al anal贸gica (PIN A0 en tu primer intento de c贸digo), y sin embargo lo est谩s leyendo como digital

case 2:
聽 聽 聽 聽 digitalWrite (LED, LOW) ;
聽 聽 聽 聽 if (digitalRead(3)==HIGH){
聽 聽 聽 聽 聽 digitalWrite (encendido, LOW);
聽 聽 聽 聽 聽 Serial.println('3');
聽 聽 聽 聽 聽 delay(20);
聽 聽 聽 聽 }
聽 聽 聽  break;
  1. El receptor env铆a un '3' al emisor.驴Cu谩l es el fin?

Opino como noter. Est谩s enviando datos seg煤n el estado del bot贸n y no sobre el cambio del mismo. Si mantienes pulsado eternamente el bot贸n del emisor, mandar谩 1 sin parar, y 0 cuando dejas de pulsarlo.

Saludos,

Juanjo

gracias por responder T-T

miren basicamente lo que necesito es esto:

tengo un control remoto(emisor) el cual al pulsar el boton tiene que activar una salida de rele que se encuentra en el receptor, esta salida tiene que quedar activa hasta que llegue a cierta temperatura(para eso el sensor de temperatura) y cuando llegue a esa temepratura el receptor le mande un mensaje al emisor para que me active un led o un spiker para avisar que esta listo.

mi problema reside en que no se como hacer bien la comunicacion entre los dos arduinos, se que los modulos APC220 son bidireccionales y que trabajan con el puerto serial, pero efectivamente como lo dice noter, no se como hacer para que me mande los datos en determinado momento y deje de enviar para no estar mandando constantemente puros 0 y 1 y quede el serial tomado con estos datos :C

se que quizas el programa tiene muchas inconsistencias pero de verdad no tengo muy claro de como hacerlo no se si podrian ayudarme con el codigo porfavor?

up, aun estoy a la espera de que llegue alg煤n h茅roe y me ayude :c

up alguien que pueda echarme una mano??

Estas esperando que te hagan el programa, pero ya te han dicho donde esta el problema. Trabaja sobre ello en lugar de esperar el h茅roe.
Tienes los elementos para resolverlo. Usa Serial.print para monitorear que estas recibiendo y encontrar la falla. Me comprendes?

no estoy esperando que me hagan el programa, estoy pidiendo si alguien me puede explicar como hacer que el programa evalu茅 si el bot贸n esta en 0 o 1 en determinado momento sin que este mandando constantemente esa informaci贸n al serial, lo explique arriba :S , lo que necesito es que alguien me explique un poco como es el tema del serial en la comunicaci贸n de los 2 m贸dulos. Por que en estos momentos esta constantemente enviando 0 en el serial y si se activa el bot贸n empieza a mandar 1 constantemente, necesito que mande ese 0 y ese 1 solo 1 vez y guarde el registro para ser evaluado despu茅s, pero no se mucho del serial

Pero ya te lo explicaron, solo que no lo entiendes.
Porque no haces esto. Olvida por un momento tus dos equipos RF y te conectas con un Arduino a tu monitor Serie. y aprendes con el monitor serie como si fuera el otro Arduino la comunicaci贸n Serie.
Es muy f谩cil. Mira los ejemplos de comunicaciones disponibles en el IDE.
Este ejemplo que debes completar para que 0 haga una tarea, 1 y 2 otras tareas se adapte a tu caso.
Completa con las tareas que quieres que haga tu sketch. Luego cuando lo tienes resuelto, lo modificas levemente y tienes resuelto tu problema.

int incomingByte;聽 聽 聽 // a variable to read incoming serial data into

void setup() {
聽 // initialize serial communication:
聽 Serial.begin(9600);
聽 // initialize the LED pin as an output:
聽 
}

void loop() {
聽 // see if there's incoming serial data:
聽 if (Serial.available() > 0) {
聽 聽 // read the oldest byte in the serial buffer:
聽 聽 incomingByte = Serial.read()-'0';
聽 聽 switch (incomingByte){
聽 聽 聽 case 0: // hago lo correspondiente a 0
聽 聽 聽 聽 聽 聽 聽 break;
聽 聽 聽 case 1: // hago lo correspondiente a 1
聽 聽 聽 聽 聽 聽 聽 break;
聽 聽 聽 case 2: // hago lo correspondiente a 2
聽 聽 聽 聽 聽 聽 聽 break;

聽 聽 }
聽 }
}

entiendo muchas gracias por el dato, hay veces que uno se enreda y se va por el camino mas dif铆cil