Stesen cuaca Arduino dengan graf tekanan. Stesen cuaca rumah pada Arduino dan menghantar data ke "Pemantauan Rakyat"

stesen cuaca DIY.

Sudah petang, tiada apa yang boleh dilakukan selepas Tahun Baru. Seperti biasa, semasa cuti Tahun Baru musim sejuk saya ingin mengisi kepala dan tangan saya dengan sesuatu yang berguna dan kreatif. Semasa cuti Tahun Baru ini saya memutuskan untuk membuat stesen cuaca dengan tangan saya sendiri. Saya mula membuat persediaan awal, membeli dan memasang semua komponen sebelum Tahun Baru, dan melakukan pengaturcaraan utama semasa cuti.

(terdapat banyak gambar di bawah potongan!)

Pertama, saya akan meneliti komponen; saya tidak akan memberikan pautan, kerana di eBay (dalam akaun peribadi) barang masuk ke dalam arkib. Saya membeli banyak komponen secara santai di eBay. Saya mencuba lelongan untuk kali pertama; sebelum saya selalu membeli "beli sekarang". Apa yang boleh saya katakan, jika anda tidak tergesa-gesa membeli-belah, anda boleh membeli beberapa komponen dengan lebih murah (perbezaannya kadang-kadang dua kali ganda).

Sensor tekanan VMR085
Ini adalah sensor utama. Apabila saya melihatnya di eBay, saya tahu saya mahu membina stesen cuaca rumah.
Sensor tiba dalam sampul surat biasa, ditutup dengan bungkus gelembung di dalamnya.

Di dalam sampul surat itu terdapat kad perniagaan penjual dan penderia, dibungkus dalam beg antistatik dan dibalut dengan lapisan lain bungkus gelembung.

Beg antistatik telah dimeterai supaya kelembapan semasa penerbangan tidak mengancam sensor

Kami mengeluarkan sensor. Di satu sisi terdapat garisan kenalan yang dipateri, yang dimasukkan ke dalam buih untuk mengelakkannya daripada lentur. Di sisi lain terdapat sensor itu sendiri dan tanda kenalan.




Semuanya akan baik-baik saja, tetapi tanda kenalan digunakan dalam imej cermin.
Sensor disambungkan melalui bas I2C dan dikuasakan oleh 3.3 V. Iaitu, untuk operasi biasa anda memerlukan 4 wayar (+, -, SDA, SCL)
Anda boleh menyoal penderia dalam 2 cara: sama ada melalui perpustakaan atau menggunakan fungsi secara langsung dalam lakaran.
Contoh program:

#termasuk

#define BMP085_ADDRESS 0x77 // alamat I2C BMP085

Const unsigned char OSS = 0; // Tetapan Terlebih Sampel

// Nilai penentukuran
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

Suhu pendek;
tekanan panjang;

Persediaan tidak sah()
{
Serial.begin(9600);
Wire.begin();
bmp085Penentukuran();
}

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

Void bmp085Calibration()
{
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 lama)
{
panjang x1, x2, x3, b3, b6, p;
b4, b7 panjang tidak ditandatangani;
b6 = b5 - 4000;
// Kira B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = ((((((panjang)ac1)*4 + x3)<>2;
// Kira B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (panjang tidak ditandatangani)(x3 + 32768))>>15;
b7 = ((panjang tidak ditandatangani)(naik - b3) * (50000>>OSS));
jika (b7< 0x80000000)
p = (b7<<1)/b4;
lain
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 bait daripada BMP085 di "alamat"
char bmp085Read(alamat char tidak ditandatangani)
{
data aksara yang tidak ditandatangani;

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

Int bmp085ReadInt(alamat aksara tidak ditandatangani)
{
unsigned char msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(alamat);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
pulangkan (int) msb<<8 | lsb;
}

// Baca nilai suhu yang tidak diberi pampasan
unsigned int bmp085ReadUT()
{
unsigned int ut;
// Tulis 0x2E ke dalam Daftar 0xF4
// Ini meminta bacaan suhu
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
// Tunggu sekurang-kurangnya 4.5ms
kelewatan(5);
// Baca dua bait daripada daftar 0xF6 dan 0xF7
ut = bmp085ReadInt(0xF6);
pulangkan ut;
}

// Baca nilai tekanan tidak berkompensasi
bmp085ReadUP() panjang tidak ditandatangani
{
char msb, lsb, xlsb yang tidak ditandatangani;
panjang tidak ditandatangani = 0;
// Tulis 0x34+(OSS<<6) into register 0xF4
// Minta bacaan tekanan dengan tetapan pensampelan berlebihan
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// Tunggu penukaran, masa tunda bergantung pada OSS
kelewatan(2 + (3<// Baca daftar 0xF6 (MSB), 0xF7 (LSB) dan 0xF8 (XLSB)
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Tunggu sehingga data tersedia
while(Wire.available()< 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
up = (((panjang tidak ditandatangani) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
kembali;
}


Di samping itu, sensor mempunyai sensor haba sendiri untuk pampasan tekanan dan altimeter

Arduino Nano v3.0
Ini adalah nadi seluruh stesen cuaca. Ringkasnya, pengawal bersaiz kecil.
saya beli
Saya tidak akan bercakap secara terperinci tentang pengawal, kerana ini telah dilakukan sebelum saya:


Pakej lightake adalah pasang siap, pengawal datang dalam pakej yang mengandungi kabel USB dan Arduino dalam beg antistatik yang tertutup.

Untuk menganggarkan saiz, saya meletakkan syiling 1 ruble di sebelah Arduino.

Papan pengawal dekat



Kabel USB adalah baik, dengan cincin ferit. Arduino dikuasakan melalui kabel USB. Persekitaran pembangunan boleh dimuat turun (halaman muat turun). Bahasa ini seperti "C", tidak ada masalah untuk menguasainya, kerana saya melakukan banyak pengaturcaraan di dalamnya di tempat kerja.

Skrin LCD
Di tempat kerja saya menemui skrin LCD 1602 yang serasi di dalam tong sampah. Saya terpaksa bermain-main dengan sambungan, kerana saya tidak dapat mencari lembaran data untuknya. Akibatnya, LCD mula berfungsi.

Tetapi selepas tempoh penggunaan yang singkat, saya mendapati bahawa skrin ini tidak mencukupi untuk saya dan ia tidak mungkin untuk memaparkan lebih banyak data, kerana ia hanya mempunyai 2 baris dengan 16 aksara setiap satu. Pada mulanya nampaknya parameter ini cukup, tetapi apabila anda memulakan pengaturcaraan, anda menyedari bahawa maksimum yang anda boleh masukkan ialah 3-4 parameter. Dan jika anda membuat menu (saya sedang berfikir tentang membuat menu pada skrin ini), maka hanya ada 1-2 parameter yang tinggal di ruang kosong.
Akibatnya, saya mula mencari skrin lain. Pada mulanya saya melihat dengan teliti pada skrin grafik dari Nokia 3310 dan juga mengambil bahagian dalam lelongan eBay untuk membelinya, tetapi ia tidak berjaya (yang saya sangat gembira), jadi saya terpaksa melepaskan skrin ini. Sekarang saya faham bahawa ia akan menjadi terlalu kecil untuk tujuan saya, kerana ada sesuatu untuk dibandingkan.
Semasa melihat secara rawak melalui perisai pada Arduino, saya menjumpai skrin grafik 12864 pada pengawal ST7920. Skrin ini mempunyai saiz yang betul dan resolusi yang baik untuk keperluan saya (128x64). Iaitu, anda boleh dengan mudah meletakkan 6-7 baris 20 aksara dalam fon yang biasa dibaca. Oleh kerana skrin adalah grafik, sebagai tambahan kepada teks, grafik boleh diletakkan dalam fon yang berbeza. Pendek kata, inilah yang saya perlukan, semuanya hadir pada skrin ini, jadi saya tidak dapat menahan dan memesannya.
Bungkusan tiba dengan cepat dan dibungkus sebagai standard: sampul bungkus gelembung, di dalamnya terdapat satu lagi lapisan bungkus gelembung dan skrin dalam beg antistatik:






Untuk menganggarkan saiz, saya meletakkan syiling 1 ruble di sebelah LCD.




Untuk menyambungkan skrin dengan pantas ke Arduino, saya menyolder barisan kenalan ke pin LCD. LCD boleh disambungkan melalui bas bersiri atau bas selari. Saya memilih pilihan pertama, kerana sudah ada beberapa kenalan Arduino percuma.
Sambungan (diambil dari web):

- Pin 1 (GND) disambungkan ke bas biasa
- Pin 2 (VCC) disambungkan ke bas kuasa +5V, dan penggunaan semasa adalah agak kecil dan paparan boleh dikuasakan daripada penstabil Arduino terbina dalam.
- Pin 4, 5 dan 6 bersambung ke output digital Arduino, membentuk antara muka bersiri SPI:
pin 4 – (RS) – sepadan dengan garisan CS (contohnya 7)
pin 5 – (RW) – sepadan dengan garis MOSI (contohnya 8)
pin 6 – (E) – sepadan dengan garisan SCK (contohnya 3)
Nombor hubungan Arduino boleh menjadi apa sahaja, perkara utama adalah jangan lupa untuk menunjukkannya dengan betul dalam teks program semasa memulakan paparan.
- Pin 15 (PSB) disambungkan ke bas biasa.
- Kenalan 19 (A) dan 20 (K) ialah bekalan kuasa lampu latar (masing-masing +5V dan GND). Untuk melaraskan kecerahan lampu latar, anda boleh menggunakan perintang pembolehubah 10 kOhm yang disambungkan antara bas kuasa dan GND. Voltan daripada enjinnya dibekalkan ke pin 19 paparan.
Mengikut arahan ini, saya menyambungkan segala-galanya kecuali lampu latar. Saya menggunakan Arduino PWM untuk menghidupkan lampu latar.
Untuk menyambungkan LCD ke Arduino secara pemrograman, perpustakaan u8glib digunakan. Anda boleh memuat turunnya. Jika terdapat masalah memuat turun, saya boleh memuat naik perpustakaan ke narod.ru.
Perpustakaan itu sendiri tidak rumit dan membolehkan anda memaparkan teks dalam fon yang berbeza, melukis garisan, melukis bentuk geometri mudah (segi empat tepat, bulatan) dan memaparkan imej anda sendiri yang disediakan dengan cara yang istimewa. Pada dasarnya, alat ini mencukupi untuk kebanyakan tugas.
Berikut adalah hasil daripada program mudah:

Program itu sendiri:

#include "U8glib.h"

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

// Subrutin untuk menentukan memori bebas
int freeRam() (
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

Persediaan batal(kosong) (
u8g.setFont(u8g_font_6x10); // fon
u8g.setRot180(); //Terbalikkan skrin
analogWrite(6, 115); // Tetapkan kecerahan skrin (anod lampu latar pada 6 pin)
}

Gelung lompang(kosong) (
u8g.firstPage();
buat (

u8g.setPrintPos(1, 12); // kedudukan
u8g.print("Hello!!!"); // teks keluaran
u8g.drawBox(0,22,128,9); // Cat segi empat tepat itu putih
u8g.setColorIndex(0); // dakwat putih, latar belakang hitam
u8g.setPrintPos(1, 30); // kedudukan
u8g.print("Perkataan..."); // teks keluaran

U8g.setColorIndex(1); // dakwat putih, latar belakang hitam
u8g.setPrintPos(1, 50); // kedudukan
u8g.print("Selepas mula ="); // teks keluaran
u8g.setPrintPos(85, 50); // kedudukan
u8g.print(millis() / 1000); // output bilangan saat selepas mula
u8g.setPrintPos(1, 64); // kedudukan
u8g.print(freeRam()); // output berapa banyak memori yang diduduki
) while(u8g.nextPage());

Kelewatan(200);
}

Jam masa nyata DS1307
Komponen lain untuk stesen cuaca saya. Perisai ini melaksanakan jam masa nyata. Saya memesannya di eBay. Penjual menghantar selendang jam tangan dalam kotak besar yang tidak realistik


Di dalam kotak itu terdapat dua helaian iklan A4 dan sapu tangan jam tangan yang dibalut dengan selofan


Saya ingin ambil perhatian bahawa bayaran tidak melebihi 2 rubel. syiling, dan kotak berukuran 13x15x5 cm.
Papan itu dibungkus dalam beg antistatik

Selendang dekat



Saya terpaksa bermain-main dengan modul ini. Pertama, terdapat kesukaran sambungan. Dan kedua, tiada kuarza di papan ini. Jika saya tahu bahawa saya akan menghabiskan begitu banyak masa pada modul, kemungkinan besar saya akan memasangnya sendiri, kerana Internet penuh dengan gambar rajah. Litar termudah mengandungi 4-5 komponen.
Mengenai sambungan. Saya mendapati perpustakaan yang mengatakan bahawa antara muka I2C boleh disambungkan bukan kepada input analog Arduino biasa (A4 dan A5), tetapi kepada mana-mana yang diskret. Saya melakukannya seperti yang tertulis. Pada mulanya tiada apa yang berhasil, tetapi selepas menari lama dengan rebana, jam bermula. Nah, saya fikir, itu sahaja, masalah telah selesai, tetapi selepas saya cuba menyambungkan modul yang sama ke Arduino yang lain, tarian dengan tamborin diteruskan. Saya menghabiskan banyak masa mencari penyelesaian untuk masalah ini dan hampir di mana-mana ia ditunjukkan sama ada sambungan yang salah atau ketiadaan perintang tarik-up pada kenalan SCL dan SDA. Saya sudah mahu masuk ke papan dengan besi pematerian, tetapi pada satu forum saya secara tidak sengaja menjumpai kod di mana ia dikatakan menyambungkan SCL dan SDA ke port I2C standard pada Arduino. Selepas sambungan standard, semuanya berfungsi serta-merta.
Sekarang tentang kuarza. Saya tidak tahu jenis kuarza yang diletakkan oleh orang Cina di sana, tetapi jam tangan dengan kuarza seperti itu lari 10-11 saat setiap hari. Ralat ini adalah 5 minit sebulan, dan 1 jam setahun. Tidak perlu jam tangan seperti ini. Saya terpaksa pergi dalam talian semula dan mencari cara untuk membetulkan pepijat ini. Penyelesaian pertama yang muncul mengatakan bahawa anda perlu mengisar kuarza. Saya melakukannya - hasilnya adalah sifar. Saya juga mendapati di suatu tempat bahawa saya perlu mencari papan induk lama dan mengeluarkan kuarza jam dari sana. Saya melakukannya - ada hasilnya. Sekarang jam lari bukan 10-11 saat, tetapi 1.5 saat setiap hari. Katakan sahaja ia menjadi lebih baik, tetapi ia jauh daripada ideal. Memandangkan saya tidak mahu bermain-main dengan besi pematerian lagi, maka diputuskan untuk melaraskan jam secara pemrograman, iaitu, melaraskan jam kepada nilai yang diperlukan sekali sehari. Selepas 10 hari, jam berbunyi tidak lebih dari satu saat. Kaedahnya bagus, tetapi hanya apabila peranti penyegerakan Arduino disambungkan kepada kuasa, jika tidak, jam berjalan pada kuasa bateri dan masih lari.
Program ujian kecil:

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

Bait decToBcd(bait val)
{
pulangan ((val/10*16) + (val%10));
}

Byte bcdToDec(bait val)
{
pulangan ((val/16*10) + (val%16));
}

Void setDateDs1307(bait saat, // 0-59
minit bait, // 0-59
jam bait) // 0-99
{

Wire.write(0);
Wire.write(decToBcd(second));
Wire.write(decToBcd(minit));
Wire.write(decToBcd(hour));
Wire.endTransmission();
}

Void getDateDs1307(bait *saat,
bait *minit,
bait *jam)
{

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

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

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

Persediaan tidak sah()
{
bait saat, minit, jam;
Wire.begin();
Serial.begin(9600);

Kedua = 45;
minit = 5;
jam = 16;

SetDateDs1307(saat, minit, jam);
}

gelung kosong()
{
bait saat, minit, jam;

GetDateDs1307(&saat, &minit, &jam);
Serial.print(jam, DEC);
Serial.print(":");
Serial.print(minit, DEC);
Serial.print(":");
Serial.println(kedua, DIS);

Kelewatan(1000);
}


Perpustakaan tidak digunakan di sini, dan fungsi untuk masa membaca dan menulis dipotong.

Sensor suhu dan kelembapan DHT11
Tiada apa yang perlu diceritakan tentang sensor ini. Saya tidak akan menggunakannya jika kelembapan tidak diperlukan. Malangnya, saya tidak mengambil gambarnya semasa saya menerimanya, jadi tidak akan ada sebarang gambar. Foto sensor boleh dilihat di bawah, di mana saya menyambungkannya ke Arduino. Sambungan sensor adalah mudah (+, output digital, -). Biasanya sensor dibuat dengan empat pin. Dengan faktor bentuk ini, pin ketiga tidak disambungkan kepada apa-apa.
Anda boleh menggunakan perpustakaan untuk menyambung ke Arduino. Anda boleh memuat turunnya.
Program ujian kecil dengan output maklumat pada paparan LCD 1602:

// sertakan kod perpustakaan:
#termasuk
#termasuk

// Istiharkan objek
dht11 DHT11;
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

#define DHT11PIN 7
int i;

Persediaan tidak sah()
{
lcd.begin(16, 2);
lcd.print("Status: „);
i=0;
}

gelung kosong()
{
int chk = DHT11.read(DHT11PIN);
lcd.setCursor(8, 0);
suis (chk)
{
kes 0: lcd.print(“OK „); break;// lcd.setCursor(11, 0); lcd.print(millis()/2000); pecah;
kes -1: lcd.print(“Ralat Checksum”); mErr(); pecah;
kes -2: lcd.print("Ralat tamat masa"); mErr(); pecah;
lalai: lcd.print("Ralat tidak diketahui"); mErr(); pecah;
}
kelewatan(500);
lcd.setCursor(15, 0);
suis(i)
{
kes 0: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" ");break;
kes 1: lcd.print("v"); lcd.setCursor(15, 1); lcd.print(" ");break;
lalai: lcd.setCursor(15, 1); lcd.print("E"); pecah;
}
i=i+1;
jika (i>1) i=0;
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd.print((float)DHT11.kelembapan, 0);
lcd.setCursor(4, 1);
lcd.print("%");
lcd.setCursor(8, 1);
lcd.print("T=");
lcd.setCursor(10, 1);
lcd.print((float)DHT11.temperature, 0);
lcd.setCursor(12, 1);
lcd.print("C");

Tidak sah mErr()
{
lcd.setCursor(2, 1);
lcd.print("**");
lcd.setCursor(10, 1);
lcd.print("**");
i=5;
}


Penderia mempunyai beberapa kelemahan - data daripada penderia hanya dalam nombor bulat, dan julatnya lemah.

Nampaknya saya menulis tentang semua komponen. Yang tinggal hanyalah mengumpulkan segala-galanya menjadi satu keseluruhan.
Oops, saya hampir terlupa! Untuk memasang peranti, anda memerlukan sarung. Saya juga memesan kes itu di Ebay. Penjual itu ternyata dari England. Bungkusan itu sampai dengan cepat, tetapi saya tidak mengambil gambarnya. Semua gambar kes ada di bawah.

Pertama, saya memasang segala-galanya di atas meja menggunakan pendawaian khas. Saya menulis program ujian dan memuat naiknya ke pengawal.



Malah, warna biru lampu latar adalah lebih terang. Walaupun pada kecerahan minimum (Terang=5), bingkai diterangi.

Untuk memasang semuanya secara wayarles, ia telah memutuskan untuk membuat papan induk mini, dan papan dan perisai Arduino diletakkan pada penyambung. Jika sesuatu berlaku, ia boleh dikeluarkan dengan cepat dan mudah. Saya juga memutuskan untuk melampirkan skrin LCD dan butang kawalan pada penyambung, hanya untuk memateri penderia suhu pada wayar.
Ini adalah bagaimana selendang itu keluar



Dalam foto terakhir saya belum membersihkan sepenuhnya fluks. Saya melekatkan getah berliang di bawah perisai di sebelah penyambung supaya terdapat sekurang-kurangnya beberapa sokongan. Walaupun sebenarnya perisai dalam penyambung pada kenalan tahan dengan baik.

Papan induk dengan perisai yang dipasang dan papan Arduino.

Inilah rupa sambungan lengkap ke papan induk


Daripada butang, saya menggunakan perisai buatan sendiri yang dipateri pada papan roti. Saya menggunakan butang daripada tikus lama sebagai butang.
Seperti yang anda lihat, bilangan wayar telah berkurangan.

Masalah utama penempatan dalam kes adalah untuk memotong alur licin untuk skrin LCD. Tidak kira betapa keras saya mencuba, ia masih tidak berjaya dengan sempurna. Jurang di beberapa tempat lebih sedikit daripada 1 mm. Untuk membuat semuanya kelihatan kemas, saya mengambil pengedap akuarium hitam dan mengisi semua retakan, pada masa yang sama saya memasang skrin pada pengedap ini. Selepas sealant telah kering, saya memotong lebihan dari luar. Dalam cahaya terang, sealant kelihatan, tetapi dalam cahaya biasa, semuanya bergabung dengan badan.
Beginilah rupa kes itu dari dalam dengan skrin LCD dan papan induk dipasang.

Beginilah rupa dari luar dalam cahaya terang (maaf tentang cap jari, saya melihatnya semasa saya menyusun gambar).

Saya berfikir untuk masa yang lama tentang cara memasukkan butang ke dalam sarung dan, yang paling penting, butang apa yang hendak digunakan...
Di kedai radio-elektronik, mereka menyukai butang dengan pin panjang dan petua yang sesuai pada pin ini. Butang ini digunakan untuk pematerian ke papan. Segala-galanya akan baik-baik saja, tetapi mereka mempunyai tolak - pukulan menekan sangat kecil dan kuat.
Kami terpaksa meletakkan butang dalam dua peringkat: yang pertama ialah meletakkan butang pada papan, yang kedua ialah memasang papan ini pada papan lain. Dan kemudian letakkan semua ini ke dalam badan pada panduan.

Beginilah rupa selendang dengan butang:



Inilah rupa papan pemegang:


Di sini anda boleh melihat panduan di mana papan dengan butang dimasukkan. Beberapa elemen telah dipateri untuk memberikan ketegaran pada papan.

Sekarang kita masukkan semuanya ke dalam badan
Tanpa butang penyambung:


Dengan sambungan butang:

Tutup bekas dan hidupkannya. Semuanya berfungsi dengan baik, butang berfungsi sebagaimana mestinya.

Pada akhirnya saya menyiarkan video pendek peranti yang berfungsi dalam mod yang berbeza:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
Bagi mereka yang tidak melihat video di sini, berikut adalah pautan ke

Sudah tiba masanya untuk menamatkan semakan.
Saya akan menulis sedikit tentang program itu, dan kemudian beberapa kesimpulan ringkas. Apabila saya menulis program ini, saya tidak menyangka bahawa saya akan mencapai had 30,720 bait dengan cepat.


Saya terpaksa mengoptimumkan kod. Saya mengalihkan banyak keping kod ke dalam subrutin. Saya tidak akan pernah terfikir bahawa suis...kenyataan kes dalam bentuk tersusun mengambil lebih banyak ruang daripada beberapa jika...penyataan lain. Pengisytiharan pembolehubah yang betul juga menjimatkan ruang. Jika anda mengisytiharkan tatasusunan panjang, walaupun agak mungkin untuk mendapatkan dengan bait, maka memori yang dilampaui mencapai 500 bait, bergantung pada saiz tatasusunan. Apabila anda menulis program, anda tidak memikirkannya, dan hanya kemudian, apabila anda menganalisis program, anda menyedari bahawa anda melakukan beberapa perkara yang salah, dan anda mula mengoptimumkan kod tersebut. Selepas masalah dengan saiz program diselesaikan, saya menghadapi had RAM. Ini dinyatakan dalam fakta bahawa program itu mula membeku selepas dimuatkan. Saya terpaksa memperkenalkan subrutin untuk mengira RAM percuma. Akibatnya, saya terpaksa meninggalkan satu algoritma ramalan cuaca, kerana ia mesti memaparkan ikon pada skrin. Algoritma itu sendiri berfungsi, tetapi output ikon perlu direkodkan. Saya masih mempunyai idea tentang cara mengoptimumkan kod itu, tetapi dalam masa terdekat saya akan membiarkan peranti berjalan sebagaimana mestinya untuk menilai prestasinya dan mengenal pasti semua pepijat.

Sekarang beberapa kesimpulan
Minus
1) Harga. Justifikasi untuk kelemahan ini adalah bahawa hobi tidak pernah murah.

kebaikan
1) Fungsi hebat peranti
2) Peningkatan fungsi dihadkan hanya oleh pengawal yang digunakan dan keinginan anda sendiri
3) Keseronokan estetik daripada renungan dan kepuasan moral kerana saya akhirnya memasang dan menyiapkan peranti ini

Saya bercadang untuk membeli +85 Tambahkan pada kegemaran Saya suka ulasan itu +137 +304

Saya menguji bahagian individu sistem pada Arduino UNO. Itu. Saya menyambungkan modul ESP ke uno dan mengkajinya, memutuskannya, kemudian menyambungkan nRF24, dsb. Untuk pelaksanaan akhir penderia tetingkap, saya memilih Arduino Pro Mini sebagai miniatur paling hampir dengan Uno.



Dari segi penggunaan kuasa, Arduino Pro Mini juga kelihatan baik:

  • tiada penukar USB-TTL, yang dengan sendirinya "makan" banyak,
  • LED disambungkan melalui perintang 10k.

Untuk penjimatan tenaga lanjutan ia telah dirancang:

  • keluarkan penunjuk kuasa LED pada Arduino Pro Mini (saya menyesal, saya tidak merosakkan papan)
  • atau gunakan pemasangan "telanjang" pada mikropemproses Atmel ATmega328 (tidak digunakan)
  • gunakan Pustaka Kuasa Rendah atau JeeLib.

Daripada perpustakaan yang saya pilih Perpustakaan Kuasa Rendah, ia mudah dan mengandungi hanya apa yang diperlukan.


Untuk unit pusat, kerana ia dirancang untuk menyambungkan banyak peranti kepadanya, papan Arduino Mega telah dipilih. Selain itu, ia serasi sepenuhnya dengan UNO dan mempunyai lebih banyak ingatan. Memandang ke hadapan, saya akan mengatakan bahawa pilihan ini benar-benar wajar.


Anda boleh membeli Arduino Mega dengan harga kira-kira $8.

Kuasa dan Penggunaan Tenaga

Sekarang mengenai kuasa dan penggunaan tenaga.


Arduino Pro Mini datang dalam dua jenis:

  • untuk bekalan voltan 5V dan frekuensi 16MHz
  • untuk voltan bekalan 3.3V dan frekuensi 8MHz.

Memandangkan modul radio nRF24L01+ memerlukan 3.3 V untuk bekalan kuasa, dan kelajuan tidak penting di sini, maka beli Arduino Pro Mini dengan 8 MHz dan 3.3 V.


Dalam kes ini, julat voltan bekalan Arduino Pro Mini ialah:

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

Saya sudah mempunyai Arduino Pro Mini pada 5V, itulah sebabnya saya menggunakannya. Anda boleh membeli Arduino Pro Mini dengan harga kira-kira $4.


Unit pusat akan dikuasakan daripada rangkaian 220 V melalui bekalan kuasa kecil yang memberikan output 12 V, 450 mA, 5 W. Seperti ini untuk $5. Terdapat juga pin 5V yang berasingan.



Dan jika ini tidak mencukupi, maka anda boleh memasang sesuatu yang lebih berkuasa. Dengan kata lain, penjimatan kuasa untuk unit pusat tidak masuk akal. Tetapi untuk penderia wayarles jauh, penjimatan tenaga adalah bahagian yang paling penting. Tetapi saya juga tidak mahu kehilangan fungsi.


Oleh itu, Arduino Pro Mini dan modul radio nRF24 akan dikuasakan oleh sekumpulan 4 bateri Ni-Mh.


Dan ingat kapasiti maksimum bateri moden kira-kira 2500-2700mAh, apa-apa lagi sama ada gimik pemasaran (Ansmann 2850) atau penipuan (UltraFire 3500).


Saya tidak menggunakan bateri Li-Ion atas beberapa sebab:

  • sangat mahal
  • apabila suhu ambien turun di bawah 0°C, kuasa bateri litium-ion berkurangan kepada 40-50%
  • yang murah dihasilkan tanpa perlindungan dan tidak selamat (semasa litar pintas atau pelepasan ia boleh meletup dan terbakar, lihat sekumpulan video di YouTube)
  • mereka berumur, walaupun mereka tidak digunakan (namun, ini boleh dikatakan tentang semua unsur kimia), selepas 2 tahun bateri Li-Ion kehilangan kira-kira 20% daripada kapasitinya.

Untuk prototaip, agak mungkin untuk bertahan dengan bateri Ni-MH AA atau AAA berkualiti tinggi. Selain itu, kita tidak memerlukan arus yang besar. Satu-satunya kelemahan bateri Ni-MH ialah masa pengecasannya yang lama.

Gambar rajah am stesen cuaca

Mari kita ringkaskan. Berikut ialah rajah umum tentang cara semuanya berfungsi.



Akan bersambung.

Tag: Tambah tag

Seperti kebanyakan orang yang bekerja, meneruskan projek anda sendiri mengambil satu-satunya masa lapang yang anda tinggalkan. Itulah sebabnya saya sudah lama tidak mencipta apa-apa dan saya gatal untuk melakukan sesuatu. Anehnya, peluang ini muncul di universiti. Ia adalah bulan September di luar tingkap, tahun ke-4 dan kerja kursus akan datang mengenai reka bentuk litar. Kami diberitahu bahawa kerja kursus boleh dilakukan dalam dua variasi: kertas dan perkakasan.

Selama 5 tahun, kerja kursus kertas di universiti kami telah dilakukan mengikut prinsip "ambil yang lama dan satukan." Pendekatan ini tidak sesuai dengan saya kerana rutinnya, jadi saya segera memilih kerja kursus dalam perkakasan. Pengawal mikro Arduino telah dicadangkan sebagai nadi kerja kursus kerana kemudahan pembelajarannya. Selepas menentukan jenis kerja kursus, satu lagi soalan kekal: apakah sebenarnya yang perlu dilakukan. Memandangkan saya tidak mempunyai pengalaman dalam pengaturcaraan mikropengawal, saya segera membuka Google dan mula mengkaji projek sedia ada. Terdapat banyak projek, sebahagian daripadanya agak mudah, ada yang bijak (contohnya pengimbas 3D), tetapi sebahagian besarnya tidak mempunyai aplikasi praktikal. Dan saya hanya mahukan sesuatu yang tidak akan terletak di atas rak dan mengumpul habuk. Selepas setengah jam mengembara ke dunia Arduino, saya mula berminat dengan topik stesen cuaca rumah, dan projek itu nampaknya tidak begitu sukar untuk dilaksanakan (iaitu yang paling menarik minat pendatang baru).

Beginilah topik untuk kerja kursus dipilih dan lama-kelamaan nampaknya tiada masalah.

Pemilihan Komponen

Melihat melalui projek yang berbeza, saya menyedari bahawa Nano atau Pro Mini akan mencukupi untuk saya, tetapi saya masih memilih Arduino Uno dengan harapan saya ingin pengaturcaraan untuk Arduino dan akan melaksanakan beberapa lagi projek pada masa hadapan. Saya tidak pernah memegang besi pematerian di tangan saya sebelum ini, jadi untuk pembangunan yang lebih mudah saya memutuskan untuk turut membeli Sensor Shield v4.

Maklumat lanjut

Papan memudahkan sambungan pantas penderia, modul, motor servo, antara muka Serial dan I2C, dan juga memaparkan semua port pengawal faktor bentuk Duemilanova/Uno (juga boleh disambungkan kepada siri mega, tetapi dengan had dan akibat yang seterusnya) . Menyokong perisai lain di atas dirinya sendiri.


Saya memilih penderia berikut sebagai sumber untuk data meteorologi:


Saya telah membuat keputusan mengenai sensor. Tetapi apa yang perlu dilakukan dengan data yang datang daripada penderia? Saya memutuskan untuk memaparkannya. Saya mahukan gambar berwarna, jadi saya segera membuang penyelesaian monokrom. Selepas beberapa minit mencari, paparan TFT 1.8 inci ST7735 telah dipilih.

Maklumat lanjut

Memandangkan paparan menggunakan protokol SPI 4 wayar untuk komunikasi dan mempunyai penimbal bingkai boleh alamat pikselnya sendiri, ia boleh digunakan dengan sebarang jenis pengawal mikro. Paparan 1.8 inci mempunyai piksel warna 128x160. Terdapat juga slot kad microSD, oleh itu, anda boleh memuatkan imej bitmap warna penuh dengan mudah daripada sistem fail kad microSD FAT16/FAT32.

Ciri-ciri:

  • Paparan pepenjuru - 1.8 inci, resolusi 128x160 piksel, warna 18-bit (262,144 warna)
  • Pengawal dengan pengalamatan piksel terbina dalam penimbal memori video
  • Slot microSD terbina dalam - menggunakan lebih daripada 2 talian digital
  • Serasi dengan 3.3 dan 5V
  • Dimensi: 34 mm x 56 mm x 6.5 m


Pengaturcaraan Pengatur Arduino

Selepas kami memutuskan komponen untuk stesen cuaca, kami akan memulakan pengaturcaraan pengawal. IDE Arduino digunakan untuk memancarkan perisian tegar Arduino. Juga menggunakan perpustakaan dari Adafruit.

Sebelum beralih kepada lakaran, mari kita lihat fungsinya:

  • Bacaan diambil dari penderia setiap 10 saat dan hanya penunjuk yang telah berubah berbanding dengan ukuran sebelumnya dikemas kini pada skrin
  • Melaksanakan pemindahan data melalui port COM

Lakaran

#termasuk // perpustakaan untuk komunikasi dengan peranti I2C #include // Pustaka teras untuk semua sensor #include // perpustakaan untuk BMP180 #include // Pustaka grafik teras #include // Perpustakaan khusus perkakasan #include // perpustakaan untuk komunikasi dengan peranti SPI #include "dht.h" // perpustakaan untuk DHT #define DHT22_PIN 2 // sambungkan pin data DHT22 kepada 2 pin digital #define TFT_CS 10 // sambungkan pin CS TFT kepada 10 pin digital #define TFT_RST 9 // sambungkan pin RST TFT kepada 9 pin digital // anda juga boleh menyambungkannya ke tetapan semula Arduino // dalam kes ini, tetapkan pin #define ini kepada 0! #define TFT_DC 8 // sambungkan pin DC TFT kepada 8 pin digital Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //memulakan TFT #define TFT_SCLK 13 // sambungkan pin SCLK TFT kepada 13 pin digital #define TFT_MOSI 11 // sambungkan pin MOSI TFT kepada 11 pin digital dht DHT; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); //memulakan BMP180 int bmpFlag = 0; struct ( jumlah uint32_t; uint32_t ok; uint32_t crc_error; uint32_t time_out; uint32_t connect; uint32_t ack_l; uint32_t ack_h; uint32_t unknown; ) stat = ( 0,0,0,0,0,0), // struct untuk persediaan void status dht(void) ( Serial.begin(9600); Serial.println("Ujian Meteo"); Serial.println(""); if(!bmp.begin()) // semak sambungan untuk BMP180 ( Serial.print("Ooops, tiada BMP180 dikesan ... Periksa pendawaian anda atau I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB); // Mulakan TFT dan isi dengan warna hitam tft.fillScreen (ST7735_BLACK); tft.setRotation(tft.getRotation() + 1); tft.setTextSize(1.5); oldPressure = 0, oldDHTHhumidity = 0, oldDHTTemperature; bool wasUpdate = palsu; void loop(void) ( if(Serial.available() > 0) // kami mempunyai data ialah Serial port ( Serial.read(); // baca byte dari serial port dan hantar data yang diukur terakhir printValue("Pressure", oldPressure , " hPa", false); printValue("Temperature", oldTemperature, " C", false printValue("Altitud", oldAltitude, " m", false); false); printValue("DHT_temperature", oldDHTTemperature, "C", false); Serial.println("END_TRANSMISSION"); BMP180 jika (event.pressure) ( bmp.getTemperature(&temperature); float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA; altitud = bmp.pressureToAltitud(seaLevelPressure, event.pressure, suhu); ) other ( Serial.println("Sensor error"); ) ) uint32_t start = micros(); int chk = DHT.read22(DHT22_PIN); // dapatkan data dari DHT22 uint32_t stop = micros(); stat.total++; ok++; pecah; kes DHTLIB_ERROR_CHECKSUM: stat.crc_error++; Serial.print("Ralat Checksum,\t"); pecah; kes DHTLIB_ERROR_TIMEOUT: stat.time_out++; Serial.print("Ralat tamat masa,\t"); pecah; kes DHTLIB_ERROR_CONNECT: stat.connect++; Serial.print("Ralat sambung,\t"); pecah; kes DHTLIB_ERROR_ACK_L: stat.ack_l++; Serial.print("Ralat Ack Low,\t"); pecah; kes DHTLIB_ERROR_ACK_H: stat.ack_h++; Serial.print("Ralat Ack High,\t"); pecah; lalai: stat.unknown++; Serial.print("Ralat tidak diketahui,\t"); pecah; ) jika(bmpFlag ! = 0 || !event.pressure) // kemas kini data ( tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("PERMULAAN BMP RALAT", 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", event.pressure, " hPa", benar); "C", benar); suhu lama; wasUpdate; ketinggian, " m", benar); wasUpdate = true; ) ) jika(DHT.kelembapan != oldDHTHumidity) ( tft.fillRect(0, 54, 160, 7, ST7735_BLACK);tft.setCursor(0, 54); tft.setTextColor(ST7735_GREEN); printValue("Kelembapan", DHT.kelembapan, "%", benar); oldDHTHhumidity = DHT.kelembapan; wasUpdate = benar; ) if(DHT.temperature != oldDHTTemperature) ( tft.fillRect(0, 80, 160, 7, ST7735_BLACK); tft.setCursor(0, 80); tft.setTextColor(ST7735_YELLOW); printValue("DHT.temperature", DHT. suhu, " C", benar); oldDHTTemperature = DHT.temperature; wasUpdate = true; kelewatan(10000); ) void printValue(tajuk aksara*, nilai berganda, ukuran aksara*, bool tftPrint) ( if(tftPrint) // mencetak data ke TFT ( tft.print(title); tft.print(": "); tft.print( value); tft.println(measure); ) Serial.print(title);

Sudah tiba masanya untuk memasang badan

Syarat utama kerja kursus ialah prototaip kerja dalam bentuk yang boleh dilihat. Oleh itu, saya terpaksa membeli perumahan dan, bersenjatakan fail, masukkan stesen cuaca ke dalam perumahan dengan apa cara sekalipun.

Kes itu dibeli dari kedai elektronik radio tempatan.

Bingkai

(Kes dalam foto berbeza sedikit. Saya mempunyai penutup lutsinar)



Kemudian, menggunakan fail, lubang dibuat untuk mengeluarkan penderia dan membekalkan kuasa. Saya memutuskan untuk mengalihkan penderia ke luar, kerana semasa menguji sistem tanpa sarung, saya perhatikan bahagian belakang skrin menjadi sangat panas, yang akan menjejaskan suhu di dalam sarung.

Perumahan dengan bukaan untuk penderia dan kuasa



Oleh kerana saya terpaksa menyolder kaki ke 2 sensor dan saya membakar trek pada salah satu daripadanya, saya memutuskan untuk tidak menggoda nasib dan tidak menyolder wayar ke sensor (saya akan berlatih pada sesuatu yang lain), tetapi untuk sambungan untuk menjadi lebih atau kurang boleh dipercayai, saya memutuskan untuk memundurkan pita elektrik.

Sistem sebelum "disumbat" ke dalam perumahan



Oleh kerana kes itu jauh lebih besar daripada Arduino (tidak ada yang lebih kecil), saya terpaksa menghasilkan sokongan supaya papan tidak bergerak di dalam kes itu. Juga, satu angka telah dipotong daripada buih, dan di dalamnya terdapat segi empat tepat untuk skrin untuk menyembunyikan bahagian dalam kes itu. Saya tidak mempunyai superglue di tangan, jadi saya terpaksa menggunakan pita dua muka.

Keajaiban-yuda ikan-ikan paus



Hidupkan penutup, sambungkan kuasa dan tunggu.

Stesen cuaca siap di dalam bangunan



Selepas memaparkan keputusan pada skrin, kami mengenal pasti ralat yang tidak menyenangkan dalam mengukur kelembapan: DHT22 dengan tekun menghasilkan angka 99.90% (1.00% sangat jarang berlaku). Mari kita mula memikirkan apa masalahnya. Perkara pertama yang kita lakukan ialah melihat output nilai ke port COM. Sedap rasanya. Selepas beberapa kali pengisian semula, pembongkaran dan pemasangan semula kes itu, terlintas di fikiran untuk mencari jawapan di Google. Seperti yang dijangka, Google Rusia tidak mengatakan apa-apa yang berguna. OKEY. Kami mula mencari dalam bahasa Inggeris dan di salah satu forum kami menemui lelaki yang mempunyai masalah yang sama. Empat halaman pertama perbincangan tidak memberikan apa-apa yang berguna, tetapi pada halaman kelima kami mendapati jawapan kepada soalan kami:
Penderia kelembapan dengan mudah boleh dipengaruhi oleh gas yang salah atau pendedahan yang sangat lama kepada IIRC kelembapan tinggi. Dalam lembaran data terdapat prosedur bagaimana untuk "menetapkan semula" sensor, anda boleh mencubanya.

Satu-satunya soalan yang tinggal ialah bila dan bagaimana saya berjaya merosakkan DHT22. Tetapi masa semakin hampir untuk mengambil kerja kursus dan oleh itu saya meninggalkan penyelesaian untuk masalah ini untuk kemudian.

Akhir kata

Kerja kursus telah diluluskan. Stesen cuaca telah ditangguhkan selama-lamanya sehingga semua tailing di universiti ditutup. Walau bagaimanapun, kami terpaksa kembali ke stesen cuaca lebih awal daripada yang saya fikirkan. Kebetulan pada pertengahan November saya menukar tempat kerja saya dan dalam pasukan baru saya bertemu dengan orang yang berminat dengan platform Arduino dan seumpamanya. Oleh itu, minat saya terhadap platform ini, tanpa sempat menyejukkan badan, kembali membara. Saya mengeluarkan stesen cuaca saya, menyambungkannya ke komputer dan teringat bahawa saya melaksanakan pemindahan data dari Arduino melalui port COM. Dan kemudian idea datang kepada saya untuk menulis program yang menerima data melalui port COM dari Arduino dan menghantar data ini kepada pemantauan awam
  • Arduino
  • Tambah tag Seperti kebanyakan orang yang bekerja, meneruskan projek anda sendiri mengambil satu-satunya masa lapang yang anda tinggalkan. Itulah sebabnya saya sudah lama tidak mencipta apa-apa dan saya gatal untuk melakukan sesuatu. Anehnya, peluang ini muncul di universiti. Ia adalah bulan September di luar tingkap, tahun ke-4 dan kerja kursus akan datang mengenai reka bentuk litar. Kami diberitahu bahawa kerja kursus boleh dilakukan dalam dua variasi: kertas dan perkakasan.

    Selama 5 tahun, kerja kursus kertas di universiti kami telah dilakukan mengikut prinsip "ambil yang lama dan satukan." Pendekatan ini tidak sesuai dengan saya kerana rutinnya, jadi saya segera memilih kerja kursus dalam perkakasan. Pengawal mikro Arduino telah dicadangkan sebagai nadi kerja kursus kerana kemudahan pembelajarannya. Selepas menentukan jenis kerja kursus, satu lagi soalan kekal: apakah sebenarnya yang perlu dilakukan. Memandangkan saya tidak mempunyai pengalaman dalam pengaturcaraan mikropengawal, saya segera membuka Google dan mula mengkaji projek sedia ada. Terdapat banyak projek, sebahagian daripadanya agak mudah, ada yang bijak (contohnya pengimbas 3D), tetapi sebahagian besarnya tidak mempunyai aplikasi praktikal. Dan saya hanya mahukan sesuatu yang tidak akan terletak di atas rak dan mengumpul habuk. Selepas setengah jam mengembara ke dunia Arduino, saya mula berminat dengan topik stesen cuaca rumah, dan projek itu nampaknya tidak begitu sukar untuk dilaksanakan (iaitu yang paling menarik minat pendatang baru).

    Beginilah topik untuk kerja kursus dipilih dan lama-kelamaan nampaknya tiada masalah.

    Pemilihan Komponen

    Melihat melalui projek yang berbeza, saya menyedari bahawa Nano atau Pro Mini akan mencukupi untuk saya, tetapi saya masih memilih Arduino Uno dengan harapan saya ingin pengaturcaraan untuk Arduino dan akan melaksanakan beberapa lagi projek pada masa hadapan. Saya tidak pernah memegang besi pematerian di tangan saya sebelum ini, jadi untuk pembangunan yang lebih mudah saya memutuskan untuk turut membeli Sensor Shield v4.

    Maklumat lanjut

    Papan memudahkan sambungan pantas penderia, modul, motor servo, antara muka Serial dan I2C, dan juga memaparkan semua port pengawal faktor bentuk Duemilanova/Uno (juga boleh disambungkan kepada siri mega, tetapi dengan had dan akibat yang seterusnya) . Menyokong perisai lain di atas dirinya sendiri.


    Saya memilih penderia berikut sebagai sumber untuk data meteorologi:


    Saya telah membuat keputusan mengenai sensor. Tetapi apa yang perlu dilakukan dengan data yang datang daripada penderia? Saya memutuskan untuk memaparkannya. Saya mahukan gambar berwarna, jadi saya segera membuang penyelesaian monokrom. Selepas beberapa minit mencari, paparan TFT 1.8 inci ST7735 telah dipilih.

    Maklumat lanjut

    Memandangkan paparan menggunakan protokol SPI 4 wayar untuk komunikasi dan mempunyai penimbal bingkai boleh alamat pikselnya sendiri, ia boleh digunakan dengan sebarang jenis pengawal mikro. Paparan 1.8 inci mempunyai piksel warna 128x160. Terdapat juga slot kad microSD, oleh itu, anda boleh memuatkan imej bitmap warna penuh dengan mudah daripada sistem fail kad microSD FAT16/FAT32.

    Ciri-ciri:

    • Paparan pepenjuru - 1.8 inci, resolusi 128x160 piksel, warna 18-bit (262,144 warna)
    • Pengawal dengan pengalamatan piksel terbina dalam penimbal memori video
    • Slot microSD terbina dalam - menggunakan lebih daripada 2 talian digital
    • Serasi dengan 3.3 dan 5V
    • Dimensi: 34 mm x 56 mm x 6.5 m


    Pengaturcaraan Pengatur Arduino

    Selepas kami memutuskan komponen untuk stesen cuaca, kami akan memulakan pengaturcaraan pengawal. IDE Arduino digunakan untuk memancarkan perisian tegar Arduino. Juga menggunakan perpustakaan dari Adafruit.

    Sebelum beralih kepada lakaran, mari kita lihat fungsinya:

    • Bacaan diambil dari penderia setiap 10 saat dan hanya penunjuk yang telah berubah berbanding dengan ukuran sebelumnya dikemas kini pada skrin
    • Melaksanakan pemindahan data melalui port COM

    Lakaran

    #termasuk // perpustakaan untuk komunikasi dengan peranti I2C #include // Pustaka teras untuk semua sensor #include // perpustakaan untuk BMP180 #include // Pustaka grafik teras #include // Perpustakaan khusus perkakasan #include // perpustakaan untuk komunikasi dengan peranti SPI #include "dht.h" // perpustakaan untuk DHT #define DHT22_PIN 2 // sambungkan pin data DHT22 kepada 2 pin digital #define TFT_CS 10 // sambungkan pin CS TFT kepada 10 pin digital #define TFT_RST 9 // sambungkan pin RST TFT kepada 9 pin digital // anda juga boleh menyambungkannya ke tetapan semula Arduino // dalam kes ini, tetapkan pin #define ini kepada 0! #define TFT_DC 8 // sambungkan pin DC TFT kepada 8 pin digital Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //memulakan TFT #define TFT_SCLK 13 // sambungkan pin SCLK TFT kepada 13 pin digital #define TFT_MOSI 11 // sambungkan pin MOSI TFT kepada 11 pin digital dht DHT; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); //memulakan BMP180 int bmpFlag = 0; struct ( jumlah uint32_t; uint32_t ok; uint32_t crc_error; uint32_t time_out; uint32_t connect; uint32_t ack_l; uint32_t ack_h; uint32_t unknown; ) stat = ( 0,0,0,0,0,0), // struct untuk persediaan void status dht(void) ( Serial.begin(9600); Serial.println("Ujian Meteo"); Serial.println(""); if(!bmp.begin()) // semak sambungan untuk BMP180 ( Serial.print("Ooops, tiada BMP180 dikesan ... Periksa pendawaian anda atau I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB); // Mulakan TFT dan isi dengan warna hitam tft.fillScreen (ST7735_BLACK); tft.setRotation(tft.getRotation() + 1); tft.setTextSize(1.5); oldPressure = 0, oldDHTHhumidity = 0, oldDHTTemperature; bool wasUpdate = palsu; void loop(void) ( if(Serial.available() > 0) // kami mempunyai data ialah Serial port ( Serial.read(); // baca byte dari serial port dan hantar data yang diukur terakhir printValue("Pressure", oldPressure , " hPa", false); printValue("Temperature", oldTemperature, " C", false printValue("Altitud", oldAltitude, " m", false); false); printValue("DHT_temperature", oldDHTTemperature, "C", false); Serial.println("END_TRANSMISSION"); BMP180 jika (event.pressure) ( bmp.getTemperature(&temperature); float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA; altitud = bmp.pressureToAltitud(seaLevelPressure, event.pressure, suhu); ) other ( Serial.println("Sensor error"); ) ) uint32_t start = micros(); int chk = DHT.read22(DHT22_PIN); // dapatkan data dari DHT22 uint32_t stop = micros(); stat.total++; ok++; pecah; kes DHTLIB_ERROR_CHECKSUM: stat.crc_error++; Serial.print("Ralat Checksum,\t"); pecah; kes DHTLIB_ERROR_TIMEOUT: stat.time_out++; Serial.print("Ralat tamat masa,\t"); pecah; kes DHTLIB_ERROR_CONNECT: stat.connect++; Serial.print("Ralat sambung,\t"); pecah; kes DHTLIB_ERROR_ACK_L: stat.ack_l++; Serial.print("Ralat Ack Low,\t"); pecah; kes DHTLIB_ERROR_ACK_H: stat.ack_h++; Serial.print("Ralat Ack High,\t"); pecah; lalai: stat.unknown++; Serial.print("Ralat tidak diketahui,\t"); pecah; ) jika(bmpFlag ! = 0 || !event.pressure) // kemas kini data ( tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("PERMULAAN BMP RALAT", 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", event.pressure, " hPa", benar); "C", benar); suhu lama; wasUpdate; ketinggian, " m", benar); wasUpdate = true; ) ) jika(DHT.kelembapan != oldDHTHumidity) ( tft.fillRect(0, 54, 160, 7, ST7735_BLACK);tft.setCursor(0, 54); tft.setTextColor(ST7735_GREEN); printValue("Kelembapan", DHT.kelembapan, "%", benar); oldDHTHhumidity = DHT.kelembapan; wasUpdate = benar; ) if(DHT.temperature != oldDHTTemperature) ( tft.fillRect(0, 80, 160, 7, ST7735_BLACK); tft.setCursor(0, 80); tft.setTextColor(ST7735_YELLOW); printValue("DHT.temperature", DHT. suhu, " C", benar); oldDHTTemperature = DHT.temperature; wasUpdate = true; kelewatan(10000); ) void printValue(tajuk aksara*, nilai berganda, ukuran aksara*, bool tftPrint) ( if(tftPrint) // mencetak data ke TFT ( tft.print(title); tft.print(": "); tft.print( value); tft.println(measure); ) Serial.print(title);

    Sudah tiba masanya untuk memasang badan

    Syarat utama kerja kursus ialah prototaip kerja dalam bentuk yang boleh dilihat. Oleh itu, saya terpaksa membeli perumahan dan, bersenjatakan fail, masukkan stesen cuaca ke dalam perumahan dengan apa cara sekalipun.

    Kes itu dibeli dari kedai elektronik radio tempatan.

    Bingkai

    (Kes dalam foto berbeza sedikit. Saya mempunyai penutup lutsinar)



    Kemudian, menggunakan fail, lubang dibuat untuk mengeluarkan penderia dan membekalkan kuasa. Saya memutuskan untuk mengalihkan penderia ke luar, kerana semasa menguji sistem tanpa sarung, saya perhatikan bahagian belakang skrin menjadi sangat panas, yang akan menjejaskan suhu di dalam sarung.

    Perumahan dengan bukaan untuk penderia dan kuasa



    Oleh kerana saya terpaksa menyolder kaki ke 2 sensor dan saya membakar trek pada salah satu daripadanya, saya memutuskan untuk tidak menggoda nasib dan tidak menyolder wayar ke sensor (saya akan berlatih pada sesuatu yang lain), tetapi untuk sambungan untuk menjadi lebih atau kurang boleh dipercayai, saya memutuskan untuk memundurkan pita elektrik.

    Sistem sebelum "disumbat" ke dalam perumahan



    Oleh kerana kes itu jauh lebih besar daripada Arduino (tidak ada yang lebih kecil), saya terpaksa menghasilkan sokongan supaya papan tidak bergerak di dalam kes itu. Juga, satu angka telah dipotong daripada buih, dan di dalamnya terdapat segi empat tepat untuk skrin untuk menyembunyikan bahagian dalam kes itu. Saya tidak mempunyai superglue di tangan, jadi saya terpaksa menggunakan pita dua muka.

    Keajaiban-yuda ikan-ikan paus



    Hidupkan penutup, sambungkan kuasa dan tunggu.

    Stesen cuaca siap di dalam bangunan



    Selepas memaparkan keputusan pada skrin, kami mengenal pasti ralat yang tidak menyenangkan dalam mengukur kelembapan: DHT22 dengan tekun menghasilkan angka 99.90% (1.00% sangat jarang berlaku). Mari kita mula memikirkan apa masalahnya. Perkara pertama yang kita lakukan ialah melihat output nilai ke port COM. Sedap rasanya. Selepas beberapa kali pengisian semula, pembongkaran dan pemasangan semula kes itu, terlintas di fikiran untuk mencari jawapan di Google. Seperti yang dijangka, Google Rusia tidak mengatakan apa-apa yang berguna. OKEY. Kami mula mencari dalam bahasa Inggeris dan di salah satu forum kami menemui lelaki yang mempunyai masalah yang sama. Empat halaman pertama perbincangan tidak memberikan apa-apa yang berguna, tetapi pada halaman kelima kami mendapati jawapan kepada soalan kami:
    Penderia kelembapan dengan mudah boleh dipengaruhi oleh gas yang salah atau pendedahan yang sangat lama kepada IIRC kelembapan tinggi. Dalam lembaran data terdapat prosedur bagaimana untuk "menetapkan semula" sensor, anda boleh mencubanya.

    Satu-satunya soalan yang tinggal ialah bila dan bagaimana saya berjaya merosakkan DHT22. Tetapi masa semakin hampir untuk mengambil kerja kursus dan oleh itu saya meninggalkan penyelesaian untuk masalah ini untuk kemudian.

    Akhir kata

    Kerja kursus telah diluluskan. Stesen cuaca telah ditangguhkan selama-lamanya sehingga semua tailing di universiti ditutup. Walau bagaimanapun, kami terpaksa kembali ke stesen cuaca lebih awal daripada yang saya fikirkan. Kebetulan pada pertengahan November saya menukar tempat kerja saya dan dalam pasukan baru saya bertemu dengan orang yang berminat dengan platform Arduino dan seumpamanya. Oleh itu, minat saya terhadap platform ini, tanpa sempat menyejukkan badan, kembali membara. Saya mengeluarkan stesen cuaca saya, menyambungkannya ke komputer dan teringat bahawa saya melaksanakan pemindahan data dari Arduino melalui port COM. Dan kemudian idea berlaku kepada saya untuk menulis program yang menerima data melalui port COM dari Arduino dan menghantar data ini kepada pemantauan awam, tetapi itu cerita yang sama sekali berbeza.

    Saya juga ingin mempunyai penderia wayarles dan masih melaksanakan stesen cuaca pada Arduino Pro Mini. Oleh itu, saya memesan 4 Arduino Pro Minis dengan bekalan kuasa 3.3V, 4 modul radio nRF24L01+ dan beberapa sensor tambahan, yang akan saya cuba bincangkan pada masa akan datang. Sementara itu, saya sedang menunggu bungkusan itu, terdapat rancangan untuk melaksanakan sambungan jam masa nyata untuk dapat menjimatkan masa kemas kini data dan data itu sendiri pada kad microSD, dengan syarat tiada sambungan ke pelanggan melalui port COM.

    Anda boleh membantu dan memindahkan beberapa dana untuk pembangunan tapak