비트코인 시세 모니터 만들기 [아두이노/ESP8266]
아두이노

비트코인 시세 모니터 만들기 [아두이노/ESP8266]

반응형

 

프로젝트를 설명하기에 앞서 이 프로젝트는 메카솔루션 오픈랩의 https://blog.naver.com/roboholic84/221158638114 프로젝트를 목적에 맞게 수정한 것임을 밝힌다.

 

이번에는 실시간으로 비트코인의 시세를 확인하고 그 증감을 %의 단위로 확인할 수 있는 비트코인 시세 모니터를 만들어 보았다.

 

사용된 부품은 아래와 같다.

 

I2C interface module

국내, 해외에서 쉽게 구입이 가능하다.

단독으로 팔거나 LCD에 결합되서 판매되기도 한다.

 16*2 LCD

가로 16칸 세로 2줄의 LCD 모듈을 이용한다. 밝기는 I2C interface module의 가변저항으로 조절이 가능하다.

     
 

 

 

 Wemos D1 mini

ESP8266

 

연결은 아래와 같이하면 된다.

 [소스코드]

1. WIFI 설정

초기에 wemos d1 mini가 연결할 와이파이를 설정해주는 과정이다. 스케치에 아래의 코드를 업로드 한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <ESP8266WiFi.h>
const char* ssid     = "SSID"//WIFI 이름
const char* password = "PASS"//WIFI 비밀번호
 
void setup() {
  Serial.begin(115200);
  delay(1000);
  WiFi.disconnect();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  Serial.println(WiFi.SSID());
  WiFi.setAutoConnect(true);
  WiFi.setAutoReconnect(true);
  WiFi.waitForConnectResult();
  Serial.println(WiFi.localIP());
}
 
void loop() {}
cs

 

연결할 와이파이의 이름과 비밀번호를 입력하여 코드를 변경하면 된다.

 

2. 비트코인 시세 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
 
WiFiClient client;
 
LiquidCrystal_I2C lcd(0x3F162);
 
HTTPClient http;
 
String payload;
 
int start_idx;
 
int end_idx ;
 
String prc;
 
int price;
 
float percent;
 
int old_price=13000000;
 
int key_blink = 0;;
 
int thehour;
 
 
void setup() {
 
  Serial.begin(115200);
  
  lcd.begin();
 
  lcd.backlight();
 
  lcd.clear();
 
  lcd.setCursor(00);
 
  lcd.print("Connecting...");
 
  WiFi.waitForConnectResult();
 
  lcd.setCursor(01);
 
  lcd.print("Complete!");
 
  delay(500);
 
  lcd.clear();
 
}
 
 
void loop() {
 
  WiFi.waitForConnectResult();
 
  String hour=getTime().substring(17,19);
  thehour=hour.toInt();
  
  if(thehour<16){
    thehour=thehour+9;
    char buf[30]={0};
    getTime().toCharArray(buf,30); 
    lcd.setCursor(00);
    lcd.print(thehour);
    lcd.setCursor(20);
    lcd.print(getTime().substring(1922));
  }
  
  else{
    char buf[30]={0};
    getTime().toCharArray(buf,30); 
    lcd.setCursor(0,0);
    lcd.println(getTime().substring(1722));
  }
 
  http.begin("http://api.coindesk.com/v1/bpi/currentprice/KRW.json");
 
  int httpCode = http.GET();
 
  if (httpCode == HTTP_CODE_OK) {
 
    payload = http.getString();
 
    start_idx = payload.lastIndexOf("rate_float"+ 12;
 
    end_idx = payload.lastIndexOf("}}}");
 
    prc = payload.substring(start_idx, end_idx);
 
    price = (float)prc.toInt()*1.0807;
 
    lcd.setCursor(131);
 
    lcd.print(key_blink == 0?"/":"|");
 
    key_blink = 1 - key_blink;
 
    if (old_price != price) {
 
        if(price > old_price){
        lcd.setCursor(90);
        lcd.print("+");
        float x = price - old_price;
        float y = x/float(old_price);
        float percent = 100 * y;
        lcd.setCursor(100);
        lcd.print(percent);
        lcd.setCursor(150);
        lcd.print("%");
        Serial.println(price);
        Serial.println(old_price);
        Serial.println(percent);
        }
 
        if(price < old_price){
        lcd.setCursor(90);
        lcd.print("-");
        float x = old_price - price;
        float y = x/float(old_price);
        float percent = 100 * y;
        lcd.setCursor(100);
        lcd.print(percent);
        lcd.setCursor(150);
        lcd.print("%");
        Serial.println(price);
        Serial.println(old_price);
        Serial.println(percent);
        }
        
 
      lcd.setCursor(01);
 
      lcd.print("                ");
 
      lcd.setCursor(01);
 
      lcd.print("KRW");
 
      lcd.setCursor(41);
 
      lcd.print(price);
 
      old_price = price;
 
    }
 
  }
 
  else {
 
    lcd.setCursor(150);
 
    lcd.print("ERR");
 
  }
 
  delay(1500);
 
}
 
String getTime() {
  while (!client.connect("google.com"80)) {}
  client.print("HEAD / HTTP/1.1\r\n\r\n");
  while(!client.available()) {}
  
  while(client.available()){
    if (client.read() == '\n') {    
      if (client.read() == 'D') {    
        if (client.read() == 'a') {    
          if (client.read() == 't') {    
            if (client.read() == 'e') {    
              if (client.read() == ':') {  
                client.read();
                String timeData = client.readStringUntil('\r');
                client.stop();
                return timeData;
              }
            }
          }
        }
      }
    }
  }
}
cs

 

위의 코드를 업로드하면 와이파이에 연결후에 현재시간, 비트코인의 가격 변동률(%), 1비트코인당 가격이 출력된다. 비트코인의 가격은 빗썸(www.bithumb.com)을 기준으로 한다.

거래소마다 한화의 가중치가 다른데, 위의 코드는 가중치를 어림잡아 계산하여 넣었기 때문에 약간의 오차가 존재한다. (수백원에서 수천원 정도) 그래도 가격의 증감과 변화는 동일하게 적용된다. 증감의 %값은 30분~24간의 데이터를 이용하는 것이 맞으나 매우 어렵기 때문에 바로전 가격을 기준으로 계산하도록 설정했다. 

자세한 작동 모습은 아래의 영상으로 확인할 수 있다.

 


개인적으로 주식이나 가상화폐에 큰 관심이 없었다. 따라서 본 프로젝트는 가상화폐에 대한 비 전문가가 만든것이며, 실생활에 사용할 목적이 아닌 연구나 재미를 위해 사용하길 바란다. 

반응형
    # 테스트용