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

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 LED | WEMOSD1
- 5V — 5V
- R — D3
- G — D4
- B — D1
El 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.

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

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.

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é!