Daftar Isi:
- Perlengkapan
- Langkah 1: Cerita
- Langkah 2: PENGATURAN PERANGKAT KERAS
- Langkah 3: PENYIAPAN PERANGKAT LUNAK
- Langkah 4: Teori dan Metodologi
- Langkah 5: Mendapatkan Waktu Lokal
- Langkah 6: Menyiapkan Alarm
- Langkah 7: Menyiapkan Buzzer
- Langkah 8: Menyiapkan Tombol
- Langkah 9: Pemecahan Masalah
- Langkah 10: Kode Arduino
2025 Pengarang: John Day | [email protected]. Terakhir diubah: 2025-01-13 06:57
Tutorial ini menunjukkan cara membuat jam alarm pintar menggunakan tampilan OLED di papan dev Magicbit tanpa menggunakan modul RTC apa pun.
Perlengkapan
- Magicbit
- Kabel USB-A ke Micro-USB
Langkah 1: Cerita
Dalam tutorial ini kita akan belajar tentang cara membuat jam Alarm pintar menggunakan Magicbit.
Langkah 2: PENGATURAN PERANGKAT KERAS
Colokkan Magicbit Anda ke komputer menggunakan kabel USB.
Langkah 3: PENYIAPAN PERANGKAT LUNAK
Buka Arduino IDE Anda dan atur papan dengan Arduino IDE. Tautan berikut merujuk cara melakukannya. Jadi kami menyarankan Anda untuk yang pertama pergi ke link dan membiasakan diri dengan Magic bit.
magicbit-arduino.readthedocs.io/en/latest/…
Sekarang pilih jenis dan port papan yang benar. Dalam hal ini jenis papan adalah Magicbit. Pustaka sudah terinstal saat di pustaka Magicbit.
Langkah 4: Teori dan Metodologi
Jika Anda melihat video pertama, Anda dapat melihat tampilan memiliki 2 layar.
- layar jam yang menunjukkan detail waktu
- layar alarm yang menampilkan detail alarm
Untuk beralih di antara dua layar ini, kami menggunakan tombol apa saja dari dua di Magicbit. Tombol-tombol ini terhubung ke 35 (tombol kiri) dan 34 (tombol kanan) pin ESP32 di Magicbit. Untuk menunjukkan waktu dan detail lainnya, kami menggunakan tampilan OLED bawaan di magicbit.
Mari kita bicara tentang bagaimana layar grafis ini bekerja.
Layar jam memiliki jam analog, jam digital, tanggal, bulan dan tahun teks.
Untuk membuat jam analog kami menggunakan beberapa fungsi grafis yang tersedia di perpustakaan grafis yang disebut Adafriut GFX. Dengan menggunakan fungsi lingkaran dan fungsi garis kita membuat tampilan jam analog. Fungsi geometris sederhana yang disebut sin dan cos digunakan untuk posisi jarum jam. Jadi kita hanya memasukkan sudut yang sesuai dengan waktu untuk memutar tangan. untuk itu kita ubah dulu waktu menjadi sudut sebagai berikut.
- sudut jarum menit=menit*(360/60)
- sudut jarum jam=jam*(360/12)
Sudut diukur terhadap garis antara pusat tampilan jam dan angka 12 pada tampilan jam. Dengan menggunakan fungsi sin dan cos, kita dapat menghitung koordinat x dan y dari ujung garis jam dan menit. Gambar di bawah ini menjelaskan cara kerjanya.
Menurut koordinat kami mencetak jarum jam dan menit dengan menggambar garis. Ada juga memiliki fungsi cetak teks di perpustakaan Adafruit GFX. Ini membantu untuk mencetak rincian lainnya (tanggal, bulan dan waktu ditampilkan dalam angka) pada layar. Anda dapat mengubah posisi jam analog dan posisi teks dengan mengubah parameter dalam kode.
Seperti layar jam, kami menggunakan fungsi cetak teks di perpustakaan Adafruit GFX untuk mencetak nomor pada layar OLED di tempat yang sesuai.
Langkah 5: Mendapatkan Waktu Lokal
Bagian terpenting dari jam adalah bagaimana kita mendapatkan waktu setempat secara akurat. Untuk tujuan itu Anda dapat menggunakan modul jam RTC eksternal atau jam RC inbuilt di ESP32 di Magicbit. Dalam proyek ini kami menggunakan metode kedua. Dalam metode ini kami menggunakan klien NTP (network time protocall) untuk mendapatkan waktu lokal dari internet. Untuk akses internet kami menggunakan fasilitas WIFI inbuilt di ESP32. Untuk itu pada tahap pertama kita menggunakan WIFI untuk mengakses internet dengan memberikan SSID dan password. Kemudian kita harus mengonfigurasi gmtOffset dan daylightOffset dalam variabel dalam hitungan detik. Nilai dari variabel-variabel ini berbeda dari satu wilayah ke wilayah lainnya di dunia. gmtOffset berarti jumlah detik Anda berbeda dari GMT.. Untuk sebagian besar area daylightOffset adalah 3600. Anda dapat menemukannya di internet. Setelah kami mendapatkan waktu setempat saat ini kami tidak lagi menggunakan WIFI. Karena kemudian kami menghitung waktu lokal dari jam RC bawaan di ESP32. Ini dilakukan dengan menggunakan perpustakaan time.h. Ada contoh sederhana di Arduino(Arduino>Contoh> ESP32> Waktu>simpletime) untuk Anda pelajari tentang cara kerjanya lebih lanjut. Juga tautan ini dapat Anda gunakan untuk pengetahuan lebih lanjut tentang klien NTP.
- https://dronebotworkshop.com/esp32-intro/
- https://lastminuteengineers.com/esp32-ntp-server-d…
Setelah mendapatkan waktu lokal dengan benar, kami mengubah waktu kami yang menunjukkan teks dan sudut sesuai dengan informasi waktu itu di setiap loop.
Langkah 6: Menyiapkan Alarm
Dengan mengklik tombol kiri dan kanan Anda dapat mengubah tanggal alarm dan pemilihan waktu. Pastikan mematikan alarm ketika Anda mengubah tanggal dan waktu alarm. Setelah mengatur tanggal dan waktu, nyalakan alarm. Karena jika alarm menyala dan waktu alarm sama dengan waktu Anda saat ini saat Anda mengaturnya, bel alarm akan berdering. Di loop utama selalu memeriksa waktu lokal saat ini dan informasi alarm sama. Jika sama, maka buzzer dan LED hijau bawaan di Magicbit akan bekerja selama satu menit.
Langkah 7: Menyiapkan Buzzer
Kami menggunakan pulsa PWM untuk membuat suara buzzer dengan menggunakan fungsi analogCwrite() dalam kode. Karena semua fungsi library yang ada di ESP32 berlaku untuk Magicbit. Anda dapat mengubah suara bip bel dari mengubah frekuensi dan nilai PWM dalam kode.
techtutorialsx.com/2017/06/15/esp32-arduin…
Halaman ini menjelaskan tentang bagaimana buzzer bekerja dengan ESP32.
Langkah 8: Menyiapkan Tombol
Untuk mengubah semua status, kami menggunakan dua tombol push bawaan di Magicbit. Loop utama selalu memeriksa keadaan dua tombol. Karena mereka berhenti secara internal, keadaan normal adalah sinyal tinggi. Jadi Anda dapat melihat pembacaan digital dari pin tersebut adalah 1. Pada tahap default, tampilan menunjukkan antarmuka jam. Pada saat itu, ketika salah satu dari dua tombol ditekan, maka layar akan berubah menjadi layar alarm. Kami juga menghitung waktu dalam detik dari terakhir kali tombol ditekan. Jika hitungan itu lebih besar dari beberapa durasi yang telah ditentukan, maka layar akan menampilkan layar jam.
Kode ditulis dengan menggunakan fungsi dasar untuk pemula. Jadi kodenya mudah dipahami dan Anda dapat mempelajari metode cara kerjanya dengan merujuk kode.
Langkah 9: Pemecahan Masalah
Beberapa kali jam mulai sedikit lebih lambat atau tidak menampilkan grafik dengan benar. Berikut tips membantu untuk memecahkan situasi.
- Pastikan Anda memberikan SSID dan kata sandi yang benar
- Ubah server NTP (Anda dapat menemukan banyak server dari internet yang terkait dengan wilayah Anda).
- Mengubah koneksi internet. (hotspot seluler juga bisa).
Anda juga dapat memecahkan masalah semuanya dengan menggunakan monitor serial. Selain layar OLED, monitor serial menunjukkan informasi waktu.
Langkah 10: Kode Arduino
//pustaka untuk tampilan OLED
#termasuk
#include #include #define OLED_RESET 4 #include //wifi library untuk koneksi #include "time.h"//library untuk penggunaan RC clock //tentukan nama pin input dan output #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int sebelum Waktu = 0; jumlah int = 0; int saat iniWaktu = 0; struct tm info waktu; const char* ssid = "SSID ANDA";//detail wifi const char* password = "PASSWORD ANDA"; int alarmDateTime[5] = {1, 1, 2020, 0, 0};//variabel alarm int dateIndex = 0; int indeks waktu = 0; int pilihIndeks = -1; bool buzzerOn = 0; int rect[6][4] = {{5, 0, 118, 16}, {1, 22, 30, 22}, {37, 22, 30, 22}, {73, 22, 55, 22}, {31, 44, 30, 20}, {67, 44, 30, 20}};//selection rectangle const char* ntpServer = "asia.pool.ntp.org";//server detais const long gmtOffset_sec = 1800; const int daylightOffset_sec = 0; Adafruit_SSD1306 display(128, 64);//OLED size define byte clockCenterY = (display.height() + 16) / 2;//detail tampilan jam analog byte clockCenterX = (display.height() - 16) / 2; byte clockRadius = 23; status bool = 0;//layar hidup atau mati boolean Alarm = 0;//alarm status saat ini String alarmState = "Alarm AKTIF";//alarm aktif atau nonaktif //variabel data waktu tersimpan char dayName[10]; char nomor hari[3]; bulan arang[10]; tahun arang[5]; jam arang [3]; menit karakter[3]; char bulannomor[3]; char detik[3]; //variabel tombol bool RightState = 1; bool Keadaan Kiri = 1; //variabel buzzer int channel = 0; int Frekuensi = 2000; int PWM = 200; int resolusi = 8; void setup() { //set input dan output pinMode(RightButton, INPUT); pinMode(Tombol Kiri, INPUT); pinMode(LED Hijau, OUTPUT); pinMode(Buzzer, OUTPUT); display.begin(SSD1306_SWITCHCAPVCC, 0x3C);//inisialisasi tampilan display.display(); penundaan(3000); tampilan.clearDisplay(); ledcSetup(0, Frekuensi, resolusi);//mengkonfigurasi parameter pwm ledcAttachPin(Buzzer, 0); Serial.begin(115200);//intilize komunikasi serial //koneksi ke WiFi Serial.printf("Koneksi ke %s ", ssid); WiFi.begin(ssid, kata sandi); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("TERHUBUNG"); //init dan dapatkan waktu configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); getWaktu(); //putuskan koneksi WiFi karena WiFi tidak lagi diperlukan.disconnect(true); WiFi.mode(WIFI_OFF); tampilan.clearDisplay(); } void loop() { getTime();//mendapatkan waktu saat ini //menyimpan status tombol tekan kanan dan kiri RightState = digitalRead(RightButton); LeftState = digitalRead(LeftButton); //chaeck tombol ditekan if (RightState == 0 || LeftState == 0) { ledcWrite(0, 200);//ketika tombol ditekan buzzer mengeluarkan suara bip delay(100); if (status == 0) {//ubah ke status bingkai layar alarm = 1;//ubah status ke status alarm RightState = LeftState = 1;//kita hanya perlu mengubah sceern } counts = 0;//reset counter } if (status == 1 && (hitungan) < 5) {//jika di layar alarm dan tidak ada batas waktu hitungAlarm();//hitung nilai waktu dari informasi alarm showAlarm();//tampilkan nilai } else {//jika dalam jam keadaan layar = 0; tampilan.clearDisplay(); clockFace();//cetakan muka jam analogLocalTime();//mencetak waktu di muka jam dan mencetak detail lainnya } padaAlarm();//bandingkan waktu alarm dengan waktu lokal dan nyalakan penundaan alarm(100);//tunda untuk alarm hidup dan mati } void clockFace() { //caalog tampilan muka jam.drawCircle(clockCenterX, clockCenterY, clockRadius, WHITE);//cetak lingkaran jam untuk (int digit = 0; digit = 5) { //hanya memiliki 5 selctions.so reset ke -1(-1= alarm aktif atau nonaktif) selectIndex = -1; } dateAndTimeSelection(selectIndex);//mengubah pilihan } void dateAndTimeSelection(int index) { if (indeks == -1) { //alarm aktif atau nonaktif if (RightState == 0) { //beralih antara alarm aktif dan nonaktif jika (alarmState == "Alarm AKTIF") { alarmState = "Alarm OFF"; } else { alarmState = "Alarm AKTIF"; } } } else { if (RightState == 0) { //dalam pilihan lain tambahkan tanggal atau waktu terkait dalam array alarmDateTime[index] = alarmDateTime[index] + 1; //index adalah pilihan } } int compare[4] = {12, 2030, 23, 59}; //batas atas tanggal dan tahun int comparemonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //batas atas bulan int resetValue[4] = {1, 2020, 0, 0}; //nilai awal untuk (int i = 1; saya membandingkan[i - 1]) { alarmDateTime = resetValue[i - 1]; } } if (alarmDateTime[0] > comparemonth[alarmDateTime[1] - 1]) { //reset nilai jika bulan lebih besar dari batasnya alarmDateTime[0] = 1; } } void showAlarm() { //cetak detail alarm String alarmDateTime0 = String(alarmDateTime[0]); //konversi sengatan untuk menampilkan String alarmDateTime1 = String(alarmDateTime[1]); String alarmDateTime2 = String(alarmDateTime[2]); String alarmDateTime3 = String(alarmDateTime[3]); String alarmDateTime4 = String(alarmDateTime[4]); // jika nilai memiliki satu 1 digit, tambahkan "0" padanya. jika (alarmDateTime[0]