Bitcoin Price Ticker con Arduino

Escrito por: Ulises Gascón

Oct 25, 20155 min read

La semana pasada vimos la forma de hacer un reloj binario con Nodejs y Arduino. Esta semana... seguimos trabajando con el tandem Nodejs, Johnny-five y Arduino. Pero esta semana añadiremos una complejidad adicional, que nos abrirá a un mundo nuevo de posibilidades: Firebase, una base de datos NoSQL que funciona en tiempo real y que además nos ofrece un servicio de hosting estático muy similar a GitHub Pages.

Arduino con patalla LCD mostrando la conversion a dolares

Esquema eléctrico

Bien, por esta vez y dado lo fácil que parece, no adjuntare esquema eléctrico. Al igual que en el proyecto anterior, vamos a utilizar I2C, para no tener que invadir todo con cables...

Esquema de conexiones:

  • Positivo (5v) a positivo (5v)
  • Negativo (GND) a negativo (GND)
  • SDA a A4
  • SCL a A5

¿Cómo funciona todo esto?

El primer paso lógico es sacar la información sobre la cotización de los bitcoins, este dato, lo podemos encontrar fácilmente en Firebase. Este es uno de los múltiples ejemplos que podemos encontrar en la documentación de Firebase.

Mediante WebSockets - es una de las maneras más fáciles de hacer comunicación bidireccional y full-duplex en un solo socket TCP - conseguimos la comunicacion en tiempo real entre el servidor (en este caso Firebase) y el cliente (nuestro Nodejs). Si, ya se que te sorprende, pero lo que has leído es cierto. Firebase te proporciona todo este factor tiempo real en su librería, tanto para Nodejs como para el cliente.

¡Si!... Las posibilidades son infinitas, se hace tan fácil.. que uno se plantea unirse a la iniciativa noBackend, que esta rompiendo los prejuicios y la manera que teníamos de trabajar hasta ahora en web.

Un detalle extra... la posibilidad de verlo todo en Euros y no solo en Dólares.... existen librerías como Open exchange rates o Exchange rates. Pero para no complicar mucho el script, sencillamente hacemos este calculo actualizando nosotros mismo el valor de conversión Dolar-Euro en una variable.

Arduino con patalla LCD mostrando la conversion a Euros

Entendida la mecánica hasta ahora, empecemos a desmontar el código.

Desmontando el código

Nuestro primer paso lógico es definir el hardware y las dependencias de nuestro script.

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

board.on("ready", function() {
  
  // LCD con interfaz I2C
  var lcd = new five.LCD({
      controller: "LCM1602",
      pins: ["A5", "A4"],
      rows: 4,
      cols: 20
  });

}); // board

Después de haber incluido nuestro LCD... va siendo hora de definir algunas variables que nos ayuden a controlar la ejecución del nuestro script.

// Ajustar el modo Debug
var debugMode = false;
// Ajustar la moneda
var currency = "dollar"; // "dollar" or "euro"
// Ajustar la tasa de cambio Dolar -> Euro
var euroRate = 0.89;
// Base de datos con la información de los Bitcoins.
var myFirebaseRef = new Firebase("https://publicdata-bitcoin.firebaseio.com/");

Una vez tenemos defenida la depuración, la moneda a usar y la tasa de conversión... necesitamos establecer la conexión con la base de datos.

myFirebaseRef.on("value", function(snapshot) {
    var newChange = snapshot.val();

    // Si la moneda elegida es dolares.
    if (currency == "dollar") {
      lcd.clear();
      lcd.cursor(0, 0).print("==== BITCOIN ($) ===");
      lcd.cursor(1, 0).print("Ask: "+newChange.ask+"$");
      lcd.cursor(2, 0).print("Bid: "+newChange.bid+"$");
      lcd.cursor(3, 0).print("Last: "+newChange.last+"$");
    /*
        Si la moneda elegida es Euros
        Se multiplica el valor por el cambio de Dolar/euro... y luego se redondea a dos decimales
    */
    } else if(currency == "euro"){
      lcd.clear();
      lcd.cursor(0, 0).print("==== BITCOIN (:euro:) ===");
      lcd.cursor(1, 0).print("Ask: "+(newChange.ask*euroRate).toFixed(2)+":euro:"); 
      lcd.cursor(2, 0).print("Bid: "+(newChange.bid*euroRate).toFixed(2)+":euro:");
      lcd.cursor(3, 0).print("Last: "+(newChange.last*euroRate).toFixed(2)+":euro:");      
    // En caso de monedas no reconocidas, se muestra el siguiente error.
    } else{
      lcd.clear();
      lcd.cursor(0, 0).print("===== BITCOIN (X) ====");
      lcd.cursor(1, 0).print("ERROR!! CURRENCY.");
      lcd.cursor(2, 0).print("Try Dollar or Euro.");
      lcd.cursor(0, 0).print("====================");
    };
});

Firebase.on("value") nos permite engancharnos a Firebase y esperar a que se realice un cambio en los datos y después ejecuta el callbak que realiza una comprobación de la moneda.

Si se maneja algún tipo de moneda que no esta definida, lanza un mensaje de error estático en el display LCD.

Si elegimos dolares, el sistema directamente imprime los datos en el LCD, pero si estamos trabajando en Euros, los datos en dolares son multiplicados por el valor definido en la variable euroRate y después redondeados con .toFixed() para poder limitar los decimales a dos y evitar que descuadre la representación de datos en nuestro LCD.

Y por último nos queda definir un sistema depuración que nos permite comprobar si el sistema funciona correctamente por consola.

// Modo Debug
if (debugMode) {
  console.log("**************");
  console.log("Ask($): " + newChange.ask);
  console.log("Bid($): " + newChange.bid);
  console.log("Last($): " + newChange.last);
  console.log("--------------");
  console.log("Conversion Rate: "+euroRate);
  console.log("Currency selected: "+currency);      
  console.log("--------------");
  console.log("Ask(€): " +(newChange.ask*euroRate).toFixed(2));
  console.log("Bid(€): " +(newChange.bid*euroRate).toFixed(2));
  console.log("Last(€): " +(newChange.last*euroRate).toFixed(2));
  console.log("**************");               
};

Truco: Si no dispones de un LCD, pero si tienes un Arduino a mano... puedes usar el modo debug para ver que los datos se procesan bien, aunque no se muestren en pantalla.

Como siempre... espero que hayais disfrutado de este post. Nos vemos el próximo domingo.

Imágenes | Wikipedia y propias