Membuat Stasiun Cuaca Arduino Portabel $10 (AWS) – DIY Mudah dengan Nano, DHT22, BMP180 & LCD
Komponen dan perlengkapan
Arduino Nano R3
×
1
Sensor Suhu DHT22
×
1
bmp180
×
1
Adafruit Standard LCD - 16x2 Putih pada Biru
×
1
Alat dan mesin yang diperlukan
Paku pengelasan (umum)
Aplikasi dan layanan online
Arduino IDE
Tentang proyek ini
Baru-baru ini kampus saya mengadakan pameran ilmu pengetahuan kecil. Jadi saya diminta oleh guru saya untuk menyajikan proyek di kampus untuk mengajarkan elektronika kepada siswa muda, jadi saya hanya punya dua hari untuk membuat sesuatu.
Karena kondisi iklim di sini sangat bervariasi dan baru-baru ini suhu berada di sekitar 34-40 derajat Celsius. Jadi saya memutuskan untuk membuat stasiun cuaca.
Apa yang dilakukan stasiun cuaca?
Stasiun cuaca adalah perangkat yang mengumpulkan data terkait cuaca dan lingkungan menggunakan banyak sensor yang berbeda
Sensor seperti
Angin
Kelembaban
Hujan
Suhu
Tekanan
Ketinggian
Tujuannya adalah membuat stasiun cuaca portabel
Fitur yang harus dimiliki
Suhu
Kelembaban
Tekanan
Ketinggian
Langkah 1: Bahan: Waktu untuk Membeli Barang
Jadi ini adalah hal yang kita butuhkan untuk proyek ini
Saya sebenarnya memulai proyek pada UNO saya tapi kemudian saya memutuskan untuk beralih ke solusi yang lebih kompak.
Saya memiliki nano pada saat itu jadi harus memilihnya, akan sangat suka menggunakan micro, karena itu yang terkecil.
Bagaimanapun, biarkan hal-hal itu, membahas anggaran dan bagian ini adalah daftarnya .
Sensor suhu dan kelembaban DHT22 -> $3.00
Sensor tekanan BMP180 (BMP280 lebih murah tapi mahal di lokasi saya ) > $2.00
Arduino Nano > $1.89
Pengelasan
Tampilan LCD dengan Driver I2C > $3.0
Papan veroboard
Header female
Untuk akhir alat Anda akan membutuhkan
Paku pengelasan
Pacu hidung
Kabel
Dan Juga sedikit waktu
Langkah 2: Suhu dan Kelembaban- DHT22
Pengukuran suhu dapat dilakukan menggunakan sensor yang berbeda.
Yang populer adalah DHT22, DHT11, SHT1x
Jadi dasarnya, mari kita pahami bagaimana sensor ini berbeda satu sama lain dan mengapa saya menggunakan DHT22 di awal.
AM2302 menghasilkan sinyal digital terkalibrasi. Ini menerapkan teknik pengumpulan sinyal digital eksklusif dan teknologi penginderaan kelembaban, memastikan keandalan dan stabilitasnya. Elemen penginderaannya terhubung dengan komputer single-chip 8-bit.
Setiap sensor model ini dikompensasi suhu dan dikalibrasi dalam ruang kalibrasi yang akurat dan koefisien kalibrasi disimpan dalam bentuk program dalam memori OTP, saat sensor mendeteksi, itu akan menyalin koefisien dari memori. Ukuran kecil & konsumsi rendah & jarak transmisi panjang (100m) memungkinkan AM2302 cocok untuk berbagai aplikasi keras. Dikemas dalam satu baris dengan empat pin, membuat koneksi sangat nyaman.
Mari kita lihat beberapa kelebihan dan kekurangan dari ketiganya.
DHT11
Kelebihan: Tidak perlu pengelasan. Termurah di antara tiga. Dapatkan output stabil dengan cepat. Transmisi lebih dari 20m. Gangguan kuat.
Kekurangan: Library! Tidak ada opsi resolusi. Kesalahan: Suhu +/-2°C; Kelembaban +/-5%RH. Rentang pengukuran tidak mencukupi (0-50°C). Aplikasi: Kebun, Pertanian.
DHT22
Kelebihan: Tidak perlu pengelasan. Tambahkan beberapa dolar ke DHT11 dan dapatkan peningkatan. Kurva halus. Kesalahan terkecil. Rentang luas. Transmisi lebih dari 20m. Gangguan kuat.
Kekurangan: Dapat lebih sensitif. Pelacakan suhu lambat. Library diperlukan. Aplikasi: Pemantauan Lingkungan. SHT1x
Kelebihan: Tidak perlu pengelasan. Kurva halus. Kesalahan kecil. Respons cepat. Konsumsi daya rendah. Tidur otomatis. Stabilitas dan konsistensi jangka panjang yang luar biasa.
Kekurangan: Dua antarmuka digital. Kesalahan kelembaban. Rentang pengukuran sama dengan DHT11. Library diperlukan. Aplikasi: Tugas berat dan instalasi jangka panjang. Tiga pilihan yang relatif murah berikutnya.
Koneksi
Vcc ke 5V atau 3.3V
Gnd ke Gnd
Data ke pin 2 arduino
Langkah 3: Barometer dan Sensor Tekanan- BMP180
bmp180 adalah sensor tekanan barometrik dengan antarmuka I2C (“Wire”).
Sensor tekanan barometrik mengukur tekanan absolut udara di sekitarnya. Tekanan ini bervariasi baik dengan cuaca maupun ketinggian.
modul bmp180 ini dilengkapi dengan regulator 3.3 v 662k yang saya ledakkan hingga ke kebodohan jadi saya menambahkan kabel untuk melewatkan seluruh vcc langsung ke chip.
Catatan : Dengan melakukannya saya membatasi diri saya hanya menggunakan 3.3 v , penggunaan tegangan di atas itu akan merusak perangkat.
Model lain mungkin tidak memiliki regulator tegangan 662k. jadi periksa dengan teliti .
Baik kembali kita hubungkan sensor ke arduino .
Sensor terhubung ke bus i2c arduino yang pada nano dan Uno adalah
SDA==>A4
SCL==>A5
VCC==>3.3V
GND ==> GND
Mari kita bicara sedikit tentang tekanan dan bagaimana tekanan mengukur ketinggian dan suhu.
Tekanan atmosfer pada posisi apa pun tidak konstan. Interaksi kompleks antara putaran bumi, kemiringan sumbu, dan banyak faktor lainnya menghasilkan area tekanan yang lebih tinggi dan lebih rendah yang bergerak, yang kemudian menyebabkan variasi cuaca yang kita lihat setiap hari. Dengan memantau perubahan tekanan, Anda dapat memprediksi perubahan cuaca jangka pendek.
Misalnya, penurunan tekanan biasanya berarti cuaca basah atau badai mendekat (sistem tekanan rendah sedang masuk). Kenaikan tekanan biasanya berarti cuaca cerah mendekat (sistem tekanan tinggi sedang melewati).
Tekanan atmosfer juga bervariasi dengan ketinggian. Tekanan absolut di kampung dasar Mt .everest (5,400 ) lebih rendah dari Delhi (216)
Karena tekanan absolut sulit dibandingkan secara langsung pengukuran tekanan dari satu lokasi ke lokasi lain. kita menggunakan tekanan relatif .yaitu tekanan permukaan laut.
Mengukur ketinggian
Tekanan atmosfer rata-rata di permukaan laut adalah 1013.25 hPa (atau mbar). Ini turun hingga nol saat Anda mendaki menuju ruang hampa. Karena kurva penurunan ini dipahami dengan baik, Anda dapat menghitung perbedaan ketinggian antara dua pengukuran tekanan (p dan p0) dengan menggunakan persamaan ini:
alti=44330*[1-(p/p0)^(1/5.255)]
Jika Anda menggunakan tekanan permukaan laut (1013.25 hPa) sebagai tekanan dasar (p0), hasil dari persamaan ini akan menjadi ketinggian saat Anda di atas permukaan laut.
Hati-hati
Berikan udara: Ingatlah bahwa BMP180 membutuhkan akses ke udara sekitar untuk mengukur tekanannya, jadi jangan letakkan dalam kotak tertutup. Memberikan lubang ventilasi kecil seharusnya cukup.Tapi tidak terlalu banyak udara: Di sisi lain, paparan pada udara atau angin yang bergerak cepat dapat menyebabkan variasi tekanan sementara yang akan mempengaruhi pembacaan Anda. Lindungi perangkat dari arus udara yang kuat.
Jaga tetap dingin: Karena pembacaan suhu yang akurat diperlukan untuk mengukur tekanan, cobalah untuk tidak menampilkan perangkat pada perubahan suhu yang cepat, dan jaga jarak dari bagian panas di dekatnya dan sumber panas lainnya.
Jaga tetap kering: BMP180 sensitif terhadap kelembaban. Jangan merendamnya atau membiarkannya bersentuhan dengan air cair.
Jangan membutanya: Menakjubkan, silikon dalam BMP180 sensitif terhadap cahaya, yang dapat masuk ke perangkat melalui lubang di bagian atas chip. Untuk akurasi maksimal, lindungi chip dari cahaya sekitar.
Langkah 4: Membuat Rangkaian
Jadi kita memulai dengan membuat header untuk nano. kita sebenarnya memotong header female lalu mengasikannya agar terlihat seolah-olah ukurannya seperti itu. kemudian kita melasnya. kemudian kita membuat header untuk sensor DHT22
. itu membutuhkan resistansi 10k yang terhubung dari data ke ground. kita kemudian melas semuanya. kemudian waktunya untuk bmp180 kita menambahkan header dengan cara yang sama. Kami menggunakan 3.3 V sebagai daya . Kita menghubungkan semua bus i2c.
Kami menambahkan tampilan terakhir kita menggunakan lcd i2c jadi kami menggunakan bus yang sama yang kami gunakan untuk modul bmp180.
(Ada slot keempat di mana saya ingin menambahkan modul rtc nanti untuk juga memasukkan jam ke dalam mesin )
Untuk menginstal library di arduino periksa tautan ini
https://www.arduino.cc/en/Guide/Libraries
Saya menggunakan arduino 1.6.5 jadi kode akan bekerja untuk versi ini dengan pasti , juga mungkin untuk yang lebih tinggi jika kasus tidak bekerja gunakan 1.6.5 sebagai versi dasar.
<p>#include <wire.h> #include <lcd.h> #include <liquidcrystal_i2c.h> #include "DHT.h" #include <sfe_bmp180.h></sfe_bmp180.h></liquidcrystal_i2c.h></lcd.h></wire.h></p><p>SFE_BMP180 pressure;</p><p>#define ALTITUDE 20.56 #define I2C_ADDR 0x27 // <<- Add your address here. #define Rs_pin 0 #define Rw_pin 1 #define En_pin 2 #define BACKLIGHT_PIN 3 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7</p><p>#define DHTPIN 2 // what digital pin we're connected to</p><p>// Uncomment whatever type you're using! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); float t1,t2; </p><p> void setup() { Serial.begin(9600); lcd.begin (16,2); // <<-- our LCD is a 20x4, change for your LCD if needed // LCD Backlight ON lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home on LCD lcd.print("Weather Station"); delay(5000); dht.begin(); pressure.begin(); } void loop() { char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0) { delay(status);</p><p> status = pressure.getTemperature(T); if (status != 0) { Serial.print("1"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Baro Temperature: "); lcd.setCursor(0,1); lcd.print(T,2); lcd.print(" deg C "); t1=T; delay(3000);</p><p> status = pressure.startPressure(3); if (status != 0) { // Wait for the measurement to complete: delay(status);</p><p> status = pressure.getPressure(P,T); if (status != 0) {lcd.clear(); lcd.setCursor(0,0); lcd.print("abslt pressure: "); lcd.setCursor(0,1); lcd.print(P,2); lcd.print(" mb "); delay(3000);</p><p> p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO)</p><p> a = pressure.altitude(P,p0); lcd.clear(); lcd.setCursor(0,0); lcd.print("Altitude: "); lcd.setCursor(0,1); lcd.print(a,0); lcd.print(" meters"); delay(3000); } } } } float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); t2=t; lcd.clear(); lcd.setCursor (0,0); // go to start of 2nd line lcd.print("Humidity: "); lcd.setCursor(0,1);lcd.print(h); lcd.print(" %"); delay(3000); lcd.clear(); lcd.setCursor (0,0); // go to start of 2nd line lcd.print("DHT Tempurature: "); lcd.setCursor(0,1); lcd.print(t); lcd.print(" deg C "); delay(3000); lcd.clear(); lcd.setCursor (0,0); // go to start of 2nd line lcd.print("Mean Tempurature: "); lcd.setCursor(0,1); lcd.print((t1+t2)/2); lcd.print(" deg C "); delay(3000); }</p>
FSIULGKING9D7SD.ino
Kode
Cuplikan kode #1
Cuplikan kode #1Plain text
<p>#include <wire.h> #include <lcd.h> #include <liquidcrystal_i2c.h> #include "DHT.h" #include <sfe_bmp180.h></sfe_bmp180.h></liquidcrystal_i2c.h></lcd.h></wire.h></p><p>SFE_BMP180 pressure;</p><p>#define ALTITUDE 20.56 #define I2C_ADDR 0x27 // <<- Add your address here. #define Rs_pin 0 #define Rw_pin 1 #define En_pin 2 #define BACKLIGHT_PIN 3 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7</p><p>#define DHTPIN 2 // what digital pin we're connected to</p><p>// Uncomment whatever type you're using! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); float t1,t2; </p><p> void setup() { Serial.begin(9600); lcd.begin (16,2); // <<-- our LCD is a 20x4, change for your LCD if needed // LCD Backlight ON lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home on LCD lcd.print("Weather Station"); delay(5000); dht.begin(); pressure.begin(); } void loop() { char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0) { delay(status);</p><p> status = pressure.getTemperature(T); if (status != 0) { Serial.print("1"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Baro Temperature: "); lcd.setCursor(0,1); lcd.print(T,2); lcd.print(" deg C "); t1=T; delay(3000);</p><p> status = pressure.startPressure(3); if (status != 0) { // Wait for the measurement to complete: delay(status);</p><p> status = pressure.getPressure(P,T); if (status != 0) {lcd.clear(); lcd.setCursor(0,0); lcd.print("abslt pressure: "); lcd.setCursor(0,1); lcd.print(P,2); lcd.print(" mb "); delay(3000);</p><p> p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO)</p><p> a = pressure.altitude(P,p0); lcd.clear(); lcd.setCursor(0,0); lcd.print("Altitude: "); lcd.setCursor(0,1); lcd.print(a,0); lcd.print(" meters"); delay(3000); } } } } float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); t2=t; lcd.clear(); lcd.setCursor (0,0); // go to start of 2nd line lcd.print("Humidity: "); lcd.setCursor(0,1);lcd.print(h); lcd.print(" %"); delay(3000); lcd.clear(); lcd.setCursor (0,0); // go to start of 2nd line lcd.print("DHT Tempurature: "); lcd.setCursor(0,1); lcd.print(t); lcd.print(" deg C "); delay(3000); lcd.clear(); lcd.setCursor (0,0); // go to start of 2nd line lcd.print("Mean Tempurature: "); lcd.setCursor(0,1); lcd.print((t1+t2)/2); lcd.print(" deg C "); delay(3000); }</p>