Archivo por meses: diciembre 2016

Termostato con Arduino Uno, DHT11 y LCD

Termostato con Arduino Uno, sensor DHT11 y  pantalla LCD I2C

Un termostato es un dispositivo que, conectado a una fuente de calor, sirve para regular la temperatura de manera automática, impidiendo que suba o baje del grado adecuado

Con el frío necesitamos controlar correctamente la calefacción de nuestra casa, esto se traduce en comodidad y ahorro energético.

Realizar un termostato con ArduinoBlocks es muy sencillo, vamos a ver las diferentes partes que necesitamos:

  • Obtener la temperatura ambiente con un sensor de temperatura DHT11 conectado al pin digital 3:

  • Potenciómetro para permitir que el usuario pueda fijar la temperatura deseada. Mapearemos el valor del potenciómetro de 0 a 30, para un valor menor de 5 desactivaremos el termostato y con valores entre 5 y 30 el termostato estará operativo (así ahorramos poner un botón de encender y apagar). Conectado al pin analógico A0:

 

  • Módulo de relé para activar la fuente calor (caldera, radiador, calefactor, …). Conectado al pin digital 4:

 

  • LCD con conexión I2C (pines A4 y A5) para mostrar la información:

Esquema de conexiones:

Montaje real con módulos:

Programa por bloques:

El programa por bloques se ha dividido en funciones para dividir los diferentes procesos y ver el funcionamiento más claro.

El programa refresca la información cada 1s, el sensor de temperatura puede sufrir oscilaciones momentáneas por fallo en los contactos de la placa de prototipos, mal conexión de los cables, cambios bruscos en la alimentación (al activarse o desactivarse el relé puede afectar a la alimentación y crear picos que afecten a los componentes). Por este motivo el valor de temperatura se hace una media con el valor anterior para suavizar estos cambios bruscos. En una versión mejorada se podría hacer la media de los últimos 5 valores por ejemplo para mayor precisión, pero así se ha probado y se amortigua bastante bien los posibles saltos bruscos del sensor.

Por otro lado se implementa un sistema básico de histéresis para evitar cambios de estado muy rápidos en el relé cuando estamos en un valor de temperatura ambiente muy próximo al de la temperatura seleccionada. A la hora de procesar y decidir el estado del termostato se añade un grado por arriba como límite para desactivar el termostato y se resta un grado por debajo como límite para activar el tersmotato.

Por ejemplo si seleccionamos 22 grados no se apagará la calefacción hasta superar los 23º y no se activará hasta bajar de los 21º  es decir -1º y +1º de margen

Este margen se puede ajustar según la precisión del sensor y la inercia térmica del tipo de calefacción (si el sistema de calefacción es muy rápido el valor de esta variable será más alto, si no más bajo)

Programa completo:

http://arduinoblocks.com/web/project/616

 

Y recuerda, para dominar ArduinoBlocks tienes disponible el libro oficial en Amazon:

Compartir

Multitarea sin bloqueo 2.0

Si algo se puede hacer más fácil… ¿por qué no hacerlo?

En una entrada anterior del blog se explicaba un sencillo sistema para simular un sistema multitarea donde cada tarea se ejecuta en un intervalo de tiempo según su necesidad. El único requisito era no interferir en este sistema de gestión multitarea con bloques del tipo “Esperar” que bloquean el programa Arduino totalmente durante su ejecución o con bucles que se repiten por tiempo indefinido.

Los microprocesadores de un único núcleo como el de Arduino “sólo” saben ejecutar una cosa detrás de otra, son los sistemas operativos los que se encargan de “partir” en trocitos los programas e ir ejecutando un poquito de cada uno para simular la multitarea… pero Arduino no da tanto como para instalarle un sistema operativo por lo que ese trabajo de dividir las tareas la hacemos nosotros.

Entrada anterior del blog respecto a este tema (leer antes si no se ha leído):

Multitarea sin bloqueo

Entender el capítulo anterior es fundamental… pero y si lo podemos simplificar aún más.. ¿por qué no?

Pues con este nuevo bloque de ArduinoBlocks implementamos automáticamente todo el funcionamiento explicado anteriormente.

2016-12-05-18_19_35-arduinoblocks

El código introducido dentro de este bloque se “intentará” ejecutar cada 1000 milisegundos (o los que indiquemos). Y digo “intentará” pues esto dependerá del resto del programa de que no bloquee el funcionamiento y de tiempo a que la tarea se ejecute periódicamente con esta frecuencia.

Si han pasado menos de 1000 ms (o los que se indiquen) desde la última ejecución, el contenido del bloque se ignorará y se continuará con la ejecución pero si no (si han pasado 1000 ms o más, por si alguna otra tarea ha retrasado) se ejecutará y se volverá a empezar a contar el tiempo desde entonces para la próxima ejecución.

Mejor con un ejemplo:

2016-12-05-18_23_26-arduinoblocks

http://arduinoblocks.com/web/project/590

Si añadimos bloques que “bloqueen” el funcionamiento del programa sin dejar avanzar (tipo bloques “Esperar” o un bucle que se quede esperando una condición que no llega) el sistema ya no realizará las tareas en los intervalos correctamente.

Además si alguna tarea tarda más de la cuenta en ejecutarse y pasar a la siguiente retrasará al resto (normalmente las operaciones dentro de las tareas se ejecutan muy rápido y no hay ese problema)

Ejemplo con funciones, dividiendo por prioridad de las tareas:

2016-12-05-18_28_02-arduinoblocks

Tareas críticas:  por ejemplo detectar una pulsación de entrada, leer un sensor, actuar según una condición, leer conexión serie / bluetooth,….

Tareas cada 1s: por ejemplo realizar cálculos con los datos de entrada y otros procesamiento,…

Tareas cada 5s: por ejemplo actualizar una pantalla, enviar información por serie o bluetooth, etc…

 

Y recuerda para dominar ArduinoBlocks ya está disponible el libro oficial en Amazon:

portada_delante_small

Compartir

Nuevos bloques para módulos GPS

Nuevos bloques en ArduinoBlocks para utilizar módulos GPS!

Los módulos GPS serie son fáciles de conseguir, podemos encontrarlos en forma de módulo independiente o como una shield para Arduino. Uno de los chips GPS más utilizado es el NEO-6. Los módulos GPS permiten obtener las coordenadas de nuestra posición actual (latitud y longitud) de una forma muy precisa, además de otros datos como altitud, velocidad, y fecha y hora.

gps_neo-6m

2016-12-04-21_25_30-aliexpress-com_-comprar-shield-gps-para-arduino-uno-r3-elecrow-con-ranura-sd-ant

El módulo sólo tiene 4 conexiones. GND,VCC, RX y TX por lo que la conexión con la placa Arduino es muy sencilla (en el ejemplo usamos los pines 2 y 3 de Arduino):

2016-12-04-21_38_45-gy-neo6mv2-fzz_-fritzing-vista-de-protoboard-placa-de-prototipos

img_20161204_214244

Bloques GPS de ArduinoBlocks:

GPS Iniciar: Este bloque se colocará normalmente dentro del bloque de Inicializaición. Lo único que tenemos que indicarle es los pines donde conectamos las patillas de Rx (recibir) y Tx (transmitir) del módulo GPS.

2016-12-04-21_46_42-arduinoblocks

¿Datos válidos?: Este bloque es muy importante, antes de utilizar cualquier de los datos suministrados por el GPS debemos validar que son datos correctos (si se pierde la señal GPS los datos se invalidan). Este bloque será verdadero cuando los datos del GPS sean correctos y falso cuando no.

2016-12-04-21_48_55-arduinoblocks

2016-12-04-21_51_33-arduinoblocks

Distancia entre: Calcula la distancia (en metros) entre unas coordenadas (latitud/longitud) origen y otras coordenadas (latitud/longitud) destino.

Ejemplo: Distancia entre Barcelona y Madrid

2016-12-04-22_30_18-arduinoblocks

Ejemplo: Distancia entr mi posición actual y Madrid

2016-12-04-22_32_54-arduinoblocks

Campos de datos: posición (latitud / longitud), velocidad (km/h o millas/h), altitud (metros) , rumbo (grados), fecha y hora del GPS (sin ajuste de verano/invierno):

2016-12-04-21_52_22-arduinoblocks

IMPORTANTE: El módulo GPS internamente está continuamente recibiendo y procesando información, cuando utilicemos bloques de GPS no debemos utilizar bloques de tipo "esperar" que bloquean el funcionamiento del programa totalmente, provocando un mal funcionamiento general del programa.

Para más información sobre programar con tareas periódicas sin bloquear el procesamiento consultar esta entrada del blog:

Multitarea sin bloqueo

Eemplo completo de uso de los bloques GPS:

Mostrar la información de posición, velocidad y fecha/hora del GPS por la consola serie:

2016-12-04-23_43_02-arduinoblocks 2016-12-04-23_43_39-arduinoblocks

2016-12-04-23_31_42-arduinoblocks

Código del ejemplo:

http://arduinoblocks.com/web/project/editor/583

Ejemplo con módulo GPS y pantalla LCD:

img_20161204_230554http://arduinoblocks.com/web/project/585

Código del ejemplo:

http://arduinoblocks.com/web/project/584

+Proyectos de ejemplo:

GPS tupperware 1.0 – visualiza datos y muestra la distancia total recorrida

GPS aviso de velocidad – avisa al superar la velocidad límite

 

Y recuerda, para aprenderlo todo sobre ArduinoBlocks no te puede faltar el libro oficial:

portada_delante_smalles_175

 

Compartir

Mapear

El bloque “mapear” es uno de los bloques o funciones más utilizadas en cualquier programa de Arduino.

captura-de-pantalla-de-2016-12-02-08-52-57

Este bloque nos permite adaptar un rango de entrada a otro rango de salida. Internamente realiza una regla proporcional obteniendo el valor proporcional en el rango de salida indicado respecto al valor indicado en el rango de entrada. Se ve más claro con varios ejemplos…

a) Leemos el valor de un potenciómetro conectado a la entrada analógica A0, esto nos dará un valor de 0…1023 (rango de entrada) y queremos convertirlo a un valor entre 0…100 (rango de salida) para usarlo como variable para controlar la velocidad:

captura-de-pantalla-de-2016-12-02-08-56-12

b) Queremos leer la intensidad de luz con una resistencia LDR conectada a la entrada analógica A0 (rango de entrada 0…1023), según el nivel de luz detectado queremos controlar la intensidad de un led conectado a una salida PWM (rango de salida 0…255).

captura-de-pantalla-de-2016-12-02-09-01-16

c) El mismo ejemplo anterior pero funcionando al revés. A nivel 0 de luz ambiente el led brilla al máximo, según va subiendo el nivel de luz el led disminuye su brillo hasta apagarse.

captura-de-pantalla-de-2016-12-02-09-02-42

Todo esto y mucho más en el libro oficial de ArduinoBlocks

portada_delante_small

 

 

Compartir