Jam Penggera Pintar Menggunakan Magicbit (Arduino): 10 Langkah
Jam Penggera Pintar Menggunakan Magicbit (Arduino): 10 Langkah
Anonim
Image
Image

Tutorial ini menunjukkan cara membuat jam penggera pintar menggunakan paparan OLED di papan pemuka Magicbit tanpa menggunakan modul RTC.

Bekalan

  • Magicbit
  • Kabel USB-A hingga Mikro-USB

Langkah 1: Cerita

Dalam tutorial ini kita akan belajar bagaimana membuat jam Penggera pintar menggunakan Magicbit.

Langkah 2: PENYEDIAAN PERKAKASAN

Pasang Magicbit anda ke komputer menggunakan kabel USB.

Langkah 3: PENYEDIAAN PERISIAN

Buka Arduino IDE anda dan siapkan papan dengan Arduino IDE. Pautan berikut merujuk cara melakukannya. Oleh itu, kami mengesyorkan agar anda terlebih dahulu pergi ke pautan dan membiasakan diri dengan Magic bit.

magicbit-arduino.readthedocs.io/en/latest/…

Sekarang pilih jenis papan dan port yang betul. Dalam kes ini jenis papan adalah Magicbit. Perpustakaan sudah terpasang ketika di perpustakaan Magicbit.

Langkah 4: Teori dan Metodologi

Sekiranya anda melihat video pertama, anda dapat melihat paparan mempunyai 2 skrin.

  • skrin jam yang menunjukkan perincian masa
  • skrin penggera yang menunjukkan perincian penggera

Untuk menukar antara dua skrin ini, kami menggunakan butang tekan dua di Magicbit. Butang ini disambungkan ke 35 (butang kiri) dan 34 (butang kanan) pin ESP32 di Magicbit. Untuk menunjukkan masa dan perincian lain, kami menggunakan paparan OLED bawaan di magicbit.

Mari kita bincangkan bagaimana skrin grafik ini berfungsi.

Skrin jam mempunyai jam analog, jam digital, tarikh, bulan dan teks tahun.

Untuk membuat jam analog, kami menggunakan beberapa fungsi grafik yang terdapat di perpustakaan grafik yang disebut Adafriut GFX. Dengan menggunakan fungsi bulatan dan fungsi garis kita membuat muka jam analog. Fungsi geometri ringkas yang disebut sin dan cos digunakan untuk kedudukan tangan jam. Oleh itu, kami hanya memasukkan sudut yang sesuai dengan masa untuk tangan putar. untuk itu kita menukar masa ke sudut seperti berikut.

  • sudut tangan minit = minit * (360/60)
  • sudut jam tangan = jam * (360/12)

Sudut diukur berkenaan dengan garis antara pusat muka jam dan nombor 12 pada jam muka. Dengan menggunakan fungsi sin dan kos kita dapat mengira koordinat x dan y pada garis akhir jam dan minit. Gambar di bawah menerangkan bagaimana keadaannya.

Menurut koordinat, kami mencetak jam dan minit dengan garis lukis. Terdapat juga fungsi cetak teks di perpustakaan Adafruit GFX. Ia membantu mencetak butiran lain (tarikh, bulan dan waktu ditunjukkan dalam angka) di paparan. Anda boleh mengubah kedudukan jam analog dan kedudukan teks dengan mengubah parameter dalam kod.

Seperti layar jam kami menggunakan fungsi mencetak teks di perpustakaan Adafruit GFX untuk mencetak nombor pada paparan OLED di tempat yang sesuai.

Langkah 5: Mendapatkan Waktu Tempatan

Bahagian yang paling penting ialah bagaimana kita mendapatkan waktu tempatan dengan tepat. Untuk tujuan itu anda boleh menggunakan modul jam RTC luaran atau jam RC terbina dalam ESP32 di Magicbit. Dalam projek ini kami menggunakan kaedah kedua. Dalam kaedah ini kita menggunakan klien NTP (network time protocall) untuk mendapatkan waktu tempatan dari internet. Untuk akses internet kami menggunakan kemudahan WIFI terbina dalam ESP32. Oleh itu, pada peringkat pertama kami menggunakan WIFI untuk mengakses internet dengan menyediakan SSID dan kata laluan. Maka kita harus mengkonfigurasi gmtOffset dan daylightOffset dalam pemboleh ubah dalam beberapa saat. Nilai pemboleh ubah ini berbeza dari wilayah ke wilayah di dunia. gmtOffset bermaksud bilangan saat anda berbeza dengan GMT.. Bagi kebanyakan ares daylightOffset adalah 3600. Anda boleh menemuinya di internet. Setelah mendapat waktu tempatan sekarang, kami tidak lagi menggunakan WIFI. Oleh kerana itu kami mengira waktu tempatan dari jam RC terbina dalam ESP32. Ini dilakukan dengan menggunakan perpustakaan time.h. Terdapat contoh ringkas dalam Arduino (Arduino> Contoh> ESP32> Masa> waktu sederhana) untuk anda mengetahui bagaimana ini berfungsi lebih jauh. Juga pautan ini boleh anda gunakan untuk pengetahuan lebih lanjut mengenai pelanggan NTP.

  • https://dronebotworkshop.com/esp32-intro/
  • https://lastminuteengineers.com/esp32-ntp-server-d…

Setelah mendapat waktu tempatan dengan betul, kami mengubah waktu menunjukkan teks dan sudut mengikut maklumat waktu itu di setiap gelung.

Langkah 6: Menyiapkan Penggera

Dengan mengklik butang kiri dan kanan, anda boleh mengubah pilihan tarikh dan waktu penggera. Pastikan mematikan penggera ketika anda mengubah tarikh dan waktu penggera. Setelah menetapkan tarikh dan masa hidupkan penggera. Kerana jika penggera dihidupkan dan ketika waktu penggera sama dengan waktu semasa anda semasa menyiapkannya, loceng penggera akan berdering. Dalam gelung utama selalu memeriksa waktu tempatan semasa dan maklumat penggera sama. Sekiranya semuanya sama, buzzer dan LED hijau yang dibina di Magicbit akan berfungsi selama satu minit.

Langkah 7: Menyiapkan Buzzer

Kami menggunakan nadi PWM untuk membuat bunyi buzzer dengan menggunakan fungsi analogCwrite () dalam kod. Kerana semua fungsi perpustakaan ada di ESP32 berlaku untuk Magicbit. Anda boleh menukar bunyi bip buzzer daripada mengubah frekuensi dan nilai PWM dalam kod.

techtutorialsx.com/2017/06/15/esp32-arduin…

Halaman ini menerangkan tentang bagaimana buzzer berfungsi dengan ESP32.

Langkah 8: Menyiapkan Butang

Untuk mengubah semua keadaan, kami menggunakan dua butang tekan dalam Magicbit. Gelung utama selalu memeriksa keadaan dua butang. Kerana mereka berhenti secara dalaman, keadaan normal adalah isyarat tinggi. Oleh itu, anda dapat melihat bacaan digital pin tersebut adalah 1. Pada peringkat lalai, paparan menunjukkan antara muka jam. Pada waktu itu, ketika salah satu dari dua butang ditekan, maka itu mengubah layar menjadi layar penggera. Kami juga menghitung waktu dalam beberapa saat dari saat terakhir ketika butang ditekan. Sekiranya kiraan itu lebih besar daripada jangka masa yang telah ditentukan, maka paparan akan menunjukkan skrin jam.

Kod ditulis dengan menggunakan fungsi asas untuk pemula. Jadi kodnya mudah difahami dan anda boleh mempelajari kaedahnya dengan merujuk kod tersebut.

Langkah 9: Penyelesaian masalah

Kadang-kadang jam dimulakan sedikit kemudian atau tidak memaparkan grafik dengan betul. Petua berikut membantu menyelesaikan keadaan.

  • Pastikan anda memberikan SSID dan kata laluan yang betul
  • Tukar pelayan NTP (anda boleh menemui banyak pelayan dari internet yang berkaitan dengan wilayah anda).
  • Mengubah sambungan internet. (Hotspot mudah alih juga boleh dilakukan).

Anda juga boleh menyelesaikan masalah semuanya dengan menggunakan monitor bersiri. Sebagai tambahan kepada monitor bersiri paparan OLED menunjukkan maklumat masa.

Langkah 10: Kod Arduino

// perpustakaan untuk paparan OLED

#sertakan

#include #include #define OLED_RESET 4 #include // wifi library for connect #include "time.h" // library untuk digunakan Jam RC // tentukan nama pin input dan output #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; pengiraan int = 0; int currentTime = 0; struct tm timeinfo; const char * ssid = "SSID ANDA"; // perincian wifi const char * password = "KATA LALUAN ANDA"; int alarmDateTime [5] = {1, 1, 2020, 0, 0}; // penggera berubah-ubah int dateIndex = 0; int timeIndex = 0; int selectIndex = -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}}; // pemilihan segi empat tepat const char * ntpServer = "asia.pool.ntp.org"; // pelayan detais const panjang gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Paparan Adafruit_SSD1306 (128, 64); // saiz OLED menentukan jam byteCenterY = (display.height () + 16) / 2; // butiran muka jam analog byte clockCenterX = (display.height () - 16) / 2; bait jamRadius = 23; keadaan bool = 0; // skrin hidup atau mati boolean Alarm = 0; // keadaan semasa penggera String alarmState = "Alarm ON"; // alarm on / off // varibles disimpan waktu data char dayName [10]; nombor hari char [3]; bulan char [10]; tahun char [5]; jam char [3]; minit char [3]; nombor bulan char [3]; saat char [3]; // pemboleh ubah butang bool RightState = 1; bool LeftState = 1; // pemboleh ubah buzzer int channel = 0; int Frekuensi = 2000; int PWM = 200; resolusi int = 8; batal persediaan () {// tetapkan input dan ouputs pinMode (RightButton, INPUT); pinMode (LeftButton, INPUT); pinMode (GreenLED, OUTPUT); pinMode (Buzzer, OUTPUT); display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // intialize display display.display (); kelewatan (3000); display.clearDisplay (); ledcSetup (0, Frekuensi, resolusi); // konfigurasikan parameter pwm ledcAttachPin (Buzzer, 0); Serial.begin (115200); // memanfaatkan komunikasi bersiri // sambungkan ke WiFi Serial.printf ("Menyambung ke% s", ssid); WiFi.begin (ssid, kata laluan); sementara (WiFi.status ()! = WL_CONNECTED) {kelewatan (500); Cetakan bersiri ("."); } Serial.println ("TERHUBUNG"); // init dan dapatkan configTime waktu (gmtOffset_sec, daylightOffset_sec, ntpServer); getTime (); // putuskan sambungan WiFi kerana tidak lagi diperlukan WiFi.disconnect (benar); WiFi.mode (WIFI_OFF); display.clearDisplay (); } gelung void () {getTime (); // dapatkan masa semasa // simpan keadaan butang tekan kanan dan kiri RightState = digitalRead (RightButton); LeftState = digitalRead (LeftButton); // periksa butang ditekan jika (RightState == 0 || LeftState == 0) {ledcWrite (0, 200); // apabila butang ditekan, buzzer mengeluarkan kelewatan bunyi bip (100); if (state == 0) {// ubah ke keadaan bingkai skrin penggera = 1; // ubah keadaan ke keadaan penggera RightState = LeftState = 1; // kita hanya memerlukan perubahan sceern} hitungan = 0; // set semula kaunter} jika (state == 1 && (hitungan) <5) {// jika di skrin penggera dan tidak ada timeout hitungAlarm (); // hitung nilai masa alarm informaton showAlarm (); // tunjukkan nilai} lain {// jika dalam jam keadaan skrin = 0; display.clearDisplay (); clockFace (); // analog jam muka cetakLocalTime (); // masa mencetak di muka jam dan mencetak butiran lain} onAlarm (); // membandingkan masa penggera dengan waktu tempatan dan menghidupkan kelewatan penggera (100); // kelewatan untuk hidup dan mati penggera} jam kosongFace () {// paparan muka jam caalog.drawCircle (clockCenterX, clockCenterY, clockRadius, WHITE); // cetak lingkaran menonton untuk (int digit = 0; digit = 5) {// hanya mempunyai 5 selctions.so reset ke -1 (-1 = diaktifkan atau dimatikan) pilihIndex = -1; } dateAndTimeSelection (selectIndex); // ubah selction} batal dateAndTimeSelection (int index) {if (index == -1) {// penggera hidup atau mati jika (RightState == 0) {// togol antara penggera hidup dan mati jika (alarmState == "Alarm ON") {alarmState = "Alarm MATI"; } lain {alarmState = "Alarm ON"; }}} lain {if (RightState == 0) {// dalam pilihan lain, tetapkan tarikh atau masa yang berkaitan dalam array alarmDateTime [index] = alarmDateTime [index] + 1; // index adalah pilihan}} int membandingkan [4] = {12, 2030, 23, 59}; // had atas tarikh dan tahun antara perbandingan [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // had atas bulan int resetValue [4] = {1, 2020, 0, 0}; // nilai permulaan untuk (int i = 1; saya bandingkan [i - 1]) {alarmDateTime = resetValue [i - 1]; }} if (alarmDateTime [0]> perbandingan [alarmDateTime [1] - 1]) {// reset vlaues jika bulan lebih besar daripada hadnya alarmDateTime [0] = 1; }} void showAlarm () {// mencetak butiran penggera String alarmDateTime0 = String (alarmDateTime [0]); // ubah sengatan untuk menunjukkan String alarmDateTime1 = String (alarmDateTime [1]); String alarmDateTime2 = String (alarmDateTime [2]); String alarmDateTime3 = String (alarmDateTime [3]); String alarmDateTime4 = String (alarmDateTime [4]); // jika nilai mempunyai satu 1 digit, tambahkan "0" padanya. jika (alarmDateTime [0]

Disyorkan: