Pernahkah Anda ingin membuat antarmuka sendiri yang dapat menampilkan waktu, tanggal, beserta suhu dan kelembapannya? Yah itu jauh lebih mudah daripada yang Anda pikirkan.
Beberapa komponen penting diperlukan, seperti yang ditunjukkan di bawah ini.
Pertama kita akan membutuhkan pengontrol mikro. Saya menggunakan Arduino Uno untuk proyek saya, tetapi Arduino Nano juga akan memiliki cukup pin.
DHT11 adalah sensor suhu dan kelembaban digital yang sangat terjangkau. Ini menggunakan sensor kelembaban kapasitif dan termistor untuk mengukur udara di sekitarnya. Waktu pembacaan sangat penting, karena disarankan untuk membaca setiap 2 detik.
Ada poin kecil yang perlu diingat. Setelah menyetel waktu sekali, pastikan Anda mengomentari baris itu, dan kompilasi lagi. Dengan cara ini, RTC akan melacak waktu, dan waktu tidak akan disetel ke apa pun yang Anda kompilasi sebelumnya.
DS3231 adalah modul RTC, sama seperti modul DS1307 yang umum digunakan. Ini jauh lebih murah dan jauh lebih akurat daripada rekan DS1307-nya. Ini berisi osilator kristal kompensasi suhu (TCXO) dan kristal terintegrasi. Perangkat ini menggabungkan input baterai, dan mempertahankan ketepatan waktu yang akurat saat daya utama ke perangkat terputus.
Layar OLED akan menampilkan data kita. Ukuran layar ini cukup kompak dan layarnya sangat terang. Layar OLED Adafruit dapat dikontrol menggunakan antarmuka SPI atau I2C, yang dapat disesuaikan di bagian belakang layar. Anda juga dapat menggunakan layar yang lebih terjangkau (ada banyak di eBay), tetapi berhati-hatilah yang mana yang Anda beli karena layar harus bekerja dengan file header yang akan kita gunakan melalui perpustakaan Adafruit.
Kode
- Time_Temp_Humidity_Display.ino
Time_Temp_Humidity_Display.inoArduino
Ini adalah kode untuk mengkompilasi proyek. Ingatlah untuk menambahkan file header yang diperlukan, tanpa dengan proyek tidak akan berfungsi.//Salam pengguna hackster.io!//Tampilan Tanggal, Waktu, Suhu dan Kelembaban///////////// ////////////Untuk OLED///////////////////////#include #include #include #include // Jika menggunakan software SPI (default case):#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 13Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);#if (SSD1306_LCDHEIGHT !=64)#error("Tinggi salah, mohon perbaiki Adafruit_SSD1306/h!");#endif// ////////////////////////////////////////////////////////////////// //////////////////////////////////Untuk DHT//////////// //////////////#includedht DHT;#define DHT11_PIN 3int DHTtimer =0;///////////////// ////////////////////////////////////////////////////////////////// /////////////////////Untuk RTC (DS3231)/////////////////////// ////SDA ke A4, SCL ke A5#define DS3231_I2C_A DDRESS 0x68// Mengonversi angka desimal normal ke desimal berkode biner decToBcd(byte val){ return( (val/10*16) + (val%10) );}// Mengonversi desimal berkode biner ke angka desimal normalbyte bcdToDec(byte val ){ return( (val/16*10) + (val%16) );}//////////////////////////////////////// //////////////////////////////void setup() { Wire.begin(); Serial.begin(9600); //atur waktu awal di sini, setelah mengatur waktu, komentari bagian ini //DS3231 detik, menit, jam, hari, tanggal, bulan, tahun //setDS3231time(00,24,12,6,3,2,17); display.begin(SSD1306_SWITCHCAPVCC); display.clearDisplay();}//////////////////////////DS3231 coding///////////// /////////////void setDS3231time(byte detik, byte menit, byte jam, byte hariMinggu, bytedayOfMonth, byte bulan, byte tahun){ // menyetel data waktu dan tanggal ke DS3231 Wire.beginTransmission( DS3231_I2C_ADDRESS); Kawat.tulis(0); // set input berikutnya untuk memulai pada detik register Wire.write(decToBcd(second)); // setel detik Wire.write(decToBcd(menit)); // setel menit Wire.write(decToBcd(jam)); // setel jam Wire.write(decToBcd(dayOfWeek)); // set hari dalam seminggu (1=Minggu, 7=Sabtu) Wire.write(decToBcd(dayOfMonth)); // atur tanggal (1 hingga 31) Wire.write(decToBcd(bulan)); // setel bulan Wire.write(decToBcd(tahun)); // setel tahun (0 hingga 99) Wire.endTransmission();}membatalkan readDS3231time(byte *second,byte *minute,byte *hour,byte *dayOfWeek,byte *dayOfMonth,byte *month,byte *year){ Wire. mulaiTransmisi(DS3231_I2C_ADDRESS); Kawat.tulis(0); // setel penunjuk register DS3231 ke 00h Wire.endTransmission(); Wire.requestFrom(DS3231_I2C_ADDRESS, 7); // meminta tujuh byte data dari DS3231 mulai dari register 00h *second =bcdToDec(Wire.read() &0x7f); *menit =bcdToDec(Wire.read()); *jam =bcdToDec(Wire.read() &0x3f); *dayOfWeek =bcdToDec(Wire.read()); *dayOfMonth =bcdToDec(Wire.read()); *bulan =bcdToDec(Wire.read()); *tahun =bcdToDec(Wire.read());}void displayTime(){ byte detik, menit, jam, dayOfWeek, dayOfMonth, bulan, tahun; // mengambil data dari DS3231 readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // kirim ke serial monitor Serial.print(jam, DEC); // mengubah variabel byte menjadi angka desimal saat ditampilkan Serial.print(":"); if (menit<10) { Serial.print("0"); } Serial.print(menit, DES); Serial.print(":"); if (kedua<10) { Serial.print("0"); } Serial.print(kedua, DES); Serial.print(""); Serial.print(hariBulan, DES); Serial.print("/"); Serial.print(bulan, DES); Serial.print("/"); Serial.print(tahun, DES); Serial.print(" Hari dalam seminggu:");/////////////////////////////////////////////////////// //////////////////////////// display.setCursor(50,0); display.print(hariBulan, DES); tampilan.print(","); display.setCursor(91,0); display.print("20"); display.print(tahun, DES); if (jam<10) { display.setCursor(40,10); tampilan.print("0"); display.print(jam, DES); tampilan.print(":"); } if (jam>9) { display.setCursor(40,10); display.print(jam, DES); tampilan.print(":"); } if (menit<10) { display.setCursor(58,10); tampilan.print("0"); display.print(menit, DES); tampilan.print(":"); } if (menit>9) { display.setCursor(58,10); display.print(menit, DES); tampilan.print(":"); } if (kedua<10) { display.setCursor(75,10); tampilan.print("0"); display.print(kedua, DES); } if (kedua>9) { display.setCursor(75,10); display.print(kedua, DES); } //////////////////////////////////////////////////////////// ///////////////// ////////////////////////////UNTUK HARI WEEK///////////////////// switch(dayOfWeek){ kasus 1:Serial.println("Minggu"); tampilan.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(20,0); display.print("Matahari"); merusak; kasus 2:Serial.println("Senin"); tampilan.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(20,0); display.print("Senin"); merusak; kasus 3:Serial.println("Selasa"); tampilan.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(20,0); display.print("Selasa"); merusak; kasus 4:Serial.println("Rabu"); tampilan.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(20,0); display.print("Rabu"); merusak; kasus 5:Serial.println("Kamis"); tampilan.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(20,0); display.print("Kamis"); merusak; kasus 6:Serial.println("Jumat"); tampilan.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(20,0); display.print("Jumat"); merusak; kasus 7:Serial.println("Sabtu"); tampilan.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(20,0); display.print("Sab"); merusak; }/////////////////////////////UNTUK BULAN ///////////////// //// switch(bulan) { kasus 1:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Jan"); merusak; kasus 2:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Feb"); merusak; kasus 3:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Mar"); merusak; kasus 4:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Apr"); merusak; kasus 5:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Mei"); merusak; kasus 6:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Jun"); merusak; kasus 7:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Jul"); merusak; kasus 8:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Agustus"); merusak; kasus 9:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Sep"); merusak; kasus 10:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Oktober"); merusak; kasus 11:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Nov"); merusak; kasus 12:display.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,0); display.print("Des"); merusak; } /////////////JAM JARUM////////////// float x1, y1, a, b; const float pi =3,14; a=((jam-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=((menit-15)*6); b =(a*pi)/180; x1=40+(17*cos(b)); y1=41+(17*sin(b)); display.drawLine(40,41, x1, y1, WHITE); /////////////DETIK////////////////mengambang x1, y1, a, b; a=((kedua-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 AKAN BERGERAK////////////////display.drawCircle(40, 41, 22, PUTIH);display.drawCircle(40, 41, 1, WHITE);display.drawLine(40, 20, 40, 25, WHITE); //display.drawLine(40, 63, 40, 58, PUTIH); ///6display.drawLine(62, 41, 57, 41, PUTIH); //display.drawLine(19, 41, 24, 41, PUTIH); //display.drawLine(50, 24, 47, 28, PUTIH); //display.drawLine(57, 31, 53, 34, PUTIH); //2display.drawLine(60, 51, 54, 48, PUTIH); //4display.drawLine(51, 58, 48, 54, PUTIH); //5display.drawLine(29, 58, 32, 54, PUTIH); //display.drawLine(21, 51, 25, 48, PUTIH); //8display.drawLine(22, 31, 27, 33, PUTIH); //10display.drawLine(30, 23, 32, 28, PUTIH); //11 }void ReadTempAndHum (){ int chk =DHT.read11(DHT11_PIN); tampilan.setTextSize(1); display.setTextColor(PUTIH); display.setCursor(70,45); display.print("Suhu:"); display.print(DHT.temperature, 0); tampilan.print("C"); display.setCursor(70,56); display.print("Hum:"); display.print(DHT.kelembaban, 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(); // menampilkan data jam waktu nyata pada Serial Monitor, DHTtimer =DHTtimer + 1; //Untuk memastikan bahwa DHT hanya dibaca setiap 2 detik, kami menghitung selama 2 detik if (DHTtimer> 1) { display.fillRect(70, 45, 128, 64, BLACK); ReadTempAndHum(); DHTtimer =0; } penundaan(1000); tampilan.display(); //Bagian layar yang menunjukkan waktu dan tanggal dibersihkan display.fillRect(0, 0, 64, 64, BLACK); display.fillRect(0, 0, 128, 20, HITAM);}
Suku cadang dan penutup khusus
adafruit_ssd1306-master_KOASsXZpW2.zip adafruit-gfx-library-master_2IU6g1UpF6.zip dht_library_Xgke1ZhPls.zip dht-sensor-library-master_Al4SeQRvaS.zip arduinortclibrary-master_hKLoSjCilY.zip Skema
Catatan:Saya tidak dapat menemukan layar OLED yang tepat di Fritzing. Jika Anda memerlukan klarifikasi lebih lanjut tentang ke mana pin out dari OLED pergi, periksa komentar pada kode. breadboard_diagram_QvhPKCpIo5.fzzCatatan:Saya tidak dapat menemukan layar OLED yang tepat di Fritzing. Jika Anda memerlukan klarifikasi lebih lanjut tentang ke mana pin out dari OLED pergi, periksa komentar pada kode. schematic_XKU0jQoWbx.fzz