Termómetro LCD número y barra


Aprovechando el método utilizado para mostrar la barra de progreso en el display LCD, se implementara un termómetro que mostrara la temperatura de forma numérico en el primer renglón y en modo barra en el segundo renglón.
Se utiliza como sensor el LM35DZ, el mismo nos entrega 10mV/°C, esto quiere decir que cuando medimos 1V tendremos 100°C, pero como es un medidor de temperatura ambiente, lo vamos a limitar a 40°C, lo cual la tensión máxima esperada sera de 400mV.
Utilizar el ADC como viene por defecto de 0 a 5V,  se imaginaran que no es la mejor manera, ya que el fondo de escala de nuestro medidor sera de 0,4V y quedara un 90% de resolución perdida.
Para ello la manera mas común es utilizar un amplificador operacional que nos eleve proporcionalmente esta tensión con un factor de multiplicación de 10 como para tener 5V a la salida cuando hay 500mV a la entrada, de esta forma los 400mV correspondientes a los 40°C serán 4V y asi se aprovecha la resolución del ADC.
Como podrán ver en el circuito, utilizamos el LM358 como seguidor y amplificador x10 para nuestro ADC.
El resto del circuito es solamente el microcontrolador y el LCD.
Este es un circuito que pretende dar uso a la barra gráfica del LCD, pero claramente se puede expandir como un termostato con su setpoint correspondiente, o bien cualquier otra aplicación.
Se utiliza un refresco cada 1 segundo ya que la temperatura no suele variar con mucha velocidad, pero si quieren pueden eliminar ese delay o modificarlo.



El programa funciona igual que en el post del gráfico de barras con LCD, solo que se añade el calculo para mostrar la temperatura del LM35 luego de multiplicarse por 10.
En la función MAP donde definimos los limites de la barra, tenemos como origen de 0 a 40, ya que sera la representación de temperatura que nos interesa, pero podremos modificarlo, si quisiéramos que mida de 0 a 60, deberíamos cambiar ese 40 por un 60, luego como destino de la barra sera el mismo de siempre de 0 a 16 ya que son 16 barras en el LCD.

#include<16f883.h>
#device adc=10
#use delay(int=4000000)
#include<LCD.C> 
double map(float valor, float entradaMin, 
           float entradaMax, float salidaMin, 
           float salidaMax){
   return ((((valor-entradaMin)*
             (salidaMax-salidaMin))/
             (entradaMax-entradaMin))+salidaMin);
}  
void main(){
   setup_adc_ports(sAN0|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   lcd_init();
   int16 salida=0, leeAdc=0, salida_A=0, i=0;
   float temp=0;
   while(true){
      set_adc_channel(0);
      delay_us(10);
      leeAdc = read_adc();
      temp = (leeADC*5.0/1023.0)*10;
      salida = map(temp, 0, 40, 0, 16);
      delay_ms(1000);
      lcd_gotoxy(12,1);
      lcd_putc(0xDF);
      lcd_gotoxy(13,1);
      lcd_putc(0x43);
      lcd_gotoxy(1,1);
      printf(lcd_putc,"Temp: %2.1f",temp);
      for(i=1;i<salida+1;i++){
         lcd_gotoxy(i,2);
         lcd_putc(0xFF);
      }
      if(salida_A<salida){
         lcd_gotoxy(salida,2);
         lcd_putc(0xFF);
      }
      if(salida_A>salida){
         lcd_gotoxy(salida+1,2);
         lcd_putc(0x20);
      }
      salida_A = salida;
   }
}


ARDUINO

Arduino Original vs Clon

Introducción a Arduino
Arduino IDE
Simulación con Proteus
Fritzing
El Atmega328p
Que es un Bootloader - Arduino como Programador
Placas de desarrollo Arduino
Shields y Modulos
Diseñar un Shield
Lenguaje Wiring
Estructura de un programa o Sketch
Variables y Constantes
Llamado de rutinas o funciones
Demoras
Contadores
Funciones Matemáticas
Condicionales If, Else y SwitchCase
Iteraciones While, Do y For
Entradas y Salidas Digitales
Entradas y Salidas Analógicas
Salidas Digitales (LEDs)
Entradas Digitales (Pulsadores)
Teclado Numérico
Salida Analógica (PWM con Filtro)
Entrada Analógica (Potenciómetro)
Reacondicionar una entrada analógica
Control con salida digital y Transistor
Control con salida PWM y Transistor
Inversión de giro con puente H L293
Control de un motor Paso a Paso
Lectura de Luz con LDR
Lectura de Luz con Fototransistor o Fotodiodo
Medición de Temperatura con PTC o NTC
Medición de Temperatura con LM35
Medición de Temperatura y Humedad con DHT22 o DHT11
Sensor de Distancia con Ultrasonidos SR04
Sensor de Distancia con Infrarrojos GP2Y0A21
Sensor de Movimiento PIR
Sensor de Contacto Célula de Carga
Sensor de Contacto Galga Extensiométrica
Sensor de Sonido con Micrófono Electret
Generación de tonos
Salida a parlante con transistor
Buzzer Piezoelectrico
Tecnología LCD, LED y OLED
Escritura en una pantalla LCD Alfanumérica
Dibujos en pantallas GLCD
Control de un Display de 7 segmentos
Multiplexado de displays de 7 segmentos
Matrices de Punto
Memorias 24C256 por I2C
Memorias SD por SPI
Enlace UART Serie
Convertidores USB/UART
Enlace Bluetooth/UART
Enlace UHF
Interfaz RS232
Interfaz RS485
Comunicacion WiFi
Comunicación Ethernet

VuMetro con LCD

Una forma muy habitual de representar un valor numérico de forma visible, es mediante barras o bien gráficos de barra, ya que por ejemplo si tenemos un amperimetro y donde pasamos de leer de 1A a 9A de forma numérica como en el ejemplo, no vamos a notar un cambio si no estamos prestando atención directamente el numero en cuestión, pero si en cambio tenemos un gráfico de barra donde el fondo de escala es 10A, entonces pasara de "#" a "#########" donde claramente se puede observar el incremento de la barra proporcional al valor medido.
Este método se utiliza tanto en instrumentos de medición de energía como también en termómetros y en el audio con el nombre de VuMetro (Medición de Unidades de Volumen).
En este caso yo lo he realizado para Audio ya que me pareció una opción muy común pero como mencionaba antes, podríamos hacer un termostato donde nos muestra el valor numérico y en barra (aprovechando los dos renglones del LCD) u otro dispositivo.
En este caso al tratarse de un VuMetro de audio, estamos usando los dos renglones del LCD para poner un canal en cada uno y se esta realizando una actualización del valor de la barra cada un poco mas de 20us que es el tiempo que demora en leer los dos canales ADC (mas algo de tiempo de instrucción).
El programa es relativamente sencillo y no requiere de funciones especiales, en este caso he implementado la función MAP que la pueden encontrar en el siguiente LINK, que se encarga de adaptar el valor del ADC al valor necesario, en este caso de 0 a 16, ya que es la cantidad de caracteres que tenemos en el LCD.
Luego Leemos los ADC (uno por cada canal) y pasamos su valor por la función MAP, lo redimencionamos y lo guardamos en Salida1 y Salida2. 
Una vez echo esto borramos el LCD y procedemos al incremento de caracteres (bloque negro 0xFF) que sera nuestro segmento por cada uno de los 16 niveles. 
Para el incremento se utiliza un lazo de iteracion for, donde contamos de 1 a 16 y vamos incrementando el carácter con la función gotoxy(), donde imprimimos el valor 0xFF con la función lcd_putc().
Luego repetimos este for para el otro canal cambiando el renglon y el ciclo se repite indefinidamente.
Notase que el LCD se borra cada vez que el ciclo se repite, esto es porque el audio cambia constantemente, y los lazos for solo incrementan la cantidad.
Si utilizamos esta visualización para un termómetro por ejemplo, que la variación es lenta, podríamos actualizar el valor con una frecuencia menor, sin la necesidad de borrar el lcd cada +20us.



En el mapa de caracteres del LCD podemos ver que el carácter que utilizamos corresponde a la fila xxxx1111 y la columna 1111, quedando armado así como 11111111 que en hexadecimal es 0xFF, pero si quieren usar otro símbolo pueden armar el valor de esta misma forma.


El circuito no tiene mucha magia, es algo súper básico y ustedes pueden cambiar los pines a gusto, pero hay que tener en cuenta que la tensión de entrada del ADC es de 0 a 5V, pueden utilizar un acondicionador de señal con algún amplificador de entrada para tener 5V de fondo de escala, o bien pueden modificar por firmware la tensión de referencia superior +Vref a la tensión máxima de audio, por ejemplo 1V o 200mV, dependerá del sistema de sonido.

El Programa.

#include<16f883.h>
#device adc=8
#use delay(int=4000000)
#include<LCD.C> 
double map(float valor, float entradaMin, 
           float entradaMax, float salidaMin, 
           float salidaMax){
   return ((((valor-entradaMin)*
             (salidaMax-salidaMin))/
             (entradaMax-entradaMin))+salidaMin);
}  
void main(){
   setup_adc_ports(sAN0|sAN1|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_2);
   lcd_init();        
   int8 salida1, salida2, i, j, leeAdc1, leeAdc2;
   while(true){
      set_adc_channel(0);
      delay_us(10);
      leeAdc1 = read_adc();
      salida1 = map(leeADC1, 0, 255, 0, 16);
      set_adc_channel(1);
      delay_us(10);
      leeAdc2 = read_adc();
      salida2 = map(leeADC2, 0, 255, 0, 16);      
      lcd_init();
      for(i=1;i<salida1+1;i++){
         lcd_gotoxy(i,1);
         lcd_putc(0xFF);
      }
      for(j=1;j<salida2+1;j++){
         lcd_gotoxy(j,2);
         lcd_putc(0xFF);
      }      
   }
}


Arduino Original vs Clon

Aunque muchos ya sepan que en el ambiente electrónica existe el componente original de buena calidad y la versión económica de baja calidad, también esta sucediendo en las placas de desarrollo educativas como Arduino, hoy en día están muy de moda estas placas por la facilidad que representan a aquellos que recién se inician en el tema de la programación y un poco de electrónica. Hace unos años me han regalado una placa Arduino MEGA, que he probado varias veces y siempre me ha dado buenos resultados, pero buscando en Internet me he encontrado con precios muy diferentes y esto se debe a que existe la versión Made In Italy y la versión china. (Ojo en china se realizan muchos de los componentes utilizados en la versión original, china maneja varios estándares de calidad, no todo lo chino es económico y de baja calidad, ellos manejan componentes buenos y no tan buenos...).
En este caso voy a comparar mi placa MEGA (no original) con una original, y lo primero que podremos notar en la primera foto, es que posiblemente el proceso de fabricación en la original sea robotizado y en la versión no original sea manual, esto se nota en los componentes SMT que se encuentran desparejo y con soldaduras en algunos casos un poco frías o abultadas.
Lo mismo sucede en la soldadura por ola, que no tiene un control de calidad posterior ya que podremos encontrar gotas de estaño innecesarias que no vemos en la placa original.
También encontramos en la serigrafía, en la palabra MEGA hay una serie de puntos que se encuentran no consecutivos y en la placa original se encuentran con precisión milimétrica.
Podremos ver también la serigrafía de la nomenclatura del microcontrolador Atmega2560 que casi no se lee y posee letras borradas, y en la placa original se puede apreciar una mejora en la calidad de impresión.
Por ultimo entre otras cosas tenemos también un fusible electrónico (Polyswitch) SMT que se encuentra, aparte de torcido, de una calidad visiblemente inferior.


Ahora lo analizaremos desde el lado de abajo. Desde ya, podremos ver que en lugar de decir BOARD dice ROARD, lo cual no tiene nada que ver. También dice MECA en lugar de MEGA, la tipografía es diferente y también faltan las lineas divisorias punteadas que separan las diferentes secciones de la descripción en la serigrafía.
El color de la SolderMask, si bien es azul, mantiene otra tonalidad.


Por ultimo ahora algunas diferencias en cuanto a los conectores Header de la placa MEGA, como podremos ver, la original tiene la serigrafía del pinout del microcontrolador, de esta forma es mas sencillo visualizar en que lugar tendremos que conectar nuestro shield, modulo o cable. 
Por otro lado también la terminación de esos header se puede ver que en la placa clon, parecería que están cortados con un alicate y luego no se han tomado el tiempo de rebajar las rebabas ni tampoco de montarlos de forma centrada, aunque el proceso de fabricación de estos conectores THT requiere un montaje manual para la soldadura por ola, hay métodos para que estos queden ordenados.


Conclusión:
1) ¿Usar una placa no original nos va a traer problemas?
Si y No, ya que a corto plazo no notaremos problemas, pero es posible que con el uso los conectores se deteriores mas rápido que los originales, también que los componentes vitales como los reguladores y demás, que están sometidos a consumos, puedan sobre-calentarse y quemarse.
2) ¿Es compatible con nuestro IDE?
Si, es igual de compatible ya que el microcontrolador y el resto de las interfaces son las mismas, recordemos que es una placa OpenHardware, esto quiere decir que uno mismo puede descargar el diagrama electrónico y desarrollar su propio hardware, por lo que nuestra versión casera tampoco seria original made in Italy, pero podríamos elegir los componentes de mayor calidad.
3) ¿Que pasa si el microcontrolador no es el de buena calidad?
La realidad es que en casos muy sensibles se suele analizar las características eléctricas de un microcontrolador, si bien no manejan un gran consumo y potencia, podríamos tener problemas en cuanto a la inmunidad al ruido y durabilidad de las I/O. Pero no es un dato que nos preocupe.
4) ¿Podemos usar los Shield en una placa Clon?
La respuesta es si, siempre que los conectores Header se encuentren alineados y el encastre sea correcto no tendremos problemas, pero si el regulador de tensión (por ejemplo el de 3V3) no es de buena calidad, corremos el riesgo de que no pueda erogar la corriente necesaria para nuestro modulo (por ejemplo el ESP8266 que tiene un consumo elevado).
5) ¿El fusible electrónico (PolySwitch) podría no dispararse?
La probabilidad es poca, debería funcionar, pero tal vez tenga corridos los valores nominales y podría dispararse por encima del valor requerido y eso podría aumentar considerablemente el consumo del puerto USB de nuestra pc.
6) ¿Si alimento el circuito con fuente externa?
Es el mismo tema que en el punto 4, si los reguladores de tensión, filtrado, etc... no son de buena calidad, podría regular y estabilizar mal la tensión, y una tensión inestable es un microconrolador inestable.

Opinión propia:
En mi opinión propia, tengo esta placa MEGA clon económica en mi poder desde hace un año y funciona bien sin problemas, nunca la he sometido a un sobre consumo ni a ruido eléctrico o temperatura. 
El funcionamiento es correcto y el costo es la mitad de una placa original de Italia.
Por otro lado, si la placa la realizaríamos nosotros mismos, tendría la misma calidad o menor que esta placa clon (siempre que realizarla por nosotros "DIY" sea utilizando métodos convencionales de fabricación, si mandamos a hacer los PCB de forma profesional, podríamos realizar una placa mejor que la placa Clon).