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

Router home-station como servidor de impresion


Es habitual que al migrar el servicio ADSL  a FTTH  el operador  nos deje como medida de cortesía  , el viejo router de ADSL  en casa del cliente , así que probablemente el  viejo router haya quedado  en el olvido en un cajón sin saber muy bien que hacer con el.

Por otra parte, también hay personas que optan por comprar un router de mayor calidad, por lo que es probable que se mantenga también el de su proveedor de Internet en casa.

En cualquier caso ,sea por el motivo que sea, es relativamente   habitual tener  en casa o la oficina un viejo router inalámbrico que no se está utilizando, sin saber muy bien que hacer con este así que es es el momento de sacarle partido  como por ejemplo  para ampliar la cobertura wifi  o por necesitar mayor numero de puertos ethernet  como vimos en este post ,  o en el caso de que sea un home-station usarlo como nas-server  o un servidor de impresión

Un Servidor de Impresión es un equipo o concentrador, o modernamente  un servidor, que conecta una impresora a la red lan interior , para que cualquier equipo pueda acceder a ella e imprimir trabajos, sin depender de otro ordenador para poder utilizarla, como es el caso de las impresoras compartidas.

Veamos  como convertir un  Home-Station modelo Observa  como servidor de impresión :

En primer lugar entendemos habra  los siguintes pasos comentados en un post anterior
es decir  cambiar  la ip de acceso por defecto ( para que no haya colisiones con la ip del router principal)   y desactivar el DHCP
En el caso de querer implementar una impresora de red , aparte de conectar la toma usb de la impresora a la toma usb del Home-Station , tan solo necesitaremos  ir al menú Advanced ->Network Tools –>Printer   y activar ( check enable )
printer
Observe  que la url( http://192.168.1.100:631/printers/Printer) sera la que necesitaremos para añadir la impresora de red desde nuestro ordenador.
Asimismo es interesante   ,si se desea,  asociar un  nombre  que sugiera el tipo de impresora  a la que  nos conectaremos y finalmente pulsar Apply
cabon

Lo primero obviamente, es conectar la impresora al puerto USB del router y encenderla. En el equipo con Windows nos dirigiremos a Panel de Control – Impresoras y haremos clic en Agregar una impresora.

printer1

 

Seleccionaremos Agregar una impresora de Red y no esperaremos a que intente encontrarla, seleccionaremos directamente la opción La impresora no está en la lista .

En la siguiente pantalla pulsaremos la opción Seleccionar una impresora compartida por nombre  y  justo ahí   introduciremos los datos que configuremos  en el  paso anterior  (en el ejemplo  http://192.168.1.100:631/printers/Canon MG2550)

Después de intentar comunicarse con la impresora mediante la dirección http  que le hemos especificado, si la comunicación es correcta    , pedirá información adicional  de  marca  y  modelo .

Si en el equipo no tiene los drivers de la impresora puede  hacer clic en Usar disco e introducir el CD de la impresora en el equipo o en su defecto descargar los drivers desde la página web del fabricante seleccionando Marca y modelo directamente via windows update.

printercanon

 

Tras la instalación, podremos lanzar una página de prueba y comprobar que imprime correctamente.

 

printerprueba.PNG

 

En el caso de ser una multifunción, no es posible  escanear, sólo es posible imprimir.,pero para eso esta siempre la opción de desenchufar la impresora del Home-Sation  y volverlo conectar al pc para esa eventualidad

 

NOTA: Existen diferentes modelos de router Homestation, por lo que si no funciona de esta manera, recomiendo visitar el foro de Movistar,

Problema de actividad al 100% en Windows 10


Puede    que de repente su ordenador con Windows 10   haya dejado de responder  en un  tiempo razonable a cualquier petición  que se  haga  llegando incluso  a demorarse alrededor de  varios minutos el simple hecho abrir cualquier menú contextual .

Lo extraño es que tras ese comportamiento anómalo  tras un rato  comience a  responder de  forma rápida ( normal)  para  luego volverse a repetir el ciclo de demoras y así sucesivamente

Puede que ante un comportamiento tan anormal   haya tenido la  tentación de reinstalar W10  tal y como tratamos en este post , pero   para ese problema probablemente no   mejorara el comportamiento. Hay personas  que  incluso  optan  por cambiar  el disco o  formatear la unidad  de sistema con el consiguiente  trabajo posterior  de instalación  de todo  el sw original   y configuración,  pero si no quiere hacer todo ese trabajo,  todavía  hay algunas  posibilidades  que podemos explorar ;

 

PASOS PREVIOS

Antes de acudir a acciones  mas contundente   lo primero es actualizar  todos los controladores   y sobre todo hacer una análisis de todo el equipo con Windows Defender.

Asimismo vaciar la papelera de reciclaje o eliminar archivos temporales,puede ayudar ( incluso  hay personas que optan por probar a desactivar el archivo de paginación) .
Si el resultado no ha dado ningún cambio entonces siga los siguientes  pasos:

 

PASO 1: Monitorización de la actividad del disco

Un primer análisis  consistirá en   ir al administrador de  tareas ( control+alt +del )   y habilitar si no lo tiene el apartado de actividad de disco

Si padece de este problema, probablemente en el administrador es fácil   que incluso sin uso ,   el porcentaje de  uso del disco sea permanentemente del 100% , señal inequívoca que  nos explica que el porque de la demora sin duda se debe a una excesiva actividad en el disco principal

Cuando ejecute el administrador de tareas, puede que vea que algunos de estos ejecutables: System.exe, Antimalware Service Executable , Host  del servicio , o Telemetria  y experiencias de usuario conectado)   los cuales  aparentemente hacen este gran gasto de uso de  disco.
IMG_20170528_181300[1].jpg

Una vía  para solucionar sin duda sobre todo es  probar desactivar algunas de esas tareas que están generando esa actividad de disco anormal ( en el ejemplo podria ser  Telemetria  y experiencias de usuario conectado),   quitar  algunas tareas programadas etc,

 

Para deshabilitar  un servicio no critico como por ejemplo  el servicio “Telemetria  y experiencias de usuario conectado”, haga lo siguiente:

  1. Oprime las teclas “Windows” + “R” y en Ejecutar, escribe services.msc y haz clic en Aceptar.
  2. En la lista de servicios, haz clic con el botón secundario del ratón en Telemetria  y experiencias de usuario conectado y a continuación, haz clic en Propiedades.
  3. En la lista Tipo de inicio, selecciona Deshabilitado y después haz clic en Aplicar
  4. Seguido, en la pestaña de Recuperación y en las opciones de Primer, Segundo y siguientes errores, Selecciona No realizar ninguna acción.
  5. Luego, haz clic en Aplicar y por último en Reiniciar.

 

PASO 2:Desactivamos la Optimización programada

Si no hemos resuelto el problema en el paso anterior, seguiremos la siguiente secuencia:

  •   Panel de Control–>
  •          Sistema  y seguridad –>
  •                        Herramientas Administrativas –>
  •                                       Desfragmentar y optimizar unidades

Desactivamos la Optimización programada  de todas las unidades  pinchando en  la parte inferior   de Optimizacion Programada  y deschequeando  el check   “Ejecución programada(recomendado)”

Asimismo nos iremos a las unidades  y pincharemos en cada una en el apartado  “Optimizar”  no cerrando    la ventana de  Optimizar unidades hasta que no haya concluido el proceso para todas la unidades

disocs

En ese momento pude que crea haber solucionado el problema desactivando la optimización automática de su  mi disco por unas horas, hasta que nuevamente retome  el mismo problema, quizás  oscilando entre 98 – 100% e  impidiendo trabajar con  algo de fluidez, si es así puede pasar el siguiente paso .

PASO 3: Deshabilitar  Servicio de transferencia inteligente de segundo plano)

El  Servicio de transferencia inteligente en segundo plano (BITS) transfiere de forma asincrónica archivos que están en primer plano o en segundo plano, controlando el flujo de las transferencias para preservar la capacidad de respuesta de otras aplicaciones de red y reanuda automáticamente las transferencias de archivos si se interrumpe una sesión de transferencia, por ejemplo debido a la desconexión de la red o al reinicio del equipo.

BITS proporciona un nivel de prioridad de primer plano y tres niveles de prioridad de segundo plano que se utilizan para clasificar por orden de prioridad los trabajos de transferencia. Los trabajos con prioridad superior prevalecen sobre los trabajos con prioridad inferior. Los trabajos con el mismo nivel de prioridad comparten el período de transferencia, lo que evita que un trabajo grande bloquee los trabajos pequeños en la cola de transferencias. Los trabajos con prioridad inferior no reciben tiempo de transferencia hasta que todos los trabajos con prioridad superior se han completado o están en estado de error.

BITS utiliza BranchCache de Windows para el almacenamiento en caché del mismo nivel.

Como vemos es un servicio que ayuda al SO a mantenerlo actualizado, pero dado que esta trabajando en segundo plano haciendo un uso alto del disco del sistema podemos probar  de desactivarlo    y comprobar si mejora el rendimiento

Antes de empezar, tenga en cuenta que este servicio ayuda los procesos en segundo plano, por lo que el iniciar, apagar, reiniciar o alguna acción en su equipo, puede tardar un poco.

 

Para deshabilitar el servicio, haga lo siguiente:

  1. Oprima las teclas “Windows” + “R” y en Ejecutar, escribe services.msc y haz clic en Aceptar.
  2. En la lista de servicios, haz clic con el botón secundario del ratón en Servicio de transferencias inteligente en segundo plano (BITTS) y a continuación, haz clic en Propiedades.
  3. En la lista Tipo de inicio, selecciona Deshabilitado y después haz clic en Aplicar.Imagen
  4. Seguido, en la pestaña de Recuperación y en las opciones de Primer, Segundo y siguientes errores, Selecciona No realizar ninguna acción.
    Imagen
  5. Luego, haz clic en Aplicar y por último en Reiniciar.

Quite la selección del servicio (Servicio de transferencia inteligente de segundo plano) y le dan aceptar y luego a reiniciar mas tarde.

 

 

PASO 4: Optimizar unidades

Por ultimo seguiremos la siguiente secuencia:

  •   Panel de Control–>
  •          Sistema  y seguridad –>
  •                        Herramientas Administrativas –>
  •                                       Desfragmentar y optimizar unidades

En esta opción seleccionamos la partición donde esta instalado el sistema operativo en ( lo mas normal es que sea al Disco Local C) y   luego clic en optimizar

Este proceso desfragmentara y optimizara el sistema   durando aproximadamente 1 hora  o menos en función de su sistema  y del tamaño del disco

Una vez terminado el proceso reiniciar y debería  mejorar  el rendimiento del Disco considerablemente.

 

Si lo anterior no funciona es posible que una descarga e instalación de actualizaciones esté consumiendo el 100% del disco duro, lo cual podríamos resolverlo buscando desde Servicios ,es decir  :

  1. Oprima las teclas “Windows” + “R” y en Ejecutar, escribe services.msc y haz clic en Aceptar.
  2. En la lista de servicios, haz clic con el botón secundario del ratón en Windows Update y a continuación, haz clic en Propiedades.
  3. En la lista Tipo de inicio, selecciona Manual y después haz clic en Aplicar.
  4. Seguido, en la pestaña de Recuperación y en las opciones de Primer, Segundo y siguientes errores, Selecciona No realizar ninguna acción.

 

Este proceso  podemos hacerlo también con otros servicios como Windows Search  o Superftech para evitar que ocurran este tipo de problemas.

Por ultimo  buscando Windows Update en Cortana podemos ver si hay una descarga de actualización en proceso, además de seleccionar horas del ordenador en desuso para que las actualizaciones y reinicios no se produzcan mientras estemos trabajando con el ordenador.

Apps Android imprescindibles a bordo


Los nuevos tiempos cambian  y con ella  los instrumentos usados en la navegación sobre todo desde que la electrónica  irrumpió de forma intensiva .

Nos tenemos que remontar  hasta la  aparición de la normativa NMEA,la cual permitía concentrar  información dispersa  en una sola pantalla procedente de cada uno de los componentes de la electrónica de a bordo (corredera, equipo de viento, sonda, radar, posición),sin importar su fabricante o el modelo

Posteriormente la aparición de otros elementos como el AIS(Automatic Identification System),  GPS y plotters de alta definición nos han llevado a recurrir a nuevas herramientas y dispositivos para presentar toda la información de ayuda a la navegación a través de un PC   con programas aplicaciones de cartografía escaneada o vectorizada (como OziExplorer, Navionics o Tsunamis),  que nos mostraban gracias al estándar NMEA, toda la información que teníamos distribuida en los diversos dispositivos electrónicos instalados a bordo.

Actualmente la mayoría de los navegantes han pasado del papel a las cartas leídas en el ordenador (y ,del compás al ratón, y de la corredera al GPS) , pero aun  toca  asimilar el siguiente paso :integrar todas las herramientas de ayuda a la navegación en nuestros dispositivos móviles .

 Hoy en día los sistemas de geolocalización  ayudados de una conexión a  internet han revolucionado el transporte , de modo que  con un smartphone o  tableta podemos tener a nuestro alcance, en un multi-dispositivos  a muy bajo coste, toda la información que hace unos años sólo podíamos obtener usando electrónica bastante  compleja  y costosa de modo  que con la evolución y desarrollo de las tabletas Android, las necesidades de electrónica y su utilidad en las embarcaciones ha supuesto un cambio en cuanto a los hábitos de muchos navegantes, ganando cada vez más importancia la tableta como el elemento principal para contener la información que se necesita para la navegación,

Entre las aplicaciones náuticas del mercado que vamos a ver  algunas requieren una conexión a Internet, pero muchas otras ofrecen la opción de trabajar sin cobertura, usando  señales de posicionamiento GPS o de los sensores internos (acelerómetro o brújula)

 

Veamos una muestra de algunas de las aplicaciones mas usadas :

Seguridad

 La app gratuita de Salvamento Marítimo también es indispensable entre las aplicaciones náuticas.

Salvamento Marítimo. Con esta aplicación móvil obtenemos información y orientación sobre cuestiones relacionadas con la seguridad náutica. Por ejemplo, nos ofrece la posibilidad de realizar una serie de controles para ver si estamos cumpliendo con los puntos de seguridad que necesitamos cumplir antes de salir a navegar. Desde consejos y todo tipo de información para navegantes, hasta listados para controlar los puntos esenciales de seguridad antes de la navegación.

Esta  aplicación  permite a los navegantes de recreo que Salvamento Marítimo monitorice su travesía y que de la alarma en caso de no cumplir con el plan de navegación establecido.

El 50% de las incidencias que atiende Salvamento Marítimo, son de embarcaciones de recreo.

SafeTrx es una aplicación para Smartphone, tanto para dispositivos Android como Apple iOS (iPhone, iPad), que monitoriza los viajes de su embarcación, avisa a los contactos designados por el usuario cuando hay retrasos en el viaje planificado y ofrece una página web para que Salvamento Marítimo pueda consultar con rapidez la derrota realizada por la embarcación y tomar las acciones oportunas.

Esta aplicación complementa al Sistema Mundial de Socorro y Seguridad Marítima.
Web: http://boletinpatron.com/index.php/safetrx-app-salvamento-maritimo/

 

Aplicaciones de AIS

En los últimos años hemos visto cómo han aparecido algunas aplicaciones que nos ayudan a identificar las embarcaciones. Se trata de aplicaciones que usan el AIS (Automatic Identification System). Gracias a este sistema podremos conocer la identidad, el rumbo, la posición y más datos sobre aquellas embarcaciones que estén situadas en la zona próxima a la que nos encontramos nosotros.

Habitualmente esto se había realizado a través de sistemas de radio VHF, pero actualmente gracias a una conexión a internet se puede reemplazar su cometido con  aplicaciones como MarineTrafic,

  • mAIS marine Traffic Ship Position Reporting: Esta App basada en Google Maps,  nos permiten enviar y visualizar información a tiempo real de la señal AIS. Para ello tan solo necesitamos tener acceso a una conexión de internet y gracias al  soporte de Google Maps,  pueden visualizarse los barcos en cualquier lugar del mundo. Para emitir la señal es preciso tener una conexión a Internet, esta emisión de señal hay que pararla al llegar a tierra.
  • Ship Finder – Live vessel tracking: Con esta App también puede obtenerse la información sobre todas las embarcaciones situadas en la zona seleccionada. Hay una versión gratuita y otra más completa de pago.

 

Aplicaciones náuticas meteorológicas

Todos los navegantes están pendientes de la previsión meteorológica. Hoy en día tenemos acceso a datos a tiempo real sobre la evolución de los indicadores básicos en meteorología, así como a los pronósticos. En el universo de las aplicaciones encontramos una gran cantidad de herramientas que nos ayudarán a conocer las condiciones de viento y previsión de lluvia con gran lujo de detalles.

  • WeatherPRO HD es una aplicación realizada por Meteogrup que ofrece un pronóstico a una semana vista, en intervalos de tres horas, en más de dos millones de lugares, con radar en tiempo real e imágenes por satélite. Existen diversas versiones, libres y de pago. En función de lo que queramos pagar, obtendremos un tipo de información u otra.
  •  WinFinderPRO  Para los aficionados a los deportes de vela es una aplicación fundamental. Viento, olas y predicción meteorológica son los principales reclamos de esta app. Su uso es bastante parecido a la WeatherPRO, con la posibilidad de tener nuestra lista de favoritos. Tiene una versión gratuita, pero la versión PRO es muy econmica (1,79€)
  • PocketGrib: Esta app hace posible visualizar todos los datos meteorológicos en una previsión de hasta ocho días, con un elevado nivel de acierto en las previsiones de viento.Basada en su hermano mayor diseñado para PC, uGRib (www.grib.us)  permite ver todos los datos meteorológicos con una previsión de hasta ocho días. Seleccionamos directamente en la pantalla la zona sobre la que queremos obtener la previsión, y nos muestra de forma gráfica las previsiones de viento con una alta precisión y un alto grado de acierto.Coste de unos 6€
  • WindGuru: Se trata de una aplicación muy conocida para los navegantes entre las aplicaciones náuticas, que nos muestra de forma gráfica y muy rápida las previsiones de viento y temperatura en la zona que seleccionemos, con un alto grado de fiabilidad. Coste :gratuito
  • Eltiempo.es: La conocida página de internet de Jose Antonio Maldonado tiene su APP, con una visualización panorámica, hora a hora, de vientos, oleajes y temperaturas en la zona de navegación que se seleccione, con unos datos gráficos de gran exactitud.
  • Rain Alarm: Mediante esta APP, pueden recibirse los avisos correspondientes mediante alertas, de aquellas lluvias que se acercan, con imágenes animadas sobre la meteorología a nivel mundial.

Aplicaciones náuticas de geolocalización

  • Boating, aplicación de Navionics, es la app náutica de cartografía más vendida en el mundo, y ofrece todas las posibilidades de planificar rutas con facilidad y comodidad, y en compatibilidad con Google Earth y otras aplicaciones de meteorología. Existe una versión HD con más funciones. Se puede usar sin conexión a internet, si previamente a descargado las cartas. Esta  versiones es gratuita

 

 

  • Navionics HD: Navionics es el software de cartografía más demandado y vendido en todo el mundo. Ha tenido una gran evolución desde su origen, permitiendo utilizar la tableta como un auténtico ploter, con las ventajas de poder moverlo por todo el barco e incluso planificar rutas o ver la información desde cualquier sitio. La versión HD tiene una precisión impresionante y se integra con Google Earth y con ficheros Grib de meteorología, además de información en tiempo real de servicios cercanos a nuestra ubicación (marinas, mecánicos, restaurantes…). Su uso es muy sencillo y no requiere nada más que instalar la App y comenzar a navegar. Puede trabajar sin conexión a internet, cargando previamente las cartas.

    Con la compra inicial de la licencia(50€) , el usuario tiene derecho a actualizar continuamente las versiones del programa y las cartas náuticas.

  • Google Earth: La aplicación del gigante de las búsquedas en Internet no puede faltar. Con toda precisión se puede visualizar la ruta a seguir, así como fotos precisas del lugar. Algunas de las demás App se integran con Google earth. No puede faltar.

  • Gabenative es otra aplicación náutica que muchos aficionados a la navegación suelen tener instalada, y es realmente útil para ayudarnos a situar en el medio del mar.

Instrumentación 

 

  • Polaris Navegación GPS Convierte un teléfono en un potente sistema de navegación GPS de uso general con Polaris Navigation GPS. Utilizado principalmente como una aplicación de GPS de náutica y rastro, Polaris es un excelente respaldo o reemplazo para su Garmin u otra unidad GPS portátil de navegación por satélite!polarid.png
  •  Antigarreo, una herramienta para ayudarnos en el fondeo,una de las variables que más influye en la serenidad del barco es el garreo. Con esta aplicación, el navegante recibirá las alertas necesarias para que la embarcación no salga de su espacio de borneo.
  • Bearing Pilot: Se trata de una aplicación para evitar las demoras en la navegación, prever rumbos y eliminar el riesgo de colisiones, cálculos de rumbos de viento, mantenimiento de la dirección, etc. Una nueva herramienta dirigida tanto a navegantes principiantes como a los más profesionales, su extremada sencillez nos permitirá tomar marcaciones de forma rápida, mostrándonos en su interfaz gráfica la dirección de la demora que hemos tomado, el ángulo respecto a nuestro rumbo y también nos indicará hacia que banda debemos caer para poner proa a dicha demora.Tiene un coste de 7€mar.png
  • Vaavud: Este app usa un dispositivo de plástico  resistente al agua, polvo y a la arena. Se conecta al jack de sonido para medir la velocidad del viento de una forma precisa en todas las direcciones, promedios, velocidades actuales, etc. Vaavud se compra por internet directamente en la página del fabricante (vaavud.com) por unos 40€. Permite medir de forma muy precisa y fiable la velocidad del viento en cualquier dirección, convirtiendo nuestro dispositivo iPhone o Android en una pequeña estación meteorológica.Además, utilizando la App gratuita de Vaavud, podemos ver las mediciones de la velocidad del viento de otros usuarios registrados en otras ubicaciones.El dispositivo puede medir con precisión la velocidad del viento en un rango de 1 m/s hasta 25 m/s, y ha sido probado y calibrado profesionalmente en un túnel de viento en la Universidad Técnica de Dinamarca.
  • NMEA Remote:  Esta App funciona a través de un módem wifi puerto serie que hay que instalar previamente, y actúa como un repetidor de datos de la embarcación.

 

Otras aplicaciones 

  •  Marinus Ripa: Marinus Ripa aporta el Reglamento Internacional de Prevención de Abordajes, una actualización permanente, y toda la información básica de seguridad que un buen navegante debe conocer. Además, se puede obtener también una versión en iBook para iPad en formato libro de alta definición.
  • MoonPreview: Con esta app es posible conocer el ciclo lunar y el estado de la luna la noche que está planificado el fondeo de la embarcación. Ideal para viajes de recreo y contemplación de la cúpula celeste.
  • Useful knots:  Para cada necesidad hay una variedad de nudo distinta. Esta App nos enseña y recuerda, paso a paso, la correcta forma de realizar hasta cien nudos diferentes, según sus tipos y utilidades. Hay una versión de pago, con alta definición, pero también otra gratuita.

 

Sin duda existen un numero enorme de apps imposibles en numerar en este post,pero si hay alguna app para la plataforma Android que sea interesante y no este en este post nos gustaría compartirla con el resto de la comunidad de soloelectronicos.

 

Como descargar trascripciones de videos de youtube


En YouTube puede encontrar todo tipo de vídeos como películas, series, tutoriales, vídeos musicales, etc donde algunos  tienen subtítulos incrustados que forman parte del mismo vídeo, mientras que otros tienen subtítulos están separados del mismo.

Los subtítulos incrustados no pueden ser descargados de forma directa , pero puede utilizar un servicio en línea, como, para descargar los subtítulos que no están incrustados.

 

En realidad  descargar los subtítulos no incrustados de un vídeo de YouTube con servicos web es muy sencillo

  1. Copie la url del enlace del vídeo de YouTube,
  2. Entre en  http://www.lilsubs.com/                                                                                      
  3. Pegue la URL en el campo correspondiente.
  4. Haga clic en Download y seleccione el idioma en que quiera descargar los subtítulos
  5. Elija la carpeta donde desee almacenar el archivo SRT y haga clic en Guardar.

 

Los archivos srt son ficheros de texto que contienen los subtítulos asociados a un video. Utilizan el formato subrip, en el que se almacena esta información:

  •  Intervalo de tiempo en el que aparece
  • Texto del subtítulo

Al tratarse de archivos de texto hay que tener en cuenta su codificación, que en muchos casos el reproductor no escoge la correcta. Seleccionando la que se ajuste a nuestro idioma se pueden evitar problemas con acentos y símbolos.

• 00:01:02,383 –> 00:01:05,133
• “Campos de Opio, Tíbet”
• 2
• 00:02:21,960 –> 00:02:25,735
• Tú y tus hermanos habéis asesinado a 3 de nuestros hombres.
• 3
• 00:02:25,800 –> 00:02:27,327

 

Es obvio que al ser ficheros de texto podemos manipularlos  eliminando  por ejemplo  todas las cifras   y luego  juntando los textos, pero esto conlleva mucho tiempo  de trabajo que en realidad como vamos a ver  podemos automatizar

A continuación vamos a ver tres herramientas para  gestionar  estos archivos de una forma mas sencillas:

 

 

Usar  una app para convertir un archivo .srt en texto limpio 

Subtitle Edit es una de  las mejores opciones pues vale para todos los archivos y respeta los números.

 

Los  pasos para su uso son muy sencillos

  • Descargue Subtitle Edit
  • Abra un archivo .srt.
  • Pinche en la pestaña ‘Source view’,
  • Vaya al desplegable ‘Format’ escoja ‘Scenarist’ (.txt).

 

  • Así ordenamos por columnas separadas los tiempos y textos. Ahora dale a ‘File > Save as…’ para guardar el archivo .txt.

 

  • Abra el archivo .txt,
  • Copia todo el contenido y péguelo en Excel. Como verás tendrá varias columnas, elimina las primeras (referentes a los tiempos) para quedarse sólo con el contenido.

 

  • Copie el contenido y pégelo en la barra de búsqueda de un navegador para que se ponga el texto de corrido. Cópialo de nuevo y pégalo en un documento para comprobar que está bien.

 

Convertir un archivo .srt en texto limpio directamente con Excel

Este metodo  funciona cuando sólo hay una línea de diálogo por separado.

Puede abrir el .srt con el Bloc de notas, copiar el contenido y pegarlo en Excel, eliminando las filas de información numérica para seleccionarlo todo y pegarlo en un documento aunque es más fácil si  descarga Asap Utilities.

Seleccione las celdas, pinche en este plugin cuando lo instale y dale a ‘Columnas y filas > Selección condicional de fila y columna…’.

En ‘4. Opciones de búsqueda’ elija ‘par filas’ y dele a ‘Aceptar’ para eliminar las filas de los tiempos.

El Excel se quedará como el que se muestra aquí. Selecciona ahora ‘impar filas’ para quitar los números.

Cuando lo haga, dele a ‘Cerrar’. Tendrá ahora sólo el texto pero con muchos saltos de línea. Cópielos y péguelos en la barra de búsqueda de un navegador para que se ponga seguido.

Cópielo de nuevo y péguelo en un documento para comprobar que está bien.

Convertir un archivo .srt en texto limpio con Word

Este método tiene el inconveniente de que se borrarán los números, pero  vale para cualquier .srt.

Abra el archivo captions.srt con Word (o si no te funciona con el Bloc de notas y copies el texto) y deje el puntero al principio del texto.

Vaya a ‘Inicio > Reemplazar’ (o presiona ‘CTRL+B’) y en el desplegable de la lupa escoge ‘Reemplazar’.

Escriba el número 0 en el campo ‘Buscar’, deje vacío el campo ‘Reemplazar’ y presione ‘Remplazar todos’. Luego el número 1 y así hasta el 9. Esto eliminará todos los números.

Copie los símbolos que queden (por ejemplo ::, –> ::,) en ‘Buscar’, deje vacío el campo ‘Reemplazar’ y presione ‘Remplazar todos’. Con esto tendremos sólo letras.

Escriba ^p en ‘Buscar’, deje un espacio en blanco en el campo ‘Reemplazar’ y presione ‘Remplazar todos’. Así sustituirnos los saltos de línea y el texto quedará de corrido.

Si quedan espacios en blanco sustituirlos, copiándolos en ‘Buscar’ y dejando sólo un espacio en ‘Reemplazar’.

Envío de e-mail sin intervención del usuario en Android Studio


El SDK de Android facilita muchísimo el envío de correos electrónicos desde una aplicación, pues sólo necesitamos incluir   el permiso correspondiente en el fichero AndroidManifiest.xml  y luego ya podemos usarlo en un nuestra   clase principal

Por ejemplo  esta  es una forma de incluir lo  permisos necesarios  en el fichero AndroidManifiest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.usuario.ejemplo" >
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Con los permisos  otorgados,    en el  fichero  MainActivity .java  necesitaremos  incluir una referencia a dicho modulo:

import android.net.Uri;

Y  ya desde el propio  fichero  MainActivity .java   crearemos la clase de envio de  correos  ,la cual  podremos invocar desde cualquier parte  para enviar el correo

    protected void sendEmail() {
        Log.e("Test email:", "enviando email");
        String[] TO = {""};
        String[] CC = {""};
        Intent emailIntent = new Intent(Intent.ACTION_SEND);

        emailIntent.setData(Uri.parse("mailto:"));
        emailIntent.setType("text/plain");
        emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);
        emailIntent.putExtra(Intent.EXTRA_CC, CC);
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Your subject");
        emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message goes here");

        try {
            startActivity(Intent.createChooser(emailIntent, "Send mail..."));
            finish();
            Log.e("Test email:", "Fin envio email");

        } catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(MainActivity.this, "There is no email client installed.", Toast.LENGTH_SHORT).show();
        }
    }
};

Por desgracia, esta vía es sólo válida si se desea enviarlos a través de la  propia aplicación de correo incorporada.

Para la mayoría de las situaciones este  método  funciona muy bien, y como hemos visto con muy poco código  , pero   silo que quiere es enviar algo y no quiere  ver  ninguna entrada  o  intervención del usuario ya  no es tan fácil.
En las siguientes lineas vamos a ver  cómo enviar un correo electrónico en background, es decir in que el usuario  sea consciente de ello ya que  la aplicación hará todo por detrás
Antes de comenzar, necesitará descargar tres librerías  a través del siguiente enlace:

https://code.google.com/archive/p/javamail-android/downloads

Esta es una versión especial de la API de JavaMail, que ha sido escrita específicamente para Android por Jon Simon.

googlecode

Esta librerias debemos  añádirlas como bibliotecas externas para que sean accesibles por la clase Mail.

Una forma sencilla de hacerlo es copiar directamente  estos ficheros  donde se encuentre el fichero activitymain,java ( por ejemplo   en c:\Users\miususairo\AndroidStudioProjects\ejemplo\app\src\main\java\com\example\misusuario\ejemplo\ )

De este modo, será visible el contenido desde la carpeta java de nuestro  proyecto;

libreias

Ahora ya sólo nos queda  pinchar sobre cada librería de las tras copiadas , con el boton derecho  y seleccionaremos “Add  as Library”

addas.png

.

Al pulsar esta opción  nos pide donde añadira la librerria , qeu simplemnte  aceptaremos

create.PNG

Ahora vamos  a ver  el codigo completo de la clase que nos permitira usar esta tres librerias que hemos imporatado para poder enviar correos mediante nuestra cuenta de gmail sin intervencion de Android

import java.util.Date; 
import java.util.Properties; 
import javax.activation.CommandMap; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.activation.MailcapCommandMap; 
import javax.mail.BodyPart; 
import javax.mail.Multipart; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 
 
 
public class Mail extends javax.mail.Authenticator { 
  private String _user; 
  private String _pass; 
 
  private String[] _to; 
  private String _from; 
 
  private String _port; 
  private String _sport; 
 
  private String _host; 
 
  private String _subject; 
  private String _body; 
 
  private boolean _auth; 
   
  private boolean _debuggable; 
 
  private Multipart _multipart; 
 
 
  public Mail() { 
    _host = "smtp.gmail.com"// default smtp server 
    _port = "465"// default smtp port 
    _sport = "465"// default socketfactory port 
 
    _user = ""// username 
    _pass = ""// password 
    _from = ""// email sent from 
    _subject = ""// email subject 
    _body = ""// email body 
 
    _debuggable = false// debug mode on or off - default off 
    _auth = true// smtp authentication - default on 
 
    _multipart = new MimeMultipart(); 
 
    // There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added. 
    MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
    mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
    mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
    mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
    mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
    mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
    CommandMap.setDefaultCommandMap(mc); 
  } 
 
  public Mail(String user, String pass) { 
    this(); 
 
    _user = user; 
    _pass = pass; 
  } 
 
  public boolean send() throws Exception { 
    Properties props = _setProperties(); 
 
    if(!_user.equals("") && !_pass.equals("") && _to.length > 0 && !_from.equals("") && !_subject.equals("") && !_body.equals("")) { 
      Session session = Session.getInstance(props, this); 
 
      MimeMessage msg = new MimeMessage(session); 
 
      msg.setFrom(new InternetAddress(_from)); 
       
      InternetAddress[] addressTo = new InternetAddress[_to.length]; 
      for (int i = 0; i < _to.length; i++) { 
        addressTo[i] = new InternetAddress(_to[i]); 
      } 
        msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 
 
      msg.setSubject(_subject); 
      msg.setSentDate(new Date()); 
 
      // setup message body 
      BodyPart messageBodyPart = new MimeBodyPart(); 
      messageBodyPart.setText(_body); 
      _multipart.addBodyPart(messageBodyPart); 
 
      // Put parts in message 
      msg.setContent(_multipart); 
 
      // send email 
      Transport.send(msg); 
 
      return true; 
    } else { 
      return false; 
    } 
  } 
 
  public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 
 
    _multipart.addBodyPart(messageBodyPart); 
  } 
 
  @Override 
  public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(_user, _pass); 
  } 
 
  private Properties _setProperties() { 
    Properties props = new Properties(); 
 
    props.put("mail.smtp.host", _host); 
 
    if(_debuggable) { 
      props.put("mail.debug""true"); 
    } 
 
    if(_auth) { 
      props.put("mail.smtp.auth""true"); 
    } 
 
    props.put("mail.smtp.port", _port); 
    props.put("mail.smtp.socketFactory.port", _sport); 
    props.put("mail.smtp.socketFactory.class""javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback""false"); 
 
    return props; 
  } 
 
  // the getters and setters 
  public String getBody() { 
    return _body; 
  } 
 
  public void setBody(String _body) { 
    this._body = _body; 
  } 
 
  // more of the getters and setters ….. 
} 



En este  código inicializamos las propiedades, y configuramos los valores por defecto.

Además, estamos configurando los tipos mime para javamail.

También hay o un comentario que describe por qué necesitamos esto: Hay algo mal con MailCap, javamail no puede encontrar un controlador para la parte multipart / mixed, por lo que este bit tiene que ser añadido

Y probablemente ha notado que hay 2 constructores – uno sobrepasa al otro, solo en caso de que quiera pasar el nombre de usuario y la contraseña al instanciar la clase

 

El método más importante es  send()  pues  estamos poniendo todos los datos de las propiedades y el envío del correo. Puede llamar a este método en cualquier momento si desea agregar un archivo adjunto, pero asegúrese de llamar  a  _setProperties   antes del método de envío.

Dicha clase  configura las propiedades para la recuperación de correo: predeterminado para la autenticación SMTP pues debe  tenerse en cuenta que todo esto es predeterminado para conectarse al servidor SMTP de Gmail (Google).

A continuación se muestra un ejemplo de cómo utilizar el contenedor de correo en una actividad de Android.

 

@Override 
public void onCreate(Bundle icicle) { 
  super.onCreate(icicle); 
  setContentView(R.layout.main); 
 
  Button addImage = (Button) findViewById(R.id.send_email); 
  addImage.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View view) { 
      Mail m = new Mail("[email protected]""password"); 
 
      String[] toArr = {"[email protected]""[email protected]"}; 
      m.setTo(toArr); 
      m.setFrom("[email protected]"); 
      m.setSubject("This is an email sent using my Mail JavaMail wrapper from an Android device."); 
      m.setBody("Email body."); 
 
      try { 
        m.addAttachment("/sdcard/filelocation"); 
 
        if(m.send()) { 
          Toast.makeText(MailApp.this"Email was sent successfully.", Toast.LENGTH_LONG).show(); 
        } else { 
          Toast.makeText(MailApp.this"Email was not sent.", Toast.LENGTH_LONG).show(); 
        } 
      } catch(Exception e) { 
        //Toast.makeText(MailApp.this, "There was a problem sending the email.", Toast.LENGTH_LONG).show(); 
        Log.e("MailApp""Could not send email", e); 
      } 
    } 
  }); 
} 

Como reconvertir un ordenador portatil en sobremesa por o€


Es inevitable  que ordenadores  portátiles  que hace unos años fuesen potentes equipos hoy en día incluso estando operativos ya no tengan  un valor comercial no solo por la obsolescencia  inevitable sino por el desgaste inevitable de sus componentes  donde es destacar  las siguientes partes:

  • La batería pues  tarde o temprano perderá su capacidad original
  • La pantalla TFT  dado que  están muy expuestos a golpes ,caidas, rozes,etc perdiendo no solo calidad ,  sino incluso no mostrando filas o columnas enteras
  • El teclado interno  sujeto a muchos golpes , agentes externos ,etc
  • El trackball o el touchpad
  • El disco duro
  • La caja
  • etc

 

 

De este modo cuando pasan cuatro o cinco años, el ordenador comienza a sufrir los primeros fallos, , y pese al vínculo especial que se  puede haberse mantenido ese tiempo, al final decidimos dejarlo en un cajón o incluso adelantar su defunción. No lo haga: con su ayuda, un  antiguo portátil todavía puede tener todavía muchos usos.

 

En primer lugar aunque las capacidades de su antiguo portátil  no sean suficientes para trabajar con modernas aplicaciones basadas en Windows 10 , puede optar por mantener la licencia original incluso de versiones mas antiguas como  Windows 7 ó 8 (incluso Windows XP) pues con un poco de trabajo de optimización incluso pueden funcionar muy bien para un uso lúdico ( navegación o multimedia) .

Obviamente  si ha perdido la licencia del SO puede optar  por soluciones  basadas en Linux (el sencillo ArchBang o  Lubuntu )  o  incluso Android(remix os )

Si nuestro  equipo esta operativo  y hemos decidido  darle una segunda oportunidad  para utilizarlo  como ordenador de salón para navegar , ver vídeos ,etc , siga leyendo porque  tendrá que seguir unos sencillos  pasos para darle una nueva utilidad a su querido ordenador.

img_20161125_1725171

En primer lugar para que un ordenador quepa en cualquier sitio ,es necesario plegarlo , pero eso nos impide arrancarlo por lo que  aunque hay ordenadores actuales que puede evitar la suspensión al cerrar la pantalla, pensando en ordenadores algo mas antiguos, vamos a intervenir desde el punto de vista hardware atacando por dos “frentes”:

  • Creando un botón de encendido externo al ordenador.
  • Eliminando por hardware el sensor de cierre.

Bien , como ejemplo vamos a ver que hacer como hacerlo en  un viejo HPcompaQ  que presenta perdida de lineas en la pantalla y su batería apenas ofrece una autonomía de minutos:

img_20161124_2017161

Lo primero es localizar los embellecedores del marco de la pantalla dado que tendremos que acceder a la electronica cercana a la bisagra

img_20161124_2017291

Un vez localizados los embellecedores  accederemos a lo tornillos que fijan el marco del monitor

IMG_20161124_201941[1].jpg

Una vez quitado los tronillos podemos quitar el marco:

img_20161124_2020141img_20161124_2057501

Dependiendo del portatil incluso llegados a este punto quizás nos interese eliminar el botón  de bloqueo mecánico que se suele colocar en el centro de la tapa

img_20161124_2045191

Quitado el marco , ahora con un instrumento punzante podemos ir levantando con cuidado la tapa de la botonera

img_20161124_2026061

!Cuidado con las tapas! , pues aunque no lleven tornillos en la parte frontal ,si es habitual  que los tengan en la parte trasera.

img_20161124_2026481

Una vez quitada la tapa de la botonera  vemos la placa de los pulsadores donde accederemos para capturar el botón de encendido

img_20161124_2027451

 

Ahora  necesitamos añadir un botón de encendido externo al ordenador, para lo cual soldaremos con cuidado dos pequeños cables al pulsador de Power ( si no se esta seguro mirarlo  en la tapa cual corresponde).

Una vez soldados los cables a la botonera  pondremos un pequeño trozo de adhesivo para que no suelte el cable y  en los extremos soldaremos un pulsador Normalmente abierto  que llevaremos fuera del conjunto

 

 

img_20161124_2358561

Solo nos queda  eliminar  por hardware el sensor de cierre que provoca la suspensión del ordenador cuando se cierra la tapa .En algunos caso este sensor va en la llave de la atapa , en la bisagra o en el caso de muchos HP -Compaq es magnético y va oculto tras el teclado

Para que podamos plegar el ordenador sin que entre en suspensión, simplemente soltaremos los dos hilos del sensor magnético que va conectado a la placa de la botonera como vemos en la siguiente imagen:

 

img_20161124_2359031

Ahora ya queda  montar  la tapa de la botonera , montar el marco de la pantalla  y plegarlo porque ahora si podemos colocarlo  en un sitio donde no sea  muy visible  ( por ejemplo detrás de la TV)  y gracias a la conexión VGA  y la ayuda de un dongle USB de raton /teclado  inalambrico  (unos 11€ en Amazon) podamos volver a disfrutar de nuestro antiguo portatil:

 

img_20161125_1725021

 

Si no es funcional  por fallos en la placa madre o la gráfica  otra opción es extraer los elementos que se puedan rescatar:el disco duro(acuérdese de formatearlo), la memoria RAM, el adaptador de corriente, las tarjetas gráficas o las tarjetas de sonido , los cuales son algunos de los componentes que se pueden vender por Ebay, Segunda Mano o Mil Anuncios.