📈
Ween's Lab
UdemyYouTubeTikTok
  • Welcome
  • 📻FPGA Tutorials
    • FPGA Boards: Getting Started
      • Getting Started with PYNQ on Kria KV260 Vision AI Starter Kit
      • Getting Started with PYNQ on Red Pitaya STEMlab 125-14
      • Getting Started with PYNQ on ZYBO
    • FPGA Ethernet Tutorial
      • FPGA Tutorial Ethernet 1: Simple TCP Server
    • PYNQ FPGA Tutorial 101
      • Part 0: Introduction
      • Part 1: GPIO
      • Part 2: Custom IP
      • Part 3: Memory
      • Part 4: ANN Processor
    • PYNQ FPGA Tutorial 102
      • Part 0: Introduction
      • Part 1: Memory Mapped
      • Part 2: Direct Memory Access
      • Part 3: AXI-Lite Multiplier
      • Part 4: AXI-Stream Multiplier with DMA
      • Part 5: AXI-Lite GCD
      • Part 6: AXI-Stream GCD with DMA
      • Part 7: Access to DDR from PL
    • ZYNQ FPGA Tutorial
      • Part 1: Gate-Level Combinational Circuit
      • Part 2: RT-Level Combinational Circuit
      • Part 3: Regular Sequential Circuit
      • Part 4: FSM Sequential Circuit
      • Part 5: ZYNQ Architecture
      • Part 6: ARM CPU and FPGA Module
      • Part 7: FPGA Memory
      • Part 8: Hardware Accelerator for Neural Networks
    • ZYNQ FPGA Linux Kernel Module
      • Cross Compiling Kernel, Kernel Module, and User Program for PYNQ
      • Configure PL to PS Interrupt in Kernel Module
      • Configure AXI DMA in Kernel Module
  • 📟Proyek Arduino
    • Kumpulan Proyek
      • Rangkaian LED
      • LED Berkedip Nyala Api
      • LED Chaser
      • LED Binary Counter
      • OLED 128x4 Bitcoin Ticker
      • Rangkaian Button
      • Button Multifungsi
      • Button Interrupt
      • Button Debouncing
    • Pelatihan Mikrokontroler Arduino ESP32
      • Bab 1 Pengenalan Mikrokontroler
      • Bab 2 Pengenalan Arduino
      • Bab 3 Pengenalan Bahasa C
      • Bab 4 Digital Output
      • Bab 5 Digital Input
      • Bab 6 Serial Communication
      • Bab 7 Analog-to-Digital Conversion
      • Bab 8 Interrupt
      • Bab 9 Timer
      • Bab 10 Pulse-Width Modulation
      • Bab 11 SPI Communication
      • Bab 12 I2C Communication
  • 💰Finance
    • Coding for Finance
      • Build a Bitcoin Price Alert with Google Cloud and Telegram
      • Build a Bitcoin Ticker with ESP32 and Arduino
      • Stock Price Forecasting with LSTM
    • Trading dan Investasi
      • Istilah Ekonomi, Keuangan, Bisnis, Trading, dan Investasi
      • Jalan Menuju Financial Abundance
      • Memahami Korelasi Emas, Oil, Dollar, BTC, Bonds, dan Saham
      • Mindset Trading dan Investasi
      • Rangkuman Buku: Rahasia Analisis Fundamental Saham
      • Rangkuman Buku: The Psychology of Money
      • Rangkuman Kuliah: Introduction to Adaptive Markets
      • Rumus Menjadi Orang Kaya
  • 📝Life
    • Life Quotes
Powered by GitBook
On this page
  • Penjelasan Proyek
  • Daftar Komponen
  • Rangkaian
  • Kode Program
  • Hasil
  1. Proyek Arduino
  2. Kumpulan Proyek

OLED 128x4 Bitcoin Ticker

PreviousLED Binary CounterNextRangkaian Button

Last updated 11 months ago

Penjelasan Proyek

Pada proyek ini, kita akan membuat display harga Bitcoin dengan modul OLED.

Daftar Komponen

Komponen yang diperlukan yaitu sebagai berikut:

  • Board ESP32

  • Breadboard

  • OLED 128x4 SSD1306

Rangkaian

Rangkaian yang dibuat yaitu sebagai berikut. ESP32 dan modul OLED dihubungkan dengan bus I2C. Pin yang digunakan yaitu pin 32 untuk SCL dan pin 33 untuk SDA.

Kode Program

Kode program yang dibuat yaitu sebagai berikut. Untuk menggunakan modul OLED, kita membutuhkan library Adafruit_SSD1306. Kita bisa menginstallnya dari library manager Arduino.

Kita perlu melakukan inisialisasi pada fungsi setup() sebagai berikut:

  • Serial communication untuk debugging. Kode tersebut dilakukan pada baris 30.

  • I2C communication untuk komunikasi dengan modul OLED. Kode tersebut dilakukan pada baris 33. Pada baris 8 dan 9, kita definisikan pin SDA dan SCL.

  • OLED module. Kita melakukan instansiasi objek di baris 15, dan kemudian inisialisasi pada baris 36 dan 37. Alamat I2C untuk modul ini yaitu 0x3C, didefinisikan pada baris 12.

  • Wi-Fi connection ke akses point Wi-Fi. Pada baris 40–50, kita melakukan setup koneksi Wi-Fi ke akses point yang memiliki koneksi internet. Untuk nama akses point dan paswword didefinisikan pada baris 18 dan 19. Sesuaikan ini dengan akses point yang digunakan masing-masing.

  • HTTP client. Kita melakukan instansiasi objek HTTP, deklarasi variabel request dan response pada baris 22–25. Kita menggunakan currentURL untuk mendapatkan harga hari ini dan historyURL untuk mendapatkan harga kemarin.

oled_ssd1306_bitcoin_ticker.ino
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

// Pin I2C
#define I2C_SDA 33
#define I2C_SCL 32

// Address I2C OLED
#define OLED_ADDR 0x3C

// Deklarasi object untuk OLED display
Adafruit_SSD1306 oled(128, 64, &Wire, -1);

// SSID dan password Wi-Fi AP
const char ssid[] = "<your_wifi_name>";
const char pass[] = "<yuor_wifi_password>";

// Koneksi HTTP, request, dan response
HTTPClient http;
const String currentURL = "http://api.coindesk.com/v1/bpi/currentprice/BTC.json";
const String historyURL = "http://api.coindesk.com/v1/bpi/historical/close.json";
String response = "";

void setup()
{
  // Setup serial communication
  Serial.begin(115200);

  // Inisialisasi pin I2C
  Wire.begin(I2C_SDA, I2C_SCL, 400000);
  
  // Inisialisasi OLED
  oled.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR);
  oled.clearDisplay();
  
  // Connect to a WiFi access point
  Serial.printf("Connecting to %s ...\n", ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  if (WiFi.waitForConnectResult() != WL_CONNECTED)
  {
    Serial.printf("WiFi connect failed! Rebooting...\n");
    delay(1000);
    ESP.restart();
  }
  Serial.printf("Connected\n");
  Serial.printf("IP address: %s\n", WiFi.localIP().toString().c_str());
}

void loop()
{
  // Request data hari ini
  http.begin(currentURL);
  http.GET();
  response = http.getString();
  http.end();

  // Parse JSON
  StaticJsonDocument<2000> doc;
  DeserializationError error = deserializeJson(doc, response);
  if (error)
  {
    Serial.printf("JSON parseObject() failed\n");
    return;
  }  

  // Ambil nilai time dan price hari ini
  String time = doc["time"]["updated"].as<String>();
  double price = doc["bpi"]["USD"]["rate_float"].as<double>();

  // Request data kemarin
  http.begin(historyURL);
  http.GET();
  response = http.getString();
  http.end();

  // Parse JSON
  StaticJsonDocument<2000> history_doc;
  DeserializationError history_error = deserializeJson(history_doc, response);
  if (history_error)
  {
    Serial.printf("JSON parseObject() failed\n");
    return;
  }  

  // Ambil nilai price kemarin
  JsonObject bpi_obj = history_doc["bpi"].as<JsonObject>();
  double yesterday_price;
  for (JsonPair kv : bpi_obj)
    yesterday_price = kv.value().as<double>();

  // Hitung persentase perubahan harga
  bool is_up = price > yesterday_price;
  double percent_change = is_up ? ((price-yesterday_price)/yesterday_price)*100 : ((yesterday_price-price)/yesterday_price)*100;
  String sign = is_up ? "+" : "";

  // Format text
  String txt0 = "BTC/USD " + sign + String(percent_change, 1) + "%";
  String txt1 = String(price, 2);
  String txt2 = "Last updated " + time.substring(13, 18);

  // Tampilkan hasil
  oled.clearDisplay();
  oled.setTextColor(WHITE);
  oled.setTextSize(1);
  print_center(txt0, 0, 0);
  oled.setTextSize(2);
  print_center(txt1, 0, 18);
  oled.setTextSize(1);
  print_center(txt2, 0, 50);
  oled.display();

  // Delay
  delay(1000);
}

// Fungsi untuk print text ke OLED dengan alignment center
void print_center(const String str, int x, int y)
{
  int16_t x1, y1;
  uint16_t w, h;
  oled.getTextBounds(str, x, y, &x1, &y1, &w, &h);
  oled.setCursor((x-w/2)+(128/2), y);
  oled.print(str);
}

Setelah inisialisasi, kemudian kita membuat fungsi utama loop(). Ini cara kerjanya:

  • Pada baris 56–72, kita melakukan request HTTP untuk mendapatkan harga Bitcoin saat ini.

  • Pada baris 75–93, kita melakukan request HTTP untuk mendapatkan harga Bitcoin kemarin.

  • Pada baris 96–98, kita melakukan perhitungan persentase perubahan harga dalam 1 hari.

  • Pada baris 101–114, kita menampilkan informasi Bitcoin pada modul OLED.

Di sini kita membuat fungsi print_center() pada baris 121–128 untuk print text pada modul OLED agar berada di posisi tengah.

Hasil

Hasil dari proyek ini yaitu pada gambar berikut ini.

📟
proyek_arduino/oled/oled_ssd1306_bitcoin_ticker/oled_ssd1306_bitcoin_ticker.ino at main · weenslab/proyek_arduinoGitHub
Logo