2.5.1. Ejemplo de convertidor ADC, Termostato
Se ha de implementar el termostato según las siguientes características:
- Se dispone de un pulsador de marcha y otro de paro para activar el sistema.
- Un indicador informa del estado del sistema.
- La temperatura deseada (consigna) se ha de establecer entre 18ºC y 50ºC, esta señal de referencia se lee de un potenciómetro situado en una entrada analógica.
- Para medir la temperatura se dispone de un sensor de rango -10ºC a 100ºC conectado en una entra analógica. Este está calibrado con fondo de escala de 0-5V.
- El regulador es del tipo todo/nada para actuar sobre una resistencia calefactora.
- Se establece una histéresis para la conmutación de 1ºC.
Entradas
Salidas
- K1 Indicador de sistema en marcha
- K2 Salida para la resistencia calefactora
Sensores
- aic Consigna entregada por el potenciómetro
- ait Temperatura entregada por el sensor

Escalado de las entradas analógicas del microPLC para arduino
Escalado de la señal analógica y digital al verdadero valor de la magnitud física.

Programa ladder del termostato con el microPLC arduino
Programa del termostato
/*
* Ejemplo de termostato con convertidor analógico a digital ADC para el MicroPLC - arduino
*
* Descripción: Programa básico para leer entradas analógicas 0 y 1
* para realizar un termostato del tipo todo/nada
* En la entrada 0 tenemos la temperatura de referencia con un potenciómetro
* con valor escalado entre 18 y 50 ºC
* En la entrada 1 tenemos la temperatura medida de un sensor
* con valor escalado entre -10 y 100 ºC
*
* Autor: Rafa Aranda
* Fecha: 22-05-2014
* Versión: 1.0
*/
// Asignación de Pins a Salidas digitales (están ordenados de forma decreciente por necesidades del PCB)
#define Out_1 6
#define Out_2 7
#define Out_3 8
#define Out_4 9
// Pins de entrada (están ordenados de forma decreciente por necesidades del PCB)
#define In_1 5
#define In_2 4
#define In_3 3
#define In_4 2
#define HTRS 0.5 // Histéresis/2 para el control de la temperatura 0,5 -> 1ºC
// Librerías
#include "microPLC.h"
// Funciones prototipo
void getInputs(void);
void setOutputs(void);
// Variables globales
//Definición de las variables de trabajo
m4bits s; // Entradas del MicroPLC
m4bits k; // Salidas del MicroPLC
m4bits m1; // Memoria temporal
// MicroPLC
microPLC uPLC; // Declaración del MicroPLC
// Objetos del microPLC contadores, temporizadores, convertidores
Analog aic(0, 18, 50); // Iniciamos la entrada analógica 0 con escalado de 18ºC a 50ºC. Consigna
Analog ait(1, -10, 100); // Iniciamos la entrada analógica 1 con escalado de -10ºC a 100ºC. Temperatura
/* setup
* Tareas iníciales de preparación
*/
void setup(){
// Establecer los pins de salida de los relés
pinMode(Out_1, OUTPUT);
pinMode(Out_2, OUTPUT);
pinMode(Out_3, OUTPUT);
pinMode(Out_4, OUTPUT);
// Establecer los pins de entradas digitales optoacopladas
pinMode(In_1, INPUT);
pinMode(In_2, INPUT);
pinMode(In_3, INPUT);
pinMode(In_4, INPUT);
// Preparar las variables
uPLC.init(); // Iniciar funciones del tiempo
Serial.begin(9600); // Inicia el Puerto serie
}
/* loop
* Programa principal
*/
void loop() {
getInputs(); // Leer las entradas digitales
//-------- Termostato --------
// A. Marcha paro del sistema
k._1=(s._1|k._1)&!s._2;
// B. Activar la entrada analógica 0, consigna
aic.En(k._1);
// C. Activar la entrada analógica 1, temperatura
ait.En(k._1);
// D. Control paro del calefactor
if(ait.Out_e()>aic.Out_e()+HTRS)
m1._1=false; // Parar el calefactor
// E. Control marcha del calefactor
if(ait.Out_e()<aic.Out_e()-HTRS)
m1._1=true; // Marcha del calefactor
// F. Activar la resistencia calefactora
k._2=k._1&m1._1;
// DEBUG
//Serial.println(ait.Out_e());
//------------------------
setOutputs(); // Activar las salidas
delay(1); // CicloScan + 1ms, retardo para anti-rebotes
}
/* GetInputs
* Lee el estado de la entrada indicada en el parámetro y lo asigna invertido a las variables de trabajo
*/
void getInputs(void){
s._1=!digitalRead(In_1);
s._2=!digitalRead(In_2);
s._3=!digitalRead(In_3);
s._4=!digitalRead(In_4);
}
/* setOutputs
* Asigna el estado de las variables de trabajo a las salidas digitales
*/
void setOutputs(void){
digitalWrite(Out_1, k._1);
digitalWrite(Out_2, k._2);
digitalWrite(Out_3, k._3);
digitalWrite(Out_4, k._4);
}