Control de E/S en un arduino esclavo

Hola, estoy algo perdido, haber si me podéis ayudar u orientarme, no he conseguido
encontrar ejemplos parecidos.

El proyecto es conectar por i2c (salvo sugerencia), un Arduino Nano como maestro y un mega esclavo, aparte el esclavo dependiendo de sus señales de entrada + la señal que reciba del maestro, que realice unas acciones (movimiento de servo o relé). Es decir que el esclavo este ejecutando unas series de acciones dependiendo de sus entradas independientes del maestro, y en caso puntuales tomar la información que reciba del maestro y con las entradas del esclavo tomar una decisión.
El programa que estoy haciendo pruebas es este:
Maestro

//NAN0

#include <Wire.h>
const int buttonPin = 11; // numero de PIN del Boton
int buttonState = 0; // Varoable que recoge el valor del esatdo del botón
void setup()
{
Serial.begin(9600);
pinMode(buttonPin, INPUT);
Wire.begin(); // configura el bus i2c(direccion opcional para el maestro)
}
void loop()
{
Wire.beginTransmission(2); // transmite al elemento #2
buttonState= digitalRead(buttonPin);
if (buttonState == HIGH) {
Wire.write('s'); // envia un byte
Serial.println("s");
Wire.endTransmission(); // detoene la transmisión
}
if (buttonState==LOW){
Wire.write('n'); // envia un byte
Serial.println("n");
Wire.endTransmission(); // detiene la trasmisión
}
//
delay(500);
//Wire.endTransmission(); // aqui podriamos poner el fin de transmisión
//tambien y quitar los anteriores
}

Esclavo

//MEGA

#include <Wire.h>
int led = 13;
void setup()
{
pinMode(led, OUTPUT);
Wire.begin(2); // Define direccion i2c del bus #2
Wire.onReceive(receiveEvent); // registra evento
Serial.begin(9600); // Inicia el puerto serie
}
void loop()
{
delay(100);
}

// función que se ejecuta cada vez que se reciben los datos del maestro
// Esta función está registrada como un evento, ver setup ()
void receiveEvent(int howMany)
{
while(1 < Wire.available()) // recorre todos mientas se prodcue la detecion de dato en el bus
{
char c = Wire.read(); // recibe como un caracter
Serial.print(c); // imprime el caracter
}
char x = Wire.read(); // recibe un byte como un entero
Serial.println(x); // imprime el entero

if (x=='s') { // Si el byte es s se activa la salida PIN 13
digitalWrite(led, HIGH);
Serial.println("si");
}

if (x=='n') {
digitalWrite(led, LOW); // Si el byte es s se desactiva la salida PIN 13
Serial.println("no");
}

}

El led se enciende perfectamente desde el maestro, ahora como puedo introducir unas entradas en el esclavo para que realice unas acciones como activar o no otras salidas, estas totalmente independiente del maestro?.

Muchas gracias, un saludo.
Brawa

Sentendí mal, lo que quieres es hacer otras cosas en el NANO aparte de lo que ya hace, que es transmitir el estado del boton al MEGA.

Si es así, veo que en el Sketch del NANO tienes un "delay(500);" y en su lugar puedes poner cualquier otra accion que quieras que haga. Ejemplo prender el led propio con "digitalWrite(13, HIGH);" (no olvidar de configurar el pin 13 como OUTPUT en la sección setup())

Si I2C se te hace difícil, prueba utilizando el mismo USART (“puerto serial”). El código equivalente sería el siguiente:

//NAN0

#include <SoftwareSerial.h> // No es necesario si utlizaras el mismo Serial para tal efecto
const int buttonPin = 11; // numero de PIN del Boton
int buttonState = 0; // Varoable que recoge el valor del esatdo del botón

SoftwareSerial virtualSerial(9, 10); // (RX, TX)
void setup()
{
Serial.begin(9600);
virtualSerial.begin(9600);
pinMode(buttonPin, INPUT);
}
void loop()
{
buttonState= digitalRead(buttonPin);
if (buttonState == HIGH) {
virtualSerial.write('s'); // envia un byte
Serial.println('s');
}
if (buttonState==LOW){
virtualSerial.write('n'); // envia un byte
Serial.println('n');
}

delay(500);
}
//MEGA

int led = 13;
void setup()
{
pinMode(led, OUTPUT);
Serial.begin(9600); // Inicia el puerto serie
Serial1.begin(9600); // Inicia el puerto receptor
}
void loop()
{
 if (Serial1.available()) {
 char c = Serial1.read();
 Serial.println(c);
 if (c=='s') { // Si el byte es s se activa la salida PIN 13
 digitalWrite(led, HIGH);
 Serial.println("si");
 }

 if (c=='n') {
 digitalWrite(led, LOW); // Si el byte es s se desactiva la salida PIN 13
 Serial.println("no");
 }
 }
}

Nuevas conexiones: pin 10 del Nano a RX1 del Mega. GND del Nano a GND del Mega.

Gracias, por la ayuda.

Tendré que hacer pruebas con el puerto serie, pero como el Master (Nano) me estaba funcionando bien con las condiciones que tiene no lo quería modificar.

El Esclavo (Mega) es que tiene que controlar unos sensores de presencia, servo y unos rele, y actuar en consecuencia, pero esta información NO la tiene que enviar al Master, y dependiendo de la información que reciba del Master es cuando tendrá que actuar de una u otra manera puntualmente.

He modificado el programa Esclavo con un salida mas y se me queda muerto.

//MEGA

#include <Wire.h>
int led = 13;
int salida=22;
int prueba=0;
void setup()
{
pinMode(salida, OUTPUT);  
pinMode(led, OUTPUT);
Wire.begin(2); // Define direccion i2c del bus #2
Wire.onReceive(receiveEvent); // registra evento
Serial.begin(9600); // Inicia el puerto serie
}
void loop()
{
delay(100);
}

// función que se ejecuta cada vez que se reciben los datos del maestro
// Esta función está registrada como un evento, ver setup ()
void receiveEvent(int howMany)
{
while(1 < Wire.available()) // recorre todos mientas se prodcue la detecion de dato en el bus
{
char c = Wire.read(); // recibe como un caracter
Serial.print(c); // imprime el caracter
}
char x = Wire.read(); // recibe un byte como un entero
Serial.println(x); // imprime el entero

if (x=='s') { // Si el byte es s se activa la salida PIN 13
digitalWrite(led, HIGH);
digitalWrite(salida, HIGH);
Serial.println("si");
}

if (x=='s') {
digitalWrite(led, LOW); // Si el byte es s se desactiva la salida PIN 13
digitalWrite(salida, LOW);
Serial.println("no");
}
}