Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando
-- Tutorial de iniciación a Arduino --
Volver al índice del tutorial
____________________________
49BE.- Teclado 4x4, bus I2C. Pantalla LCD. Sensor de humedad y temperatura. Infrarojo. RadioFrecuencia.
- Continuamos con nuestro proyecto. Vamos a agregarle un Emisor/Receptor de Radio Frecuencia que enviará la distancia medida por un sensor de ultrasonido.
- Para trabajar con el sensor de ultrasonido recordaremos el tutorial:
25.- Ultrasonido. Medidor de distancia. (3.- Otro programa para medir distancias. Sin librería.)
- Para trabajar con el Emisor/Receptor de Radio Frecuencia seguiremos el tutorial:
27.- Comunicación por radio frecuencia.
- En este proyecto necesitaremos dos Arduinos, uno para el Receptor de RF en donde añadiremos dos LED verdes, será el primero que veamos y luego el Emisor de RF en donde se encontrará el sensor de ultrasonido y dos pulsadores.
- Funcionamiento:
- Al pulsar los botones pulsadorA y pulsadorB del módulo del Emisor de Radio Frecuencia, se encenderá los LED5 y LED6 del módulo del Receptor.
- Al poner un objeto cerca del sensor de ultrasonido, se enviará esa distancia al módulo del Receptor.
- Para ver la distancia del sensor de ultrasonido en la pantalla LCD del módulo del Receptor, pulsaremos la tecla "D" del teclado.
_______________________
- Teclados y LED.
'A' |
Modifica la temperatura máxima para encender el LED13 |
LED13 |
'B' |
Visualiza la Humedad en LCD. |
LED13 |
'C' |
Visualiza la Temperatura en LCD. |
LED13 |
'#' |
Fin de entrada de datos para la opción 'A' |
|
Mando de infrarojo |
Teclas '1' y '2' del mando de infrarojo. |
LED7 |
'D' |
Distancia ultrasonido por Radio Frecuencia en LCD. |
|
PulsadorA
PulsadorB |
|
LED5
LED6 |
______________________________________________________
- Conexionado para el receptor de RF.
- He agregado el módulo receptor de Radio Frecuencia, su salida de datos va al terminal 8 del Arduino.
- Además he puesto dos LED de color verde, conectados a los terminales 5 y 6 del Arduino.
______________________________________________________
- Código para el Arduino receptor.
- Además de las librerías vistas anteriormente, para el módulo IR debemos cargar esta librería: IRremote.zip de Ken Shirriff.
jTeclado_LCD_humedad_ir_rfr.ino |
// Juan A. Villalpando.
// Abril 2018. KIO4.COM
#include <Wire.h>
// Teclado.
#include <Keypad_I2C.h>
#include <Keypad.h>
// Pantalla LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define LED13 13
#define LED7 7
// Sensor humedad-temperatura.
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
// Infrarojo.
#include <IRremote.h>
// Radio Frecuencia.
#include <VirtualWire.h>
const int pin_de_recepcion = 8; // RF
#define LED5 5
#define LED6 6
int distancia;
int distancia_old;
boolean radiofrecuen = false;
// Teclado
const byte ROWS = 4;
const byte COLS = 4;
String maximo = "40";
char key = ' ';
// Humedad Temperatura.
float humedad = 0.0;
float temperatura = 0.0;
float temperatura_old = 0.1;
boolean temperatu = false;
// Infrarojo.
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
int tecla;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {0,1,2,3};
byte colPins[COLS] = {4,5,6,7};
int i2caddress = 0x38; // Direccion I2C teclado.
Keypad_I2C kpd = Keypad_I2C( makeKeymap(keys), rowPins, colPins, ROWS, COLS, i2caddress );
void setup(){
Serial.begin(9600);
kpd.begin();
lcd.begin(16,2);// Columnas y filas de LCD
pinMode(LED13, OUTPUT);
// Humedad Temperatura.
dht.begin();
// Infrarojo.
pinMode(LED7, OUTPUT);
irrecv.enableIRIn();
// Radio Frecuencia.
// Inicializa IO y ISR
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
Serial.println("Recepcion");
vw_set_rx_pin(pin_de_recepcion);
vw_setup(2000); // Bits por segundo
vw_rx_start(); // Comienzo de recepción
}
void loop(){
infrarojo();
radiofrecuencia();
key = kpd.getKey();
if (key){
if (key == 'A'){ // Cambiar maximo.
introduce_maximo();
}
if (key == 'B'){ // Ver humedad.
ver_humedad();
}
if (key == 'C'){ // Ver temperatura.
temperatu = !temperatu;
temperatura_old = 99;
radiofrecuen = false;
}
if (key == 'D'){ // Ver RadioFrecuencia-Ultrasonido.
radiofrecuen = !radiofrecuen;
distancia_old = 123456;
temperatu = false;
}
}
if (temperatu){ver_temperatura();}
if (radiofrecuen){ver_radiofrecuencia();}
if (String(temperatura) >= maximo) {
digitalWrite(LED13, HIGH);
} else {
digitalWrite(LED13, LOW);
}
} // FIN loop.
////////////////////////////////////////
// Introduccion de datos de maximo.
void introduce_maximo() {
// maximo = "";
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("Valor maximo");
lcd.setCursor(0,1); // Siguiente renglón.
lcd.print(maximo);
maximo = "";
while (key != '#' )
{
key = kpd.getKey();
if (key){
maximo = maximo + key;
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("Valor maximo");
lcd.setCursor(0,1); // Siguiente renglón.
lcd.print(maximo);
delay(100);
}
}
}
///////////////////////////////////////////////////
///// Ver informacion humedad ///////////////////
void ver_humedad() {
lcd.clear(); // Borra pantalla
humedad = dht.readHumidity();
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("Humedad");
lcd.setCursor(0,1); // Siguiente renglón.
lcd.print(humedad);
delay(50);
}
///////////////////////////////////////////////////
///// Ver informacion temperatura ////////////////
void ver_temperatura() {
temperatura = dht.readTemperature();
if (temperatura != temperatura_old) { // Para que no parpadee.
temperatura_old = temperatura;
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("Temperatura");
lcd.setCursor(0,1); // Siguiente renglón.
lcd.print(temperatura);
delay(50);
}
}
///////////////////////////////////////////////////
///// Leer infrarojo ////////////////////////////
void infrarojo() {
if (irrecv.decode(&results)) {
Serial.println(results.value, DEC);
tecla=results.value; // Obtenemos el valor decimal de la tecla pulsada
//Serial.println(tecla);
if (tecla==12495){ // Código de la tecla 1
digitalWrite(LED7, HIGH);
}
if (tecla==6375){ // Código de la tecla 2
digitalWrite(LED7, LOW);
}
irrecv.resume(); // Receive the next value
}
delay(100);
}
///////////////////////////////////////////////////
///// Leer Radio Frecuencia //////////////////////
void radiofrecuencia() {
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
int i;
// Mensaje en el Monitor Serial
for (i = 0; i < buflen; i++)
{
Serial.print((char) buf[i]); // Salen los 6 caracteres
Serial.print(' ');
}
Serial.println();
//////////////// Los LED
// LED5
if(buf[0] == '0'){
digitalWrite(LED5,HIGH);
} else {
digitalWrite(LED5,LOW);
}
// LED6
if(buf[1] == '0'){
digitalWrite(LED6,HIGH);
} else {
digitalWrite(LED6,LOW);
}
// Obtiene el valor de la distancia.
int a, b, c, d;
a = 1000 * (buf[2] - 48);
b = 100 * (buf[3] - 48);
c = 10 * (buf[4] - 48);
d = 1 * (buf[5] - 48);
distancia = a + b + c + d;
Serial.print("Distancia ultrasonido = ");
Serial.println(distancia);
}
}
///////////////////////////////////////////////////
///// Ver radiofrecuencia en LCD ////////////////
void ver_radiofrecuencia() {
if (distancia != distancia_old) { // Para que no parpadee.
distancia_old = distancia;
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("Distancia (RF)");
lcd.setCursor(0,1); // Siguiente renglón.
lcd.print(distancia);
delay(50);
}
}
|
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
- Conexionado del emisor de Radio Frecuencia.
- El módulo de Radio Frecuencia entrega los datos al Arduino por el terminal 7.
- Cuando pulsemos los botones se enviará una señal al receptor para que encienda o apague los LED5 y LED6.
______________________________________________________
- Código para el Arduino emisor.
- Además de las librerías vistas anteriormente, para el módulo IR debemos cargar esta librería: IRremote.zip de Ken Shirriff.
Teclado_LCD_humedad_ir_rfe.ino |
// Juan Antonio Villalpando
// juana1991@yahoo.com
// kio4.com
#include <VirtualWire.h>
// Ultrasonido.
int Trigger = 11;
int Echo = 10;
long microsegundos;
long duracion;
#define pulsadorA 4
#define pulsadorB 5
int valorA, valorB;
char A, B;
int distancia;
const int pin_de_transmision = 7; // RF
void setup()
{
// Inicializa IO y ISR
vw_set_tx_pin(pin_de_transmision);
vw_setup(2000); // Bits por segundo
pinMode(pulsadorA, INPUT);
pinMode(pulsadorB, INPUT);
pinMode(Trigger, OUTPUT);
pinMode(Echo, INPUT);
Serial.begin(9600);
}
void loop()
{
ultrasonido();
valorA = digitalRead(pulsadorA);
valorB = digitalRead(pulsadorB);
// A y B son los valores de los botones.
if (valorA == HIGH) {
A='0';
} else {
A='1';
}
if (valorB == HIGH) {
B='0';
} else {
B='1';
}
// str es el valor de la distancia con 4 caracteres.
String str="";
str = "0000" + String(distancia); // Pasa el entero a String
str = str.substring(str.length()-4); // Siempre 4 caracteres
char msg[6] = {A, B, str[0], str[1],str[2], str[3]};
vw_send((uint8_t *)msg, 6); // Send: Aquí envía 6 elementos.
// Si está A y B en alto y la distancia en 546, enviará:
// 1 1 0 5 4 6
vw_wait_tx(); // Espera que termine el mensaje
delay(100);
}
/////////////////////////////////////////////
///////////FUNCION ULTRASONIDO //////////////
void ultrasonido(){
digitalWrite(Trigger, LOW);
delayMicroseconds(2);
digitalWrite(Trigger, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger, LOW);
delayMicroseconds(2);
duracion = pulseIn(Echo, HIGH);
distancia = duracion / 29 / 2;
Serial.println(distancia);
delay(50);
}
|
______________________________________________________
- Comentarios.
- Aconsejo leer los tutoriales anteriores:
25.- Ultrasonido. Medidor de distancia. (3.- Otro programa para medir distancias. Sin librería.)
27.- Comunicación por radio frecuencia.
- También este para ver cómo se conecta el pulsador.
3.- Pulsador.
--------------------------------------------------------------
- Código del receptor de Radio Frecuencia.
- Observa la manera de elegir la temperatura y la Radio Frecuencia.
if (key){
if (key == 'A'){ // Cambiar maximo.
introduce_maximo();
}
if (key == 'B'){ // Ver humedad.
ver_humedad();
}
if (key == 'C'){ // Ver temperatura.
temperatu = !temperatu;
temperatura_old = 99;
radiofrecuen = false;
}
if (key == 'D'){ // Ver RadioFrecuencia-Ultrasonido.
radiofrecuen = !radiofrecuen;
distancia_old = 123456;
temperatu = false;
}
}
if (temperatu){ver_temperatura();}
if (radiofrecuen){ver_radiofrecuencia();}
- El poner las variables -old, es para reducir el parpadeo, de esta manera solo mostrará información cuando ésta cambie.
______________________________________________________
______________________________________________________
________________________________
|