Alarma con estación meteorológica


También decidió utilizar un servidor MQTT para subir esta información en la web por lo que se puede desde cualquier lugar, tener un vistazo a la información meteorológica captada por este prototipo.

Elementos del montaje:

  1. nodeMCU (regulador Micro,  versión 0.9)
  2. Pantalla LCD – 16 x 2
  3. Botones – 3
  4. Sensor de temperatura DHT11
  5. Timbre o zumbador
  6. Placa de prototipos tamaño  mini
  7. Cables de puente
  8. Resistencia de 1000 Ω – 3
  9. Caja de madera para montar todas las cosas dentro.

Asignación de pines y planificación

Bien, así que vamos a hablar acerca de cómo tenía que distribuir los pasadores entre todos los componentes.

La pantalla LCD

La pantalla LCD,  necesita al menos 6 pines de I/O interfaz con el microcontrolador. Puede darse como sigue: Habilitar, register select, D04, D05, D06 D07.

  • Enable – pin I/O digital 0
  • Seleccione Registro – pin I/O digital 1
  • D04 – pin I/O digital 2
  • D05 – pin I/O digital 3
  • D06 – pin I/O digital 4
  • D07 – pin I/O digital 5

Los botones

Hay tres botones que vamos a usar, por lo queo bviamente  necesitaríamos tres pins de I/O digitales,

  • LeftButton – pin I/O digital 6
  • CenterButton – pin I/O digital 7
  • RightButton – pin I/O digital 8

El zumbador

El puede ser conectado al pin I/O digital 9.

El sensor de temperatura DHT11

Este sensor tiene un pin de salida y sigue para el pin de I/O digital 10

 

Ensamblaje

En una caja de madera ser practican agujeros para el lcd  y lo botones y entonces es hora de montar todo dentro de esa caja.

  1. Creo que tenemos que empezar con los botones. Usé un palito de helado estrecho para hacer una base para los botones.
  2. Luego tomar el nodeMCU y las placa de prototipos y pegarloo a la base de la caja con cinta de doble cara.
  3. Entonces conectar los botones a los pines de I/O digitales apropiados.
  4. En tercer lugar, colocar  la pantalla LCD y luego agarrarla bien a la caja con algunas cintas desde el interior. .
  5. Hacer las conexiones de la pantalla LCD.
  6. Luego conectar el timbre o buzzer en el interior de la caja con cinta de doble cara y conectar su terminal positivo al pin digital 9
  7. El sensor DHT11 tiene tres piness: 5v, gnd y la salida. Por lo tanto el pin de salida irá al pin digital 10 de la nodeMCU . 5v y tierra son obvias dónde deben ir.
  8. También para agregar, DHT11 es lo único que se quedará fuera de la caja para detectar la temperatura exterior. .

 

El código

El código qeu ha escrito Techovator0819      es cerca de 450 líneas de longitud. y cuenta  con  algunas bibliotecas importantes que se necesitan para descargar  asi que lo primero es asegúrarse de tener el IDE de Arduino instalado asi como tener los drivers del  esp8266 instaladas también. Si no lo ha hecho, haga clic aquí.

El primer paso antes de ver  el código, es entender la funcionalidad de nuestro dispositivo y el código en consecuencia:

  • Nestro WB(weather box)  accede a internet y recupera la información de tiempo apropiado a través de una llamada a la API.
  • También  tomara  la temperatura del medio ambiente  con un sensor propio y enviara esa información a un corredor de MQTT.
  • También podría mantener alarmas y temporizadores para usted.
  • También es capaz de mostrar hora y fecha.

Todo , esto significa que necesitamos integrar todas estas funciones bajo un título o código.

¿Cuáles son las bibliotecas que necesitamos?

  1. Librería LiquidCrystal . Como estamos usando una pantalla LCD como la principal interfaz entre usted y el NodeMCU, esta biblioteca es indispensable. Paranuestra comodidad, esta biblioteca, por defecto, es una biblioteca integrada en el IDE de Arduino.
  2. Biblioteca de ESP8266WiFi . Esta biblioteca permite el ESP8266 conectar con el Wifi y tener acceso a internet. Esta librería viene en un paquete que debe descargar durante la instalación del ESP8266 en el administrador de la placa.
  3. Biblioteca de ArduinoJson . Cuando se llama a la API, los datos que usted recibirá estaran en formato JSON (JavaScript Object Notation). Así que si quiere convertirlo a un formato utilizable, necesita analizarlo. Y la biblioteca de ArduinoJson lo hace por nosotros.
  4. Biblioteca para el sensor DHT11.
  5. Biblioteca en tiempo de. Para mantener a nuestro tiempo. Las funciones de biblioteca se enumeran aquí.
  6. Biblioteca de TimeAlarms . Se utiliza para que nos establezcan alarmas y temporizadores. Las funciones de biblioteca se enumeran aquí.

Las dos últimas bibliotecas deben utilizarse juntos. Puede usar la biblioteca en tiempo de forma independiente pero no de la biblioteca de TimeAlarms.


La llamada de API

 

The API Call

 

 

 

 

Lo más importante es una llamada a la API es la API key. Estoy conectando a la página web openweathermap.org para obtener toda la información de tiempo. Así que hay que seguir el procedimiento para abrir una cuenta allí y obtener un API key y es absolutamente gratis. Para llamar a la API key,
El primer paso es conectarse al servidor.

En segundo lugar, usted necesita utilizar su API key en la URL.Usted deberá utilizar el método GET para recuperar los datos de la URL.

Para hacer los datos disponibles en un formato utilizable,necesita para luego almacenar los datos en una cadena.

Los datos que reciba serán en formato JSON. Así que hay que analizarlo.

Y luego, se almacenan la información deseada en algunas variables globales que se pueden utilizar en cualquier lugar en el código.

     El siguiente es un ejemplo de código  para demostrar cómo funciona. Esta parte básicamente declara las bibliotecas utilizadas, crea las variables y objetos de la biblioteca a consultar.

include <ArduinoJson.h>
#include <ESP8266WiFi.h>
String result; 
// la cadena en la que se almacenarán los datos después de la llamada a la API
char servername[]="api.openweathermap.org"; //mombre servidor
String APIKEY = "YOUR_API_KEY"; //el API key
String CityID = "1264527"; //el  ID de la ciudad

//Asignación de sus variables globales para almacenar la información meteorológica recibida
String Description;
String Place;
float Temperature;
float Humidity;
float w;
WiFiClient client; >

Código de configuración básica.

void setup()

{

// Ponga su código de configuración aquí, para ejecutar una vez:
Serial.begin(9600);
WiFi.begin(“your ssid”, “your password”);

//empieza  conexion WIFI
while(WiFi.status() != WL_CONNECTED)

{

// espera hasta que se establezca la conexión
Serial.print(“.”);
delay(500);
}
Serial.println(“Connectado!”);
Serial.println(WiFi.localIP());   //imprime direccion  IP
}<

Código para crear una función que obtiene los datos.

void weatherData(){

if (client.connect(servername, 80)) {

// inicia la conexión del cliente, comprueba la conexión
client.println(“GET /data/2.5/weather?id=”+CityID+”&units=metric&APPID=”+APIKEY);

//// llama a la api usando el método get antes de la URL. Nota: La URL utiliza la clave api.
Serial.println(“Server esta accesible”);
client.println();
}
else { //  si el servidor no esta disponible
Serial.println(“fallo de conexion  “); //mensaje de errorsi no esta conectado el cliente
Serial.println();
}
result = “”;

//Hace que la cadena nula de cualquier dato almacenado previamente para almacenar nuevos datos
while (client.available()) { //connected or data available
char c = client.read(); //gets byte from ethernet buffer
result = result+c;
}
Serial.println(result);
result.replace(“[“, ” “);

//Estoy enfrentando un error. Sólo para evitarlo, tengo que escribir esto
result.replace(“]”, ” “);

//y esto tambien.
client.stop(); //para  cliente
Serial.println(“Recieved”);

//Analiza la cadena llamada resultado

StaticJsonBuffer<1024> jbuff;

JsonObject &root = jbuff.parseObject(result);
if (!root.success())
{
Serial.println(“parseObject() failed”);
}

// almacena toda la información deseada en variables temporales.
String location = root[“name”];
float temperature = root[“main”][“temp”];
float humidity = root[“main”][“humidity”];
String description = root[“weather”][“description”];
float wind = root[“wind”][“speed”];

//Transfiere toda la información de las variables temporales a variables globales a las //que puede acceder en cualquier parte del código.
Place = location;
Temperature = temperature;
Humidity = humidity;
w = wind * 3.6;
Description = description;
}

La función de bucle para mostrar todo lo que te quieren en el monitor serie.

void loop() {

weatherData(); //Llama a la función que hemos discutido anteriormente
Serial.println(Temperature);
Serial.println(Place);
Serial.print(“H: “);
Serial.println(Humidity);
Serial.print(w);
Serial.println(” kmph”);
Serial.println(Description);
delay(8000); //retardo de  8 segundos
}

Como vemos  es un ejemplo básico de una llamada a la API y el análisis de datos JSON.

 

MQTT cliente y agente

 

MQTT Client and Broker

 

 

Como hemos visto en este blog el autor h aoptado  por el frameworl Cayyene de MyDevices para salvar la informacion procedente del sensor DHT11

one.jpg

 

 

two.jpg

 

 

 

 

four.jpg

 

 

five.jpg

 

 

Como vemos va  subiendo nuestros datos de los sensores a un corredor de MQTT en internet por lo que podemos ver desde cualquier lugar.
Pesonalmente pienso que el tablero de instrumentos del Cayenne es el más conveniente así queno me sorprende que el autor lo hay usado
Resumidamente esto son los pasos  para usar el servicio
  • En primer lugar, debe crear una cuenta.
  • Después de haber conectado la placa a Cayena se le dirigirá automáticamente a la consola donde se pueden utilizar los widgets personalizados disponibles.
  • Asegúrese de especificar correctamente el canal y corresponden a ese canal para enviar datos en el código.
  • Después de que hayas hecho eso, cree un nuevo proyecto y arrastrar y soltar widgets como de sus dispositivos.
  • El siguiente es un código de ejemplo para que comprendas cómo Protocolo MQTT. También utilizaremos la biblioteca Cayena-MQTT-ESP8266 para hacer las cosas mucho más fácil para nosotros.
    <#include 
    
    char ssid[] = "ssid";
    char wifiPassword[] = "wifiPassword";
    
    char username[] = "MQTT_USERNAME";
    
    char password[] = "MQTT_PASSWORD";
    char clientID[] = "CLIENT_ID";
    
    void setup() {
    
      Serial.begin(9600);
      Cayenne.begin(username, password, clientID, ssid, wifiPassword);
    }
    
    void loop() {
    
     Cayenne.loop(); //this function must be called regularly to keep the connection stable
      float sensorInfo = analogRead(A0);
      Cayenne.virtualWrite(0, sensorInfo); //virtualWrite(channel, data) is function with two parameters. Channel - you want to send the data to and second parameter is the data itself.
    }
  • Después de eso, usted será capaz de enviar y recibir datos sin problemas. Para este , se ha usado sólo dos widgets icono es decir ‘temperatura’ y ‘humedad’.
  • Después de crear una cuenta, haga clic en ‘Add New’.
  • A continuación, haga clic en ‘Dispositivo/Widget’Haga clic en “Traiga su propia cosa”, que es en la parte inferior.Una nueva página aparecerá indicando su nombre de usuario MQTT, contraseña y el ID de cliente que son únicas para usted. Estos se aplicarán en el código para identificar el dispositivo.

Estructura del código final

La longitud total del código es alrededor de 550 líneas.

El código está dividido en dos secciones. Una PageDisplay y otra DecMaker (abreviatura de decisiones). Cada vez que usted pulsa cualquier botón, basado en que (derecha o izquierda), la pantalla mostrará esa página. Cuando en página y el centerButton, el código se moverá a la DecMaker. Dentro de la función DecMaker y basado en qué página estaba finalmente abierta, ejecutará las acciones correspondientes. Puede recibir datos meteorológicos, sensores, alarmas y temporizadores.

Las páginas se muestran según los modos. Los modos son cuatro. Pueden ser,

  1. Inicio modo: para obtener los datos meteorológicos y visualizarlos. Así como percibir el entorno.
  2. Modo set timer – establecer temporizadores para usted
  3. Modo de programar la alarma – establecer alarmas para que usted
  4. Panel de control – cuando tu no en cualquiera de los modos, prefiere podría quedarse en el tablero de instrumentos.

A continuación, vamos a hablar sobre el sketch principal 

Paso 9: El código principal

El siguiente es el código principal.

Para descargar el código, haga clic aquí.

LiquidCrystal lcd(16, 5, 4, 0, 2, 14);
#define rightButton 13
#define centerButton 15
#define leftButton 12
#define buzz 3
int page = 1;
byte leftArrow[8]
{ B00000,
 B00010,
 B00110,
 B01110,
 B11110,
 B01110,
 B00110,
 B00010
};
byte rightArrow[8]{
 B00000,
 B01000,
 B01100,
 B01110,
 B01111,
 B01110,
 B01100,
 B01000
};
byte line[8]
 { B00110,
 B00110,
 B00110,
 B00110,
 B00110,
 B00110,
 B00110,
 B00110
};
String result;
char servername[]="api.openweathermap.org";
String APIKEY = "Your Api key";
String CityID = "Your city ID";</p><p>String Description;<br>String Place;
float Temperature;
float Humidity;
float w;
WiFiClient client;
dht DHT;#define pin 1
int set=1; // for configuring the alarm
int a, b, c; // used to denote the hour, minute and second while setting an alarm</p>
char username[] = "MQTT_username";<br>char password[] = "MQTT_password";
char clientID[] = "Client ID";

void setup() {
 // put your setup code here, to run once:
 Serial.begin(9600);
 WiFi.begin("ssid", "password");
 lcd.print("Weather box");
 delay(2000);
 lcd.clear();
 if (WiFi.status() == WL_CONNECTED){
 Cayenne.begin(username, password, clientID);
 lcd.print("Connected!");
 delay(3000);
 lcd.clear();
 Serial.println(WiFi.localIP());
 } else {
 lcd.print("Not conn");
 delay(3500);
 }
 lcd.clear();
 lcd.begin(16, 2);
 lcd.createChar(0, leftArrow);
 lcd.createChar(1, rightArrow);
 lcd.createChar(3, line);
 
 pinMode(rightButton, INPUT);
 pinMode(centerButton, INPUT);
 pinMode(leftButton, INPUT);
 pinMode(buzz, OUTPUT);
 digitalWrite(buzz, LOW);
 
 setTime(15, 12, 50, 25, 5, 17);
 delay(1000);
}
int val = 1;
int x,y; //for setting timer minutes and seconds
int trig; //for coniguring the timer
int counter = 0;
void loop() {
 // put your main code here, to run repeatedly:
 while(val == 1){
 if (digitalRead(leftButton)==HIGH)
 { val = 0;}
 lcd.clear();
 lcd.print(hour());
 lcd.print(":");
 lcd.print(minute());
 lcd.write(byte(3));
 lcd.print("WiFi:");
 if (WiFi.status() == WL_CONNECTED){
 lcd.print("conn"); } 
 else {
 lcd.print("Nconn");} 
 lcd.setCursor(0, 1);
 lcd.write(byte(0));
 lcd.print("Menu");
 lcd.write(byte(3));
 
 if (digitalRead(centerButton)){
 DHT.read11(pin);
 lcd.print("T:");
 int a = DHT.temperature; //converting float to int
 lcd.print(a);
 int b = DHT.humidity; // converting float to int
 lcd.print(" H:");
 lcd.print(b);
 delay(3000);
 }else {
 date();
 }
 counter++;
 if (counter == 60){
 if (WiFi.status()==WL_CONNECTED){
 Cayenne.loop(); 
 DHT.read11(pin); 
 Cayenne.virtualWrite(1, DHT.temperature);
 Cayenne.virtualWrite(2, DHT.humidity); 
 } 
 counter = 0;
 }
 delay(50);
 }
 while (val != 1){
 delay(200);
 pageDisplay();
 if (digitalRead(rightButton)){
 if (page == 4){
 page = page;
 } else {
 page++;
 }
 pageDisplay();
 
 } else if (digitalRead(leftButton)){
 if (page == 1){
 page = page;
 } else {
 page--;
 }
 pageDisplay();
 
 } else if (digitalRead(centerButton)== HIGH){
 decMaker();
 }
 }
}
void pageDisplay()
{ switch(page){
 case 1:
 lcd.clear();
 lcd.setCursor(6, 0);
 lcd.print("Home");
 lcd.setCursor(15, 0);
 lcd.write(byte(1));
 break;
 case 2:
 lcd.clear();
 lcd.write(byte(0));
 lcd.setCursor(3, 0);
 lcd.print("Set Timer");
 lcd.setCursor(15, 0);
 lcd.write(byte(1));
 break;
 case 3: 
 lcd.clear();
 lcd.write(byte(0));
 lcd.setCursor(3, 0);
 lcd.print("Set Alarm");
 lcd.setCursor(15, 0);
 lcd.write(byte(1));
 break;
 case 4:
 lcd.clear();
 lcd.write(byte(0));
 lcd.setCursor(3, 0);
 lcd.print("Dash Board");
 break;
 default:
 lcd.clear();
 lcd.print("Error 002");
 break;
 }
}
void date(){
 lcd.print(day());
 lcd.print(" ");
 int a = month();
 switch(a){
 case 1:
 lcd.print("Jan");
 break;
 case 2:
 lcd.print("Feb");
 break;
 case 3:
 lcd.print("Mar");
 break;
 case 4:
 lcd.print("Apr");
 break;
 case 5:
 lcd.print("May");
 break;
 case 6:
 lcd.print("Jun");
 break;
 case 7:
 lcd.print("Jul");
 break;
 case 8:
 lcd.print("Aug");
 break;
 case 9: 
 lcd.print("Sep");
 break;
 case 10:
 lcd.print("Oct");
 break;
 case 11:
 lcd.print("Nov");
 break;
 case 12:
 lcd.print("Dec");
 break;
 default:
 lcd.print("005");
 }
 if (day()<10){
 lcd.print(" ");
 }
 lcd.print(year());
 }
void decMaker(){
 switch(page){
 case 1:
 lcd.clear();
 lcd.print(". . .");
 weatherData(); 
 lcd.clear();
 while (digitalRead(leftButton) == LOW){
 weatherData();
 digitalRead(leftButton);
 lcd.setCursor(6, 0);
 lcd.print("IST:");
 lcd.setCursor(5, 1);
 lcd.print(hour());
 lcd.print(":");
 lcd.print(minute());
 delay(3000);
 lcd.clear();
 lcd.print("Wthr in ");
 lcd.print(Place);
 lcd.setCursor(0, 1);
 lcd.print("T:");
 lcd.print(Temperature);
 lcd.setCursor(9, 1);
 lcd.print("H:");
 lcd.print(Humidity);
 delay(3000);
 lcd.clear();
 digitalRead(leftButton);
 lcd.print("Wind: ");
 lcd.print(w);
 lcd.print("kmph");
 lcd.setCursor(0, 1);
 lcd.print(Description);
 delay(2000);
 lcd.clear();
 DHT.read11(pin);
 lcd.print("Room: ");
 lcd.setCursor(0, 1);
 lcd.print("T:");
 lcd.print(DHT.temperature);
 lcd.setCursor(9, 1);
 lcd.print("H:");
 lcd.print(DHT.humidity);
 delay(2000);
 lcd.clear();
 }
 lcd.begin(16, 2); // In my case the lcd doesn't work without this. But don't know why.
 break;
 case 2:
 setTimer();
 break;
 case 3:
 setAlarm();
 Serial.print("THREE");
 lcd.begin(16, 2);
 break;
 case 4:
 Serial.print("FOUR");
 val = 1;
 break;
 default:
 Serial.print("not a valid entry");
 lcd.clear();
 lcd.print("error 001");
 break;
 }
}
void weatherData()
{ if (client.connect(servername, 80)) 
{ //starts client connection, checks for connection
 client.println("GET /data/2.5/weather?id="+CityID+"&units=metric&APPID="+APIKEY);
 Serial.println("Server is accessable");
 client.println();
 } 
 else {
 Serial.println("connection failed"); //error message if no client connect
 Serial.println();
 }
 result = "";
 while (client.available()) { //connected or data available
 char c = client.read(); //gets byte from ethernet buffer
 result = result+c;
 }
 result.replace("[", " ");
 result.replace("]", " ");
 client.stop(); //stop client
 Serial.println("Recieved");
 
 StaticJsonBuffer<1024> jbuff;
 JsonObject &root = jbuff.parseObject(result);
 if (!root.success())
 {
 Serial.println("parseObject() failed");
 }
String location = root["name"];
 float temperature = root["main"]["temp"];
 float humidity = root["main"]["humidity"];
 String description = root["weather"]["description"];
 float wind = root["wind"]["speed"];
Place = location;
 Temperature = temperature;
 Humidity = humidity;
 w = wind * 3.6;
 Description = description;
}
void alarm()
{ Serial.println("Alarm activated");
 lcd.clear();
 lcd.print("Wake up, Lazy");
 for (int i = 0; i <= 10; i++){
 digitalWrite(buzz, HIGH);
 delay(80);
 digitalWrite(buzz, LOW);
 delay(80);
 digitalWrite(buzz, HIGH);
 delay(80);
 digitalWrite(buzz, LOW);
 delay(800);
 }
 digitalWrite(buzz, LOW);
 set = 0;
}
void setAlarm(){
 set = 1;
 int pos = 1;
 a, b, c = 0;
 repeat:
 //timeDisplay();
 lcd.clear(); 
 lcd.setCursor(0, 0); 
 lcd.print(a); 
 lcd.print(":");
 lcd.print(b); 
 lcd.print(":");
 lcd.print(c); 
 lcd.setCursor(0, 1);
 if (pos == 1){ lcd.print("hours");}
 else if (pos == 2){ lcd.print("minutes");}
 else if (pos == 3){lcd.print("seconds");}
 delay(200);
 if (digitalRead(leftButton)){//leftButton
 if (pos == 3)
 {pos = 1;}
 else 
 {pos++;}
 } else if (digitalRead(rightButton)){
 switch (pos){
 case 1:
 if (a == 23){ a = 0;}
 else {a++;}
 break;
 case 2:
 if (b == 59){ b = 0;}
 else {b++;}
 break;
 case 3:
 if (c == 59){ c = 0;}
 else {c++;}
 break;
 }
 } else if (digitalRead(centerButton)){
 confirmAlarm();
 } 
 if (set == 0){
 goto endIt;
 }
 goto repeat;
 endIt:
 Serial.println("Alarm executed successfully");
}

void confirmAlarm()
{ lcd.clear();
 Alarm.alarmOnce(a, b, c, alarm);
 up:
 lcd.setCursor(1, 0);
 lcd.print("Alarm Running");
 lcd.setCursor(3, 1);
 lcd.print(hour());
 lcd.print(":");
 lcd.print(minute());
 lcd.print(":");
 lcd.print(second());
 Alarm.delay(200);
 delay(1);
 lcd.clear();
 //timeDisplay();
 Serial.println("...");
 if (set == 0||digitalRead(centerButton)){goto down;}
 goto up;
 down:
 set = 0;
}
void setTimer(){
 int cur = 1;
 x, y = 0;
 trig = 1;
 roof:
 lcd.clear();
 lcd.setCursor(2, 0);
 lcd.print("minutes: ");
 lcd.print(x);
 lcd.setCursor(2, 1);
 lcd.print("seconds: ");
 lcd.print(y);
 if (cur == true){lcd.setCursor(0, 0); lcd.write(byte(1));}
 else {lcd.setCursor(0, 1); lcd.write(byte(1));}
 delay(200);
 if (digitalRead(rightButton)){
 switch(cur){
 case 1:
 if (x == 20){x=0;}
 else {x++;}
 break;
 case 2:
 if (y == 59){y = 0;}
 else {y++;}
 break;
 default: 
 lcd.clear();
 lcd.print("ERROR 003");
 }
 } else if (digitalRead(leftButton)){
 if (cur == 2){cur = 1;}
 else {cur++;}
 }
 if (digitalRead(centerButton)){
 confirmTimer();
 } else {
 goto roof;
 }
 trig = 0;
 lcd.setCursor(0, 0);
 lcd.print("Timer successful");
 delay(2000);
 lcd.clear();
}</p><p>void confirmTimer(){<br> int z;
 z = x*60 + y;
 Alarm.timerOnce(z, timer);
 lcd.clear();
 
 sky:
 Serial.println(".");
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("CountDown Timer");
 lcd.setCursor(7, 1);
 lcd.print(z);
 z--;
 Alarm.delay(999);
 delay(1);
 if (trig == 0||digitalRead(centerButton)==HIGH){goto ground;}
 goto sky;
 ground:
 trig = 0;
 lcd.clear();
}
void timer(){
 Serial.println("Boom, timer is on!! :)");
 lcd.clear();
 lcd.setCursor(3, 0);
 lcd.print("Time's Up!");
 for (int i = 0; i<=10; i++){
 for (int j = 0; j<=3; j++){
 digitalWrite(buzz, HIGH);
 delay(70);
 digitalWrite(buzz, LOW);
 delay(70);
 }
 delay(700);
 }
 trig = 0;
}

Mas información en http://www.instructables.com/id/IoT-Weather-Box-with-Custom-Alarms-Timers/

Anuncios

Cómo iniciar un app automáticamente en Android


AutoStart es una interesante aplicación Android gratuita que podríamos usar, para ordenar a cualquiera de nuestras aplicaciones instaladas en el dispositivo móvil para que se ejecuten automáticamente cada vez que encendamos el terminal.

Objetivamente se puede intuir , que en Google Play existen otras alternativas que podría elegir quizás mejores ,pero  desde luego no sin un interfaz  tan minimalista como el  de este app y desde luego sobre todo que no precisen ser root  o consuman  tantos recursos en el sistema operativo Android como esta app.  Una característica muy interesante destacable respecto  otras apps es que el inicio automático funciona muy bien en todos los teléfonos o tabletas y no requiere permisos de root. Veamos el modo de usarla junto con un ejemplo:

 

 

En este post vamos a comentar la app AutoStart disponible en Google Play .  Una vez que la tengamos instalada  en nuestro dispositivo móvil Android (que puede ser un “ChromeCast” o un mini PC), sólo tiene que ejecutarla para configurarla    directamente desde la pantalla inicial  tanto que se autoinicie la app ( sin esta app corriendo no se iniciara el resto)  como se ejecuten las apps que se deseen.

Como podrá observar  pues la pantalla principal de AutoStart tiene una interfaz minimalista en la configuración.

Allí solamente tiene que tocar al botón para activar el servicio (es decir, para que esté siempre activa) y también, seleccionar al botón “Add” para agregar una o varias aplicaciones Android que desee que se ejecuten automáticamente cada vez que se encienda su dispositivo Android ,  es  decir como vemos tan solo  tiene que seleccionar las aplicaciones que desea iniciará automáticamente después de encendido del teléfono (arranque).

Otros parámetros que podrá  ajustar se ven  un poco más abajo ,los cuales pueden  ayudara hacer que haya un tiempo de espera antes de que la ejecución de estas aplicaciones en  el inicio. El primer valor corresponderá a la propia app,  mientras que el segundo, es el tiempo que debe esperar el sistema para que se vayan ejecutando el resto de aplicaciones Android.

i

Un detalle de esta app es que funciona  tanto en terminales Android con pantallas pequeñas(smartphones)  como terminales con pantallas  mas grandes como pueden ser  tabletas ,android TV, etc, dispositivos todos ellos donde en ocasiones nos puede venir muy bien poder tener disponibles al arrancar estos nuestra app favorita
 

Un ejemplo claro de uso de la app AutoStart   es usarla para iniciar Seguricasa .  La  app Seguricasa disponible en Google Play por 1€ pretende  que reciclemos o reutilicemos  un viejo terminal Android  que tengamos en desuso  fijándolo a la pared  , para que nos sirva tanto para el control de accesos ,como la monitorización del estado de suministro eléctrico  (la utilidad aquí de Autostart sera para que se inicie automáticamente la app Seguricasa en caso de agotamiento de la batería o de un apagado involuntario)

Dado que los inmuebles son el mayor activo de las personas tanto a nivel personal como a nivel de empresas o negocios,  es importante asegurarnos que no son accedidos por terceros o que siempre están alimentados eléctricamente, dada la gran dependencia del suministro de corriente alterna, por lo que es necesario tener constancia de cualquier caída en el suministro eléctrico.

Enviar notificaciones si se detecta un corte de red ,es posible sin ningún hardware adicional ,puesto que dejaría de estar alimentado externamente el Smartphone (por el cargador del terminal), circunstancia que puede ser monitorizada y procesada dentro de la aplicación  SEGURICASA  que es interpretada  como falta de red de corriente alterna.

Quizás lo interesante  de la aplicación es pues que no se necesita ningún cableado ni hardware adicional pues lo único que  requiere es el cargador que alimente el terminal ,una tarjeta SIM ( para que pueda enviar SMS’s o correo en caso de falta de suministro eléctrico)   y por ultimo un simple cartón que se fije solidario a la puerta de modo que al abrir la puerta de acceso tape el sensor de proximidad presente en el frontal de cualquier Smartphone.

 

 

La app Seguricasa puede enviar notificaciones automáticamente vía SMS o por correo electrónico según se desee en el momento que se detecte una falta de red en el suministro eléctrico o también la apertura o cierre de la puerta gracias al sensor de proximidad que incluye cualquier Smartphone y así como también  detectar actos de vandalismo sobre el terminal para notificarlo al usuario.

Como ejemplos de utilidad de esta aplicación seria la vigilancia de los alimentos perecederos (es decir de mantener la refrigeración ) o sistemas de calefacción ,aunque es obvio que todos sabemos cómo las consecuencias de una falta de red eléctrica puede abarcar otros muchísimos usos: servidores para servicios de TI, comunicaciones, seguridad , riegos automatizados, cultivos ,acuarios, etc.

Esta app, pues, está pensada dirigida a familias, pequeños comerciantes, o incluso negocios etc., ya que por su simplicidad está prevista para ser auto instalada por cualquier usuario. Seguricasa es una solución ideal pues para aquellas personas que no están dispuestos a pagar una cuota por un sistema de alarma pero les gustaría saber lo que ocurre en sus propiedades sobre todo con el suministro de corriente alterna en el acceso. La solución es única, pues no es necesario adquirir ningún hw adicional ya que se basa en un Smartphone para gestionar tanto los accesos como los cortes de red de corriente alterna de una vivienda o local

 

Como habrá podido observar , “AutoStart” ofrece una simplicidad bastante grande a la hora de manejar sel arranque automático  fiable sin ser root de cualquier aplicación como por ejemplo la aplicación Seguricasa

Acceso web a Sensores conectados a una Raspberry Pi


Aunque  efectivamente  cualquier  Raspeberry  PI  no puede procesar directamente señales analógicas al no contar  en su electronica interna con convertidores  A/D  y D/A muliproposito como otras placas (Arduino,Netduino,Edison,etc), todavía es posible procesar gran cantidad de información,  pues cuenta  con 14  entradas/salidas digitales que pueden usarse para cualquier propósito como vamos a ver a  continuación, usando como referencia la plataforma Cayenne la cual nos permite rápidamente obtener lecturas en tiempo real  de cualquier sensor que conectemos a nuestra Raspberry Pi

Aunque es posible conectar múltiples sensores analógicos  usando CI auxiliares, vamos a  ver en primer lugar  todas las posibilidades   de usar las entradas/salidas digitales para conectar diferentes tipos de sensores.

Un par de notas antes de comenzar:

  • Los diagramas proporcionados son sólo ejemplo de cómo conectar el sensor. Hay muchas maneras para conectar sensores y extensiones, así que trate de lo que funciona mejor para usted!
  • Asegúrese de que Raspberry Pi está apagada al conectar los cables.
  • Cuando utilice un cable de cinta GPIO, asegúrese de que está conectado el cable (es un color diferente que los otros) en la esquina de la Raspberry Pi y la parte superior de su RP Pi.
  • Algunas placas de prototipos  (usados en los diagramas a continuación) tienen unas lineas de alimentación  que se separan en el medio. Si este es el caso, asegúrese de que sus sensores están conectados en la misma mitad de la placa en su Raspberry Pi.

 

 SENSORES DIGITALES

Es muy sencillo leer el estado  de cualquier interruptor conectado a la Raspberry Pi .Por extraño  que pueda parecer usar sensores basados en  interruptores es unas de las vias de sensorización mas fiables que existen pues al no haber apenas electronica los hace inmunes  a interferencias, averías, sabotaje,etc

Ademas el abanico de sensores de este tipo  no se limita a interruptores mecánicos pues , también existen sensores magnéticos , sensores de líquidos, sensores conductivos,etc , todos ellos  funcionando de una manera muy similar cerrando o abriendo el circuito en función de una determinada característica

Utilice el diagrama siguiente para conectar un sensor a una de las Entradas digitales de Raspberry Pi.

 

Paso 1

Conecte alimentación de  3v de la  RP Pi (pin 1 ) para alimentar el pulsador, a través de una resistencia de 10k.
Digital Input

Paso 2

Conectar la tierra de la RP Pi al pulsador(pin 9).
Digital Input

Paso 3

Conectar el pulsador (utilizando el mismo pin como la resistencia) a uno de los pines GPIO en la RP  Pi, en este caso 17 de GPIO(pin 11).
Digital Input

Paso 4

Ahora finalmente  entre en su cuenta de Cayenne , acceda  a la RP  y agregue la entrada Digital a su escritorio  de Cayyene  para poder  leer el estado del botón usando 17 GPIO.

 

g17

 

 

 

BMP180

BMP180

Este sensor de precisión de Bosch es la mejor solución de detección de bajo costo para medir la presión barométrica y la temperatura. Dado que la presión cambia con la altitud también se puede utilizar como un altímetro! El sensor está soldado a una placa con un regulador de 3.3V, un cambiador de nivel I2C y resistencias de pull-up en los pines I2C.

Esta placa es compatible con 5V pues lleva un regulador de 3.3V y un circuito cambiador de nivel I2C  incluidos para que pueda utilizar este sensor de manera segura con la lógica de 5V y la alimentación.

En el ejemplo  vamos a agregar un sensor de temperatura y presión de BMP180 para ver lo fácil que es empezar.

Paso 1

Conectar al linea  de 3.3V de energía desde la RP Pi a BMP180 (VIN).
BMP180

Paso 2

Conectar toma de tierra de la RP(pin 9)  Pi a BMP180 (GND).
BMP180

Paso 3

Conectar los pins el SCL (pin 5) en el zapatero de Pi y BMP180.
BMP180

Paso 4

Conecte un hilo de la SDA (pin 3) en la RP Pi y BMP180.
BMP180

Paso 5

¡Listo! Ahora puede Agregar el BMP180 a su tablero de instrumentos.

Ahora finalmente  entre en su cuenta de Cayenne , acceda  a la RP  y  haga clic en Agregar nuevo > dispositivo / Widget.

Add New Device

  1. Seleccione sensores, temperatura, y BMP180.
  2. Haga clic en Add Sensor.

Add Sensor

Los widgets de temperatura y presión de BMP180 se agregan a su tablero de instrumentos.

Vamos a probarlo! Coloque su mano sobre el sensor de BMP180. Las actualizaciones de valor de la temperatura tan pronto como se recibe un cambio de temperatura.

Puede comprobar el estado actual de su sensor en cualquier momento visitando el tablero de instrumentos.
Added Sensor

TMP102

TMP102
Se trata de un tablero del desbloqueo de accesorios para el pequeño sensor de temperatura digital TMP102. El TMP102 es un sensor digital (I2C alias TWI), tiene una resolución de 0,0625 ° C, y tiene una precisión de hasta 0,5 ° C. Este es un sensor muy práctico que requiere una muy baja corriente.

La comunicación con el TMP102 se logra a través de una interfaz serie de dos hilos. No existe regulador de tensión de a bordo, por lo que el voltaje suministrado debe estar entre 1,4 a 3.6VDC. Los condensadores de filtrado y resistencias de pull-up se incluyen een la placa .

Use el siguiente diagrama para conectar el sensor de temperatura TMP102.

Una  nota antes de comenzar: Algunos sensores de TMP102 le permiten cambiar la dirección predeterminada conectando  un puente sobre el pin de dirección. Algunas versiones, como la utilizada en este ejemplo, están conectados a una dirección predeterminada de 0x48. Consulte las especificaciones de su ficha para obtener más detalles.

 

Paso 1

Alimentar desde la RP  Pi a TMP102 mediante el pin 1 de 3.3V  (VCC).
TMP102

Paso 2

Conectar la masa   de la RP Pi a TMP102 (GND).
TMP102

Paso 3

Conecte la  toma de SDA(pin 3)  de la RP  Pi hacia a TMP102  .
TMP102

Paso 4

Conecte los pines SCL de la TMP102 a la RP Pi(pin 5).
TMP102

Paso 5

¡Listo! Ahora puede Agregar el sensor de TMP102 en el panel de Cayenne, con dirección por defecto de 0x48.

DS18B20

DS18B20

Este es el último sensor digital de temperatura DS18B20 1-Wire de Maxim IC  y  es un componente muy usado en muchos proyectos de registro de datos y control de temperatura

Envia  al bus I2C la información de la temperatura exterior en  grados C con precisión 9-12 bits, -55C a 125C (+/- 0.5C).a.

Cada sensor tiene un número de serie único de 64 bits grabado en él lo cual permite un gran número de sensores que se utilizarán en un bus de datos.

Use el siguiente diagrama para conectar el sensor de temperatura DS18B20 “1-Wire”.

Un nota antes de comenzar:Para aprovechar las ventajas de la detección automática de cayenne  de sensores 1-wire, conecte a 4 GPIO.

 

Paso 1

Desde la RP Pi para alimentar el pin VDD del DS18B20, use el pin1 de 3.3V. Asegúrese de que usa una resistencia de pull-up de 4k7  entre la alimentación (VDD) y la salida (DQ) en ambos pines del DS18B20.
DS18B20

Paso 2

Conectar la tierra de la RP Pi con el conector de tierra (GND) del DS18B20.
DS18B20

Paso 3

Conectar la  salida del DS18B20 (DQ) en GPIO  4 (pin 7) en la RP Pi. La Conexión a 4 GPIO permite la detección automática del dispositivo 1-wire en Cayenne.
DS18B20

Paso 4

¡Listo! Encienda su RP Pi y Cayenne automáticamente detectará el sensor DS18B20 y añadirá este  a su panel de control.

 

VCNL 4000

vcnl4000

El VCNL4000 puede detectar su proximidad a un objeto utilizando IR dentro de un rango de aproximadamente 20 cm. Los datos de proximidad, así como los datos del nivel de luz ambiental, se pueden recoger en una interfaz I2C.

La placa la acceso a los pines I2C, el pin Vcc, GND y el pin IR + (fuente de alimentación para el emisor IR incorporado). Simplemente necesita alimentación  de 3.3Vy dé al emisor de IR en cualquier lugar de 2.5-5V y usted será capaz de decir lo lejos que está de un objeto de hasta 20 cm.

Use el siguiente diagrama para conectar un VCNL4000 de proximidad y sensor de luminosidad.

Paso 1

Conecte las líneas de energía. Conecte el pin de 3.3V de la RP Pi  al pin de  3.3V de  VCNL4000  y al alimentación de 5V(pin 5)  al pin emisor de IR (IR +).
VCNL4000

Paso 2

Conectar toma de tierra de la raspberry Pi a VCNL4000 (GND).
VCNL4000

Paso 3

Conecte las clavijas SDA de la VCNL4000 a la raspberry Pi(pin3).
VCNL4000

Paso 4

Conecte los pines SCL de la VCNL4000  a la RP Pi(Pin 5).
VCNL4000

Paso 5

¡Listo! Ahora puede Agregar el sensor de VCNL4000 en el  panel de control de Cayenne

 

TSL2561

TSL2561

TSL2561 es un sensor de luz digital avanzado, ideal para su uso en una amplia gama de situaciones de luz. En comparación con las células bajo coste CdS , este sensor es más preciso, lo que permite cálculos exactos de lux y se puede configurar para diferentes ganancia / tiempo rangos para detectar rangos de luz de hasta 0,1 – 40.000+ Lux sobre la marcha.

La mejor parte de este sensor es que contiene dos diodos infrarrojos y espectro completo! Esto significa que puede medir por separado de infrarrojos, y  el espectro completo o humano luz visible (la mayoría de los sensores sólo pueden detectar uno o el otro, lo que no representa con exactitud lo que ven los ojos humanos ya que no podemos percibir la luz infrarroja que es detectado por la mayoría de los fotodiodos)

El sensor tiene una interfaz digital (I2C). Puede seleccionar una de las tres direcciones por lo que puede tener hasta tres sensores en una placa (cada uno con una dirección I2C diferente). El qeu incluya el ADC significa que usted puede utilizar esto con cualquier microcontrolador, incluso si no tiene entradas analógicas. El consumo de corriente es extremadamente baja, así que es genial para los sistemas de registro de datos de baja potencia. sobre 0,5 mA al detectar activamente, y menos de 15 uA cuando está en modo powerdown.

Use el siguiente diagrama para conectar un sensor de luminosidad TSL2561.

Una nota antes de comenzar:El sensor de TSL2561 le permite cambiar la dirección predeterminada  tendiendo un puente sobre el pinde dirección. Dejando el pin de dirección flotante (desconectado) le dará la dirección por defecto, 0 x 39 en este ejemplo. Consulte las especificaciones de su ficha para obtener más detalles.

 

Paso 1

Alimentar desde la RP  Pi con 3.3 V (pin1)  a TSL2561 (VIN).
TSL2561

Paso 2

Conectar toma de tierra de la Rp Pi a TSL2561 (GND).
TSL2561

Paso 3

Conecte las clavijas SDA de la TSL2561  a la RP Pi(pin 3).
TSL2561

Paso 4

Conecte los pines SCL de la TSL2561 a la RP Pi(pin 5).
TSL2561

Paso 5

¡Listo! Ahora puede Agregar el sensor de TSL2561 en el panel de control de Cayenne  con dirección por defecto de 0 x 39.

 

Aunque existen muchos mas sensores y actuadores que podemos conectar a  nuestra Raspberry Pi , una vez conectados  y configurados en el panel de control de Cayenne  aparte de poder visualizar el historial , una gran utilidad es generar alertas antes determinados cambios en los valores transmitidos a la plataforma Cayenne.

Sin duda dos de las grandes utilidades es enviar alertas o notificaciones de correo ante cambios en los valores  registrados de los sensores que hemos conectado

 

 

Recibir alertas  SMS

Cayyene  le enviará alertas de notificación por mensaje de texto si selecciona.
Notification Alert

Correo electrónico

Cayenne le enviará alertas de notificación por correo electrónico si ha seleccionado.
Email Alert

 

Fuente aqui

 

Cónstruya un robot con Raspbery Pi y Arduino


 

En el video anterior en efecto vemos  un robot controlado a distancia basándose  en interfaces web usando para ello  una red  inalámbrica .Dado la potencia de la Raspberry Pi se usa esta para el soporte de Video  y  una placa  Arduino  para el control de los motores 

Se usa la Raspberry Pi pues para la gestión  de la cámara, una red Wi-Fi para la  interfaz de usuario  entre el robot u el usuario  y una placa  Arduino para controlar servos, sensores y motores.


¿Qué necesitamos para construir el robot?,pues propprcionamos a continuacion la siguiente lista de componentes:

 

En realidad dado que  todos estos módulos ya vienen montados , el esquema de conexiones es bastante sencillo ,pues se usa  un convertidor dc/dc  para alimentar  el puente  en h para los 4 motores , los 2 servos y el sensor ultrasonico  , y otro convertidor dc/dc para alimentar exclusivamente  el Arduino Nano

La comunicación entre  Raspberry Pi y Arduino se lleva  a cabo a través de GPIO TX serie / RX (/ dev / ttyAMA0) por medio de un convertidor de nivel.

Otro aspecto destcable  es que tanto el sensor ultrasonido como los dos servos son controlados por la propia placa Arduino Uno

Esquemas cameraRobot

Asimismo se  hace uso de un modulo de cámara para Raspberry Pi  , la cual va conectada con un cable de cinta  a la Raspberry Pi . La cámara se sujeta al soporte movil especial el cual  permite gracias a los dos servos  mover la cámara  en los tres ejes

Aquí puede echar un vistazo a los detalles de  ensamblaje de los componentes mas importantes:

Pan Tilt & detalle con los servos
Detalle de conexion con los servos
Frambuesa Pi / Arduino y convertidor de nivel
Raspberry Pi / Arduino y convertidor de nivel
las conexiones del sensor y Servos

 

Software:

El software se divide en dos secciones: software para Raspberry  Pi  y software de Arduino.

Para la Raspberry se usa dawnrobotics SD imagen para su cámara robot Pi , la cual proporciono  con una pequeña modificación  el  archivo robot_web_server.py  para permitir la comunicación serie con Arduino Nano en lugar del controlador dawnrobotics.

A continuación se detalla el código fuente empleado:

 

#include <ecat.h>
#include <Servo.h>

Servo servoP1B2; Servo servoP1B3;

#define MAX_GRAUS 170
#define MIN_GRAUS 20

String szMissatge;
Ecat ecat;
int valorServoV;
int valorServoH;

void setup(){
  ecat.setupNibbleMode(NIBBLE_H_P1,OUTPUT);
  ecat.vUltrasonicSensorP1b0b1_init();
  
  valorServoV=90;
  valorServoH=90;
  pinMode(ecat.nPinP1B2,OUTPUT);
  pinMode(ecat.nPinP1B3,OUTPUT); 
  servoP1B2.attach(ecat.nPinP1B2);
  servoP1B3.attach(ecat.nPinP1B3);
  servoP1B2.write(valorServoV);
  servoP1B3.write(valorServoH);  
  pinMode(ecat.nPinP2B7,OUTPUT);
  pinMode(ecat.nPinP2B6,INPUT);
  pinMode(ecat.nPinP2B5,INPUT);
  pinMode(ecat.nPinP2B4,INPUT);
  ecat.setupNibbleMode(NIBBLE_L_P2,INPUT);
  Serial.begin(115200);
}

void vRobotAturat(){
  ecat.vWriteHighNibbleP1(0x00);
}

void vRobotEndarrera(){
  ecat.vWriteHighNibbleP1(B00000110);
}

void vRobotEndavant(){
  ecat.vWriteHighNibbleP1(B00001001);
}

void vRobotEsquerra(){
  ecat.vWriteHighNibbleP1(B00000101);
}

void vRobotDreta(){
  ecat.vWriteHighNibbleP1(B00001010);
}



void vManageMsg(){
 
  if(szMissatge == "b"){
    vRobotEndarrera();
  }
  if(szMissatge == "f"){
    if (ecat.nUsDistanceCmP1b0b1()>7) {
        vRobotEndavant();
    }
  }
  if(szMissatge == "s"){
    vRobotAturat();
  }
  if(szMissatge == "l"){
    vRobotEsquerra();
  }
  if(szMissatge == "r"){
    vRobotDreta();
  }
  if(szMissatge == "w"){
    if (valorServoH<MAX_GRAUS) {
      valorServoH++;
    }
  }
  if(szMissatge == "x"){
    if (valorServoH>MIN_GRAUS) {
      valorServoH--;
    }
  }
  if(szMissatge == "a"){
    if (valorServoV>MIN_GRAUS) {
      valorServoV--;
    }
  }
  if(szMissatge == "d"){
    if (valorServoV<MAX_GRAUS) {
      valorServoV++;
    }
  }
}

void loop(){

  while(Serial.available()){
    delay(3);
    char c = Serial.read();
    szMissatge += c;
  }
  vManageMsg();
  szMissatge = "";
  if (ecat.nUsDistanceCmP1b0b1()<7) {
    vRobotAturat();
  }
  servoP1B2.write(valorServoV);
  servoP1B3.write(valorServoH);
}

Como estamos utilizando versión ligeramente modificada de la imagen downrobots, la Raspberry Pi está configurado para actuar como un punto de acceso Wi-Fi, por lo que para conectarse a la nueva red inalámbrica   debe aparecer llamada ‘CameraRobot’. La contraseña de la red es “raspberry”.

Nota: En algunas ocasiones el dongle WiFi en el Pi no obtendrá una dirección IP (error conocido) y por lo que no será capaz de conectarse a la red (el dispositivo pasará edades autenticación y obtener una dirección IP).Este problema suele resolverse girando el robot apagado y otra vez.

 

Para la sección de Arduino Nano,  gracias a @JordiBinefa y @electronicscat se  usa su  biblioteca de e-cat .

El robot se controla con una interfaz web que significa que debería ser accesible desde la más amplia gama de dispositivos posibles. La interfaz web hace uso de HTML5 sin embargo, por lo que tendrá que utilizar un navegador hasta la fecha. Se encontró que Chrome funciona bien en todas las plataformas que se ha probado.

 

Para controlar el robot escriba la dirección IP 192.168.42.1 en la barra de direcciones.

 

 

robot coche con PICAM. Prespectiva.

 

Tiene conexión Wifi, por lo tanto se puede trastear con ella sin cables y eso es muy cómodo. Con éste sistema básico, se puede expandir muchísimo y quizás dar el paso con OpenCV o algún otro tipo de funcionalidad compleja gracias a la potencia que ofrece la Raspberry Pi.

El proyecto desde luego es sumamente interesante  y desde luego abre un camino para nuestra imaginación para replicarlo y mejorarlo dotándolo de nuevas modificaciones   que sin duda lo harán mucho mejor si cabe

Fuente aqui

Manejo de un robot con node.js


Node.js es un entorno en tiempo de ejecución multiplataforma de código abierto  para  servidor , aunque como vamos a ver,  se puede usar para otros propósitos . Fue creado con el enfoque de ser útil en la creación de programas de red altamente escalables, como por ejemplo, servidores web. 

Es un lenguaje de programación ECMAScript, asíncrono, con I/O de datos en una arquitectura orientada a eventos y basado en el motor V8 de Goog asi que desde este punto de vista Node.js es similar en su propósito a Twisted o Tornado de Python, Perl Object Environment de Perl, libevent o libev de C, EventMachine de Ruby, vibe.d de D y JEE de Java existe Apache MINA, Netty, Akka, Vert.x, Grizzly o Xsocket.

Como nota  muy diferenciadora,al contrario que la mayoría del código JavaScript, no se ejecuta en un navegador, sino en el servidor.

Asimismo Node.js implementa algunas especificaciones de CommonJS   e  incluye un entorno REPL para depuración interactiva

Tal es la potencia de  Node.js  que ya existen plataformas basadas en este entorno para intereactuar con placas como Arduino ,Linino. Intel Edison, Raspberry pi,etc  en aplicaciones de Robotica o plataformas de IoT

Johnny – Five    es una Plataforma JavaScript Robótica  e  IO  lanzada por bocoup en 2012  y mantenida por una comunidad de desarrolladores de software apasionados e ingenieros de hardware (más de 75 desarrolladores han hecho contribuciones a la construcción de éste).

onny

Como  ejemplo de “Hola Mundo”  con un LED parpadeante sencilla , el  siguiente ejemplo para Arduino nos muestra lo sencillo que es hacerlo en el entorno de Johnny Five :

 

var five = require("johnny-five");
var board = new five.Board();

board.on("ready", function() {
  var led = new five.Led(13);
  led.blink(500);
});

 

  • Ejecute el  códido Run: npm install johnny-five

 

Como ejemplo mas avanzado en el repositorio de github  (https://github.com/stylixboom/lr_motor ) Siriwat Kasamwattanarote   nos ensela  como podemos  controlar  un coche de juguete  directamente a través de SSH  (mediante  el terminal)  usando  Node.js.

Desde SSH no  se aceptan 2 teclas de flecha al mismo tiempo, es por eso que la forma en que gira a la izquierda / derecha no es tan suave (al cambiar las dos teclas en consecuencia) pero el funcionamiento es muy fluido

Los requerimientos son los siguientes:

 

Este proyecto es pues aprender a controlar dos motores ( izquierda – derecha) mediante el uso de la Raspberry Pi . El código proporcionado  está escrito en Node.js , y requiere un paquete de ‘ Pigpio ‘ para  acceder al puerto GPIO en la Raspberry Pi . ‘ Pulsación ‘ es escuchar a la entrada de teclado de la tecla de flecha ( arriba-abajo – izquierda – derecha) .

Este experimento apoya dos controladores de motor diferentes :

  • Toshiba – TB6612FNG Texas Instruments
  •  L293D

Notas:

-TB6612FNG es más eficiente , pero más caro (unos  10 $ ) , y se necesita soldadura .

 

TB6612FNG
Ref: http://www.robotshop.com/media/files/PDF/Datasheet%20713.pdf
Truth table
Input                           Output
IN1     IN2     PWM     STBY    OUT1    OUT2    Mode
H       H       H/L     H       L       L       Short brake
L       H       H       H       L       H       CCW
L       H       L       H       L       L       Short brake
H       L       H       H       H       L       CW
H       L       L       H       L       L       Short brake
L       L       H       H       OFF(High ohm)   Stop
H/L     H/L     H/L     L       OFF(High ohm)   Standby

-L293D es mucho más barato ( $ 0,6 ) y más fácil de utilizar con una placa.

L293D
Ref: http://www.robotplatform.com/howto/L293/motor_driver_1.html
Truth table
Input                   Function
PWM     IN1     IN2    
H       H       L       Reverse
H       L       H       Forward
H       H       H       Stop
H       L       L       Stop
L       X       X       Stop

En caso de usar la primera opcion , este es el esquema seguido: 





Una vez montado el circuito y ya vez tenga el código descargado  (https://github.com/stylixboom/lr_motor)  ,simplemente para ejecutarlo use :

                        $ sudo node app_t.js

Finalmente en el vídeo que os dejo a continuación podemos ver el conjunto del  robot utilizando una Raspberry Pi combinando NodeJS y el controlador de motores. .

Placa de deasarrollo con W10


Dado el numero limitado de puertos digitales de las la Placa Raspberry  y tambien por no contar con puertos analógicos , es habitual encontrar muchas personas que usan el binomio Arduino + RaspBerry PI

Para todos aquellos desarrolladores que usen habitualmente el binomio Arduino + RaspBerry PI, esta nueva placa denominada LattePanda producida por la compañía china DFRobot les resultará un gran avance por las posibilidades que ofrece.

LattePanda incluye todo lo que un PC normal tiene y de hecho  puede hacer cualquier cosa que un PC normal hace, todo ello a un bajo precio incluso pudiendo correr con W10 .

Esta placa puede funcionar perfectamente en cualquier lugar permitiendo la creación de documentos con Microsoft Office, la reproducción de vídeos de alta definición y ejecutar aplicaciones de Windows  con   exactamente la misma experiencia que el uso de un PC normal.

LattePanda viene pre-instalado con una edición completa de Windows 10, que incluye potentes herramientas como Visual Studio, NodeJS, Java, producción, y mucho más

Es importante destacar  que hablamos de una placa capaz de ejecutar Windows 10 completo, no la versión IoT ,  gracias  a  su potente hardware consistente en  un procesador Intel Atom y que, gracias a un coprocesador, integra todas las funciones de Arduino en la misma placa.

Gracias a la combinación de  hw, se consigue  un equipo donde podremos cargar Windows 10, Visual Studio y la IDE de Arduino y donde programar y probar nuestros desarrollos.

Por supuesto la placa dispone de 20 conectores GPIO para conectar nuestros accesorios (sensores, actuadores, etc.)

LattePanda tiene quad-core 1.8Ghz, cuenta con 2 ó G RAM, una tarjeta de 32 ó 64 GB eMMC,

En cuanto conectividad tene WIFI y  Bluetooth 4.0 integrados  y cuenta con puertos   USB 3.0  y no debemos olvidar el procesador Arduino incluido en la propia placa ( con sus  correspondientes entradas/salidas  tanto digitales como analógicas)

 

 

Más informacion  aqui

Control de cargas con Raspberry-pi usando MQTT


MQTT significa MQ Telemetry Transport, es decir hablamos de un protocolo de mensajería publicación / suscripción, extremadamente sencillo y ligero, diseñado para dispositivos limitados y bajo ancho de banda y latencia alta o redes no confiables , razón por lo cual  es ideal para IoT (Internet de las cosas).

Los principios de diseño se centran en  minimizar el ancho de banda de la red y los requisitos de recursos del dispositivo, a la vez que intentan asegurar la fiabilidad y cierto grado de garantía de las entregas. Estos principios también resultan ideales para conformar el protocolo ideal de la emergente (M2M) “máquina a máquina” o “Internet de las cosas”  que compone el universo de los dispositivos conectados, asi como  también para aplicaciones móviles en las que el ancho de banda y la energía de la batería están en juego

A partir de marzo de 2013, MQTT está en el proceso de normalización a someterse a OASIS.La especificación del protocolo ha sido publicada abiertamente con una licencia libre de regalías para muchos años, y empresas como Eurotech (anteriormente conocido como Arcom) han puesto en práctica el protocolo en sus productos.En noviembre de 2011 IBM y Eurotech anunciaron su participación conjunta en el Grupo de Trabajo de la Industria M2M Eclipse y la donación del código MQTT al proyecto Eclipse OPS  .

Muy resumidamente  un  sistema basado en  MQTT funciona mediante un Brocker, que es al fin y al cabo un pequeño servidor en el cual se pueden publicar temas llamados Topics.

mqrç

Una vez  publicados esos Topics  en el  Broker ,  otros dispositivos pueden suscribirse a éstos  para intercambiar información o simplemente para consumir información.

Hay muchas librerías para utilizar MQTT,  tanto con diversos microcontroladores (como por ejemplo Arduino)  , con el ESP8266 y por supuesto también con la Raspberry-Pi.

Como Broker, uno de los más famosos es Mosquitto  , el cual también puede correr en una Raspeberry-Pi

Para interectuar con el broker  , no tenemos que crear una nueva app , pues existe la aplicación  ioT Mqtt dashboard , gratuita desrcargable desde Google Play  (si está buscando una aplicación para administrar sus proyectos de IO utilizando el protocolo MQTT, dejar de buscar, aquí está 🙂

Con esta aplicación, puede controlar fácilmente los dispositivos cliente MQTT con pasos de configuración muy sencillas. En un momento  puede comunicarse con su  Arduino, o puede ordenar a su ESP8266 esclavo que haga algo,etc …

 

iot mqtt

Las principales funcionalidades de esta app:

  •  Muchas conexiones
  •  Conexión SSL
  •  Especificar su unidad de datos
  •  Visualizar los valores numéricos de una tabla de actualización en tiempo real
  •  Componentes de Publicaciones personalizables:
    + Texto
    + Botón
    + Interruptor
    + Barra de búsqueda
    + Cuadro de lista desplegable
    + Selector de color
    + botones multi
  • WIDGETS PANTALLA DE INICIO( Botón,Botón basculante (versión del componente widget de interruptor),Selector de color)

Nota:
– Usted puede encontrar el registro de errores en: almacenamiento externo (tarjeta SD) / MQTT-salpicadero / registro
– Los widgets de la pantalla principal se utilizan para publicar sólo! Ellos no se suscribe al tema y reflejan su estado.

El protocolo MQTT es pues un sencillo y ligero sistema diseñado especialmente para IoT (Internet Of Things) que funciona prácticamente en cualquier sitio y no consume apenas recursos  como lo vamos a ver , precisamente usando una Raspberry-PI al que simplemente se han conectado tres leds de colores a modo de ejemplo ,pero que obviamente se podría haber conectado cualquier carga , usando por ejemplo un simple relé o un driver de potencia.

El  esquema como podemos simplemente usa los pines 11,12 y 13 y la masa (pin6) del conector de aplicación de la Raspberry Pi   para conectar simplemente tres leds de colores al que solo se han conectado  tres simples resistencias para limitar la corriente que circula por el puerto:

esqeuma

Como una imagen (y si es en vídeo), vale mas que 1000 palabras , continuación en el siguiente vídeo podemos ver la aplicación ioT Mqtt dashboard , interactuar con una Raspberry Pi usando el esquema anterior:

 

 

Para mas información sobre este proyecto  se puede consultar los siguientes recursos: