Rangkaian stasiun cuaca di Arduino uno. Stasiun cuaca rumah di Arduino dan mengirimkan data ke "Pemantauan Rakyat"

Suatu hari, saat berjalan-jalan di kota, saya melihat toko elektronik radio baru yang dibuka. Ketika saya memasukinya, saya menemukannya jumlah besar Perisai untuk Arduino karena Saya punya Arduino Uno di rumah dan Arduino Nano Segera muncul ide untuk bermain-main dengan pemancar sinyal dari jarak jauh. Saya memutuskan untuk membeli paling banyak pemancar murah dan penerima pada 433 MHz:

Pemancar sinyal.


Penerima sinyal.

Setelah menuliskan sketsa sederhana transmisi data (contoh diambil dari sini), ternyata perangkat transmisi mungkin cukup cocok untuk mengirimkan data sederhana, seperti suhu, kelembapan.

Pemancar mempunyai ciri-ciri sebagai berikut:
1. Model: MX-FS - 03V
2. Jangkauan (tergantung keberadaan benda penghalang): 20-200 meter
3. Tegangan operasi: 3,5 -12V
4. Dimensi modul: 19*19 mm
5. Modulasi sinyal: AM
6. Daya pemancar: 10mW
7. Frekuensi: 433 MHz
8. Panjang antena eksternal yang dibutuhkan: 25cm
9. Mudah dihubungkan (hanya tiga kabel): DATA; VCC; Bumi.

Karakteristik modul penerimaan:
1. Tegangan operasi: DC 5V
2. Saat ini: 4mA
3. Frekuensi pengoperasian: 433,92 MHz
4. Sensitivitas: - 105dB
5. Dimensi modul: 30*14*7 mm
6. Diperlukan antena eksternal: 32 cm.

Internet mengatakan bahwa jangkauan transmisi informasi pada 2Kb/detik dapat mencapai hingga 150m. Saya belum memeriksanya sendiri, tetapi di apartemen dua kamar diterima di mana-mana.

Perangkat keras stasiun cuaca rumah

Setelah beberapa kali percobaan, saya memutuskan untuk menghubungkan sensor suhu, kelembaban dan pemancar ke Arduino Nano.


Sensor suhu DS18D20 terhubung ke Arduino sebagai berikut:

1) GND ke minus mikrokontroler.
2) DQ melalui resistor pull-up ke ground dan ke pin D2 Arduino
3) Vdd hingga +5V.

Modul pemancar MX-FS - 03V ditenagai tegangan 5 Volt, output datanya (ADATA) dihubungkan ke pin D13.

Terhubung ke Arduino Uno layar LCD dan barometer BMP085.


Diagram koneksi ke Arduino Uno

Penerima sinyal terhubung ke pin D10.

Modul BMP085 - sensor digital tekanan atmosfer. Sensor ini memungkinkan Anda mengukur suhu, tekanan, dan ketinggian di atas permukaan laut. Antarmuka koneksi: I2C. Tegangan suplai sensor 1,8-3,6 V

Modul terhubung ke Arduino dengan cara yang sama seperti perangkat I2C lainnya:

  • VCC - VCC (3,3V);
  • GND - GND;
  • SCL - ke keluaran analog 5;
  • SDA - ke pin analog 4.
  • Biaya yang sangat rendah
  • Daya dan I/O 3-5 V
  • Penentuan kelembaban 20-80% dengan ketelitian 5%.
  • Deteksi suhu 0-50 derajat. dengan akurasi 2%.
  • Frekuensi polling tidak lebih dari 1 Hz (tidak lebih dari sekali setiap 1 detik)
  • Dimensi 15.5mm x 12mm x 5.5mm
  • 4 pin dengan jarak pin 0,1".

DHT memiliki 4 pin:

  1. Vcc (catu daya 3-5V)
  2. Data keluar - Keluaran data
  3. Tidak digunakan
  4. Umum

Terhubung ke D8 Arduino.

Perangkat lunak bagian dari stasiun cuaca rumah

Modul transmisi mengukur dan mengirimkan suhu setiap 10 menit.

Di bawah ini adalah programnya:

/* Sketsa versi 1.0 Kirim suhu setiap 10 menit. */ #include #include #include #define ONE_WIRE_BUS 2 //Pin untuk menghubungkan sensor Dallas OneWire oneWire(ONE_WIRE_BUS); DallasSensor suhu(&oneWire); Alamat Perangkat di dalam Termometer; void setup(void) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // Diperlukan untuk DR3100 vw_setup(2000); // Mengatur baud rate (bit/s) sensor.begin(); if (! sensor .getAddress(insideThermometer, 0)); printAddress(insideThermometer); sensor.setResolution(insideThermometer, 9); //Serial.print("Temp C : "); //Serial.println(tempC); //Pembentukan data untuk pengiriman int number = tempC; char simbol = "c"; //Simbol layanan untuk menentukan bahwa ini adalah sensor String strMsg = "z"; strMsg += simbol; strMsg += " "; strMsg += " "; strMsg.toCharArray(msg, 255); / Tunggu hingga transfer selesai penundaan(200); ; J<= 6; j++) { sensors.requestTemperatures(); printTemperature(insideThermometer); delay(600000); } } //Определение адреса void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16); //Serial.print("0"); //Serial.print(deviceAddress[i], HEX); } }

Perangkat penerima menerima data, mengukur tekanan dan suhu di dalam ruangan dan mengirimkannya ke layar.

#termasuk #termasuk LCD LiquidCrystal(12, 10, 5, 4, 3, 2); #termasuk sensor dht11; #tentukan DHT11PIN 8 #termasuk #sertakan BMP085 dps = BMP085(); panjang Suhu = 0, Tekanan = 0, Ketinggian = 0; void setup() ( Serial.begin(9600); vw_set_ptt_inverted(true); // Diperlukan untuk DR3100 vw_setup(2000); // Mengatur kecepatan penerimaan vw_rx_start(); // Memulai pemantauan siaran lcd.begin(16, 2) ; Wire.begin(); penundaan(1000); //lcd.setCursor(14,0); //lcd.write(0)); ( uint8_t buf; // Buffer untuk pesan uint8_t buflen = VW_MAX_MESSAGE_LEN ; // Panjang buffer if (vw_get_message(buf, &buflen)) // Jika pesan diterima ( // Mulai parsing int i; // Jika pesan tidak ditujukan kepada kami , keluar jika (buf != "z") ( return; ) char command = buf; // Perintahnya ada di indeks 2 // Parameter numerik dimulai di indeks 4 i = 4; // Karena transmisinya adalah karakter demi karakter, maka Anda perlu mengonversi set karakter menjadi angka while (buf[i] != " ") ( angka *= 10; angka += buf[i] - "0"; i++; ) dps.getPressure(&Pressure); getTemperature(&Suhu); //Serial.print(perintah);

lcd.cetak("T=");
lcd.setCursor(2,0);
lcd.print(angka);
lcd.setCursor(5,0);
lcd.cetak("P=");

lcd.print(Tekanan/133.3);

lcd.print("mmH");

lcd.setCursor(0,1); lcd.cetak("T="); lcd.print(Suhu*0,1); lcd.cetak("H="); lcd.print(sensor.kelembaban);lcd.rumah();//penundaan(2000);
int chk = sensor.baca(DHT11PIN);
switch (chk) ( case DHTLIB_OK: //Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: //Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: //Serial.println("Waktu habis error"); break; default: //Serial.println("Kesalahan tidak diketahui"); break; ) ) )

P.S. Di masa depan saya berencana untuk menambahkan yang berikut ini:

1 - sensor kelembaban ke pemancar, ulang algoritma transmisi data
- Sensor untuk mengukur kecepatan dan arah angin.

- tambahkan tampilan lain ke perangkat penerima.

1 - sensor kelembaban ke pemancar, ulang algoritma transmisi data
- transfer penerima dan pemancar ke mikrokontroler terpisah.

Di bawah ini adalah foto kejadiannya:

1 - sensor kelembaban ke pemancar, ulang algoritma transmisi data
Daftar elemen radioPenamaan1 - sensor kelembaban ke pemancar, ulang algoritma transmisi data
Jenis
switch (chk) ( case DHTLIB_OK: //Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: //Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: //Serial.println("Waktu habis error"); break; default: //Serial.println("Kesalahan tidak diketahui"); break; ) ) )

Denominasi

1 - sensor kelembaban ke pemancar, ulang algoritma transmisi data
Kuantitas 1 - sensor kelembaban ke pemancar, ulang algoritma transmisi data
- transfer penerima dan pemancar ke mikrokontroler terpisah.
Catatan Toko menghilangkan satu-satunya hal yang tersisa waktu luang. Itu sebabnya saya sudah lama tidak membuat apa pun dan saya ingin sekali melakukan sesuatu. Kesempatan ini muncul, anehnya, di universitas. Ini bulan September di luar jendela, tahun ke-4 dan kursus desain sirkuit yang akan datang. Kami diberitahu bahwa kursus dapat dilakukan dalam dua variasi: kertas dan perangkat keras.

Selama 5 tahun, makalah di universitas kami dilakukan berdasarkan prinsip “ambil yang lama dan satukan.” Pendekatan ini tidak cocok untuk saya karena sifatnya yang rutin, jadi saya langsung memilih kursus perangkat keras. Mikrokontroler Arduino diusulkan sebagai inti mata kuliah karena kemudahan pembelajarannya. Setelah menentukan jenis kursus, masih ada satu pertanyaan lagi: apa sebenarnya yang harus dilakukan. Karena saya belum mempunyai pengalaman dalam pemrograman mikrokontroler, saya segera membuka Google dan mulai mempelajari proyek-proyek yang ada. Ada banyak proyek, beberapa di antaranya cukup sederhana, ada pula yang cerdik (pemindai 3D, misalnya), namun sebagian besar tidak memiliki proyek. aplikasi praktis. Dan saya hanya menginginkan sesuatu yang tidak tergeletak di rak dan mengumpulkan debu. Setelah perjalanan setengah jam ke dunia Arduino, saya menjadi tertarik dengan topik stasiun cuaca rumah, dan proyek tersebut tampaknya tidak terlalu sulit untuk diterapkan (yang terutama menarik perhatian pendatang baru).

Beginilah topik kursus dipilih dan seiring berjalannya waktu sepertinya tidak ada masalah.

Seleksi Komponen

Melihat-lihat proyek yang berbeda, saya menyadari bahwa Nano atau bahkan ProMini, tapi tetap memilih Arduino Uno dengan harapan saya ingin pemrograman untuk Arduino dan akan mengimplementasikan beberapa proyek lagi di masa depan. Saya belum pernah memegang besi solder di tangan saya sebelumnya, jadi untuk memudahkan pengembangan saya memutuskan untuk juga membeli Sensor Shield v4.

Lebih detailnya

Biayanya berkontribusi koneksi cepat sensor, modul, motor servo, antarmuka Serial dan I2C, dan juga menampilkan semua port pengontrol faktor bentuk Duemilanova/Uno (juga dapat dihubungkan ke seri mega, tetapi dengan batasan dan konsekuensi berikutnya). Mendukung perisai lain di atasnya.


Saya memilih sensor berikut sebagai sumber data meteorologi:


Saya telah memutuskan sensornya. Tapi apa hubungannya dengan data yang berasal dari sensor? Saya memutuskan untuk menampilkannya. Saya menginginkan gambar berwarna, jadi saya segera membuang solusi monokrom. Setelah beberapa menit mencari, saya terpilih tampilan TFT ST7735 berukuran 1,8 inci.

Lebih detailnya

Karena layar menggunakan protokol SPI 4-kawat untuk komunikasi dan memiliki buffer bingkai beralamat piksel sendiri, layar ini dapat digunakan dengan segala jenis mikrokontroler. Layar 1,8 inci memiliki piksel warna 128x160. Ada juga slot kartu memori microSD Oleh karena itu, Anda dapat dengan mudah mendownload yang full color gambar raster dari FAT16/FAT32 sistem file kartu microSD.

Spesifikasi:

  • Diagonal layar - 1,8 inci, resolusi 128x160 piksel, warna 18-bit (262.144 warna)
  • Pengontrol dengan pengalamatan piksel bawaan dari buffer memori video
  • Slot microSD internal - menggunakan lebih dari 2 jalur digital
  • Kompatibel dengan 3.3 dan 5V
  • Dimensi: 34 mm x 56 mm x 6,5 m


Pemrograman Pengontrol Arduino

Setelah kami memutuskan komponen untuk stasiun cuaca, kami akan mulai memprogram pengontrolnya. Untuk Firmware Arduino lingkungan yang digunakan Pengembangan Arduino IDE. Juga menggunakan perpustakaan dari Adafruit.

Sebelum beralih ke sketsa, mari kita lihat fungsinya:

  • Pembacaan diambil dari sensor setiap 10 detik dan hanya indikator yang berubah dibandingkan pengukuran sebelumnya yang diperbarui di layar
  • Transfer data yang diterapkan melalui Pelabuhan COM

Sketsa

#termasuk // perpustakaan untuk komunikasi dengan perangkat I2C #include // Pustaka inti untuk semua sensor #include // perpustakaan untuk BMP180 #include // Pustaka grafis inti #include // Pustaka khusus perangkat keras #include // perpustakaan untuk komunikasi dengan perangkat SPI #termasuk "dht.h" // perpustakaan untuk DHT #define DHT22_PIN 2 // menghubungkan pin data DHT22 ke 2 pin digital #define TFT_CS 10 // menghubungkan pin CS dari TFT ke 10 pin digital #define TFT_RST 9 // sambungkan pin RST TFT ke 9 pin digital // Anda juga dapat menghubungkan ini ke reset Arduino // dalam hal ini, setel #define pin ini ke 0! #define TFT_DC 8 // sambungkan pin DC TFT ke 8 pin digital Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //inisialisasi TFT #define TFT_SCLK 13 // sambungkan pin SCLK TFT ke 13 pin digital #define TFT_MOSI 11 // sambungkan pin MOSI TFT ke 11 pin digital dht DHT; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); //inisialisasi BMP180 int bmpFlag = 0; struct ( uint32_t total; uint32_t oke; uint32_t crc_error; uint32_t time_out; uint32_t connect; uint32_t ack_l; uint32_t ack_h; uint32_t tidak diketahui; ) stat = ( 0,0,0,0,0,0,0,0); // struct untuk status dht void setup(void) ( Serial.begin(9600); Serial.println("Meteo Test"); Serial.println(""); if(!bmp.begin()) // periksa koneksi untuk BMP180 ( Serial.print("Ups, tidak ada BMP180 terdeteksi ... Periksa kabel atau I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB); // Inisialisasi TFT dan isi dengan warna hitam tft.fillScreen ; (ST7735_BLACK); tft.setRotation(tft.getRotation() + 1); tft.setTextSize(1.5); // penundaan untuk memastikan bahwa TFT telah diinisialisasi ) // data terakhir yang diukur float oldTemperature = 0 , oldAltitude = 0 , oldPressure = 0, oldDHTHumidity = 0, oldDHTTemperature; = 0 || !event.pressure) // perbarui data ( tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("INISIALISASI BMP KESALAHAN", 0 , "", true ) else ( if(event.pressure != oldPressure) ( tft.fillRect(0, 30, 160, 7, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED) ; printValue ("Tekanan", peristiwa.tekanan, " hPa", benar); oldPressure = peristiwa.tekanan = benar ) if(suhu != oldTemperature) ( tft.fillRect(0, 38, 160, 7, ST7735_BLACK ); tft.setCursor (0, 38); tft.setTextColor(ST7735_WHITE); printValue("Suhu", " C", benar); oldTemperature = suhu; tft.fillRect(0, 46, 160, 7, ST7735_BLACK); (0, 46); tft.setTextColor(ST7735_BLUE); printValue("Ketinggian", ketinggian, " m", benar); wasUpdate = true; 54, 160, 7, ST7735_BLACK);tft.setCursor(0, 54);

Saatnya merakit bodi

Kondisi utama dari kursus ini adalah prototipe yang berfungsi dalam bentuk yang rapi. Oleh karena itu, saya harus membeli rumah dan, berbekal file, memasukkan stasiun cuaca ke dalam rumah dengan cara apa pun.

Kasing ini dibeli dari toko elektronik radio lokal.

Bingkai

(Kasing di foto sedikit berbeda. Saya punya tutup transparan)



Kemudian, dengan menggunakan file, lubang dibuat untuk mengeluarkan sensor dan memasok daya. Saya memutuskan untuk memindahkan sensor ke luar, karena saat menguji sistem tanpa casing, saya melihat bagian belakang layar menjadi sangat panas, yang akan mempengaruhi suhu di dalam casing.

Perumahan dengan bukaan untuk sensor dan daya



Karena saya harus menyolder kaki ke 2 sensor dan saya membakar trek di salah satunya, saya memutuskan untuk tidak mencobai nasib dan tidak menyolder kabel ke sensor (saya akan berlatih pada hal lain), dan agar koneksi agar lebih atau kurang dapat diandalkan, saya memutuskan untuk memundurkan pita listrik.

Sistem sebelum “dimasukkan” ke dalam housing



Karena casingnya jauh lebih besar daripada Arduino (tidak ada yang lebih kecil), saya harus menyediakan penyangga agar papan tidak bergerak di dalam casing. Juga, sebuah gambar dipotong dari busa, dan di dalamnya ada persegi panjang untuk layar untuk menyembunyikan bagian dalam kasing. Saya tidak punya lem super, jadi saya harus menggunakan selotip dua sisi.

Paus ikan ajaib-yuda



Pasang tutupnya, sambungkan daya dan tunggu.

Stasiun cuaca yang telah selesai di dalam gedung



Setelah menampilkan hasilnya di layar, kami mengidentifikasi kesalahan yang tidak menyenangkan dalam mengukur kelembapan: DHT22 dengan rajin menghasilkan angka 99,90% (sangat jarang 1,00%). Mari kita mulai mencari tahu apa masalahnya. Hal pertama yang kita lakukan adalah melihat output nilai ke port COM. Segalanya tampak baik-baik saja. Setelah beberapa kali isi ulang, pembongkaran dan pemasangan kembali casing, muncul ide untuk mencari jawabannya di Google. Seperti yang diharapkan, Google Rusia tidak mengatakan sesuatu yang berguna. OKE. Kami mulai mencari dalam bahasa Inggris dan di salah satu forum kami menemukan orang-orang dengan masalah serupa. Empat halaman pertama diskusi tidak memberikan sesuatu yang berguna, tetapi pada halaman kelima kita menemukan jawaban atas pertanyaan kita:
Sensor kelembapan dapat dengan mudah terpengaruh oleh gas yang salah atau paparan IIRC dengan kelembapan tinggi dalam waktu yang sangat lama. Di datasheet terdapat prosedur cara “reset” sensor, Anda bisa mencobanya.

Satu-satunya pertanyaan yang tersisa adalah kapan dan bagaimana saya berhasil merusak DHT22. Namun waktunya sudah dekat untuk mengambil tugas kuliah, jadi saya meninggalkan solusi untuk masalah ini untuk nanti.

Kata penutup

Kursus telah berlalu. Stasiun cuaca telah ditunda tanpa batas waktu hingga semua tailing di universitas ditutup. Namun, kami harus kembali ke stasiun cuaca lebih awal dari yang saya kira. Kebetulan pada pertengahan bulan November saya berpindah tempat kerja dan di tim baru saya bertemu dengan orang-orang yang tertarik dengan platform Arduino dan sejenisnya. Oleh karena itu, ketertarikan saya terhadap platform ini, tanpa sempat menenangkan diri, kembali berkobar. Saya mengeluarkan stasiun cuaca saya, menghubungkannya ke komputer dan ingat bahwa saya mengimplementasikan transfer data dari Arduino melalui port COM. Dan kemudian muncul ide untuk menulis sebuah program yang menerima data melalui port COM dari Arduino dan mengirimkan data ini ke pemantauan publik
  • Arduino
  • Tambahkan tag Seperti kebanyakan pekerja, mengerjakan proyek sendiri hanya menghabiskan waktu luang yang tersisa. Itu sebabnya saya sudah lama tidak membuat apa pun dan saya ingin sekali melakukan sesuatu. Anehnya, peluang ini muncul di universitas. Ini bulan September di luar jendela, tahun ke-4 dan kursus desain sirkuit yang akan datang. Kami diberitahu bahwa kursus dapat dilakukan dalam dua variasi: kertas dan perangkat keras.

    Selama 5 tahun, makalah di universitas kami dilakukan berdasarkan prinsip “ambil yang lama dan satukan.” Pendekatan ini tidak cocok untuk saya karena sifatnya yang rutin, jadi saya langsung memilih kursus perangkat keras. Mikrokontroler Arduino diusulkan sebagai inti mata kuliah karena kemudahan pembelajarannya. Setelah menentukan jenis kursus, masih ada satu pertanyaan lagi: apa sebenarnya yang harus dilakukan. Karena saya belum mempunyai pengalaman dalam pemrograman mikrokontroler, saya segera membuka Google dan mulai mempelajari proyek-proyek yang ada. Ada banyak proyek, beberapa di antaranya cukup sederhana, ada pula yang cerdik (pemindai 3D, misalnya), namun sebagian besar tidak memiliki aplikasi praktis. Dan saya hanya menginginkan sesuatu yang tidak tergeletak di rak dan mengumpulkan debu. Setelah perjalanan setengah jam ke dunia Arduino, saya menjadi tertarik dengan topik stasiun cuaca rumah, dan proyek tersebut tampaknya tidak terlalu sulit untuk diterapkan (yang terutama menarik perhatian pendatang baru).

    Beginilah topik kursus dipilih dan seiring berjalannya waktu sepertinya tidak ada masalah.

    Seleksi Komponen

    Melihat berbagai proyek, saya menyadari bahwa Nano atau bahkan Pro Mini sudah cukup bagi saya, tetapi saya tetap memilih Arduino Uno dengan harapan saya ingin pemrograman untuk Arduino dan akan mengimplementasikan beberapa proyek lain di masa depan. Saya belum pernah memegang besi solder di tangan saya sebelumnya, jadi untuk memudahkan pengembangan saya memutuskan untuk juga membeli Sensor Shield v4.

    Lebih detailnya

    Papan memfasilitasi koneksi cepat sensor, modul, motor servo, antarmuka Serial dan I2C, dan juga menampilkan semua port pengontrol faktor bentuk Duemilanova/Uno (juga dapat dihubungkan ke seri mega, tetapi dengan batasan dan konsekuensi berikutnya) . Mendukung perisai lain di atasnya.


    Saya memilih sensor berikut sebagai sumber data meteorologi:


    Saya telah memutuskan sensornya. Tapi apa hubungannya dengan data yang berasal dari sensor? Saya memutuskan untuk menampilkannya. Saya menginginkan gambar berwarna, jadi saya segera membuang solusi monokrom. Setelah beberapa menit mencari, layar TFT 1,8 inci ST7735 dipilih.

    Lebih detailnya

    Karena layar menggunakan protokol SPI 4-kawat untuk komunikasi dan memiliki buffer bingkai beralamat piksel sendiri, layar ini dapat digunakan dengan segala jenis mikrokontroler. Layar 1,8 inci memiliki piksel warna 128x160. Terdapat juga slot kartu microSD, sehingga Anda dapat dengan mudah memuat gambar bitmap penuh warna dari sistem file kartu microSD FAT16/FAT32.

    Spesifikasi:

    • Diagonal layar - 1,8 inci, resolusi 128x160 piksel, warna 18-bit (262.144 warna)
    • Pengontrol dengan pengalamatan piksel bawaan dari buffer memori video
    • Slot microSD internal - menggunakan lebih dari 2 jalur digital
    • Kompatibel dengan 3.3 dan 5V
    • Dimensi: 34 mm x 56 mm x 6,5 m


    Pemrograman Pengontrol Arduino

    Setelah kami memutuskan komponen untuk stasiun cuaca, kami akan mulai memprogram pengontrolnya. Arduino IDE digunakan untuk mem-flash firmware Arduino. Juga menggunakan perpustakaan dari Adafruit.

    Sebelum beralih ke sketsa, mari kita lihat fungsinya:

    • Pembacaan diambil dari sensor setiap 10 detik dan hanya indikator yang berubah dibandingkan pengukuran sebelumnya yang diperbarui di layar
    • Transfer data yang diterapkan melalui port COM

    Sketsa

    #termasuk // perpustakaan untuk komunikasi dengan perangkat I2C #include // Pustaka inti untuk semua sensor #include // perpustakaan untuk BMP180 #include // Pustaka grafis inti #include // Pustaka khusus perangkat keras #include // perpustakaan untuk komunikasi dengan perangkat SPI #termasuk "dht.h" // perpustakaan untuk DHT #define DHT22_PIN 2 // menghubungkan pin data DHT22 ke 2 pin digital #define TFT_CS 10 // menghubungkan pin CS dari TFT ke 10 pin digital #define TFT_RST 9 // sambungkan pin RST TFT ke 9 pin digital // Anda juga dapat menghubungkan ini ke reset Arduino // dalam hal ini, setel #define pin ini ke 0! #define TFT_DC 8 // sambungkan pin DC TFT ke 8 pin digital Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //inisialisasi TFT #define TFT_SCLK 13 // sambungkan pin SCLK TFT ke 13 pin digital #define TFT_MOSI 11 // sambungkan pin MOSI TFT ke 11 pin digital dht DHT; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); //inisialisasi BMP180 int bmpFlag = 0; struct ( uint32_t total; uint32_t oke; uint32_t crc_error; uint32_t time_out; uint32_t connect; uint32_t ack_l; uint32_t ack_h; uint32_t tidak diketahui; ) stat = ( 0,0,0,0,0,0,0,0); // struct untuk status dht void setup(void) ( Serial.begin(9600); Serial.println("Meteo Test"); Serial.println(""); if(!bmp.begin()) // periksa koneksi untuk BMP180 ( Serial.print("Ups, tidak ada BMP180 terdeteksi ... Periksa kabel atau I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB); // Inisialisasi TFT dan isi dengan warna hitam tft.fillScreen ; (ST7735_BLACK); tft.setRotation(tft.getRotation() + 1); tft.setTextSize(1.5); // penundaan untuk memastikan bahwa TFT telah diinisialisasi ) // data terakhir yang diukur float oldTemperature = 0 , oldAltitude = 0 , oldPressure = 0, oldDHTHumidity = 0, oldDHTTemperature; = 0 || !event.pressure) // perbarui data ( tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("INISIALISASI BMP KESALAHAN", 0 , "", true ) else ( if(event.pressure != oldPressure) ( tft.fillRect(0, 30, 160, 7, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED) ; printValue ("Tekanan", peristiwa.tekanan, " hPa", benar); oldPressure = peristiwa.tekanan = benar ) if(suhu != oldTemperature) ( tft.fillRect(0, 38, 160, 7, ST7735_BLACK ); tft.setCursor (0, 38); tft.setTextColor(ST7735_WHITE); printValue("Suhu", " C", benar); oldTemperature = suhu; tft.fillRect(0, 46, 160, 7, ST7735_BLACK); (0, 46); tft.setTextColor(ST7735_BLUE); printValue("Ketinggian", ketinggian, " m", benar); wasUpdate = true; 54, 160, 7, ST7735_BLACK);tft.setCursor(0, 54);

    Saatnya merakit bodi

    Kondisi utama dari kursus ini adalah prototipe yang berfungsi dalam bentuk yang rapi. Oleh karena itu, saya harus membeli rumah dan, berbekal file, memasukkan stasiun cuaca ke dalam rumah dengan cara apa pun.

    Kasing ini dibeli dari toko elektronik radio lokal.

    Bingkai

    (Kasing di foto sedikit berbeda. Saya punya tutup transparan)



    Kemudian, dengan menggunakan file, lubang dibuat untuk mengeluarkan sensor dan memasok daya. Saya memutuskan untuk memindahkan sensor ke luar, karena saat menguji sistem tanpa casing, saya melihat bagian belakang layar menjadi sangat panas, yang akan mempengaruhi suhu di dalam casing.

    Perumahan dengan bukaan untuk sensor dan daya



    Karena saya harus menyolder kaki ke 2 sensor dan saya membakar trek di salah satunya, saya memutuskan untuk tidak mencobai nasib dan tidak menyolder kabel ke sensor (saya akan berlatih pada hal lain), dan agar koneksi agar lebih atau kurang dapat diandalkan, saya memutuskan untuk memundurkan pita listrik.

    Sistem sebelum “dimasukkan” ke dalam housing



    Karena casingnya jauh lebih besar daripada Arduino (tidak ada yang lebih kecil), saya harus menyediakan penyangga agar papan tidak bergerak di dalam casing. Juga, sebuah gambar dipotong dari busa, dan di dalamnya ada persegi panjang untuk layar untuk menyembunyikan bagian dalam kasing. Saya tidak punya lem super, jadi saya harus menggunakan selotip dua sisi.

    Paus ikan ajaib-yuda



    Pasang tutupnya, sambungkan daya dan tunggu.

    Stasiun cuaca yang telah selesai di dalam gedung



    Setelah menampilkan hasilnya di layar, kami mengidentifikasi kesalahan yang tidak menyenangkan dalam mengukur kelembapan: DHT22 dengan rajin menghasilkan angka 99,90% (sangat jarang 1,00%). Mari kita mulai mencari tahu apa masalahnya. Hal pertama yang kita lakukan adalah melihat output nilai ke port COM. Segalanya tampak baik-baik saja. Setelah beberapa kali isi ulang, pembongkaran dan pemasangan kembali casing, muncul ide untuk mencari jawabannya di Google. Seperti yang diharapkan, Google Rusia tidak mengatakan sesuatu yang berguna. OKE. Kami mulai mencari dalam bahasa Inggris dan di salah satu forum kami menemukan orang-orang dengan masalah serupa. Empat halaman pertama diskusi tidak memberikan sesuatu yang berguna, tetapi pada halaman kelima kita menemukan jawaban atas pertanyaan kita:
    Sensor kelembapan dapat dengan mudah terpengaruh oleh gas yang salah atau paparan IIRC dengan kelembapan tinggi dalam waktu yang sangat lama. Di datasheet terdapat prosedur cara “reset” sensor, Anda bisa mencobanya.

    Satu-satunya pertanyaan yang tersisa adalah kapan dan bagaimana saya berhasil merusak DHT22. Namun waktunya sudah dekat untuk mengambil tugas kuliah, jadi saya meninggalkan solusi untuk masalah ini untuk nanti.

    Kata penutup

    Kursus telah berlalu. Stasiun cuaca telah ditunda tanpa batas waktu hingga semua tailing di universitas ditutup. Namun, kami harus kembali ke stasiun cuaca lebih awal dari yang saya kira. Kebetulan pada pertengahan bulan November saya berpindah tempat kerja dan di tim baru saya bertemu dengan orang-orang yang tertarik dengan platform Arduino dan sejenisnya. Oleh karena itu, ketertarikan saya terhadap platform ini, tanpa sempat menenangkan diri, kembali berkobar. Saya mengeluarkan stasiun cuaca saya, menghubungkannya ke komputer dan ingat bahwa saya mengimplementasikan transfer data dari Arduino melalui port COM. Dan kemudian muncul ide untuk menulis sebuah program yang menerima data melalui port COM dari Arduino dan mengirimkan data ini ke pemantauan publik, tapi itu cerita yang sama sekali berbeda.

    Saya juga ingin memiliki sensor nirkabel dan tetap mengaktifkan stasiun cuaca Arduino Pro Mini. Oleh karena itu, saya memesan 4 Arduino Pro Mini dengan catu daya 3.3V, 4 modul radio nRF24L01+ dan beberapa lainnya sensor tambahan, yang juga akan saya coba bicarakan lain kali. Sementara itu saya menunggu parselnya, ada rencana untuk mengimplementasikan koneksi jam real-time untuk dapat menghemat waktu update data dan data itu sendiri di kartu microSD asalkan tidak ada koneksi ke klien melalui port COM.

    Anda dapat membantu dan mentransfer sejumlah dana untuk pengembangan situs

    

    Saya menguji masing-masing bagian sistem Arduino UNO. Itu. Saya menghubungkan modul ESP ke uno dan mempelajarinya, memutusnya, lalu menghubungkan nRF24, dll. Untuk implementasi akhir sensor jendela, saya memilih Arduino Pro Mini sebagai miniatur yang paling dekat dengan Uno.



    Dari segi konsumsi daya, Arduino Pro Mini juga terlihat bagus:

    • tidak ada konverter USB-TTL, yang dengan sendirinya “memakan” banyak,
    • LED dihubungkan melalui resistor 10k.

    Untuk penghematan energi tingkat lanjut, direncanakan:

    • lepaskan LED - indikator daya pada Arduino Pro Mini (saya menyesal, saya tidak merusak papan)
    • atau gunakan rakitan "telanjang" pada mikroprosesor Atmel ATmega328 (tidak digunakan)
    • gunakan Perpustakaan Daya Rendah atau JeeLib.

    Dari perpustakaan yang saya pilih Low Power Library, sederhana dan hanya berisi apa yang dibutuhkan.


    Untuk unit pusat, karena direncanakan untuk menghubungkan banyak periferal, papan Arduino Mega dipilih. Selain itu, ini sepenuhnya kompatibel dengan UNO dan memiliki lebih banyak memori. Ke depan, saya akan mengatakan bahwa pilihan ini sepenuhnya dibenarkan.


    Anda dapat membeli Arduino Mega dengan harga sekitar $8.

    Konsumsi Daya dan Energi

    Sekarang tentang daya dan konsumsi energi.


    Arduino Pro Mini hadir dalam dua jenis:

    • untuk tegangan suplai 5V dan frekuensi 16MHz
    • untuk tegangan suplai 3,3V dan frekuensi 8MHz.

    Karena modul radio nRF24L01+ membutuhkan 3,3 V untuk catu daya, dan kecepatan tidak penting di sini, maka belilah Arduino Pro Mini dengan 8 MHz dan 3,3 V.


    Dalam hal ini, rentang tegangan suplai Arduino Pro Mini adalah:

    • 3.35-12V untuk model 3.3V
    • 5-12V untuk model 5V.

    Saya sudah memiliki Arduino Pro Mini pada 5V, itu sebabnya saya menggunakannya. Anda dapat membeli Arduino Pro Mini dengan harga sekitar $4.


    Unit pusat akan diberi daya dari jaringan 220 V melalui catu daya kecil yang memberikan output 12 V, 450 mA, 5 W. Seperti ini seharga $5. Ada juga pin 5V terpisah.



    Dan jika ini tidak cukup, Anda dapat menginstal sesuatu yang lebih kuat. Dengan kata lain, penghematan daya untuk unit pusat tidak masuk akal. Tapi untuk jarak jauh sensor nirkabel penghematan energi adalah bagian terpenting. Tapi saya juga tidak ingin kehilangan fungsinya.


    Oleh karena itu, Arduino Pro Mini dan modul radio nRF24 akan ditenagai oleh 4 baterai Ni-Mh.


    Dan ingat kapasitas maksimum baterai modern sekitar 2500-2700mAh, apa pun yang lebih merupakan gimmick pemasaran (Ansmann 2850) atau penipuan (UltraFire 3500).


    Saya tidak menggunakan baterai Li-Ion karena beberapa alasan:

    • sangat mahal
    • Ketika suhu lingkungan turun di bawah 0°C, daya berkurang baterai litium ion hingga 40-50%
    • yang murah diproduksi tanpa perlindungan dan tidak aman (jika terjadi korsleting atau pengosongan, dapat meledak dan terbakar, lihat banyak video di YouTube)
    • usia, meskipun tidak digunakan (namun, hal ini dapat dikatakan untuk semua unsur kimia), setelah 2 tahun Baterai Li-Ion kehilangan sekitar 20% dari kapasitas.

    Untuk prototipe, sangat mungkin dilakukan dengan baterai Ni-MH AA atau AAA berkualitas tinggi. Apalagi kita tidak membutuhkan arus yang besar. Satu-satunya negatif Baterai Ni-MH- ini adalah waktu pengisian daya yang lama.

    Diagram umum stasiun cuaca

    Mari kita rangkum. Di Sini skema umum bagaimana semuanya bekerja.



    Untuk dilanjutkan.

    Tag: Tambahkan tag

    Baru-baru ini, seorang rekan saya mengadakan pameran sains kecil-kecilan.
    Guru saya meminta saya untuk mempresentasikan proyek elektronik kepada siswa di perguruan tinggi. Saya punya waktu dua hari untuk memikirkan sesuatu yang menarik dan cukup sederhana.



    Karena kondisi cuaca di sini cukup berubah-ubah, dan suhu berfluktuasi pada kisaran 30-40°C, saya memutuskan untuk membuat stasiun cuaca di rumah.

    Apa fungsi stasiun cuaca rumah?
    Stasiun cuaca di Arduino dengan tampilan - perangkat yang mengumpulkan data tentang cuaca dan kondisi lingkungan menggunakan banyak sensor.

    Biasanya ini adalah sensor berikut:

    • angin
    • kelembaban
    • hujan
    • suhu
    • tekanan
    • ketinggian

    Tujuan saya adalah membuat stasiun cuaca desktop portabel dengan tangan saya sendiri.

    Itu harus dapat menentukan parameter berikut:

    • suhu
    • kelembaban
    • tekanan
    • tinggi

    Langkah 1: Beli komponen yang diperlukan







    • DHT22, sensor suhu dan kelembaban.
    • BMP180, sensor tekanan.
    • Pateri
    • Konektor keluaran 40 baris tunggal

    Peralatan yang Anda perlukan:

    • Besi solder
    • Tang bantalan hidung
    • Kabel

    Langkah 2: Sensor Suhu dan Kelembaban DHT22







    Berbagai sensor digunakan untuk mengukur suhu. DHT22, DHT11, SHT1x sangat populer

    Saya akan menjelaskan perbedaannya satu sama lain dan mengapa saya menggunakan DHT22.

    Sensor AM2302 menggunakan sinyal digital. Sensor ini berfungsi sistem yang unik pengkodean dan teknologi sentuh, jadi datanya dapat diandalkan. Elemen sensornya terhubung ke komputer chip tunggal 8-bit.

    Setiap sensor model ini dikompensasi suhu dan dikalibrasi secara tepat, koefisien kalibrasi terletak dalam memori yang dapat diprogram satu kali (memori OTP). Saat membaca pembacaan, sensor akan mengingat koefisien dari memori.

    Ukuran kecil, konsumsi rendah energi, interlokal roda gigi (100m) memungkinkan AM2302 cocok untuk hampir semua aplikasi, dan 4 output dalam satu baris membuat pemasangan menjadi sangat sederhana.

    Mari kita lihat kelebihan dan kekurangan ketiga model sensor tersebut.

    DHT11

    Kelebihan: tidak perlu menyolder, termurah dari ketiga model, cepat sinyal stabil, jangkauan lebih dari 20 m, interferensi kuat.
    Kekurangan: Perpustakaan! Tidak ada opsi resolusi, kesalahan pengukuran suhu +/- 2°C, kesalahan pengukuran tingkat kelembapan relatif +/- 5%, rentang suhu pengukuran yang tidak memadai (0-50°C).
    Area aplikasi: berkebun, pertanian.

    DHT22

    Kelebihan: tidak memerlukan penyolderan, biaya rendah, kurva halus, kesalahan pengukuran kecil, rentang pengukuran besar, jangkauan lebih dari 20 m, interferensi kuat.
    Kekurangan: sensitivitas bisa lebih tinggi, pelacakan perubahan suhu lambat, memerlukan perpustakaan.
    Area penerapan: studi lingkungan.

    SHT1x

    Kelebihan: tidak memerlukan penyolderan, kurva halus, kesalahan pengukuran kecil, respon cepat, konsumsi energi rendah, modus otomatis tidur, stabilitas tinggi dan konsistensi data.
    Kekurangan: dua antarmuka digital, kesalahan dalam mengukur tingkat kelembapan, kisaran suhu terukur 0-50°C, diperlukan perpustakaan.
    Area aplikasi: pengoperasian di lingkungan yang keras dan instalasi jangka panjang. Ketiga sensor tersebut relatif murah.

    Menggabungkan

    • Vcc – 5V atau 3.3V
    • Gnd - dengan Gnd
    • Data – ke pin Arduino kedua

    Langkah 3: Sensor Tekanan BMP180



    BMP180 – sensor tekanan atmosfer barometrik dengan antarmuka I2C.
    Sensor tekanan barometrik mengukur nilai absolut udara sekitar. Indikator ini tergantung pada spesifiknya kondisi cuaca dan dari ketinggian di atas permukaan laut.

    Modul BMP180 memiliki stabilizer 3.3V 662kOhm, yang karena kebodohan saya sendiri, secara tidak sengaja saya ledakkan. Saya harus mengarahkan catu daya langsung ke chip.

    Karena kurangnya stabilizer, pilihan sumber daya saya terbatas - tegangan di atas 3,3V akan merusak sensor.
    Model lain mungkin tidak memiliki stabilizer, pastikan untuk memeriksa keberadaannya.

    Diagram koneksi sensor dan bus I2C dengan Arduino (nano atau uno)

    • SDA-A4
    • SCL - A5
    • VCC - 3.3V
    • GND - GND

    Mari kita bicara sedikit tentang tekanan dan hubungannya dengan suhu dan ketinggian.

    Tekanan atmosfer di suatu titik tidaklah konstan. Interaksi kompleks antara rotasi bumi dan kemiringan sumbu bumi menyebabkan munculnya banyak daerah bertekanan tinggi dan rendah, yang pada gilirannya menyebabkan perubahan kondisi cuaca setiap hari. Dengan mengamati perubahan tekanan, Anda dapat membuat prakiraan cuaca jangka pendek.

    Misalnya, penurunan tekanan biasanya berarti cuaca hujan atau mendekati badai petir (mendekati daerah bertekanan rendah, siklon). Meningkatnya tekanan biasanya berarti cuaca kering dan cerah (area bertekanan tinggi, antisiklon, melewati Anda).

    Tekanan atmosfer juga berubah seiring ketinggian. Tekanan absolut di Base Camp Everest (5400 m dpl) lebih rendah dibandingkan tekanan absolut di Delhi (216 m dpl).

    Karena pembacaan tekanan absolut berbeda-beda di setiap lokasi, kita akan mengacu pada tekanan relatif, atau tekanan permukaan laut.

    Pengukuran tinggi badan

    Tekanan rata-rata di permukaan laut adalah 1013,25 GPa (atau milibar). Jika Anda naik ke atas atmosfer, nilai ini turun menjadi nol. Kurva jatuhnya ini cukup jelas, sehingga Anda bisa menghitung sendiri ketinggian di atas permukaan laut menggunakan persamaan berikut: alti=44330*

    Jika Anda mengambil tekanan permukaan laut sebesar 1013,25 GPa sebagai p0, penyelesaian persamaan ada di tangan Anda ketinggian saat ini di atas permukaan laut.

    Tindakan pencegahan

    Ingatlah bahwa sensor BMP180 memerlukan akses terhadap suasana sekitar untuk dapat membaca tekanan udara, jangan letakkan sensor di dalam wadah yang tertutup. Lubang ventilasi kecil sudah cukup. Namun jangan membiarkannya terlalu terbuka - angin akan mengacaukan pembacaan tekanan dan ketinggian. Pertimbangkan perlindungan angin.

    Lindungi dari panas. Mengukur tekanan memerlukan pembacaan suhu yang akurat. Usahakan untuk melindungi sensor dari perubahan suhu dan jangan tinggalkan di dekat sumber suhu tinggi.

    Lindungi dari kelembapan. Sensor BMP180 sensitif terhadap tingkat kelembapan, usahakan untuk mencegah kemungkinan masuknya air ke dalam sensor.

    Jangan membutakan sensornya. Yang tidak terduga adalah sensitivitas silikon pada sensor terhadap cahaya yang dapat menjangkaunya melalui lubang pada penutup chip. Untuk maksimal pengukuran yang tepat Cobalah untuk melindungi sensor dari cahaya sekitar.

    Langkah 4: Merakit perangkat







    Memasang konektor satu baris untuk Arduino Nano. Sebenarnya, kami menebangnya menjadi ukuran yang tepat dan mengampelasnya sedikit agar terlihat seolah-olah ada di sana. Lalu kami menyoldernya. Setelah itu, kami memasang konektor satu baris untuk sensor DHT22.

    Kami memasang resistor 10kOhm dari output data ke ground (Gnd). Kami menyolder semuanya.
    Kemudian kita pasang konektor satu baris untuk sensor BMP180 dengan cara yang persis sama, sehingga menghasilkan catu daya 3.3V. Kami menghubungkan semuanya ke bus I2C.

    Terakhir, kami menghubungkan layar LCD ke bus I2C yang sama dengan sensor BMP180.
    (Saya berencana untuk menyambungkan modul RTC (jam waktu nyata) ke konektor keempat nanti sehingga perangkat juga dapat menunjukkan waktu).

    Langkah 5: Pengkodean




    Unduh perpustakaan

    Untuk menginstal perpustakaan di Arduino, ikuti tautannya

    #termasuk
    #include #include #include "DHT.h" #include

    tekanan SFE_BMP180;

    #tentukan KETINGGIAN 20.56 #tentukan 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

    #define DHTPIN 2 // pin digital apa yang kita sambungkan

    // Batalkan komentar pada tipe apa pun yang Anda gunakan! //#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);

    batal pengaturan() ( 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);

    status = tekanan.getTemperature(T);

    if (status != 0) ( Serial.print("1"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Suhu Baro: "); lcd.setCursor(0,1 );lcd.cetak(T,2);lcd.cetak("derajat C");

    status = tekanan.getPressure(P,T);

    if (status != 0) (lcd.clear(); lcd.setCursor(0,0); lcd.print("tekanan abslt: "); lcd.setCursor(0,1); lcd.print(P,2 );lcd.print("mb");

    p0 = tekanan.sealevel(P,ALTITUDE); // kita berada di ketinggian 1655 meter (Boulder, CO)

    a = tekanan.ketinggian(P,p0);

    • lcd.hapus();

      semacam ulasan "pendek"... seolah-olah mereka sedang terburu-buru di suatu tempat