Villalba2006

POST_81_NEWPING

Nov 26th, 2018
16,067
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*  TITULO: Sensor de parking con JSN-SR04T y display de 4 dígitos TM1637 (librería NewPing.h)
  2.  
  3.     AUTOR:
  4.    
  5.     MARIANO DEL CAMPO GARCÍA (@2018) --> INGENIERO TÉCNICO INDUSTRIAL ESPECIALIDAD ELECTRÓNICA
  6.     - FACEBOOK: https://www.facebook.com/mariano.delcampogarcia
  7.     - TWITTER: https://twitter.com/MarianoCampoGa
  8.     - CORREO: [email protected]
  9.    
  10.    
  11.     DESCRIPCIÓN DEL PROGRAMA
  12.    
  13.     Este programa es capaz de activar un "Zumbador" cuando el objeto se encuentra a una distancia inferior o
  14.     igual a la distancia configurada dentro de la variable "distancia_Alarma". Cuando la distancia supere dicho
  15.     valor (distancia_Alarma), el zumbador permanecerá desactivado.
  16.     El sistema está dotado de un pulsador y de un LED indicador para controlar el modo parking, es decir, que la
  17.     funcionalidad del modo parking se active únicamente cuando nosotros lo necesitemos, además de encenderse un LED
  18.     indicador de modo.
  19.     Además, se incluye un display de 4 dígitos y 7 segmentos con controlador TM1637 que nos va a mostrar la distancia en
  20.     centímetros cuando el modo parking está activado y en caso contrario nos muestra "----" a través del display.
  21.    
  22.  
  23.     ESQUEMA DE CONEXION
  24.    
  25.                                       +-----+
  26.          +----[PWR]-------------------| USB |--+
  27.          |                            +-----+  |
  28.          |         GND/RST2  [ ][ ]            |
  29.          |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |    
  30.          |          5V/MISO2 [ ][ ]  A4/SDA[ ] |    
  31.          |                             AREF[ ] |
  32.          |                              GND[ ] |
  33.          | [ ]N/C                    SCK/13[ ] |  
  34.          | [ ]IOREF                 MISO/12[ ] |  Pin "DIO" del display de 4 dígitos y 7 segmentos
  35.          | [ ]RST                   MOSI/11[ ]~|  Pin "CLK" del display de 4 dígitos y 7 segmentos
  36.          | [ ]3V3    +---+               10[ ]~|  
  37.          | [ ]5v    -| A |-               9[ ]~|  ECHO
  38.          | [ ]GND   -| R |-               8[ ] |  TRIG
  39.          | [ ]GND   -| D |-                    |
  40.          | [ ]Vin   -| U |-               7[ ] |  ZUMBADOR(+)
  41.          |          -| I |-               6[ ]~|  LED(+)
  42.          | [ ]A0    -| N |-               5[ ]~|  PA
  43.          | [ ]A1    -| O |-               4[ ] |  
  44.          | [ ]A2     +---+           INT1/3[ ]~|
  45.          | [ ]A3                     INT0/2[ ] |  
  46.          | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |  
  47.          | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |  
  48.          |            [ ] [ ] [ ]              |
  49.          |  UNO_R3    GND MOSI 5V  ____________/
  50.           \_______________________/
  51.  
  52.   NOTAS:
  53.  
  54.    - Sensor ultrasónico impermeable JSN-SR04T:
  55.      Además de las conexiones TRIG y ECHO que van directamente al Arduino, necesitamos alimentarlo también
  56.      en sus terminales VCC (+5V) y GND (masa) a través de nuestro Arduino.
  57.    - El ZUMBADOR tiene dos terminales, ZUMBADOR(+) que es el más largo y el que va conectado al pin digital
  58.      correspondiente de arduino, y ZUMBADOR(-) que va conectado directamente a GND.
  59.    - Cátodo(-) del LED(-) a GND a través de una resistencia de 220 ohms.
  60.    - Los pulsadores suelen tener dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos)
  61.    - Conexión PULL_UP del pulsador: Se utiliza una resistencia interna del Arduino como resistencia PULL_UP
  62.      por lo que no es necesario añadir más componentes al pulsador para que funcione correctamente.
  63.        - PB conectado a GND.
  64.        - PA conectado al pin digital correspondiente de Arduino.
  65.    - Alimentación del display de 4 dígitos y 7 segmentos: Directamente conectada a +5V y GND de Arduino      
  66. */
  67.  
  68.   #include <NewPing.h> // Librería necesaria para trabajar con el sensor ultrasónico impermeable JSN-SR04T.
  69.   #include "TM1637.h" // Librería necesaria para el display de 4 dígitos
  70.  
  71.   #define CLK 11 // Pin CLK
  72.   #define DIO 12 // Pin DIO
  73.  
  74.   #define TRIGGER_PIN  8  // Pin digital para el pin TRIG del sensor ultrasónico impermeable JSN-SR04T.
  75.   #define ECHO_PIN     9  // Pin digital para el pin ECHO del sensor ultrasónico impermeable JSN-SR04T.
  76.   #define MAX_DISTANCE 200 // Variable que almacena la máxima distancia a medir con el sensor ultrasónico impermeable JSN-SR04T (mide entre 25-450 cm)
  77.  
  78.   const int ZUMBADOR = 7; // Pin digital para el ZUMBADOR
  79.   const int LED = 6; // Pin digital para el LED
  80.   const int PULSADOR = 5; // Pin digital para el PULSADOR
  81.  
  82.   const int tiempoAntirrebote = 10; // Variable que almacena el tiempo antirrebote para los pulsadores de control de la velocidad
  83.  
  84.   // Variables para controlar el funcionamiento del sistema
  85.   int distancia = 0;
  86.   int distancia_Alarma = 30; // Distancia límite para la Alarma en centímetros
  87.   byte modo_parking = 0;
  88.  
  89.   // Declaración de los estados internos de los pulsadores que controlan la velocidad de giro del motor en rpm
  90.   int estadoPulsador;
  91.   int estadoPulsadorAnterior = 1;
  92.  
  93.   // Declaración del objeto para el sensor ultrasónico impermeable JSN-SR04T
  94.   NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
  95.  
  96.   // Declaración del objeto para el display de 4 dígitos
  97.   TM1637 Display1(CLK,DIO);
  98.  
  99.   // Matriz de letras que se van a mostrar inicialmente
  100.   int8_t vacio[4] = {0x10,0x10,0x10,0x10}; // Se muestra el símbolo "-" pero con 0x13 se muestra " " (vacío)
  101.  
  102.  
  103.   void setup()
  104.   {
  105.     pinMode(ZUMBADOR, OUTPUT); // Pin digital 7 como SALIDA
  106.     pinMode(LED, OUTPUT); // Pin digital 6 como SALIDA
  107.     pinMode(PULSADOR, INPUT_PULLUP); // Pin digital 5 como ENTRADA PULLUP
  108.    
  109.     digitalWrite(ZUMBADOR, LOW); // Inicialmente el ZUMBADOR se encuentra desactivado
  110.     digitalWrite(LED, LOW); // Inicialmente el LED se encuentra desactivado
  111.    
  112.     Display1.init(); // Inicializa display de 4 dígitos
  113.     Display1.set(3); // Brillo, 0 (mínimo) a 7 (máximo)
  114.     Display1.point(POINT_OFF); // Apaga dos puntos, POINT_ON para encenderlos
  115.    
  116.     // Vaciamos todos los dígitos del display
  117.     Display1.display(vacio);
  118.   }
  119.  
  120.  
  121.   void loop()
  122.   {
  123.     // Leemos el estado del pulsador del modo parking
  124.     estadoPulsador = digitalRead(PULSADOR);
  125.     // Si hay un cambio en el estado del pulsador del modo parking
  126.     if(estadoPulsador != estadoPulsadorAnterior)
  127.     {
  128.       // y si se ha eliminado ya el rebote del pulsador del modo parking
  129.       if(antirrebote(PULSADOR))
  130.       {
  131.         // Se suma una unidad al modo_parking
  132.         modo_parking++;
  133.        
  134.         // Si el modo_parking es igual a 2, pasa a valer 0
  135.         if(modo_parking == 2) modo_parking = 0;      
  136.       }
  137.       // Actualizamos el estado anterior del pulsador del modo parking
  138.       estadoPulsadorAnterior = estadoPulsador;
  139.     }
  140.    
  141.     // Si se ha activado el modo parking
  142.     if(modo_parking == 1)
  143.     {
  144.       digitalWrite(LED, HIGH); // Se activa el LED indicador del modo parking
  145.      
  146.       // Leemos y registramos la distancia en centímetros que está detectando el sensor ultrasónico impermeable JSN-SR04T.    
  147.       distancia = sonar.ping_cm();
  148.       delay(50); // Tiempo mínimo en milisegundos para la lectura del sensor ultrasónico impermeable JSN-SR04T.  
  149.      
  150.       if(distancia <= distancia_Alarma) // Si la distancia es inferior o igual a la distancia de alarma configurada
  151.       {
  152.         digitalWrite(ZUMBADOR, HIGH); // Se activa el ZUMBADOR
  153.       }  
  154.    
  155.       else // Si la distancia es superior a la distancia de alarma configurada
  156.       {
  157.         digitalWrite(ZUMBADOR, LOW); // Se desactiva el ZUMBADOR
  158.       }
  159.      
  160.        // Llamada a la función que muestra la distancia a través del display
  161.        encender_display(distancia);
  162.     }
  163.    
  164.     // Si no se ha activado el modo parking
  165.     if(modo_parking == 0)
  166.     {
  167.       digitalWrite(LED, LOW); // Se desactiva el LED indicador del modo parking      
  168.      
  169.       digitalWrite(ZUMBADOR, LOW); // Se desactiva el ZUMBADOR
  170.    
  171.       // Vaciamos todos los dígitos del display
  172.       Display1.display(vacio);
  173.     }
  174.   }
  175.  
  176.  
  177.   // Función antirrebote
  178.   boolean antirrebote(int pin)
  179.   {
  180.     int contador = 0;
  181.     boolean estado;
  182.     boolean estadoAnterior;
  183.    
  184.     do
  185.     {
  186.       estado = digitalRead(pin);
  187.       if(estado != estadoAnterior)
  188.       {
  189.         contador = 0;
  190.         estadoAnterior = estado;
  191.       }
  192.       else
  193.       {
  194.         contador = contador+ 1;
  195.       }
  196.       delay(1);
  197.     } while(contador < tiempoAntirrebote);
  198.    
  199.     return estado;
  200.   }
  201.  
  202.   // Función que muestra el número de pasos a través del display
  203.   void encender_display(int cm)
  204.   {    
  205.     if(cm <= 99)
  206.     {
  207.       Display1.display(3, cm/1 % 10); // Dígito 3
  208.       Display1.display(2, cm/10 % 10); // Dígito 2
  209.       Display1.display(1, 0x13); // Dígito 1 => " " (Vacío)
  210.       Display1.display(0, 0x13); // Dígito 0 => " " (Vacío)
  211.     }
  212.    
  213.     if(cm >99 && cm <=999)
  214.     {
  215.       Display1.display(3, cm/1 % 10); // Dígito 3
  216.       Display1.display(2, cm/10 % 10); // Dígito 2
  217.       Display1.display(1 ,cm/100 % 10); // Dígito 1
  218.       Display1.display(0, 0x13); // Dígito 0 => " " (Vacío)
  219.     }  
  220.   }
Advertisement
Add Comment
Please, Sign In to add comment