İçindekiler:

Yerel Hava Durumu İstasyonu: 8 Adım (Resimlerle)
Yerel Hava Durumu İstasyonu: 8 Adım (Resimlerle)

Video: Yerel Hava Durumu İstasyonu: 8 Adım (Resimlerle)

Video: Yerel Hava Durumu İstasyonu: 8 Adım (Resimlerle)
Video: Ayımızın yerini farklı gezegenler alsaydı nasıl görünürdü? 2024, Temmuz
Anonim
Yerel Hava İstasyonu
Yerel Hava İstasyonu

İlk yıl okul projem için harika bir proje ararken ne yapacağıma dair birçok fikrim vardı ama hiçbirini zorlayıcı bulmadım.

Daha sonra özel bir şeyi olan bir Hava İstasyonu yapmayı düşündüm. Tüm verilerimi saklayabilmek ve daha sonra bunu istatistikler için kullanabilmek istiyordum. Bu proje, özellikle meteorolojiye ilgi duyan ve piyasada bulunanlar kadar pahalı olmayan, evde yapılmış bir meteoroloji istasyonu isteyen kişiler için yapılacaktır. Proje ayrıca, herhangi bir zamanda sensör ekleme veya çıkarma yeteneğini korumak için yapılmıştır.

Sonucumun beklediğimden daha iyi çıktığını gördüğümde gerçekten mutlu oldum.

Linux çalıştıran bir Raspberry Pi 4'ten yapılmıştır.

  • Apache Web Sitesi (html css js)
  • Eventlet (arka uç sunucu web sitesi)
  • MariaDB (veritabanı sunucusu)

Gereçler

  • Ahududu Pi 4:

    sd kart (min 16 gb)

  • Sensörler:

    1. QS-FS rüzgar hızı sensörü
    2. Rüzgar Sensörü Bahçe Sinyal Çıkışı Alüminyum Alaşımlı Rüzgar Yönü Sensörü Rüzgar Gülü Hızı Ölçüm Cihazı https://www.banggood.com/Wind-Sensor-Garden-Signal-Output-Aluminum-Alloy-Wind-Direction-Sensor-Wind-Vane-Speed -Ölçme-Alet-p-1624988.html?rmmds=myorder&cur_warehouse=CN
    3. DHT22 (nem)
    4. BMP280 (hava basıncı)
    5. DS18B20 (sıcaklık)
  • Güç Kaynağı

    • 5v güç kaynağı (RPi)
    • 9v güç kaynağı (harici bir devre tahtası güç kaynağında)
  • Breadboard (x2)

    RPi 4 için T-cobbler plus

  • atlama telleri
  • IC'ler

    • MCP3008
    • PCF8574AN
  • LCD Ekran 16x2
  • LED (kırmızı
  • Kasa (isteğe bağlı)

    • şarap kasaları
    • ahşap direk (2m)
    • ahşap tahta (1m)

Adım 1: İşleri Hazırlamak

Bir adım üzerinde çalışmaya başlamadan önce ihtiyacınız olan tüm öğeleri elde etmek her zaman büyük önem taşır. Bu, üzerinde çalışırken size çok zaman kazandıracak.

Yani ilk, Ne istiyorsun:

  • Ahududu Pi 4:

    sd kart (min 16 gb)

  • Sensörler:

    1. QS-FS rüzgar hızı sensörü
    2. Rüzgar Sensörü Bahçe Sinyal Çıkışı Alüminyum Alaşımlı Rüzgar Yön Sensörü Rüzgar Kanadı Hız Ölçüm Cihazı
    3. DHT22 (nem)
    4. BMP280 (hava basıncı)
    5. DS18B20 (sıcaklık)
  • Güç Kaynağı

    • 5v güç kaynağı (RPi)
    • 9v güç kaynağı (harici bir devre tahtası güç kaynağında)
  • Breadboard (x2)
  • RPi 4 için T-cobbler plus
  • atlama telleri
  • IC'ler

    • MCP3008
    • PCF8574AN
  • LCD Ekran 16x2
  • LED (kırmızı)
  • Kasa (isteğe bağlı)

    • şarap kasaları
    • ahşap tahta (1m)
    • kutup (2m)

Bunları satın aldığım tüm bağlantıları girişin altındaki sarf malzemeleri bölümünde bulabilirsiniz.

Adım 2: RPi'yi Ayarlama

RPi'yi Ayarlama
RPi'yi Ayarlama

Projemiz için verilen yazılımın kurulu olduğu bir RPI'ye ihtiyacımız var.

  • Apache Web Sitesi (html css js)
  • Flask Soket-IO (arka uç sunucu web sitesi)
  • MariaDB (veritabanı sunucusu)

Yüklemeden önce, RPi'nizde en son yazılımın yüklü olduğundan emin olmak her zaman kullanışlıdır. Bunu yapmak için aşağıdaki komutu çalıştırmanız yeterlidir:

sudo uygun güncelleme

Apaçi:

İlk önce Apache hakkında konuşalım. Apache, tüm dünyada kullanılan bir web sunucusudur. Web sitenizi kusursuz bir şekilde çalıştırır. Yapmanız gereken tek şey onu kurmak ve web sitenizi doğru klasöre koymak ve işte orada.

sudo apt apache2'yi yükleyin -y

Bu kadar!

Her şeyin doğru şekilde kurulduğundan emin olmak için tarayıcınızda ahududu pi Ip adresinize gidin ve varsayılan web sitesini alıp almadığınızı görün. Bu adımla ilgili herhangi bir sorununuz varsa, RPi web sitesini buradan kontrol edebilirsiniz.

Etkinlik bülteni:

Şimdi Eventlet'i yükleyelim. Arka uç sunucumuzu çalıştıracak ve sensörlerimizden web sitemize bağlantı kuracaktır. Bunun için birkaç pakete ihtiyacımız var.

Şişe-soketIO:

pip3 yükleme şişesi-socketio

Etkinlik bülteni:

pip3 kurulum olaycığı

Gevent:

pip3 kurulum geventi

Mariadb:

Mariadb, ilişkisel veritabanları yapan MySQL tabanlı bir veritabanıdır. Genellikle RPI'da kullanılır ve bu nedenle internette bulabileceğiniz birçok yardım vardır. Daha fazla bilgi için bu bağlantıya gidebilirsiniz.

uygun kurulum mariadb sunucusu

Adım 3: Sensörleri Bağlama ve Kod Ekleme

Sensörleri Bağlama ve Kod Ekleme
Sensörleri Bağlama ve Kod Ekleme
Sensörleri Bağlama ve Kod Ekleme
Sensörleri Bağlama ve Kod Ekleme
Sensörleri Bağlama ve Kod Ekleme
Sensörleri Bağlama ve Kod Ekleme

Sensörleri RPi'mize bağlamak için bir T-Cobbler plus kullanabiliriz. Bu, RPi'nizdeki tüm pinlerinizi bir breadboard üzerinde kullanmayı mümkün kılan kullanışlı küçük bir araçtır.

Projemde 5 sensörüm var:

  1. QS-FS rüzgar hızı sensörü
  2. Rüzgar Sensörü Bahçe Sinyal Çıkışı Alüminyum Alaşımlı Rüzgar Yönü Sensörü Rüzgar Kanadı Hız Ölçüm Cihazı
  3. DHT22 (nem)
  4. BMP280 (hava basıncı)
  5. DS18B20 (sıcaklık)

Rüzgar hızı sensörü:

Öncelikle rüzgar hızı sensörüyle başladım çünkü en çok bu sensör beni heyecanlandırdı. 0-5v çıkış analog sinyalli ve çalışması için minimum 7 volt voltaj gerektiren bir sensördür. Güç vermek için 9 voltluk adaptörü seçiyorum.

Bu sensörde okumak için Analog sinyalleri okumak için bir IC olan bir MCP3008 kullandım. IC, 3.3V veya 5V üzerinde çalışabilir ancak RPi ile uyumlu hale getirmek için 3.3V'yi seçiyorum. Bu, çıkış voltajını 5V'tan 3.3V'a değiştirmem gerektiği anlamına geliyordu. Bunu 2 direnç (2k ve 1k ohm) tarafından oluşturulan bir voltaj bölücü ekleyerek yaptım.

Rüzgar Yön Sensörü:

Rüzgar yönü rüzgar hızı kadar önemlidir, bu yüzden şimdi bunu bağlayacağım.

Bu sensör, rüzgar hızı sensörü ile aynı özelliklere sahiptir. Ayrıca 9V ile çalışacak ve 5 volt çıkış voltajına sahip olacaktır. Ayrıca bu sensörü bir voltaj bölücü aracılığıyla MCP3008'e bağlayacağız.

DHT22 (nem):

DHT22 nemi okur. Yüzde olarak size bir değer verir ve değeri RPi üzerinde I2C protokolü kullanılarak okunabilir. Bu nedenle Raspi-config'de I2C bağlantı noktalarını etkinleştirmelisiniz. Daha fazla bilgi burada.

BMP280 (hava basıncı):

BMP280, hava basıncını okumak için kullanılır. Değeri, RPI üzerindeki SPI veri yolu üzerinden okunur. Bu protokolün ayrıca Raspi-config'de etkinleştirilmesi gerekir. Kodum için Adafruit kütüphanesini kullandım.

DS18B20 (sıcaklık):

Son sensör sıcaklığı ölçer. Bu sensör Dallas'tandır ve Dallas ile biraz tecrübeniz varsa, muhtemelen 1Wire-bus kullandıklarını biliyor olmalısınız. Raspi-config'de bu protokolün de etkinleştirilmesi gerektiğini söylersem şaşırmayın.

Sensörleri nasıl bağladım:

Pdf olarak, biraz daha kolaylaştırmak için bir elektrik ve devre tahtası şeması yükledim.

Sensörleri başarıyla bağladıktan ve tüm sensörleri okumak için gerekli kodu ekledikten sonra devam edebilir ve bir sonraki adıma geçebilirsiniz. Geride bir sensör bırakmak isterseniz veya daha fazlasını eklemek isterseniz bunu yapabilirsiniz.

Adım 4: Bir Web Kullanıcı Arayüzü Tasarlama

Web Kullanıcı Arayüzü Tasarlamak
Web Kullanıcı Arayüzü Tasarlamak
Web Kullanıcı Arayüzü Tasarlamak
Web Kullanıcı Arayüzü Tasarlamak
Web Kullanıcı Arayüzü Tasarlamak
Web Kullanıcı Arayüzü Tasarlamak

Şimdi web sitemiz için bir tasarıma ihtiyacımız olan sensörleri bağladık.

Web sitesinin, sensörlerin tüm gerçek zamanlı verilerini görüntülerken kolay bir görünüm oluşturmasını istiyoruz.

Ayrıca zaman aralığı başına ölçülen bu değerlerin geçmişini görebilmek istiyoruz.

İlk önce biraz ilham almak için internette dolaşmaya başladım. Hepsinden önemlisi, gerçekten aradığım tasarıma sahip olmayan bilgi siteleri. Halihazırda piyasada olan hava istasyonları büyük olasılıkla bir ekrana sahipti. Ve bu sergiden ilham geldi. Çoğu ekran, ızgara görünümlü bir tasarıma sahiptir. Bu bana tüm sensörlerin görüntüleneceği ana sayfayı oluşturma fikrini verdi.

Ancak her sensörün geçmişini, değerlerini görebileceğiniz bir sayfa yapmak istediğimi de söyledim.

Bu nedenle tasarımımda bunu içeren bir 2. sayfa da yaptım. Bu sayfada, sensörüm hakkında ön sayfamda ve tabii ki tarih bölümünde gösterilmeyen bazı ek bilgiler görebiliyordum.

Birkaç saat sonra tüm tasarımım ortaya çıktı!

Tasarım Adobe XD kullanılarak yapılmıştır.

Adım 5: Veritabanı Oluşturma

Veritabanı Oluşturma
Veritabanı Oluşturma

Tasarım kısmına bir mola vermek için veritabanımda başladım.

Bu veri tabanı tüm sensörleri (5), tüm aktüatörleri (2) ve bu sensörlerin sahip olduğu değerleri içerecektir.

Veritabanı oldukça kolaydır ve birkaç ilişkisi vardır.

Veritabanı modelini fotoğrafta görebilirsiniz.

Adım 6: Web Sitesini Kodlama: Ön Uç (html Css)

Web Sitesine Geri Dön!

Artık gerçekten kullanmak için html css olarak kodlamaya başlayabileceğim bir tasarımım var.

Ana sayfada:

Her sensörü web sitemde bir unsur olarak düşünerek başladım. Böylece daha sonra bu parçanın Javascript kodum tarafından oluşturulmasına izin verebilirim.

Ayrıca elementlere rastgele JS-tutucu sınıfları ekledim. Bunlar, o öğenin içeriğini değiştirmeyi mümkün kılacaktır.

Bu benim çok zamanımı aldı çünkü bu dilde o kadar iyi değilim.

Ana sayfayı yaptıktan sonra tarih sayfasından başlamanın zamanı gelmişti.

Tarih sayfasında:

Bu sayfanın yeniden oluşturulması biraz daha kolaydı. Bu sayfada ayrıca sensör hakkında bilgi almak, gerçek zamanlı bir değer yuvası ve ölçülen tüm değerleri içeren tabloyu görüntülemek için js tutucular vardı.

Web sitemde Tablo veya Grafik arasında seçim yapmak üzere bir sekme seçeneği oluşturmak için, öğelerin görüntülenmemesi veya görüntülenmemesi için biraz Javascript eklemem gerekti.

Şimdi çarpıcı bir web sitemiz var ama üzerinde hiçbir şey gösteremiyor muyuz? Bunu düzeltelim.

Kodumu github depomda bulabilirsiniz:

7. Adım: Web Sitesini Kodlama: Arka Uç (eventlet) + Ön Uç Kodlama (javascript)

Arka uç:

Arka uç sunucusu zaten kuruluyken, bunu projemizde uygulamamız gerekiyor. Öncelikle, her şeyin düzgün çalışması için bazı ithalat eklememiz gerekiyor.

şişeden içe aktar Flask, istek, flask_socketio'dan jsonify flask_cors'tan SocketIO'yu içe aktar CORS

Sunucuyu başlatmak için aşağıdakileri eklememiz gerekiyor:

socketio.run(uygulama, hata ayıklama=Yanlış, ana bilgisayar='0.0.0.0')

Artık sunucu çevrimiçi ancak ön uçla konuşamayacak.

Hiçbir şey almıyor veya iade etmiyor. Bunu değiştirelim.

Veritabanındaki tüm sensörleri istemek için bir rota ekleyeceğiz:

@app.route(endpoint + '/sensors', method=['GET']) def get_sensors(): if request.method == 'GET': s = DataRepository.get_sensors() return jsonify(sensors=s), 200

Bu kod, DataRepository adlı bir sınıf kullanır ve veritabanıyla konuşur. Burada bize istediğimiz sensörleri geri veriyor.

Ayrıca, belirli bir sensörün değerleri için 1 belirli sensör ve bir diğeri hakkında bilgi istemek için bir rotaya ihtiyacımız var.

Bunların hepsi yollardır, ancak gerçek zamanlı verileri mümkün kılmak içindir. Sensörlerin okuduğu verileri her aralıkta göndermemiz gerekiyor. Bunu yapmak için Socket-IO bağlantısını kullanıyoruz. JS ile siteye yüklendiği andan itibaren kurulan bir bağlantıdır ve bu bağlantıyı açık tutar. Bu, tam çift yönlü bir bağlantıdır, yani aynı anda her iki şekilde (gönderme ve alma) çalışan bir bağlantıdır. Bunu kullanmak için aşağıdaki kodu eklememiz gerekiyor.

@socketio.on('connect') def initial_connection(): print('Yeni bir istemci bağlantısı') socketio.send("U bent geconnecteerd") # # İstemciye gönder!

Bu kod barışı, bir istemci bağlandığında çalıştırılır.

Ön uçtan herhangi bir mesaj almak için bu kodu kullanabilirsiniz.

@socketio.on('message') def message_recieved(): geçer

Ayrıca mesaj gönderebilirsiniz. Bu, aşağıdakiler tarafından yapılır.

socketio.emit('Update_RTD', dict_results, yayın=Doğru)

İlk verilen argüman istediğiniz herhangi bir şey olabilir, ancak JS'nize koyduğunuza karşılık gelir ve onunla nesneler de gönderebilirsiniz. Bu isteğe bağlıdır.

Javascript:

Mevcut verileri görüntüleyebilmek ve veritabanından bilgi alabilmek için sunucunun arka uç sunucusuna bağlanmasını sağlamak için biraz JS eklemek önemlidir.

Veri almak ve göndermek için yaptığımız socketIO fonksiyonlarını çağıracağız.

Bir Json Nesnesi olarak veri aldığımızda, istediğimiz bilgiyi almak için onu sökeceğiz ve ardından web sitemize koyduğumuz JS tutuculara koyacağız.

Kodumu github depomda bulabilirsiniz:

Adım 8: Kasa Yapımı

Kasa Yapımı
Kasa Yapımı
Kasa Yapımı
Kasa Yapımı
Kasa Yapımı
Kasa Yapımı
Kasa Yapımı
Kasa Yapımı

Kasa çok uğraştırdı ve istediğiniz şekilde yapılabilir. Bu şekilde yaptım.

Biraz Şarap Kasası aldım.

Bunlardan birini, RPI'mı ve sensörlerimin çoğunu içeren kutu olarak kullandım.

Rüzgar hızı sensörü ve rüzgar yönü sensörü elbette içeriye değil, bir direğe yerleştirilmiş bir çapraz çubuğun üstüne yerleştirildi. Kapısını da yaptığım şarap sandığını bu direğe astım.

Fotoğraflara bakarak projemi nasıl bitirdiğimi görebilirsiniz.

Bu elbette nasıl yapabileceğinizin bir örneğidir. Bununla ne istersen yapabilirsin.

Önerilen: