Ayuda con sketch (datos llegan desde el Serial)

Buenas a todos estoy intentando que una arduino mega esclavo reciba dos datos (por medio de I2C) desde la master que esta recibe a su vez desde el serial de otra aplicación, el caso es que recibe el numero de pin que quiero encender pero no recibe el valor, lo enciende y ya no hace nada más, si envío 0 no lo apaga, por eso creo que no está recogiendo nada en la variable valor recibe el pin y lo enciende en HIGH nada mas actúa como un pin digital y ya no responde más.

Os dejo el código de los dos a ver si alguien me puede ayudar.

Gracias.

Master:

#include <Wire.h>

#define LED_PIN 13
int pin;
byte valor;
int dispositivo;
void setup()
{
  Wire.begin(); // Start I2C Bus as Master
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);
  Serial.begin(9600);

}
void loop()
{
 while (Serial.available() > 1){
      dispositivo = Serial.read();
      if(dispositivo >1){
        pin = Serial.read();
       Wire.beginTransmission(dispositivo); // transmite a un dispositivo
       Wire.send(pin);          // envia el número de pin a encender 
       if(pin > 1){
       valor = Serial.read();  //Lee el valor que le llega del puerto serial
       Wire.send(valor);        //Envia el valor a la placa esclavo
       Wire.endTransmission();    // stop transmitting
       }
      }
     
    }
 
  }

Slave:

#include <Wire.h>

int pin;
byte valor;

void setup() {
  Wire.begin(9);                // Start I2C Bus as a Slave (Device Number 9)
  Wire.onReceive(receiveEvent); // register event
  
  pinMode(pin, OUTPUT);
 

}

void loop() {

}

void receiveEvent(int howMany) {
  pin = Wire.receive();    // recibe el pin 
  if(pin > 1){
  valor = Wire.receive();  //supuestamente recibe el valor
  analogWrite(pin,valor); // debería encender un pin analógico con el valor recibido
  }
}

Añade un par de líneas de Serial.println para ver que valores tiene en cada momento pin y valor

Me dice que el serial esta siendo utilizado ya que tengo otra aplicación enviandole valores a la master y esta a su vez a la esclavo

Pero, ¿has conectado el Arduino esclavo al PC para comunicar con el por serie?

No, la que tengo conectada es la master que es la que recibe de otra aplicación y envia luego a uno de los esclavos en este caso al único que tengo contectado haciendo las pruebas

Lo que quería decir es que conectaras el esclavo al PC y establecieras otra conexión serie, para así ver en el PC los datos de pin y valor recibidos por I2C.

Gracias chiva, probaré y te cuento...

He probado lo que me dices chiva, y he visto que aunque le envie 0 o 64 o 128, y nunca envie 255, el valor de la variable valor es siempre 255 por eso siempre me enciende el led al máximo. No está recogiendo el dato correctamente y me pone 255 en la variable valor, sin embargo la lectura que hago del pin es correcta, me recibe el pin correctamente, pero a la valor le pone el valor de 255 indistintamente del valor que le envíe.

No lo comprendo, ¿Alguna sugerencia de porque puede ser esto?

Prueba este código en el esclavo a ver si te funciona:

#include <Wire.h>

int pin;
byte valor;

void setup() {
  Wire.begin(9);                // Start I2C Bus as a Slave (Device Number 9)
  Wire.onReceive(receiveEvent); // register event
  pinMode(pin, OUTPUT);
}

void loop() {}

void receiveEvent(int howMany) {
  pin = Wire.receive();    // recibe el pin
  valor = Wire.receive();  //supuestamente recibe el valor
  analogWrite(pin,valor); // debería encender un pin analógico con el valor recibido
}

Un saludo

Voy a probarlo....

Nada, siempre me sigue dando 255 envíe el valor que le envíe, de hecho, es que nunca envio 255 y siempre me pone el pin a 255 de valor

Prueba a inicializar valor a un número distinto a 255 para ver si lo escribe el I2C o se inicializa por defecto a 255

byte valor = 20;

Un saludo

Aunque inicialice la variable con valor 20, siempre me pone 255, lo que sí probe fue a poner un random a la variable detro de receiveEvent y si me cogia los valores aleatorios, pero claro no le enviaba ninguno desde el master en cuanto le pongo que reciba algo, me lo pone a 255. Es rarisimo...

Vale, no me había fijado que metías los datos por puerto serie, éste código que pongo más abajo debería funcionarte, de todas maneras yo tengo un programa que hace básicamente lo mismo ya preparado y funcionando:
http://wiki.kungfulabs.com/arduino/ardubus
Con ArduBus deberías mandar por el puerto serie y cambiando en Arduino la opción del terminal serie ‘No line ending’ a ‘Carriage return’: {DISPOSITIVO PIN VALOR}

Aquí te dejo el código del master que debería hacer funcionar todo, aunque hay cosas que no he probado y no estoy seguro de que funcionen

#include <Wire.h>
#define LED_PIN 13

int pin;
byte valor, dispositivo, lectura;

void setup(){
  Wire.begin(); // Start I2C Bus as Master
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);
  Serial.begin(9600);
}

void loop(){
   do {
      lectura = Serial.read();
   } while (lectura == -1)
   dispositivo = lectura;
   do {
      lectura = Serial.read();
   } while (lectura == -1)
   pin = lectura;
   do {
      lectura = Serial.read();
   } while (lectura == -1)
   valor = lectura;
   Wire.beginTransmission(dispositivo); // transmite a un dispositivo
   Wire.send(pin);          // envia el número de pin a encenderl
   Wire.send(valor);        //Envia el valor a la placa esclavo
   Wire.endTransmission();    // stop transmitting
}

Un saludo

Voy a probarlo, y a leer sobre ArduBus, muchas gracias chiva. Te contaré como me ha ido...

Saludos

Lo del Ardubus lo he estado probando pero no lo comprendo muy bien al cargar el programa que me bajo de la pagina en la master se queda el seria todo el tiempo mostrando el mensaje del la función setup. También he comprobado que si en vez de enviar 3 datos desde PureData (DISPOSITIVO, PIN, VALOR), envío solo 2 (PIN,VALOR) y el dispositivo se lo declaro al programa de la master, si me recibe la variable valor la esclavo en cuanto le pongo que la master me envie DISPOSITIVO, PIN, VALOR ya vuelve a poner el valor a 255 en la esclavo

¿Has probado con el código del master que te he pasado?

Aquí tienes un ejemplo haciendo algo similar: http://arduino.cc/en/Tutorial/MasterWriter

Si que lo probé pero la verdad que no lo comprendo muy bien, será por comparar el bucle while con -1 y asignarle la variable lectura a 'dispositvo' 'pin' 'valor' y no recibia nada mi esclavo, sin embargo con el código de la master que puse yo si me va, lo único es que no puedo recibir el valor de la variable 'valor'. No tengo ni idea porque le da el valor 255 a la variable 'valor' asi sin más. ¿sabes porque cuando cargo el programa de ardubus se me queda siempre imprimiendo el mensaje de los Serial.println de la función setup?

Al final lo he conseguido! he cambiado los Baudios a 115200, y en la master como no podía abrir el serial para leer el dato que le llegaba desde el puerto de serie, hice que me encendiera el pin 13 con determinados parpadeos según el valor de la variable 'valor', ya que no estba seguro si era que la esclavo no recibía bien o es que a la master el dato le llegaba corrupto, con esto el esclavo empezo a recibir los valores correctos.

Saludos y muchas gracias por la ayuda chiva!

PD: Lo que me doy cuenta es que muchas veces le cuesta coger los valores, es decir lo tengo que enviar dos veces desde la aplicación a la master y esta a su vez a la esclavo para que el led se prenda, ¿esto por que puede ser?

Pues entonces nada :)

Pueden ser muchas cosas, a lo mejor hay interferencias que degradan la señal o el cable no esta muy bien conectado, a parte de otras miles de cosas