miércoles, 16 de agosto de 2017

Kit sensores arduino 37+1

Kit sensores 

En algunas tiendas online especializadas podemos adquirir este kit de sensores para proyectos de electrónica que, la verdad, están bastantes bien tanto en precio, como en componentes:



Se echa en falta otros sensores, como son los de proximidad, pir, presión, etc..,

Lo verdaderamente complicado aquí es que cuando te llega, en algunos casos no tienes ninguna instrucción del funcionamiento de cada sensor.

Pues bíen, aquí tenemos un documento en pdf con la descripción de cada sensor, y el sketch y librerías para usarlo con arduino (y en castellano):

Kit sensores arduino 37+1.pdf

viernes, 11 de agosto de 2017

Sistema de vigilancia para el hogar con Wemos

Introducción

Al irme de vacaciones dejé en casa a un vigilante fiel que no duerme, ni come, ni bebe, y además me avisa en cuanto detecta movimiento, una idea muy simple y a la vez fácil de realizar. Vamos allá.


Elementos de hardware


Wemos D1 R2
PIR HC-SR501
Fuente alimentacion 9v 1a
Cables Jumpers macho-hembra
Conexión a internet


Configurando PIR HC-SR501:

El PIR es un elemento muy sensible a los cambios de radiación infrarroja y en cuanto hay un ligero cambio de temperatura en el ambiente lo detecta. Esto incumbe a las personas, animales cualquier elemento que desprenda calor, y a la vez, se mueva.

En esta imagen tenemos un jumper la cual tiene dos posiciones, L y H, (parte inferior izquierda), en el caso de la imagen está en la posicion L, yo lo tengo en la posición H. La posición H es para la mayoría de los casos.
Tenemos también lo pines de conexión, los cuales se ven claramente, power es a 5v (puede operar entre 5 y 20 voltios), masa y el pin central que es el de señal.
Los dos potenciómetros que tenemos en la parte inferior, uno es para ajustar la sensibilidad y otro para ajustar el tiempo de retardo, o sea el tiempo que pasa desde que detecta hasta que envía la señal. Para ajustarlos hay que girar en el sentido de las agujas del reloj. En mi caso los dos los he dejado al mínimo.


Datasheet HC-SR501


Elementos de software


IDE de Arduino
App Telegram

Configurando IDE de Arduino:

El IDE de Arduino no trae de manera nativa las placas wemos esp8266, por tanto hay que instalar las librerías. Para ello vamos a:
archivo/preferencias/gestor de URLs Adicionales de Tarjetas ponemos:"http://arduino.esp8266.com/stable/package_esp8266com_index.json", sin las comillas, damos a los recuadros de la derecha y aceptar.
Nos vamos a herramientas/gestor de tarjetas, buscamos ESP8266  e instalamos el plugin. Nos instalará todas las placas basadas en el chip ESP8266.
Este tutorial plugin ESP8266 os ayudará.

Configurando Telegram:

A.- Nos descargamos la aplicación Telegram de mensajería en el dispositivo que sea, yo lo hice en el móvil.
B.- Abrimos Telegram y seguimos las instrucciones de instalación como cualquier otra aplicación de mensajería, es fácil.
C.- Una vez que está la aplicación operativa seguimos estos pasos:
            1.- Escribimos "BotFather", sin las comillas, y establecemos comunicación
            2.- Escribimos "/start", sin las comillas
            3.- Escribimos "/newbot" sin las comillas y nos pedirá el nombre publico y de usuario del bot, por ejemplo, escribimos Duino, y si lo acepta volvemos a escribir Duino_bot.
            4.- Si no dá por valido el nombre nos envía un código muuuuy largo que es el que vamos a usar en nuestro sketch (no perder el código).
            5.- Para entrar en nuestro bot, pulsamos en el enlace marcado de azul donde está el nombre de nuestro bot.
            6.- Aquí os dejo este tutorial, con ilustraciones para saber un poco más.

Esquema







Wemos 5v-pin 5v PIR
Wemos GND-GND PIR
Wemos Pin D2- Pin señal PIR (el pin central)

Fácil ehhh!!!😜

Código


//Librerías
#include <ESP8266WiFi.h>
#include <SPI.h>
#include <TelegramBot.h>

//Definiciones
byte sensorPin = 4; // Pin para el sensor de movimiento
byte movimiento = 0; // Variable para activar alarma
byte sinmovimiento = 0; // Resetea el contador a 0 cuando no hay movimiento durante un tiempo
int repiteloop = false;
const char* BotToken = "111111111:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";// Código de Telegram se obtiene configurando el Bot
const char* ssid = "mired";
const char* password = "mipassword";
WiFiClientSecure client;
TelegramBot bot(BotToken, client);

void setup() {
  Serial.begin(9600);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop()
{

  message m = bot.getUpdates(); // A la espera de nuevos mensajes de Telegram

  // Si el mensaje es Alarmaon se activa la alarma, es sensible a mayúsculas
  if (m.text.equals("Alarmaon"))
  {

    Serial.println("Mensaje recibido se activa la alarma");
    bot.sendMessage(m.chat_id, "La Alarma está preparada y lista.");
    movimiento = 0;
    repiteloop = false;

    while (!repiteloop)
    {
      byte state = digitalRead(sensorPin);

      if (state == 1) {
        Serial.println("Se ha detectado movimiento!");
        delay(3000);
        movimiento++;
        Serial.println(movimiento);
      }
      else if (state == 0) {
        delay(3000);
        sinmovimiento++;
        Serial.println("Sin movimiento!");
      }

      // Se resetea el contador de movimientos si no hay movimiento continuo
      if (sinmovimiento == 10) {
        sinmovimiento = 0;
        movimiento = 0;
      }

      // Se activa la alarma y se envía el mensaje a Telegram

      if (movimiento == 1)
      {
        bot.sendMessage(m.chat_id, "Alarma Duino activada por movimiento!!"); //Mensaje de alerta Telegram  
      }
      
      movimiento = 0; // Variable de movimientos vuelve a cero
      message m = bot.getUpdates(); // Leer nuevos mensajes de Telegram
      if (m.text.equals("Alarmaoff"))
      {
        repiteloop = true;
        Serial.println("Mensaje recibido, se apaga la alarma.");
        bot.sendMessage(m.chat_id, "La Alarma está desactivada.");
      }
    }
  }

  else if (m.text.equals("Alarmaoff"))
  {
    Serial.println("Mensaje recibido, se apaga la alarma.");
    bot.sendMessage(m.chat_id, "La Alarma está desactivada.");
    repiteloop = false;
  }

} 


En la línea nº 7, definimos como pin de entrada de la señal del PIR el pin 4, en cambio en el esquema lo ponemos en el pin D2. Resulta que es correcto y para saber la correspondencia entre los pines de arduino y wemos tenemos este esquema:

En las lineas, 11, 12 y 13 cambiamos a nuestro código bot de Telegram (token), nombre de nuestra red y contraseña de nuestra red wifi respectivamente.

Instrucciones de funcionamiento

Desde nuestra aplicación Telegram accedemos a nuestro bot como un contacto más y sólo atiende a dos instrucciones:
-Alarmaon
-Alarmaoff
¡¡Importante!!: distingue entre mayúsculas y minúsculas

Nuestro bot nos devolverá:
-La Alarma está lista y preparada
-La Alarma está desactivada
respectivamente.

En el caso que la alarma está activada y nuestro vigilante Duino detecta movimiento, nuestro bot nos envía un mensaje que dice:
-Alarma Duino activada por movimiento

En el caso de que la alarma esté desactivada se encuentra a la espera de ser activada.

Notas

Este proyecto, además de la utilidad que tiene, podemos dar alas a nuestra imaginación y hacer lo que se nos ocurra, ya que el bot creado es una herramienta muy potente para poder comunicarnos con la máquina. Por ejemplo:
-hacer un sistema de vigilancia mas completo que al mismo tiempo nos envíe la foto de caco
-mandar ordenes a distancia para que nos encienda la luz, o el aire acondicionado
-enviar datos de sensores a distancias previa petición
-etc....


Enlaces

Sketch alarma movimiento
Libreria Telegram




domingo, 19 de febrero de 2017

Estación Meteorológica

Introducción

Algunos de los proyectos Arduino más comunes e interesantes son las estaciones meteorológicas, pues con ciertos sensores obtenemos información de primera mano en tiempo real. Los proyectos de este tipo van desde un sensor de temperatura hasta múltiples sensores como son de humedad, presión, velocidad del viento, brújula, sensor de lluvia, pluviómetros, etc.., todo lo que a uno se le pueda ocurrir. Al mismo tiempo registrar todos los datos obtenidos en una base de datos o en una tarjeta sd.
En este proyecto nos vamos a centrar sólo en datos de temperatura, humedad y presión relativa.
La presión relativa es aquella que sea cual sea la altitud que estemos, el sensor nos indicará la presión atmosférica que tendríamos si estuviéramos al nivel del mar, pues la presión cambia con la altitud y temperatura. ¿Y porqué esto?, pues porque así tendríamos referencia con los mapas del tiempo, pues la presión que nos publican son en superficie, o sea, al nivel del mar.


Componentes

Protoboard
Arduino Uno o similar
Fuente alimentación 9V 1A
Fuente alimantacion protoboard
Sensor temperatura humedad DHT22
Sensor presión BMP180
Cables jumpers
Lcd 1602 I2C

Esquema

Conexionado y código:



Código:

#include <Wire.h>
#include <SFE_BMP180.h>
#include "DHT.h"
#include <LiquidCrystal_I2C.h>

#define DHTPIN 2
#define DHTTYPE DHT22
#define ALTITUDE 212.0 // definimos nuestra altitud sobre el nivel del mar

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
DHT dht(DHTPIN, DHTTYPE);
SFE_BMP180 pressure;

void setup() {
  Serial.begin(9600);
  lcd.begin(16,2);
  dht.begin();
  Wire.begin();
  if (pressure.begin())
    Serial.println("BMP180 iniciado");
  else {
    Serial.println("fallo en BMP180");
    while (1);
  }
  lcd.clear();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  char status;
  double T, P, p0, a;

  lcd.setCursor(0,0);
  lcd.print("T: ");
  lcd.print(t,1);
  lcd.setCursor(9,0);
  lcd.print("H: ");
  lcd.print(h,1);

  status = pressure.startTemperature();
  if (status != 0) {
    delay(status);
    status = pressure.getTemperature(T);
    if (status != 0) {
      Serial.print("OK");
      status = pressure.startPressure(3);
      if (status != 0) {
        delay(status);
        status = pressure.getPressure(P, T);
        if (status != 0) {
          Serial.print("OK");

          p0 = pressure.sealevel(P, ALTITUDE);
          lcd.setCursor(0,1);
          lcd.print("Pr: ");
          lcd.print(p0, 1);
          lcd.print(" mb");

          a= pressure.altitude(P,p0);
          Serial.print("OK");
        } else Serial.println("error");
      } else Serial.println("error");
    } else Serial.println("error");
  } else Serial.println("error");
  delay (2000);
}


Notas:

En ALTITUDE definimos la altura sobre el nivel del mar que nos encontramos. Esta información la podemos obtener de cualquier smartphone con GPS.


Enlaces:


Fotos: