İçindekiler:

Magicbit(Arduino) Kullanan Akıllı Çalar Saat: 10 Adım
Magicbit(Arduino) Kullanan Akıllı Çalar Saat: 10 Adım

Video: Magicbit(Arduino) Kullanan Akıllı Çalar Saat: 10 Adım

Video: Magicbit(Arduino) Kullanan Akıllı Çalar Saat: 10 Adım
Video: Connecting with Arduino IDE 2024, Kasım
Anonim
Image
Image

Bu eğitim, herhangi bir RTC modülü kullanmadan Magicbit geliştirme kartındaki OLED ekranı kullanarak akıllı bir çalar saatin nasıl yapıldığını gösterir.

Gereçler

  • sihirli bit
  • USB-A - Mikro USB Kablosu

1. Adım: Öykü

Bu derste Magicbit kullanarak akıllı bir Çalar saat yapmayı öğreneceğiz.

2. Adım: DONANIM KURULUMU

Magicbit'inizi USB kablosunu kullanarak bilgisayara takın.

3. Adım: YAZILIM KURULUMU

Arduino IDE'nizi açın ve kartı Arduino IDE ile kurun. Aşağıdaki bağlantı, bunun nasıl yapılacağına atıfta bulunur. Bu yüzden ilk önce bağlantıya gitmenizi ve Magic bit'i tanımanızı öneririz.

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

Şimdi doğru kart tipini ve bağlantı noktasını seçin. Bu durumda kart tipi Magicbit'tir. Magicbit kitaplıklarındayken kitaplıklar zaten yüklenmiştir.

Adım 4: Teori ve Metodoloji

İlk videoya bakarsanız, ekranın 2 ekranı olduğunu görebilirsiniz.

  • zaman detayını gösteren saat ekranı
  • Alarm ayrıntılarını gösteren alarm ekranı

Bu iki ekran arasında geçiş yapmak için Magicbit'te herhangi bir iki buton kullandık. Bu butonlar Magicbit'te ESP32'nin 35(sol tuş) ve 34(sağ tuş) pinlerine bağlanır. Zamanı ve diğer ayrıntıları göstermek için magicbit'te yerleşik OLED ekranı kullandık.

Bu grafik ekranların nasıl çalıştığından bahsedelim.

Saat ekranında analog saat, dijital saat, tarih, ay ve yıl yazıları bulunmaktadır.

Analog saat oluşturmak için Adafriut GFX adlı grafik kitaplığında bulunan bazı grafik işlevlerini kullanıyoruz. Daire fonksiyonunu ve çizgi fonksiyonunu kullanarak analog saat yüzü oluşturuyoruz. Sin ve cos adı verilen basit geometrik fonksiyonlar, saat ibrelerinin konumu için kullanılır. Bu yüzden sadece döndürme ibreleri için zamana karşılık gelen açıyı giriyoruz. bunun için önce zamanı aşağıdaki gibi açıya çeviririz.

  • yelkovan açısı=dakika*(360/60)
  • saat açısı ibresi=saat*(360/12)

Saat yüzünün merkezi ile saat yüzündeki 12 sayısı arasındaki çizgiye göre ölçülen açı. Sin ve cos fonksiyonlarını kullanarak saat ve dakika sonlarının x ve y koordinatlarını hesaplayabiliriz. Aşağıdaki resimde nasıl olduğu anlatılıyor.

Koordinatlara göre akrep ve yelkovanı çizerek yazdırıyoruz. Adafruit GFX kütüphanesinde text print özelliği de bulunmaktadır. Ekrana diğer detayların (tarih, ay ve saat gösterimi) basılmasına yardımcı olur. Koddaki parametreleri değiştirerek analog saat konumunu ve metin konumlarını değiştirebilirsiniz.

Saat ekranı gibi, OLED ekran üzerinde uygun yerlere numara yazdırmak için Adafruit GFX kitaplığındaki metin yazdırma işlevini kullandık.

Adım 5: Yerel Saati Alma

Saatin en önemli kısmı yerel saati nasıl doğru bir şekilde aldığımızdır. Bu amaçla, Magicbit'te ESP32'de harici RTC saat modülünü veya dahili RC saatini kullanabilirsiniz. Bu projede ikinci yöntemi kullandık. Bu yöntemde, yerel saati internetten almak için NTP (ağ zamanı protocall) istemcisini kullanıyoruz. İnternete erişim için ESP32'de yerleşik WIFI özelliğini kullandık. Bu nedenle ilk aşamada SSID ve şifre sağlayarak internete erişmek için WIFI kullanıyoruz. Ardından gmtOffset ve daylightOffset'i saniye cinsinden değişkenler halinde yapılandırmalıyız. Bu değişkenlerin değerleri dünyada bölgeden bölgeye farklılık göstermektedir. gmtOffset, GMT'den farklı olduğunuz saniye sayısı anlamına gelir.. Çoğu alan için daylightOffset 3600'dür. İnternette bulabilirsiniz. Mevcut yerel saati aldıktan sonra artık WIFI kullanmadık. Çünkü o zaman ESP32'de yerleşik RC saatinden yerel saati hesaplıyoruz. Bu, time.h kitaplığı kullanılarak yapılır. Bunun nasıl çalıştığını daha fazla öğrenmeniz için Arduino'da (Arduino>Örnekler>ESP32>Zaman>simpletime) basit bir örnek var. Ayrıca bu bağlantılar, NTP istemcisi hakkında daha fazla bilgi için kullanabilirsiniz.

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

Yerel saati doğru bir şekilde aldıktan sonra her döngüde o saat bilgisine göre zaman gösteren yazılarımızı ve açımızı değiştiriyoruz.

Adım 6: Alarmı Ayarlama

Sol ve sağ butonlara tıklayarak alarm tarih ve saat seçimini değiştirebilirsiniz. Alarm tarih ve saatini değiştirirken alarmı kapattığınızdan emin olun. Tarih ve saati ayarladıktan sonra alarmı açın. Çünkü alarm açıksa ve siz kurarken alarm zamanı sizin saatinize eşitse alarm zili çalacaktır. Ana döngüde her zaman mevcut yerel saat ve alarm bilgilerinin eşit olup olmadığını kontrol eder. Bunlar eşitse, Magicbit'teki sesli uyarı ve yerleşik yeşil LED bir dakika boyunca çalışacaktır.

7. Adım: Buzzer'ı Ayarlama

Kodda analogCwrite() işlevini kullanarak buzzer sesini oluşturmak için PWM darbesi kullanıyoruz. Tüm kütüphane fonksiyonları ESP32 içerisinde olduğundan Magicbit için geçerlidir. Buzzer'ın bip sesini, koddaki frekansını ve PWM değerini değiştirerek değiştirebilirsiniz.

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

Bu sayfada sesli uyarının ESP32 ile nasıl çalıştığı anlatılmaktadır.

Adım 8: Düğmeleri Ayarlama

Tüm durumları değiştirmek için Magicbit'te iki yerleşik buton kullandık. Ana döngü her zaman iki düğmenin durumunu kontrol eder. Dahili olarak çekildikleri için, normal durum yüksek sinyaldir. Yani bu pinlerin dijital okumalarının 1 olduğunu görebilirsiniz. Varsayılan aşamada ekran saat arayüzünü gösterir. Bu sırada iki tuştan herhangi birine basıldığında ekranı alarm ekranına değiştirir. Ayrıca düğmeye en son basıldığı andan itibaren geçen süreyi saniye cinsinden sayarız. Bu sayı önceden tanımlanmış bir süreden daha büyükse, ekran saat ekranını gösterecektir.

Kod, yeni başlayanlar için temel işlevler kullanılarak yazılmıştır. Yani kodun anlaşılması kolaydır ve kodu referans alarak yöntemin nasıl çalıştığını öğrenebilirsiniz.

9. Adım: Sorun Giderme

Bazı zamanlar saat biraz geç başlıyor veya grafikleri düzgün göstermiyor. Aşağıdaki ipuçları durumu çözmeye yardımcı olur.

  • Doğru SSID ve şifreyi verdiğinizden emin olun.
  • NTP sunucusunu değiştirin (internetten bölgenizle ilgili birçok sunucu bulabilirsiniz).
  • İnternet bağlantısını değiştirir. (mobil erişim noktası da mümkün olabilir).

Ayrıca seri monitörü kullanarak her şeyi giderebilirsiniz. OLED ekrana ek olarak seri monitör zaman bilgilerini de gösterir.

Adım 10: Arduino Kodu

//OLED ekran için kitaplıklar

#Dahil etmek

#include #include #define OLED_RESET 4 #include //bağlanmak için wifi kitaplığı #include "time.h"//kullanım için kitaplık RC saati //giriş ve çıkış pin adlarını tanımlayın #define RightButton 34 #define LeftButton 35 #define GreenLED 16 #define Buzzer 25 int preTime = 0; int sayıları = 0; int akımZaman = 0; struct tm zaman bilgisi; const char* ssid = "SSID'İNİZ";//wifi ayrıntıları const char* şifre = "ŞİFRENİZ"; int alarmDateTime[5] = {1, 1, 2020, 0, 0};//alarm değişkenleri int tarihIndex = 0; int zamanIndex = 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}};//selection rectangle const char* ntpServer = "asia.pool.ntp.org";//server detais const uzun gmtOffset_sec = 19800; const int daylightOffset_sec = 0; Adafruit_SSD1306 display(128, 64);//OLED boyutu tanımlı bayt clockCenterY = (display.height() + 16) / 2;//analog saat yüzü ayrıntıları bayt clockCenterX = (display.height() - 16) / 2; bayt saat Yarıçapı = 23; bool durumu = 0;//ekran açık veya kapalı boolean Alarm = 0;//alarm mevcut durum String alarmState = "Alarm AÇIK";//alarm açık veya kapalı //değişkenler saklanan zaman verisi char günAdı[10]; char gün sayısı[3]; karakter ayı[10]; karakter yılı[5]; char saatleri[3]; karakter dakikaları[3]; char ay numarası[3]; karakter saniye[3]; //düğme değişkenleri bool RightState = 1; bool LeftState = 1; //buzzer değişkenleri int kanal = 0; int Frekans = 2000; int PWM = 200; int çözünürlük = 8; void setup() { //giriş ve çıkışları ayarla pinMode(RightButton, INPUT); pinMode(Sol Düğme, GİRİŞ); pinMode(YeşilLED, ÇIKIŞ); pinMode(Buzzer, OUTPUT); display.begin(SSD1306_SWITCHCAPVCC, 0x3C);//display display.display(); gecikme(3000); display.clearDisplay(); ledcSetup(0, Frekans, çözünürlük);//pwm parametrelerini yapılandır ledcAttachPin(Buzzer, 0); Serial.begin(115200);//seri iletişimi intilize //WiFi'ye bağlan Serial.printf("%s'ye bağlanıyor ", ssid); WiFi.begin(ssid, şifre); while (WiFi.status() != WL_CONNECTED) { gecikme(500); Seri.print("."); } Serial.println(" BAĞLANTILI"); //başlat ve zamanı al configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); getTime(); //Artık gerekmediğinden WiFi bağlantısını kesin WiFi.disconnect(true); WiFi.modu(WIFI_OFF); display.clearDisplay(); } void loop() { getTime();//geçerli zamanı al //sağ ve sol buton durumlarını kaydet RightState = digitalRead(RightButton); LeftState = digitalRead(LeftButton); //butonları kontrol edin eğer (RightState == 0 || LeftState == 0) { ledcWrite(0, 200);//düğmeye basıldığında buzzer bip sesi çıkarır gecikme(100); if (durum == 0) {//alarm ekranı çerçeve durumuna geç = 1;//durumu alarm durumuna değiştir RightState = LeftState = 1;//sadece ekran değişikliğine ihtiyacımız var } sayım = 0;//sayacı sıfırla } ise (durum == 1 && (sayımlar) < 5) {//alarm ekranında ve zaman aşımı yoksa hesaplaAlarm();//alarm bilgilerinin zaman değerlerini hesapla showAlarm();//değerleri göster } else {//saatte ise ekran durumu = 0; display.clearDisplay(); clockFace();//analog saat yüzü printLocalTime();//saat kadranına zamanı yazdır ve diğer detayları yazdır } onAlarm();//alarm saatini yerel saatle karşılaştır ve alarm gecikmesini aç(100);// için gecikme alarm açık ve kapalı } void clockFace() { //caalog clock face display.drawCircle(clockCenterX, clockCenterY, clockRadius, WHITE);//izleme çemberini yazdır for (int digit = 0; digit = 5) { //sadece 5 tane var selctions.so -1'e sıfırlayın(-1= alarm açık veya kapalıdır) selectIndex = -1; } dateAndTimeSelection(selectIndex);//seçimi değiştir } void dateAndTimeSelection(int index) { if (index == -1) { //alarm on or off if (RightState == 0) { //eğer alarm açık ve kapalı arasında geçiş yap (alarmState == "Alarm AÇIK") { alarmState = "Alarm KAPALI"; } else { alarmState = "Alarm AÇIK"; } } } else { if (RightState == 0) { //diğer seçeneklerde dizideki ilgili tarihi veya saati artır alarmDateTime[index] = alarmDateTime[index] + 1; //indeks seçimdir } } int karşılaştırma[4] = {12, 2030, 23, 59}; //tarihlerin ve yılların üst sınırları int karşılaştırma ayı[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //ayların üst limiti int resetValue[4] = {1, 2020, 0, 0}; // için başlangıç değerleri (int i = 1; karşılaştırıyorum[i - 1]) { alarmDateTime = resetValue[i - 1]; } } if (alarmDateTime[0] > Comparemonth[alarmDateTime[1] - 1]) { //aylar limitlerinden büyükse değerleri sıfırla alarmDateTime[0] = 1; } } void showAlarm() { //alarm ayrıntılarını yazdır String alarmDateTime0 = String(alarmDateTime[0]); // sokmaları gösterecek şekilde dönüştür String alarmDateTime1 = String(alarmDateTime[1]); String alarmDateTime2 = String(alarmDateTime[2]); String alarmDateTime3 = String(alarmDateTime[3]); String alarmDateTime4 = String(alarmDateTime[4]); //değerlerin bir 1 rakamı varsa, onlara "0" ekleyin. if (alarmDateTime[0]

Önerilen: