Modul Sensor Tekanan Barometrik BMP085 untuk arduino (atau cara membuat stasiun cuaca dengan tangan Anda sendiri). Stasiun cuaca rumah buatan saya di Arduino Nano Diagram listrik dari stasiun cuaca nirkabel

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 Arduino dengan tampilan adalah perangkat yang mengumpulkan data tentang cuaca dan kondisi lingkungan menggunakan berbagai 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 beroperasi pada sistem pengkodean dan teknologi sensor yang unik, sehingga datanya dapat diandalkan. Elemen sensornya terhubung ke komputer chip tunggal 8-bit.

Setiap sensor model ini diberi kompensasi 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.

Ukurannya yang kecil, konsumsi daya yang rendah, jarak transmisi yang jauh (100m) membuat 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 memerlukan penyolderan, termurah dari ketiga model, sinyal stabil cepat, 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 perlu menyolder, kurva halus, kesalahan pengukuran rendah, respons cepat, konsumsi daya rendah, mode tidur otomatis, 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 bergantung pada kondisi cuaca tertentu dan 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 datangnya 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, solusi persamaannya adalah ketinggian Anda 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 pengukuran paling akurat, coba lindungi sensor dari cahaya sekitar.

Langkah 4: Merakit perangkat







Memasang konektor satu baris untuk Arduino Nano. Pada dasarnya, kami memotongnya sesuai ukuran dan mengampelasnya sedikit agar terlihat seperti aslinya. 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 jenis 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); mengambang t1,t2;

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.print(T,2); lcd.print("derajat C"); t1=T; penundaan(3000);

status = tekanan.startPressure(3); if (status != 0) ( // Tunggu hingga pengukuran selesai: delay(status);

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"); penundaan(3000);

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

a = tekanan.ketinggian(P,p0); lcd.hapus(); lcd.setCursor(0,0); lcd.print("Ketinggian : "); lcd.setCursor(0,1); lcd.cetak(a,0); lcd.print("meter"); penundaan(3000); ) ) ) ) float h = dht.readHumidity(); // Baca suhu sebagai Celcius (default) float t = dht.readTemperature(); t2=t; lcd.hapus(); lcd.setCursor(0,0); // lanjutkan ke awal baris ke-2 lcd.print("Kelembaban: "); lcd.setCursor(0,1);lcd.print(h); lcd.cetak(" %"); penundaan(3000); lcd.hapus(); lcd.setCursor(0,0); // lanjutkan ke awal baris ke-2 lcd.print("DHT Tempurature: "); lcd.setCursor(0,1); lcd.cetak(t); lcd.print("derajat C"); penundaan(3000); lcd.hapus(); lcd.setCursor(0,0); // lanjutkan ke awal baris ke-2 lcd.print("Mean Tempurature: "); lcd.setCursor(0,1); lcd.cetak((t1+t2)/2); lcd.print("derajat C"); penundaan(3000); )

Saya menggunakan Arduino versi 1.6.5, kodenya sangat cocok, dan mungkin juga cocok dengan kode yang lebih baru. Jika kode tidak cocok karena alasan tertentu, gunakan versi 1.6.5 sebagai basis.

Stasiun cuaca DIY.

Saat itu malam, tidak ada yang bisa dilakukan setelah Tahun Baru. Seperti biasa, saat liburan Tahun Baru musim dingin saya ingin menyibukkan kepala dan tangan saya dengan sesuatu yang bermanfaat dan kreatif. Selama liburan Tahun Baru ini saya memutuskan untuk membuat stasiun cuaca dengan tangan saya sendiri. Saya mulai mempersiapkan terlebih dahulu, membeli dan merakit semua komponen sebelum Tahun Baru, dan melakukan pemrograman utama selama liburan.

(ada banyak foto yang dipotong!)

Pertama, saya akan membahas komponennya, saya tidak akan memberikan link, karena produk di eBay (di akun pribadi saya) telah diarsipkan. Saya membeli banyak komponen dengan santai di eBay. Saya pertama kali mencoba lelang, sebelumnya saya selalu membeli “beli sekarang”. Mau bilang, kalau tidak terburu-buru berbelanja, Anda bisa membeli beberapa komponen lebih murah (selisihnya kadang dua kali lipat).

Sensor tekanan VMR085
Ini adalah sensor utama. Ketika saya melihatnya di eBay, saya tahu saya ingin membangun stasiun cuaca di rumah.
Sensor tiba dalam amplop biasa, ditutupi dengan bubble wrap di dalamnya.

Di dalam amplop terdapat kartu nama penjual dan sebuah sensor, dikemas dalam tas antistatis dan dibungkus dengan lapisan bubble wrap lagi.

Kantong antistatis ditutup rapat sehingga kelembapan selama penerbangan tidak mengancam sensor

Kami mengeluarkan sensornya. Di satu sisi ada garis kontak yang disolder, yang dimasukkan ke dalam busa agar tidak tertekuk. Di sisi lain terdapat sensor itu sendiri dan tanda kontak.




Semuanya akan baik-baik saja, tetapi tanda kontak diterapkan dalam bayangan cermin.
Sensor dihubungkan melalui bus I2C dan diberi daya sebesar 3,3 V. Artinya, untuk pengoperasian normal diperlukan 4 kabel (+, -, SDA, SCL)
Anda dapat menginterogasi sensor dengan 2 cara: melalui perpustakaan, atau menggunakan fungsi langsung di sketsa.
Contoh program:

#termasuk

#define BMP085_ADDRESS 0x77 // Alamat I2C BMP085

Const karakter OSS yang tidak ditandatangani = 0; // Pengaturan Pengambilan Sampel Berlebihan

// Nilai kalibrasi
int ac1;
int ac2;
int ac3;
tidak ditandatangani int ac4;
tidak ditandatangani int ac5;
tidak ditandatangani int ac6;
ke dalam b1;
ke dalam b2;
ke dalam mb;
ke dalam mc;
ke dalam md;

Suhu pendek;
tekanan panjang;

Batalkan penyiapan()
{
Serial.mulai(9600);
Kawat.begin();
bmp085Kalibrasi();
}

lingkaran kosong()
{
suhu = bmp085GetTemperature(bmp085ReadUT());
tekanan = bmp085GetPressure(bmp085ReadUP());
Serial.print("Suhu: „);
Serial.print(suhu/10.0, DES);
Serial.println("C");
Serial.print("Tekanan: „);
Serial.print(tekanan/133.322, DES);
Serial.println(“mm Hg”);
Serial.println();
penundaan(1000);
}

Batal bmp085Kalibrasi()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}

Bmp085GetTemperature pendek (unsigned int ut)
{
panjang x1, x2;
x1 = (((panjang)ut - (panjang)ac6)*(panjang)ac5) >> 15;
x2 = ((panjang)mc<< 11)/(x1 + md);
b5 = x1 + x2;

Kembali ((b5 + 8)>>4);
}

Bmp085GetPressure panjang (tidak ditandatangani panjang)
{
panjang x1, x2, x3, b3, b6, p;
tidak bertanda tangan b4 panjang, b7;
b6 = b5 - 4000;
// Hitung B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((panjang)ac1)*4 + x3)<>2;
// Hitung B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (tidak ditandatangani panjang)(x3 + 32768))>>15;
b7 = ((unsigned long)(naik - b3) * (50000>>OSS));
jika (b7< 0x80000000)
hal = (b7<<1)/b4;
kalau tidak
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 *p)>>16;
p += (x1 + x2 + 3791)>>4;
kembali p;
}

// Baca 1 byte dari BMP085 di "alamat"
char bmp085Baca(alamat char yang tidak ditandatangani)
{
data karakter yang tidak ditandatangani;

Wire.write(alamat);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available())
;
return Wire.read();
}

Int bmp085ReadInt (alamat karakter yang tidak ditandatangani)
{
karakter msb yang tidak ditandatangani, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(alamat);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.tersedia()<2)
;
msb = Kawat.baca();
lsb = Kawat.baca();
kembali (int) msb<<8 | lsb;
}

// Baca nilai suhu tanpa kompensasi
tidak ditandatangani int bmp085ReadUT()
{
tidak ditandatangani ke dalam ut;
// Tulis 0x2E ke dalam Register 0xF4
// Ini meminta pembacaan suhu
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Kawat.tulis(0x2E);
Wire.endTransmission();
// Tunggu setidaknya 4,5 ms
penundaan(5);
// Membaca dua byte dari register 0xF6 dan 0xF7
ut = bmp085ReadInt(0xF6);
kembali;
}

// Baca nilai tekanan tanpa kompensasi
bmp085ReadUP panjang yang tidak ditandatangani()
{
karakter yang tidak ditandatangani msb, lsb, xlsb;
tidak ditandatangani panjang = 0;
// Tulis 0x34+(OSS<<6) into register 0xF4
// Minta pembacaan tekanan dengan pengaturan oversampling
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// Tunggu konversi, waktu tunda tergantung OSS
penundaan(2 + (3<// Baca register 0xF6 (MSB), 0xF7 (LSB), dan 0xF8 (XLSB)
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Tunggu hingga data tersedia
while(Wire.tersedia()< 3)
;
msb = Kawat.baca();
lsb = Kawat.baca();
xlsb = Kawat.baca();
up = (((unsigned panjang) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
kembali;
}


Selain itu, sensor tersebut memiliki sensor termal sendiri untuk kompensasi tekanan dan altimeter

Arduino Nano v3.0
Ini adalah jantung dari keseluruhan stasiun cuaca. Sederhananya, pengontrolnya berukuran mini.
Saya beli
Saya tidak akan berbicara secara detail tentang pengontrol, karena ini sudah pernah dilakukan sebelum saya:


Paket lightake dibuat dari pabrik, pengontrol datang dalam paket berisi kabel USB dan Arduino dalam kantong antistatis tertutup.

Untuk memperkirakan ukurannya, saya meletakkan koin 1 rubel di sebelah Arduino.

Papan pengontrol dari dekat



Kabel USB bagus, dengan cincin ferit. Arduino diberi daya melalui kabel USB. Lingkungan pengembangan dapat diunduh (halaman unduh). Bahasanya seperti “C”, tidak ada masalah dalam menguasainya, karena saya melakukan banyak pemrograman di tempat kerja.

layar LCD
Di tempat kerja saya menemukan layar LCD 1602 yang kompatibel di tempat sampah. Saya harus mengutak-atik koneksinya, karena saya tidak dapat menemukan lembar datanya. Hasilnya, LCD mulai berfungsi.

Namun setelah beberapa saat digunakan, saya menyadari bahwa layar ini tidak cukup bagi saya dan tidak dapat menampilkan lebih banyak data, karena hanya memiliki 2 baris yang masing-masing terdiri dari 16 karakter. Pada awalnya tampaknya parameter ini cukup, tetapi ketika Anda memulai pemrograman, Anda menyadari bahwa jumlah maksimum yang dapat Anda masukkan adalah 3-4 parameter. Dan jika Anda membuat menu (saya berpikir untuk membuat menu di layar ini), maka hanya tersisa 1-2 parameter ruang kosong.
Akibatnya, saya mulai mencari layar lain. Awalnya saya melihat dari dekat layar grafis dari Nokia 3310 dan bahkan berpartisipasi dalam lelang eBay untuk membelinya, tetapi tidak berhasil (yang membuat saya sangat senang), jadi saya harus melepaskan layar ini. Sekarang saya mengerti bahwa itu akan terlalu kecil untuk tujuan saya, karena ada sesuatu untuk dibandingkan.
Saat secara acak melihat melalui perisai di Arduino, saya menemukan layar grafis 12864 pada pengontrol ST7920. Layar ini memiliki ukuran yang tepat dan resolusi yang baik untuk kebutuhan saya (128x64). Artinya, Anda dapat dengan mudah menempatkan 6-7 baris 20 karakter dalam font yang biasanya dapat dibaca. Karena layarnya berupa grafik, selain teks, grafik dapat ditempatkan dalam font yang berbeda. Singkatnya, inilah yang saya butuhkan, semuanya ada di layar ini, jadi saya tidak bisa menolak dan memesannya.
Paket tiba dengan cepat dan dikemas sesuai standar: amplop bubble wrap, di dalamnya ada lapisan bubble wrap lagi dan layar di dalam tas antistatis:






Untuk memperkirakan ukurannya, saya meletakkan koin 1 rubel di sebelah LCD.




Untuk menghubungkan layar ke Arduino dengan cepat, saya menyolder garis kontak ke pin LCD. LCD dapat dihubungkan melalui bus serial atau bus paralel. Saya memilih opsi pertama, karena hanya ada sedikit kontak Arduino gratis.
Koneksi (diambil dari web):

- Pin 1 (GND) terhubung ke bus umum
- Pin 2 (VCC) terhubung ke bus daya +5V, dan konsumsi arusnya relatif kecil dan layar dapat diberi daya dari stabilizer Arduino bawaan.
- Pin 4, 5 dan 6 terhubung ke output digital Arduino, membentuk antarmuka serial SPI:
pin 4 – (RS) – sesuai dengan jalur CS (misalnya 7)
pin 5 – (RW) – sesuai dengan jalur MOSI (misalnya 8)
pin 6 – (E) – sesuai dengan garis SCK (misalnya 3)
Nomor kontak Arduino bisa apa saja, yang utama jangan lupa untuk menunjukkannya dengan benar di teks program saat menginisialisasi tampilan.
- Pin 15 (PSB) terhubung ke bus umum.
- Kontak 19 (A) dan 20 (K) adalah catu daya lampu latar (+5V dan GND, masing-masing). Untuk mengatur kecerahan lampu latar, Anda dapat menggunakan resistor variabel 10 kOhm yang dihubungkan antara bus daya dan GND. Tegangan dari mesinnya disuplai ke pin 19 layar.
Menurut petunjuk ini, saya menghubungkan semuanya kecuali lampu latar. Saya menggunakan Arduino PWM untuk menyalakan lampu latar.
Untuk menghubungkan LCD ke Arduino secara terprogram, perpustakaan u8glib digunakan. Anda dapat mengunduhnya. Jika ada masalah saat mengunduh, saya bisa mengunggah perpustakaannya ke narod.ru.
Perpustakaannya sendiri tidak rumit dan memungkinkan Anda menampilkan teks dalam font berbeda, menggambar garis, menggambar bentuk geometris sederhana (persegi panjang, lingkaran), dan menampilkan gambar Anda sendiri yang disiapkan dengan cara khusus. Pada prinsipnya, alat ini cukup untuk sebagian besar tugas.
Berikut adalah hasil dari program sederhana:

Program itu sendiri:

#sertakan "U8glib.h"

U8GLIB_ST7920_128X64 u8g(3, 9, 8, U8G_PIN_NONE); // SPI E = 3, RW = 9, RS = 8

// Subrutin untuk menentukan memori bebas
int freeRam() (
eksternal int __heap_start, *__brkval;
di TV;
kembali (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

Penyiapan batal (batal) (
u8g.setFont(u8g_font_6x10); // huruf
u8g.setRot180(); //Balik layar
analogWrite(6, 115); // Mengatur kecerahan layar (anoda lampu latar pada 6 pin)
}

Lingkaran kosong(batal) (
u8g.Halaman Pertama();
Mengerjakan(

u8g.setPrintPos(1, 12); // posisi
u8g.print("Halo!!!"); // keluaran teks
u8g.drawBox(0,22,128,9); // Warnai persegi panjang tersebut dengan warna putih
u8g.setColorIndex(0); // tinta putih, latar belakang hitam
u8g.setPrintPos(1, 30); // posisi
u8g.print("Kata..."); // keluaran teks

U8g.setColorIndex(1); // tinta putih, latar belakang hitam
u8g.setPrintPos(1, 50); // posisi
u8g.print("Setelah mulai ="); // keluaran teks
u8g.setPrintPos(85, 50); // posisi
u8g.print(millis() / 1000); // menampilkan jumlah detik setelah start
u8g.setPrintPos(1, 64); // posisi
u8g.print(freeRam()); // menampilkan berapa banyak memori yang digunakan
) while(u8g.nextPage());

Penundaan (200);
}

Jam waktu nyata DS1307
Komponen lain untuk stasiun cuaca saya. Perisai ini menerapkan jam waktu nyata. Saya memesannya di eBay. Penjual mengirimkan syal jam tangan dalam kotak besar yang tidak realistis


Di dalam kotak itu ada dua lembar iklan berukuran A4 dan sebuah sapu tangan arloji yang dibungkus plastik


Saya ingin mencatat bahwa biayanya tidak melebihi 2 rubel. koin, dan kotak itu berukuran 13x15x5 cm.
Papan itu dikemas dalam tas antistatis

Selendang menutup



Saya harus mengutak-atik modul ini. Pertama, ada kesulitan koneksi. Dan kedua, tidak ada kuarsa di papan ini. Jika saya tahu bahwa saya akan menghabiskan begitu banyak waktu untuk mengerjakan modul ini, kemungkinan besar saya akan merakitnya sendiri, karena Internet penuh dengan diagram. Rangkaian paling sederhana berisi 4-5 komponen.
Mengenai hubungannya. Saya menemukan perpustakaan yang mengatakan bahwa antarmuka I2C tidak dapat dihubungkan ke input analog Arduino biasa (A4 dan A5), tetapi ke input diskrit apa pun. Saya melakukannya seperti yang tertulis. Awalnya tidak ada yang berhasil, tapi setelah lama menari dengan rebana, jam pun mulai menyala. Baiklah, saya pikir itu saja, masalahnya sudah selesai, tetapi setelah saya mencoba menghubungkan modul yang sama ke Arduino lain, tarian dengan rebana terus berlanjut. Saya menghabiskan banyak waktu mencari solusi untuk masalah ini dan hampir di semua tempat diindikasikan koneksi yang salah atau tidak adanya resistor pull-up pada kontak SCL dan SDA. Saya sudah ingin masuk ke papan dengan besi solder, tetapi di satu forum saya tidak sengaja menemukan kode yang dikatakan untuk menghubungkan SCL dan SDA ke port I2C standar di Arduino. Setelah koneksi standar, semuanya langsung berfungsi.
Sekarang tentang kuarsa. Saya tidak tahu jenis kuarsa apa yang dipasang orang Cina di sana, tetapi jam tangan dengan kuarsa seperti itu menghasilkan waktu 10-11 detik per hari. Kesalahan ini 5 menit per bulan, dan 1 jam per tahun. Tidak perlu jam tangan seperti ini. Saya harus online lagi dan mencari cara memperbaiki bug ini. Solusi pertama yang muncul mengatakan bahwa Anda perlu membumikan kuarsa. Saya melakukannya - hasilnya nol. Saya juga menemukan di suatu tempat bahwa saya perlu mencari motherboard lama dan melepaskan jam kuarsa dari sana. Saya melakukannya - ada hasilnya. Sekarang jam berjalan bukan 10-11 detik, tapi 1,5 detik per hari. Anggap saja sudah membaik, tapi masih jauh dari ideal. Karena saya tidak ingin lagi mengutak-atik besi solder, diputuskan untuk menyesuaikan jam secara terprogram, yaitu menyesuaikan jam ke nilai yang diperlukan sekali sehari. Setelah 10 hari, jam berjalan tidak lebih dari satu detik. Metodenya bagus, tetapi hanya ketika perangkat sinkronisasi Arduino terhubung ke daya, jika tidak, jam akan berjalan dengan daya baterai dan masih berjalan.
Sebuah program tes kecil:

#termasuk "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // SDA A4, SCL A5

Byte desToBcd(byte val)
{
kembali ((val/10*16) + (val%10));
}

Byte bcdToDec(byte val)
{
kembali ((val/16*10) + (val%16));
}

Batal setDateDs1307(byte detik, // 0-59
byte menit, // 0-59
byte jam) // 0-99
{

Wire.write(0);
Wire.write(decToBcd(detik));
Wire.write(decToBcd(menit));
Wire.write(decToBcd(jam));
Wire.endTransmission();
}

Batalkan getDateDs1307(byte *detik,
byte *menit,
byte *jam)
{

Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*kedua = bcdToDec(Wire.read());
*menit = bcdToDec(Wire.read());
*jam = bcdToDec(Wire.read());
}

Batalkan penyiapan()
{
byte detik, menit, jam;
Kawat.begin();
Serial.mulai(9600);

Kedua = 45;
menit = 5;
jam = 16;

SetDateDs1307(detik, menit, jam);
}

lingkaran kosong()
{
byte detik, menit, jam;

GetDateDs1307(&detik, &menit, &jam);
Serial.print(jam, DES);
Serial.cetak(":");
Serial.print(menit, DES);
Serial.cetak(":");
Serial.println(kedua, DEC);

Penundaan (1000);
}


Perpustakaan tidak digunakan di sini, dan fungsi waktu membaca dan menulis terpotong.

Sensor suhu dan kelembaban DHT11
Tidak ada yang perlu diceritakan tentang sensor ini. Saya bahkan tidak akan menggunakannya jika kelembapannya tidak diperlukan. Sayangnya, saya tidak mengambil fotonya saat menerimanya, jadi tidak akan ada foto apa pun. Foto sensornya dapat dilihat di bawah ini, dimana saya menghubungkannya dengan Arduino. Koneksi sensornya sederhana (+, keluaran digital, -). Biasanya sensor dibuat dengan empat pin. Dengan faktor bentuk ini, pin ketiga tidak terhubung ke apa pun.
Anda dapat menggunakan perpustakaan untuk terhubung ke Arduino. Anda dapat mengunduhnya.
Program pengujian kecil dengan keluaran informasi pada layar LCD 1602:

// sertakan kode perpustakaan:
#termasuk
#termasuk

// Mendeklarasikan objek
dht11 DHT11;
LCD Kristal Cair(12, 11, 6, 5, 4, 3);

#tentukan DHT11PIN 7
ke dalam aku;

Batalkan penyiapan()
{
lcd.mulai(16, 2);
lcd.print("Status: „);
saya=0;
}

lingkaran kosong()
{
int chk = DHT11.baca(DHT11PIN);
lcd.setCursor(8, 0);
beralih (chk)
{
kasus 0: lcd.print(“OK „); istirahat;// lcd.setCursor(11, 0); lcd.print(millis()/2000); merusak;
kasus -1: lcd.print("Kesalahan checksum"); mErr(); merusak;
case -2: lcd.print("Kesalahan waktu habis"); mErr(); merusak;
default: lcd.print("Kesalahan tidak diketahui"); mErr(); merusak;
}
penundaan(500);
lcd.setCursor(15, 0);
beralih (i)
{
kasus 0: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" ");pecah;
kasus 1: lcd.print("v"); lcd.setCursor(15, 1); lcd.print(" ");pecah;
bawaan: lcd.setCursor(15, 1); lcd.cetak("E"); merusak;
}
saya=saya+1;
jika (i>1) i=0;
lcd.setCursor(0, 1);
lcd.cetak("H=");
lcd.setCursor(2, 1);
lcd.print((float)DHT11.kelembaban, 0);
lcd.setCursor(4, 1);
lcd.cetak("%");
lcd.setCursor(8, 1);
lcd.cetak("T=");
lcd.setCursor(10, 1);
lcd.print((float)DHT11.temperature, 0);
lcd.setCursor(12, 1);
lcd.cetak("C");

Batalkan mErr()
{
lcd.setCursor(2, 1);
lcd.cetak("**");
lcd.setCursor(10, 1);
lcd.cetak("**");
saya=5;
}


Sensor ini memiliki beberapa kelemahan - data dari sensor hanya berupa bilangan bulat, dan jangkauannya lemah.

Sepertinya saya menulis tentang semua komponen. Yang tersisa hanyalah mengumpulkan semuanya menjadi satu kesatuan.
Ups, saya hampir lupa! Untuk merakit perangkat, Anda memerlukan kasing. Saya juga memesan kasingnya di Ebay. Penjualnya ternyata dari Inggris. Paketnya cepat sampai, tapi saya tidak memotretnya. Semua foto kasusnya ada di bawah.

Pertama, saya merakit semua yang ada di meja menggunakan kabel khusus. Saya menulis program pengujian dan mengunggahnya ke pengontrol.



Faktanya, warna biru pada lampu latar jauh lebih terang. Bahkan pada kecerahan minimum (Bright=5), bingkai tetap menyala.

Untuk merakit semuanya secara nirkabel, diputuskan untuk membuat motherboard mini, dan papan serta pelindung Arduino dipasang pada konektornya. Jika terjadi sesuatu, mereka dapat dengan cepat dan mudah dihilangkan. Saya juga memutuskan untuk memasang layar LCD dan tombol kontrol ke konektor, hanya untuk menyolder sensor suhu pada kabel.
Beginilah hasil syalnya



Di foto terakhir saya belum sepenuhnya menghilangkan fluksnya. Saya merekatkan karet berpori di bawah pelindung di sebelah konektor sehingga setidaknya ada dukungan. Meskipun sebenarnya pelindung pada konektor pada kontak masih berfungsi dengan baik.

Motherboard dengan pelindung terpasang dan papan Arduino.

Seperti inilah tampilan koneksi lengkap ke motherboard


Alih-alih kancing, saya menggunakan pelindung buatan sendiri yang disolder ke papan tempat memotong roti. Saya menggunakan tombol dari mouse lama sebagai tombol.
Seperti yang Anda lihat, jumlah kabel berkurang.

Masalah utama penempatan pada casing adalah memotong alur halus untuk layar LCD. Tidak peduli seberapa keras saya mencoba, tetap saja tidak berhasil dengan sempurna. Kesenjangan di beberapa tempat sedikit lebih dari 1 mm. Agar semuanya terlihat rapi, saya mengambil sealant akuarium hitam dan mengisi semua celahnya, sekaligus saya menempelkan layar ke sealant ini. Setelah sealant mengering, saya memotong kelebihannya dari luar. Dalam cahaya terang, sealant terlihat, tetapi dalam cahaya normal, semuanya menyatu dengan bodi.
Ini adalah tampilan casing dari dalam dengan layar LCD dan motherboard terpasang.

Ini penampakannya dari luar saat cahaya terang (maaf soal sidik jarinya, saya melihatnya saat sedang memilah-milah foto).

Saya sudah lama berpikir tentang cara memasukkan tombol ke dalam casing dan, yang paling penting, tombol apa yang akan digunakan...
Di toko radio-elektronik, mereka menyukai tombol dengan pin panjang dan ujung yang pas di pin ini. Tombol-tombol ini digunakan untuk menyolder ke papan. Semuanya akan baik-baik saja, tetapi ada kekurangannya - tekanannya sangat kecil dan keras.
Kami harus menempatkan tombol-tombol dalam dua tahap: yang pertama adalah menempatkan tombol-tombol di papan, yang kedua adalah memasang papan ini di papan lain. Dan kemudian masukkan semua ini ke dalam tubuh pada panduan.

Ini penampakan syal dengan kancing:



Berikut penampakan papan dudukannya:


Di sini Anda dapat melihat panduan tempat papan dengan tombol dimasukkan. Beberapa elemen disolder untuk memberikan kekakuan pada papan.

Sekarang kami memasukkan semuanya ke dalam tubuh
Tanpa tombol penghubung:


Dengan koneksi tombol:

Tutup casingnya dan hidupkan. Semuanya berfungsi dengan baik, tombol berfungsi sebagaimana mestinya.

Pada akhirnya saya memposting video pendek tentang perangkat yang bekerja dalam mode berbeda:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
Bagi yang belum melihat videonya di sini, ini tautannya

Saatnya mengakhiri ulasan.
Saya akan menulis sedikit tentang program ini, dan kemudian beberapa kesimpulan singkat. Ketika saya menulis program ini, saya tidak berpikir bahwa saya akan dengan cepat mencapai batas 30.720 byte.


Saya harus mengoptimalkan kodenya. Saya memindahkan banyak potongan kode ke dalam subrutin. Saya tidak akan pernah berpikir bahwa pernyataan switch...case dalam bentuk terkompilasi membutuhkan lebih banyak ruang daripada beberapa pernyataan if...else. Deklarasi variabel yang benar juga menghemat ruang. Jika Anda mendeklarasikan array yang panjang, meskipun sangat mungkin untuk mendapatkan byte, maka kelebihan memori mencapai 500 byte, tergantung pada ukuran array. Ketika Anda menulis sebuah program, Anda tidak memikirkannya, dan hanya kemudian, ketika Anda menganalisis program tersebut, Anda menyadari bahwa Anda melakukan beberapa kesalahan, dan Anda mulai mengoptimalkan kodenya. Setelah masalah ukuran program teratasi, saya mengalami keterbatasan RAM. Hal ini terungkap dalam kenyataan bahwa program mulai membeku setelah memuat. Saya harus memperkenalkan subrutin untuk menghitung RAM bebas. Akibatnya, saya terpaksa meninggalkan satu algoritma prakiraan cuaca, karena harus menampilkan ikon di layar. Algoritmenya sendiri berfungsi, tetapi keluaran ikon harus direkam. Saya masih memiliki ide tentang cara mengoptimalkan kode, tetapi dalam waktu dekat saya akan membiarkan perangkat berjalan apa adanya untuk mengevaluasi kinerjanya dan mengidentifikasi semua bug.

Sekarang beberapa kesimpulan
Minus
1) Harga. Alasan atas kerugian ini adalah bahwa sebuah hobi tidak pernah murah.

pro
1) Fungsionalitas perangkat yang luar biasa
2) Peningkatan fungsi hanya dibatasi oleh pengontrol yang digunakan dan keinginan Anda sendiri
3) Kenikmatan estetis dari kontemplasi dan kepuasan moral dari kenyataan bahwa saya akhirnya merakit dan menyelesaikan perangkat ini

Saya berencana membeli +86 Tambahkan ke Favorit Saya menyukai ulasannya +137 +304

Saat ini, untuk merakit prototipe stasiun cuaca rumah dasar yang berfungsi, Anda tidak perlu memiliki keterampilan pemrograman yang kuat (dalam kasus kami, terlebih lagi) atau desain sirkuit. Yang Anda butuhkan hanyalah kemampuan “Google” dan sedikit keinginan untuk melakukan sesuatu dengan tangan Anda sendiri. Pada materi kali ini saya akan menceritakan dan menunjukkan cara merakit stasiun cuaca rumah dengan koneksi jaringan di malam hari. Anggaran dasarnya hanya $10.

Teks mungkin dan kemungkinan besar memang mengandung kesalahan tata bahasa, ejaan, tanda baca, dan jenis kesalahan lainnya, termasuk kesalahan semantik. Saya mendorong pembaca untuk menunjukkan kesalahan ini menggunakan sistem ORPHUS. Untuk melakukan ini, cukup pilih bagian teks yang diperlukan dan tekan kombinasi tombol CTRL+Enter.

Kumpulan komponen dasar

Dasar dari perangkat masa depan kami adalah papan pengembangan NodeMCU berdasarkan modul ESP8266. Saya mendapatkannya di Gearbest, tetapi jika mau, Anda bisa mencarinya di situs lain.

Untuk menyambungkan modul, Anda dapat menggunakan kabel dengan konektor BLS ($0,9) atau papan tempat memotong roti tanpa solder dengan satu set kabel penghubung ($3,74).

Koneksi dan pengaturan

Meskipun tersedia 4 pin, sensor kami terhubung hanya melalui 3 kabel: catu daya +5V (1 pin), ground (4) dan jalur data (2). Kami mengambil daya untuk sensor baik dari pin VUSB atau dari 3V, jika yang pertama tidak ada di board Anda. Kami menghubungkan jalur data ke port GPIO14 (pin D5).

Izinkan saya mengingatkan Anda bahwa dalam kasus kami, sama sekali tidak diperlukan keahlian pemrograman. Kami akan membuat firmware untuk modul menggunakan situs web WiFi-IoT.ru, yang ditulis oleh Maxim Malkin, juga dikenal dengan proyek otomasi rumah home-smart.ru. Untuk memulai, cukup mendaftar di WIFi-IoT dan konfirmasi email Anda.

Sebelum merakit firmware, perlu menyiapkan modul yang dibeli untuk pengoperasian dan membersihkannya dari kemungkinan perangkat lunak China yang sudah diinstal sebelumnya. Untuk melakukan ini, kita memerlukan kabel USB-microUSB yang berfungsi dan komputer atau mesin virtual dengan Windows. Setelah mendaftar di situs, Anda akan dibawa ke halaman berbahasa Inggris “Memulai” dengan penjelasan tentang cara mempersiapkan modul untuk pengoperasian. Unduh file perangkat lunak dari dua langkah pertama instruksi.

Secara teoritis, setelah menghubungkan modul ke komputer, Windows sendiri yang harus menemukan driver dan menginstalnya. Jika hal ini tidak terjadi, coba identifikasi sirkuit mikro di papan (dibedakan dengan banyak "kaki") di dekat port microUSB. Kemungkinan besar itu adalah CP2102 atau CH340 (drivernya tersedia melalui tautan).

Setelah menginstal driver, kami menyambungkan kembali board kami ke komputer dan menjalankan program NodeMCU Flasher yang kami unduh sebelumnya. Di daftar drop-down, pilih port COM yang ditetapkan untuk perangkat kami. Kemungkinan besar akan ada satu, jika tidak, Anda dapat memeriksa nomornya di Windows Device Manager. Di tab Config, tunjukkan lokasi file kosong yang diunduh sebelumnya dengan ekstensi .bin.

Untuk NodeMCU, parameter pada tab Advanced harus diatur sesuai dengan screenshot di bawah ini, setelah itu kita kembali ke halaman awal dan klik tombol Flash. Program akan menunjukkan selesainya proses firmware dengan tanda centang hijau di pojok kiri bawah.

Setelah manipulasi ini, modul siap untuk mengunduh firmware, yang masih harus kita buat. Mari pergi ke konstruktor dan tandai poin yang kita butuhkan:

  • "DHT22" adalah sensor suhu dan kelembapan kami;
  • "Waktu dan NTP" - untuk menampilkan waktu di antarmuka web;
  • "Pengaturan bawaan". Klik roda gigi di sebelah item ini dan masukkan login dan kata sandi untuk titik akses yang akan dihubungkan dengan modul. Kami tidak menyentuh poin yang tersisa untuk saat ini.

Kami menekan tombol "Kompilasi" di bagian bawah halaman dan hasilnya adalah perangkat lunak siap untuk diinstal. Unduh dalam satu file.

Selanjutnya proses diulangi dengan firmware dari file kosong, hanya saja kita memilih firmware yang sudah diunduh ke komputer. Setelah proses selesai, kita reboot modul sepenuhnya (lepaskan dan sambungkan kembali kabel USB) dan buka panel admin router untuk mencari modul. Karena kami tidak menggunakan penetapan IP statis sebelumnya, router itu sendiri harus memberikan alamatnya. Izinkan saya mengingatkan Anda bahwa panel admin biasanya terletak di 192.168.0.1 atau 192.168.1.1. Router memberi modul saya alamat 192.168.1.142. Setelah mengklik IP ini, kita masuk ke antarmuka web stasiun cuaca kita. Pertama-tama Anda harus memasukkan login standar “esp8266” dan kata sandi “0000” di jendela pop-up.

Sekarang Anda perlu memberi tahu modul ke port mana sensor terhubung sehingga yang pertama dapat membaca bacaannya. Ini dilakukan di halaman “Perangkat Keras”. Kami mengaktifkan sensor pertama dengan tanda yang sesuai, dan di baris GPIO kami menunjukkan port ke-14. Inisialisasi akan terjadi dan tampilan suhu dan kelembaban akan muncul di halaman antarmuka utama. Hore!

Terakhir, jangan lupa untuk mengganti password login sistem dan zona waktu untuk menampilkan waktu di halaman “Utama”. Penting juga untuk mentransfer modul ke alamat IP statis (tombol di bagian bawah halaman) sehingga setelah me-reboot router stasiun cuaca Anda tidak “hilang”. Jika Anda memahami pengaturan router Anda, maka lebih baik menyewa alamat IP untuk modul tanpa batas waktu, daripada mengatur IP statis.

Prototipe sudah siap, sekarang dengan masuk ke alamat IP yang ditetapkan Anda dapat melihat suhu dan kelembaban di tempat Anda memasang sensor.

Menghubungkan stasiun cuaca ke layanan metrik Thingspeak.com

Tapi hanya melihat suhunya saja tidak menarik. Visualisasi data diperlukan agar setiap tren perubahan pembacaan dapat ditelusuri. Untuk melakukan ini, daftar di layanan metrik Thingspeak.com dan buat saluran baru di profil Anda.

Pada halaman yang terbuka, isikan nama saluran, tandai dua kolom pertama dan masukkan nilai “temp” (bidang pertama) dan “kelembaban/suhu” (bidang kedua) di sana.

Sekarang mari kita lihat modulnya lagi. Di perancang firmware, selain semua tanda sebelumnya, tambahkan "Thingspeak.com", kompilasi firmware dan flash dengan cara yang sama. Sayangnya, semua pengaturan pada modul harus dilakukan lagi, karena... Pembaruan OTA dengan pelestariannya hanya tersedia dalam versi perangkat lunak berbayar (harga penerbitannya hanya 100 rubel per modul).

Kami kembali ke halaman saluran yang kami buat di layanan Thingspeak.com dan membuka tab “Api Keys”. Kita memerlukan kode dari kolom “Write Api Key”. Itu perlu disalin dan ditempel ke bidang yang sesuai pada halaman "Server" di antarmuka web stasiun cuaca kami, pertama-tama ingat untuk mencentang kotak "Aktifkan pengiriman Thingspeak.com.".

Bacaan akan dikirim setiap 5 menit. Dan pada akhirnya akan terlihat seperti ini:

Tampilan grafiknya bisa diedit, jadi Anda bebas berkreasi! 🙂

Hasil

Mungkin ada yang bertanya: “Mengapa hasil akhirnya berbeda dengan gambar di atas dan judulnya?” Minimal, karena informasi dalam materi ini pasti akan cukup bagi pemula untuk satu atau dua malam, dan menghubungkan layar dan barometer akan memerlukan keterampilan dasar menyolder dan peralatan yang sesuai. Jika Anda tertarik untuk lebih meningkatkan stasiun cuaca dan catatan saya tentang topik ini, pastikan untuk menulisnya di komentar.

Dari bagian-bagian yang tergeletak di sekitar saya memutuskan untuk membuat stasiun cuaca kecil. Butuh dua hari akhir pekan untuk merakit dan menulis firmware untuk pengontrol. Beberapa hari berikutnya dihabiskan untuk menulis, menguji, dan men-debug perangkat lunak lainnya. Versi stasiun cuaca saat ini mengukur suhu, kelembaban, tekanan, ada koneksi dengan komputer melalui port USB dan ditenagai dari yang sama, daya cadangan berasal dari baterai 9 V. Data ditampilkan pada LCD. Masih ada jamnya. Karena saya tidak dapat menemukan kuarsa yang cocok (dan pada prinsipnya saya tidak ingin membelinya), saya menyinkronkan waktu dengan komputer.

Proyek ini sepenuhnya non-komersial, sehingga diagram stasiun cuaca, firmware pengontrol, dan semua perangkat lunak yang diperlukan dapat diunduh. Kode sumber firmware.

Stasiun ini dirakit di papan tempat memotong roti, jadi jangan meminta gambar papan sirkuit tercetak.

Komponen utama berikut digunakan:
ATMega8 - pengontrol
MPX4115A - sensor tekanan
HIH-4000 - sensor kelembaban
DS18B20 - sensor suhu
WH1602A - tampilan

Saya menggunakan LCD berteknologi PLED, mungkin yang biasa saja seperti WH1602A. Sensor suhu dan kelembaban ditempatkan di luar dalam kotak pelindung.

Hubungkan ke komputer

Menghubungkan ke port USB memerlukan deskripsi terpisah.

Prinsipnya bisa saja disambungkan ke port COM, pasti lebih mudah. Tapi dia sibuk untukku. Tidak ada pilihan - USB. Karena stasiun ini dirakit dari awal, potongan kabel CA-42 yang tergeletak di sekitar digunakan untuk menghubungkan telepon seluler ke komputer. Konektor ke ponsel sudah hilang, namun ujung yang menghubungkan ke komputer tetap ada. Konektor ini sendiri sudah memiliki sirkuit mikro untuk port USB, dan outputnya adalah UART standar, yang digunakan di ponsel dan pas untuk pengontrol, jadi kami menyolder kabel secara langsung, tanpa konverter sinyal apa pun. Setelah menginstal driver untuk kabel ini, port COM virtual muncul. Selanjutnya, kita dapat terhubung ke stasiun cuaca kita dengan program apa pun, misalnya HyperTerminal. Saya tidak memberikan secara khusus tata letak kabelnya, karena kabelnya berbeda-beda dan mungkin berbeda. Anda perlu menggunakan 3 kabel TX, RX, GND. Kemungkinan besar, perangkat tidak dapat diberi daya dari kabel. Saya mengambil konektor USB yang tidak perlu dan menyalakannya dari port USB lain.

Agar dapat mengirim perintah dari baris perintah dan menerima respons dari stasiun cuaca, program getfromcom.exe telah ditulis.

Stasiun cuaca hanya memahami dua perintah:

AGOV - Mengembalikan pembacaan sensor saat ini.

SETTIME [waktu dalam detik sejak awal hari] - perintah mengatur waktu di stasiun cuaca

Untuk mendapatkan data, jalankan getfromcom.exe COM6 AGOV

Untuk mengatur waktu, jalankan getfromcom.exe COM6 "SETTIME 72565"

COM6 - pelabuhan.
72565 - jumlah detik sejak awal hari.

Otomatisasi proses

Sekarang Anda dapat membaca, memproses data dengan program apa pun, mengirimkannya ke mana pun Anda membutuhkannya, dan menyinkronkan waktu stasiun cuaca. Saya melakukan ini menggunakan bahasa skrip PHP. Pertama, cepat dan Anda selalu dapat memperbaiki skrip dengan cepat dan tidak perlu mencari ke mana perginya kode sumber. Kedua, saya bekerja dengan PHP sepanjang waktu. Namun Anda dapat menulis program Anda dalam bahasa apa pun yang nyaman bagi Anda. Tentu saja, agar PHP dapat berfungsi, Anda harus mengunduhnya (http://www.php.net/downloads.php) dan menginstalnya di komputer Anda. Di Windows, hal ini dilakukan dengan mudah. Skrip getfromcom.php diluncurkan dari file get_data.bat, menanyakan stasiun cuaca, memproses data dan mengirimkannya ke skrip get_data.php ke server HTTP. Kita akan membicarakan skrip di server nanti.

Mode tidur komputer yang berfungsi

Komputer saya dalam mode tidur. Ia bangun setiap 3 jam, melakukan polling ke stasiun cuaca, mengirim data ke server dan tertidur lagi (Anda tidak perlu mematikannya - apa pun yang lebih nyaman bagi Anda). Ini dilakukan seperti ini: Dalam penjadwal tugas, file batch get_data.bat ditentukan untuk dieksekusi dan opsi "bangunkan komputer untuk menjalankan tugas ini" diatur.

Komputer masuk ke mode hibernasi dengan perintah fShutdown.exe /hibernate
Sekarang pada waktu yang ditentukan komputer akan bangun dan menjalankan get_data.bat

Fitur get_data.bat

Tim:

devcon.exe aktifkan PCIVEN_10EC
ping 127.0.0.1
RASPON -d Setilite

Mereka memulai koneksi jaringan dan menghubungkan VPN ke penyedia Internet saya.

ping 127.0.0.1 - jadi saya mengambil jeda yang diperlukan.

Oleh karena itu, kami menonaktifkannya dengan perintah:

RASPON -h Setilite
devcon.exe menonaktifkan PCIVEN_10EC

Semuanya akan berbeda untuk Anda, jadi baris-baris ini dikomentari di file.

Setelah bangun dari hibernasi, komputer mulai mengira bahwa port COM ditempati oleh program lain. Saya harus me-restart port COM virtual dengan perintah devcon.exe restart "USBVid_6547&PID_0232"
Anda akan memiliki ID perangkat yang berbeda.

Skrip server:

Sekarang tentang skrip di server. Script yang menerima data: get_data.php
Skrip menyimpan data ke file pogoda.log. Bahkan, datanya juga dikirim ke database MySQL. Namun untuk kesederhanaan, kami akan mempertimbangkan untuk bekerja hanya dengan sebuah file. Saat menerima data, skrip memeriksa apakah alamat IP pengirim cocok. Alamat yang diizinkan tercantum dalam file ip_allow.lst. Data dari pengirim “asing” tidak diterima.

- Kelembaban:

Rentang pengukuran 20 90%.

Akurasi ±5%.

Resolusi 1%.

- Suhu:

Rentang pengukuran 0 50 o C.

Akurasi ±2 o C.

Resolusi 1 o C.

4. Pengukuran tekanan dan suhu dengan sensor BMP-180.

- Tekanan:

Rentang pengukuran 225 825 mmHg. Seni.

Akurasi ±1 mmHg. Seni.

Resolusi 1 mm Hg. Seni.

- Suhu:

Rentang pengukuran -40,0 85,0 o C.

Akurasi ±1 o C.

Resolusi 0,1 o C.

5. Perubahan pembacaan animasi siklik.

6. Modus kukuk. Bunyi bip pendek setiap jam. Jika diaktifkan dan hanya pada siang hari.

7. Terdengar bunyi tombol ditekan. Bunyi bip singkat hanya pada siang hari.

8. Menyimpan pengaturan dalam memori non-volatile mikrokontroler.

Mempersiapkan.

1. Masuk ke pengaturan dan gulir menu menggunakan tombolMENU .

2. Mengganti parameter pengaturan dalam satu halaman menu dengan tombolMENGATUR .

3. Mengatur parameter menggunakan tombolPLUS / MINUS . Tombol-tombolnya berfungsi dengan menekan sekali, dan ketika ditahan, instalasi yang dipercepat dilakukan.

4. Parameter yang disetel berkedip.

5. Setelah 10 detik sejak tombol terakhir ditekan, perangkat akan beralih ke mode utama, pengaturan akan ditulis ke dalam memori.

6. Halaman menu.

JAM :

– setel ulang detik.

– pengaturan menit.

– mengatur jam.

– pemasangan koreksi harian akurasi gerakan. Di angka paling penting simbolnyaC . Rentang pengaturan±25 detik.

Alar :

– menit ketika alarm berbunyi.

– waktu jam alarm.

– aktivasi jam alarm. Di angka paling penting simbolnyaA. Di yang lebih muda Pada , jika jam alarm diaktifkan,DARI – jika dilarang.

– aktivasi mode “cuckoo”. Di digit tertinggi karakternyacu. Di yang lebih muda Pada , jika operasi "cuckoo" diperbolehkan,DARI – jika dilarang.

DiSP :

– durasi indikasi waktu. Pada indikatorD xx . Rentang pengaturan

– durasi indikasi kelembaban. Pada indikatorH xx . Rentang pengaturan 0 − 99 detik. Jika disetel ke 0, parameter tidak akan ditampilkan.

– durasi indikasi suhu yang diukur oleh sensor kelembaban. Pada indikatorTerima kasih . Rentang pengaturan 0 − 99 detik. Jika disetel ke 0, parameter tidak akan ditampilkan.

– durasi indikasi tekanan. Pada indikatorP xx . Rentang pengaturan 0 − 99 detik. Jika disetel ke 0, parameter tidak akan ditampilkan.

– durasi indikasi suhu yang diukur oleh sensor tekanan. Pada indikatortPxx . Rentang pengaturan 0 − 99 detik. Jika disetel ke 0, parameter tidak akan ditampilkan.

- kecepatan animasi. Di angka paling penting simbolnya S. Rentang pengaturan 0 − 99. Semakin kecil nilainya, semakin tinggi kecepatannya.

LiGH :

dekat- pengaturan mode malam.

– menit aktivasi mode malam.

– jam untuk mengaktifkan mode malam.

– kecerahan indikator dalam mode malam. Di angka paling penting simbolnya N. Rentang pengaturannya adalah 0 − 99. Kecerahan indikator sesuai dengan mode malam.

hari- pengaturan mode hari.

– menit aktivasi mode harian.

– jam untuk aktivasi mode siang hari.

– kecerahan indikator dalam mode siang hari. Di angka paling penting simbolnya D. Rentang pengaturannya adalah 0 99. Kecerahan indikator sesuai dengan mode siang hari.

Pengoperasian perangkat.

1. Dalam mode utama, informasi pada indikator berubah secara siklis. Urutan keluaran berikut diatur: waktu - kelembaban (dalam digit paling signifikan simbolnya H) – suhu diukur dengan sensor kelembaban – tekanan (dalam angka paling signifikan simbolnya P) – suhu diukur dengan sensor tekanan. Jika durasi tampilan suatu parameter diatur ke 0, maka parameter tersebut tidak akan ditampilkan pada indikator.

2. Dari mode utama, Anda dapat mengganti tampilan menggunakan tombol PLUS/MINUS.

3. Jika terjadi kesalahan pembacaan data dari sensor DHT11 saat menunjukkan suhu dan kelembaban, maka akan muncul tanda hubung pada indikator.

4. Jika alarm diaktifkan (lihat pengaturan), saat waktu ditampilkan, sebuah titik akan disertakan dalam digit terkecil. Pada waktu yang ditentukan, sinyal suara diaktifkan - sinyal ganda setiap detik selama satu menit. Sinyal suara dapat dimatikan lebih awal dengan menekan tombol apa saja. Saat alarm berbunyi, waktu ditampilkan pada indikator selama 30 detik.

5. Koreksi waktu digital dilakukan setiap hari (pada 0 jam 0 menit 30 detik).,DS1307.

4. Jenis indikator (common anoda atau katoda) dipilih menggunakan jumper. Jika jumper dipasang, maka indikator dengan anoda umum dipilih.

5. Diagram menunjukkan dua indikator, hanya satu yang dipasang.

6. Tweeter harus memiliki generator bawaan. Tergantung pada konsumsi arusnya, Anda mungkin perlu memasang amplifier (saklar transistor).

Selama diskusi dan perbaikan topik forum, beberapa versi berbeda dari proyek ini muncul.

Jika memungkinkan, materi terbaru akan diposting di sini. Deskripsi singkat di arsip

Rasa syukur studiotandem untuk menyiapkan bahan dan menguji firmware.

Tampilan