Documentos de Académico
Documentos de Profesional
Documentos de Cultura
S
Y E
ECCT
P R
ROOY
1
100 P
INN O
O
RDDU
U I
N A
A R
C
COON
ÍNDICE
Cómo usar una pantalla LCD de 16×2 caracteres con Arduino 12
Resumen de hardware 13
Especificaciones LCD 16x2 13
Hoja de datos LCD de 16×2 caracteres 13
Hoja de datos LCD de 20×4 caracteres 13
Hoja de datos de HD44780 13
Componentes de hardware 15
Software 16
Probar la pantalla LCD y ajustar el contraste 16
Cómo conectar la pantalla LCD a Arduino UNO 17
Código de ejemplo de Arduino para LCD de caracteres 18
Cómo funciona el código 19
Otras funciones de la biblioteca LiquidCrystal 20
clear() 20
home() 20
cursor() 21
noCursor() 21
blink() 21
noBlink() 22
display() 22
noDisplay() 22
write() 23
scrollDisplayLeft() 23
scrollDisplayRight() 23
autoscroll() 24
noAutoscroll() 24
leftToRight() 25
rightToLeft() 25
¿Cómo crear y mostrar caracteres personalizados? 25
Código de ejemplo Arduino de caracteres personalizados 26
Cómo funciona el código 29
10 PROYECTOS CON ARDUINO ELECTROGEEK
¿Qué es la humedad relativa? 32
Especificaciones DHT11 32
Hoja de datos DHT11 33
Especificaciones DHT22/AM2302 33
Hoja de datos DHT22 34
Herramientas y materiales 34
Hardware 34
Software 35
Cableado: conexión de DHT11 y DHT22/AM2302 a Arduino Uno 35
Conexiones de 4 pines DHT11 y DHT22 36
Conexiones de 3 pines DHT11 37
Conexiones de 3 pines DHT22/AM2302 38
Instalar las bibliotecas Arduino requeridas 38
DHT-sensor-library-master.zip 39
Adafruit_Sensor-master.zip 39
Código de ejemplo Arduino DHT11/DHT22 40
Salida de monitor en serie 42
Explicación del código 42
Código de ejemplo para DHT11 y DHT22/AM2302 con LCD 45
Cómo usar una pantalla LCD de 16×2 con Arduino 45
Conexiones LCD I2C 46
LiquidCrystal_I2C-master.zip 47
Guía de solución de problemas DHT11/DHT22 49
"No se pudo leer desde el sensor DHT!" 49
Error fatal: Adafruit_Sensor.h: No existe tal archivo o directorio 49
3
10 PROYECTOS CON ARDUINO ELECTROGEEK
4
10 PROYECTOS CON ARDUINO ELECTROGEEK
5
10 PROYECTOS CON ARDUINO ELECTROGEEK
6
10 PROYECTOS CON ARDUINO ELECTROGEEK
7
10 PROYECTOS CON ARDUINO ELECTROGEEK
toFahrenheit () 181
setHighAlarmTemp () y setLowAlarmTemp () 181
bool hasAlarm() 181
Muestre las lecturas de temperatura DS18B20 en una pantalla LCD I2C 181
DS18B20 con LCD I2C de 16x2 caracteres y Arduino 182
Conexiones LCD I2C 182
Instalación de la biblioteca Arduino LiquidCrystal_I2C 183
DS18B20 con código de ejemplo de LCD I2C 183
8
10 PROYECTOS CON ARDUINO ELECTROGEEK
Este tutorial incluye todo lo que necesita saber sobre el control de un LCD de
caracteres con Arduino. He incluido un diagrama de cableado y muchos
códigos de ejemplo. Estas pantallas son excelentes para mostrar datos o texto
del sensor y también son bastante baratas.
La primera parte de este artículo cubre los conceptos básicos de visualización
de texto y números. En la segunda mitad, entraré en más detalles sobre cómo
mostrar caracteres personalizados y cómo puede usar las otras funciones de la
biblioteca LiquidCrystal Arduino.
Como verá, necesita muchas conexiones para controlar estas pantallas. Por lo
tanto, me gusta usarlos con un módulo de interfaz I2C montado en la parte
posterior.
10
10 PROYECTOS CON ARDUINO ELECTROGEEK
Con este módulo I2C, solo necesita dos conexiones para controlar la
pantalla LCD. Consulte el tutorial a continuación si también desea usar un
módulo I2C:
Resumen de hardware
Estas pantallas LCD están disponibles en muchos tamaños diferentes (16x2
1602, 20×4 2004, 16×1, etc.), pero todas utilizan el mismo chip de controlador
LCD de interfaz paralela HD44780 de Hitachi. Esto significa que puede
intercambiarlos fácilmente. Solo necesitará cambiar las especificaciones de
tamaño en su código Arduino.
Tensión de funcionamiento 5 V
Para obtener más información, puede consultar las hojas de datos a
continuación. Las hojas de datos de 16×2 y 20×4 incluyen las dimensiones de
la pantalla LCD y en la hoja de datos HD44780 puede encontrar más
información sobre el controlador LCD de Hitachi.
11
10 PROYECTOS CON ARDUINO ELECTROGEEK
🔗 Hoja de datos LCD de 16×2 caracteres
🔗 Hoja de datos LCD de 20×4 caracteres
🔗 Hoja de datos de HD44780
Pinout LCD 16×2
La pantalla LCD tiene 16 pines de conexión, numerados del 1 al 16 de
izquierda a derecha.
El pinout de un LCD HD44780 estándar se da en la tabla a continuación:
Pin no. Símbolo Conexión Función
12
10 PROYECTOS CON ARDUINO ELECTROGEEK
Protoboard x 1 Electrogeek
13
10 PROYECTOS CON ARDUINO ELECTROGEEK
Software
IDE Arduino
Probar la pantalla LCD y ajustar el contraste
Para probar la pantalla, deberá realizar las conexiones como se muestra en la
figura a continuación.
La mayoría de los LCD tienen una resistencia en serie incorporada para la
retroiluminación LED. Debería encontrarlo en la parte posterior de la pantalla
LCD conectada al pin 15 (Ánodo). Si su pantalla no incluye una resistencia,
necesitará agregar una entre 5 V y el pin 15. Debería ser seguro usar una
resistencia de 220Ω, pero este valor puede hacer que su pantalla sea un poco
tenue. Puede consultar la hoja de datos para conocer la clasificación de
corriente máxima de la luz de fondo y utilizarla para seleccionar un valor de
resistencia apropiado.
14
10 PROYECTOS CON ARDUINO ELECTROGEEK
Después de haber conectado la pantalla LCD, deberá ajustar el contraste de la
pantalla. Esto se hace girando el potenciómetro de 10 kΩ en sentido horario o
antihorario.
Conecte el conector USB del Arduino para alimentar la pantalla LCD. Debería
ver la luz de fondo iluminada. Ahora gire el potenciómetro hasta que aparezca
una (16×2 LCD) o 2 filas (20×4 LCD) de rectángulos.
15
10 PROYECTOS CON ARDUINO ELECTROGEEK
LCD 16×2 con diagrama de cableado Arduino UNO
Utilizaremos la pantalla LCD en modo de 4 bits, esto significa que no necesita
conectar nada a D0-D3. El pin R/W está conectado a tierra, esto tirará el pin
LOW y configura la pantalla LCD en modo WRITE.
Una vez que haya conectado todo, podemos comenzar a programar la pantalla
LCD.
Código de ejemplo de Arduino para LCD de
caracteres
Para controlar la pantalla LCD utilizaremos la biblioteca LiquidCrystal . Esta
biblioteca debe venir preinstalada con el IDE de Arduino . Puede encontrarlo
yendo a sketch> Incluir biblioteca> LiquidCrystal .
La biblioteca LiquidCrystal viene con muchas funciones integradas y hace que
el control de los LCD de caracteres sea muy fácil.
El siguiente código de ejemplo muestra cómo mostrar un mensaje en la
pantalla LCD. A continuación, le mostraré cómo funciona el código y cómo
puede usar las otras funciones de la biblioteca LiquidCrystal.
// Include the library:
#include <LiquidCrystal.h>
void setup() {
16
10 PROYECTOS CON ARDUINO ELECTROGEEK
// Specify the LCD's number of columns and rows. Change to (20, 4) for a
20x4 LCD:
lcd.begin(16, 2);
}
void loop() {
// Set the cursor on the third column and the first row, counting starts
at 0:
lcd.setCursor(2, 0);
// Print the string 'Hello World!':
lcd.print("Hello World!");
// Set the cursor on the third column and the second row:
lcd.setCursor(2, 1);
// Print the string 'LCD tutorial':
lcd.print("LCD tutorial");
Debería ver la siguiente salida en la pantalla LCD:
Cómo funciona el código
Después de incluir la biblioteca, el siguiente paso es crear una nueva instancia
de la clase LiquidCrystal. El se hace con la función LiquidCrystal(rs,
enable, d4, d5, d6, d7). Como parámetros utilizamos los pines Arduino
a los que conectamos la pantalla. Tenga en cuenta que hemos llamado a la
pantalla 'lcd'. Puede darle un nombre diferente si lo desea como
'menu_display'. Deberá cambiar 'lcd' al nuevo nombre en el resto del sketch.
// Include the library:
17
10 PROYECTOS CON ARDUINO ELECTROGEEK
#include <LiquidCrystal.h>
En la setup()pantalla LCD se inicia con la función begin(cols,rows).
Cuando utilice una pantalla LCD de 20×4, cambie esta línea a lcd.begin (20,4);
void setup() {
// Specify the LCD's number of columns and rows. Change to (20, 4) for a
20x4 LCD:
lcd.begin(16, 2);
}
En el loop()cursor se establece en la tercera columna y la primera fila de la
pantalla LCD con lcd.setCursor(2,0).
Tenga en cuenta que el recuento comienza en 0 y el primer argumento
especifica la columna. Si no especifica la posición del cursor, el texto se
imprimirá en la posición inicial predeterminada (0,0) si la pantalla está vacía o
detrás del último carácter impreso.
A continuación, la cadena '¡Hola mundo!' está impreso con
lcd.print("Hello World!"). Tenga en cuenta que debe colocar comillas
("") alrededor del texto. Cuando desee imprimir números o variables, no se
necesitan comillas.
void loop() {
// Set the cursor on the third column and the first row, counting starts
at 0:
lcd.setCursor(2, 0);
// Print the string 'Hello World!':
lcd.print("Hello World!");
// Set the cursor on the third column and the second row:
lcd.setCursor(2, 1);
// Print the string 'LCD tutorial':
lcd.print("LCD tutorial");
}
18
10 PROYECTOS CON ARDUINO ELECTROGEEK
Otras funciones de la biblioteca
LiquidCrystal
La biblioteca LiquidCrystal Arduino tiene muchas otras funciones integradas
que pueden resultar útiles. Puede encontrar una descripción general de ellos a
continuación con una explicación y algunos fragmentos de código.
clear()
Borra la pantalla LCD y coloca el cursor en la esquina superior izquierda
( primera fila y primera columna) de la pantalla. Puede usar esta función para
mostrar diferentes palabras en un bucle.
#include <LiquidCrystal.h>
void setup() {
lcd.begin(16, 2);
}
void loop() {
lcd.clear();
lcd.print("Monday");
delay(2000);
lcd.clear();
lcd.print("13:45");
delay(2000);
}
home()
Posiciona el cursor en la esquina superior izquierda de la pantalla LCD. Use
clear() si también desea borrar la pantalla.
19
10 PROYECTOS CON ARDUINO ELECTROGEEK
cursor()
Muestra el cursor LCD: un guión bajo (línea) en la posición del siguiente
carácter a imprimir.
noCursor()
Oculta el cursor LCD. El siguiente ejemplo crea un cursor parpadeante al final
de "cursor()".
#include <LiquidCrystal.h>
void setup() {
lcd.begin(16, 2);
lcd.print("cursor()");
}
void loop() {
lcd.cursor();
delay(500);
lcd.noCursor();
delay(500);
}
blink()
Crea un cursor LCD de estilo de bloque parpadeante: un rectángulo
parpadeante en la posición del siguiente carácter a imprimir.
noBlink()
Deshabilita el cursor LCD de estilo bloque. El siguiente ejemplo muestra el
cursor parpadeante durante 5 segundos y luego lo desactiva durante 2
segundos.
#include <LiquidCrystal.h>
20
10 PROYECTOS CON ARDUINO ELECTROGEEK
void setup() {
lcd.begin(16, 2);
lcd.print("blink() example");
}
void loop() {
lcd.blink();
delay(5000);
lcd.noBlink();
delay(2000);
}
display()
Esta función enciende la pantalla LCD y muestra cualquier texto o cursores que
se hayan impreso en la pantalla.
noDisplay()
Esta función apaga cualquier texto o cursores impresos en la pantalla LCD. El
texto/datos no se borran de la memoria LCD. Esto significa que se volverá a
mostrar cuando se llame a la función display().
El siguiente ejemplo crea un efecto de texto parpadeante.
#include <LiquidCrystal.h>
void setup() {
lcd.begin(16, 2);
lcd.print("Blinking text");
}
void loop() {
lcd.display();
delay(2000);
lcd.noDisplay();
21
10 PROYECTOS CON ARDUINO ELECTROGEEK
delay(2000);
}
write()
Esta función se puede usar para escribir un carácter en la pantalla LCD.
Consulte la sección sobre creación y visualización de caracteres personalizados
a continuación para obtener más información.
scrollDisplayLeft()
Desplaza el contenido de la pantalla (texto y cursor) un espacio a la izquierda.
Puede usar esta función en la sección de bucle del código en combinación con
delay (500), para crear una animación de texto desplazable.
#include <LiquidCrystal.h>
void setup() {
lcd.begin(16, 2);
lcd.print("scrollDisplayLeft() example");
}
void loop() {
lcd.scrollDisplayLeft();
delay(500);
}
scrollDisplayRight()
Desplaza el contenido de la pantalla (texto y cursor) un espacio a la derecha.
autoscroll()
Esta función activa el desplazamiento automático de la pantalla LCD. Esto hace
que cada salida de caracteres a la pantalla empuje los caracteres anteriores en
un espacio. Si la dirección del texto actual es de izquierda a derecha (el valor
22
10 PROYECTOS CON ARDUINO ELECTROGEEK
predeterminado), la pantalla se desplaza hacia la izquierda; Si la dirección
actual es de derecha a izquierda, la pantalla se desplaza hacia la derecha. Esto
tiene el efecto de enviar cada nuevo personaje a la misma ubicación en la
pantalla LCD.
El siguiente sketch de ejemplo permite el desplazamiento automático e
imprime el carácter 0 a 9 en la posición (16,0) de la pantalla LCD. Cambie esto
a (20,0) para una pantalla LCD de 20×4.
#include <LiquidCrystal.h>
void setup() {
lcd.begin(16, 2);
}
void loop() {
lcd.autoscroll();
lcd.setCursor(16, 0);
for (intx= 0;x< 10; x++) {
lcd.print(x);
delay(500);
}
lcd.clear();
}
noAutoscroll()
Desactiva el desplazamiento automático de la pantalla LCD.
leftToRight()
Esta función hace que el texto fluya hacia la derecha desde el cursor, como si la
pantalla estuviera justificada a la izquierda ( por defecto).
rightToLeft()
Esta función hace que el texto fluya hacia la izquierda desde el cursor, como si
la pantalla estuviera justificada a la derecha.
23
10 PROYECTOS CON ARDUINO ELECTROGEEK
¿Cómo crear y mostrar caracteres
personalizados?
Con la función createChar(), es posible crear y mostrar caracteres
personalizados en la pantalla LCD. Esto es especialmente útil si desea mostrar
un carácter que no es parte del conjunto de caracteres ASCII estándar.
Información técnica: Los LCD que se basan en el controlador LCD Hitachi
HD44780 tienen dos tipos de memorias: CGROM y CGRAM (Generador de
caracteres ROM y RAM). CGROM genera todos los patrones de caracteres de
5x8 puntos a partir de los códigos de caracteres estándar de 8 bits. CGRAM
puede generar patrones de caracteres definidos por el usuario.
Para pantallas de 5x8 puntos, CGRAM puede escribir hasta 8 caracteres
personalizados y para pantallas de 5x10 puntos 4 .
Código de ejemplo Arduino de caracteres
personalizados
El siguiente boceto de ejemplo crea y muestra ocho caracteres personalizados
( numerados del 0 al 7).
#include <LiquidCrystal.h>
24
10 PROYECTOS CON ARDUINO ELECTROGEEK
B01110,
B01110,
B01110,
B11111,
B00000,
B00100,
B00000
};
byte Alien[] = {
B11111,
B10101,
B11111,
B11111,
B01110,
B01010,
B11011,
B00000
};
byte Check[] = {
B00000,
B00001,
B00011,
B10110,
B11100,
B01000,
B00000,
B00000
};
byte Speaker[] = {
B00001,
B00011,
B01111,
B01111,
B01111,
B00011,
B00001,
B00000
};
byte Sound[] = {
B00001,
B00011,
B00101,
B01001,
25
10 PROYECTOS CON ARDUINO ELECTROGEEK
B01001,
B01011,
B11011,
B11000
};
byte Skull[] = {
B00000,
B01110,
B10101,
B11011,
B01110,
B01110,
B00000,
B00000
};
byte Lock[] = {
B01110,
B10001,
B10001,
B11111,
B11011,
B11011,
B11111,
B00000
};
void setup() {
// Specify the LCD's number of columns and rows:
lcd.begin(16, 2);
26
10 PROYECTOS CON ARDUINO ELECTROGEEK
void loop() {
// Print all the custom characters:
lcd.setCursor(0, 1);
lcd.write(byte(0));
lcd.setCursor(2, 1);
lcd.write(byte(1));
lcd.setCursor(4, 1);
lcd.write(byte(2));
lcd.setCursor(6, 1);
lcd.write(byte(3));
lcd.setCursor(8, 1);
lcd.write(byte(4));
lcd.setCursor(10, 1);
lcd.write(byte(5));
lcd.setCursor(12, 1);
lcd.write(byte(6));
lcd.setCursor(14, 1);
lcd.write(byte(7));
}
Debería ver la siguiente salida en la pantalla LCD:
27
10 PROYECTOS CON ARDUINO ELECTROGEEK
Cómo funciona el código
Después de incluir la biblioteca y crear el objeto LCD, se definen las matrices
de caracteres personalizados. Cada matriz consta de 8 bytes, 1 byte para cada
fila. En este ejemplo, se crean 8 caracteres personalizados.
// Make custom characters:
byte Heart[] = {
B00000,
B01010,
B11111,
B11111,
B01110,
B00100,
B00000,
B00000
};
Al mirar de cerca la matriz, verá lo siguiente. Cada fila consta de 5 números
correspondientes a los 5 píxeles en un carácter de 5x8 puntos. Un 0 significa
píxel desactivado y un 1 significa píxel activado.
Es posible editar cada fila a mano, pero recomiendo usar esta herramienta
visual en GitHub. Esta aplicación crea automáticamente la matriz de caracteres
y puede hacer clic en los píxeles para activarlos o desactivarlos.
En el setup(), los caracteres personalizados se crean con
lcd.createChar(num, data).
El primer argumento en esta función es el número del carácter personalizado
(0-7) y el segundo argumento es la matriz de caracteres que creamos.
// Create a new characters:
lcd.createChar(0, Heart);
lcd.createChar(1, Bell);
lcd.createChar(2, Alien);
lcd.createChar(3, Check);
lcd.createChar(4, Speaker);
lcd.createChar(5, Sound);
lcd.createChar(6, Skull);
lcd.createChar(7, Lock);
28
10 PROYECTOS CON ARDUINO ELECTROGEEK
En el loop()se muestran todos los caracteres con lcd.write(). Como
parámetro usamos el número del personaje que reservamos.
lcd.setCursor(0, 1);
lcd.write(byte(0));
29
10 PROYECTOS CON ARDUINO ELECTROGEEK
30
10 PROYECTOS CON ARDUINO ELECTROGEEK
¿Cómo funcionan los sensores de
temperatura y humedad DHT11 y
DHT22/AM2302?
Si abre un sensor DHT11 o DHT22/AM2302, verá que contiene dos elementos
sensores: un elemento sensor de humedad y un NTC (termistor).
El elemento sensor de humedad consta de dos electrodos con un sustrato de
retención de humedad en el medio. El sensor mide la resistencia entre los
electrodos, que cambia según la cantidad de humedad en el aire.
En la parte posterior del sensor, encontrará un pequeño IC que mide y procesa
la señal analógica. También almacena los coeficientes de calibración y realiza la
conversión de analógico a digital.
¿Qué es la humedad relativa?
Cuando mira la hoja de datos de los sensores DHTxx, verá que miden la
humedad relativa (HR) del aire y no la humedad absoluta. ¿Pero cuál es la
diferencia? La humedad absoluta es la cantidad de vapor de agua en el aire
(expresada en g/m³), independientemente de la temperatura. La humedad
relativa tiene en cuenta la temperatura.
La humedad relativa es la relación entre la cantidad real de vapor de agua
presente en el aire y la cantidad máxima de vapor de agua que el aire puede
contener a una temperatura dada.
El aire caliente puede contener más agua que el aire frío. Esto significa que
para la misma cantidad de vapor de agua en el aire, la humedad relativa en el
aire frío será mayor que en el aire caliente. Con una humedad relativa del 100
por ciento, el aire está saturado y está en su punto de rocío.
Especificaciones DHT11
31
10 PROYECTOS CON ARDUINO ELECTROGEEK
🔗 Hoja de datos DHT11
Especificaciones DHT22/AM2302
Tensión de funcionamiento 3.3 - 5.5 V
32
10 PROYECTOS CON ARDUINO ELECTROGEEK
Puede descargar la hoja de datos para el DHT22/AM2302 a continuación:
🔗
Hoja de datos DHT22
Como puede ver, las especificaciones del DHT11 y el DHT22/AM2302 son
bastante similares. La principal diferencia es que el DHT22 es más preciso y
tiene un rango de medición mayor.
El DHT11 es un poco más pequeño que el DHT22 y también es menos
costoso.
Lo bueno de estos sensores es que son intercambiables, lo que significa que
puede reemplazar el DHT11 con un DHT22 o viceversa, el cableado es
exactamente el mismo. Solo tendrá que hacer un pequeño cambio en la
configuración del código, como verá más adelante.
Herramientas y materiales
Para seguir este tutorial necesitará los siguientes componentes:
Hardware
4 pines DHT11 x 1 Electrogeek
Protoboard x 1 Electrogeek
33
10 PROYECTOS CON ARDUINO ELECTROGEEK
Software
IDE Arduino
Cableado: conexión de DHT11 y
DHT22/AM2302 a Arduino Uno
Los diagramas/esquemas de cableado a continuación le muestran cómo
conectar sensores de temperatura y humedad de 3 o 4 pines del Arduino Uno.
Se necesita una resistencia pull-up de 10 kΩ entre la línea de señal y 5 V para
asegurarse de que el nivel de señal se mantenga alto de forma
predeterminada.
34
10 PROYECTOS CON ARDUINO ELECTROGEEK
Pin 1 5 V
Pin 3 No conectado
Pin 4 GND
También puede comprar los sensores montados en una pequeña PCB
(sensores de 3 pines). Estos PCB facilitan el montaje del sensor y también
incluyen una resistencia pull-up. Asegúrese de revisar la etiqueta del sensor, el
orden de los pines puede ser diferente según el fabricante .
35
10 PROYECTOS CON ARDUINO ELECTROGEEK
S Pin digital 2
+ 5 V
- GND
Los ejemplos de código a continuación utilizan el pin digital 2 para recibir los
datos del sensor, pero, por supuesto, puede cambiarlo a cualquier pin digital
que desee.
36
10 PROYECTOS CON ARDUINO ELECTROGEEK
Cableado del sensor de temperatura y humedad DHT22/AM2302 de 3 pines para Arduino Uno
Conexiones de 3 pines DHT22/AM2302
3 pines DHT22 Arduino
VCC 5 V
GND GND
Instalar las bibliotecas Arduino requeridas
El siguiente código utiliza la biblioteca de sensores DHT Adafruit que puede
descargar aquí en GitHub . Esta biblioteca solo funciona si también tiene
instalada la biblioteca Adafruit Unified Sensor, que también está disponible en
GitHub .
También puede descargar las dos bibliotecas haciendo clic en los botones a
continuación:
37
10 PROYECTOS CON ARDUINO ELECTROGEEK
🔗 DHT-sensor-library-master.zip
🔗 Adafruit_Sensor-master.zip
Puede instalar la biblioteca yendo a Sketch> Incluir biblioteca> Agregar
biblioteca .ZIP en el IDE de Arduino.
Otra opción es navegar a Herramientas> Administrar bibliotecas ... o escribir
Ctrl + Shift + I en Windows. El Administrador de bibliotecas abrirá y actualizará
la lista de bibliotecas instaladas.
Puede buscar 'dht' y 'DHT sensor library' y buscar la biblioteca de Adafruit.
Seleccione la última versión y luego haga clic en Instalar.
38
10 PROYECTOS CON ARDUINO ELECTROGEEK
Código de ejemplo Arduino DHT11/DHT22
Puede cargar el siguiente código de ejemplo en su Arduino utilizando el IDE de
Arduino . A continuación, explicaré cómo funciona el código.
// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Setup sensor:
dht.begin();
}
void loop() {
// Wait a few seconds between measurements:
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very
slow sensor)
// Read the humidity in %:
float h = dht.readHumidity();
// Read the temperature as Celsius:
float t = dht.readTemperature();
// Read the temperature as Fahrenheit:
float f = dht.readTemperature(true);
39
10 PROYECTOS CON ARDUINO ELECTROGEEK
// Check if any reads failed and exit early (to try again):
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (default):
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");
}
Debería ver la siguiente salida en el monitor serie (Ctrl + Shift + M):
40
10 PROYECTOS CON ARDUINO ELECTROGEEK
A continuación, debemos definir el pin de conexión DHT a Arduino y también
configurar el tipo de sensor DHT. En nuestro ejemplo, estamos utilizando un
sensor DHT11 conectado al pin 2.
La declaración #define se usa para dar un nombre a un valor constante. El
compilador reemplazará cualquier referencia a esta constante con el valor
definido cuando se compila el programa. Entonces, en todas partes que
mencione DHTPIN, el compilador lo reemplazará con el valor 2 cuando se
compile el programa.
// Set DHT pin:
#define DHTPIN 2
41
10 PROYECTOS CON ARDUINO ELECTROGEEK
A continuación, debe crear una nueva instancia de la clase DHT con el tipo y la
conexión DHT adecuados. Para esto usamos la función DHT( pin,type).
En este caso, llamé al sensor "dht", pero también puede usar otros nombres,
como "sensor_temperatura" o "dht11", etc. DHT sensor_temperatura =
DHT(DHTPIN, DHTTYPE);. Puede crear varias instancias de la clase DHT con
diferentes nombres y pines/tipos. Esto le permite usar fácilmente 2 o más
sensores al mismo tiempo.
// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);
En el setup(), comenzamos la comunicación en serie a una velocidad en
baudios de 9600. ¡Asegúrese de que el Monitor en serie también esté
configurado en 9600! También inicializamos el sensor con dht.begin ().
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Setup sensor:
dht.begin();
}
La sección loop() del código comienza con un retraso de 2 segundos. Este
retraso está ahí para darle al sensor algo de tiempo para hacer las lecturas. La
tasa de detección máxima del DHT22 es cada 2 segundos y la del DHT11 es
una vez cada segundo.
// Wait a few seconds between measurements:
delay(2000);
Tomar lecturas de temperatura y humedad es muy fácil porque la biblioteca
tiene varias funciones integradas. Para obtener una lectura de humedad en ‘%’,
puede usar la función readHumidity(). En este caso, estamos guardando la
lectura como la variable "h". Tenga en cuenta que es del tipo float.
42
10 PROYECTOS CON ARDUINO ELECTROGEEK
Cuando desee utilizar una función en el objeto DHT, primero debe especificar
el nombre que le dio al sensor. Entonces, en nuestro caso, esto es "dht".
// Read the humidity in %:
float h = dht.readHumidity();
Tomar lecturas de temperatura es igual de fácil con la función
readTemperature().
// Read the temperature as Celsius:
float t = dht.readTemperature();
Si desea obtener la temperatura en Fahrenheit en lugar de Celsius, tiene dos
opciones. Puede pasar fiel a la función readTemperature, o puede usar la
función de conversión:
// Read the temperature as Fahrenheit:
float f = dht.readTemperature(true);
// Alternative, use convert function:
float f = dht.convertCtoF(t);
A continuación, hay una pequeña sección de código que comprueba si el
sensor está conectado correctamente y está devolviendo una lectura. De lo
contrario, se imprimirá un mensaje de error en el monitor serie.
// Check if any reads failed and exit early (to try again):
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
La biblioteca también tiene una función incorporada que puede calcular el
índice de calor combinando las lecturas de temperatura y humedad. El “Heat
Index” también se conoce como "Sensación Térmica" o "temperatura
aparente".
// Compute heat index in Fahrenheit (default):
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
43
10 PROYECTOS CON ARDUINO ELECTROGEEK
Finalmente, las lecturas se muestran en el monitor serie. Tenga en cuenta que
la línea Serial.print ("\ xC2 \ xB0"); se usa para imprimir el símbolo de grado.
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");
Código de ejemplo para DHT11 y
DHT22/AM2302 con LCD
Al combinar un sensor de temperatura y humedad con una pequeña pantalla
LCD, se puede crear una estación meteorológica barata.
En el siguiente ejemplo, usaré una pantalla LCD de caracteres I2C como esta
de Electrogeek . Puede leer más sobre el uso de una pantalla LCD I2C con
Arduino en el siguiente artículo:
🔗Cómo usar una pantalla LCD de 16×2 con Arduino
Deberá realizar algunas conexiones adicionales al Arduino para que podamos
controlar la pantalla LCD de 16x2 caracteres. El sensor DHT11 o
DHT22/AM2302 está conectado de la misma manera que antes.
El siguiente diagrama de cableado le muestra cómo conectar un LCD I2C al
Arduino.
44
10 PROYECTOS CON ARDUINO ELECTROGEEK
Sensor de temperatura y humedad DHT11 con LCD de caracteres I2C de 16×2 y diagrama de
cableado Arduino
Las conexiones también se dan en la siguiente tabla:
Conexiones LCD I2C
LCD I2C Arduino
GND GND
VCC 5 V
SDA A4
SCL A5
Si no está utilizando un Arduino Uno, los pines SDA y SCL pueden estar en
una ubicación diferente. Un Arduino UNO con el diseño R3 (1.0 pinout),
también tiene los encabezados de pin SDA (línea de datos) y SCL (línea de
reloj) cerca del pin AREF. Consulte la tabla a continuación para obtener más
detalles.
45
10 PROYECTOS CON ARDUINO ELECTROGEEK
Placa SDA SCL
Arduino Micro 2 3
Arduino Leonardo 2 3
46
10 PROYECTOS CON ARDUINO ELECTROGEEK
// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered):
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); //Change to
(0x27,20,4) for 2004 LCD
void setup() {
// Setup sensor:
dht.begin();
void loop() {
// Wait a few seconds between measurements:
delay(2000);
47
10 PROYECTOS CON ARDUINO ELECTROGEEK
lcd.print(t);
lcd.print(" " "\xDF" "C");
lcd.setCursor(0, 1);
lcd.print("Humid: ");
lcd.print(h);
lcd.print(" %");
}
Guía de solución de problemas DHT11/DHT22
Al trabajar con estos sensores, puede recibir los siguientes mensajes de error:
"No se pudo leer desde el sensor DHT!"
Este mensaje puede aparecer en el monitor en serie cuando el sensor no
devuelve una lectura. Esto puede tener varias causas:
● Tipo de sensor: asegúrese de haber descomentado el DHTTYPE
correcto en la configuración del código. Mira el ejemplo de arriba.
● Frecuencia de muestreo: los sensores DHT son bastante lentos, la
frecuencia de muestreo máxima es de alrededor de 2 segundos.
Aumentar el retraso entre las mediciones podría resolver este error.
● Alimentación: aunque los sensores DHTxx pueden funcionar entre 3,3 y
5 V, el fabricante recomienda 5 V. En algunos casos, alimentar el sensor
con 5 V resuelve el problema. Asegúrese de que su microcontrolador
también admita 5 V en los pines GPIO.
Error fatal: Adafruit_Sensor.h: No existe tal archivo
o directorio
Es posible que reciba este error cuando intente compilar el código. Esto
significa que no instaló (correctamente) la biblioteca Adafruit Unified Sensor .
48
10 PROYECTOS CON ARDUINO ELECTROGEEK
En este tutorial, aprenderá cómo funciona el sensor de movimiento PIR
HC-SR501 y cómo puede usarlo con Arduino. Puede encontrar sensores de
infrarrojos pasivos (PIR) a su alrededor, no solo se utilizan con fines de
seguridad, sino también en la mayoría de los sistemas de iluminación activados
automáticamente.
En este artículo, he incluido un diagrama de cableado y códigos de ejemplo
para que pueda comenzar a experimentar con su sensor. Después de cada
ejemplo, desgloso y explico cómo funciona el código, por lo que no debería
tener problemas para modificarlo según sus necesidades.
Primero, le mostraré cómo puede usar el HC-SR501 como una unidad
independiente. A continuación, lo conectaremos a un Arduino UNO y le
mostraré cómo usarlo como un sistema de alarma simple.
49
10 PROYECTOS CON ARDUINO ELECTROGEEK
Este tutorial se centra en el sensor HC-SR501, pero también puede usar el
código proporcionado para sensores similares como el HC-SR505 o AM312 .
La principal diferencia es que estos sensores más baratos tienen un rango de
detección más pequeño y no tienen un potenciómetro para ajustar la
sensibilidad y el retraso de tiempo.
Herramientas y materiales
Para seguir este tutorial necesitará los siguientes componentes:
Hardware
Sensor de movimiento PIR HC-SR501 × 1
Protoboard × 1
Surtido de resistencias × 1
LEDs × 1
Zumbador pasivo × 1
Software
IDE Arduino
¿Cómo funciona un sensor de movimiento
PIR?
Los sensores de movimiento PIR constan de dos partes principales: un
elemento sensor piroeléctrico y una lente Fresnel . El elemento sensor
50
10 PROYECTOS CON ARDUINO ELECTROGEEK
piroeléctrico puede detectar radiación infrarroja. Todos los objetos con una
temperatura superior al cero absoluto (0 Kelvin/-273.15 ° C) emiten energía
térmica en forma de radiación infrarroja, incluidos los cuerpos humanos.
Un sensor piroeléctrico tiene dos ranuras rectangulares hechas de un material
que permite que pase la radiación infrarroja. Detrás de estos, hay dos
electrodos sensores infrarrojos separados, uno responsable de producir una
salida positiva y el otro negativo. La razón de esto es que estamos buscando
un cambio en los niveles de IR y no en los niveles de IR ambientales. Los dos
electrodos están conectados para que se cancelen mutuamente. Si una mitad
ve más o menos radiación IR que la otra, la salida oscila alto o bajo.
El IC de procesamiento de señal incorporado procesa esta señal y gira el pin de
salida del sensor HIGH o LOW en consecuencia.
51
10 PROYECTOS CON ARDUINO ELECTROGEEK
La cúpula blanca frente al elemento sensor es una lente Fresnel. Esta lente
enfoca la radiación infrarroja en el sensor.
Sensor de movimiento PIR HC-SR501
El sensor de movimiento PIR HC-SR501 está construido alrededor del IC del
detector de movimiento PIR Micro Power BISS0001. Este IC está
específicamente desarrollado para procesar la señal de los sensores de
movimiento PIR.
Si retira la lente Fresnel, verá el elemento sensor piroeléctrico RE200B. En la
PCB también se puede encontrar un regulador de voltaje incorporado. Esto
significa que puede alimentar la placa con un amplio rango de voltaje de CC,
generalmente se utilizan 5V.
Las especificaciones del HC-SR501 se dan en la tabla a continuación, tenga en
cuenta que puede haber pequeñas diferencias entre los fabricantes.
Especificaciones de HC-SR501
Tensión de funcionamiento 4,5 - 20 V
52
10 PROYECTOS CON ARDUINO ELECTROGEEK
Para obtener más información, puede consultar las hojas de datos a
continuación:
🔗
Hoja de datos de HC-SR501
🔗 BISS0001 Hoja de datos
🔗 Hoja de datos RE200B
Ajuste del HC-SR501
En la parte posterior de la placa encontrará dos potenciómetros y un puente,
que puede usar para ajustar varios parámetros:
53
10 PROYECTOS CON ARDUINO ELECTROGEEK
Ajuste de sensibilidad (rango)
El HC-SR501 tiene una distancia de detección máxima ( rango de detección) de
7 metros. Puede ajustar la distancia de detección girando el potenciómetro de
sensibilidad CW o CCW (vea la imagen de arriba). Girar el potenciómetro en
sentido horario aumenta la distancia de detección hasta un máximo de 7
metros. Girarlo en sentido antihorario disminuye la distancia de detección a un
mínimo de 3 metros.
Ajuste de retardo de tiempo (Tx)
Este potenciómetro se puede utilizar para ajustar el tiempo que la salida
permanece ALTA para después de detectar el movimiento. Como mínimo, el
retraso es de 3 segundos y, como máximo, es de 300 segundos o 5 minutos.
Gire el potenciómetro en sentido horario para aumentar el retraso y en sentido
antihorario para disminuirlo.
Puente de selección de disparador
El puente (amarillo) se puede utilizar para seleccionar uno de los dos modos de
activación. Se puede configurar en L (disparador único) o H (disparador
repetido):
● Disparador único : la salida se pondrá ALTA tan pronto como se detecte
movimiento. Se mantendrá ALTO durante el tiempo establecido por el
potenciómetro. Cualquier movimiento durante este período no se
procesa y no reinicia el temporizador.
● Disparador repetido : cada vez que se detecta movimiento, el
temporizador de retardo se reinicia.
La diferencia entre el modo de disparo simple y repetido se muestra en la
figura a continuación.
54
10 PROYECTOS CON ARDUINO ELECTROGEEK
Diferencia entre modo disparador simple y repetido. Las flechas indican el
tiempo de retraso establecido.
Agregar un termistor y/o LDR al HC-SR501
Como se puede ver en la imagen a continuación, el HC-SR501 tiene
almohadillas de soldadura para dos componentes adicionales. Estas
almohadillas suelen etiquetarse como 'RL' y 'RT'.
● RL : aquí puede agregar una resistencia dependiente de la luz (LDR) o un
fotorresistor que tiene una baja resistencia bajo luz ambiental intensa.
Esto hace que el detector esté operativo sólo cuando el área de
detección es lo suficientemente oscura.
55
10 PROYECTOS CON ARDUINO ELECTROGEEK
● RT : este pad está diseñada para un termistor . Agregar esto hace que la
sensibilidad del sensor sea menos dependiente de la temperatura
ambiente
Desafortunadamente, no se proporciona información adicional en las hojas de
datos, por lo que no estoy completamente seguro de qué valores de
componentes debe usar.
Uso del sensor de movimiento PIR HC-SR501
como unidad independiente
Para la mayoría de las aplicaciones, puede usar el HC-SR501 como una unidad
independiente. Puede usar la señal de salida para activar cosas como relés y
LED.
El cableado es muy simple como se puede ver en la imagen a continuación.
Simplemente conecte VCC y GND a una batería y un LED rojo entre el pin de
salida y tierra. El voltaje de salida es de 3.3 V, así que agregué una resistencia
limitadora de corriente de 68 Ω en serie con el LED.
Sensor de movimiento PIR HC-SR501 con diagrama de cableado LED
Tenga en cuenta que después de encender el sensor, debe esperar 30 a 60
segundos para que el sensor se inicialice. Durante este período, el LED podría
parpadear un par de veces. Después de esperar un minuto, puede mover su
mano frente al sensor y debería poder ver el LED iluminado.
56
10 PROYECTOS CON ARDUINO ELECTROGEEK
Con esta configuración, es fácil probar la funcionalidad del sensor. Este
también es un buen momento para jugar con los ajustes de sensibilidad y
retardo de tiempo, así como con los dos modos de disparo diferentes.
Cableado: conexión del sensor de
movimiento PIR HC-SR501 a Arduino UNO
Al conectar el sensor de movimiento a un microcontrolador como el Arduino
UNO, puede usarlo para controlar todo tipo de cosas: LED, relés, motores,
zumbadores, etc.
En el diagrama de cableado a continuación, puede ver cómo conectarlo al
Arduino. Puede leer el sensor con uno de los pines de entrada/salida de uso
general (GPIO) del Arduino. En este ejemplo, lo conecté al pin digital 2. Los
pines VCC y GND están conectados a 5V y GND respectivamente.
Sensor de movimiento PIR HC-SR501 con diagrama de cableado Arduino
Las conexiones también se dan en la tabla a continuación:
57
10 PROYECTOS CON ARDUINO ELECTROGEEK
Conexiones del sensor de movimiento PIR
HC-SR501
Sensor de movimiento PIR HC-SR501 Arduino
VCC 5 V
OUT Pin 2
GND GND
Una vez que haya conectado el sensor, el siguiente paso es cargar un código
de ejemplo.
Sensor de movimiento PIR HC-SR501 con
código de ejemplo Arduino UNO
Con el siguiente código de ejemplo, puede leer el sensor y controlar el LED
incorporado del Arduino (conectado al pin 13). Este código también se puede
usar para controlar relés simples para encender o apagar una luz más grande.
Puede cargar el código de ejemplo con el IDE de Arduino .
Para que este código funcione correctamente, es mejor configurar el puente del
modo de disparo en 'H' ( modo de disparo repetido). Ajuste también el
potenciómetro de retardo de tiempo al valor más bajo. Gíralo en sentido
antihorario hasta el tope.
El código leerá el estado del sensor (ALTO o BAJO) y encenderá o apagará el
LED incorporado en consecuencia. También imprimirá un mensaje en el
Monitor de serie, al que puede acceder en Herramientas o escriba (Ctrl + Shift
+ M).
// Define connection pins:
#define pirPin 2
#define ledPin 13
// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.
58
10 PROYECTOS CON ARDUINO ELECTROGEEK
void setup() {
// Configure the pins as input or output:
pinMode(ledPin, OUTPUT);
pinMode(pirPin, INPUT);
void loop() {
// Read out the pirPin and store as val:
val = digitalRead(pirPin);
Debería ver la siguiente salida en el monitor serie:
59
10 PROYECTOS CON ARDUINO ELECTROGEEK
// Create variables:
int val = 0;
bool motionState = false; // We start with no motion detected.
60
10 PROYECTOS CON ARDUINO ELECTROGEEK
En el setup(), configuramos los pines como entrada o salida con la función
pinMode( pin,mode). El pirPin es una entrada y el ledPin es una salida. También
comenzamos la comunicación en serie a una velocidad en baudios de 9600.
Asegúrese de que el Monitor en serie también esté configurado en 9600.
void setup() {
// Configure the pins as input or output:
pinMode(ledPin, OUTPUT);
pinMode(pirPin, INPUT);
61
10 PROYECTOS CON ARDUINO ELECTROGEEK
Si ya no hay movimiento delante del sensor, val cambiará a BAJO y el LED se
apagará y aparecerá el mensaje "¡Movimiento finalizado!" se imprime en el
monitor en serie.
Cree un sistema de alarma con sensor de
movimiento PIR y zumbador
Con algunos cambios simples, puede crear un sistema de alarma con el
HC-SR501 y un zumbador piezoeléctrico . Conecté el zumbador con una
resistencia de 100 Ω entre el pin digital 5 y GND. Probablemente pueda usar el
timbre sin una resistencia (esto lo hace más fuerte), pero no sonará tan bien.
// Crear variables:
62
10 PROYECTOS CON ARDUINO ELECTROGEEK
int val = 0;
bool motionState = false; // Comenzamos sin movimiento
detectado.
void setup() {
// Configure los pines como entrada o salida:
pinMode(buzzerPin, OUTPUT);
pinMode(ledPin, OUTPUT);
pinMode(pirPin, INPUT);
void loop() {
// Read out the pirPin and store as val:
val = digitalRead(pirPin);
63
10 PROYECTOS CON ARDUINO ELECTROGEEK
El HC-SR04 es un sensor de distancia económico y fácil de usar, con un rango
de 2 a 400 cm. Se usa comúnmente en obstáculos para evitar robots y
proyectos de automatización. ¿Y sabía que su automóvil usa sensores similares
en el sistema de asistencia de estacionamiento?
En este tutorial aprenderá cómo funciona el sensor y cómo usarlo con Arduino.
He incluido 5 ejemplos con un diagrama de cableado y un código para que
pueda comenzar a experimentar con su sensor. Primero veremos un ejemplo
que no usa una biblioteca Arduino. A continuación, le mostraré cómo puede
usar la biblioteca NewPing para crear código más compacto.
65
10 PROYECTOS CON ARDUINO ELECTROGEEK
¿Cómo funciona un sensor de distancia
ultrasónico?
Los sensores ultrasónicos funcionan emitiendo ondas de sonido con una
frecuencia que es demasiado alta para que un humano la escuche. Estas ondas
sonoras viajan por el aire con la velocidad del sonido, aproximadamente 343
m/s. Si hay un objeto delante del sensor, las ondas de sonido se reflejan y el
receptor del sensor ultrasónico las detecta. Al medir cuánto tiempo pasó entre
el envío y la recepción de las ondas de sonido, se puede calcular la distancia
entre el sensor y el objeto.
66
10 PROYECTOS CON ARDUINO ELECTROGEEK
Distancia (cm) = Velocidad del sonido (cm/µs)xTiempo ( µs)/2
Y así, para el ejemplo, esto se convierte en:
Distancia (cm) = 0.0343 (cm/µs)x2000 ( µs)/2 = 34.3 cm
Dependencia de la temperatura de la
velocidad de la velocidad del sonido.
La velocidad del sonido en realidad depende en gran medida de la temperatura
y, en un grado mucho menor, de la humedad del aire. Wikipedia afirma que la
velocidad del sonido aumenta con aproximadamente 0.6 m/s por grado Celsius.
Para la mayoría de los casos a 20 ° C, puede usar 343 m/s, pero si desea
obtener lecturas más precisas, puede calcular la velocidad del sonido con la
siguiente fórmula:
V ( m/s) = 331.3 + (0.606xT)
V = Velocidad del sonido ( m/s)
T = Temperatura del aire (° C)
Esta fórmula no incluye la humedad ya que su efecto sobre la velocidad del
sonido es muy pequeño.
Cómo funciona el HC-SR04
En la parte frontal del sensor HC-SR04 puede encontrar dos cilindros
plateados (transductores ultrasónicos), uno es el transmisor de las ondas de
sonido y el otro es el receptor. Para permitir que el sensor genere una
explosión sónica, debe configurar el pin Trig en alto durante al menos 10 µs. El
sensor crea una ráfaga de ultrasonido de 8 ciclos a 40 kHz.
Esta explosión sónica viaja a la velocidad del sonido, rebota y es recibida por el
receptor del sensor. El pin Echo luego emite el tiempo que las ondas de sonido
viajaron en microsegundos.
67
10 PROYECTOS CON ARDUINO ELECTROGEEK
Puede usar la pulseIn()función en el código Arduino para leer la longitud del
pulso desde el pin Echo. Después de eso, puede usar la fórmula mencionada
anteriormente para calcular la distancia entre el sensor y el objeto.
Especificaciones de HC-SR04
Tensión de funcionamiento 5 V
Frecuencia 40 kHz
Resolución 3 mm
68
10 PROYECTOS CON ARDUINO ELECTROGEEK
Para obtener más información, puede consultar la hoja de datos aquí.
🔗
Hoja de datos de HC-SR04
Componentes de hardware
Sensor HC-SR04 x 1 Electrogeek
Protoboard x 1 Electrogeek
Software
IDE Arduino
69
10 PROYECTOS CON ARDUINO ELECTROGEEK
Cableado - Conexión de HC-SR04 a Arduino
UNO
El siguiente diagrama de cableado le muestra cómo conectar el sensor
HC-SR04 al Arduino.
VCC 5 V
Trigger Pin 2
Echo Pin 3
GND GND
70
10 PROYECTOS CON ARDUINO ELECTROGEEK
Código de ejemplo para HC-SR04 con
Arduino
Ahora que ha conectado el sensor, es hora de conectar el Arduino a la
computadora y cargar un código. Puede cargar el siguiente código de ejemplo
en su Arduino utilizando el IDE de Arduino . A continuación, te explicaré cómo
funciona el código.
// Define Trig and Echo pin:
#define trigPin 2
#define echoPin 3
// Define variables:
long duration;
int distance;
void setup() {
// Define inputs and outputs:
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
void loop() {
// Clear the trigPin by setting it LOW:
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
71
10 PROYECTOS CON ARDUINO ELECTROGEEK
delay(50);
}
Cómo funciona el código
Primero, se definen el pin de activación y el pin de eco. Los llamo trigPin y
EchoPin. El pin de disparo está conectado al pin digital 2 y el pin de eco al pin
digital 3 en el Arduino.
La declaración #define se usa para dar un nombre a un valor constante. El
compilador reemplazará cualquier referencia a esta constante con el valor
definido cuando se compila el programa. Entonces, en todas partes que
mencione trigPin, el compilador lo reemplazará con el valor 2 cuando se
compile el programa.
// Define Trig and Echo pin:
#define trigPin 2
#define echoPin 3
Luego definí dos variables: duration y distance. La duración almacena el
tiempo entre el envío y la recepción de las ondas sonoras. La variable de
distancia se usa para almacenar la distancia calculada.
// Define variables:
long duration;
int distance;
72
10 PROYECTOS CON ARDUINO ELECTROGEEK
En el setup(), comienza configurando el trigPin como salida y el echoPin
como entrada. A continuación, inicializa la comunicación en serie a una
velocidad en baudios de 9600. Más adelante, mostrará la distancia medida en
el monitor en serie, al que se puede acceder con Ctrl + Shift + M o
Herramientas> Monitor en serie. Asegúrese de que la velocidad en baudios
también esté establecida en 9600 en el monitor en serie.
void setup() {
// Define inputs and outputs:
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
A continuación, debe leer la longitud del pulso enviado por echoPin. Yo uso la
función pulseIn()para esto. Esta función espera a que el pin pase de BAJO a
ALTO, comienza a cronometrar, luego espera a que el pin pase a BAJO y
detiene el cronometraje.
73
10 PROYECTOS CON ARDUINO ELECTROGEEK
Después de eso, calcula la distancia utilizando la fórmula mencionada en la
introducción de este tutorial.
// Read the echoPin, pulseIn() returns the duration (length of
the pulse) in microseconds:
duration = pulseIn(echoPin, HIGH);
// Calculate the distance:
distance= duration*0.034/2;
Finalmente, imprima la distancia calculada en el monitor en serie.
// Print the distance on the Serial Monitor (Ctrl+Shift+M):
Serial.print("Distance = ");
Serial.print(distance);
Serial.println(" cm");
delay(50);
}
Código de ejemplo HC-SR04 con biblioteca
Arduino y NewPing
La biblioteca NewPing escrita por Tim Eckel se puede usar con muchos
sensores de distancia ultrasónicos. La última versión de esta biblioteca se
puede descargar aquí en bitbucket.org. Puede notar que el código a
continuación, que usa la biblioteca NewPing, es mucho más corto que el
código que usamos antes. Además de eso, la biblioteca NewPing incluye
algunas otras características agradables. Le permite establecer una distancia
máxima para leer, no se retrasa por un segundo completo cuando no se reciba
eco y tenga un filtro de mediana incorporado.
🔗 NewPing_v1.9.1.zip
74
10 PROYECTOS CON ARDUINO ELECTROGEEK
incluido un código de ejemplo modificado a continuación que se puede usar
con la misma configuración de cableado que antes.
// Include the library:
#include <NewPing.h>
void setup() {
Serial.begin(9600); // Open serial monitor at 9600 baud to
see ping results.
}
void loop() {
delay(50); // Wait 50ms between pings (about 20 pings/sec).
29ms should be the shortest delay between pings.
duration = sonar.ping();
distance = (duration/2) * 0.0343;
Serial.print("Distance = ");
Serial.print(distance); // Distance will be 0 when out of set
max range.
Serial.println(" cm");
}
75
10 PROYECTOS CON ARDUINO ELECTROGEEK
También puede usar distance = sonar.ping_cm() o distance =
sonar.ping_in()que devuelve la distancia medida en centímetros o
pulgadas enteras. Con esta función no se necesita tomar una medición de
duración y calcular la distancia.
Sensores ultrasónicos de interfaz en modo
de 3 pines
La biblioteca NewPing también facilita la interfaz con sensores ultrasónicos
mientras se usa solo 1 pin de E/S. Esto puede ser útil si tiene muy pocos pines
de E/S disponibles o si desea usar un sensor ultrasónico de 3 pines como el
Parallax Ping .
Para crear una configuración de 3 pines (GND, 5V y SIG), debe conectar tanto
el pin de activación como el pin de eco al mismo pin digital en el Arduino. En el
código, lo único que tiene que cambiar es la línea 6-7 y definir el mismo pin
tanto para el trigPin como para el echoPin. Por ejemplo pin digital 2.
//Define Trig and Echo pin
#define trigPin 2
#define echoPin 2
Cómo usar el filtro digital ping_median ()
Lo principal que me gusta de la biblioteca NewPing es que tiene un filtro de
mediana incorporado. Este filtro puede mejorar en gran medida la precisión de
sus lecturas HC-SR04. La ping_median() función toma muchas mediciones
de duración seguidas, descarta las lecturas fuera de rango y luego promedia
las restantes. Por defecto, tomará 5 lecturas, pero puede especificar cuántas
debería tomar. Reemplace la línea 19 con las siguientes líneas.
int iterations = 5;
duration = sonar.ping_median(iterations);
76
10 PROYECTOS CON ARDUINO ELECTROGEEK
Código de ejemplo HC-SR04 con I2C LCD y
Arduino
Para mostrar la distancia medida en una pantalla LCD I2C 2004 o 1602 , todo
lo que tiene que hacer es realizar las siguientes conexiones y cargar el código a
continuación. El sensor HC-SR04 está conectado de la misma manera que
antes.
GND GND
VCC 5 V
SDA A4
SCL A5
Si no está utilizando un Arduino Uno, los pines SDA y SCL pueden estar en
una ubicación diferente. Un Arduino UNO con el diseño R3 (1.0 pinout),
también tiene los encabezados de pin SDA (línea de datos) y SCL (línea de
reloj) cerca del pin AREF. Consulte la tabla a continuación para obtener más
detalles.
77
10 PROYECTOS CON ARDUINO ELECTROGEEK
Placa SDA SCL
Arduino Micro 2 3
Arduino Leonardo 2 3
// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered):
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27,20,4); //Change to
(0x27,16,2) for 1602 LCD
78
10 PROYECTOS CON ARDUINO ELECTROGEEK
// Define variables:
long duration;
int distance;
void setup() {
// Define inputs and outputs:
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
void loop() {
// Clear the trigPin by setting it LOW:
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
// Read the echoPin. This returns the duration (length of the pulse) in
microseconds:
duration = pulseIn(echoPin, HIGH);
delay(50);
}
79
10 PROYECTOS CON ARDUINO ELECTROGEEK
Tenga en cuenta que utilicé una pantalla LCD de 20x4. Si tiene una pantalla
LCD de diferente tamaño (16x2 también es común), debe cambiar la línea 20 a
LiquidCrystal_I2C lcd(0x27,16,2);. Si su LCD no tiene la dirección I2C
predeterminada, 0x27, consulte el tutorial completo de I2C donde le explico
cómo puede averiguar cuál es la dirección.
Código de ejemplo HC-SR04 con sensor de
temperatura DHT11 y Arduino
Como se mencionó anteriormente, la velocidad del sonido depende en gran
medida de la temperatura del aire. Si desea medir largas distancias (3-4 m),
puede ser una buena idea agregar un sensor de temperatura y humedad
DHT11 o DHT22 a su configuración. Esto le permitirá calibrar la velocidad del
sonido en tiempo real y así aumentar la precisión de sus mediciones.
Agregar un sensor DHT11 es realmente simple. El siguiente diagrama de
cableado le muestra las conexiones que necesita hacer. Tenga en cuenta que
estoy usando un DHT11 con placa de conexión , por lo que solo necesito
conectar 3 pines. Asegúrese de revisar la etiqueta del sensor, el orden de los
pines puede ser diferente según el fabricante. El sensor HC-SR04 está
conectado de la misma manera que antes.
80
10 PROYECTOS CON ARDUINO ELECTROGEEK
Conexiones DHT11
DHT11 Arduino
VCC (+) 5 V
🔗 Adafruit_Sensor-master.zip
// Include Adafruit sensor library:
#include <Adafruit_Sensor.h>
//https://github.com/adafruit/Adafruit_Sensor
// Include Adafruit DHT library:
#include <DHT.h> //https://github.com/adafruit/DHT-sensor-library
// Define variables:
long duration;
int distance;
float speedofsound;
81
10 PROYECTOS CON ARDUINO ELECTROGEEK
void setup() {
// Define inputs and outputs:
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
dht.begin();
void loop() {
// Clear the trigPin by setting it LOW:
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
// Read the echoPin. This returns the duration (length of the pulse) in
microseconds:
duration = pulseIn(echoPin, HIGH);
82
10 PROYECTOS CON ARDUINO ELECTROGEEK
Serial.println("cm");
delay(100);
}
Código de ejemplo HC-SR04 con DHT11 y LCD
I2C
// Connect to LCD via i2c, default address 0x27 (A0-A2 not jumpered):
83
10 PROYECTOS CON ARDUINO ELECTROGEEK
// Define variables:
long duration;
int distance;
float speedofsound;
void setup() {
// Define inputs and outputs:
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
dht.begin();
void loop() {
// Clear the trigPin by setting it LOW:
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
// Read the echoPin. This returns the duration (length of the pulse) in
microseconds:
duration = pulseIn(echoPin, HIGH);
84
10 PROYECTOS CON ARDUINO ELECTROGEEK
HC-SR04 Dimensiones
A continuación puede encontrar las dimensiones del sensor ultrasónico
HC-SR04.
85
10 PROYECTOS CON ARDUINO ELECTROGEEK
En este tutorial, aprenderá cómo controlar las pantallas TM1637 de 4 dígitos y
7 segmentos con Arduino. Estas pantallas son fantásticas para mostrar los
datos del sensor, la temperatura, el tiempo, etc.
He incluido 3 ejemplos en este tutorial. En el primer ejemplo, veremos las
funciones básicas de la biblioteca TM1637Display. En el segundo ejemplo, le
mostraré cómo puede mostrar la hora en una pantalla de 4 dígitos. El último
ejemplo se puede utilizar para crear una pantalla de temperatura simple en
combinación con el DHT11.
Diagramas de cableado también están incluidos. Después del ejemplo,
desgloso y explico cómo funciona el código, por lo que no debería tener
problemas para modificarlo según sus necesidades.
86
10 PROYECTOS CON ARDUINO ELECTROGEEK
Componentes de hardware
TM1637 Pantalla de 7 segmentos de 4
× 1 Electrogeek
dígitos
Protoboard × 1 Electrogeek
Software
IDE Arduino
Información sobre la pantalla.
Las pantallas de 4 dígitos y 7 segmentos generalmente requieren 12 pines de
conexión. Eso es bastante y no deja mucho espacio para otros sensores o
módulos. Gracias al IC TM1637 montado en la parte posterior del módulo de
pantalla, este número se puede reducir a sólo cuatro. Se requieren dos pines
para las conexiones de alimentación y los otros dos pines se utilizan para
controlar los segmentos.
Las pantallas de 7 segmentos contienen 7 (u 8) LED direccionables
individualmente. Los segmentos están etiquetados de A a G y algunas
pantallas también tienen un punto (el octavo LED). Use esta imagen como
referencia cuando configure los segmentos individuales en el código más
adelante.
87
10 PROYECTOS CON ARDUINO ELECTROGEEK
Puede comprar muchos módulos de pantalla diferentes que usan un IC
TM1637. El color, el tamaño, los puntos y los puntos de conexión pueden ser
diferentes. No tengo experiencia con todas las diferentes versiones de esta
pantalla, pero siempre que utilicen el TM1637, los ejemplos de código que se
proporcionan a continuación deberían funcionar.
Aquí puede encontrar las especificaciones básicas del módulo de pantalla que
utilicé en este tutorial.
Especificaciones de la pantalla TM1637 de 4
dígitos y 7 segmentos
Tensión de funcionamiento 3.3 - 5 V
Niveles de luminancia 8
88
10 PROYECTOS CON ARDUINO ELECTROGEEK
🔗 TM1637 Hoja de datos
Cableado: conexión de la pantalla TM1637 de
4 dígitos y 7 segmentos a Arduino UNO
Conectar la pantalla a un Arduino u otro microcontrolador es súper fácil. Solo
necesita conectar 4 cables: 2 para la alimentación y 2 para transferir los datos.
El siguiente diagrama de cableado le muestra cómo puede conectar la pantalla
al Arduino.
VCC 5 V
GND GND
89
10 PROYECTOS CON ARDUINO ELECTROGEEK
🔗 TM1637-master.zip
// You can set the individual segments per digit to spell words or create
other symbols:
const uint8_t done[] = {
SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // d
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // O
SEG_C | SEG_E | SEG_G, // n
SEG_A | SEG_D | SEG_E | SEG_F | SEG_G // E
};
void setup() {
// Clear the display:
display.clear();
delay(1000);
}
91
10 PROYECTOS CON ARDUINO ELECTROGEEK
void loop() {
// Set the brightness:
display.setBrightness(7);
// All segments on:
display.setSegments(data);
delay(1000);
display.clear();
delay(1000);
// Show counter:
int i;
for (i = 0; i < 101; i++) {
display.showNumberDec(i);
delay(50);
}
delay(1000);
display.clear();
delay(1000);
delay(1000);
display.clear();
delay(1000);
92
10 PROYECTOS CON ARDUINO ELECTROGEEK
delay(1000);
display.clear();
delay(1000);
delay(1000);
display.clear();
delay(1000);
delay(1000);
display.clear();
delay(1000);
display.setSegments(done);
while(1);
}
Cómo funciona el código:
El código comienza con la inclusión de la biblioteca. Asegúrese de tener
instalada la biblioteca correcta; de lo contrario, recibirá un mensaje de error al
compilar el código.
// Incluye la biblioteca:
#include <TM1637Display.h>
El siguiente paso es especificar los pines de conexión. La declaración #define
se usa para dar un nombre a un valor constante. El compilador reemplazará
cualquier referencia a esta constante con el valor definido cuando se compila el
programa. Entonces, en todas partes que mencione CLK, el compilador lo
reemplazará con el valor 2 cuando se compile el programa.
93
10 PROYECTOS CON ARDUINO ELECTROGEEK
A continuación, creamos un objeto de visualización del tipo TM1637Display
con los pines CLK y DIO definidos. Tenga en cuenta que llamé a la pantalla
'pantalla', pero también puede usar otros nombres como 'temperatura_display'.
El nombre que le dé a la pantalla se usará más adelante para escribir datos en
esa pantalla en particular. Puede crear y controlar múltiples objetos de
visualización con diferentes nombres y pines de conexión. Actualmente no hay
límite en la biblioteca.
// Crear objeto de visualización de tipo TM1637Display:
TM1637Display display = TM1637Display ( CLK, DIO ) ;
Hay varias formas de controlar los segmentos individuales de la pantalla.
Antes de la sección de configuración del código, especifiqué varias matrices
para configurar los segmentos de visualización individuales. Usaremos la
función setSegments()más tarde para escribirlos en la pantalla.
La primera opción es escribir números hexadecimales en la pantalla para cada
dígito. El 0xff hexadecimal se traduce a 11111111 en binario, esto activa todos
los segmentos (incluido el punto si su pantalla tiene uno). 0xef, por ejemplo, se
traduce en 11101111. Esto activaría todos los segmentos, excepto el
segmento E. Tenga en cuenta que el conteo va de derecha a izquierda, por lo
que 11111111 corresponde a segmentos ( punto) GFEDCBA. Puede encontrar
un gráfico de conversión de hexadecimal a binario aquí .
// Create array that turns all segments on:
const uint8_t data[] = {0xff, 0xff, 0xff, 0xff};
94
10 PROYECTOS CON ARDUINO ELECTROGEEK
La biblioteca tiene una función incorporada que facilita un poco la
configuración de segmentos individuales. Vea el fragmento de código a
continuación. Puede crear matrices para deletrear palabras. Cada segmento
está separado por un | y los dígitos de la pantalla están separados por una
coma.
// You can set the individual segments per digit to spell words or create
other symbols:
const uint8_t done[] = {
SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // d
SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // O
SEG_C | SEG_E | SEG_G, // n
SEG_A | SEG_D | SEG_E | SEG_F | SEG_G // E
};
Puede dejar la sección de configuración del código vacía si lo desea. Acabo de
usar la función clear() para asegurarse de que la pantalla se borró.
void setup() {
// Clear the display:
display.clear();
delay(1000);
}
En la sección de bucle del código, muestro varios ejemplos de las diferentes
funciones de la biblioteca:
95
10 PROYECTOS CON ARDUINO ELECTROGEEK
// Create degree Celsius symbol:
const uint8_t celsius[] = {
SEG_A | SEG_B | SEG_F | SEG_G, // Circle
SEG_A | SEG_D | SEG_E | SEG_F // C
};
display.setSegments(celsius, 2, 2);
El segundo y tercer argumento también pueden omitirse.
showNumberDec (number, Leading_zeros,
length, position)
Esta es probablemente la función que usará más. El primer argumento es un
número que desea mostrar en la pantalla. El resto de los argumentos son
opcionales.
El segundo argumento se puede usar para activar o desactivar los ceros
iniciales. 10 sin ceros a la izquierda se imprimirán como __10 y con ceros a la
izquierda como 0010. Puede activarlos estableciendo este argumento como
verdadero o desactivarlos estableciéndose como falso. NOTA: el cero inicial no
es compatible con números negativos.
El tercer y cuarto argumento son los mismos que en la función anterior.
// Print the number 12 without leading zeros on the second and
third digit:
display.showNumberDec(12, false, 2, 1);
showNumberDecEx(number, dots,
leading_zeros, length, position)
Esta función le permite controlar los puntos de la pantalla. Solo el segundo
argumento es diferente de la función showNumberDec. Le permite establecer
los puntos entre los dígitos individuales.
Puede usar los siguientes valores.
96
10 PROYECTOS CON ARDUINO ELECTROGEEK
Para pantallas con puntos entre cada dígito:
● 0b10000000 - 0.000
● 0b01000000 - 00.00
● 0b00100000 - 000.0
● 0b11100000 - 0.0.0.0
Para pantallas con solo dos puntos:
● 0b01000000 - 00:00
Para pantallas con puntos y dos puntos, dos puntos:
● 0b11100000 - 0.0: 0.0
Entonces, si desea mostrar un reloj con dos puntos en el centro (vea el ejemplo
del reloj a continuación), usaría algo como:
// Imprime 1234 con los dos puntos centrales:
monitor.showNumberDecEx ( 1234 , 0b11100000 , falso , 4 , 0 ) ;
setBrightness (brillo, verdadero/falso)
Esta función establece el brillo de la pantalla (como su nombre indica). Puede
especificar un nivel de brillo de 0 (brillo más bajo) a 7 (brillo más alto). El
segundo parámetro se puede usar para encender o apagar la pantalla, falso
significa apagado.
// Establecer el brillo de la pantalla (0-7):
monitor. setBrightness ( 7 ) ;
Ejemplo de reloj: pantalla TM1637 de 4
dígitos y 7 segmentos con DS3231 RTC
Uno de los usos típicos de una pantalla de 4 dígitos y 7 segmentos es mostrar
la hora. Al combinar el TM1637 con un módulo de reloj en tiempo real (RTC),
puede crear fácilmente un reloj de 24 horas.
97
10 PROYECTOS CON ARDUINO ELECTROGEEK
En este ejemplo, utilicé este módulo RTC DS3231 de uso común .
Este módulo se comunica con el Arduino a través de I2C, por lo que solo
necesita dos conexiones para leer la hora.
El siguiente diagrama de cableado le muestra cómo puede conectar el DS3231
RTC al Arduino. Tenga en cuenta que la pantalla TM1637 está conectada de la
misma manera que antes.
VCC 5 V
GND GND
SDA A4
SCL A5
98
10 PROYECTOS CON ARDUINO ELECTROGEEK
El siguiente ejemplo de código se puede usar para mostrar la hora en un
formato de 24 horas. Si su pantalla tiene dos puntos centrales, entonces este
código hará que parpadee. También puede deshabilitar esto eliminando las
últimas líneas de código.
La primera vez que cargue el código, el RTC se configurará a la hora en que se
compiló el sketch.
Puede instalar una batería de botón en la parte posterior del módulo, de modo
que el tiempo se almacene en caso de que pierda energía.
El código usa la biblioteca Adafruit RTC, que puede descargar aquí en GitHub .
También puede instalarlo a través del Administrador de biblioteca en el IDE de
Arduino buscando 'RTClib', o haga clic en el botón de descarga a continuación:
🔗 RTClib-master.zip
Código de ejemplo
// Include the libraries:
#include "RTClib.h"
#include <TM1637Display.h>
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Wait for console opening:
delay(3000);
99
10 PROYECTOS CON ARDUINO ELECTROGEEK
}
// Check if the RTC lost power and if so, set the time:
if (rtc.lostPower()) {
Serial.println("RTC lost power, lets set the time!");
// The following line sets the RTC to the date & time this sketch was
compiled:
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to
set
// January 21, 2014 at 3am you would call:
//rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
void loop() {
// Get current date and time:
DateTime now = rtc.now();
// Display the current time in 24 hour format with leading zeros enabled
and a center colon:
display.showNumberDecEx(displaytime, 0b11100000, true);
delay(1000);
}
100
10 PROYECTOS CON ARDUINO ELECTROGEEK
Ejemplo de termómetro: pantalla TM1637 de
4 dígitos y 7 segmentos con sensor de
temperatura y humedad DHT11
Las pantallas de 4 dígitos y 7 segmentos son excelentes para mostrar lecturas
de sensores como temperatura, humedad, voltaje o velocidad. En el siguiente
ejemplo, le mostraré cómo puede mostrar las lecturas de temperatura en la
pantalla TM1637.
Utilizaremos el popular sensor de temperatura y humedad DHT11 .
El siguiente diagrama de cableado le muestra cómo puede conectar el sensor
DHT11 en combinación con la pantalla TM1637 al Arduino.
Tenga en cuenta que la pantalla TM1637 está conectada de la misma manera
que antes.
101
10 PROYECTOS CON ARDUINO ELECTROGEEK
Conexiones DHT11
DHT11 Arduino
+ 5 V
- GND
s Pin digital 4
Tenga en cuenta que el orden de los pines puede ser diferente, según el
fabricante.
Si desea utilizar un sensor de 4 pines, consulte el tutorial para los sensores de
temperatura y humedad DHT11 y DHT22.
🔗 Cómo usar los sensores DHT11 y DHT22 con Arduino
El siguiente código de ejemplo se puede usar para mostrar las lecturas de
temperatura en la pantalla. Alterna entre la temperatura en Celius y Fahrenheit,
ambas se muestran durante 2 segundos.
La función setSegments()se utiliza para mostrar los símbolos Celsius y
Fahrenheit.
El código utiliza la biblioteca de sensores DHT Adafruit que puede descargar
aquí en GitHub . Esta biblioteca solo funciona si también tiene instalada la
biblioteca Adafruit Unified Sensor , que también está disponible en GitHub .
También puede descargar las dos bibliotecas haciendo clic en los botones a
continuación:
🔗 DHT-sensor-library-master.zip
🔗 Adafruit_Sensor-master.zip
Para obtener más información, consulte mi tutorial DHT11 con Arduino.
102
10 PROYECTOS CON ARDUINO ELECTROGEEK
Código de ejemplo
// Include the libraries:
#include <TM1637Display.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
// Create variable:
int temperature_celsius;
int temperature_fahrenheit;
void setup() {
// Set the display brightness (0-7):
display.setBrightness(0);
// Clear the display:
103
10 PROYECTOS CON ARDUINO ELECTROGEEK
display.clear();
// Setup sensor:
dht.begin();
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Wait for console opening:
delay(2000);
}
void loop() {
// Read the temperature as Celsius and Fahrenheit:
temperature_celsius = dht.readTemperature();
temperature_fahrenheit = dht.readTemperature(true);
// Print the temperature to the Serial Monitor:
Serial.println(temperature_celsius);
Serial.println(temperature_fahrenheit);
delay(2000);
delay(2000);
}
104
10 PROYECTOS CON ARDUINO ELECTROGEEK
Cómo controlar
servomotores con
Arduino
En este tutorial, aprenderá cómo funcionan los servomotores y cómo
controlarlos con Arduino. ¡He incluido diagramas de cableado y varios códigos
de ejemplo! Los servomotores se utilizan a menudo en proyectos de robótica
pero también los puedes encontrar en coches RC, aviones, etc. Son muy útiles
cuando necesitas un control de posición preciso y/o un par elevado.
105
10 PROYECTOS CON ARDUINO ELECTROGEEK
Con el primer ejemplo de código, puede controlar tanto la posición como la
velocidad del servomotor. Después de eso, veremos cómo controlar un servo
Componentes de hardware
Protoboard × 1 Electrogeek
Software
IDE Arduino
¿Cómo funciona un servomotor?
Un servo de hobby estándar generalmente consiste en un pequeño motor
eléctrico, un potenciómetro, electrónica de control y una caja de cambios. La
posición del eje de salida se mide constantemente mediante el potenciómetro
interno y se compara con la posición objetivo establecida por el controlador
106
10 PROYECTOS CON ARDUINO ELECTROGEEK
( por ejemplo, el Arduino).Según el error, la electrónica de control ajusta la
posición real del eje de salida para que coincida con la posición objetivo. Esto
se conoce como sistema de control de circuito cerrado.
Esquema de un servomotor RC (Hwang et al.2018)
La caja de engranajes disminuye la velocidad del motor, lo que aumenta el par
en el eje de salida. La velocidad máxima del eje de salida suele ser de alrededor
de 60 RPM.
Control de servo
Los servomotores se controlan enviando una señal PWM ( modulación de
ancho de pulso) a la línea de señal del servo. El ancho de los pulsos determina
la posición del eje de salida. Cuando envía al servo una señal con un ancho de
pulso de 1,5 milisegundos ( ms), el servo se moverá a la posición neutral (90
grados). La posición mínima (0 grados) y máxima (180 grados) normalmente
corresponden a un ancho de pulso de 1 ms y 2 ms respectivamente. Tenga en
cuenta que esto puede variar ligeramente entre diferentes tipos y marcas de
servomotores. Muchos servos solo giran unos 170 grados (o incluso solo 90),
pero la posición media casi siempre es de 1,5 ms.
107
10 PROYECTOS CON ARDUINO ELECTROGEEK
Los servomotores generalmente esperan un pulso cada 20 milisegundos o 50
Hz, pero muchos servos RC funcionan bien en un rango de 40 a 200 Hz.
Servo de 360 grados (continuo) frente a 180
grados (estándar)
La mayoría de los servos RC son de la variedad de 180 grados, lo que significa
que solo pueden girar en un rango de 0 a 180 grados. Sin embargo, también
está disponible la rotación continua, también conocida como servomotores de
360 grados.
Los servos de rotación continua reaccionan de manera diferente a la señal de
control que los servos estándar de 180 grados. Con un servo de rotación
continua, no puede controlar la posición exacta del eje de salida, solo la
velocidad y la dirección . Un pulso de 1 ms establecerá la velocidad del
servomotor a máxima velocidad en una dirección y un pulso de 2 ms a máxima
velocidad en la otra. Un valor cercano a 1,5 ms permite que el motor se
detenga.
Si su servo se comporta de una manera inesperada, es posible que esté
usando un servo continuo en lugar de uno estándar.
108
10 PROYECTOS CON ARDUINO ELECTROGEEK
TowerPro SG90-HV Servo digital continuo de 360 ° 9g (izquierda) vs TowerPro SG90 Micro
Servo Digital 9g (derecha). Observe que se ven casi idénticos por fuera.
¿Cómo conectar un servomotor al Arduino?
El cableado de un servomotor es muy fácil porque solo necesita conectar tres
cables: alimentación, tierra y señal. El cable de alimentación suele ser rojo y
debe conectarse a 5 V.
El cable de tierra suele ser negro o marrón y debe conectarse al pin de tierra
del Arduino. Cuando utilice una fuente de alimentación separada, conecte el
cable de tierra tanto al Arduino como a la tierra de la fuente de alimentación.
109
10 PROYECTOS CON ARDUINO ELECTROGEEK
Servomotor con diagrama de cableado Arduino Uno.
Conexiones del servomotor
Servo motor Arduino
VCC ( rojo) 5 V
Como mencioné antes, si está usando servomotores grandes o múltiples, debe
usar una fuente de alimentación externa. Simplemente conecte la fuente de
alimentación como se muestra en el diagrama de cableado a continuación.
Asegúrese de conectar el pin GND del Arduino y la fuente de alimentación
juntos.
También puede usar esta configuración si su servomotor requiere un voltaje
diferente al que el Arduino puede proporcionar, por ejemplo, 6 V o más.
110
10 PROYECTOS CON ARDUINO ELECTROGEEK
Servomotor alimentado con fuente de alimentación externa.
Servomotor con conexiones de alimentación
externa
Servo motor Conexión
Servomotor con código de ejemplo Arduino
Para controlar el servomotor usaremos la biblioteca Servo.h que viene
preinstalada con el IDE de Arduino. Con el código de ejemplo a continuación,
puede controlar la posición exacta del servomotor y también incluye un código
para mover el brazo del servo hacia adelante y hacia atrás automáticamente.
111
10 PROYECTOS CON ARDUINO ELECTROGEEK
void setup() {
// Attach the Servo variable to a pin:
myservo.attach(servoPin);
}
void loop() {
// Tell the servo to go to a particular angle:
myservo.write(90);
delay(1000);
myservo.write(180);
delay(1000);
myservo.write(0);
delay(1000);
112
10 PROYECTOS CON ARDUINO ELECTROGEEK
Cómo funciona el código
El primer paso es incluir la biblioteca Arduino requerida. También puede
encontrar esta biblioteca en Sketch> Incluir biblioteca> Servo.
// Include the servo library:
#include <Servo.h>
A continuación, debe crear un nuevo objeto de la clase Servo. En este caso,
llamé al servo 'myservo' pero también puedes usar otros nombres. Tenga en
cuenta que también tendrá que cambiar el nombre del servo en el resto del
código.
113
10 PROYECTOS CON ARDUINO ELECTROGEEK
void setup() {
// Attach the Servo variable to a pin:
myservo.attach(servoPin);
}
Ángulo/posición de control:
En la primera parte del ciclo, simplemente le decimos al servomotor que se
mueva a un ángulo particular con la función write(). Tenga en cuenta que
necesita un retardo entre los comandos para darle al servomotor algo de
tiempo para moverse a la posición establecida.
// Dile al servo que vaya a un ángulo particular:
myservo.write(90);
delay(1000);
myservo.write(180);
delay(1000);
myservo.write(0);
delay(1000);
Control de velocidad:
En la última parte del código, utilicé dos bucles for para mover el servomotor
hacia adelante y hacia atrás. Este fragmento de código también puede resultar
útil si desea controlar la velocidad del servomotor. Al cambiar el valor de
retardo al final del bucle for, puede ajustar la velocidad del brazo del servo.
114
10 PROYECTOS CON ARDUINO ELECTROGEEK
115
10 PROYECTOS CON ARDUINO ELECTROGEEK
void setup() {
myservo.attach(servoPin, min, max);
}
Controlar un servomotor con un
potenciometro y Arduino
116
10 PROYECTOS CON ARDUINO ELECTROGEEK
void setup() {
myservo.attach(servoPin);
}
void loop() {
reading = analogRead(potPin); // lee la entrada analógica
angle = map(reading, 0, 1023, 0, 180); // mapea la entrada a
un valor entre 0 y 180 grados
myservo.write(angle); // le dice al servo que vaya a la
posición establecida
delay(15); // esperar 15 ms para que el servo alcance la
posición
}
Observe que antes de la sección de configuración y bucle del código reading
se agrega una nueva variable y se define el pin de entrada del potenciómetro.
En la sección de bucle del código, leemos el valor del pin analógico A0 con la
función analogRead().
117
10 PROYECTOS CON ARDUINO ELECTROGEEK
Debido a que el servomotor solo puede girar entre 0 y 180 grados,
necesitamos reducir los valores con la función map () . Esta función vuelve a
mapear un número de un rango a otro.
angle = map(reading, 0, 1023, 0, 180); // mapea la entrada a
un valor entre 0 y 180 grados
Por último, escribimos el ángulo del servomotor:
Múltiples servomotores conectados al Arduino Uno y una fuente de alimentación externa.
118
10 PROYECTOS CON ARDUINO ELECTROGEEK
Tenga en cuenta que tendrá que usar una fuente de alimentación externa para
alimentar los servos porque el Arduino no puede proporcionar suficiente
corriente para alimentar todos los motores.
Para este ejemplo, solo usamos más pines Arduino para los servos adicionales.
Sin embargo, esto significa que está limitado a 12 servos cuando usa un
Arduino Uno, y es posible que no le queden suficientes pines para otros
componentes.
#include <Servo.h>
Servo servo1;
119
10 PROYECTOS CON ARDUINO ELECTROGEEK
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
void setup()
{
servo1.attach(9);
servo2.attach(10);
servo3.attach(11);
servo4.attach(12);
servo5.attach(13);
}
void loop()
{
servo1.write(0);
servo2.write(0);
servo3.write(0);
servo4.write(0);
servo5.write(0);
delay(2000);
servo1.write(90);
servo2.write(90);
servo3.write(90);
servo4.write(90);
servo5.write(90);
delay(1000);
servo1.write(180);
servo2.write(180);
servo3.write(180);
servo4.write(180);
servo5.write(180);
delay(1000);
}
120
10 PROYECTOS CON ARDUINO ELECTROGEEK
Especificaciones del servomotor
A continuación puede encontrar las especificaciones de algunos de los
servomotores más populares del mercado. El fabricante original de estos
servomotores es Tower Pro Pte Ltd. pero también se pueden comprar modelos
similares de muchos otros proveedores.
Micro servo analógico SG90
[Fuente: towerpro.com.tw ]
Pinout
Marrón GND
Rojo VCC
Especificaciones
Tensión de funcionamiento 4,8 V
121
10 PROYECTOS CON ARDUINO ELECTROGEEK
Peso 9 g
Temperatura de funcionamiento 0 - 55 ° C
Dimensiones
A 34,5 milímetros
B 22,8 milímetros
C 26,7 milímetros
D 12,6 milímetros
E 32,5 milímetros
F 16 mm
122
10 PROYECTOS CON ARDUINO ELECTROGEEK
[Fuente: towerpro.com.tw ]
Servo micro digital MG90S
[Fuente: towerpro.com.tw ]
Pinout
Marrón GND
Rojo VCC
123
10 PROYECTOS CON ARDUINO ELECTROGEEK
Especificaciones
Tensión de funcionamiento 4,8 V
Peso 13,4 g
Par de bloqueo 1,8 kg/cm (4,8 V), 2,2 kg/cm (6,6 V)
Temperatura de funcionamiento 0 - 55 ° C
Dimensiones
A 32,5 milímetros
B 22,8 milímetros
C 28,4 milímetros
D 12,4 milímetros
E 32,1 milímetros
F 18,5 milímetros
124
10 PROYECTOS CON ARDUINO ELECTROGEEK
[Fuente: towerpro.com.tw ]
Servo digital de alto par MG996R
[Fuente: towerpro.com.tw ]
Pinout
Marrón GND
Rojo VCC
125
10 PROYECTOS CON ARDUINO ELECTROGEEK
Especificaciones
Tensión de funcionamiento 4,8 - 6,6 V
Peso 55 g
Temperatura de funcionamiento 0 - 55 ° C
Dimensiones
A 42,7 milímetros
B 40,9 milímetros
C 37 mm
D 20 mm
E 54 mm
F 26,8 milímetros
126
10 PROYECTOS CON ARDUINO ELECTROGEEK
127
10 PROYECTOS CON ARDUINO ELECTROGEEK
Este artículo incluye todo lo que necesita saber sobre el control de un motor
paso a paso con el controlador de motor paso a paso A4988 y Arduino. He
incluido un diagrama de cableado, un tutorial sobre cómo establecer el límite
de corriente y muchos códigos de ejemplo.
Aunque puede usar este controlador sin una biblioteca Arduino, le recomiendo
que también eche un vistazo al código de ejemplo para la biblioteca
AccelStepper al final de este tutorial. Esta biblioteca es bastante fácil de usar
y puede mejorar enormemente el rendimiento de su hardware.
128
10 PROYECTOS CON ARDUINO ELECTROGEEK
Después de cada ejemplo, desgloso y explico cómo funciona el código, por lo
que no debería tener problemas para modificarlo para adaptarlo a sus
necesidades.
Componentes de hardware
Protoboard × 1 Electrogeek
Me gusta usar este controlador en combinación con un Shield CNC . Dicho
Shield ya incluye condensadores y ofrece una manera fácil de seleccionar la
resolución de micropasos. Hace que el cableado sea mucho más fácil y es una
excelente opción si necesita una solución más permanente que una placa de
pruebas.
129
10 PROYECTOS CON ARDUINO ELECTROGEEK
Herramientas
Multímetro Electrogeek
Software
IDE Arduino
Sobre el Driver
En el corazón del controlador A4988 encontrará un chip fabricado por Allegro
MicroSystems: el controlador de micropasos DMOS A4988 con traductor y
protección contra sobrecorriente. Este controlador de motor integrado hace
que la interfaz con un microcontrolador sea muy fácil, ya que solo necesita dos
pines para controlar tanto la velocidad como la dirección del motor paso a
paso.
El controlador tiene una capacidad de salida máxima de 35 V y ± 2 A, lo que es
ideal para impulsar motores paso a paso de tamaño pequeño a mediano, como
un motor paso a paso bipolar NEMA 17 .
130
10 PROYECTOS CON ARDUINO ELECTROGEEK
Especificaciones de A4988
Voltaje mínimo de funcionamiento 8 V
Diferencias entre A4988 y DRV8825
El DRV8825 es bastante similar al A4988, pero existen algunas diferencias
clave:
A4899 (izquierda) vs DRV8825 (derecha)
Configuración de microstep
Los motores paso a paso suelen tener un tamaño de paso de 1.8 ° o 200 pasos
por revolución, esto se refiere a pasos completos. Un controlador de
micropasos como el A4988 permite resoluciones más altas al permitir
ubicaciones de pasos intermedios. Esto se logra energizando las bobinas con
niveles de corriente intermedios.
Por ejemplo, conducir un motor en modo de cuarto de paso le dará al motor de
200 pasos por revolución 800 micropasos por revolución usando cuatro niveles
de corriente diferentes.
132
10 PROYECTOS CON ARDUINO ELECTROGEEK
Pinout A4988
Los pines selectores de resolución (tamaño de paso) (MS1, MS2 y MS3) le
permiten seleccionar una de las resoluciones de cinco pasos de acuerdo con la
tabla siguiente.
MS1 MS2 MS3 Resolución de micropasos
Las tres entradas tienen resistencias desplegables internas de 100 kΩ, por lo
que dejar los tres pines de selección de micropasos desconectados da como
resultado el modo de paso completo.
133
10 PROYECTOS CON ARDUINO ELECTROGEEK
Cableado: conexión de A4988 a Arduino y
motor paso a paso
Diagrama de cableado/esquema para el controlador de motor paso a paso A4988 con Arduino y
motor paso a paso.
El diagrama de cableado/esquema anterior muestra cómo conectar el
controlador A4988 a un motor paso a paso y al Arduino.
Conexiones A4988
A4988 Conexión
VMOT 8-35V
SLP REINICIAR
RST SLP
134
10 PROYECTOS CON ARDUINO ELECTROGEEK
VDD 5V
STP Pin 3
DIR Pin 2
● La fuente de alimentación del motor está conectada a GND y VMOT
(arriba a la derecha).
● Las dos bobinas del motor paso a paso están conectadas a 1A, 1B y 2A,
2B (ver más abajo).
● El pin GND (abajo a la derecha) está conectado al pin de tierra del
microcontrolador y VDD está conectado a 5V.
● El pin STP ( paso) y DIR (dirección) están conectados al pin digital 3 y 2
respectivamente. Puede elegir un pin digital diferente si lo desea, pero
estos son los que usé para este tutorial y el código de ejemplo.
● El pin SLP es una entrada baja activa. Es decir, bajar este pin pone al
conductor en modo de suspensión, minimizando el consumo de energía.
RST también es una entrada baja activa. Cuando se baja, todas las
entradas de PASO se ignoran hasta que se tira hacia arriba. Si no está
utilizando el pin, puede conectarlo al pin SLP/SLEEP adyacente para
elevarlo y habilitar el controlador.
● El pin EN (habilitar) se puede dejar desconectado, está bajado por
defecto. Cuando este pin está alto, el controlador está desactivado.
En el resto de este tutorial, dejé MS1, MS2 y MS3 desconectados , por lo que
el controlador funciona en modo de paso completo. Esto facilita un poco la
explicación del código. Normalmente, usaría micropasos de 1/8 o 1/16 y
conectaría los pines apropiados a 5V (consulte la tabla en la introducción).
135
10 PROYECTOS CON ARDUINO ELECTROGEEK
Advertencia
La placa portadora A4988 utiliza condensadores cerámicos de baja ESR, lo
que la hace susceptible a picos de voltaje LC destructivos, especialmente
cuando se utilizan cables de alimentación de más de unas pocas pulgadas.
Lo único que necesita identificar son los dos pares de cables que están
conectados a las dos bobinas del motor. Los cables de una bobina se conectan
a 1A y 1B y el otro a 2A y 2B, la polaridad no importa.
Para encontrar los dos cables de una bobina, haga lo siguiente con el motor
desconectado:
1. Intente hacer girar el eje del motor paso a paso con la mano y observe lo
difícil que es girar.
2. Ahora elija un par de cables al azar del motor y junte los extremos
desnudos.
3. A continuación, intente hacer girar el eje del motor paso a paso
nuevamente.
Si siente mucha resistencia, ha encontrado un par de cables de la misma
bobina. Si puede girar el eje libremente, pruebe con otro par de cables. Ahora
conecte las dos bobinas a los pines que se muestran en el diagrama de
cableado anterior.
136
10 PROYECTOS CON ARDUINO ELECTROGEEK
¿Cómo establecer el límite de corriente?
Antes de comenzar a programar su Arduino y comenzar a usar el controlador,
hay una cosa muy importante que debe hacer y que mucha gente olvida :
¡establecer el límite de la corriente!
Diagrama de cableado de límite de corriente para el controlador A4988.
137
10 PROYECTOS CON ARDUINO ELECTROGEEK
Para medir el voltaje de referencia, el controlador debe estar encendido. El
A4988 solo necesita energía a través de VDD (5V) y necesita conectar RST y
SLP juntos; de lo contrario, el controlador no se encenderá. Es mejor
desconectar el motor paso a paso mientras hace esto.
Si ya ha conectado el controlador, puede dejarlo todo menos el motor paso a
paso conectado. Puede aplicar energía a través del puerto USB del Arduino.
A4988 Conexión
VDD 5V
RST SLP
SLP REINICIAR
GND GND
Fórmula de límite actual
El siguiente paso es calcular el límite actual con la siguiente fórmula:
Entonces, esto significa que para un límite de corriente de 1A para una placa
con resistencias de detección de corriente de 0.068 Ω, el Vref debe ser de 540
mV.
138
10 PROYECTOS CON ARDUINO ELECTROGEEK
Ubicaciones de la resistencia de detección actual. Imagen: www.pololu.com
Para seleccionar el límite de corriente correcto, eche un vistazo a la hoja de
datos de su motor paso a paso. Si no puede encontrar la clasificación actual de
su motor, le recomiendo comenzar con un límite de corriente de 1A. Siempre
puede aumentarlo más tarde si a su motor/controlador le faltan pasos.
Tenga en cuenta que debe volver a calibrar el límite de corriente si cambia el
voltaje de la fuente de alimentación del motor. Si su motor hace mucho ruido,
intente reducir el límite de corriente. Es mejor establecer el límite de corriente
lo suficientemente alto para que el motor no pierda pasos.
Midiendo Vref
Ahora deberá medir el voltaje de referencia (Vref) entre los dos puntos
marcados en la imagen de abajo (GND y el potenciómetro) y ajustarlo al valor
que calculó.
139
10 PROYECTOS CON ARDUINO ELECTROGEEK
Puntos de sonda Vref (GND y potenciómetro).
Recomiendo usar cables de prueba de cocodrilo sujetos al destornillador para
establecer el límite de corriente. Esto le permite ajustar el potenciómetro y
medir el voltaje de referencia al mismo tiempo.
Nota: Hay otra forma de medir el límite de corriente y es medir directamente el
consumo de corriente del motor paso a paso. Personalmente, el método
anterior me parece mucho más fácil.
140
10 PROYECTOS CON ARDUINO ELECTROGEEK
¿Necesito encender el motor ejecutando el boceto del motor Arduino?
No, consulte la pregunta anterior.
Depende del fabricante del controlador. Si tiene una placa de ruptura Polulu
genuina del DRV8825 o A4988, gire el potenciómetro en el sentido de las
agujas del reloj para subir Vref y en el sentido contrario a las agujas del reloj
para bajarlo.
Enfriando al Driver A4988
El controlador IC A4988 tiene una clasificación de corriente máxima de 2 A por
bobina, pero sin un disipador de calor sólo puede suministrar alrededor de 1 A
por bobina antes de que comience a sobrecalentarse.
void setup() {
141
10 PROYECTOS CON ARDUINO ELECTROGEEK
void loop() {
// Set the spinning direction clockwise:
digitalWrite(dirPin, HIGH);
delay(1000);
delay(1000);
142
10 PROYECTOS CON ARDUINO ELECTROGEEK
delay(1000);
delay(1000);
}
Cómo funciona el código:
El Sketch comienza con la definición de los pines de paso y dirección. Los
conecté al pin 3 y 2 de Arduino.
143
10 PROYECTOS CON ARDUINO ELECTROGEEK
menciona dirPin, el compilador lo reemplazará con el valor 2 cuando se
compile el programa.
144
10 PROYECTOS CON ARDUINO ELECTROGEEK
Control de la dirección de giro:
Para controlar la dirección de giro del motor paso a paso, establecemos el pin
DIR (dirección) en ALTO o BAJO. Para esto usamos la función
digitalWrite(). Dependiendo de cómo conectó el motor paso a paso,
establecer el pin DIR alto permitirá que el motor gire en CW o CCW.
Número de control de pasos o revoluciones:
En este boceto de ejemplo, los bucles for controlan el número de pasos que
dará el motor paso a paso. El código dentro del bucle for da como resultado 1
paso del motor paso a paso. Debido a que el código en el ciclo se ejecuta 200
veces (stepsPerRevolution), esto da como resultado 1 revolución. En los dos
últimos bucles, el código dentro del bucle for se ejecuta 1000 veces, lo que da
como resultado 1000 pasos o 5 revoluciones.
Tenga en cuenta que puede cambiar el segundo término en el ciclo for a la
cantidad de pasos que desee. for(int i = 0; i < 100; i++) daría
como resultado 100 pasos, o media revolución.
Control de velocidad:
La velocidad del motor paso a paso está determinada por la frecuencia de los
pulsos que enviamos al pin STEP. Cuanto mayor sea la frecuencia, más rápido
funciona el motor. Puede controlar la frecuencia de los pulsos cambiando
delayMicroseconds() el código. Cuanto menor sea la demora, mayor será
la frecuencia y más rápido funcionará el motor.
🔗 AccelStepper-1.59.zip
145
10 PROYECTOS CON ARDUINO ELECTROGEEK
Puede instalar la biblioteca yendo a Sketch> Incluir biblioteca> Agregar
biblioteca .ZIP… en el IDE de Arduino.
Puede buscar 'accelstepper' y buscar la biblioteca de Mike McCauley.
Seleccione la última versión y luego haga clic en Instalar.
146
10 PROYECTOS CON ARDUINO ELECTROGEEK
Código de ejemplo de rotación continua
El siguiente esquema se puede utilizar para hacer funcionar uno o más motores
paso a paso de forma continua a una velocidad constante. (No se utiliza
aceleración y desaceleración).
void setup() {
147
10 PROYECTOS CON ARDUINO ELECTROGEEK
void loop() {
// Set the speed in steps per second:
stepper.setSpeed(400);
// Step the motor with a constant speed as set by
setSpeed():
stepper.runSpeed();
}
Cómo funciona el código:
El primer paso es incluir la biblioteca con #include <AccelStepper.h>.
// Include the AccelStepper library:
#include <AccelStepper.h>
El siguiente paso es definir las conexiones A4988 a Arduino y el tipo de
interfaz del motor. El tipo de interfaz del motor debe establecerse en 1 cuando
se utiliza un controlador de paso y dirección. Puede encontrar los otros tipos de
interfaz aquí .
La declaración #define se usa para dar un nombre a un valor constante. El
compilador reemplazará cualquier referencia a esta constante con el valor
definido cuando se compile el programa. Entonces, en cualquier lugar que
menciona dirPin, el compilador lo reemplazará con el valor 2 cuando se
compile el programa.
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1
A continuación, debe crear una nueva instancia de la clase AccelStepper con el
tipo de interfaz de motor y las conexiones adecuadas.
148
10 PROYECTOS CON ARDUINO ELECTROGEEK
En este caso, llamé al motor paso a paso 'paso a paso' pero se puede usar
otros nombres, como 'z_motor' o 'liftmotor' etc AccelStepper liftmotor
= AccelStepper(motorInterfaceType, stepPin, dirPin);.
void loop() {
// Set the speed in steps per second:
149
10 PROYECTOS CON ARDUINO ELECTROGEEK
stepper.setSpeed(400);
// Step the motor with a constant speed as set by
setSpeed():
stepper.runSpeed();
}
Código de ejemplo para controlar el número
de pasos o revoluciones
Para dejar que el motor gire un número específico de pasos, prefiero usar un
bucle while en combinación con stepper.currentPosition(). Puede
utilizar el siguiente código de ejemplo para dejar que el motor funcione de un
lado a otro.
void setup() {
// Set the maximum speed in steps per second:
stepper.setMaxSpeed(1000);
}
void loop() {
// Set the current position to 0:
stepper.setCurrentPosition(0);
150
10 PROYECTOS CON ARDUINO ELECTROGEEK
delay(1000);
delay(1000);
delay(3000);
}
151
10 PROYECTOS CON ARDUINO ELECTROGEEK
Explicación del código
La primera parte del código hasta la sección loop () es exactamente la misma
que en el ejemplo anterior.
152
10 PROYECTOS CON ARDUINO ELECTROGEEK
velocidad de 200 pasos por segundo y una aceleración de 30 pasos por
segundo por segundo.
void setup() {
// Set the maximum speed and acceleration:
stepper.setMaxSpeed(200);
stepper.setAcceleration(30);
}
void loop() {
// Set the target position:
stepper.moveTo(600);
// Run to target position with set speed and
acceleration/deceleration:
stepper.runToPosition();
delay(1000);
delay(1000);
}
153
10 PROYECTOS CON ARDUINO ELECTROGEEK
Explicación del código:
En la configuración (), además de la velocidad máxima, necesitamos definir la
aceleración/desaceleración. Para esto usamos la función
setAcceleration().
void setup() {
// Set the maximum speed and acceleration:
stepper.setMaxSpeed(200);
stepper.setAcceleration(30);
}
En la sección de bucle del código, utilicé una forma diferente de dejar que el
motor girara un número predefinido de pasos. La función
stepper.moveTo() se utiliza para establecer la posición de destino. La
función stepper.runToPostion() mueve el motor (con
aceleración/desaceleración) a la posición de destino y bloquea hasta que está
en la posición de destino. Debido a que esta función está bloqueando, no debe
usarla cuando necesite controlar otras cosas al mismo tiempo.
// Set the target position:
stepper.moveTo(600);
// Run to target position with set speed and
acceleration/deceleration:
stepper.runToPosition();
154
10 PROYECTOS CON ARDUINO ELECTROGEEK
Este tutorial incluye todo lo que necesita saber sobre el uso de sensores de
temperatura digitales DS18B20 de 1 cable con Arduino. He incluido diagramas
de cableado y varios códigos de ejemplo para que pueda comenzar.
155
10 PROYECTOS CON ARDUINO ELECTROGEEK
En el primer ejemplo de código, le mostraré cómo tomar lecturas de
temperatura de un solo sensor y mostrar el resultado en el monitor serial. Los
ejemplos siguientes explican cómo leer varios sensores con un solo pin
Arduino. Por último, le mostraré cómo mostrar la temperatura en una pantalla
LCD I2C .
Componentes de hardware
× 3 Electrogeek
Sensor de temperatura digital DS18B20 (TO-92)
× 1 Electrogeek
Impermeable DS18B20 (alternativa)
× 1 Electrogeek
Placa de conexión DS18B20 (alternativa)
× 1 Electrogeek
Arduino Uno
× 1 Electrogeek
Protoboard
Electrogeek
Cables para Protoboard ~ 15
× 1 Electrogeek
Resistencia pull-up de 4,7 kΩ
× 1 Electrogeek
LCD I2C de 16x2 caracteres
× 1 Electrogeek
Cable USB tipo A/B
Software
IDE Arduino
156
10 PROYECTOS CON ARDUINO ELECTROGEEK
Acerca del sensor de temperatura DS18B20
de 1 cable
El DS18B20 es un sensor de temperatura digital fabricado por Maxim
Integrated (anteriormente Dallas Semiconductor). Es uno de los sensores de
temperatura más populares del mercado y proporciona una precisión bastante
alta (± 0,5 ° C) en un amplio rango de temperatura (-55 ° C a + 125 ° C).
Debido a que el voltaje de operación del sensor es de 3.0 a 5.5 V, puede usarlo
tanto con Arduino (que opera a 5 V), como con dispositivos como ESP32 y
Raspberry Pi que tienen pines GPIO de 3.3 V.
Una de las principales ventajas de este sensor es que solo requiere un pin
digital del Arduino para la comunicación. El sensor se comunica mediante el
protocolo Dallas Semiconductor 1-Wire ® . Este protocolo funciona de manera
similar a I2C, pero con velocidades de datos más bajas y mayor alcance.
Otra ventaja es que cada sensor DS18B20 tiene un código de serie único de
64 bits, que permite que varios sensores funcionen en el mismo bus de 1
cable. Por lo tanto, puede leer datos de varios sensores que están conectados
entre sí con un solo pin Arduino (consulte los ejemplos de código a
continuación).
157
10 PROYECTOS CON ARDUINO ELECTROGEEK
Tipos de sensores DS18B20
El sensor generalmente viene en tres factores de forma. El tipo más común es
el paquete TO-92 de 3 pines, que se parece a un transistor.
158
10 PROYECTOS CON ARDUINO ELECTROGEEK
Este tipo de sensor a veces se monta en una pcb que puede incluir un LED de
alimentación y la resistencia pull-up de 4,7 kΩ requerida. Siempre asegúrese
de verificar las marcas en la PCB, ya que el orden de los pines puede ser
diferente según el fabricante.
Por último, puede comprar el sensor en un estilo de sonda impermeable con un
cable ya conectado. Este estilo puede resultar útil si desea medir algo lejano,
bajo el agua o bajo tierra.
Tenga en cuenta que el cable del sensor impermeable suele estar revestido de
PVC, por lo que se recomienda mantenerlo por debajo de los 100 ° C.
159
10 PROYECTOS CON ARDUINO ELECTROGEEK
Cableado: conexión del DS18B20 a un
Arduino
Conectar un DS18B20 al Arduino es bastante fácil ya que solo necesita
conectar 3 pines. Comience conectando el pin GND a tierra y el pin VDD a la
salida de 5V del Arduino.
A continuación, conecte el pin del medio (DQ) a cualquiera de los pines
digitales del Arduino. En este caso, utilicé el pin digital 2. También tiene que
agregar una resistencia pull-up de 4.7 kΩ entre el pin DQ y 5 V. Esto
mantendrá alto el estado inactivo del bus de 1 cable.
Sensor de temperatura digital DS18B20 con diagrama de cableado Arduino Uno
Las conexiones también se dan en la siguiente tabla.
Tenga en cuenta que el pin 1 (GND) es el pin más a la izquierda cuando el lado
plano del sensor (con el texto impreso en él) está orientado hacia usted.
160
10 PROYECTOS CON ARDUINO ELECTROGEEK
Conexiones del sensor de temperatura
digital DS18B20
DS18B20 Arduino
Un sensor DS18B20 resistente al agua se conecta de la misma manera. Sin
embargo, el color de los cables puede ser diferente según el fabricante. El cable
de tierra (GND) suele ser negro o azul, el cable de alimentación (VDD) suele ser
rojo y el cable de señal (DQ) suele ser amarillo o blanco. Le recomiendo que
consulte siempre la hoja de datos de su sensor si no está seguro.
161
10 PROYECTOS CON ARDUINO ELECTROGEEK
Instalación de las bibliotecas
DallasTemperature y OneWire Arduino
El protocolo de comunicación de 1 cable es algo complejo y requiere un
montón de código para analizar la comunicación. Por lo tanto, usaremos la
biblioteca DallasTemperature Arduino de Miles Burton para facilitar la
programación de estos sensores.
Esta biblioteca le permite emitir comandos simples para leer los datos de
temperatura de los sensores.
Puede buscar 'ds18b20' y buscar la biblioteca DallasTemperature de Miles
Burton . Seleccione la última versión y luego haga clic en Instalar.
162
10 PROYECTOS CON ARDUINO ELECTROGEEK
La biblioteca DallasTemperature se basa en la biblioteca OneWire Arduino que
también debe instalar. Esta biblioteca se encarga del protocolo de
comunicación 1-Wire.
163
10 PROYECTOS CON ARDUINO ELECTROGEEK
Sensor de temperatura DS18B20 con código
de ejemplo Arduino
Con el siguiente código de ejemplo, puede leer la temperatura de un sensor
DS18B20 y mostrarla en el monitor en serie.
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Start up the library:
sensors.begin();
}
void loop() {
// Send the command for all devices on the bus to perform a
temperature conversion:
164
10 PROYECTOS CON ARDUINO ELECTROGEEK
sensors.requestTemperatures();
// Wait 1 second:
delay(1000);
}
Debería ver la siguiente salida en el Monitor Serial (Ctrl + Shift + M).
165
10 PROYECTOS CON ARDUINO ELECTROGEEK
166
10 PROYECTOS CON ARDUINO ELECTROGEEK
Después de esto, creé un nuevo objeto de la clase OneWire y pasé el pin DQ a
su constructor. También debe crear un objeto de la clase DallasTemperature y
pasar el objeto oneWire como parámetro.
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
En la sección de configuración del código, comenzamos la comunicación en
serie a una velocidad de 9600 baudios. Luego, inicialicé el bus con la función
begin().
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Start up the library:
sensors.begin();
}
En la sección de bucle del código, comenzamos con el comando para que
todos los sensores del bus inicien una conversión de temperatura.
// Send the command for all devices on the bus to perform a
temperature conversion:
sensors.requestTemperatures();
A continuación, utilicé las funciones getTempCByIndex(deviceIndex)y
getTempFByIndex(deviceIndex)para obtener la temperatura en grados
Celsius y Fahrenheit respectivamente. En este caso, solo tenemos 1 sensor
conectado al bus. Debido a que el conteo comienza en cero, configuro el índice
de nuestro sensor en 0.
// Fetch the temperature in degrees Celsius for device index:
float tempC = sensors.getTempCByIndex(0); // the index 0
refers to the first device
167
10 PROYECTOS CON ARDUINO ELECTROGEEK
168
10 PROYECTOS CON ARDUINO ELECTROGEEK
int deviceCount = 0;
169
10 PROYECTOS CON ARDUINO ELECTROGEEK
float tempC;
float tempF;
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Start up the library:
sensors.begin();
void loop() {
// Send the command for all devices on the bus to perform a
temperature conversion:
sensors.requestTemperatures();
170
10 PROYECTOS CON ARDUINO ELECTROGEEK
Serial.println();
delay(1000);
}
La salida en Serial Monitor debería verse así:
172
10 PROYECTOS CON ARDUINO ELECTROGEEK
connected:
#define ONE_WIRE_BUS 2
// Create variables:
int deviceCount = 0; // variable to store the number of
devices connected
DeviceAddress deviceAddress; // variable to store the device
address
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Start up the library:
sensors.begin();
Serial.println("Printing addresses...");
for (int i = 0; i < deviceCount; i++) {
Serial.print("Sensor ");
Serial.print(i + 1);
Serial.print(" : ");
sensors.getAddress(deviceAddress, i);
printAddress(deviceAddress);
173
10 PROYECTOS CON ARDUINO ELECTROGEEK
}
}
void loop() {
}
174
10 PROYECTOS CON ARDUINO ELECTROGEEK
Ahora escriba las direcciones de todos los sensores, porque las necesitará en el
siguiente ejemplo.
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Start up the library:
sensors.begin();
175
10 PROYECTOS CON ARDUINO ELECTROGEEK
void loop() {
// Send the command for all devices on the bus to perform a
temperature conversion:
sensors.requestTemperatures();
Serial.print("Sensor 1: ");
printTemperature(sensor1); // call the printTemperature
function with the address of sensor1 as input
Serial.print("Sensor 2: ");
printTemperature(sensor2);
Serial.print("Sensor 3: ");
printTemperature(sensor3);
176
10 PROYECTOS CON ARDUINO ELECTROGEEK
Tenga en cuenta que debe reemplazar las direcciones en las líneas 17 a 19
con las direcciones que encontró usando el código de ejemplo anterior.
// Addresses of DS18B20 sensors connected to the 1-Wire bus
byte sensor1[8] = {0x28, 0x18, 0xB4, 0x49, 0x0C, 0x00, 0x00,
0x7C};
byte sensor2[8] = {0x28, 0xCC, 0x19, 0x49, 0x0C, 0x00, 0x00,
0xBB};
byte sensor3[8] = {0x28, 0x19, 0xEF, 0x48, 0x0C, 0x00, 0x00,
0x21};
Debería ver la siguiente salida en el Monitor Serial.
Explicación del código
La dirección de cada sensor consta de 64 bits. En el código, especificamos la
dirección como una matriz de ocho bytes de 8 bits.
// Addresses of DS18B20 sensors connected to the 1-Wire bus
byte sensor1[8] = {0x28, 0x18, 0xB4, 0x49, 0x0C, 0x00, 0x00,
0x7C};
byte sensor2[8] = {0x28, 0xCC, 0x19, 0x49, 0x0C, 0x00, 0x00,
177
10 PROYECTOS CON ARDUINO ELECTROGEEK
0xBB};
byte sensor3[8] = {0x28, 0x19, 0xEF, 0x48, 0x0C, 0x00, 0x00,
0x21};
La sección de configuración del código es la misma que en los ejemplos
anteriores.
178
10 PROYECTOS CON ARDUINO ELECTROGEEK
setResolution ()
Esta función se puede utilizar para establecer la resolución de la conversión de
temperatura a digital. Como mencioné en la introducción, esto se puede
configurar en 9, 10, 11 o 12 bits, correspondientes a incrementos de 0.5 ° C,
0.25 ° C, 0.125 ° C y 0.0625 ° C, respectivamente.
La biblioteca DallasTemperature le permite configurar la resolución con la
función setResolution(). Esta función se puede agregar a la sección de
configuración o bucle de su código.
179
10 PROYECTOS CON ARDUINO ELECTROGEEK
O puede configurarse individualmente para un sensor específico especificando
su dirección:
// Addresses of DS18B20 sensors connected to the 1-Wire bus
byte sensor1[8] = {0x28, 0x18, 0xB4, 0x49, 0x0C, 0x00, 0x00,
0x7C};
bool hasAlarm()
Esta función devuelve verdadero cuando un dispositivo tiene una condición de
alarma. Puede encontrar un ejemplo de estas funciones aquí .
Muestre las lecturas de temperatura
DS18B20 en una pantalla LCD I2C
Si desea hacer un proyecto independiente que no necesita una computadora,
puede ser bueno saber cómo mostrar las lecturas de temperatura en una
pantalla LCD.
180
10 PROYECTOS CON ARDUINO ELECTROGEEK
Con el código de ejemplo a continuación, puede mostrar las lecturas de
temperatura en una pantalla LCD I2C de 16x2 caracteres.
DS18B20 con LCD I2C de 16x2 caracteres y Arduino
Las conexiones también se dan en la siguiente tabla:
GND GND
VCC 5 V
SDA A4
SCL A5
Para utilizar una pantalla LCD I2C, deberá instalar la biblioteca Arduino
LiquidCrystal_I2C.
181
10 PROYECTOS CON ARDUINO ELECTROGEEK
Abra el administrador de la biblioteca en el IDE de Arduino y busque
'liquidcrystal_i2c'. Ahora desplácese hacia abajo y busque la biblioteca de
Frank de Brabander . Seleccione la última versión y luego haga clic en Instalar.
182
10 PROYECTOS CON ARDUINO ELECTROGEEK
DallasTemperature sensors(&oneWire);
// Degree symbol:
byte Degree[] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Start up the library:
sensors.begin();
// Start the LCD and turn on the backlight:
lcd.init();
lcd.backlight();
// Create a custom character:
lcd.createChar(0, Degree);
}
void loop() {
// Send the command for all devices on the bus to perform a
temperature conversion:
sensors.requestTemperatures();
183
10 PROYECTOS CON ARDUINO ELECTROGEEK
// Wait 1 second:
delay(1000);
}
Debería ver la siguiente salida en la pantalla LCD:
184
10 PROYECTOS CON ARDUINO ELECTROGEEK
En este tutorial, aprenderá a usar un control remoto y un receptor de infrarrojos
con Arduino. He incluido diagramas de cableado y varios códigos de ejemplo
para que pueda comenzar.
Siguiendo las instrucciones de este tutorial, debería poder usar prácticamente
cualquier control remoto IR (como el de su televisor) para controlar las cosas
conectadas al Arduino.
En los ejemplos de código a continuación, usaremos la biblioteca IRremote
Arduino. Esta biblioteca es bastante fácil de usar y admite muchos protocolos
de comunicación IR diferentes. Con los dos primeros ejemplos, puede
identificar el protocolo IR de su control remoto y determinar qué código envía
185
10 PROYECTOS CON ARDUINO ELECTROGEEK
cuando presiona una tecla/botón. A continuación, le mostraré cómo asignar el
código recibido a los valores clave y mostrarlos en el monitor en serie o en una
pantalla LCD. Por último, veremos cómo controlar las salidas del Arduino con
un control remoto y un receptor de infrarrojos.
Componentes de hardware
Protoboard × 1 Electrogeek
Software
IDE Arduino
186
10 PROYECTOS CON ARDUINO ELECTROGEEK
¿Cómo funcionan un receptor y un mando a
distancia de infrarrojos (IR)?
Un control remoto IR y un receptor se comunican entre sí transmitiendo y
decodificando una señal en forma de radiación IR pulsada.
Señal enviada y detectada por el transmisor IR (izquierda) y el receptor (derecha) (Fuente:
SB-Projects )
La radiación infrarroja (IR), o luz infrarroja, es un tipo de radiación
electromagnética con longitudes de onda que van desde 700 nm a 1 mm.
Debido a que los humanos solo pueden ver la luz con longitudes de onda de
aproximadamente 400 (violeta) a 700 ( rojo) nanómetros, la radiación IR es
invisible para el ojo humano.
Espectro electromagnético con luz visible resaltada (Fuente: Wikipedia )
187
10 PROYECTOS CON ARDUINO ELECTROGEEK
Dado que la transmisión por infrarrojos es un protocolo inalámbrico basado en
un tipo de luz, requiere una línea de visión clara entre el transmisor (el control
remoto) y el receptor. Esto significa que no puede transmitir a través de
paredes o techos, a diferencia de WiFi o Bluetooth.
LED IR al final de un control remoto (Fuente: SparkFun )
Todo este IR ambiental puede interferir con la comunicación entre el control
remoto y el receptor. Entonces, ¿cómo detecta el receptor solo la señal de
infrarrojos que proviene del control remoto? La respuesta es la modulación de
la señal.
188
10 PROYECTOS CON ARDUINO ELECTROGEEK
El receptor está construido de tal manera que solo deja pasar el IR que llega a
38 kHz. Esto se hace usando un filtro de paso de banda y un amplificador. La
Protocolo NEC (Fuente: SB-Projects )
En la imagen de arriba, el eje vertical se puede ver como el voltaje que va al
LED IR en el control remoto y el eje horizontal es el tiempo. Entonces, cuando
el LED está encendido, parpadea ( modula) a 38 kHz y cuando está apagado,
no se aplica voltaje.
189
10 PROYECTOS CON ARDUINO ELECTROGEEK
comprar los diodos por separado o montarlos en una pequeña placa de
conexión.
●
●
Diodo receptor de infrarrojos (izquierda) y receptor montado en una placa de conexión (derecha)
Funcionan exactamente igual, por lo que no importa cual uses. La única
diferencia es que la placa de conexión a menudo contiene un pequeño LED que
parpadea cada vez que el receptor detecta una señal que puede ser útil para
depurar.
190
10 PROYECTOS CON ARDUINO ELECTROGEEK
Conexión de un receptor de infrarrojos al
Arduino
Es muy fácil conectar un receptor de infrarrojos al Arduino, ya que solo
necesita conectar tres cables. El cable de salida se puede conectar a cualquiera
de los pines digitales del Arduino. En este caso, lo conecté al pin 2 para los
primeros ejemplos a continuación.
El pin de salida del receptor de infrarrojos está conectado al pin 2
Las conexiones también se dan en la siguiente tabla.
191
10 PROYECTOS CON ARDUINO ELECTROGEEK
Vcc (derecha) 5 V
Instalación de la biblioteca IRremote Arduino
Para este tutorial, usaremos la popular biblioteca IRremote escrita por Rafi
Khan y otros. Esta biblioteca es bastante fácil de usar y admite muchos tipos
diferentes de controles remotos IR. Puede encontrar el código fuente de esta
biblioteca aquí en GitHub .
Puede buscar 'IRremote' y buscar la biblioteca por shirriff y z3to. Seleccione la
última versión y luego haga clic en Instalar.
192
10 PROYECTOS CON ARDUINO ELECTROGEEK
Determine el protocolo de infrarrojos
utilizado por su control remoto
NEC es probablemente el protocolo de transmisión IR más conocido y más
extendido, ya que lo utiliza la gran mayoría de los productos electrónicos de
consumo fabricados en Japón. Sin embargo, existen muchos otros tipos de
protocolos. Puede ser útil saber qué tipo de protocolo de infrarrojos está
usando su control remoto si desea trabajar en proyectos más avanzados. O tal
vez solo tengas curiosidad
● Aiwa
● BoseWave
● Denon
● Plato
● JVC
● Lego
● LG
● MagiQuest
● Mitsubishi
● Comité ejecutivo nacional
● Panasonic
193
10 PROYECTOS CON ARDUINO ELECTROGEEK
● Philips RC5
● Philips RC6,
● Samsung
● Sanyo
● Agudo
● Sony
● Whynter
Aunque la biblioteca es bastante antigua, todavía se están agregando nuevos
protocolos (consulte GitHub ).
Con el código a continuación, puede identificar qué protocolo está usando su
control remoto. También puede probar algunos otros controles remotos que
tiene en su casa y ver si puede detectar el protocolo.
Buscador de protocolo remoto por
infrarrojos
#include <IRremote.h> // include the IRremote library
void setup() {
Serial.begin(9600); // begin serial communication with a
baud rate of 9600
receiver.enableIRIn(); // enable the receiver
receiver.blink13(true); // enable blinking of the built-in
LED when an IR signal is received
}
void loop() {
if (receiver.decode(&results)) {
194
10 PROYECTOS CON ARDUINO ELECTROGEEK
if (results.value == 0XFFFFFFFF) {
results.value = key_value;
}
Serial.println(results.value, HEX);
switch (results.decode_type) {
case NEC:
Serial.println("NEC");
break;
case SONY:
Serial.println("SONY");
break;
case RC5:
Serial.println("RC5");
break;
case RC6:
Serial.println("RC6");
break;
case DISH:
Serial.println("DISH");
break;
case SHARP:
Serial.println("SHARP");
break;
case JVC:
Serial.println("JVC");
break;
case SANYO:
Serial.println("SANYO");
break;
case MITSUBISHI:
Serial.println("MITSUBISHI");
break;
case SAMSUNG:
Serial.println("SAMSUNG");
break;
case LG:
195
10 PROYECTOS CON ARDUINO ELECTROGEEK
Serial.println("LG");
break ;
case WHYNTER:
Serial.println("WHYNTER");
break;
case AIWA_RC_T501:
Serial.println("AIWA_RC_T501");
break;
case PANASONIC:
Serial.println("PANASONIC");
break;
case DENON:
Serial.println("DENON");
break;
case BOSEWAVE:
Serial.println("BOSEWAVE");
break;
case LEGO_PF:
Serial.println("LEGO_PF");
break;
case MAGIQUEST:
Serial.println("MAGIQUEST");
break;
default:
case UNKNOWN:
Serial.println("UNKNOWN");
break ;
}
key_value = results.value;
receiver.resume();
}
}
Experimenté con algunos de los controles remotos de mi casa y pude detectar
los siguientes protocolos:
196
10 PROYECTOS CON ARDUINO ELECTROGEEK
Protocolos de infrarrojos detectados desde varios controles remotos
Encontrar los códigos clave para su control
remoto
Debido a que hay muchos tipos diferentes de controles remotos en el mercado
(diferente número de teclas y valores impresos en las teclas), necesitamos
determinar qué señal recibida corresponde a qué tecla.
Al imprimir esta salida en Serial Monitor, podemos crear una tabla de
conversión.
197
10 PROYECTOS CON ARDUINO ELECTROGEEK
decode_results class
void setup() {
Serial.begin(9600); // begin serial communication with a
baud rate of 9600
receiver.enableIRIn(); // enable the receiver
receiver.blink13(true); // enable blinking of the built-in
LED when an IR signal is received
}
void loop() {
if (receiver.decode(&results)) { // decode the received
signal and store it in results
Serial.println(results.value, HEX); // print the values in
the Serial Monitor
receiver.resume(); // reset the receiver for the next code
}
}
Una vez que haya cargado el código, abra Serial Monitor (Ctrl + Shift + M en
Windows). Ahora presione cada tecla en el control remoto y registre el valor
hexadecimal correspondiente que ve en el Monitor serial.
198
10 PROYECTOS CON ARDUINO ELECTROGEEK
199
10 PROYECTOS CON ARDUINO ELECTROGEEK
Botón Código
POWER 0xFD00FF
VOL + 0xFD807F
FUNC/STOP 0xFD40BF
│◄◄ 0xFD20DF
►││ 0xFDA05F
►►│ 0xFD609F
▼ 0xFD10EF
VOL- 0xFD906F
▲ 0xFD50AF
0 0xFD30CF
Ecualizador 0xFDB04F
ST/REPT 0xFD708F
1 0xFD08F7
2 0xFD8877
3 0xFD48B7
4 0xFD28D7
5 0xFDA857
6 0xFD6897
200
10 PROYECTOS CON ARDUINO ELECTROGEEK
7 0xFD18E7
8 0xFD9867
9 0xFD58A7
Como puede ver en la tabla, los valores hexadecimales se indican con el prefijo
“0x”.
Código de ejemplo de Arduino del receptor y
mando a distancia por infrarrojos: imprimir
valores clave en el monitor serie
Ahora que sabemos qué código (valor hexadecimal) corresponde a qué
pulsación de tecla, podemos modificar el código para imprimir el valor de la
tecla pulsada en el Monitor de serie.
Para esto, usaremos una estructura de control de caso de interruptor . Esto nos
permite ejecutar un código diferente según la tecla que se presione.
void setup() {
Serial.begin(9600); // begin serial communication with a
201
10 PROYECTOS CON ARDUINO ELECTROGEEK
void loop() {
if (receiver.decode(&results)) { // decode the received
signal and store it in results
if (results.value == 0xFFFFFFFF) { // if the value is
equal to 0xFFFFFFFF
results.value = key_value; // set the value to the key
value
}
switch (results.value) { // compare the value to the
following cases
case 0xFD00FF: // if the value is equal to 0xFD00FF
Serial.println("POWER"); // print "POWER" in the
Serial Monitor
break;
case 0xFD807F:
Serial.println("VOL+");
break;
case 0xFD40BF:
Serial.println("FUNC/STOP");
break;
case 0xFD20DF:
Serial.println("|<<");
break;
case 0xFDA05F:
Serial.println(">||");
break ;
case 0xFD609F:
Serial.println(">>|");
break ;
case 0xFD10EF:
202
10 PROYECTOS CON ARDUINO ELECTROGEEK
Serial.println("DOWN");
break ;
case 0xFD906F:
Serial.println("VOL-");
break ;
case 0xFD50AF:
Serial.println("UP");
break ;
case 0xFD30CF:
Serial.println("0");
break ;
case 0xFDB04F:
Serial.println("EQ");
break ;
case 0xFD708F:
Serial.println("ST/REPT");
break ;
case 0xFD08F7:
Serial.println("1");
break ;
case 0xFD8877:
Serial.println("2");
break ;
case 0xFD48B7:
Serial.println("3");
break ;
case 0xFD28D7:
Serial.println("4");
break ;
case 0xFDA857:
Serial.println("5");
break ;
case 0xFD6897:
Serial.println("6");
break ;
case 0xFD18E7:
203
10 PROYECTOS CON ARDUINO ELECTROGEEK
Serial.println("7");
break ;
case 0xFD9867:
Serial.println("8");
break ;
case 0xFD58A7:
Serial.println("9");
break ;
}
key_value = results.value; // store the value as key_value
receiver.resume(); // reset the receiver for the next code
}
}
204
10 PROYECTOS CON ARDUINO ELECTROGEEK
Estas líneas se traducen a: cuando results.value es igual a 0xFD00FF, imprima
"POWER" en el Monitor serial. Una vez más, observe que debe agregar "0x"
antes de los valores que vio en el Monitor serie en el ejemplo anterior.
Para evitar dobles clics no deseados, puede agregar un breve retraso ( por
ejemplo, 500 ms) al final del ciclo.
#include <IRremote.h> // include the IRremote library
A continuación, define a qué pin Arduino está conectada la salida del receptor.
La declaración #define se usa para dar un nombre a un valor constante. El
compilador reemplazará cualquier referencia a esta constante con el valor
definido cuando se compile el programa. Entonces, en cualquier lugar que
menciona RECEIVER_PIN, el compilador lo reemplazará con el valor 2 cuando
se compile el programa.
#define RECEIVER_PIN 2 // define the IR receiver pin
Después de eso, necesitamos crear un objeto de la IRrecv clase y vincularlo
al pin de salida del receptor ( pin 2). En este caso, llamé al objeto 'receptor' pero
también puedes usar otros nombres. Este objeto se encarga del protocolo IR y
el procesamiento de la señal del receptor.
IRrecv receiver(RECEIVER_PIN); // create a receiver object of
the IRrecv class
205
10 PROYECTOS CON ARDUINO ELECTROGEEK
A continuación, se crea un objeto llamado results de la clase
decode_results. Este objeto almacena los valores decodificados del objeto
receptor. Accederemos a estos valores en el resto del código.
decode_results results; // create a results object of the
decode_results class
En la última línea antes de la sección de configuración, creamos una variable
para almacenar el valor de la clave.
unsigned long key_value = 0; // variable to store the key
value
En la sección de configuración del código, primero establecemos la velocidad
de datos para la comunicación en serie en bits por segundo (velocidad en
baudios) de 9600. Asegúrese de que el Monitor en serie también esté
configurado a la misma velocidad en baudios.
206
10 PROYECTOS CON ARDUINO ELECTROGEEK
Como mencioné antes, cuando presionas continuamente una tecla,
comenzamos a recibir 0xFFFFFFFF desde el control remoto. Esto significa una
repetición de la clave anterior. Como quiero seguir imprimiendo el valor de la
tecla presionada, agregué las siguientes líneas al código:
if (results.value == 0xFFFFFFFF) { // if the value is equal to
0xFFFFFFFF
results.value = key_value; // set the value to the key value
}
y
key_value = results.value; // store the value as key_value
al final del ciclo. Cuando se recibe el código de repetición 0xFFFFFFFF, lo
reemplazamos con el valor de clave anterior que almacenamos como
key_value en la línea 86.
Para este ejemplo, conecté la salida del receptor de infrarrojos al pin digital 8
en lugar de 2. Las conexiones para la pantalla LCD de caracteres se muestran
en el diagrama de cableado a continuación.
207
10 PROYECTOS CON ARDUINO ELECTROGEEK
Tenga en cuenta que también necesita un potenciómetro de 10 kΩ para
establecer el contraste de la pantalla y una resistencia de 220 Ω para controlar
el brillo de la luz de fondo.
Control remoto y receptor de infrarrojos con Arduino Uno y diagrama de cableado LCD de 16x2
caracteres
Las conexiones también se dan en la siguiente tabla. El pin más a la izquierda
de la pantalla LCD es el pin 1 (GND).
Conexiones del receptor de LCD e infrarrojos
PIN Conexión
208
10 PROYECTOS CON ARDUINO ELECTROGEEK
Con el código de ejemplo a continuación, puede imprimir el valor de la tecla
presionada en la pantalla LCD. He programado el botón de encendido para que
borre la pantalla.
209
10 PROYECTOS CON ARDUINO ELECTROGEEK
Receptor y control remoto IR con código de
ejemplo de pantalla LCD y Arduino
Puede copiar el código haciendo clic en el botón en la esquina superior derecha
del campo del código.
#include <IRremote.h> // include the IRremote library
#include <LiquidCrystal.h> // include the LiquidCrystal
library
void setup() {
lcd.begin(16, 2); // enable LCD with 16 colums and 2 rows
receiver.enableIRIn(); // enable the receiver
receiver.blink13(true); // enable blinking of the built-in
LED when an IR signal is received
}
void loop() {
if (receiver.decode(&results)) { // decode the received
signal and store it in results
if (results.value == 0xFFFFFFFF) { // if the value is
equal to 0xFFFFFFFF
results.value = key_value; // set the value to the key
value
210
10 PROYECTOS CON ARDUINO ELECTROGEEK
}
switch (results.value) { // compare the value to the
following cases
case 0xFD00FF: // if the value is equal to 0xFD00FF
lcd.clear(); // clear the display
break;
case 0xFD807F:
lcd.print("VOL+");
break;
case 0xFD40BF:
lcd.print("FUNC/STOP");
break;
case 0xFD20DF:
lcd.print("|<<");
break;
case 0xFDA05F:
lcd.print(">||");
break ;
case 0xFD609F:
lcd.print(">>|");
break ;
case 0xFD10EF:
lcd.print("DOWN");
break ;
case 0xFD906F:
lcd.print("VOL-");
break ;
case 0xFD50AF:
lcd.print("UP");
break ;
case 0xFD30CF:
lcd.print("0");
break ;
case 0xFDB04F:
lcd.print("EQ");
break ;
211
10 PROYECTOS CON ARDUINO ELECTROGEEK
case 0xFD708F:
lcd.print("ST/REPT");
break ;
case 0xFD08F7:
lcd.print("1");
break ;
case 0xFD8877:
lcd.print("2");
break ;
case 0xFD48B7:
lcd.print("3");
break ;
case 0xFD28D7:
lcd.print("4");
break ;
case 0xFDA857:
lcd.print("5");
break ;
case 0xFD6897:
lcd.print("6");
break ;
case 0xFD18E7:
lcd.print("7");
break ;
case 0xFD9867:
lcd.print("8");
break ;
case 0xFD58A7:
lcd.print("9");
break ;
}
key_value = results.value; // store the value as key_value
receiver.resume(); // reset the receiver for the next code
}
}
212
10 PROYECTOS CON ARDUINO ELECTROGEEK
Debería ver la siguiente salida en la pantalla LCD si presiona la tecla VOL +.
Tenga en cuenta que es posible que deba ajustar el potenciómetro para
aumentar el contraste de la pantalla.
Salida de pantalla LCD
LED de control (salidas Arduino) con control
remoto IR y receptor
Aunque es divertido ver los valores clave en el monitor serial o en una pantalla
LCD, probablemente querrá usar el control remoto para algo más útil, es decir,
controlar algo. En el siguiente ejemplo, le mostraré cómo encender y apagar los
LED con el control remoto. También puede utilizar este tipo de código para
controlar relés, luces y motores.
El código se ve casi igual que los ejemplos anteriores, pero agregué funciones
adicionales para controlar los LED.
213
10 PROYECTOS CON ARDUINO ELECTROGEEK
Diagrama de cableado para controlar LED con control remoto IR, receptor y Arduino
Los LED están conectados a los pines 2 a 5 del Arduino y la salida del receptor
de infrarrojos al pin 6. Usé algunas resistencias de 470 Ω para limitar la
corriente que pasa por los LED. La corriente de funcionamiento habitual de los
LED de 3 y 5 mm ronda los 20 mA. Puede determinar qué valor de resistencia
necesita con una calculadora en línea como esta.
#include <IRremote.h>
void setup() {
Serial.begin(9600); // begin serial communication at a baud
rate of 9600
214
10 PROYECTOS CON ARDUINO ELECTROGEEK
switch (results.value) {
case 0xFD00FF:
Serial.println("POWER");
break;
case 0xFD807F:
Serial.println("VOL+");
break;
case 0xFD40BF:
Serial.println("FUNC/STOP");
break;
case 0xFD20DF:
Serial.println("|<<");
break;
case 0xFDA05F:
Serial.println(">||");
break ;
case 0xFD609F:
Serial.println(">>|");
215
10 PROYECTOS CON ARDUINO ELECTROGEEK
break ;
case 0xFD10EF:
Serial.println("DOWN");
break ;
case 0xFD906F:
Serial.println("VOL-");
break ;
case 0xFD50AF:
Serial.println("UP");
break ;
case 0xFD30CF:
Serial.println("0");
break ;
case 0xFDB04F:
Serial.println("EQ");
break ;
case 0xFD708F:
Serial.println("ST/REPT");
break ;
case 0xFD08F7:
Serial.println("1");
toggleLED(RED_LED_PIN); // run the toggle LED function
with the red LED pin as input
break ;
case 0xFD8877:
Serial.println("2");
toggleLED(YELLOW_LED_PIN);
break ;
case 0xFD48B7:
Serial.println("3");
toggleLED(GREEN_LED_PIN);;
break ;
case 0xFD28D7:
Serial.println("4");
toggleLED(BLUE_LED_PIN);
break ;
216
10 PROYECTOS CON ARDUINO ELECTROGEEK
case 0xFDA857:
Serial.println("5");
break ;
case 0xFD6897:
Serial.println("6");
break ;
case 0xFD18E7:
Serial.println("7");
break ;
case 0xFD9867:
Serial.println("8");
break ;
case 0xFD58A7:
Serial.println("9");
break ;
}
key_value = results.value;
receiver.resume();
}
}
217
10 PROYECTOS CON ARDUINO ELECTROGEEK
Explicación del código
A continuación, destacaré rápidamente las diferencias en el código en
comparación con los ejemplos anteriores.
En la primera parte del código, define los pines de Arduino a los que están
conectados los LED y el receptor de infrarrojos. En la sección de configuración,
configure los pines del LED como salida y apague todos los LED con
digitalWrite(pin, value).
Esta función toma el pin de LED específico como entrada y enciende o apaga el
LED si presiona la tecla. Tenga en cuenta que si presiona continuamente una
tecla, el LED seguirá encendiéndose y apagándose.
void toggleLED(int pin) { // function to toggle the LED on and
off
if (digitalRead(pin) == HIGH) { // if the LED is on
digitalWrite(pin, LOW); // turn it off
}
else { // else
digitalWrite(pin, HIGH); // turn it on
}
218
10 PROYECTOS CON ARDUINO ELECTROGEEK
Dado que básicamente solo está controlando los 4 pines de salida del Arduino,
también puede usar esta función para encender y apagar los relés.
219
10 PROYECTOS CON ARDUINO ELECTROGEEK
Software
IDE Arduino
Acerca del controlador LED MAX7219
El controlador LED MAX7219 se puede utilizar para controlar pantallas de 7
segmentos de hasta 8 dígitos, pantallas de gráfico de barras o 64 LED
individuales. El controlador se comunica con Arduino a través de SPI, por lo
que solo necesita tres cables para controlar la pantalla.
221
10 PROYECTOS CON ARDUINO ELECTROGEEK
Dado que el MAX7219 puede controlar un máximo de 64 LED, la pantalla de
matriz de puntos de tamaño máximo que puede manejar es de 8×8 píxeles. Sin
embargo, puede conectar en cadena varios controladores y matrices y
controlar fácilmente pantallas mucho más grandes como 8×32, 8x64 o incluso
más grandes. Aún así, solo necesita tres cables para controlar todos los
circuitos integrados, por lo que necesita muy pocos pines de E/S del Arduino.
Para obtener más información, puede consultar la hoja de datos:
🔗 MAX7219 Hoja de datos
Casi todas las pantallas que he usado en el pasado usaban una matriz LED de
8×8 tipo 1088AS. Puede encontrar una hoja de datos de una de las empresas
que los fabrica a continuación:
🔗
1088AS Hoja de datos
222
10 PROYECTOS CON ARDUINO ELECTROGEEK
Cómo conectar la pantalla de matriz de
puntos al Arduino
El controlador de pantalla LED MAX7219 se comunica con Arduino a través de
SPI (interfaz periférica en serie). Para obtener más información sobre este
protocolo de datos, consulte esta página en el sitio web de Arduino.
Con una interfaz SPI siempre hay un dispositivo maestro (el Arduino) que
controla los dispositivos periféricos (también conocidos como esclavos). Puede
controlar la pantalla a través de la interfaz SPI del hardware del
microcontrolador AVR de Arduino o tres pines digitales arbitrarios (software
SPI).
Los pines SPI de hardware (MOSI, MISO y SCK) están en una ubicación
específica en cada placa Arduino. Esta interfaz es más rápida que usar el
software SPI, pero deberá usar los siguientes pines de salida fijos:
Ubicaciones de los pines SPI de hardware
Placas MOSI MISO SCK Nivel
223
10 PROYECTOS CON ARDUINO ELECTROGEEK
Fuente: Arduino.cc
Para controlar las pantallas MAX7219 solo necesita realizar tres conexiones:
● MOSI (Master Out Slave In) conectado a DIN - La línea Master que envía
datos a los periféricos.
● SCK (Serial Clock) conectado a CLK: los pulsos de reloj que sincronizan la
transmisión de datos generada por el maestro.
● SS (Selección de esclavo) conectado a CS: el pin en cada dispositivo que
el maestro puede usar para habilitar y deshabilitar dispositivos
específicos.
Puede conectar en cadena múltiples pantallas para crear una pantalla grande
conectando DOUT de la primera pantalla a DIN de la siguiente pantalla. VCC,
GND, CLK y CS se comparten entre todas las pantallas.
Puede seleccionar cualquiera de los pines digitales del Arduino para el pin
SS/CS. Tenga en cuenta que para este tutorial utilicé el pin 3 (consulte la tabla
a continuación).
Pantalla de matriz de puntos LED MAX7219 con diagrama de cableado Arduino
224
10 PROYECTOS CON ARDUINO ELECTROGEEK
Las conexiones también se dan en la siguiente tabla:
Conexiones de pantalla de matriz de puntos
LED MAX7219
Pantalla MAX7219 Arduino
VCC 5 V
GND GND
DIN 11 (MOSI)
CS 3 (SS)
CLK 13 (SCK)
Si desea utilizar el software SPI en su lugar, puede conectar DIN, CS y CLK a
cualquiera de los pines digitales del Arduino. Sólo necesita especificar los
números de pin en la configuración del código Arduino (vea los ejemplos a
continuación).
Requerimientos de energía
La potencia máxima que el Arduino Uno puede entregar de manera segura
cuando se alimenta desde USB es de alrededor de 400 mA a 5 V. Si desea
controlar una pantalla grande, se recomienda utilizar una fuente de
alimentación externa.
225
10 PROYECTOS CON ARDUINO ELECTROGEEK
biblioteca MD_MAX72XX que implementa las funciones de hardware de la
matriz de LED.
226
10 PROYECTOS CON ARDUINO ELECTROGEEK
Busque 'MD_MAX72XX' y busque las bibliotecas de majicDesigns. Seleccione
la última versión y luego haga clic en instalar. Asegúrese de instalar tanto la
biblioteca MD_MAX72XX como la biblioteca MD_Parola.
227
10 PROYECTOS CON ARDUINO ELECTROGEEK
Diferentes tipos de pantallas de matriz de
puntos LED
Hay muchos tipos y tamaños diferentes de pantallas de matriz de puntos LED
MAX7219 disponibles en el mercado. La biblioteca MD_MAX72XX es
compatible con casi todas estas pantallas, pero debe configurar la biblioteca
correctamente para el tipo de matriz que se está utilizando.
Esta es probablemente la pantalla MAX7219 más común que se puede
encontrar. Por lo general, viene como una matriz de LED de 8×8 u 8×32 y
puede comprarlos con diferentes colores de LED .
Orientación y conexiones del módulo
Puede conectar fácilmente varios módulos de 8×8 u 8×32 juntos para crear
una pantalla más grande. Por lo general, suelo soldar conectores macho rectos
en la parte posterior de los módulos y los conecto mediante puentes.
De esta forma puede desmontarlos sin tener que desoldar ninguna conexión.
228
10 PROYECTOS CON ARDUINO ELECTROGEEK
La pantalla está orientada con el lado DIN a la derecha. Tenga en cuenta que el
texto serigrafiado en la parte posterior de la PCB puede estar al revés en esta
orientación.
DP A B C D E F G
+ ------------------------ +
| 7 6 5 4 3 2 1 0 | D0
CLK <---| 1 | D1 <--- CLK
CS <---| 2 | D2 <--- CS
DOUT <---| 3 | D3 <--- DIN
GND ----| O 4 | D4 ---- TIERRA
VCC ----| OO 5 | D5 ---- VCC
| OOO 6 | D6
| OOOO 7 | D7
+ ------------------------ +
Configuración de hardware en código
Arduino
Al configurar la pantalla en su código Arduino, debe configurar
HARDWARE_TYPE en FC16_HW y especificar la cantidad de dispositivos que
ha conectado. Una matriz de 8×8 cuenta como 1 dispositivo, por lo que si
desea controlar un módulo de 8×32, debe configurar MAX_DEVICES en 4 (una
pantalla de 8×32 contiene 4 circuitos integrados MAX7219).
// Hardware SPI:
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 4
#define CS_PIN 2
229
10 PROYECTOS CON ARDUINO ELECTROGEEK
MAX_DEVICES);
// For software SPI you also need to specify the DATA_PIN and
the CLK_PIN connections:
// #define DATA_PIN 3
// #define CLK_PIN 4
Este es un módulo de 8×8 montado en una PCB verde con el IC MAX7219
debajo de la matriz de LED. Se caracterizan por los conectores de 5 pines en
los extremos cortos de la PCB rectangular.
Orientación y conexiones del módulo
El módulo genérico debe orientarse con el MAX7219 IC en la parte superior.
Puede conectar varios módulos junto con algunos cables dupont cortos de
hembra a hembra. Simplemente conecte todos los pines del lado DOUT del
primer módulo al lado DIN del siguiente módulo.
230
10 PROYECTOS CON ARDUINO ELECTROGEEK
C C D G V
L S I N C
K N D C
| | | | |
V V V | |
D7 D6 D5 D4 D3 D2 D1 D0
+------------------------+
| 7 6 5 4 3 2 1 0 | DP
| 1 | A
| 2 | B
| 3 | C
| O 4 | D
| O O 5 | E
| O O O 6 | F
| O O O O 7 | G
+------------------------+
| | | | |
V V V | |
C C D G V
L S O N C
K U D C
T
Configuración de hardware en código
Arduino
Para los módulos de visualización genéricos, debe establecer
HARDWARE_TYPE en GENERIC_HW . El resto de la configuración y
MAX_DEVICES es el mismo que para los módulos FC-16.
// Hardware SPI:
#define HARDWARE_TYPE MD_MAX72XX::GENERIC_HW
#define MAX_DEVICES 1
#define CS_PIN 2
// For software SPI you also need to specify the DATA_PIN and
the CLK_PIN connections:
// #define DATA_PIN 3
// #define CLK_PIN 4
232
10 PROYECTOS CON ARDUINO ELECTROGEEK
// #define CLK_PIN 4
// MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, DATA_PIN,
CLK_PIN, CS_PIN, MAX_DEVICES);
void setup() {
// Intialize the object:
myDisplay.begin();
// Set the intensity (brightness) of the display (0-15):
myDisplay.setIntensity(0);
// Clear the display:
myDisplay.displayClear();
}
void loop() {
myDisplay.setTextAlignment(PA_CENTER);
myDisplay.print("Center");
delay(2000);
myDisplay.setTextAlignment(PA_LEFT);
myDisplay.print("Left");
delay(2000);
myDisplay.setTextAlignment(PA_RIGHT);
myDisplay.print("Right");
delay(2000);
myDisplay.setTextAlignment(PA_CENTER);
myDisplay.setInvert(true);
myDisplay.print("Invert");
delay(2000);
myDisplay.setInvert(false);
myDisplay.print(1234);
delay(2000);
}
233
10 PROYECTOS CON ARDUINO ELECTROGEEK
Debería ver el siguiente resultado:
Cómo funciona el código
El primer paso es incluir todas las bibliotecas Arduino necesarias. Como
mencioné antes, la biblioteca MD_MAX72XX implementa las funciones de
hardware de la matriz LED y la biblioteca MD_Parola los efectos de texto.
También deberá incluir la biblioteca SPI, que viene preinstalada en el IDE de
Arduino. Esta biblioteca se utiliza para la comunicación de la interfaz de
periféricos en serie entre la pantalla y Arduino.
// Include the required Arduino libraries:
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
A continuación, necesitamos especificar qué hardware estamos usando. Como
utilicé una pantalla estándar de 8×32 (también conocida como FC-16),
configuré HARDWARE_TYPE en FC16_HW. El número de circuitos integrados
MAX7219 en una pantalla de 8×32 es 4, por lo que configuró MAX_DEVICES
en 4. Por último, define a qué pin está conectado el pin CS de la pantalla ( pin
de salida 3 en este caso).
234
10 PROYECTOS CON ARDUINO ELECTROGEEK
#define CS_PIN 3
Después de esto, se crea una nueva instancia de la clase MD_Parola con la
función MD_Parola(). Esta función necesita tres parámetros, el primero es el
tipo de hardware, el segundo el pin CS y el tercero el número máximo de
dispositivos conectados.
235
10 PROYECTOS CON ARDUINO ELECTROGEEK
En la sección de bucle del código, primero establecemos la alineación del texto
que se imprimirá con la función setTextAlignment (). Puede alinear el texto a la
izquierda, al centro y a la derecha con PA_LEFT, PA_CENTER y PA_RIGHT
respectivamente.
236
10 PROYECTOS CON ARDUINO ELECTROGEEK
Código de ejemplo de Arduino de texto en
desplazamiento
Cuando desee imprimir un mensaje en una pantalla de matriz de puntos, a
menudo encontrará que la pantalla es demasiado pequeña para ajustarse a
todo el mensaje. La solución está en la biblioteca MD_Parola, lo que hace que
sea muy fácil crear efectos de texto de desplazamiento. En los siguientes
ejemplos, le mostraré cómo configurar esto, así cómo cómo usar algunos de los
otros efectos de texto disponibles.
// Include the required Arduino libraries:
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
237
10 PROYECTOS CON ARDUINO ELECTROGEEK
// #define CLK_PIN 4
// MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, DATA_PIN,
CLK_PIN, CS_PIN, MAX_DEVICES);
void setup() {
// Intialize the object:
myDisplay.begin();
// Set the intensity (brightness) of the display (0-15):
myDisplay.setIntensity(0);
// Clear the display:
myDisplay.displayClear();
myDisplay.displayText("Scrolling text", PA_CENTER, 100, 0,
PA_SCROLL_LEFT, PA_SCROLL_LEFT);
}
void loop() {
if (myDisplay.displayAnimate()) {
myDisplay.displayReset();
}
}
Cómo funciona el código
La primera parte del código hasta el final de la sección de configuración es
exactamente la misma que en el ejemplo anterior. Al final de la sección de
configuración, especificamos cómo queremos mostrar el texto con la función
displayText(pText, align, speed, pause, effectIn,
effectOut). Esta función toma 5 argumentos.
238
10 PROYECTOS CON ARDUINO ELECTROGEEK
Los argumentos tercero y cuarto establecen la velocidad de la animación y el
tiempo de pausa respectivamente. La velocidad de la pantalla es el tiempo en
milisegundos entre los cuadros de animación. Cuanto menor sea este tiempo,
más rápida será la animación. Si desea pausar el texto entre la animación de
entrada y salida, puede establecer el tiempo de pausa en milisegundos. Lo
puse en cero para que el texto se desplace continuamente.
● PA_PRINT,
● PA_SCAN_HORIZ,
● PA_SCROLL_LEFT,
● PA_WIPE,
● PA_SCROLL_UP_LEFT,
239
10 PROYECTOS CON ARDUINO ELECTROGEEK
● PA_SCROLL_UP,
● PA_OPENING_CURSOR,
● PA_GROW_UP,
● PA_MESH,
● PA_SCROLL_UP_RIGHT,
● PA_BLINDS,
● PA_CLOSING,
● PA_RANDOM,
● PA_GROW_DOWN,
● PA_SCAN_VERT,
● PA_SCROLL_DOWN_LEFT,
● PA_WIPE_CURSOR,
● PA_DISSOLVE,
● PA_OPENING,
● PA_CLOSING_CURSOR,
● PA_SCROLL_DOWN_RIGHT,
● PA_SCROLL_RIGHT,
● PA_SLICE,
● PA_SCROLL_DOWN
El siguiente código de ejemplo muestra los diferentes efectos para que pueda
ver cómo se ven.
int i = 0;
textEffect_t texteffect[] =
{
PA_PRINT,
PA_SCAN_HORIZ,
PA_SCROLL_LEFT,
PA_WIPE,
PA_SCROLL_UP_LEFT,
PA_SCROLL_UP,
PA_OPENING_CURSOR,
240
10 PROYECTOS CON ARDUINO ELECTROGEEK
PA_GROW_UP,
PA_MESH,
PA_SCROLL_UP_RIGHT,
PA_BLINDS,
PA_CLOSING,
PA_RANDOM,
PA_GROW_DOWN,
PA_SCAN_VERT,
PA_SCROLL_DOWN_LEFT,
PA_WIPE_CURSOR,
PA_DISSOLVE,
PA_OPENING,
PA_CLOSING_CURSOR,
PA_SCROLL_DOWN_RIGHT,
PA_SCROLL_RIGHT,
PA_SLICE,
PA_SCROLL_DOWN
};
void setup() {
241
10 PROYECTOS CON ARDUINO ELECTROGEEK
myDisplay.begin();
myDisplay.setIntensity(0);
myDisplay.setTextAlignment(PA_CENTER);
myDisplay.setPause(1000);
myDisplay.setSpeed(100);
myDisplay.displayClear();
}
void loop() {
if (myDisplay.displayAnimate()) {
if (i < sizeof(texteffect)) {
i++;
}
else {
i = 0;
}
myDisplay.displayText("Hello",
myDisplay.getTextAlignment(), myDisplay.getSpeed(),
myDisplay.getPause(), texteffect[i], texteffect[i]);
myDisplay.displayReset();
}
}
Sprites de texto
Una función relativamente nueva de la biblioteca MD_Parola son los sprites de
texto animados. En gráficos por computadora, un sprite es un mapa de bits
bidimensional que se integra en una escena más grande (en este caso, la
pantalla de matriz).
Tenga en cuenta que utilicé una pantalla de matriz de 8×64 para este ejemplo
conectando dos pantallas de 8×32 juntas (MAX_DEVICES está configurado en
8).
242
10 PROYECTOS CON ARDUINO ELECTROGEEK
// Sprite definitions:
const uint8_t F_PMAN1 = 6;
const uint8_t W_PMAN1 = 8;
const uint8_t PROGMEM pacman1[F_PMAN1 * W_PMAN1] = //
gobbling pacman animation
{
0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
};
243
10 PROYECTOS CON ARDUINO ELECTROGEEK
244
10 PROYECTOS CON ARDUINO ELECTROGEEK
245
10 PROYECTOS CON ARDUINO ELECTROGEEK
246
10 PROYECTOS CON ARDUINO ELECTROGEEK
heart
{
0x0e, 0x11, 0x21, 0x42, 0x84, 0x42, 0x21, 0x11, 0x0e,
0x0e, 0x1f, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x1f, 0x0e,
0x0e, 0x1f, 0x3f, 0x7e, 0xfc, 0x7e, 0x3f, 0x1f, 0x0e,
0x0e, 0x1f, 0x33, 0x66, 0xcc, 0x66, 0x33, 0x1f, 0x0e,
0x0e, 0x11, 0x21, 0x42, 0x84, 0x42, 0x21, 0x11, 0x0e,
};
247
10 PROYECTOS CON ARDUINO ELECTROGEEK
void setup() {
myDisplay.begin();
myDisplay.setIntensity(0);
myDisplay.displayClear();
myDisplay.setSpriteData(pacman2, W_PMAN2, F_PMAN2, pacman2,
W_PMAN2, F_PMAN2);
myDisplay.displayText("Parola sprites", PA_CENTER, 50, 1000,
PA_SPRITE, PA_SPRITE);
}
void loop() {
if (myDisplay.displayAnimate()) {
myDisplay.displayReset();
}
}* Example code for sprite text effect on MAX7219 LED dot
matrix display with Arduino. More info:
https://www.makerguides.com */
248
10 PROYECTOS CON ARDUINO ELECTROGEEK
// Sprite definitions:
const uint8_t F_PMAN1 = 6;
const uint8_t W_PMAN1 = 8;
const uint8_t PROGMEM pacman1[F_PMAN1 * W_PMAN1] = //
gobbling pacman animation
{
0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
};
249
10 PROYECTOS CON ARDUINO ELECTROGEEK
0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00,
0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00,
0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c, 0x00, 0x00,
0x00, 0xfe, 0x7b, 0xf3, 0x7f, 0xfb, 0x73, 0xfe,
};
250
10 PROYECTOS CON ARDUINO ELECTROGEEK
};
251
10 PROYECTOS CON ARDUINO ELECTROGEEK
0x18, 0x3c, 0x7e, 0xff, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x18,
};
252
10 PROYECTOS CON ARDUINO ELECTROGEEK
253
10 PROYECTOS CON ARDUINO ELECTROGEEK
void setup() {
myDisplay.begin();
myDisplay.setIntensity(0);
myDisplay.displayClear();
myDisplay.setSpriteData(pacman2, W_PMAN2, F_PMAN2, pacman2,
W_PMAN2, F_PMAN2);
myDisplay.displayText("Parola sprites", PA_CENTER, 50, 1000,
PA_SPRITE, PA_SPRITE);
}
void loop() {
if (myDisplay.displayAnimate()) {
myDisplay.displayReset();
}
}
Cómo funciona el código
Después de configurar la pantalla como antes, se definen los sprites de texto.
Se utilizan dos constantes para definir el sprite, una para los datos de ancho
( número de bytes) de un sprite y la otra para el número de fotogramas
contenidos en la animación. El número total de bytes necesarios es el ancho *
número de tramas. Tenga en cuenta que los datos del sprite se almacenan en
PROGMEM para ahorrar espacio en la RAM.
254
10 PROYECTOS CON ARDUINO ELECTROGEEK
Cada fila de la matriz está formada por números hexadecimales que establecen
qué LED deben iluminarse en cada columna del sprite.
// Sprite definitions:
const uint8_t F_PMAN1 = 6;
const uint8_t W_PMAN1 = 8;
const uint8_t PROGMEM pacman1[F_PMAN1 * W_PMAN1] = //
gobbling pacman animation
{
0x00, 0x81, 0xc3, 0xe7, 0xff, 0x7e, 0x7e, 0x3c,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x3c, 0x7e, 0xff, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x24, 0x66, 0xe7, 0xff, 0xff, 0xff, 0x7e, 0x3c,
0x00, 0x42, 0xe7, 0xe7, 0xff, 0xff, 0x7e, 0x3c,
};
En la configuración, la función setSpriteData(inData, inWidth,
inFrames, outData, outWidth, outFrames) se usa para configurar los
datos del usuario necesarios para que la biblioteca pueda mostrar el sprite
cuando se selecciona el tipo de animación PA_SPRITE en la
displayText()función.
255