Comunicacion RS-232

Hola,

Soy un novata de Arduino, compre un ARDUINO UNO, para hacer mis primeros experimentos, y me entusiasma este pequeño gigante!.
Yo soy mas electrónico que programador, y estoy haciendo mis primeros pasos en programación…como el Arduino es para todos…espero que también sea para mi…
Después e esta pequeña presentación, a ver si me podéis ayudar…se que son cosas elementales, pero para mi es como aprender a escribir…

Me gustaría poder hacer estas tres cosas:

  1. Apretando un botón, poder mandar una linea de serie. La aplicación seria por ejemplo, encender y apagar un monitor a través del puerto de serie.
    Por ejemplo, al presionar A0, mandar a través del puerto serie: 50 4F 57 52 30 20 20 0D (me apaga el monitor) al presionar A1, mandar 50 4F 57 52 31 20 20 0D (enciende el monitor)

  2. Lo mismo pero al revés, mandando un comando serie, me abra o cierra un contacto. Por ejemplo, mandando 10 por serie, me cambia estado A0

  3. Mandando un comando serie al Arduino, por ejemplo 10, me mande por la salida de serie siempre 50 4F 57 52 30 20 20 0D, o mandando 20 me me mande 50 4F 57 52 31 20 20 0D

Creo que es sencillo y factible, pero después de estar horas mirando y leyendo por todas partes, no me entra en mi cabeza dura donde tengo que poner los comandos en el código.

Hay un ejemplo para el caso 2 :

void setup() {
// initialize serial communication:
Serial.begin(9600);
// initialize the LED pins:
for (int thisPin = 2; thisPin < 7; thisPin++) {
pinMode(thisPin, OUTPUT);
}
}

void loop() {
// read the sensor:
if (Serial.available() > 0) {
int inByte = Serial.read();
// do something different depending on the character received.
// The switch statement expects single number values for each case;
// in this exmaple, though, you’re using single quotes to tell
// the controller to get the ASCII value for the character. For
// example ‘a’ = 97, ‘b’ = 98, and so forth:

switch (inByte) {
case ‘a’:
digitalWrite(2, HIGH);
break;
case ‘b’:
digitalWrite(3, HIGH);
break;
case ‘c’:
digitalWrite(4, HIGH);
break;
case ‘d’:
digitalWrite(5, HIGH);
break;
case ‘e’:
digitalWrite(6, HIGH);
break;
default:
// turn all the LEDs off:
for (int thisPin = 2; thisPin < 7; thisPin++) {
digitalWrite(thisPin, LOW);
}
}
}
}

Basta cambiar a-b-c… en 10 20…?
Podria ser 50 4f 57…etc?

Muchas gracias

Importante: estos comandos series los tengo che manda a traves de RX0 y recibirlos a trves de TX1, no por el puerto USB! Es posible?

han puesto que el botón lo tienes en la misma patilla que el relé, usa distintas patillas, o imagino que quizas sean distintas placas y quieras enviar de uno y recibir en otro.

para aprender a rpogramar lo mejor es que te mires la referencia y despues a practicar, a programar se aprende programando, ánimo que no es muy complicado :slight_smile:

respecto a los comanndos.

para enviar el comando es facil.
char comando[]="00 23 43 AF 8F";
if(se pulsa boton)
for i de 0 a limete de comando) // si el comando tiene 10 caracteres pues de 0 a 9
serial.print(comando
}
serial.println("");
con esto lo mandarias ( pseudocodigo, hay que escribirlo bien claro )
y recibir pues lo mismo, primero recibes la linea y la guardas a un bufer, luego recorres 1 a 1 la posiciones y comparas que sean iguales lo que recibes con con comando que quieres que venga, y si son iguales activar la salida
te pueden ayudar los ejemplos que vienen con el IDE busca en serial response creo que era, no lo tengo ahora mismo para buscarlo.
un saludo

Queriendo apretar un botón y mandar un código, otro botón y otro código, y así sucesivamente...

Voy por buen camino?

E escrito esto pero no me compila:

Programita mando a distancia. Ejemplo simple
*/

int encender = 13; //el botón encender será el pin 13
int apagar = 12 ; //el botón apagar será el pin 12
int canal = 11 ; //el botón de canal será el 11

void setup() {

//esos tres conectores seran entradas
pinMode(encender, INPUT);
pinMode(apagar, INPUT);
pinMode(canal, INPUT);

//y se debe iniciar el puerto serial, en este caso a 9600 baud
Serial.begin(9600);
}

void loop() {

//si pulsa el boton encender envía la cadena a la serie
if buttonState (encender) == HIGH {
Serial.print("50 4F 57 52 30 20 20 20 0D");
}
//si pulsa el boton apagar idem
if ( buttonState(apagar) == HIGH ) {
Serial.print("50 4F 57 52 31 20 20 20 0D");
}
//si pulsa el botón canal idem
if ( buttonstate(canal) == HIGH ) {
Serial.print("44 43 43 48 30 32 20 20 0D");
}
}

Donde fallo? no consigo entenderlo!!!

Me da este error:

sketch_oct20b:2: error: expected unqualified-id before '/' token
sketch_oct20b:2: error: expected constructor, destructor, or type conversion before '/' token
sketch_oct20b.cpp: In function 'void setup()':
sketch_oct20b:15: error: 'encender' was not declared in this scope
sketch_oct20b.cpp: In function 'void loop()':
sketch_oct20b:26: error: expected `(' before 'buttonState'
sketch_oct20b:30: error: 'buttonState' was not declared in this scope
sketch_oct20b:34: error: 'buttonstate' was not declared in this scope

/*

pon lo que quieras, solo estará documentado

*/

es lo mismo que

//pon lo que quieras, solo estará documentado

este es el primer fallo, mira que te indica que está en la línea 2.
a ver si tu encuentras alguno más..

ademas de los errores que te han dicho yo usaria println("");

cuando desde el receptor quieras decodificar el comando tienes que saber donde está el final de la linea, eso o poner un caracter especial a partir del cual viene el comando ( no hace falta que sea tan largo :slight_smile: )

por ejemplo envía "&FE03A3"

en el receptor almacena 7 caracteres , & y los 6 siguientes y luego comparas los 6 caracteres con el comando que quieres hacer.

es una sugerencia.

un saludo

Muchas gracias por las sugerencias, pero no llego...

He corregido el comentario, pero no consigo entender como declarar (buttonState (encender) == HIGH)

Me da este error que no entiendo:

sketch_oct20b.cpp: In function 'void loop()':
sketch_oct20b:26: error: 'buttonState' was not declared in this scope
sketch_oct20b:30: error: 'buttonState' was not declared in this scope

Como le digo, que cuando va en HIGH, me mande la serie de caracteres?

@SrDonGato

Gracias por la sugerencia, pero necesito mandar este código asi como es, pues lo debe recibir un monitor, y apagarse o encenderse. Es así de fabrica, yo no lo puedo cambiar!
Es en hex, así lo mando en hex, o tengo que dar una instrucción para que mande los caracteres en Hex?

Gracias....pero darme las pistas, soy muy duro. Estoy leyendo todo lo posible, pero el ingles para mi es como chino!

mirate el playground y encontraras en la parte española documentación suficiente para empezar.

mirate el playground y encontraras en la parte española documentación suficiente para empezar.

Clásica respuesta inútil. Es lo que estoy haciendo desde hace varias horas, pero es demasiado difícil dar una explicación, todos saben pero nadie responde!
Gracias igualmente.

asky:

mirate el playground y encontraras en la parte española documentación suficiente para empezar.

Clásica respuesta inútil. Es lo que estoy haciendo desde hace varias horas, pero es demasiado difícil dar una explicación, todos saben pero nadie responde!
Gracias igualmente.

clasica respuesta inútil !!! haciendo amigos nada mas llegar,no?
pues ale otra, mirate mi firma y aprende.

iba a arreglarte el código pero tu contestación a nayma esta tan fuera de lugar que te ayude otro. sorry.

asky:

mirate el playground y encontraras en la parte española documentación suficiente para empezar.

Clásica respuesta inútil.

Para mi que la inutilidad esta en otra parte......

Vamos a darte otra oportunidad ... lo primero es respetar a quien se molesta en ayudarte, para hacer cosas lo mínimo es que mires los manuales y como yo digo con tan solo mirar los ejemplos que vienen con el IDE y ver como funciona puedes hacer de sobra esto que quieres

tienes un error en

//si pulsa el boton encender envía la cadena a la serie
if buttonState (encender) == HIGH {
Serial.print("50 4F 57 52 30 20 20 20 0D");

te faltan parentesis despues del if

te recomiendo usar println

te recomiendo tambien por

if (digitalRead(pin donde esta el boton)){
println("&098EF");
}
esto repetido 3 veces tienes el codigo que quieres ...

podemos ayudar, sin exigencias, y sin hacer todo el código, cada uno nos curramos el código. otra cosa es cómo atacar distintos problemas.

ya nos cuentas.

Muchas gracias SrDonGato

Voy a seguir tus consejos, pero lo veo difícil.

A los demás que escriben por escribir...tomar ejemplo de alguien, que responde para ayudar, para aconsejar, para animar...no para decir...vete a leer esto y no molestes!
Creo que los foros se inventaron para esto. Lógico que por pereza uno no debe preguntar...pero si esta todo en un idioma no comprensible para mi, pues lo que no entiendo lo pregunto.
Si a alguien le molesta, pues lo siento. No creo que se entendió a lo que me refería. Fin del OT.

asky:
Muchas gracias SrDonGato

Voy a seguir tus consejos, pero lo veo difícil.

A los demás que escriben por escribir...tomar ejemplo de alguien, que responde para ayudar, para aconsejar, para animar...no para decir...vete a leer esto y no molestes!
Creo que los foros se inventaron para esto. Lógico que por pereza uno no debe preguntar...pero si esta todo en un idioma no comprensible para mi, pues lo que no entiendo lo pregunto.
Si a alguien le molesta, pues lo siento. No creo que se entendió a lo que me refería. Fin del OT.

pues tu sigue con esos humos y espero que el SrDonGato te resuelva todas tus dudas, porque me da que pocos amigos vas a hacer.
y vuelvo a decirte lo mismo leete manuales de mi firma porque si esta todo en un idioma no comprensible para ti, es porque no has mirado los manuales y no lo has aprendido. es como si te vas a china y te enfadas porque no te entienden en español, ...

No creo que se entendió a lo que me refería

Clásica respuesta inútil.

creo que se entendio perfectamente.

enjoy :grin:

Que desastre, otro gallito que en vez de dar las gracias por una ayuda desinteresada critica a la gente porque no le ayudan lo suficiente. Poner el codigo para que alguien lo arregle y decir no entiendo no requiere mucho esfuerzo pero a los que ayudan y orientan se les puede decir que no ayudan lo suficiente. Alucino de la poca vergüenza que tiene la gente.

ionhs:
Alucino de la poca vergüenza que tiene la gente.

Cada vez más ..