Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando
-- Tutorial de iniciación a Arduino --
Volver al índice del tutorial
____________________________
49BG.- Teclado 4x4, bus I2C. Pantalla LCD. Sensor de humedad y temperatura. Infrarojo. RadioFrecuencia. Reloj. Lluvia.
- A nuestro proyecto le añadimos un sensor de lluvia.
- Nos guiaremos por el tutorial:
43.- Interruptor. Sensor de detección de lluvia.
- Este sensor tiene salida digital por D0 y analógica por A0, solo utilizaremos la analógica A0.
- En el proyecto que estamos ya hemos tomado las teclas 'A', 'B', 'C', 'D', '#' y '*'.
_______________________
- Teclados y LED.
'A' - 'B' |
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 |
'*' |
Visualiza la hora en LCD. |
|
'A' - 'C' |
Modifica la lluvia máxima para encender el LED4 |
LED4 |
'0' |
Visualiza la lluvia en LCD. |
|
- Funcionamiento:
- Pulsamos las teclas 'A' y luego la 'C', elegimos un valor máximo de lluvia, lo terminamos con #, ejemplo: 7#
- Cuando el valor de lluvia llegue a ese valor, se encenderá el LED4.
______________________________________________________
- Conexionado.
- El sensor de lluvia tiene dos salidas, la analógica A0 y la digital D0, solo utilizaremos la analógica A0.
______________________________________________________
- Código para el Arduino.
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;
// Reloj RTC
#include <RTClib.h>
RTC_DS1307 RTC;
boolean reloj = false;
// Lluvia
#define LED4 4
int sensorA = A0;
int valorA_lluvia = 0;
int valorA_lluvia_2 = 0;
int valorA_lluvia_old = 1.5;
String maximo_lluvia = "5";
boolean lluvia = 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);
////pinMode(LED3, OUTPUT);
Serial.println("Recepcion");
vw_set_rx_pin(pin_de_recepcion);
vw_setup(2000); // Bits por segundo
vw_rx_start(); // Comienzo de recepción
// Reloj RTC
Wire.begin();
RTC.begin();
RTC.adjust(DateTime(__DATE__, __TIME__));
// Lluvia.
pinMode (LED4,OUTPUT);
}
void loop(){
infrarojo();
radiofrecuencia();
valorA_lluvia = analogRead(sensorA);
valorA_lluvia_2 = map(valorA_lluvia, 160, 1020, 10, 0);
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;
reloj = false;
lluvia = false;
radiofrecuen = false;
}
if (key == 'D'){ // Ver RadioFrecuencia-Ultrasonido.
radiofrecuen = !radiofrecuen;
distancia_old = 123456;
reloj = false;
temperatu = false;
lluvia = false;
}
if (key == '*'){ // Ver Reloj RTC.
reloj = !reloj;
lluvia = false;
temperatu = false;
radiofrecuen = false;
}
if (key == '0'){ // Ver lluvia
lluvia = !lluvia;
valorA_lluvia_old = 99;
reloj = false;
temperatu = false;
radiofrecuen = false;
}
}
if (temperatu){ver_temperatura();}
if (reloj){ver_reloj();}
if (lluvia){ver_lluvia();}
if (radiofrecuen){ver_radiofrecuencia();}
if (String(temperatura) >= maximo) {
digitalWrite(LED13, HIGH);
} else {
digitalWrite(LED13, LOW);
}
if (String(valorA_lluvia_2) >= maximo_lluvia) {
digitalWrite(LED4, HIGH);
} else {
digitalWrite(LED4, LOW);
}
} // FIN loop.
///////////// FUNCIONES ///////////////////////////
///////////////////////////////////////////////////
///// Introduccion de datos de maximo. ///////////
void introduce_maximo() {
// maximo = "";
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("Pulsa B o C");
lcd.setCursor(0,1); // Siguiente renglón.
lcd.print(maximo);
maximo = "";
maximo_lluvia = "";
// Dos teclas.
while (key != 'B' && key != 'C' && key != '#') { // '#' para salir
Serial.println("Introduce otra tecla.");
delay(50);
key = kpd.getKey();
Serial.print(key);
}
if (key == 'B'){ // Establecer temperatura.
while (key != '#' )
{
key = kpd.getKey();
if (key){
maximo = maximo + key;
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("Temperat. maxima");
lcd.setCursor(0,1); // Siguiente renglón.
lcd.print(maximo);
delay(100);
}
}
}
if (key == 'C'){ // Establecer lluvia.
while (key != '#' )
{
key = kpd.getKey();
if (key){
maximo_lluvia = maximo_lluvia + key;
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("Lluvia maxima");
lcd.setCursor(0,1); // Siguiente renglón.
lcd.print(maximo_lluvia);
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 del potenciómetro
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);
}
}
///////////////////////////////////////////////////
///// Ver Reloj RTC en LCD ///////////////////////
void ver_reloj() {
DateTime now = RTC.now();
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
lcd.setCursor(0,1); // Siguiente renglón.;
lcd.print(now.hour(), DEC);
lcd.print("/");
lcd.print(now.minute(), DEC);
lcd.print("/");
lcd.print(now.second(), DEC);
delay(200);
}
//////////////////////////////////////////////////
/////// Ver lluvia en LCD ///////////////////////
void ver_lluvia() {
valorA_lluvia = analogRead(sensorA);
valorA_lluvia_2 = map(valorA_lluvia, 160, 1020, 10, 0);
if (valorA_lluvia_2 != valorA_lluvia_old) { // Para que no parpadee.
valorA_lluvia_old = valorA_lluvia_2;
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print("Lluvia");
lcd.setCursor(0,1); // Siguiente renglón.
valorA_lluvia_2 = map(valorA_lluvia, 160, 1020, 10, 0);
lcd.print(valorA_lluvia_2);
delay(50);
}
}
|
______________________________________________________
- Comentarios.
- Observamos la manera de elegir temperatura, radiofrecuencia, reloj y lluvia.
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;
reloj = false;
lluvia = false;
radiofrecuen = false;
}
if (key == 'D'){ // Ver RadioFrecuencia-Ultrasonido.
radiofrecuen = !radiofrecuen;
distancia_old = 123456;
reloj = false;
temperatu = false;
lluvia = false;
}
if (key == '*'){ // Ver Reloj RTC.
reloj = !reloj;
lluvia = false;
temperatu = false;
radiofrecuen = false;
}
if (key == '0'){ // Ver lluvia
lluvia = !lluvia;
valorA_lluvia_old = 99;
reloj = false;
temperatu = false;
radiofrecuen = false;
}
}
if (temperatu){ver_temperatura();}
if (reloj){ver_reloj();}
if (lluvia){ver_lluvia();}
if (radiofrecuen){ver_radiofrecuencia();}
- Los números 99, los he puesto para que cada vez que entre en esa opción tenga un valor distinto al que tenía y pueda visualizarse.
- La comparación con el valor old es para que solo parpadee en el momento que cambia un valor.
valorA_lluvia = analogRead(sensorA);
valorA_lluvia_2 = map(valorA_lluvia, 160, 1020, 10, 0);
if (valorA_lluvia_2 != valorA_lluvia_old) { // Para que no parpadee.
- He mapeado el sensor de lluvia, da unos valores comprendido entre 1020 cuando esté seco y unos 160 cuando esté totalmente mojado, los mapeamos de 0 a 10.
______________________________________________________
______________________________________________________
________________________________
|