Jam Cuaca Arduino – Tampilan Real-Time Tanggal, Waktu, Suhu & Kelembaban
Komponen dan Perlengkapan
Arduino UNO – 1 unit
Sensor Suhu & Kelembaban DHT11 (4 pin) – 1 unit
Modul RTC Maxim Integrated DS3231 – 1 unit
Resistor 10k ohm – 1 unit
Tampilan Grafis OLED Adafruit 128x64 – 1 unit
Papan Rohok (generic) – 1 unit
Kabel Jumper (generic) – 15 buah
Tentang Proyek Ini
Apakah Anda pernah ingin membuat antarmuka sendiri yang dapat menampilkan waktu, tanggal, suhu, dan kelembaban? Ternyata lebih mudah dari yang Anda bayangkan. Beberapa komponen penting dibutuhkan, seperti yang ditunjukkan di bawah ini.
Arduino Uno/Nano
Pertama, Anda membutuhkan mikrokontroler. Saya menggunakan Arduino Uno untuk proyek ini, tetapi Arduino Nano juga memiliki cukup pin.
DHT11
DHT11 adalah sensor suhu dan kelembaban digital yang sangat terjangkau. Sensor menggunakan elemen kapasitif untuk kelembaban dan termistor untuk mengukur udara di sekitarnya. Waktu pembacaan sangat krusial, disarankan untuk mengambil pembacaan setiap 2 detik.
Catatan penting: Setelah mengatur waktu satu kali, pastikan Anda memberi komentar pada baris tersebut dan mengkompilasi ulang. Dengan cara ini, RTC akan melacak waktu, dan waktu tidak akan diatur ulang sesuai dengan waktu kompilasi sebelumnya.
DS3231
DS3231 adalah modul RTC, sama dengan modul DS1307 yang umum digunakan. Harganya cukup murah dan jauh lebih akurat dari sekutu DS1307nya. Modul ini mengandung osilator kristal terkompensasi suhu (TCXO) dan kristal terintegrasi. Perangkat ini mencakup masukan baterai dan mempertahankan pengaturan waktu yang akurat saat daya utama terganggu.
Tampilan Grafis OLED 128x64
Layar OLED akan menampilkan data kita. Ukuran layar ini cukup kompak dan layarnya sangat cerah. Layar OLED Adafruit dapat dikontrol menggunakan antarmuka SPI atau I2C, yang dapat diatur di bagian belakang layar. Anda dapat menggunakan layar yang lebih terjangkau juga (banyak tersedia di eBay), tetapi hati-hati dalam memilihnya karena layar perlu bekerja dengan file header yang akan kita gunakan melalui pustaka Adafruit.
Kode
Time_Temp_Humidity_Display.ino
Time_Temp_Humidity_Display.inoArduino
Ini adalah kode untuk mengkompilasi proyek. Ingat untuk menambahkan file header yang diperlukan, tanpa itu proyek tidak akan berfungsi.
//Salam pengguna hackster.io! //Tampilan Tanggal, Waktu, Suhu dan Kelembaban /////////////////////////Untuk OLED//////////////////////// #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> // Jika menggunakan SPI perangkat lunak (kasus default): #define OLED_MOSI 9 //MOSI alias SDA #define OLED_CLK 10 //CLK alias 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("Tinggi tidak benar, silakan perbaiki Adafruit_SSD1306.h!"); #endif ///////////////////////////////////////////////////////////// ////////////////////////////Untuk DHT////////////////////////// #include<dht.h> dht DHT; #define DHT11_PIN 3 int DHTtimer = 0; ///////////////////////////////////////////////////////////// ////////////////////////////Untuk RTC (DS3231)////////////////////////// //SDA ke A4, SCL ke A5 #define DS3231_I2C_ADDRESS 0x68 // Konversi angka desimal normal ke biner kode desimal byte decToBcd(byte val) { return( (val/10*16) + (val%10) ); } // Konversi biner kode desimal ke angka desimal normal byte bcdToDec(byte val) { return( (val/16*10) + (val%16) ); } ///////////////////////////////////////////////////////////// void setup() { Wire.begin(); Serial.begin(9600); //atur waktu awal di sini, setelah mengatur waktu, beri komentar pada bagian ini //DS3231 detik, menit, jam, hari, tanggal, bulan, tahun //setDS3231time(00,24,12,6,3,2,17); display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay(); } ////////////////////////////Koding DS3231////////////////////////// void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte dayOfMonth, byte month, byte year) { // mengatur data waktu dan tanggal ke DS3231 Wire.beginTransmission(DS3231_I2C_ADDRESS); Wire.write(0); // set input berikutnya untuk memulai dari register detik Wire.write(decToBcd(second)); // set detik Wire.write(decToBcd(minute)); // set menit Wire.write(decToBcd(hour)); // set jam Wire.write(decToBcd(dayOfWeek)); // set hari dalam seminggu (1=Minggu, 7=Sabtu) Wire.write(decToBcd(dayOfMonth)); // set tanggal (1 hingga 31) Wire.write(decToBcd(month)); // set bulan Wire.write(decToBcd(year)); // set tahun (0 hingga 99) 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); // set pointer register DS3231 ke 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // minta tujuh byte data dari DS3231 mulai dari register 00h *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; // ambil data dari DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // kirim ke monitor serial Serial.print(hour, DEC); // konversi variabel byte menjadi angka desimal saat ditampilkan 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(" Hari dalam seminggu: "); ////////////////////////////////////////////////////////////////// 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); } ////////////////////////////////////////////////////////////////// //////////////////////////////UNTUK HARI DALAM SEMINGGU///////////////////// switch(dayOfWeek){ case 1: Serial.println("Minggu"); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(20,0); display.print("Min"); 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; } //////////////////////////////UNTUK 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; } /////////////JARUM 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 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 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); ////////////////BAGIAN JAM ANALOG YANG TIDAK BERGERAK//////////////// 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 } void ReadTempAndHum () { int chk = DHT.read11(DHT11_PIN); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(70,45); display.print("Suhu: "); display.print(DHT.temperature, 0); display.print("C"); display.setCursor(70,56); display.print("Kelembaban: "); display.print(DHT.humidity, 0); display.print("%"); Serial.print(" Kelembaban: " ); Serial.print(DHT.humidity, 1); Serial.print("%"); Serial.print(" | Suhu: "); Serial.print(DHT.temperature, 1); Serial.println("C"); } void loop() { displayTime(); // tampilkan data RTC real-time pada Serial Monitor, DHTtimer = DHTtimer + 1; //Untuk memastikan DHT hanya dibaca setiap 2 detik, kita buat hitungan yang berlangsung selama 2 detik if (DHTtimer > 1) { display.fillRect(70, 45, 128, 64, BLACK); ReadTempAndHum (); DHTtimer = 0; } delay(1000); display.display(); //Bagian layar yang menampilkan waktu dan tanggal dihapus display.fillRect(0, 0, 64, 64, BLACK); display.fillRect(0, 0, 128, 20, BLACK); }
Catatan: Saya tidak dapat menemukan layar OLED yang tepat di Fritzing. Jika Anda perlu klarifikasi lebih lanjut tentang tempat keluar pin dari layar OLED, periksa komentar pada kode. File yang tersedia: breadboard_diagram_QvhPKCpIo5.fzz dan schematic_XKU0jQoWbx.fzz.