Villalba2006

POST_42

Nov 25th, 2016
4,524
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.63 KB | None | 0 0
  1. /*  TITULO: Contador ascendente/descendente con codificador rotatorio.
  2.  
  3.     AUTOR:
  4.    
  5.     MARIANO DEL CAMPO GARCÍA (@2016) --> 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.     Con este programa controlamos un conteo ascendente/descendente (del 0 al 9 y viceversa) mediante
  14.     un codificador rotatorio. Si giramos en el sentido de las agujas del reloj, la cuenta aumenta y
  15.     se enciende el LED Azul, y si giramos en el sentido antihorario la cuenta disminuye y el LED Rojo
  16.     es ahora el que se enciende, apagándose el LED Azul.
  17.    
  18.  
  19.     ESQUEMA DE CONEXION
  20.    
  21.                                       +-----+
  22.          +----[PWR]-------------------| USB |--+
  23.          |                            +-----+  |
  24.          |         GND/RST2  [ ][ ]            |
  25.          |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |  
  26.          |          5V/MISO2 [ ][ ]  A4/SDA[ ] |  
  27.          |                             AREF[ ] |
  28.          |                              GND[ ] |
  29.          | [ ]N/C                    SCK/13[ ] |   Terminal "g" del display
  30.          | [ ]IOREF                 MISO/12[ ] |   Terminal "f" del display
  31.          | [ ]RST                   MOSI/11[ ]~|   Terminal "e" del display
  32.          | [ ]3V3    +---+               10[ ]~|   Terminal "d" del display
  33.          | [ ]5v    -| A |-               9[ ]~|   Terminal "c" del display
  34.          | [ ]GND   -| R |-               8[ ] |   Terminal "b" del display
  35.          | [ ]GND   -| D |-                    |
  36.          | [ ]Vin   -| U |-               7[ ] |   Terminal "a" del display
  37.          |          -| I |-               6[ ]~|   LED_Rojo(+)
  38.          | [ ]A0    -| N |-               5[ ]~|   LED_Azul(+)
  39.          | [ ]A1    -| O |-               4[ ] |   Pin CLK del codificador rotatorio
  40.          | [ ]A2     +---+           INT1/3[ ]~|   Pin DT del codificador rotatorio
  41.          | [ ]A3                     INT0/2[ ] |  
  42.          | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |  
  43.          | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |  
  44.          |            [ ] [ ] [ ]              |
  45.          |  UNO_R3    GND MOSI 5V  ____________/
  46.           \_______________________/
  47.  
  48.   NOTAS:  
  49.     - Alimentación del codificador rotatorio
  50.        - VCC --> +5V de Arduino.
  51.        - GND --> GND de Arduino.
  52.        - SW --> No conectado.
  53.     - El terminal "com" del display conectado a GND a través de una R=220 ohms
  54.     - Cátodo(-) de los LEDS a GND a través de una R=220 omhs (diferente para cada LED).
  55. */
  56.  
  57.   int pinA = 4;  // Pin digital para el pin CLK del codificador rotatorio
  58.   int pinB = 3;  // Pin digital para el pin DT del codificador rotatorio
  59.   int LED_Azul = 5; // Pin digital para el LED Azul
  60.   int LED_Rojo = 6; // Pin digital para el LED Rojo
  61.    
  62.   // Variables para el funcionamiento del programa
  63.   int contadorPosicion = 0;
  64.   int valorInicial = 0;  
  65.   int valorActual = 0;
  66.   boolean horario;
  67.  
  68.   void setup()
  69.   {
  70.     pinMode(pinA, INPUT); // Pin digital 4 como entrada
  71.     pinMode(pinB, INPUT); // Pin digital 3 como entrada
  72.     pinMode(LED_Azul, OUTPUT); // Pin digital 5 como salida
  73.     pinMode(LED_Rojo, OUTPUT); // Pin digital 6 como salida
  74.    
  75.    // Asignación de los pines digitales para el display de 7 segmentos como salidas
  76.     pinMode(7, OUTPUT);
  77.     pinMode(8, OUTPUT);
  78.     pinMode(9, OUTPUT);
  79.     pinMode(10, OUTPUT);
  80.     pinMode(11, OUTPUT);
  81.     pinMode(12, OUTPUT);
  82.     pinMode(13, OUTPUT);  
  83.        
  84.     // Guardamos el valor inicial del codificador rotatorio  
  85.     valorInicial = digitalRead(pinA);  
  86.   }
  87.  
  88.   void loop()
  89.   {
  90.     // Leemos el valor actual del pin CLK
  91.     valorActual = digitalRead(pinA);
  92.     // Si el valor en el pin CLK cambia (flanco de bajada o de subida), es decir, si hemos
  93.     // modificado la posición del mando del codificador rotatorio.
  94.     if (valorActual != valorInicial)
  95.     {
  96.       // Si el valor en el pin CLK es diferente al del pin DT (sentido horario)
  97.       if (digitalRead(pinB) != valorActual)
  98.       {  
  99.         // La posición aumenta una unidad hasta llegar al número 9
  100.         if(contadorPosicion < 9)
  101.         {
  102.           contadorPosicion++;
  103.         }
  104.         horario = true;
  105.       }
  106.       // Si el valor en el pin CLK es igual al del pin DT (sentido antihorario)
  107.       else
  108.       {
  109.         // La posición disminuye una unidad hasta llegar al número 0
  110.         if(contadorPosicion > 0)
  111.         {
  112.           contadorPosicion--;
  113.         }
  114.         horario = false;        
  115.       }
  116.    
  117.       // Si movemos el mando del codificador rotatorio en sentido horario
  118.       if(horario)
  119.       {      
  120.         digitalWrite(LED_Rojo, LOW); // Se apaga el LED Rojo
  121.         digitalWrite(LED_Azul, HIGH); // Se enciende el LED Azul
  122.       }
  123.       // Si movemos el mando del codificador rotatorio en sentido antihorario
  124.       else
  125.       {      
  126.         digitalWrite(LED_Rojo, HIGH); // Se enciende el LED Rojo
  127.         digitalWrite(LED_Azul, LOW); // Se apaga el LED Azul
  128.       }
  129.    }
  130.   // Actualizamos el valor inicial del pin CLK del codificador rotatorio
  131.   valorInicial = valorActual;
  132.   // Actualizamos el valor del contador en el display de 7 segmentos.
  133.   actualizarNumero();
  134.   }
  135.  
  136.    // Función del display: Se reciben 7 variables y se asignan a cada una de las salidas
  137.   void display (int a, int b, int c, int d, int e, int f, int g)
  138.   {
  139.     digitalWrite (7,a);  
  140.     digitalWrite (8,b);  
  141.     digitalWrite (9,c);
  142.     digitalWrite (10,d);
  143.     digitalWrite (11,e);
  144.     digitalWrite (12,f);
  145.     digitalWrite (13,g);
  146.   }
  147.  
  148.   // Función que actualiza el número que aparece en el display de 7 segmentos                
  149.   void actualizarNumero()
  150.   {
  151.     switch(contadorPosicion){
  152.       case 0:
  153.         display (1,1,1,1,1,1,0); // Número "0"
  154.         break;
  155.       case 1:
  156.         display (0,1,1,0,0,0,0); // Número "1"
  157.         break;
  158.       case 2:
  159.         display (1,1,0,1,1,0,1); // Número "2"
  160.         break;
  161.       case 3:
  162.         display (1,1,1,1,0,0,1); // Número "3"
  163.         break;
  164.       case 4:
  165.         display (0,1,1,0,0,1,1); // Número "4"
  166.         break;
  167.       case 5:
  168.         display (1,0,1,1,0,1,1); // Número "5"
  169.         break;
  170.       case 6:
  171.         display (1,0,1,1,1,1,1); // Número "6"
  172.         break;
  173.       case 7:
  174.         display (1,1,1,0,0,0,0); // Número "7"
  175.         break;
  176.       case 8:
  177.         display (1,1,1,1,1,1,1); // Número "8"
  178.         break;
  179.       case 9:
  180.         display (1,1,1,0,0,1,1); // Número "9"
  181.         break;
  182.     }
  183.   }
Advertisement
Add Comment
Please, Sign In to add comment