İçindekiler:

Arduino 3'ü 1 Arada Zaman ve Hava Durumu Göstergesi: 11 Adım
Arduino 3'ü 1 Arada Zaman ve Hava Durumu Göstergesi: 11 Adım

Video: Arduino 3'ü 1 Arada Zaman ve Hava Durumu Göstergesi: 11 Adım

Video: Arduino 3'ü 1 Arada Zaman ve Hava Durumu Göstergesi: 11 Adım
Video: Bir Zamanlar Kıbrıs 5. Bölüm 2024, Temmuz
Anonim

Yazar Boomer48Takip Yazar tarafından daha fazlası:

ATtiny85'i kullanma
ATtiny85'i kullanma
ATtiny85'i kullanma
ATtiny85'i kullanma
Pi Powered Pasta Bölme ve Çokgen Budama Aracı
Pi Powered Pasta Bölme ve Çokgen Budama Aracı
Pi Powered Pasta Bölme ve Çokgen Budama Aracı
Pi Powered Pasta Bölme ve Çokgen Budama Aracı
Manuel Ses Amplifikatörü için Dijital Kontroller
Manuel Ses Amplifikatörü için Dijital Kontroller
Manuel Ses Amplifikatörü için Dijital Kontroller
Manuel Ses Amplifikatörü için Dijital Kontroller

PIC mikrodenetleyicileri severim ve Assembly dilinde programlamayı severim. Aslında, son birkaç yılda bu kombinasyona dayalı olarak web sitemde yaklaşık 40 proje yayınladım. Geçenlerde en sevdiğim ABD satıcılarından birinden bazı parçalar sipariş ediyordum ve çıplak bir ATMEGA328 işlemci çipinden sadece 1,20 $ daha fazlasına programlama kablosu olan bir Arduino Nano gördüm. Bu yüzden birkaç tane aldım. Sonra Arduino IDE'yi indirdim ve 'C++' programlama hafızamı sildim.

Bu proje, zamanlama için GPS kullanan bir saatin ve ortak bir AcuRite sensöründen gelen hava durumu mesajlarını çözen bir RF alıcısının bir karışımıdır. Sonuç, küçük ölçekli bir zaman ve sıcaklık göstergesidir. GPS saati ve hava durumu rutinleri ayrı dahil dosyalar olarak ayarlanmıştır, böylece ana rutine girmek ve onu sadece saat fonksiyonunu veya sadece hava fonksiyonunu yapacak şekilde yapılandırmak kolaydır. İşlevlerden yalnızca birini istiyorsanız, ana rutinin başındaki uygun "#define" ifadesini kaldırmanız yeterlidir.

Her iki işlev de kullanılırsa, LCD'nin üst satırı yerel saati, LCD'nin alt satırı ise hem Celsius hem de Fahrenheit cinsinden nem ve sıcaklığı görüntüler. Yalnızca saat işlevi kullanılırsa, üst satır yerel saati, alt satır UTC'yi gösterir. Yalnızca hava durumu işlevi kullanılırsa, üst satırda alınan ilk sensör ve alt satırda alınan diğer sensörler görüntülenir. Bu özelliği ekledim çünkü iki hava sensörüm var.

Adım 1: Hava Sensörü

Hava Sensörü
Hava Sensörü
Hava Sensörü
Hava Sensörü
Hava Sensörü
Hava Sensörü

Burada kullanılan AcuRite hava sensörü, her 16 saniyede bir sıcaklık ve nem bilgisi gönderir. Arkasında 000592TXR model numarası gösterilir, ancak genellikle 06002M modeli olarak tanıtılır. Bu sensör birçok farklı hava istasyonu modeli tarafından kullanılıyor, bu yüzden bulunması kolay ve onları eBay'de 20 doların altına alabildim. AcuRite, bazı hava durumu istasyonları için benzer görünümlü sensörler satar, ancak bunlar aynı iletişim protokolüne bağlı olabilir veya olmayabilir. 00606 yalnızca sıcaklık sensörünün aynı mesaj biçimini kullandığına ancak geçersiz bir nem baytına sahip olduğuna dair internette bazı göstergeler var.

Yukarıda gösterilen ilk dalga biçiminde görüldüğü gibi, hava durumu mesajları, ardışık mesajlar arasında 2 ms'lik bir boşlukla patlamalar halinde gönderilir. Yukarıda gösterilen ikinci dalga formu, bit sürelerini ve modellerini görmek için bir mesajın bir kısmını genişletir. Yaklaşık 600 us yüksek ve ardından 600 us düşük olan dört eşitleme biti vardır. Veri bitleri, 400us yüksek, ardından 200us düşük (1) veya 200us yüksek ve ardından 400us düşük (0) ile temsil edilir.

Mesaj formatı 7 bayt veriden oluşur. İlk iki bayt sensör kimliğidir ve bunlar değişmez (yani, yuvarlanan kod kullanmaz). Son bayt, ilk altı baytın basit bir toplam sağlama toplamıdır. Üçüncü bayt, pil seviyesi göstergesidir ve pil iyiyse her zaman 44 altıgen olmalıdır. Dördüncü bayt nemdir ve 0 ile 99 arasında ölçeklenmemiş bir değerdir. Bayt 4, 5 ve 6'nın en önemli bitinin bir eşlik biti olduğunu ve ölçümün parçası olmadığını unutmamak önemlidir. değerler. Bayt 5 ve 6, 11 bitlik bir değer oluşturmak için bayt 5'in alt 4 biti alt 7 bit bayt 6 ile birleştirilen ölçeklendirilmiş sıcaklıktır (Santigrat). Sıcaklık her zaman pozitif bir sayı olarak temsil edilir ve yalnızca ölçeklendirme uygulandığında negatif olur. Ölçeklendirme (C / 10) - 100'dür. Sıcaklık çözünürlüğü bir derecenin onda biri kadar olduğu için 10'a bölme gereklidir. Çıkarma işlemi, iletilen değeri pozitif tutmak için sensör tarafından 100 eklendiğinden gereklidir.

Adım 2: RF Alıcısı

RF Alıcı
RF Alıcı
RF Alıcı
RF Alıcı

Bu proje için kullandığım RF modülü RXB6. Daha az arzu edilen süper rejeneratif alıcıların aksine, süper heterodin bir alıcıdır. Dışarıdaki ucuz RF modüllerine bakarsanız, verici ve alıcı kartlarının genellikle birlikte paketlendiğini göreceksiniz. Bu paket alıcıların çoğu süper rejeneratif tiplerdir, bu nedenle süper heterodin alıcılardan çok daha düşük performans özelliklerine (menzil dahil) sahip olma eğilimindedirler. Bu proje için sadece alıcı modülüne ihtiyacımız var çünkü bir hava sensörü vericisinden sinyal alacağız.

Adım 3: RF Antenler

RF Antenleri
RF Antenleri

RXB6 bir antenle gelmiyor. Bazı sarmal olanları oldukça ucuza satın alabilirsiniz, ancak kendi anteninizi yapmak da kolaydır. Aslında, çok süslü olmak istemiyorsanız, modülün anten pimine bir devre tahtası atlama kablosu takılabilir. İdeal olarak, düz bir tel anten, yaklaşık 6.8 inç'e kadar çıkan 1/4 dalga boyunda olacaktır. Başlangıçta atlama teli işini yaptım ve elektronik atölyem bodrumumda olmasına rağmen dış sensörümü almakta sorun yaşamadım.

Başka bir olasılık da kendi sarmal anteninizi yapmaktır. İnternette bunun için çeşitli planlar var ama yukarıdaki resimde gösterilen benim yaptığım şey. Hurda bir Ethernet kablosundan bir miktar sağlam çekirdek tel kullandım ve bunu 5/32 inçlik bir matkap ucunun pürüzsüz sapının etrafına sardım. RF kartına lehim yapan uç dışında yalıtımı açık bırakın. 20 dönüşe ihtiyacınız olacak. Ayrıca 7/32 inçlik bir matkap ucu kullanabilir ve bunun yerine 17 tur sarabilirsiniz. Bunlardan herhangi biri muhtemelen sensörleriniz için sahip olabileceğiniz aralıklar için gayet iyi çalışacaktır. Gerçek anahtar, başlamak için iyi bir RF alıcısına sahip olmaktır. AcuRite sensörleri ayrıca oldukça güçlü vericilere sahiptir.

Adım 4: RF İletişim Protokolü

Veri iletimi için birkaç farklı modülasyon tekniği vardır, ancak bu sensörler en basiti OOK (on-off-keying) veya ASK (genlik-shift-keying) kullanır. Bu örnekte 0/1 veri biti ile uğraştığımız için genlik tam açık veya tam kapalıdır. Dolayısıyla, bizim amaçlarımız için OOK ve ASK aynıdır çünkü OOK, RF taşıyıcısının ya dolu ya da dolu olduğu anlamına gelir. Mesaj formatı genellikle ileten cihazın üreticisi tarafından tanımlanır ve hemen hemen her iletim hızını, herhangi bir bit formatlama stilini ve herhangi bir mesaj uzunluğunu kullanabilirler. 433 MHz bandı, akıllı sayaçlar vb. gibi şeyler için aktarımlarla dolu olduğundan, yazılımın sadece kullanmak istediğimiz mesaj biçimini filtrelemek üzere ayarlanması gerekir.

Adım 5: Zaman Verisi

Zaman Verisi
Zaman Verisi

Elektrik kesintisinden sonra otomatik olarak yeniden başlayacak doğru zaman verilerini almak için ucuz bir GPS ünitesi kullanıyorum. Standart NMEA cümlelerini veren birkaç GPS birimim (ekransız) var, ancak sahip olduğum birimlerin en küçüğü ve en ucuzu NEO-6M. NEO-6M modülünün Arduino ile arayüzlenmesi kolaydır çünkü TTL seviyesinde bir seri port kullanır. Tek gerçek fark, NMEA standardının 4800'lük bir seri baud hızı belirtmesi, ancak NEO-6M'nin varsayılan olarak 9600 baud'a ayarlanmasıdır. Baud hızını değiştirmek için ücretsiz “u-center” programını çalıştırabilirsiniz, ancak fabrika varsayılanında bıraktım. Ayrıca, GPS bilgilerini PC'de görüntülemek için çok kullanışlı olan GPSInfo (Globalsat tarafından yayınlanmıştır) adlı ücretsiz bir yardımcı program da bulunmaktadır. Kontrol etmek veya bir PC kullanarak kurmak için GPS ünitesini standart bir USB - TTL kablosuna bağlayabilirsiniz. Modüldeki GPS çipinin aslında 3,3 voltta çalıştığını (yerleşik voltaj regülatörü aracılığıyla) unutmayın, bu nedenle RXD bağlantı noktasına bağlanmak istiyorsanız seviyeyi 5 volttan aşağı kaydırmalısınız. TXD bağlantı noktası doğrudan Arduino'ya veya PC'ye bağlanabilir.

Adım 6: Zaman Dilimleri

GPS zamanını görüntülemek, UTC'yi (Evrensel Zaman Koordineli) görüntülemek istediğiniz sürece yapılması kolay bir şeydir. NMEA cümleleri, doğrudan LCD'ye aktarılabilen ASCII karakterlerinden oluşur. Zaman bölümü HHMMSS. FF (saat, dakika, saniye ve kesirli saniye) biçimindedir. Saatimiz için kesirli kısım kullanışlı değildir, bu yüzden uğraşmamız gereken tek şey altı karakterdir. Sorun şu ki, isterseniz yerel saatinize ve 12 saatlik AM/PM formatına dönüştürmeniz gerekiyor. Ancak bazen hayatı ilginç kılan şey sorunlardır, bu yüzden yazılımın bu kısmı gerçekten bununla ilgilidir.

Saat dilimlerine gelince, 12 tanesi UTC konumunun (+ bölgeleri) doğusunda ve 12 tanesi UTC konumunun (- bölgeleri) batısında olmak üzere 24 tanesinin olacağını düşünebilirsiniz. Aslında, kesirli saatler olan birkaç tuhaf ve 12 saatlik “sınırını” aşan bir çift var. Bu bölgelerden birinde yaşıyorsanız özür dilerim çünkü yazılımım yalnızca 24 tam saat dilimini hesaba katar. Aramızda Yaz Saati Uygulamasını yılın bir bölümünde kullananlar da var ama bu yazılımda otomatik olarak hesaplanmıyor. Bu, gelecekteki tarihlerin bir arama tablosunu, yazılımda ekstra karmaşıklığı ve geçiş için yılın haftaları değiştiyse yazılımı güncelleme ihtiyacını gerektirecektir. Bunun yerine, donanım, saat diliminin (UTC ofseti) kolay ayarlanmasını sağlamak için bir anlık kontak anahtarı kullanır.

Adım 7: Şematik

Şematik
Şematik

Şematik yukarıda gösterilmiştir ve 4 bit 1602 LCD arayüzü için bağlantıları içerir. RF alıcıdan gelen seri veriler dijital mantık seviyelerinde olduğundan doğrudan Arduino veri giriş pinlerinden birine bağlanır. Pim, darbe genişliklerini ölçebilmemiz için yazılımda bir değişiklikte kesinti işlevi gerçekleştirecek şekilde yapılandırılmıştır. GPS TXD çıkışı, doğrudan Arduino RX girişine bağlanır.

Kullanılan iki anahtar vardır. Daha önce belirtildiği gibi, bir anlık kontak anahtarı UTC ofsetinin ayarlanmasına izin verir. Anahtar, ayar moduna girmek için herhangi bir zamanda basılabilir. Başlangıçta, ekran geçersiz bir UTC ofseti olan “+77” gösterecektir. UTC ofset ayarı talimatları için “Saat Yazılımı” bölümüne bakın.

İkinci anahtar basit bir açma/kapama anahtarıdır. “Kapalı” konumunda saat 12 saat formatında (AM/PM) görüntülenecek ve “açık” konumunda saat 24 saat formatında görüntülenecektir. Bu anahtar, formatlar arasında geçiş yapmak için herhangi bir zamanda değiştirilebilir.

Yalnızca saat işlevi isteniyorsa, RF alıcı modülünün bağlanmasına gerek yoktur. Yalnızca hava durumu işlevi isteniyorsa, GPS ve iki anahtarın bağlanmasına gerek yoktur.

Adım 8: LCD Yazılımı

İki tip LCD arayüzünden birini kullanma eğilimindeyim. Biri standart 4 bitlik arabirim, diğeri ise kaydırma yazmacı kullanan 3 telli bir arabirimdir. Bu arabirimi, sınırlı sayıda G/Ç pinine sahip küçük PIC mikro denetleyicileriyle çalışırken tasarladım. Bu proje için 4 bitlik arayüzü kullandım ancak genel Arduino LCD kitaplığını kullanmak yerine kendi LCD içerme dosyasına sahibim. Bu, bellek tüketimini ve kod karmaşıklığını azaltır ve ayrıca bunun gibi belirli projeler için kodu değiştirmeme izin verir.

9. Adım: Saat Yazılımı

GPS ünitesi, çeşitli bilgiler içeren ASCII dizileri olan standart NMEA-0183 cümlelerinin çıktısını verir. Bu uygulama için zaman bilgisini almak için GGA cümlesini seçtim çünkü bu cümle daha önceki bir GPS projesinde kullandığım cümleydi. NMEA cümlelerindeki bilgi alanları virgülle ayrılır, böylece GGA cümle başlığı tespit edildikten sonra, yazılım normalde virgülleri sayar ve istenen her GPS bilgisi alanı için uygun rutini çağırır. Burada sadece zaman bilgisi gereklidir ve bu ilk virgülden sonraki alanda olduğu için saymaya gerek yoktur.

Altı zaman basamağı (HHMMSS) ara belleğe alınır ve hepsi alındıktan sonra işlenir. GPS, bazı eksik mesajları erken verebilir, böylece arabelleğe alma rutini, her karakterin bir ASCII sayısal değeri olduğunu doğrular. Kötü bir karakter alınırsa, mesaj atılır. Bu, özellikle seri port iletişimi biraz düşerse, normal çalışma sırasında nadir durumlarda da olabilir. Bunu sadece bir kez gördüm ve olan tek şey, zamanın bir saniye duraklaması ve ardından bir yerine iki saniye atlamasıydı.

Yazılım yalnızca zaman gösterimi yapacak şekilde yapılandırılmışsa, LCD'nin ilk satırı yerel saati, ikinci satırı UTC'yi görüntüler. UTC için yazılım, ASCII karakterlerini, uygun şekilde yerleştirilmiş iki nokta üst üste (:) ile doğrudan görüntüleme rutinine gönderir.

UTC'yi yerel saate dönüştürmek için UTC ofseti (zaman dilimi) uygulanmalıdır. GPS'ten alınan UTC saati ASCII biçiminde olduğundan, yazılım ASCII saat karakterlerini ondalık sayıya dönüştürür ve ardından UTC ofsetini ekler. UTC ofseti, bir işaret biti ile pozitif bir BCD değeri olarak depolanır, bu nedenle ilk önce bir tamsayı değerine dönüştürülür ve ardından işaret biti ayarlanmışsa reddedilir. Yerel saat saat değeri hesaplandıktan sonra, onu BCD'ye dönüştürmek için bir arama tablosu kullanılır ve ardından BCD, görüntülenmek üzere tekrar ASCII'ye dönüştürülür. Arama tablosunun 24 saatlik UTC biçimini ve +/- 12 saat dilimini işlemesi gerekir. Bunu yapmak için, 0000'den 2300'e kadar olan UTC saatleri, saat dilimlerini hesaba katmak için önce 12 giriş ve sonra 12 giriş ile tablodaki orta 24 girişi işgal eder. Bir tablo 12 saatlik formatta olduğundan, ekranın AM/PM kısmı için bir arama tablosu da ekledim. Diğer tablo 24 saat formatındadır. Daha önce bahsedildiği gibi, bir açma/kapama anahtarı 12 saat veya 24 saat formatının seçilmesine izin verir.

Saat dilimi, başlatma sırasında EEPROM'dan alınır ve kısaca görüntülenir. En az bir kez ayarlanmamışsa ayar rutini çağrılır. Ayar rutini, herhangi bir zamanda anlık kontak anahtarına basılarak da çağrılabilir. Ayar rutini, ekranı “UTC OFFSET +77” olarak başlatacaktır. Düğmeye kısa bir basış, değeri “-00” olarak değiştirecektir. Pozitif bir saat dilimi gerekiyorsa, bir kez daha kısa basış değeri “+00” olarak değiştirecektir. Uzun bir basış (> 1 saniye) ayar modunu bir sonraki adıma taşıyacaktır. Bu noktada her kısa basış, zaman değerini maksimum 12'ye kadar artıracaktır. İstenilen saat dilimine ulaştıktan sonra, anahtarı 1 saniyeden fazla basılı tutun ve ardından bırakın. Yazılım daha sonra UTC değerini EEPROM'a kaydedecek ve kısaca “OFFSET SAVED” görüntüleyecektir. Giriş sırasında bir hata yaparsanız, sadece çıkın ve ardından sıfırlamak için düğmeye tekrar basın.

NEO-6M, zaman çıktısı almak için iyi bir konum düzeltmesi gerektirmez, bu nedenle bir uydu alır almaz mesaj göndermesi gerekir. O zamana kadar ekranda “NO DATA” yazısı görünecektir.

Adım 10: Hava Durumu Yazılımı

PIC mikro denetleyici, harici bir darbe kullanarak bir zamanlayıcıyı açma/kapama özelliğine sahiptir. Aynı giriş darbesi, darbe süresinin okunmasını bildirmek için harici bir kesinti olarak da kullanılabilir. Arduino'nun tam olarak bu özelliği yok, bu yüzden değişimde kesinti işlevini kullandım. RF mesajı darbesinin bir kenarında, mevcut mikrosaniye süresi, kesme işleyicisi tarafından kaydedilir. Karşı kenarda, darbe genişliğini belirlemek için geçen süre hesaplanır.

Yazılım, alınan mesajların ham veri formatının görüntülenmesini sağlayan bir “DEBUG” tanımına sahiptir. Ayrıca RF alıcısından gelen seri akış için Arduino giriş pinini belirtmek için bir tanımlama vardır. Yazılım, bu tanımlamaya dayalı olarak uygun değişiklikte kesinti kayıt ayarlarını hesaplamak üzere ayarlanmıştır. Hesaplama sadece Arduino dijital pinleri için geçerlidir. Bunun yerine bir analog pin kullanılabilir, ancak bu, kayıt değerlerinin sabit kodlanmasını gerektirir.

Kesme işleyicisi, yakalanan sayının bir başlangıç darbesi olacak kadar uzun olup olmadığını belirler. Daha önce belirtildiği gibi, birden fazla mesaj arasındaki boşluk 2 ms'dir, bu nedenle yazılımın aradığı şey budur. 433 MHz trafiğin tamamı nedeniyle, yazılımdaki ilk tarama, ölçülen sürenin en az 1.8 ms, ancak 2,4 ms'den fazla olmamasını sağlar. Başlatma algılandıktan sonra yazılım, senkronizasyon bitlerini (600us) arar ve dördünün alındığından emin olmak için sayar. Bu testler geçtikten sonra, yazılım 200us ve 400us'luk uygun bit sürelerini arar.

Alınan bitler baytlara dönüştürülür ve her bayt kaydedilir. Yedi bayt alındıktan sonra, daha fazla işleme izin verilmeden önce ileti sağlama toplamı doğrulanır. Ham baytlar çıkarılacaksa (hata ayıklama modu), baytlar ASCII karakterlerine dönüştürülür ve LCD'ye gönderilir. Nem ve sıcaklık çıkışları isteniyorsa uygun dönüşümler yapılır.

RF mesajındaki iki baytlık Santigrat verisi, 11 bitlik bir değer oluşturmak için bir araya getirilir. Parite bitini ortadan kaldırmak ve üst kısımdaki bitlerle hizalamak için alt kısım bir bit sola kaydırılır. İki bayt, 16 bitlik bir kelime değişkenine dönüştürülür ve ardından son bit hizalamasını elde etmek için her şey bir bit sağa kaydırılır. Kelime değişkeni daha sonra matematik hesaplamaları için kayan noktalı bir değişkene dönüştürülür.

Arduino'da C++ kullanmanın PIC'deki Assembly diline karşı büyük bir avantajı, matematik hesaplamalarını basitleştirmesidir. Daha önce belirtildiği gibi Santigrat dönüşümü (C / 10) -100'dür. Sonuç bir diziye dönüştürülür ve görüntülenmek üzere LCD'ye gönderilir. Fahrenheit hesaplaması (C * 1.8) + 32'dir. Sonuç tekrar bir dizgeye dönüştürülür ve görüntülenmek üzere LCD'ye gönderilir. Her iki durumda da, Dize dönüşümü, eksi işareti (uygunsa) ve ondalık noktayı içerir. Ondalık noktadan sonra ekrana yalnızca bir karakter gönderildiğinden emin olmak için ondalık nokta için bir kontrol yapılır. Dize uzunluğu 3 ila 5 karakter arasında değişebileceğinden bu kontrol gereklidir.

İki AcuRite sensörüm var, bu yüzden yazılım yalnızca hava durumu işlevini yapacak şekilde ayarlanmışsa, birinin verilerinin diğerinin verilerinin üzerine yazmamasını sağlamak için yazılıma bir kontrol ekledim. Güç açıldıktan sonra alınan ilk sensör 1. satırda, diğeri 2. satırda görüntülenir. Hata ayıklama modunu kullanarak, her sensör için kimliğin ne olduğunu görebilirim, böylece yalnızca kodda basit bir kontrol yapabilirim. birinden gelen verileri işlemek istedi.

Yazılım, pil durumunu (bayt3) izler ve pilin zayıf olduğunu belirtirse bir mesaj görüntüler. Bu mesaj, o sensör için diğer tüm verilerin üzerine yazar.

Adım 11: Ekranlar

görüntüler
görüntüler
görüntüler
görüntüler
görüntüler
görüntüler

İşte çeşitli işlevler için bazı örnek ekranlar. Birkaç başka Instructable'ım var ama PIC mikrodenetleyici projelerimin çoğu şu adresteki web sitemde bulunabilir: www.boomerrules.wordpress.com

Önerilen: