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.
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.
- laptop/PC yang terinstall Arduino IDE
- Arduino Uno 1
- 128×64 OLED graphic display 1
- DHT11 1
- RTC DS3231 1
- Breadboard 1
- 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.
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!