Hola,
Después de una semana de probar varias cosas he adelantado el proyecto basándome en tus ideas.
Coloqué en los trigger los cátodos de los diodos 1N4148 y en el punto común una resistencia de 10K a gnd y funciona muy bien, así utilizo un sólo pulso para todos los sensores reduciendo los pines a 24.
Lo de los leds opté por usar una sóla salida pero no usando leds RGB sino de los normales en paralelo pero invirtiendo su polaridad, cada uno con su resistencia, uno va a gnd y el otro a 5V, así cuando tengo un = en la salida se prende el led verde y cuando tengo un 1 se prende el led rojo, reduciendo los pines a 24, mas los 24 de los triggers, tengo 48 pines hasta ahora.
Claro, debo aclarar que sólo llevo conectado en la protoboard sólo 4 sensores y los 8 leds.
Lo del multiplexado ya lo empezé, he tomado un código y lo he ido modificando hasta lograr que me muestyre los datos, por ahora los display los muestran, pero empiezo con un delay de 1000 y se ven bien, claro uno por uno, pero a medida que voy reduciendo el delay, sólo uno de los disolays me queda con una intensidad buena y no parpadea, los demás si.
Quiero aclarar, no soy muy experto en el tema de la programación, pero poco a poco voy entrando en esto, creo que ese es el único detalle que debo resolver, por lo demás pieso que todo está bien.
Hasta ahora uso del pin 2 al 10, para los sensores y los leds.
Los pines desde el 43 hasta el 53 para el multiplexado.
Pines 50 al 53 para los transistores de los comunes de los displays.
Este es el código que usé, como lo dije, lo encontré en la web para un reloj con displays 7 segmentos.
int ocup=0;
int disp=0;
long duracion1, distancia1, duracion2, distancia2, duracion3, distancia3, duracion4, distancia4;
byte Digit[10][8] =
{ { 1,1,1,1,1,1,0,0 }, // 0
{ 0,1,1,0,0,0,0,0 }, // 1
{ 1,1,0,1,1,0,1,0 }, // 2
{ 1,1,1,1,0,0,1,0 }, // 3
{ 0,1,1,0,0,1,1,0 }, // 4
{ 1,0,1,1,0,1,1,0 }, // 5
{ 1,0,1,1,1,1,1,0 }, // 6
{ 1,1,1,0,0,0,0,0 }, // 7
{ 1,1,1,1,1,1,1,0 }, // 8
{ 1,1,1,0,0,1,1,0 } // 9
};
void setup() {
Serial.begin(9600); // inicia el puerto serial a 9600 baudios
pinMode(2, OUTPUT); // define el pin 2 como salida (trigger)
pinMode(3, INPUT); // define el pin 3 como entrada (echo1)
pinMode(4, OUTPUT); // define el pin 4 como salida (Leds1)
pinMode(5, INPUT); // define el pin 5 como entrada (echo2)
pinMode(6, OUTPUT); // define el pin 6 como salida (leds2)
pinMode(7, INPUT); // define el pin 7 como entrada (echo3)
pinMode(8, OUTPUT); // define el pin 8 como salida (leds3)
pinMode(9, INPUT); // define el pin 9 como entrada (echo4)
pinMode(10, OUTPUT); // define el pin 10 como salida (leds4)
for (int i= 43; i<54; i++)
pinMode(i, OUTPUT);
}
void loop() {
digitalWrite(2, LOW);
delayMicroseconds(2);
digitalWrite(2, HIGH); // genera el pulso de 10 us
delayMicroseconds(10);
digitalWrite(2, LOW);
duracion1 = pulseIn(3, HIGH); // capturamos la duración del pulso
distancia1 = (duracion1/2)/29; // calcula la distancia en cms
if (distancia1 >=1 && distancia1 <=49){
digitalWrite(4, LOW);
}
if (distancia1 >=50 && distancia1 <=499){
digitalWrite(4, HIGH);
}
digitalWrite(2, HIGH); // genera el pulso de 10 us
delayMicroseconds(10);
digitalWrite(2, LOW);
duracion2 = pulseIn(5, HIGH); // capturamos la duración del pulso
distancia2 = (duracion2/2)/29; // calcula la distancia en cms
if (distancia2 >=2 && distancia2 <=49){
digitalWrite(6, LOW);
}
if (distancia2 >=50 && distancia2 <=499){
digitalWrite(6, HIGH);
}
digitalWrite(2, HIGH); // genera el pulso de 10 us
delayMicroseconds(10);
digitalWrite(2, LOW);
duracion3 = pulseIn(7, HIGH); // capturamos la duración del pulso
distancia3 = (duracion3/2)/29; // calcula la distancia en cms
if (distancia3 >=2 && distancia3 <=49){
digitalWrite(8, LOW);
}
if (distancia3 >=50 && distancia3 <=499){
digitalWrite(8, HIGH);
}
digitalWrite(2, HIGH); // genera el pulso de 10 us
delayMicroseconds(10);
digitalWrite(2, LOW);
duracion4 = pulseIn(9, HIGH); // capturamos la duración del pulso
distancia4 = (duracion4/2)/29; // calcula la distancia en cms
if (distancia4 >=2 && distancia4 <=49){
digitalWrite(10, LOW);
}
if (distancia4 >=50 && distancia4 <=499){
digitalWrite(10, HIGH);
}
if (digitalRead(4)==0){
ocup=ocup+1;}
if (digitalRead(4)==1){
disp=disp+1;}
if (digitalRead(6)==0){
ocup=ocup+1;}
if (digitalRead(6)==1){
disp=disp+1;}
if (digitalRead(8)==0){
ocup=ocup+1;}
if (digitalRead(8)==1){
disp=disp+1;}
if (digitalRead(10)==0){
ocup=ocup+1;}
if (digitalRead(10)==1){
disp=disp+1;}
int k = disp * 100 + ocup ;
CalculaDigitos(k) ;
}
void Display(int pos, int N)
{ digitalWrite(50,LOW); // Apaga todos los digitos
digitalWrite(51,LOW);
digitalWrite(52,LOW);
digitalWrite(53,LOW);
for (int i= 0 ; i<8 ; i++)
digitalWrite(i+43 , Digit[N][i]);
digitalWrite(50 + pos, HIGH); // Enciende el digito pos
delay(1);
ocup=0;
disp=0;
}
void CalculaDigitos(int Num)
{
int Digit0 = ocup %10 ;
int Digit1 = (ocup % 100) / 10 ;
int Digit2 = disp %10 ;
int Digit3 = (disp % 100) / 10 ;
Display(3 , Digit3);
Display(2 , Digit2);
Display(1 , Digit1);
Display(0 , Digit0);
}
Aquí encontré el código.
Creo que el error puede estar en esta parte,
for (int i= 0 ; i<8 ; i++)
digitalWrite(i+43 , Digit[N][i]);
digitalWrite(50 + pos, HIGH); // Enciende el digito pos
delay(1);
ocup=0;
disp=0;
cuando cambio el 50 por 51 ó 52, esa salida funciona bien y los demás displays parpadean, espero que puedas ayudarme con esta duda.