Construyendo un dispositivo inteligente con nodemcu y un display OLED

Últimamente se están poniendo de moda los dispositivos «inteligentes» que, básicamente, consiste en cacharros que están conectados de una manera o de otra a internet o a nuestra red doméstica y que aceptan comandos desde la red para controlar sus distintas funciones.

La verdad es que han bajado mucho de precio y el poder controlarlas desde los distintos asistentes de voz le dan un extra adicional. He trasteado un poco con Alexa y con Google Home, pero todavía estoy en el proceso de encontrarle el sitio correcto. En cualqueir caso, como soy un alma inquieta he preferido ver cuanto me costaba crear mi propio «dispositivo inteligente» con los materiales que tenía a mano… Esto es lo que he usado:

  • Pantalla OLED de 1,3″ con el chip SSH1106 de 128×64. En concreto esta.
  • Una placa Weimos D1 mini (compatible), que se basa en el chip ESP8266. En concreto esta.
  • Un relé preparado para 5V. En mi caso este.

El chip ESP8266 es una maravilla que integra wifi junto con un microcontrolador que puede ser programado desde el IDE del Arduino (entre otras formas) y el empaquetado en forma de placa nocemcu hace que sea muy sencillo hacer proyectos con este, siendo más barato y más potente que un arduino habitual. De hecho los componentes de este proyecto comprados en aliexpress (quitando cables y gastos de envío) no suman más de 6 Euros… Irresistible para montar un prototipo.

Al lío… Es esquema de conexiones es este:

En realidad el pulsador no hace falta, lo he incluido para poder comunicar al dispositivo manualmente el cambio de estado (es un rollo tener que hacerlo todo en remoto) y no es necesario para la primera versión.

Para poder programar la placa desde el IDE del Arduino vamos a tener que ir a la sección de Archivo->Preferencias y añadir la url http://arduino.esp8266.com/stable/package_esp8266com_index.json en el campo Gestor de URLs Adicionales de Tarjetas, quedando como en la imagen:

Luego nos vamos a Herramientas->Placas->Gestión de tarjetas y buscamos ESP8266 e instalamos la versión de ESP8266 Community.

Con esto ya nos aparecerá el tipo de tarjeta Wemos o NodeMCU en la lista de tarjetas que podemos conectar con el IDE.

Lo siguiente es encontrar una librería que nos permita interactuar por I2C con nuestra pantalla (y que sea lo más flexible posible para usos futuros). Esto es lo que me llevó más tiempo, básicamente porque los ejemplos que proporcionan están preparados para otro chip y la nomenclatura de los pines es diferente… Al final la mejor es esta:

https://github.com/ThingPulse/esp8266-oled-ssd1306

Yo he usado como base el ejemplo que viene al instalar la placa y se llama WIFIServer (creo que lo han cambiado por una versión nueva, os dejo el código completo al final de todas formas). El funcionamiento es de tal manera que al arrancar se conecta a la red wifi que tengamos configurada y queda esperando conexiones, cuando recibe una petición https://server_ip/gpio/0 ponemos a cero el GPIO2 y si recibimos una https://server_ip/gpio/1 lo ponemos a 1… Como esa salida la tenemos conectada al relé, pues ya podemos encender o apagar lo que queramos desde la web.

Para sacar la información por la pantalla, básicamente, utilizo la función drawString que me imprime en las coordenadas dadas de la pantalla una cadena (y en la fuente que hayamos seleccionado antes)… Podéis verlo en funcionamiento en este video:

Os pongo el código antes de integrar lo del botón… Básicamente lo que falta por poner es que cuando detectemos una pulsación del botón (D3 pase a cero) cambiemos el estado del pin conectado al relé (así tenemos control manual, cosa que echo de menos en las bombillas inteligentes, por ejemplo).


#include <ESP8266WiFi.h>
#include "SH1106Wire.h"

const char* ssid = "tussid";
const char* password = "tupassword";

SH1106Wire display(0x3c, 4, 5);

WiFiServer server(80);

void setup() {
 
  Serial.begin(115200);
  delay(10);

  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  display.init();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_10);

  display.clear();
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.drawString(0,0,"Connecting...");
  display.display();
      
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  display.clear();
  display.drawString(0,0,String(ssid));
  display.drawString(0,10, "IP: "+WiFi.localIP().toString());
  display.display();
    
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
  
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
  
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
  
  int val;
  if (req.indexOf("/gpio/0") != -1)
    val = 0;
  else if (req.indexOf("/gpio/1") != -1)
    val = 1;
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  digitalWrite(2, val);
  display.setColor(BLACK);
  display.fillRect(0, 26, 100, 10);
  display.setColor(WHITE);
  display.drawString(0,26,"GPIO: "+String(val));
  display.display();
  
  client.flush();

  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>\n";

  client.print(s);
  delay(1);
  Serial.println("Client disonnected");
}

Si habéis leido el código veréis que hay algunas cosas que se hacen de más, por ejemplo, pintamos un rectángulo en negro para borrar la línea antes de pintarla de nuevo con el valor del GPIO. Eso es debido a que esta librería está pensada para borrar la pantalla cada vez que la actualicemos y, por eso, no limpia el hueco en el que va a escribir (igual podemos hacer un fork que lo solucione, ya veremos) y sin esa limpieza las letras se escriben unas encima de otras.

Una nota final… El servidor no envía cabeceras CORS, por lo que si vais a utilizarlo desde javascript en cualquier otro servidor os saltará un error en la consola (y en mac ni siquiera hará la llamada real), en linux y windows funcionará aunque no recibiréis la respuesta.

Sigo modificando el código y demás a ver qué termino consiguiendo… Hasta es posible que le diseñe un PCB… Ya os iré contando.

Olvidarse de las contraseñas DEFINITIVAMENTE en Android

Una de las preguntas más redundantes que nos han hecho en los múltiples eventos en los que hemos presentado NoMorePass es ¿Puedo usarlo para hacer login en el propio móvil? Nuestra respuesta, como siempre, era positiva, pero con restricciones, hasta el momento solo podíamos copiar-pegar la contraseña… Y digo hasta ahora porque Android 8 incluyó una novedad que nos venía al pelo: el Autofill Framework.

Este framework permite a algunas aplicaciones registrarse como servicio proveedor de credenciales de forma que, si el usuario selecciona esa aplicación, el sistema permite que la aplicación «recomiende» valores posibles para los campos a rellenar en las aplicaciones… Dicho y hecho, esto es lo que los usuarios de NoMorePass nos estaban pidiendo y esto es lo que hemos conseguido (dentro video:)

Autocompletar con NoMorePass

Como véis es algo sumamente sencillo, seleccionar NoMorePass como proveedor de autocompletar y a partir de ese momento todas las contraseñas estarán disponibles para autorellenado cuando las necesitemos.

La primera vez que usamos una contraseña para una app nos preguntará qué contraseña enviar (y usaremos el mismo método que con las webs) y, lo que es más, si metemos a mano una contraseña se nos preguntará si queremos registrar esa contraseña en NoMorePass y así no tener que volver a meterla nunca más… Así hacemos realidad nuestro lema: Olvida tus contraseñas.

¿Y qué pasa con iOS? bueno, apple nunca nos ha puesto las cosas fáciles, más teniendo en cuenta su empeño con quedarse con las credenciales de todo el mundo en su iCloud. Sin embargo, a partir de iOS 12, Apple ha abierto un poco la mano a esta posibilidad y ofrece Servicios de autenticación que, cómo no, vamos a integrar lo antes que podamos.

Mientras… Si tienes Android 8.0 o superior, puedes disfrutar de esta nueva funcionalidad descargádote la versión 1.11.1 o superior de la app.

Ellos ya conocen tu contraseña

Ultimamente estoy recibiendo este tipo de correo (tengo que revisar el spam porque Google sabiamente me los clasifica como correos peligrosos):

La cuestión es que sabían mi contraseña (no, no es la que aparece en el ejemplo que acabo de poner) y eso no es nada raro, ya que hay más de 1.400 millones de emails y contraseñas circulando por la red proveniente de filtraciones y hackeos varios. Si quieres saber si estás afectado (antes de que intenten chantajearte por email) puedes hacerlo en esta página:

Comprobar si tienen mi contraseña

Aquí puedes comprobar si ya tienen tu contraseña

El resto del correo electrónico es pura ingeniería social… Te amenazan con hacer público algo que a ti no te interesa y que, dado que conocen una de tus contraseñas, podrían haber capturado si no tenemos cuidado… Es totalmente falso, y si tuviesen algo que enseñar ya te lo habrían enseñado, así que, por favor, no pagues.

Para estar protegido (dentro de lo que cabe) intenta no repetir contraseñas en distintos sitios, usar contraseñas que no sean comunies o variaciones de datos propios (si, las variaciones tampoco aportan seguridad) y nunca hagas caso de correos que te manden desconocidos. Por mi parte yo aporto mi granito de arena con NoMorePass, para que no tengas que recordar ninguna contraseña y te mantengas a salvo de todas estas cosas. ¿Qué esperas para probarlo? Es el unico gestor de contraseñas que mantiene solo en tu teléfono todas tus contraseñas y te evita el tener que recordarlas o teclearlas. De hecho el enlace que os puse antes está patrocinado por un gestor de contraseñas de la competencia que ya ha sido comprometido más de una vez. Se bueno, mantente seguro y usa nomorepass…

SEUR o «EL CLIENTE NO IMPORTA»

Hace poco tuve un problema con dell que me hizo buscar un portatil en otra tienda, elegí esta vez una tienda nacional, pequeña y muy bien de precio para comprarme el portatil (ya os diré cual próximamente) y, una vez hecho el pedido y pagado por transferencia el proceso de envío se hizo muy rápido e informándome en todo momento del estado del mismo (no todos los que funcionan bien son Amazon). Me lo enviaban por SEUR 24h, era jueves, así que supuse que el viernes lo tendría.

Nosotros, como muchos otros, no trabajamos los viernes por la tarde (ni el resto de tardes cuando estamos, como ahora, en jornada intensiva), así que esperé por la mañana la llegada del mensajero (igual tenía suerte), pero no fue así. Revisé el estado del pedido a las 17:00 y seguía en reparto… Bueno, igual me paso por la oficina un rato y espero a ver si viene… Pero no, a las 17:11 ya veo que el repartidor se ha ido diciendo que no hay nadie en la oficina. Hasta aquí todo normal.

Llamo al número de teléfono de SEUR para ver qué opciones tengo (me gustaría tener el portatil en casa para configurarlo el fin de semana) y me dice que lo volverán a intentar entregar el lunes en la misma franja horaria. Un momento! ¿en la misma franja horaria? Le digo al operador que en esa franja horaria no va a haber nadie, que si lo pueden entregar por la mañana… y me responde: «Es que esa es la hora en la que el repartidor pasa por esa zona«. ¡Manda huevos! Eso quiere decir que sabiendo que no va a haber nadie aún así van a pasar porque les viene bien… Perdiendo tiempo y dinero y dejando a un cliente insatisfecho seguro. ¿No hay un poquito de sentido común entre los directivos de una empresa tan importante como SEUR?

Al final les digo que me lo dejen en el almacen que tienen en Alcorcón y que ya lo recogeré yo… Pero, claro, tampoco podrá ser el viernes (llamé 10 minutos después de que el repartidor se fuese de la oficina) ni el fin de semana, claro, será el lunes y a partir de que me avisen (que será, apostemos algo, seguro por la tarde).

En fin, que espero un montón que la startup de mi amigo Angel Batalla (lastmile) lleve un poco de cordura y sentido común al reparto de mercancías o tendremos, como yo, a un montón de clientes insatisfechos.

Como DELL perdió una venta por pura desidia

DELL es una empresa que tiene una larga y exitosa historia con la venta directa, y cuando digo directa, digo por internet. De hecho DELL es pionero vendiendo por este canal desde 1996… Y, digo yo, algo deberían haber aprendido… Pues igual es que el negocio les está yendo mal o que lo de la transformación digital es cosa de otros pero están haciendo cosas muy, muy mal. Como muestra mi «intento» de compra de un Portatil.

El caso es que el jueves por la tarde me decido a comprar el equipo, me lo dan con Ubuntu preinstalado y tiene 120 Euros de descuento, todo ventajas… Pero, espera, lo he visto en la sección de particulares, igual debería ir por empresa ya que lo compro para BiblioEteca… Intento entrar en la web para empresas, me pide un usuario que, sorpresa, es el mismo que he usado para entrar en la otra sección, bueno, pues adelante, no debería ser así, pero entro… Segunda sorpresa, el precio no coincide, o, mejor dicho, no hay descuentos que aplicar. Como empresa no parece que tenga derecho a esas promociones, así que, vuelta a la otra página y a cambiar los datos para que aparezca el cif de la empresa en la compra.

Tras todo este toma y daca de cambios de datos termino en la famosa pantalla de «a pagar…», bueno, no hay problema, tengo tarjetas de crédito y de débito… Pongo los datos de la primera y oooops! se cierra la ventana en la que tengo que poner el código que se me envía por sms… Repito la operación 3 veces, tres códigos que recibo en mi teléfono y tres veces que se cierra la pantalla… Probamos otra vez con otra tarjeta (uno nunca sabe) y me vuelve a pasar lo mismo… Como supongo que esto ya no tiene arreglo elijo otro medio de pago (Paypal) donde meto los datos de la tarjeta que no coló la primera vez (esta vez no se queja) y, aparentemente hago el pedido.

Me llega un correo de Paypal y otro de dell diciendo que todo está en marcha… Y me voy a la cama.

Mi siguiente sorpresa viene al día siguiente… ING (El emisor de la tarjeta que puse en paypal) ha denegado el pago y, en lugar de recibir alguna comunicación por parte de paypal y/o dell solo he recibido el aviso del banco (en su app, ni siquiera un sms) y nada más… Entro en paypal y, efectivamente, me indica que el pago no se ha realizado y que la transacción está cancelada. ¿Intentará DELL volver a cobrar o me cancelará el pedido? Decido esperar..

Pero mi paciencia es limitada y a medio día (hacía ya más de 18 horas del pedido) al no recibir ninguna comunicación decido poner una incidencia (o intentarlo) en la web de dell… Cual es mi sorpresa cuando solo me dejan comunicarme con ellos si ya tengo un número de pedido… Y resulta que yo solo tengo un «recibo» que todavía no es pedido. Así que, via internet, imposible comunicar con ellos… Bueno, busquemos un teléfono… Dicho y hecho, encuentro unos teléfonos de atención (todos unos carísimos 902) y me dispongo a llamar a uno de ellos.

La espera no es demasiada (teniendo en cuenta lo que he llegado a esperar llamando al servicio técnico de alguna telco) y me atiende un operador con acento extraño, pero que se comunica bastante bien. Me dice que mi pedido (18 horas después) todavía no se le ha asignado a nadie, pero que en cuanto se le asigne se pondrán en comunicación conmigo y me indicarán como hacer una transferencia, que no me preocupe que los pedidos no se cancelan por falta de pago hasta los 14 días… ¿Me respetarán el descuento? pregunto y me asegura el hombre que si, que por supuesto.

Me relajo y dejo que el fin de semana cumpla con su deber… De hecho me olvido del tema hasta que el lunes ya en la oficina recibo una llamada de dell, es el mismo operador (todo un detalle) que me indica que si que me han cancelado el pedido (si, ese que no se podía cancelar) que no pueden cambiar la forma de pago y que vuelva a hacer el pedido. Le digo que la oferta ya no está vigente y él me responde que tendré que hacer el pedido, que él no puede saber todas las ofertas que tienen. ¿¿¡¡!!??

En fin, no se si me compraré ese portatil u otro, pero DELL ya ha caído a lo mas bajo en mi ranking de las tiendas en las que no comprar nunca.