Go Down

Topic: Multiplexar datos que vienen de varias placas de Arduino. (Read 2515 times) previous topic - next topic

Gastonc4

Muy buenas a todos.

Tengo la misión de hacer un parqueadero con sensores que indique puestos disponibles y ocupados mediante leds, rojo (ocupado), verde (disponible). A eso no le veo dificultad, para eso utilizaré sensores ultrasónicos y placas de Arduino Mega, ya tengo un código que me ejecuta esa función. Lo que veo un poco complicado para mi es la cantidad de puestos deben aparecer en una pantalla de led 7 segmentos, una para ocupado y disponibles respectivamente, estamos hablando de 47 puestos pero divididos en 2 secciones, una de 23 y otra de 24,

Para esto cuento con 4 placas de Arduino Mega. Ya he logrado realizar para 12 puestos y el conteo de ocupados y disponibles por monitor serial, pero los pines de la placa no van a alcanzarme y tendré que usar otra placa, cosa que no le veo problema si el caso fuera sólo la indicación de los leds rojos y verdes, pero recuerden que esa informaón tengo que plasmarla en la pantalla de leds 7 segmentos.

Ya teniendo una idea de lo que tengo que hacer me surgen varias preguntas, ¿Hay forma de colocar a trabajar varias placas que sean los que me tomen la lectura de los sensores y esta lectura mandarla a otra placa que toma las variables, las sume y pueda hacer el multiplexado para refejar la lectura en la pantalla led?

Si pudieran decirme por donde debería empezar, se los agradecería. Espero haber sido claro en el detalle de todo lo que debo hacer en este proyecto.

De antemano, gracias por tomarse el tiempo de leer estas líneas.

surbyte

Quote
Lo que veo un poco complicado para mi es la cantidad de puestos deben aparecer en una pantalla de led 7 segmentos, una para ocupado y disponibles respectivamente, estamos hablando de 47 puestos pero divididos en 2 secciones, una de 23 y otra de 24,
Entonces cuantos displays necesitas ser mostrados?

Reevaluemos el tema porque hay forma de hacerlo sin usar tantos MEGAS, aunque claro esa es una alternativa.

Por favor, si específico.. en que ocupas los pines.
Si vas a usar 23 y 24 leds dije LEDS no display de 7 segmentos tienes alterntivas tambien.
Si vas necesitar varios Displays 7 Segmentos pero que mostrarán que?
Todos lo mismo, o información relevante a cada grupo?

Gastonc4

#2
Aug 04, 2018, 06:05 am Last Edit: Aug 13, 2018, 06:49 pm by surbyte Reason: Agregado de etiqueta para Errores y/o códigos
Hola Surbyte,

Gracias por dedicar un poco de tu tiempo a esta situación.

Voy a tratar de ser lo más específico posible.

Empezando por los displays, son 2 de 4 dígitos (2 pares), cada uno con la información de disponibles y ocupados de cada lado. El parqueadero cuando entras debes elegir un lado para estacionarte, el izquierdo que tiene 24 puestos o  el derecho que tiene 23, por eso lo de los 2 displays, Ej:  

        Lado Izquierdo                                      Lado Derecho
Disponibles          Ocupados                 Disponibles             Ocupados
     10                      14                            12                       11

Lo de los leds, estoy usando los sensores ultrasónicos, cuando se estaciona el auto se enciende un led rojo y si está disponible se enciende un led verde. Empezé usando los pines 2, 3, 4 y 5. El pin 2 para el Trigger, el 3 para el Echo, 4 para el led verde y 5 para el led rojo. Los enciendo mediante la función IF, dependiendo de la distancia captada por el sensor:

Code: [Select]
if (distancia1 >=1 && distancia1 <=150){
   digitalWrite(4, LOW);} // se enciende el led verde
   else{
    digitalWrite(4, HIGH);
}

 if (distancia1 >=151 && distancia1 <=499){
   digitalWrite(5, LOW);} // se enciende el led rojo
   else{
    digitalWrite(5, HIGH);
}


Cómo estoy usando led RGB de ánodo común envío un 0 cuando se estaciona el auto.

Y así sigo usando los pines siguientes bajo el mismo principio, pero si no estoy mal me alcanza una Mega para 15 ó 16 sensores, no me alcanzan los 23 sensores de uno de los lados y ahí es donde pregunto, ¿Que debo hacer para que me alcance una Mega para todos los sensores? o ¿Se puede conectar otra Mega para los sensores que faltan?
Para el asunto de los leds puedo usar otra Mega y la manejaría independiente de la otra, pero el asunto es que esos datos deben llegar a los displays, osea que necesitaría como ampliar los pines de una Mega usando la otra como si se fusionaran, espero hacerme entender.




surbyte

Bien ahora mucho mejor.
Lo unico que no has dicho es si para manejar esos displays empleas 7 + 4 + 4 o usas alguno especial como un MAX7219.

Evidentemente desconoces de algunos elementos que simplifican las cosas.
Mira esto, si usas un MAX7219 o 2 (1 x grupo) ya bajas las conexiones a 3 pines nada mas para los dos displays. Luego hablamos del software.
Los leds mismo truco pero usando los 74HC595 que manejan 8 salidas cada uno asi que necesitas para 23+24 = 47 salidas x 2 = 94 salidas / 8 = 12 integrados que totalizarían 96 posibles salidas.
Hasta aca llevamos 3 para displays mas 3 mas para estos leds, los 94 leds.

Nos faltan los sensores ultrasónicos.

Acá necesitamos 2 pines x sensor, pero en realidad se pueden hacer 2 cosas interesantes:
1. Que todos los pines de salida que emiten el pulso sean el mismo lo que reduce a 47 lecturas digitales o
2. Puedes usar multixplexores analógicos como el 4052 eligiendo que sensor vas a leer

Exsiten otras variantes x ejemplo con el 4051

O sea que de este modo necesitas 48/4 = 12 integrados y 24 pines digitales para esos 12 integrados mas 2 pines extra para decodificar que llave analógica usarás.

En conclusión...

2 + 1 (ChipSelect MAX7219) + 1 (ChipSelect diferente para los 595) +12 + 2 pines digitales = 18 pines digitales si no me olvido de algo.

Podrias usar un NANO/UNO o bien un Mega.

1 o 2 MAX7219
12 74hc595
12 CD4052

Puede haber algun error porque no he verificado lo dicho, pero rondará estos números.

Solo son ideas, tambien puedes hacerlo con varios Arduinos pero no en serie. Salvo que un MEGA con 4 puertos se comunique con 4 Megas si hiciera falta.

Gastonc4

Bueno, esto se pone interesante cada vez más.

Te cuento, por ahora el proyecto va a realizarse en las 2 partes, izquierda y derecha, es decir, hablemos de 24 leds y 24 sensores inicialmente, que sería el lado izquierdo   vamos a trabajarlos de forma independiente y el lado derecho sería una copia exacta del otro circuito y todo lo demás. Lo trabajaré así por solicitud del dueño del sitio y la verdad me parece más fácil así por cuestiones de distancias entre los 2 lados.

Físicamente tengo 4 arduino Mega, los sensores y los leds, lo demás es casi imposible conseguirlos en mi ciudad, dado el caso tocará pedirlos desde la capital.

La idea de simplificar las cosas me parece excelente, así se facilita todo, creo que por ahora la opción sería simplificar los leds con el 74HC595, los display inicialmente con 7 + 4 y usar en los sensores el mismo pulso de salida, voy a experimentar a ver como me va, ya que es fin de semana y no hay comercio funcionando.

Claro, nesecitaría una idea del código, ¿Cómo hago para usar el mismo pulso de salida para todos los sensores ultrasónicos?  ¿Simplemente se toma ese pin de salida y se coloca en paralelo con los demás o hay otra opción?

Iré trabajando y a medida que vaya avanzando comentaré como voy, quiero estar seguro que así como voy alcancen los pines para los 24 puestos iniciales, estaré atento a toda sugerencia.


surbyte

Vamos a desarrollar la idea del multiplexor.

Tienes dos opciones válidas :
1. puedes usar el CD4051 que es un multiplexor de 1 a 8
2. o el 4052 que es 2 a 4. Te expliqué el 2 a 4.

Ahora vamos con el 4051 1 a 8.

Tienes 1 pin bidireccional que puede direccionarse a 8 pines o a la inversa.

Estos son los pines de un HC SR04
 5V Supply
 Trigger Pulse Input
 Echo Pulse Output
 0V Ground

Entonces supongamos que como dices 24 sensores. Podrias usar 3 CD 4051 que van a direccionar el pin Trigger de cada sensor Ultrasónico. Y el pin Echo será común a un pin de modo que como son 24 veremos que consumo tiene eso para el pin Arduino.

El único problema que veo es que el sensor tiene un ángulo de 15 y que debes evitar que el mismo puso disparado en los 24 sensores genere un echo residual en algun sensor. 
Bueno en este punto me doy cuenta que la idea presenta problemas posibles como perder pulsos muy próximos.
Y si lo haces barriendo o sea que cada vez que quieras medir una distancia deberás disparar su trigger.
Asi que olvidemos x ahora la opción de un solo pulso de disparo. Y Tendremosque considerar que tenemos 2 pines multiplexados para cada sensor.

NUEVA IDEA!!!
Hay una técnica muy interesante que usa diodos para separar el uso de multiples botones/pulsadores y acá podriamos usar lo mismo. Un diodo 1n4148 o 1n914 sale de cada ECHO de los HC-SR04 y se unen en sus cátodos y requerirán una R de 10k a GND.
Ese punto común va a una interrupción del Arduino pin2 o 3 son las disponibles. En teoría entonces un pulso dispara a todos los sensores y el que vaya respondiendo dará su respuesta o se acumula en un array.
Hay que probar la idea.


Gastonc4

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.


Code: [Select]


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.

https://www.prometec.net/display-4digitos/#modal

Creo que el error puede estar en esta parte,



Code: [Select]
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.

surbyte

ANalizando el código. LUego te doy mi devolución.

Esta parte

Code: [Select]
HC_SR04
Pin 2, trigger
Pin 3, echo
Pin 4, led rojo (1 - 49 cms)
Pin 4, led verde (50 - 499 cms)
 
Distancia = (Duración/2)/29
Vel Sonido = 340 m/s
Vel Sonido =(1/29 cm)/us*/


No corresponde a ún código de modo que edita lo que posteaste para que se entienda.

Faltan #includes, faltan definiciones de pines.... verifica. o danos el enlace de donde copiaste.

MI sugerencia es que uses la librería SevenSeg entonces ella se encarga via un timer y los pines correspondientes al multiplexado de los 4 displays y tu solo chequeas usando tu código los sensores ultrasónicos y actualizas las variables.
Este es un ejemplo simple

Code: [Select]
#include <SevenSeg.h>

SevenSeg disp(11,7,3,5,6,10,2); // pines para segmentos

const int numOfDigits=4;
int digitPins[numOfDigits]={12,9,8,13}; // pines para digitos.

void setup() {
 
  disp.setDigitPins(numOfDigits, digitPins);



void loop() {

    disp.write(13.28);  // presenta un valor con decimal

}



Gastonc4

Este es el código que usé, como lo dije, lo encontré en la web para un reloj con displays 7 segmentos

Code: [Select]


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);

 }




y este es el enlace de donde lo saqué.

https://www.prometec.net/display-4digitos/#modal

Estoy usando displays de cátodo común y como lo dije funciona, pero 3 de ellos parpadean y la luminosidad es bastante baja.





Gastonc4

Hola,
Como comenté, no soy experto en programación y algunas cosas no entiendo, perdón por mi ignorancia.

Este ejemplo simple no lo entiendo mucho:


Code: [Select]
#include <SevenSeg.h>

SevenSeg disp(11,7,3,5,6,10,2); // pines para segmentos

const int numOfDigits=4;
int digitPins[numOfDigits]={12,9,8,13}; // pines para digitos.

void setup() {
 
  disp.setDigitPins(numOfDigits, digitPins);

}

void loop() {

    disp.write(13.28);  // presenta un valor con decimal

}


En qué parte debo insertar la parte del còdigo donde hago las lecturas de los sensores y la actualizaciòn de las variables?
osea, esta parte:

Code: [Select]
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) ;




al parecer debo reemplazar los pines para segmentos y dígitos por los que uso.


Pablo_Lucini

Perdón por la intromisión. Pero es importante usar displays a leds ? Podés usar un LCD ? Si fuera así podés poner uno de 4 lineas de 20 caracteres ( en el que mostrás mucha más información que los de 7 segmentos) y manejás todo el display I2C con 2 salidas. Así liberarías mas pines de tu Arduino.
 

Gastonc4

Pablo, todas las opiniones y sugerencias son bienvenidas y agradezco mucho el interés en ayudar.

Definitivamente si debo usar los displays, por petición del cliente y además el tamaño de la información mostrada debe ser bien grande.

Creo que el problema que tengo en el multiplexado no es del código, ya he probado con otros y se presenta el mismo problema de inestabilidad, me atrevo a pensar que los sensores ultrasónicos generan algún tipo de interferencia o ruido el cual hace que se presenta dicha situación.

Voy a tratar de montar en una tarjeta los sensores y los leds, y en la otra manejar el multiplexado pero tengo que investigar un poco sobre la comunicación I2C para poder enviar los datos desde el maestro hacia el esclavo.

surbyte

Pero yo te sugerí que pruebes el uso de una librerìa que resolverà el problema de multiplexado del display.
Ni siquiera la has probado porque volviste a poner un còdigo similar al primero.

Intenta por esa vìa, la librerìa usa TIMER y te libera del manejo y control del display y solo te tienes que enfocar en el resto.


Gastonc4

Hola Surbyte,

Te comenté que no entendí mucho el ejemplo simple que me enviaste, en qué parte debo insertar la parte de la lectura de los sensores y actualización de las variables.

Code: [Select]
#include <SevenSeg.h>

SevenSeg disp(11,7,3,5,6,10,2); // pines para segmentos

const int numOfDigits=4;
int digitPins[numOfDigits]={12,9,8,13}; // pines para digitos.

void setup() {
 
  disp.setDigitPins(numOfDigits, digitPins);

}

void loop() {

    disp.write(13.28);  // presenta un valor con decimal

}


Supongo que debo cambiar los pines que están en el ejemplo por los que estoy usando para los displays, pero en la parte del void loop no se que teno que agregar  disp.write(13.28);  que significa?. Si cargo este ejemplo en mi tarjeta, que sucede? sale algo en los displays?
Podrías enviarme un ejemplo para un solo sensor o algo que después pueda continuar solo, te lo agradecería mucho.

surbyte

Ahh disculpa ahora lo leo.
Ya te ayudo con el tema.

Code: [Select]
SevenSeg disp(11,7,3,5,6,10,2); // pines para segmentos
Estos son los segmentos desde a b c d e f g y dp cuenta y verás.

Code: [Select]
int digitPins[numOfDigits]={12,9,8,13}; // pines para digitos.

Esto para los  digitos.. ahora solo hay que verificar si esta para CATODO COMUN o ANODO COMUN en cuyo caso habra que poner una etiqueta para que cambie o invierta.

Este simple comando

Code: [Select]
disp.write(13.28);  // presenta un valor con decimal

presentaría 13.28 en tu display

En tu caso

Code: [Select]
disp.write(distancia1);

luego de calculada debería ser suficiente para que la muestre.

Go Up