Tutorial Bitcoin Ticker DIY

Continuando con el artículo en el que presentábamos nuestro Bitcoin Ticker DIY y os detallábamos los materiales y herramientas usados para su elaboración, en el día de hoy traemos el Tutorial Bitcoin Ticker DIY para su elaboración paso a paso.

Electrónica

Ojo! Aunque en el esquema aparece que la tira de Led es de 12V en realidad la que hay que usar en el proyecto es de 5V: Tira de led 5V

Como explicamos en el anterior artículo el cerebro de nuestro Bitcoin Ticker es un Wemos D1 mini al que conectaremos por un lado una matriz de puntos LED de 8×8 basada en el chip MAX7219, para mostrar el precio en tiempo real de Bitcoin (u otra/s criptomoneda/s), y por el otro una Tira de led 5V para realizar el efecto de iluminación deseado, dentro de la carcasa con la forma del símbolo de Bitcoin que construiremos con nuestra impresora 3D.

El esquema de conexiones de los distintos componentes a nuestro Wemos D1 mini tal como se muestra en la imagen superior es el siguiente:

PANTALLA MATRIZ LED 8X8 MAX7219:

MAX7219 | WEMOSD1

  • VCC — 5V
  • GND — G
  • DIN — D7
  • CS — D2
  • CLK — D5

TIRA DE LED 5V

TIRA LED | WEMOSD1

  • 5V — 5V
  • R — D3
  • G — D4
  • B — D1

El Código

Extracto del código.

El funcionamiento del Ticker principalmente lo que hace es una vez se conecta a la alimentación, enciende la tira de led en color azul y muestra un par de veces el mensaje “Jardinfinanciero.com” a través de la pantalla de leds, mientras en paralelo está haciendo la consulta a la api de coindesk del precio actual de Bitcoin. Tras esto, una vez que acaba esta rutina inicial, comenzar a ejecutar el loop principal, que muestra en pantalla, durante 3 segundos, el precio actual de Bitcoin de manera cíclica. La renovación de la consulta de la api de Coindesk se realiza cada 15 segundos. Adicionalmente el código compara cada nuevo precio mostrado con el mostrado previamente y en función de si el actual es mayor cambia el color de la tira de led a verde y si es inferior lo cambia a rojo.

#include <WiFiManager.h>
#include <Arduino.h>

#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
//>>TIRA DE LED RGB (5V)
int redPin = D3;
int greenPin = D4;
int bluePin = D1;
 
const uint16_t WAIT_TIME = 1000;

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
#define MAX_DEVICES 6
#define CLK_PIN   D5
#define DATA_PIN  D7
#define CS_PIN    D2
#define MAX_MESG  20
#define LOOPDURATION    15000

// Hardware SPI connection
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);

const char* ssid = "*****";
const char* password = "******";
const char* host = "api.coindesk.com";
float previousValue = 0.00;
float threshold = 0.05;

uint8_t scrollSpeed = 25;    // default frame delay value
textEffect_t scrollEffect = PA_SCROLL_LEFT;
textPosition_t scrollAlign = PA_CENTER;
uint16_t scrollPause = 1500; // in milliseconds
char szMesg[MAX_MESG + 1] = "JardinFinanciero.com";

unsigned long currentMillis = 0;
unsigned long previousMillis = 0;

int bufferSize = 3000; // for ArduinoJSON

bool dataAvailable = false;

long hours = 0;
long minutes = 0;
long seconds = 0;

char currencyInfos[3000];


void setup()
{
 
  pinMode(redPin, OUTPUT); // red
  pinMode(greenPin, OUTPUT); // green
  pinMode(bluePin, OUTPUT); // blue
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin, HIGH);
  digitalWrite(bluePin, HIGH);
  
  pinMode(D3, OUTPUT); //Price down
  pinMode(D4, OUTPUT); //Price up
 
 
  Serial.begin(115200);               
  delay(10);
 // case '1':
//    digitalWrite(redPin, LOW);
//    break;
//  case '2':
//    digitalWrite(redPin, HIGH);
//    break;
//  case '3':
//    digitalWrite(greenPin, LOW);
//    break;
//  case '4':
//    digitalWrite(greenPin, HIGH);
//    break;
//  case '5':
    digitalWrite(bluePin, LOW);
//    break;
//  case '6':
//    digitalWrite(bluePin, HIGH);
//    break;
//  }
 //WiFi.begin(ssid, password);
//  WiFiManager wifiManager;
 //Uncomment for reset ssid & password every reboot.
//  wifiManager.resetSettings();

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

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  P.begin();
  P.displayText(szMesg, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);

}

void loop() {
  
  // Every LOOPDURATION seconds
      currentMillis = millis();
      if(currentMillis - previousMillis >= LOOPDURATION) {
        previousMillis = currentMillis;    
    
        getCurrencyInfos();
      }

  if (P.displayAnimate())
  {
    P.displayReset();
  }
      
}


void getCurrencyInfos(){
  // Connect to API
  Serial.print("connecting to ");
  Serial.println(host);
 
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
 
  // We now create a URI for the request
  String url = "/v1/bpi/currentprice.json";
 
  Serial.print("Requesting URL: ");
  Serial.println(url);
 
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  delay(500); //more than 100. Recommended 500.
 
  // Read all the lines of the reply from server and print them to Serial
  String answer;
  while(client.available()){
    String line = client.readStringUntil('\r');
    answer += line;
  }

  client.stop();
  Serial.println();
  Serial.println("closing connection");

  // Process answer
  Serial.println();
  Serial.println("Answer: ");
  Serial.println(answer);

  // Convert to JSON
  String jsonAnswer;
  int jsonIndex;

  for (int i = 0; i < answer.length(); i++) {
    if (answer[i] == '{') {
      jsonIndex = i;
      break;
    }
  }

  // Get JSON data
  jsonAnswer = answer.substring(jsonIndex);
  Serial.println();
  Serial.println("JSON answer: ");
  Serial.println(jsonAnswer);
  jsonAnswer.trim();

  // Get rate as float
  int rateIndex = jsonAnswer.indexOf("rate_float");
  String priceString = jsonAnswer.substring(rateIndex + 12, rateIndex + 18);
  priceString.trim();
  float price = priceString.toFloat();

  // Print price
  Serial.println();
  Serial.println("Bitcoin price: ");
  Serial.println(price);
    

  // Init previous value
  if (previousValue == 0.00) {
    previousValue = price;
  }

  // Alert down ?
  if (price < (previousValue - threshold)) {

    // Flash LED
    digitalWrite(bluePin, HIGH);
    digitalWrite(greenPin, HIGH);
    digitalWrite(redPin, LOW);

  }

  // Alert up ?
 if (price > (previousValue + threshold)) {

    // Flash LED
    digitalWrite(bluePin, HIGH);
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, LOW);

  }
      previousValue = price;
      dtostrf(price, 1, 0, szMesg);
      strcat(szMesg, "$");
}

La carcasa

Como comentábamos en nuestro anterior artículo la carcasa que recoge y da forma a todo el proyecto está realizada para ser autoproducida por nosotros mismos, con la ayuda de nuestra impresora 3D.

En sí la carcasa consta de 3 piezas distintas que son:

Carcasa principal: La parte que da forma y alberga todo el conjunto de electrónica.

Yo la he impreso en color gris oscuro. Creo que quedan mejor los colores oscuros, pero esto ya es a elección de cada cual.

Tapa principal: La tapa de la parte de la lámpara de la parte superior. Digamos la tapa de la “B” de Bitcoin.

Imprimir en color blanco o transparente.

Tapa secundaria: Es la tapa que cubre la pantalla de leds. Puede obviarse la impresión de esta parte si se desea. No es fundamental.

Imprimir en color blanco o transparente.

Decir que las piezas están diseñadas con Solidworks.

Para su impresión he usado Pla+ de la marca Sunlu colores gris y blanco.

Para configurar los archivos que finalmente van a la impresora (Alfawise U20 One) he usado un infill de 40% y una temperatura de cabezal de 210ºC.

Los archivos .stl de las 3 piezas podéis descargarlas desde el botón inferior:

Concusión

Sin más, espero que te resulte interesante este Tutorial Bitcoin Ticker DIY y te lances a su construcción, pues es algo que queda bastante resultón en cualquier sala o despacho. Todo el mundo se quedará mirándolo y te preguntará de donde lo has sacado.

Descargo de responsabilidad: no estoy patrocinado por ninguno de los proyectos/empresas mencionados en este artículo. Este no es un consejo financiero, la información de este artículo es solo para fines informativos, educativos y de entretenimiento. Nunca inviertas lo que no puedas permitirte perder. Renuncio a cualquier responsabilidad o pérdida incurrida por cualquier persona que actúe sobre la información, ideas o estrategias expuestas en mis artículos. Haz tu propia investigación y si inviertes, hazlo bajo tu propio riesgo y responsabilidad.

Hey!, 👋 si te gusta nuestro contenido y quieres colaborar para soportar los gastos del Canal, me puedes invitar a un ☕ café!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *