Duino Coin Mining Monitor Esp 8266 - OLED 0.96 Display Module

Duino Coin Mining Monitor

Duino Coin Mining Monitor Esp 8266 - OLED 0.96

Dalam menambang Duino Coin, proses monitoring dapat dilakukan dengan berbagai cara. Nah umumnya, monitoring proses mining dilakukan via dahboard wallet. Perlu diketahui bahwa server dari duino coin menyediakan layanan REST-API. Dengan adanya layanan ini, kita dapat memperoleh beberapa informasi terkait proses mining yang sedang berlangsung seperti: Coin Balance, Jumlah Penambang, Total Hash rate, dll. Dokumentasi lengkap terkait struktur penggunaan REST API pada Duino Coin dapat dilihat di https://github.com/revoxhere/duco-rest-api

Dengan adanya layanan rest API tersebut, sangat memungkinkan bagi kita untuk melakukan akses informasi melalui perangkat ESP 8266 atau ESP 32. Dengan demikian kita dapat melakukan pemantauan melalui perangkat display yang terhubung dengan ESP8266 atau ESP32. Ok, tanpa basa-basi cus kita buat perangkat monitor DUCO mining menggunakan NodeMCU8266 dengan 28x64 OLED LCD Display Module 0.96 inch I2C .

Alat-Bahan

  • ESP 8266 dev board, disini saya menggunkan NodeMCU ver AMICA (teman-teman dapat menyesuaikan)
  • OLED Display Module 0.96 inch, dengan komunikasi I2C

Skematik

Terdapat beberapa jenis/model OLED Display Module 0.96 inch, jenis disini lebih terlihat berbeda pada urutan pinnya ya, misal ada yang urutan pinnya adalah GND, VCC, SCL, SDA. Tapi dipasaran ada juga display yang urutan pinnya VCC dulu baru GND. Silahkan sesuaikan saja yang jelas jangan sampai terbalik antara GND dan VCC. Di sisni kebetulan versi saya yang pin pertamanya adalah GND.

Duino Coin Mining Monitor Esp 8266 - OLED 0.96 Display Module

Duino Coin Mining Monitor Esp 8266 - OLED 0.96


Program

Secara alur proses, maka dapat dijelaskan bahwa perangkat melakukan request data ke server duino coin dengan format  https://server.duinocoin.com/v2/users/" + ducoUser + "?limit=1.  Dari request ini, maka akan diperoleh respon dengan format JSON seperti gambar berikut:

Duino Coin Mining Monitor with Esp 8266 - OLED

Nah dari response ini kita mndapatkan beberapa informasi terkait proses mining yang ditampung oleh user (wallet) kita. Pilah dan pilih informasi yang dibutuhkan kemudian kita tampilkan data tersebut melalui OLED Display Module. Ok, sebelum eksekusi, pastikan terlebihdahulu:

  • Board ESP8266 sudah terinstall di Arduino IDE.
  • Install Library Adafruit SSD1306, disini saya menggunakan versi 2.5.7
Duino Coin Mining Monitor Esp 8266 - OLED 0.96
  • Install Library Adafruit GFX, disini saya menggunakan versi 1.11.5
Duino Coin Mining Monitor Esp 8266 - OLED 0.96

  • Install Library Adafruit Bus IO. Disini saya menggunakan versi 1.14.1
Duino Coin Mining Monitor Esp 8266 - OLED 0.96

  • Install Library ArduinoJson, disini saya menggunakan versi 6.12.0
Duino Coin Mining Monitor Esp 8266 - OLED 0.96

Kalo library sudah di install/ready semuanya, Gas aja untuk programnya kurang lebih seperti ini:

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// 'wifi-icon', 16x16px
const unsigned char wifi_icon [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x07, 0xe0, 0x1f, 0xf8, 0x7c, 0x3e, 0xe7, 0xe7, 0xdf, 0xfb, 0x39, 0x1c, 
  0x37, 0xec, 0x0f, 0xf0, 0x0f, 0xf0, 0x03, 0xc0, 0x03, 0xc0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00
};

const char* ssid = "*************";      //Nama Wifi
const char* password = "************";   //Wifi Password

const String ducoUser = "*************"; // Duino-Coin username/Wallet username
const String ducoReportJsonUrl = "https://server.duinocoin.com/v2/users/" + ducoUser + "?limit=1";

const int run_in_ms = 5000;

float lastAverageHash = 0.0;
float lastTotalHash = 0.0;

String httpGetString(String URL) {
  String payload = "";
  WiFiClientSecure client;
  client.setInsecure();
  HTTPClient http;
  if (http.begin(client, URL)) {
    int httpCode = http.GET();
    if (httpCode == HTTP_CODE_OK) {
      payload = http.getString();
    }
    else {
      Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }
    http.end();
  }
  return payload;
}

boolean runEvery(unsigned long interval) {
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    return true;
  }
  return false;
}

void setup() {
  Serial.begin(115200);
  
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  
  // just intro
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(20,15);  display.println(F("  ARDUCODING"));
  display.setCursor(18,30);  display.println(F("DUINO COIN MINING"));
  display.setCursor(20,50);  display.println(F("   MONITOR"));
  display.display();
  delay(5000); 
  ConnectWIFI(); 
  delay(2000);

}

void loop() {
  if(WiFi.status() != WL_CONNECTED){
     ConnectWIFI();
  }
  if (runEvery(run_in_ms)) {
    float totalHashrate = 0;
    float avgHashrate = 0;
    int total_miner = 0;

    String input = httpGetString(ducoReportJsonUrl);
    DynamicJsonDocument doc (8000);
    DeserializationError error = deserializeJson(doc, input);

    if (error) {
      Serial.print("deserializeJson() failed: ");
      Serial.println(error.c_str());
      return;
      }

    JsonObject result = doc["result"];

    JsonObject result_balance = result["balance"];
    double result_balance_balance = result_balance["balance"];
    // const char *result_balance_created = result_balance["created"];
    const char *result_balance_username = result_balance["username"];
    // const char *result_balance_verified = result_balance["verified"];

    for (JsonObject result_miner : result["miners"].as<JsonArray>()) {
      float result_miner_hashrate = result_miner["hashrate"];
      totalHashrate = totalHashrate + result_miner_hashrate;
      total_miner++;
    }
    avgHashrate = totalHashrate / long(total_miner);
    
    display.clearDisplay(); 
    display.setTextColor(WHITE);
    display.setTextSize(1);
    String header_txt = String(result_balance_username)+" " + String(result_balance_balance) + " DUCO";
    Serial.println();
    Serial.println("result_balance_username : " + String(result_balance_username));   
    Serial.println("result_balance_balance : " + String(result_balance_balance) + " DUCO"); 
    display.setCursor(2,5);display.print("Acc : " + String(result_balance_username));
    display.setCursor(2,18);display.print("Bal : " +  String(result_balance_balance)); 
      
    //display.display(); //Invia il buffer da visualizzare al display
    //display.startscrollright(0x00, 0x07);

    if (totalHashrate > 1000){
      totalHashrate = totalHashrate/1000;
      Serial.println("totalHashrate : " + String(totalHashrate) + " kH/s"); display.setCursor(2,31);display.print("To.H: " + String(totalHashrate) + " kH/s");  
    }else{
      Serial.println("totalHashrate : " + String(totalHashrate) + " H/s"); display.setCursor(2,31); display.print("To.H: " + String(totalHashrate) + " H/s");  
    }

    if (avgHashrate > 1000){
      avgHashrate = avgHashrate / 1000;
      Serial.println("avgHashrate : " + String(avgHashrate) + " kH/s");
      display.setCursor(2,44); display.print("Av.H: " + String(avgHashrate) + " kH/s");  
    } else {
      Serial.println("avgHashrate : " + String(avgHashrate) + " H/s");
      display.setCursor(2,44); display.print("Av.H: " + String(avgHashrate) + " H/s");
    }
    
    Serial.println("total_miner : " + String(total_miner)); display.setCursor(2,57); display.print("Kuli: " + String(total_miner));
    display.display();
  }

}

void ConnectWIFI(){
  if(WiFi.status() != WL_CONNECTED){
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);
    int i=0;
    int a=0;
    while(WiFi.status() != WL_CONNECTED){ 
      Serial.print(".");
      display.clearDisplay(); 
      display.setTextSize(1);
      if (a==0){
        display.drawBitmap(52, 15, wifi_icon, 16, 16, WHITE);
        a=1;
        
      }else{
        display.drawBitmap(52, 15, wifi_icon, 16, 16, BLACK);
        a=0;
      }
      display.setCursor(25,40);display.print("Connecting ...");
      display.setCursor(25,55);display.print(ssid);
      display.display();
      delay(1000); 
      ++i;
      if (i==30){
        i=0;
        Serial.println("\n Failed to Connect.");
        break;
      }    
    }
    Serial.println("\n Connected!"); 
    display.clearDisplay(); 
    display.setTextSize(1);
    display.drawBitmap(52, 20, wifi_icon, 16, 16, WHITE);
    display.setCursor(25,40);display.print("Connected!");
    display.setCursor(25,55);display.print(ssid);
    display.display();
    delay(2000);
  }
}

Upload program diatas, untuk hasilnya kuranglebih seperti gambar dibawah. Salam Semangat ya, jangan lupa belajar kirim koin (ke akun arducoding).. mantab

Duino Coin Mining Monitor Esp 8266 - OLED 0.96