İçindekiler:

Yine Bir Başka Akıllı Hava İstasyonu, Ama: 6 Adım (Resimlerle)
Yine Bir Başka Akıllı Hava İstasyonu, Ama: 6 Adım (Resimlerle)

Video: Yine Bir Başka Akıllı Hava İstasyonu, Ama: 6 Adım (Resimlerle)

Video: Yine Bir Başka Akıllı Hava İstasyonu, Ama: 6 Adım (Resimlerle)
Video: BİR MAŞALLAH ALIRIZ ARTIK 2024, Aralık
Anonim
Image
Image
Yine Bir Başka Akıllı Hava İstasyonu, Ama…
Yine Bir Başka Akıllı Hava İstasyonu, Ama…
Yine Bir Başka Akıllı Hava İstasyonu, Ama…
Yine Bir Başka Akıllı Hava İstasyonu, Ama…
Yine Bir Başka Akıllı Hava İstasyonu, Ama…
Yine Bir Başka Akıllı Hava İstasyonu, Ama…

Tamam, her yerde bu türden pek çok hava istasyonu bulunduğunu biliyorum, ancak farkı görmek için birkaç dakikanızı ayırın…

  • Düşük güç
  • 2 e-kağıt ekranı…
  • ama 10 farklı ekran!
  • ESP32 tabanlı
  • ivmeölçer ve sıcaklık / nem sensörleri
  • Wi-Fi güncellemesi
  • 3D baskılı kılıf

ve daha bir çok faydalı hile…

Ana fikir, kutunun yönüne bağlı olarak her iki ekranda da çeşitli bilgileri görüntülemektir. Kasa paralelyüzlü kutu, kaldırım taşı, ayak görevi gören bir tür kemer şeklindedir.

Gereçler

Gördüğünüz gibi sistem 2 adet e-kağıt ekran ve bir adet 3D baskılı kutudan oluşmaktadır. Ama içinde çok şey var:

  • bir ESP32
  • Bir MPU6050 ivmeölçer
  • Bir DHT22 sensörü
  • Bir LiPo pil
  • Her şeyi bağlamak için bir PCB
  • Ev yapımı duPont ipleri

ve bir Wi-Fi bağlantısı. Aslında 3 ağ bildirilir, sistem bağlanmayı başarana kadar bunları tek tek test eder.

Adım 1: Neden Başka Bir Hava İstasyonu?

Neden Başka Bir Hava İstasyonu?
Neden Başka Bir Hava İstasyonu?
Neden Başka Bir Hava İstasyonu?
Neden Başka Bir Hava İstasyonu?
Neden Başka Bir Hava İstasyonu?
Neden Başka Bir Hava İstasyonu?
Neden Başka Bir Hava İstasyonu?
Neden Başka Bir Hava İstasyonu?

Buradaki fikir, kutunun yönüne bağlı olarak her iki ekranda da çeşitli bilgiler görüntülemektir. Kasa paralelyüzlü kutu, kaldırım taşı şeklinde olup, ayakta durmasını sağlayan bir destek görevi gören bir tür kemerdir.

İvmeölçer, hareketi ve yönü algılar ve ekranları tetikler.

Enerjiden tasarruf etmek için, artık güç verilmese bile ekranı tutan e-kağıt ekranları seçtim (aşağıdaki referanslara bakın). Benzer şekilde ESP32 için de Lolin32 modülünü (tutarlılığıyla ünlü) seçtim ve derin uykuyu ve ivmeölçer tarafından oluşturulan kesintide uyanmayı nasıl yöneteceğimi öğrenmek zorunda kaldım.

Ekranlar SPI aracılığıyla bağlı, onları ESP32'ye bağlamak için doğru pinleri bulmadan önce biraz araştırdım, ayrıca ivmeölçer için bir I2C'ye, DHT22'yi okumak için bir pin'e ve pil voltajı ölçümü için diğer 2 pin'e ihtiyacım olduğunu bilerek. ESP32 neredeyse tamamen şarj oldu! Bazı pinlerin salt okunur olduğunu (bunları DHT sensörü için kullandım), diğerleri Wifi ile birlikte kullanılamayacağını bilerek, doğru konfigürasyonu bulmak biraz karmaşıktı.

Kutu 4 yöne ve ayrıca düz olarak yönlendirilebilir. Sonuç olarak, 4*2+2 = 10 olası bilgi türünü yalnızca 2 ekranla görüntüleyebilirsiniz. Böylece birçok şeyi görüntülemenize izin verir:

  • Tarih ve günün azizi
  • şimdiki zaman
  • Bugünün hava durumu tahmini
  • Önümüzdeki saatler için hava tahminleri
  • Önümüzdeki günler için hava tahminleri
  • pil şarj seviyesi
  • Ve hala yerim olduğu için özel bir web sitesinden rastgele bir alıntı.

Adım 2: Neye İhtiyacınız Var?

Ne istiyorsun ?
Ne istiyorsun ?
Ne istiyorsun ?
Ne istiyorsun ?
Ne istiyorsun ?
Ne istiyorsun ?
  • ESP32: Lolin32 modülü (çok düşük güç, bir pil konektörü ile donatılmış, pili USB plus üzerinden şarj edebilir)
  • 2 epaper ekran: 4,2 inç ve 2,9 inç. Good Display mağazasından modelleri seçtim.
  • DHT22 sensörü
  • MCU6050 ivmeölçer - jirometre I2C sensörü
  • Bir LiPo pil
  • Akü voltajı ölçümü için: 2 adet 10k direnç, 1 adet 100k direnç, 1 adet 100nF kapasitör, 1 MOSFET transistör
  • Lehim ve havya, baskılı devre kartı
  • Kasa için bir 3D yazıcıya erişim

Ekli resim, PCB üzerindeki tüm bileşenlerin konumunu göstermektedir: Kasaya sığdırmak için çok büyük olmaması gereken yerden tasarruf etmem gerekiyordu.

Hava durumu verilerini almak için ayrıca hava durumu API'lerine kaydolmanız ve anahtarlarınızı 'Variables.h' dosyasında doğru yerlere koymanız gerekir (aşağıya bakın).

Hava durumu web siteleri:

  • apixu
  • doğru

Adım 3: Bu Proje Beni Düşündürdü ve Çok Şey Öğrendi…

Bu Proje Beni Düşündürdü ve Çok Şey Öğrendi…
Bu Proje Beni Düşündürdü ve Çok Şey Öğrendi…
Bu Proje Beni Düşündürdü ve Çok Şey Öğrendi…
Bu Proje Beni Düşündürdü ve Çok Şey Öğrendi…
Bu Proje Beni Düşündürdü ve Çok Şey Öğrendi…
Bu Proje Beni Düşündürdü ve Çok Şey Öğrendi…

Bu sistemin düşük güçte olması gerekiyordu, böylece her gece pili şarj etmenize gerek kalmıyordu… Enerjiden tasarruf etmek için, artık elektrik olmasa bile ekranı tutan e-kağıt ekranları seçtim. Benzer şekilde ESP32 için de (tutarlılığıyla ünlü) Lolin32 modülünü seçtim ve derin uykuyu ve ivmeölçer tarafından oluşturulan kesintide uyandırma çağrısını nasıl yöneteceğimi öğrenmek zorunda kaldım.

Kutu 4 yöne yönlendirilebilir, daha düz. Sonuç olarak, 4*2+2 = 10 olası bilgi türünü görüntüleyebilir. Böylece pek çok şey yapmanıza olanak tanır: tarih ve günün azizi, saat, bugünün hava durumu tahmini, önümüzdeki saatler veya günler için hava durumu tahminleri, pil şarj seviyesi ve özel bir web sitesinden rastgele bir alıntı.

İnternette aranacak çok şey var ve bildiğiniz gibi: WiFi enerji tasarrufunun düşmanıdır…

Bu nedenle, güncel bilgileri görüntülemek için ancak çok fazla zaman harcamadan bağlantıyı yönetmek zorundayız. Oldukça karmaşık bir başka sorun: oldukça doğru bir zaman tutmak. İnternette saati bulabildiğim için RTC'ye ihtiyacım yok ama ESP32'nin dahili saati özellikle uyku dönemlerinde biraz kayıyor. Saati internet üzerinden sıfırlamayı beklerken yeterince doğru kalmanın bir yolunu bulmalıydım. Her saat internette yeniden senkronize ediyorum.

Dolayısıyla, özerklik (İnternet bağlantılarının sıklığı) ile görüntülenen bilgilerin doğruluğu arasında bir denge vardır.

Çözülmesi gereken bir diğer sorun da hafızadır. ESP32 derin uykudayken, RTC RAM denilen şey dışında bellek kaybolur. Bu bellek 4MB genişliğindedir ve bunun sadece 2 tanesi program için kullanılabilir. Bu bellekte, bir uyku aşamasından sonra bir yürütmeden diğerine saklanması gereken çeşitli program değişkenlerini saklamalıyım: hava durumu tahminleri, saat ve tarih, simge dosya adları, alıntılar, vb. Bununla başa çıkmayı öğrenmek zorundaydım..

Simgelerden bahsetmişken, ESP32 dosya sistemi olan SPIFFS'de saklanırlar. Ücretsiz Wunderground hava durumu API'sinin kapatılmasının ardından, diğer ücretsiz hava durumu veri sağlayıcılarını aramak zorunda kaldım. İki tane seçtim: biri mevcut günün hava durumu için, 12 saatlik hava tahminleri, diğeri ise çok günlü hava tahminleri için. Simgeler aynı değil, bu yüzden bana iki yeni soruna neden oldu:

  • Bir simge seti seçin
  • Bu simgeleri 2 sitenin tahmin kodlarıyla eşleştirin

Bu yazışma, her seferinde yeniden yüklenmesi gerekmemesi için RTC RAM'de de saklanmıştır.

Simgelerle ilgili son sorun. Hepsini SPIFFS'de saklamak imkansız. Alan tüm dosyalarım için çok küçük. Görüntü sıkıştırma yapmak gerekliydi. Python'da simge dosyalarımı okuyan ve bunları RLE'ye sıkıştıran ve ardından sıkıştırılmış dosyaları SPIFFS'de saklayan bir komut dosyası yazdım. Orada tuttu.

Ancak e-kağıt görüntüleme kitaplığı, sıkıştırılmış görüntüleri değil, yalnızca BMP tipi dosyaları alır. Bu yüzden bu sıkıştırılmış dosyalardan ikonlarımı gösterebilmek için ek bir fonksiyon yazmam gerekti.

İnternette okunan veriler genellikle json formatındadır: hava durumu verileri, günün azizi. Bunun için (harika) arduinoJson kitaplığını kullanıyorum. Ama alıntılar öyle değil. Bunları özel bir siteden alıyorum, bu yüzden doğrudan web sayfasının içeriğine bakarak okumam gerekiyor. Bunun için özel bir kod yazmam gerekiyordu. Her gün gece yarısı civarında, program bu siteye gider ve yaklaşık on rastgele alıntı okur ve bunları RTC RAM'de saklar. Muhafaza büyük ekran yukarıya doğru yönlendirildiğinde bunlardan biri rastgele görüntülenir.

Aksanlı karakterlerin görüntülenmesi sorununu size iletiyorum (üzgünüm, ancak alıntılar Fransızcadır)….

Küçük ekran açıldığında, kalan seviyeyi daha iyi görmek için bir çizimle birlikte pil voltajı görüntülenir. Akü voltajını okumak için elektronik bir montaj yapmak gerekiyordu. Ölçüm pili boşaltmaması gerektiği için, sadece ölçüm yapıldığında akımı tüketmek için bir MOSFET transistörünü anahtar olarak kullanan internette bulunan bir şema kullandım.

Bu devreyi yapabilmek ve her şeyi kutuya sığdırabilmek için, mümkün olan en küçüğünü istedim, sistemin tüm bileşenlerini bağlamak için bir PCB yapmam gerekiyordu. Bu benim ilk PCB'm. Şanslıydım çünkü bu tarafta ilk defa her şey yolunda gitti…

İmplantasyon haritasına bakın: "yasak bölge", USB kablosunu bağlamak için ayrılmış bir alandır. Lolin32 modülü, pili USB üzerinden şarj etmenizi sağlar: USB kablosu bağlıysa pil şarj olur ve modül aynı anda çalışır.

Son nokta: yazı tipleri. Farklı boyutlarda, kalın olsun ya da olmasın, oluşturulmaları ve saklanmaları gerekiyordu. Adafruit GFX kütüphanesi, font dosyalarını doğru dizine yükledikten sonra bunu çok iyi halleder. Dosyaları oluşturmak için Font Converter sitesini kullandım, çok uygun!

Seçtiğinizden emin olun:

  • Önizleme ekranı: TFT 2.4"
  • Kütüphane versiyonu: Adafruit GFX Yazı Tipi

Özetlemek gerekirse: çok şey öğrenmeme izin veren büyük bir proje

Adım 4: E-kağıt Ekranlarını Kullanma

E-kağıt Ekranlarını Kullanma
E-kağıt Ekranlarını Kullanma

Bu ekranların ana dezavantajı videoda açıkça görülebilir: Ekranın güncellenmesi bir veya iki saniye sürer ve yanıp sönerek yapılır (iki ekranın normal ve ters çevrilmiş versiyonlarının alternatif gösterimi). Bu, hava durumu bilgileri için kabul edilebilir çünkü çok sık güncelleme yapmıyorum (kutunun yön değişikliği dışında her saat). Ama zaman için değil. Bu yüzden (ve tüketimi sınırlamak için) hala HH:MM ekranını kullanıyorum (saniyeleri değil).

Bu yüzden ekranı güncellemenin başka bir yolunu aramak zorunda kaldım. Bu ekranlar (bazıları) kısmi bir güncellemeyi destekler (ekranın bir alanına veya tüm ekrana uygulanır…) ancak bu benim için iyi değildi çünkü büyük ekranım (zamanı gösteren) piksellerin hayaletlerini tutuyor değiştirilenler. Örneğin, 10:12'den 10:13'e geçerken, '2' '3' içinde biraz görünür ve '4', '5' vb.'den sonra daha da görünür hale gelir. benim ekranım için durumun böyle olduğunu belirtmek için: Bunu, bu fenomeni kendi ekranlarında gözlemlemediğini söyleyen e-kağıt görüntüleme kitaplığı GxEPD2'nin yazarıyla tartıştım. Hayaletleri avlamayı başaramadan parametreleri değiştirmeye çalıştık.

Bu yüzden başka bir çözüm bulmamız gerekiyordu: Sorunu çözen (en azından benim için tatmin edici) kısmi bir çift tazeleme yapmayı önerdim. Saatler ekran yanıp sönmeden geçiyor ve hayaletler yok. Ancak, geçiş hemen gerçekleşmez: zamanı değiştirmek bir saniyeden biraz fazla sürer.

Adım 5: Yapımı

Gerçekleştirmek
Gerçekleştirmek
Gerçekleştirmek
Gerçekleştirmek
Gerçekleştirmek
Gerçekleştirmek
Gerçekleştirmek
Gerçekleştirmek

Yön değiştiğinde içeride hiçbir şeyin hareket etmemesini sağlamak için farklı bileşenler (ekranlar, elektronik modüller, PCB'ler, piller) bir tutkal tabancasıyla yapıştırılır. Kabloları PCB'nin altına yönlendirmek için, ara parçalarla yapılmış ayaklara taktım, aynısı pil için de geçerli.

Yakında harici bir USB mikrofon konektörü takacağım, böylece pili şarj etmek için kasayı açmam gerekmeyecek.

Belki hepsini mükemmelleştirmek için OTA tarafından güncelleme yapmakla da ilgilenirim….

Adım 6: Kod ve Dosyalar

Image
Image

Üç arşiv dosyası sağlanır:

  • Weather station.zip: Arduino IDE kullanarak yüklemek için Arduino kodu
  • Boite ecran.zip: dava için CAD ve 3D yazıcı dosyaları
  • data.zip: ESP32'nin SPIFFS'sine yüklenecek dosyalar.

Dosyaları ESP32'nin SPIFFS'sine nasıl yükleyeceğinizi bilmiyorsanız, çok kullanışlı bir eklenti ve Arduino IDE'de nasıl kullanılacağını sunan bu öğreticiyi okuyun.

Derin uyku programlaması, bir Arduino'nun standart programlamasından oldukça farklıdır. ESP32 için bu, ESP32'nin uyandığı ve kurulumu yürüttüğü ve ardından uyku moduna geçtiği anlamına gelir. Bu nedenle, döngü işlevi boştur ve hiçbir zaman yürütülmez.

Bazı başlatma aşamaları ilk çalıştırmada yalnızca bir kez çalıştırılmalıdır (saat, hava durumu verileri, alıntılar vb. gibi), bu nedenle ESP32'nin mevcut uyanmanın ilk olup olmadığını bilmesi gerekir: bunun için, çözüm, her uyanmada artan bir değişkeni RTC RAM'de (derin uyku evrelerinde bile etkin kalan) depolamaktır. 1'e eşitse, ilk çalıştırmadır ve ESP32 başlatma aşamasını çalıştırır, aksi takdirde bu aşama atlanır.

ESP32'yi uyandırmak için birkaç olasılık vardır:

  • Zamanlayıcı uyandırma: kod, uyumadan önce derin uykunun süresini hesaplar. Bu, alıntıların ve günün azizinin (24 saatte bir) zamanını (her 1, 2, 3 veya 5 dakikada bir) veya hava durumu verilerini (her 3 veya 4 saatte bir) güncellemek için kullanılır.
  • Kesinti uyandırma: ivmeölçer, ESP32'yi uyandırmak için kullanılan bir sinyal gönderir. Bu, bir yön değişikliğini tespit etmek ve ekranları güncellemek için kullanılır.
  • Dokunmatik sensör uyandırma: ESP32, dokunmatik sensör görevi gören birkaç pim ile donatılmıştır, ancak zamanlayıcı uyandırma ile kullanılamazlar, bu yüzden bunu kullanmadım.

Kodun başka yerlerinde, enerji tasarrufu yaparken zamanı doğru tutmak (yani her dakika NTP sunucusunu bağlamamak), Adafruit GFX kitaplığı tarafından desteklenmeyen vurguları kaldırmak, aşağıdaki durumlarda bir ekranı güncellemekten kaçınmak için başka programlama hileleri vardır. özellikle kesintili uyandırma için ivmeölçer parametrelerini ayarlamak gerekli değildir, zamanlayıcı uyanması durumunda uyku süresini doğru bir şekilde hesaplamak, IDE'ye bağlı değilse (tekrar enerji tasarrufu sağlamak için) Seri konsolu kullanmaktan kaçının, bağlantıyı kesin gerekli olmadığında wifi, vb… ve kod, işlevleri anlamaya yardımcı olan yorumlarla doludur.

Bu Eğitilebilir Yazıyı okuduğunuz için teşekkürler (ilk kitabım). Umarım beğenirsiniz ve bu hava istasyonunu yapmaktan zevk alırsınız

Sensörler Yarışması
Sensörler Yarışması

Sensörler Yarışmasında İkincilik

Önerilen: