Advertisement
Villalba2006

POST_70

Nov 29th, 2016
19,667
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.40 KB | None | 0 0
  1. /*  TITULO: Generar frío con una Célula Peltier cerámica TEC1-12706
  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: marianodc83@gmail.com
  9.    
  10.    
  11.     DESCRIPCIÓN DEL PROGRAMA
  12.    
  13.     Con este programa generamos frío a partir de una célula Peltier. Está célula será controlada mediante
  14.     dos pulsadores, uno para su encendido/apagado en el modo manual (Pulsador_Peltier), donde la Célula
  15.     Peltier se irá enfriando paulatinamente hasta llegar a la temperatura mínima límite (depende de la
  16.     potencia con la que la alimentemos la célula), y el otro para entrar en el modo PID (Pulsador_PID) en
  17.     el que la Célula Peltier trabajará de manera automática para mantener la temperatura de su cara fría
  18.     entre unos rangos predefinidos (entre 16 y 18°C aproximadamente). La medida de dicha temperatura la
  19.     realizaremos mediante el sensor de temperatura DS18B20, que montaremos sobre la cara fría de la Célula,
  20.     además todo el proceso podrá ser visualizado a través de un display LCD 2004 conectado mediante I²C.
  21.     La célula Peltier y su sistema de refrigeración se alimentan mediante una F.A de 12VDC y 8,5A a través
  22.     de un relé de 5VDC, que es el que directamente será controlado a través de Arduino.
  23.    
  24.    
  25.     ESQUEMA DE CONEXION
  26.    
  27.                                       +-----+
  28.          +----[PWR]-------------------| USB |--+
  29.          |                            +-----+  |
  30.          |         GND/RST2  [ ][ ]            |
  31.          |       MOSI2/SCK2  [ ][ ]  A5/SCL[ ] |   SCL del módulo I2C del LCD 2004
  32.          |          5V/MISO2 [ ][ ]  A4/SDA[ ] |   SDA del módulo I2C del LCD 2004
  33.          |                             AREF[ ] |
  34.          |                              GND[ ] |
  35.          | [ ]N/C                    SCK/13[ ] |  
  36.          | [ ]IOREF                 MISO/12[ ] |  
  37.          | [ ]RST                   MOSI/11[ ]~|  
  38.          | [ ]3V3    +---+               10[ ]~|  
  39.          | [ ]5v    -| A |-               9[ ]~|   Pin "S" del RELÉ
  40.          | [ ]GND   -| R |-               8[ ] |   Pin "PA" del "Pulsador_Peltier"
  41.          | [ ]GND   -| D |-                    |
  42.          | [ ]Vin   -| U |-               7[ ] |   Pin "PA" del "Pulsador_PID"
  43.          |          -| I |-               6[ ]~|   Cable amarillo "DATA" del sensor de temperatura DS18B20
  44.          | [ ]A0    -| N |-               5[ ]~|  
  45.          | [ ]A1    -| O |-               4[ ] |  
  46.          | [ ]A2     +---+           INT1/3[ ]~|  
  47.          | [ ]A3                     INT0/2[ ] |  
  48.          | [ ]A4/SDA  RST SCK MISO     TX>1[ ] |  
  49.          | [ ]A5/SCL  [ ] [ ] [ ]      RX<0[ ] |  
  50.          |            [ ] [ ] [ ]              |
  51.          |  UNO_R3    GND MOSI 5V  ____________/
  52.           \_______________________/
  53.  
  54.   NOTAS:
  55.    - Conexión de la parte de control (entrada) del Relé:
  56.      - Pin(+) del Relé --> +5V.
  57.      - Pin(-) del Relé --> GND.
  58.    - Conexión de la parte de potencia (salida) del Relé:
  59.      - Pin "COM" del RELÉ --> Negativo de la fuente de tensión de 12VDC.
  60.      - Pin "NO" del RELÉ --> Cable negro(-) del ventilador de 12VDC.
  61.      - Cable rojo(+) del ventilador de 12VDC --> Positivo de la fuente de tensión de 12VDC.
  62.    - Conexión de la célula Peltier:
  63.      - La Célula Peltier se conecta en paralelo con el Ventilador de 12VDC, es decir, el cable rojo(+) del
  64.        ventilador de 12VDC al cable rojo (+) de la Célula Peltier y el cable negro(-) del ventilador de 12VDC
  65.        al cable negro(-) de la Célula Peltier.
  66.    - Los dos pulsadores tienen dos pines, que vamos a denominar PA y PB (si es de 4 sólo usamos 2 de ellos)
  67.    - Conexión PULL-DOWN del "Pulsador_PID" y del "Pulsador_Peltier"
  68.      - PB tanto del "Pulsador_PID" como del "Pulsador_Peltier" conectados a VCC.
  69.      - PA tanto del "Pulsador_PID" como del "Pulsador_Peltier" conectados a GND a través de una R=10K ohms.
  70.        (la resistencia debe de ser individual para cada pulsador)
  71.    - La alimentación y la masa del módulo I2C del LCD 2004 van directamente conectadas a VCC (+5V) y GND
  72.      respectivamente.
  73.    - Conexión del sensor de temperatura DS18B20:
  74.      - Cable rojo (VCC) del sensor de temperatura --> Cable negro (GND) del sensor de temperatura.
  75.      - Cable amarillo (DATA) del sensor de temperatura --> +5VDC de Arduino a través de R=4,7K (PULL-UP)    
  76. */
  77.  
  78.   // Incluimos las librerías
  79.   #include <OneWire.h> // Librería para la comunicación con un solo cable
  80.   #include <DallasTemperature.h> // Librería para el sensor DS18B20
  81.   #include <Wire.h> // Librería para la comunicación I2C
  82.   #include <LiquidCrystal_I2C.h> // Librería para el LCD I2C
  83.    
  84.  
  85.   float temperatura; // Variable para almacenar la temperatura del sensor de temperatura DS18B20
  86.  
  87.   float TEMP_MAX = 125; // Temperatura máxima que detecta el sensor de temperatura DS18B20
  88.   float TEMP_MIN = -55; // Temperatura mínima que detecta el sensor de temperatura DS18B20
  89.  
  90.   int PIN_sensor = 6; // Pin digital para el sensor de temperatura DS18B20
  91.   int Pulsador_PID = 7; // Pin digital 7 para el pulsador que activa el modo PID
  92.   int Pulsador_Peltier = 8; // Pin digital 8 para el pulsador que activa la célula Peltier
  93.   int RELE = 9; // Pin digital 9 para la señal de entrada del Relé
  94.    
  95.   // Variables internas para los pulsadores con enclavamiento
  96.   int encender_Peltier = 0;
  97.   int anterior_Peltier = 0;
  98.   int estado_Peltier = 0;
  99.  
  100.   int encender_PID = 0;
  101.   int anterior_PID = 0;
  102.   int estado_PID = 0;
  103.  
  104.   int Peltier = 0;
  105.   int PID = 0;
  106.  
  107.   OneWire ourWire(PIN_sensor); // Se establece el pin digital 6 para la comunicación OneWire
  108.   DallasTemperature sensor(&ourWire); // Se instancia la librería DallasTemperature
  109.  
  110.   // Declaración del objeto para el LCD
  111.   // Terminales de conexión del LCD: addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
  112.   LiquidCrystal_I2C lcd(0x20, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  113.  
  114.  
  115.   void setup()
  116.   {
  117.     pinMode(PIN_sensor, INPUT); // Pin digital 6 como entrada
  118.     pinMode(Pulsador_PID, INPUT); // Pin digital 7 como entrada
  119.     pinMode(Pulsador_Peltier, INPUT); // Pin digital 8 como entrada  
  120.     pinMode(RELE, OUTPUT); // Pin digital 9 como salida
  121.    
  122.     digitalWrite(RELE, LOW); // Relé inicialmente desconectado
  123.    
  124.     lcd.begin(20,4); // Se inicializa el LCD para 20x4
  125.     sensor.begin(); // Se inicializa el sensor de temperatura DS18B20
  126.     lcd.setCursor(0,0);
  127.     lcd.print("TEMPERATURA PELTIER"); // Imprimo la cabecera
  128.     lcd.setCursor(0,1);
  129.     lcd.print("PELTIER - OFF"); // Imprimo el estado de la célula PELTIER
  130.     lcd.setCursor(0,2);
  131.     lcd.print("PID - OFF"); // Imprimo el estado del modo PID  
  132.   }
  133.  
  134.   void loop()
  135.   {
  136.     // Función que controla el estado (ON/OFF) de la célula Peltier
  137.     Celula_Peltier();
  138.    
  139.     // Función que controla el estado (ON/OFF) del modo PID
  140.     modo_PID();
  141.    
  142.     sensor.requestTemperatures(); // Prepara el sensor de temperatura DS18B20 para su lectura
  143.     temperatura = sensor.getTempCByIndex(0); // Se lee la temperatura del sensor en grados Celsius
  144.    
  145.     // Mostramos el valor de la temperatura a través del LCD 2004  
  146.     lcd.setCursor(0,4);
  147.     lcd.print(">> TEMP = ");
  148.     if(temperatura < 10)
  149.     {
  150.        lcd.print(" ");
  151.     }
  152.     lcd.print(temperatura);
  153.     lcd.print(" \337C"); // Símbolo de º (número en OCTAL) + C (tabla de caracteres especiales LCD 1602)
  154.    
  155.   }
  156.  
  157.   // Función que controla el estado (ON/OFF) de la célula Peltier
  158.   void Celula_Peltier()
  159.   {
  160.       // Función que evalúa el estado del pulsador Peltier
  161.       Estado_Pulsador_Peltier();
  162.      
  163.       // Si se enciende el pulsador Peltier o la Tª es mayor o igual que TEMP_MAX se activa el RELÉ
  164.       if(encender_Peltier == 1)
  165.       {
  166.         digitalWrite(RELE, HIGH);
  167.         lcd.setCursor(0,1);      
  168.         lcd.print(">> PELTIER = ON ");
  169.       }
  170.      
  171.       // Si es la 2ª vez que presionamos el pulsador o la Tª es menor o igual que TEMP_MIN se desactiva el RELÉ
  172.       if(encender_Peltier == 0)
  173.       {
  174.         digitalWrite(RELE, LOW);
  175.         lcd.setCursor(0,1);      
  176.         lcd.print(">> PELTIER = OFF");
  177.       }  
  178.   }
  179.  
  180.   // Función que controla el estado (ON/OFF) del modo PID
  181.   void modo_PID()
  182.    {
  183.       // Función que evalúa el estado del pulsador del modo PID
  184.       Estado_Pulsador_PID();
  185.      
  186.       // Si es la 1ª vez que presionamos el pulsador del modo PID
  187.       if(encender_PID == 1)
  188.       {
  189.         TEMP_MAX = 18; // Temperatura máxima del modo PID
  190.         TEMP_MIN = 16; // Temperatura mínima del modo PID
  191.         lcd.setCursor(0,2);
  192.         lcd.print(">> PID = ON ");
  193.        
  194.         if(temperatura >= TEMP_MAX)
  195.         {
  196.           encender_Peltier = 1;// Se enciende la célula Peltier
  197.         }
  198.        
  199.         if(temperatura <= TEMP_MIN)
  200.         {
  201.           encender_Peltier = 0;// Se apaga la célula Peltier
  202.         }      
  203.       }
  204.      
  205.       // Si es la 2ª vez que presionamos el pulsador del modo PID
  206.       else
  207.       {
  208.         TEMP_MAX = 125; // Temperatura máxima que detecta el sensor de temperatura DS18B20
  209.         TEMP_MIN = -55; // Temperatura mínima que detecta el sensor de temperatura DS18B20
  210.         lcd.setCursor(0,2);
  211.         lcd.print(">> PID = OFF");
  212.       }  
  213.    }
  214.  
  215.   // Función que evalúa el estado del pulsador ON/OFF de la Célula Peltier
  216.   void Estado_Pulsador_Peltier()
  217.   {
  218.     estado_Peltier = digitalRead(Pulsador_Peltier); // Comprobamos el estado actual del pulsador Peltier
  219.    
  220.     // Si el pulsador Peltier está presionado y su estado anterior es desactivado
  221.     if(estado_Peltier && anterior_Peltier == 0)
  222.     {
  223.       encender_Peltier = 1 - encender_Peltier;
  224.     }
  225.    
  226.     anterior_Peltier = estado_Peltier; // Se actualiza el estado anterior del pulsador Peltier    
  227.   }
  228.  
  229.   // Función que evalúa el estado del pulsador del modo PID
  230.   void Estado_Pulsador_PID()
  231.   {
  232.     estado_PID = digitalRead(Pulsador_PID); // Comprobamos el estado actual del pulsador Peltier
  233.    
  234.     // Si el pulsador del modo PID está presionado y su estado anterior es desactivado
  235.     if(estado_PID && anterior_PID == 0)
  236.     {
  237.       encender_PID = 1 - encender_PID;
  238.     }
  239.    
  240.     anterior_PID = estado_PID; // Se actualiza el estado anterior del pulsador Peltier    
  241.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement