Membuat Tampilan Temperatur dan Jam Analog dengan OLED 128×64

Indobot Update

Halo sahabat Indobot.

Sedang mengerjakan project apa hari ini?

Teman-teman sudah pernah menggunakan OLED 128X64? OLED ini merupakan salah satu display yang sudah lebih kompleks dari pada LCD. Jadi penggunaan OLED ini biasanya tidak hanya bisa menampilkan tulisan-tulisan saja. Tapi juga digunakan untuk menampilkan gambar. Jadi memang sayang sekali jika kita hanya menggunakan display ini hanya untuk menampilkan angka saja.

Nah pada project kali ini, kita akan membuat OLED ini menjadi penampil jam analog dan informasi temperatur dan kelembaban di ruangan tersebut. jam yang akan kita tampilkan menggunakan RTC (Real Time-Clock). Sedangkan untuk mengetahui temperatur, kita bisa menggunakan sensor DHT11.

 

Membuat Tampilan Temperatur
Membuat Tampilan Temperatur

Langsung saja kita coba.

Siapkan Alat dan Bahan

Alat dan bahan yang digunakan untuk project kita kali ini adalah sebagai berikut. Jangan sampai ada yang kelewat ya.

  1. laptop/PC yang terinstall Arduino IDE
  2. Arduino Uno 1
  3. 128×64 OLED graphic display 1
  4. DHT11                                 1
  5. RTC DS3231 1
  6. Breadboard 1
  7. Kabel jumper secukupnya

 

Belajar Elektronika, Arduino, dan IoT step by step dengan bantuan tangga belajar? Daftar sekarang dan dapatkan PROMO

 

Susun Skema Rangkaian

Susunlah rangkaian seperti berikut ini.

Membuat Tampilan Temperatur
Membuat Tampilan Temperatur

Tulislah Program pada Aplikasi Arduino IDE

Tulislah program arduino seperti berikut. Jangan sampai ada yang terlewat ya. Perhatikan keterangan-keterangannya agar teman-teman juga memahami program yang teman-teman buat.

 

//library untuk program
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//menginisialisasi ELED
#define OLED_MOSI   9 //MOSI aka SDA
#define OLED_CLK   10 //CLK aka SCL
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif


//DHT 11
#include<dht.h>
dht DHT;
#define DHT11_PIN 3
int DHTtimer = 0;
/////////////////////////////////////////////////////////////

//Program untuk RTC
#define DS3231_I2C_ADDRESS 0x68 //alamat I2C
// merubah nilai desimal menjadi biner
byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// // merubah nilai biner menjadi desimal
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}
/////////////////////////////////////////////////////////////

void setup()   
{          
  Wire.begin();      
  Serial.begin(9600); //serial monitor dengan 9600

  display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
}


//program untuk DS3231 (RTC)
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // pengaturan data tanggal dan jam
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); 
  Wire.write(decToBcd(second)); // detik
  Wire.write(decToBcd(minute)); // menit
  Wire.write(decToBcd(hour)); // jam
  Wire.write(decToBcd(dayOfWeek)); // mengatur hari (senin-minggu/monday-sunday)
  Wire.write(decToBcd(dayOfMonth)); // mengatur tanggal (1-31)
  Wire.write(decToBcd(month)); // mengatur bulan
  Wire.write(decToBcd(year)); // tahun
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); 
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void displayTime()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
  &year);
  // menunjukkan di serial monitor
  Serial.print(hour, DEC);
  // convert jam menjadi nilai desimal
  Serial.print(":");
  if (minute<10)
  {
    Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second<10)
  {
    Serial.print("0");
  }
  Serial.print(second, DEC);
  Serial.print(" ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print(" Day of week: ");

//////////////////////////////////////////////////////////////////
  //menunjukkan di OLED
  display.setCursor(50,0);
  display.print(dayOfMonth, DEC);
  display.print(",");

  display.setCursor(91,0);
  display.print("20");
  display.print(year, DEC);
  


  if (hour<10)
  {
      display.setCursor(40,10);
      display.print("0");
      display.print(hour, DEC);
      display.print(":");
  }
    if (hour>9)
  {
      display.setCursor(40,10);
      display.print(hour, DEC);
      display.print(":");
  }
 
  if (minute<10)
  {
    display.setCursor(58,10);
    display.print("0");
    display.print(minute, DEC);
    display.print(":");
  }
  
  if (minute>9)
  {
  display.setCursor(58,10);
  display.print(minute, DEC);
  display.print(":");
  }
 
  if (second<10)
  {
    display.setCursor(75,10);
    display.print("0");
    display.print(second, DEC);
  }

  if (second>9)
  {
    display.setCursor(75,10);
    display.print(second, DEC);
  }
  
//////////////////////////////////////////////////////////////////  
//////////////////////////////menunjukkan hari dalam 1 minggu/////////////////////  
  switch(dayOfWeek){
  case 1:
    Serial.println("Minggu");

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(20,0);
    display.print("Mgg");
    
    break;
  case 2:
    Serial.println("Senin");

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(20,0);
    display.print("Sen");
    
    break;
  case 3:
    Serial.println("Selasa");

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(20,0);
    display.print("Sel");
    
    break;
  case 4:
    Serial.println("Rabu");

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(20,0);
    display.print("Rab");
    
    break;
  case 5:
    Serial.println("Kamis");

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(20,0);
    display.print("Kam");
    
    break;
  case 6:
    Serial.println("Jumat");

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(20,0);
    display.print("Jum");
    
    break;
  case 7:
    Serial.println("Sabtu");

    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(20,0);
    display.print("Sab");
    
    break;
  }


//////////////////////////////bulan/////////////////////  
   switch(month)
   {
    case 1:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Jan");
    
    break;
    
    case 2:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Feb");
    
    break;

    case 3:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Mar");
    
    break;

    case 4:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Apr");
    
    break;

    case 5:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Mei");
    
    break;

    case 6:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Jun");
    
    break;

    case 7:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Jul");
    
    break;

    case 8:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Ags");
    
    break;

    case 9:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Sep");
    
    break;

    case 10:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Okt");
    
    break;

    case 11:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Nov");
    
    break;

    case 12:
    display.setTextSize(1);
    display.setTextColor(WHITE);
    display.setCursor(70,0);
    display.print("Des");
    
    break;
   }
   //menggambar jam analog di OLED
  /////////////jarum untuk jam///////////////
  float x1, y1, a, b;
  const float pi = 3.14;
  a=((hour-15)*30);
  b = (a*pi)/180;
  
  x1=40+(9*cos(b));
  y1=41+(9*sin(b));

  display.drawLine(40,41, x1, y1, WHITE);

  /////////////jarum untuk menit///////////////
//  float x1, y1, a, b;
//  const float pi = 3.14;
  a=((minute-15)*6);
  b = (a*pi)/180;
  
  x1=40+(17*cos(b));
  y1=41+(17*sin(b));

  display.drawLine(40,41, x1, y1, WHITE);

  /////////////jarum untuk detik///////////////
  //float x1, y1, a, b;
  a=((second-15)*6);
  b = (a*pi)/180;
  
  x1=40+(19*cos(b));
  y1=41+(19*sin(b));

  display.drawLine(40,41, x1, y1, WHITE);

   
////////////////tampilan jam yang tidak bergerak (lingkaran dll)////////////////
display.drawCircle(40, 41, 22, WHITE);
display.drawCircle(40, 41, 1, WHITE);

display.drawLine(40, 20, 40, 25, WHITE); //12
display.drawLine(40, 63, 40, 58, WHITE); //6
display.drawLine(62, 41, 57, 41, WHITE); //3
display.drawLine(19, 41, 24, 41, WHITE); //9
display.drawLine(50, 24, 47, 28, WHITE); //1
display.drawLine(57, 31, 53, 34, WHITE); //2
display.drawLine(60, 51, 54, 48, WHITE); //4
display.drawLine(51, 58, 48, 54, WHITE); //5
display.drawLine(29, 58, 32, 54, WHITE); //7
display.drawLine(21, 51, 25, 48, WHITE); //8

display.drawLine(22, 31, 27, 33, WHITE); //10
display.drawLine(30, 23, 32, 28, WHITE); //11
  
}
//function membaca temperatur dan kelembaban
void ReadTempAndHum ()
{
    int chk = DHT.read11(DHT11_PIN);

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(70,45);
  display.print("Temp: ");
  display.print(DHT.temperature, 0);
  display.print("C");

  display.setCursor(70,56);
  display.print("Hum: ");
  display.print(DHT.humidity, 0);
  display.print("%");

Serial.print(" Humidity: " );
Serial.print(DHT.humidity, 1);
Serial.print("%");
Serial.print(" | Temperature: ");
Serial.print(DHT.temperature, 1);
Serial.println("C");
}

void loop() {

  displayTime(); // menampilkan jam di serial monitor
 
  DHTtimer = DHTtimer + 1;
  if (DHTtimer > 1)
  {
  display.fillRect(70, 45, 128, 64, BLACK);
  ReadTempAndHum ();
  DHTtimer = 0;
  }
  delay(1000);

  display.display();
  //Bagian layar yang menunjukkan waktu dan tanggal akan dihapus
  display.fillRect(0, 0, 64, 64, BLACK);
  display.fillRect(0, 0, 128, 20, BLACK);
}

baca juga: Cara Mengakses LCD 128×64 pada Arduino

Upload program di atas, dan lihat hasilnya.

Program akan memunculkan jam analog yang memiliki jarum jam yang dapat bergerak seperti jam dinding. Kemudian dimunculkan juga nilai temperatur dan tanggal sebagai penunjuk jam dan tanggal.

Silakan pelajari program di atas. baca comment agar lebih mudah memahami program.

Selamat mencoba.


Mau belajar elektronika dasar? Arduino? atau Internet of Things? Ikuti kursus online Indobot Academy!

Ingin Tahu Program Kami Lebih Lanjut?

Silahkan isi Formulir Dibawah Ini untuk Diskusi dengan Tim Indobot Academy.

Baca Juga

Bagikan:

Tags

Tinggalkan komentar

whatsapp