I2C 1 maestro 8 esclavos

Hola soy nuevo en arduino y tengo que programas 9 arduinos (1 master 8 slaves) el proyecto consiste en medir continuidad en varios puntos (200) si algún punto está desconectados enviar un serial.print con el mensaje al maestro indicando cual es el punto que falla y este lo imprima, dicho esto se me presentaron algunos problemas el primero es que los ejemplo y guías en Internet suelen medir una sola entrada y no explican como ir agregando mas entradas (mas que nada como leerlas en el maestro) y lo segundo es que logro condicionar los mensajes que envía el esclavo (si mide continuidad debe seguir funcionando normal ,pero si no mide continuidad envía el mensaje ) pero el maestro se queda esperando hasta que el esclavo le envié el mensaje y no sigue con su rutina Pido disculpas de antemano por mi ignorancia y gracias por leer esto :slight_smile:

programación esclavo (estoy trabajando con uno solo por ahora)

#include <Wire.h>

void setup() {

pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
Wire.begin(8);  // se inicializa en el bus I2C como esclavo con el #8
if(2==HIGH);{

Wire.onRequest(escrituraEvento);  // registra la función de atención del evento de escritura 
}

}
void loop() {

digitalWrite(2, HIGH);
delay(4000);
digitalWrite(2, LOW);
delay(4000);

digitalWrite(4, HIGH);
delay(1000);
digitalWrite(4, LOW);
delay(1000);
}

void escrituraEvento() {  //define la función de envio 
{if(2==LOW);{
Wire.write("HOLA ");}  //responde con un mensaje de 5 bytes
Wire.write("QUE ");
Wire.write("TAL   ");
  
}

}

Programación maestro

#include <Wire.h>

void setup() {
Wire.begin();  // se inicializa en el bus I2C como maestro
Serial.begin(9600);  // inicializa el puerto serial
}
void loop() {

Wire.requestFrom(8, 14);  // solicita 6 bytes al dispositivo esclavo #8
while (Wire.available()) {  // mientras hay datos lee los datos recibidos
  char c = Wire.read();  // recibe bytes como caracteres
  Serial.print(c);  // imprime el carácter
  
}
  Serial.println(" ");

delay(2000); 

Wire.requestFrom(3, 20);  // solicita 6 bytes al dispositivo esclavo #8
while (Wire.available()) {  // mientras hay datos lee los datos recibidos
  char c = Wire.read();  // recibe bytes como caracteres
  Serial.print(c);  // imprime el carácter
  
}
  Serial.println(" ");
delay(2000);

}

Debes leer las normas de este foro y postear los códigos con etiquetas.
Ahora por favor edita tu post inicial.
Te envio privado con instrucciones por si no lo encuentras.
Gracias.

Bueno uno mas conectando arduinos via I2C y luego usando delays de 4000 mseg, perdoname pero para qué?

Si quieres medir continuidad hazlo a velocidad, sin delay(), no entiendo que cambia en la lectura de continuidad hacerlo en 10 mseg o hacerlo en 4000 mseg.
Luego si tu esclavo envia HOLA QUE TAL??? que clase de msg es ese?

Supongo que estas en fase de pruebas, y no estas midiendo ninguna continuidad todavía.

200 conexiones puedes medirlas usando un solo arduino no 9 y varios registros de desplazamiento o usando multiplexores 4051, cada uno barre 8 posiciones, asi que no se como estan dispuestas tus conexiones pero son tareas factibles.

Mi pregunta es si la comunicación I2C entre Maestro Esclavo funciona?

En respuesta a tu pregunta si, la comunicación funciona. Respecto a los delays supongo que es solo un capricho y sobre los 9 arduino se me pidió que realizara el proyecto con maestro esclavo.

Bien. En ese caso no cuestiono el tema.
Sigamos adelante.

Maestro 1 un esclavo se comunican?

Si comunican de echo estoy comunicándome con dos esclavos actualmente, logro enviar el mensaje por I2C el tema es que no logro condicionar cuando aparece el mensaje tengo entendido que con un "if" debería poder hacerlo pero con la programación que tengo el maestro espera y no sigue hasta que hay un mensaje.

ok entonces vamos a crear un código común para que el maestro interrogue a todos y los esclavos respondan con su información.

Necesitoa mas datos sobre los esclavos y sus conexiones para indicar como se entera que hay continuidad o no?

Para la detección de continuidad tenia pensado enviar voltaje por una salida del arduino a través del tramo que que quiero medir y recibirla en el mismo arduino en un INPUT y con un digitalRead ver si hay continuidad y generar el mensaje y enviarlo al maestro.

Si pero hace falta un esquema.
Cada esclavo debería ver varias lineas y si un esclavo ve lineas que se cruzan me parece un desperdicio.
Si teines 8 arduinos tienes que reservar A4 y A5 de modo que te quedan A0 A3 = 4 lineas mas 14 lineas del otro lado. Son 18 lineas.

Explica como vas a medir la continuidad de los 200 puntos.
Una forma simple es hacer una malla XY X filas y Y columnas y cuando activas las X filas barres las columnas y sabrás cual tiene continuidad.
O sea que lo haces con 3 esclavos nada mas, no hacen falta 8.

Por eso te pregunto.

Como te dije antes enviando voltaje por un punto del arduino (ej: pin 2 envía voltaje a través de la linea a medir a pin 3) si el pin receptor lo detecta es porque la linea tiene continuidad al menos eso es lo que haría en PLC (la verdad desconozco si es posible hacerlo en arduino, busque en Internet y no encontré nada así que asumí que se podía).

y cuando dices linea cruzada te refieres a lineas con puentes?

y cuando dices linea cruzada te refieres a lineas con puentes?

O sea que para medir 200 puntos tu necesitas 200 pines de salida y 200 pines de entrada?

Has visto un teclado matricial?

Uno de 16 teclas no usas 16 salidas y 16 entradas para ver que tecla esta presionada.
Usa 4 de salida y 4 de entrada.

Aca tienes el ejemplo para que se comprenda.

cuando activas una fila lees las 4 columnas y detectas ucal esta activo. es mas rápido y usa menos pines.

Misma idea para los 200 que necesitas. Si es posible claro.

surbyte:
O sea que para medir 200 puntos tu necesitas 200 pines de salida y 200 pines de entrada?

Efectivamente los 200 son lineas únicas.

gracias por lo del teclado me pondré a investigar sobre el tema.