记录一次使用 ESP8266 做比特币视价器

前言

2018年开始投资比特币等数字货币,不料一路暴跌,血亏之后,卸载所有 app 。

计划屯币到2020年,等比特币再次减半,希望到时能回本或者小赚。

总得做点什么纪念这次失败的炒币行动,作为一个程序员,只能用代码来表示了。

决定做一个简单的比特币示价器,随时随地可以查看价格。


前期准备

硬件部分

- ESP8266 NodeMcu WIFI  

    这是一款类似 Arduino 一样操作硬件IO的设备,支持Nodejs 类似语法,而且集成了一个超低成本的 wifi 模块。非常适合我们用来做一些小玩意。

- 0.96寸OLED显示屏

     一个非常小的单色显示器,不支持中文显示,优点仅仅是便宜!

- 母对母杜邦线

    为了连接芯片和显示器用的。

软件部分

由于我用的是 macbook 所以,下载地址都是 mac 版本的。其他平台请到官网下载相应版本

- Arduino

   下载地址:https://www.arduino.cc/en/Main/Software

- CH340/CH341的USB转串口驱动程序

  下载地址:http://www.wch.cn/download/CH341SER_MAC_ZIP.html

连接方式:


引脚连接图

最终效果

代码

/*******************************************************************

    A project to display crypto currency prices using an ESP8266

    Main Hardware:

    - NodeMCU Development Board (Any ESP8266 dev board will work)

    - OLED I2C Display (SH1106)

    Written by Brian Lough

    https://www.youtube.com/channel/UCezJOfu7OtqGzd5xrP3q6WA

*******************************************************************/

// ----------------------------

// Standard Libraries - Already Installed if you have ESP8266 set up

// ----------------------------

#include <ESP8266WiFi.h>

#include <WiFiClientSecure.h>

#include <Wire.h>

// ----------------------------

// Additional Libraries - each one of these will need to be installed.

// ----------------------------

#include <CoinMarketCapApi.h>

// For Integrating with the CoinMarketCap.com API

// Available on the library manager (Search for "CoinMarket")

// https://github.com/witnessmenow/arduino-coinmarketcap-api

#include "SH1106.h"

// The driver for the OLED display

// Available on the library manager (Search for "oled ssd1306")

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

#include <ArduinoJson.h>

// !! NOTE !!: When installing this select an older version than V6 from the drop down

// Required by the CoinMarketCapApi Library for parsing the response

// Available on the library manager (Search for "arduino json")

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

// ----------------------------

// Configurations - Update these

// ----------------------------

char ssid[] = " wifi 名";      // your network SSID (name)

char password[] = " wifi 密码";  // your network key

// Pins based on your wiring

#define SCL_PIN D5

#define SDA_PIN D3

// CoinMarketCap's limit is "no more than 10 per minute"

// Make sure to factor in if you are requesting more than one coin.

// We'll request a new value just before we change the screen so it's the most up to date

unsigned long screenChangeDelay = 3500; // Every 10 seconds

// Have tested up to 10, can probably do more

#define MAX_HOLDINGS 10

#define CURRENCY "usd" //See CoinMarketCap.com for currency options (usd, gbp etc)

#define CURRENCY_SYMBOL "$" // Euro doesn't seem to work, $ and £ do

// You also need to add your crypto currecnies in the setup function

// ----------------------------

// End of area you need to change

// ----------------------------

WiFiClientSecure client;

CoinMarketCapApi api(client);

SH1106 display(0x3c, SDA_PIN, SCL_PIN);

unsigned long screenChangeDue;

struct Holding {

  String tickerId;

  float amount;

  bool inUse;

  CMCTickerResponse lastResponse;

};

Holding holdings[MAX_HOLDINGS];

int currentIndex = -1;

String ipAddressString;

void addNewHolding(String tickerId, float amount = 0) {

  int index = getNextFreeHoldingIndex();

  if (index > -1) {

    holdings[index].tickerId = tickerId;

    holdings[index].amount = amount;

    holdings[index].inUse = true;

  }

}

void setup() {

  Serial.begin(115200);

  // ----------------------------

  // Holdings - Add your currencies here

  // ----------------------------

  // Go to the currencies coinmarketcap.com page

  // and take the tickerId from the URL (use bitcoin or ethereum as an example)


  addNewHolding("bitcoin");

  addNewHolding("eos");

  addNewHolding("ethereum");

  addNewHolding("huobi-token");

  // ----------------------------

  // Everything below can be thinkered with if you want but should work as is!

  // ----------------------------

  // Initialising the display

  display.init();

  display.setTextAlignment(TEXT_ALIGN_CENTER);

  display.setFont(ArialMT_Plain_16);

  display.drawString(64, 0, F("BTC ETH EOS"));

  display.setFont(ArialMT_Plain_24);

  display.drawString(64, 18, F("DaZhang!!"));

  display.setFont(ArialMT_Plain_10);

  display.drawString(64, 42, F("desigen By zjm"));

  display.display();


  // Set WiFi to station mode and disconnect from an AP if it was Previously

  // connected

  WiFi.mode(WIFI_STA);

  WiFi.disconnect();

  delay(100);

  // Attempt to connect to Wifi network:

  Serial.print("Connecting Wifi: ");

  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {

    Serial.print(".");

    delay(500);

  }

  Serial.println("");

  Serial.println("WiFi connected");

  Serial.println("IP address: ");

  IPAddress ip = WiFi.localIP();

  Serial.println(ip);

  ipAddressString = ip.toString();

}

int getNextFreeHoldingIndex() {

  for (int i = 0; i < MAX_HOLDINGS; i++) {

    if (!holdings[i].inUse) {

      return i;

    }

  }

  return -1;

}

int getNextIndex() {

  for (int i = currentIndex + 1; i < MAX_HOLDINGS; i++) {

    if (holdings[i].inUse) {

      return i;

    }

  }

  for (int j = 0; j <= currentIndex; j++) {

    if (holdings[j].inUse) {

      return j;

    }

  }

  return -1;

}

void displayHolding(int index) {

  CMCTickerResponse response = holdings[index].lastResponse;

  display.clear();

  display.setTextAlignment(TEXT_ALIGN_CENTER);

  display.setFont(ArialMT_Plain_16);

  display.drawString(64, 0, response.symbol);

  display.setFont(ArialMT_Plain_24);

  double price = response.price_currency;

  if (price == 0) {

    price = response.price_usd;

  }

  display.drawString(64, 20, formatCurrency(price));

  display.setFont(ArialMT_Plain_16);

//  display.setTextAlignment(TEXT_ALIGN_CENTER);

//  display.drawString(64, 48, " 1h:" + String(response.percent_change_1h) + "%");

  display.setTextAlignment(TEXT_ALIGN_CENTER);

  display.drawString(64, 48, "24h: " + String(response.percent_change_24h) + "%");

  display.display();

}

void displayMessage(String message){

  display.clear();

  display.setFont(ArialMT_Plain_10);

  display.setTextAlignment(TEXT_ALIGN_LEFT);

  display.drawStringMaxWidth(0, 0, 128, message);

  display.display();

}

String formatCurrency(float price) {

  String formattedCurrency = CURRENCY_SYMBOL;

  int pointsAfterDecimal = 6;

  if (price > 100) {

    pointsAfterDecimal = 2;

  } else if (price > 1) {

    pointsAfterDecimal = 4;

  }

  formattedCurrency.concat(String(price, pointsAfterDecimal));

  return formattedCurrency;

}

bool loadDataForHolding(int index) {

  int nextIndex = getNextIndex();

  if (nextIndex > -1 ) {

    holdings[index].lastResponse = api.GetTickerInfo(holdings[index].tickerId, CURRENCY);

    return holdings[index].lastResponse.error == "";

  }

  return false;

}

void loop() {

  unsigned long timeNow = millis();

  if ((timeNow > screenChangeDue))  {

    currentIndex = getNextIndex();

    if (currentIndex > -1) {

      if (loadDataForHolding(currentIndex)) {

        displayHolding(currentIndex);

      } else {

        displayMessage(F("Error loading data."));

      }

    } else {

      displayMessage(F("No funds to display. Edit the setup to add them"));

    }

    screenChangeDue = timeNow + screenChangeDelay;

  }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容