Təzyiq qrafiki ilə Arduino hava stansiyası. Arduino-da ev hava stansiyası və məlumatların "Xalq Monitorinqi"nə göndərilməsi

DIY hava stansiyası.

Axşam idi, Yeni ildən sonra heç nə yox idi. Həmişə olduğu kimi, qış Yeni il tətillərində başımı və əllərimi faydalı və yaradıcı bir şeylə məşğul etmək istəyirəm. Bu Yeni il tətillərində öz əllərimlə bir meteoroloji stansiya düzəltməyə qərar verdim. Əvvəlcədən hazırlaşmağa başladım, yeni il qabağı bütün komponentləri alıb yığdım, bayramlarda əsas proqramlaşdırmanı etdim.

(kəsimin altında çoxlu fotoşəkillər var!)

Əvvəlcə komponentləri nəzərdən keçirəcəyəm, eBay-də (in şəxsi hesab) mallar arxivə getdi. Mən eBay-də rahatlıqla bir çox komponent aldım. Mən həmişə “indi al” almamışdan əvvəl ilk dəfə hərrac keçirdim. Nə deyim, alış-verişə tələsməsəniz, bəzi komponentləri daha ucuz ala bilərsiniz (fərq bəzən bundan iki dəfədir).

Təzyiq sensoru VMR085
Bu əsas sensordur. Bunu eBay-də görəndə anladım ki, evdə hava stansiyası qurmaq istəyirəm.
Sensor adi bir zərfdə gəldi, içərisi köpüklə örtülmüşdür.

Zərfin içərisində satıcının vizit kartı və antistatik çantaya yığılmış və başqa bir qabarcıq filminə bükülmüş sensor var idi.

Uçuş zamanı rütubətin sensoru təhdid etməməsi üçün antistatik çanta möhürləndi

Sensoru çıxarırıq. Bir tərəfdə lehimli bir əlaqə xətti var, onların əyilməsinin qarşısını almaq üçün köpük içərisinə daxil edilmişdir. Digər tərəfdə sensorun özü və əlaqə işarələri var.




Hər şey yaxşı olardı, amma kontakt işarələri güzgü şəklində tətbiq olunur.
Sensor I2C avtobusu ilə birləşdirilir və 3,3 V ilə işləyir. Yəni normal işləmək üçün 4 naqil lazımdır (+, -, SDA, SCL)
Sensoru iki yolla sorğulaya bilərsiniz: ya kitabxana vasitəsilə, ya da birbaşa eskizdəki funksiyalardan istifadə etməklə.
Nümunə proqram:

#daxildir

#BMP085_ADDRESS 0x77 // BMP085-in I2C ünvanını təyin edin

Const unsigned char OSS = 0; // Həddindən artıq seçmə parametri

// Kalibrləmə dəyərləri
int ac1;
int ac2;
int ac3;
imzasız int ac4;
imzasız int ac5;
imzasız int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

Qısa temperatur;
uzun təzyiq;

Quraşdırmanı ləğv edin()
{
Serial.begin(9600);
Wire.begin();
bmp085Kalibrləmə();
}

boş döngə()
{
temperatur = bmp085GetTemperature(bmp085ReadUT());
təzyiq = bmp085GetPressure(bmp085ReadUP());
Serial.print("Temperatur: „);
Serial.print(temperatur/10.0, DEC);
Serial.println("C");
Serial.print("Təzyiq: „);
Serial.print(təzyiq/133.322, DEC);
Serial.println (“mm Hg”);
Serial.println();
gecikmə (1000);
}

Etibarsız bmp085Kalibrləmə()
{
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);
}

Qısa bmp085GetTemperature(imzasız int ut)
{
uzun x1, x2;
x1 = (((uzun)ut - (uzun)ac6)*(uzun)ac5) >> 15;
x2 = ((uzun) mc<< 11)/(x1 + md);
b5 = x1 + x2;

Qayıt ((b5 + 8)>>4);
}

Uzun bmp085GetPressure (uzun müddət imzalanmadı)
{
uzun x1, x2, x3, b3, b6, p;
imzasız uzun b4, b7;
b6 = b5 - 4000;
// B3 hesablayın
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((uzun)ac1)*4 + x3)<>2;
// B4 hesablayın
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (imzasız uzun)(x3 + 32768))>>15;
b7 = ((imzasız uzun)(yuxarı - b3) * (50000>>OSS));
əgər (b7< 0x80000000)
p = (b7<<1)/b4;
başqa
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;
qayıt p;
}

// "ünvanda" BMP085-dən 1 baytı oxuyun
char bmp085Read(imzasız simvol ünvanı)
{
imzalanmamış simvol məlumatları;

Wire.write(ünvan);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available())
;
qayıdın Wire.read();
}

Int bmp085ReadInt(imzasız simvol ünvanı)
{
imzasız char msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(ünvan);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
qaytarmaq (int) msb<<8 | lsb;
}

// Kompensasiya olunmamış temperatur dəyərini oxuyun
imzasız int bmp085ReadUT()
{
imzasız int ut;
// 0xF4 registrinə 0x2E yazın
// Bu, temperaturun oxunmasını tələb edir
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
// Ən azı 4,5 ms gözləyin
gecikmə(5);
// 0xF6 və 0xF7 registrlərindən iki baytı oxuyun
ut = bmp085ReadInt(0xF6);
geri qayıt;
}

// Kompensasiya olunmamış təzyiq dəyərini oxuyun
imzasız uzun bmp085ReadUP()
{
imzasız char msb, lsb, xlsb;
unsigned long up = 0;
// 0x34+ yazın (OSS<<6) into register 0xF4
// Aşırı seçmə parametri ilə təzyiq oxunmasını tələb edin
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// Konversiyanı gözləyin, gecikmə vaxtı OSS-dən asılıdır
gecikmə (2 + (3<// 0xF6 (MSB), 0xF7 (LSB) və 0xF8 (XLSB) registrini oxuyun
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Verilənlərin əlçatan olmasını gözləyin
while(Wire.available()< 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
yuxarı = (((imzasız uzun) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
geri qayıtmaq;
}


Bundan əlavə, sensorun təzyiq kompensasiyası üçün öz istilik sensoru və altimeter var

Arduino Nano v3.0
Bu, bütün meteoroloji stansiyanın ürəyidir. Sadəcə olaraq, nəzarətçi ölçüdə miniatürdür.
Mən aldım
Nəzarətçi haqqında ətraflı danışmayacağam, çünki bu, məndən əvvəl edilib:


Lightake paketi prefabrik idi, nəzarətçi möhürlənmiş antistatik çantada USB kabel və Arduino olan paketdə gəldi.

Ölçüsü təxmin etmək üçün Arduino-nun yanına 1 rubl sikkə qoydum.

Nəzarətçi lövhəsi yaxındır



USB kabel yaxşıdır, ferrit halqa ilə. Arduino USB kabel vasitəsilə qidalanır. İnkişaf mühiti endirilə bilər (səhifəni endir). Dil “C”-yə bənzəyir, onu mənimsəməkdə heç bir problem yox idi, çünki işdə çoxlu proqramlaşdırma edirəm.

LCD ekran
İşdə qutularda uyğun LCD 1602 ekranı tapdım. Bunun üçün məlumat cədvəli tapa bilmədiyim üçün əlaqə ilə məşğul olmalı idim. Nəticədə LCD işləməyə başladı.

Ancaq qısa müddət istifadə etdikdən sonra gördüm ki, bu ekran mənim üçün kifayət deyil və hər biri 16 simvoldan ibarət cəmi 2 sətir olduğundan daha çox məlumat göstərmək mümkün olmayacaq. İlk baxışdan bu parametrlərin kifayət qədər olduğu görünür, amma proqramlaşdırmağa başlayanda anlayırsan ki, sıxa biləcəyiniz maksimum 3-4 parametrdir. Və əgər siz menyu düzəltsəniz (bu ekranda menyu hazırlamağı düşünürdüm), onda yalnız 1-2 parametr boş yer qalır.
Nəticədə başqa ekran axtarmağa başladım. Əvvəlcə Nokia 3310-un qrafik ekranına diqqətlə baxdım və hətta onu almaq üçün eBay auksionunda iştirak etdim, amma alınmadı (buna çox şadam), ona görə də bu ekrandan imtina etməli oldum. İndi başa düşürəm ki, bu mənim məqsədlərim üçün çox kiçik olardı, çünki müqayisə etmək üçün bir şey var.
Arduino-da təsadüfi olaraq qalxanlara baxarkən ST7920 nəzarətçisində 12864 qrafik ekranına rast gəldim. Bu ekran mənim ehtiyaclarım üçün düzgün ölçüyə və yaxşı qətnaməyə malikdir (128x64). Yəni normal oxuna bilən şriftdə 20 simvoldan ibarət 6-7 sətir asanlıqla yerləşdirə bilərsiniz. Ekran qrafik olduğundan mətndən əlavə qrafikləri müxtəlif şriftlərdə yerləşdirmək olar. Bir sözlə, mənə lazım olan şey budur, bu ekranda hər şey var idi, buna görə müqavimət göstərə bilmədim və sifariş verdim.
Bağlama tez gəldi və standart olaraq qablaşdırıldı: qabarcıqlı zərf, içərisində başqa bir qabarcıq filmi və antistatik torbada ekran var idi:






Ölçüsü təxmin etmək üçün LCD-nin yanında 1 rubl sikkə qoydum.




Ekranı tez bir zamanda Arduino-ya qoşmaq üçün LCD pinlərinə bir əlaqə xətti lehimlədim. LCD-ni serial avtobus və ya paralel avtobus vasitəsilə qoşmaq olar. Mən birinci seçimi seçdim, çünki artıq bir neçə pulsuz Arduino kontaktı var.
Bağlantı (vebdən götürülmüşdür):

- Pin 1 (GND) ümumi avtobusa qoşulub
- Pin 2 (VCC) +5V güc avtobusuna qoşulmuşdur və cari istehlak nisbətən kiçikdir və displey quraşdırılmış Arduino stabilizatorundan qidalana bilər.
- 4, 5 və 6 sancaqlar Arduino rəqəmsal çıxışlarına qoşularaq SPI serial interfeysini təşkil edir:
pin 4 – (RS) – CS xəttinə uyğundur (məsələn, 7)
pin 5 – (RW) – MOSI xəttinə uyğundur (məsələn, 8)
pin 6 – (E) – SCK xəttinə uyğundur (məsələn, 3)
Arduino əlaqə nömrələri hər hansı bir şey ola bilər, əsas odur ki, ekranı işə salarkən onları proqram mətnində düzgün göstərməyi unutma.
- Pin 15 (PSB) ümumi avtobusa qoşulub.
- 19 (A) və 20 (K) kontaktları arxa işığın enerji təchizatıdır (müvafiq olaraq +5V və GND). Arxa işığın parlaqlığını tənzimləmək üçün güc avtobusu və GND arasında birləşdirilən 10 kOhm dəyişən rezistordan istifadə edə bilərsiniz. Onun mühərrikindən gələn gərginlik ekranın 19-cu pininə verilir.
Bu təlimatlara əsasən, arxa işıqdan başqa hər şeyi bağladım. Arduino PWM-dən arxa işığı gücləndirmək üçün istifadə etdim.
LCD-ni Arduino-ya proqramlı şəkildə qoşmaq üçün u8glib kitabxanasından istifadə olunur. Siz onu yükləyə bilərsiniz. Yükləyərkən problem yaranarsa, kitabxananı narod.ru saytına yükləyə bilərəm.
Kitabxananın özü mürəkkəb deyil və mətni müxtəlif şriftlərdə göstərməyə, xətt çəkməyə, sadə həndəsi fiqurları (düzbucaqlı, dairəvi) çəkməyə və xüsusi üsulla hazırlanmış öz şəkillərinizi nümayiş etdirməyə imkan verir. Prinsipcə, bu alət əksər tapşırıqlar üçün kifayətdir.
Budur sadə bir proqramın nəticəsi:

Proqramın özü:

# "U8glib.h" daxil edin

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

// Boş yaddaşı təyin etmək üçün alt proqram
int freeRam() (
extern int __heap_start, *__brkval;
int v;
qaytarmaq (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

Quraşdırmanı ləğv edin (etibarsız) (
u8g.setFont(u8g_font_6x10); // şrift
u8g.setRot180(); //Ekranı çevirin
analogWrite(6, 115); // Ekran parlaqlığını təyin edin (arxa işıqlandırma anodu 6 pin)
}

Boş döngə (boş) (
u8g.firstPage();
etmək (

u8g.setPrintPos(1, 12); // mövqe
u8g.print("Salam!!!"); // mətni çıxarın
u8g.drawBox(0,22,128,9); // Düzbucaqlı ağ rəngə boyayın
u8g.setColorIndex(0); // ağ mürəkkəb, qara fon
u8g.setPrintPos(1, 30); // mövqe
u8g.print("Söz..."); // mətni çıxarın

U8g.setColorIndex(1); // ağ mürəkkəb, qara fon
u8g.setPrintPos(1, 50); // mövqe
u8g.print("Başladıqdan sonra="); // mətni çıxarın
u8g.setPrintPos(85, 50); // mövqe
u8g.print(millis() / 1000); // başladıqdan sonra saniyələrin sayını çıxarın
u8g.setPrintPos(1, 64); // mövqe
u8g.print(freeRam()); // nə qədər yaddaş tutduğunu çıxarın
) while(u8g.nextPage());

Gecikmə (200);
}

Real vaxt saatı DS1307
Mənim hava stansiyasım üçün başqa bir komponent. Bu qalxan real vaxt saatını həyata keçirir. Onları eBay-də sifariş etdim. Satıcı saat şərfini real olmayan böyük qutuda göndərdi


Qutunun içərisində iki A4 vərəq reklam və sellofana bükülmüş saat dəsmalı var idi.


Qeyd etmək istərdim ki, ödəniş 2 rubldan çox deyil. sikkə və qutunun ölçüsü 13x15x5 sm.
Lövhə antistatik torbaya yığılmışdı

Şal yaxın



Bu modulla işləməli oldum. Birincisi, əlaqədə çətinliklər var idi. İkincisi, bu lövhədə kvars yoxdur. Əgər modula bu qədər vaxt sərf edəcəyimi bilsəydim, çox güman ki, onu özüm yığardım, çünki İnternet diaqramlarla doludur. Ən sadə sxem 4-5 komponentdən ibarətdir.
Əlaqəyə gəldikdə. I2C interfeysinin adi Arduino analoq girişlərinə (A4 və A5) deyil, istənilən diskret girişlərə qoşula biləcəyini söyləyən bir kitabxana tapdım. Yazıldığı kimi etdim. Əvvəlcə heç nə alınmadı, ancaq qavalla uzun rəqs etdikdən sonra saat işə başladı. Fikirləşdim ki, budur, problemlər bitdi, amma eyni modulu başqa Arduino-ya qoşmağa çalışdıqdan sonra qavalla rəqs davam etdi. Bu problemin həlli üçün çox vaxt sərf etdim və demək olar ki, hər yerdə ya səhv bir əlaqə, ya da SCL və SDA kontaktlarında açılan rezistorların olmaması göstərildi. Mən artıq bir lehimləmə dəmiri ilə lövhəyə daxil olmaq istəyirdim, lakin bir forumda təsadüfən SCL və SDA-nın Arduino-da standart I2C portlarına qoşulduğu deyilən bir koda rast gəldim. Standart bir əlaqədən sonra hər şey dərhal işlədi.
İndi kvars haqqında. Çinlilərin ora hansı kvars qoyduqlarını bilmirəm, amma belə kvarslı saatlar gündə 10-11 saniyə qaçırdı. Bu səhv ayda 5 dəqiqə, ildə isə 1 saatdır. Belə saata ehtiyac yoxdur. Yenidən internetə girib bu səhvi necə düzəltməli oldum. Qarşıya çıxan ilk həll, kvarsı torpaqlamanız lazım olduğunu söyləyir. Mən bunu etdim - nəticə sıfır oldu. Mən də bir yerdə tapdım ki, köhnə anakart tapmalı və oradan saat kvarsını çıxarmalıyam. Mən bunu etdim - bir nəticə var. İndi saat gündə 10-11 saniyə yox, 1,5 saniyə qaçır. Deyək ki, yaxşılaşdı, amma idealdan uzaqdır. Artıq lehimləmə dəmiri ilə məşğul olmaq istəmədiyim üçün saatı proqramlı şəkildə tənzimləmək, yəni saatı gündə bir dəfə lazımi dəyərə uyğunlaşdırmaq qərara alındı. 10 gündən sonra saat bir saniyədən çox çəkmədi. Metod yaxşıdır, ancaq Arduino sinxronizasiya cihazı gücə qoşulduqda, əks halda saat batareya gücü ilə işləyir və hələ də qaçır.
Kiçik bir test proqramı:

#daxil edin "Wire.h"
#DS1307_I2C_ADDRESS 0x68 təyin edin // SDA A4, SCL A5

Bayt decToBcd(bayt dəyər)
{
qaytarmaq ((val/10*16) + (val%10));
}

Bayt bcdToDec(bayt dəyər)
{
qaytarmaq ((val/16*10) + (val%16));
}

Etibarsız setDateDs1307(bayt saniyə, // 0-59
bayt dəqiqə, // 0-59
bayt saat) // 0-99
{

Wire.write(0);
Wire.write(decToBcd(ikinci));
Wire.write(decToBcd(dəqiqə));
Wire.write(decToBcd(saat));
Wire.endTransmission();
}

getDateDs1307-ni ləğv edin (bayt *saniyə,
bayt *dəqiqə,
bayt *saat)
{

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

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*ikinci = bcdToDec(Wire.read());
*dəqiqə = bcdToDec(Wire.read());
*saat = bcdToDec(Wire.read());
}

Quraşdırmanı ləğv edin()
{
bayt saniyə, dəqiqə, saat;
Wire.begin();
Serial.begin(9600);

İkinci = 45;
dəqiqə = 5;
saat = 16;

SetDateDs1307(saniyə, dəqiqə, saat);
}

boş döngə()
{
bayt saniyə, dəqiqə, saat;

GetDateDs1307(&saniyə, &dəqiqə, &saat);
Serial.print(saat, DEC);
Serial.print(":");
Serial.print(dəqiqə, DEC);
Serial.print(":");
Serial.println(ikinci, DEC);

Gecikmə (1000);
}


Burada kitabxanadan istifadə edilmir, oxumaq və yazma vaxtı funksiyaları kəsilib.

Temperatur və rütubət sensoru DHT11
Bu sensor haqqında danışmaq üçün heç bir şey yoxdur. Rütubət lazım olmasaydı belə istifadə etməzdim. Təəssüf ki, onu alanda şəklini çəkməmişəm, ona görə də heç bir şəkil olmayacaq. Sensorun fotoşəkillərini aşağıda görmək olar, mən onu Arduino ilə bağladım. Sensor bağlantısı sadədir (+, rəqəmsal çıxış, -). Tipik olaraq sensorlar dörd sancaqla hazırlanır. Bu forma faktoru ilə üçüncü pin heç bir şeyə bağlı deyil.
Arduino-ya qoşulmaq üçün kitabxanadan istifadə edə bilərsiniz. Siz onu yükləyə bilərsiniz.
LCD displey 1602-də məlumat çıxışı olan kiçik test proqramı:

// kitabxana kodunu daxil edin:
#daxildir
#daxildir

// Obyektləri elan edin
dht11 DHT11;
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

#DHT11PIN 7 təyin edin
int i;

Quraşdırmanı ləğv edin()
{
lcd.begin(16, 2);
lcd.print("Status: „);
i=0;
}

boş döngə()
{
int chk = DHT11.read(DHT11PIN);
lcd.setCursor(8, 0);
keçid (chk)
{
hal 0: lcd.print(“OK“); break;// lcd.setCursor(11, 0); lcd.print(millis()/2000); fasilə;
hal -1: lcd.print (“Yoxlama məbləği xətası”); mErr(); fasilə;
hal -2: lcd.print("Time-out xətası"); mErr(); fasilə;
default: lcd.print("Naməlum xəta"); mErr(); fasilə;
}
gecikmə (500);
lcd.setCursor(15, 0);
keçid(i)
{
hal 0: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" "); fasilə;
hal 1: lcd.print("v"); lcd.setCursor(15, 1); lcd.print(" "); fasilə;
default: lcd.setCursor(15, 1); lcd.print("E"); fasilə;
}
i=i+1;
əgər (i>1) i=0;
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd.print((float)DHT11.rütubət, 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");

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


Sensorun bəzi çatışmazlıqları var - sensordan gələn məlumatlar yalnız tam ədədlərdir və diapazon zəifdir.

Deyəsən, bütün komponentlər haqqında yazmışam. Qalan hər şeyi vahid bir bütövlükdə toplamaqdır.
Vay, demək olar ki, unutdum! Cihazı yığmaq üçün bir qutu lazımdır. Mən də işi Ebay-da sifariş etmişəm. Satıcının İngiltərədən olduğu məlum olub. Bağlama tez gəldi, amma şəklini çəkmədim. Davanın bütün şəkilləri aşağıdadır.

Əvvəlcə xüsusi naqillərdən istifadə edərək masanın üstündəki hər şeyi yığdım. Test proqramı yazıb nəzarətçiyə yüklədim.



Əslində, arxa işığın mavi rəngi daha parlaqdır. Minimum parlaqlıqda belə (Bright=5) çərçivə işıqlandırılır.

Hər şeyi simsiz şəkildə yığmaq üçün mini anakart hazırlamaq qərara alındı ​​və bağlayıcılara Arduino lövhələri və qalxanları qoyuldu. Bir şey olarsa, onlar tez və asanlıqla çıxarıla bilər. Mən də LCD ekranı və idarəetmə düymələrini konnektorlara əlavə etmək qərarına gəldim, yalnız naqillərdəki temperatur sensorunu lehimlədim.
Şərf belə çıxdı



Son fotoşəkildə mən axını tamamilə yumamışam. Bağlayıcıların yanındakı qalxanların altına məsaməli rezin yapışdırdım ki, heç olmasa bir az dəstək olsun. Baxmayaraq ki, əslində kontaktlardakı bağlayıcılardakı qalxanlar yaxşı dayanır.

Quraşdırılmış qalxanlar və Arduino lövhəsi olan ana plata.

Ana plata ilə tam əlaqə belə görünür


Düymələrin yerinə çörək taxtasına lehimlənmiş evdə hazırlanmış qalxan istifadə etdim. Düymə kimi köhnə siçanların düymələrindən istifadə etdim.
Gördüyünüz kimi naqillərin sayı azalıb.

Korpusda yerləşdirmənin əsas problemi LCD ekran üçün hamar bir yiv kəsməkdir. Nə qədər çalışsam da, yenə də mükəmməl alınmadı. Bəzi yerlərdə boşluqlar 1 mm-dən bir qədər çox idi. Hər şeyin səliqəli görünməsi üçün qara akvarium mastik götürdüm və bütün çatları doldurdum, eyni zamanda ekranı bu mastikə yapışdırdım. Mastik quruduqdan sonra artıqlığı kənardan kəsdim. Parlaq işıqda mastik görünür, lakin normal işıqda hər şey bədənlə birləşir.
LCD ekran və quraşdırılmış ana plata ilə korpus içəridən belə görünür.

Kənardan parlaq işıqda belə görünür (barmaq izlərinə görə üzr istəyirəm, şəkilləri çeşidləyəndə gördüm).

Düymələri korpusa necə yerləşdirmək və ən əsası hansı düymələrdən istifadə etmək barədə uzun müddət düşündüm...
Radioelektron mağazalarında uzun sancaqlı düyməni və bu sancağa uyğun olan uclarını bəyəndilər. Bu düymələr lövhəyə lehimləmə üçün istifadə olunur. Hər şey yaxşı olardı, amma onların bir mənfi cəhətləri var - basma vuruşu çox kiçik və yüksəkdir.
Düymələri iki mərhələdə yerləşdirməli olduq: birincisi, düymələri lövhəyə yerləşdirmək, ikincisi bu lövhəni başqa lövhəyə quraşdırmaq idi. Və sonra bütün bunları bədənə bələdçilərə qoyun.

Düymələri olan bir eşarp belə görünür:



Saxlama lövhəsi belə görünür:


Burada düymələri olan lövhənin daxil edildiyi təlimatları görə bilərsiniz. Lövhəyə sərtlik vermək üçün bəzi elementlər lehimlənmişdir.

İndi hər şeyi bədənə qoyuruq
Düymələri birləşdirmədən:


Düymə bağlantısı ilə:

Kassanı bağlayın və yandırın. Hər şey əla işləyir, düymələr lazım olduğu kimi işləyir.

Sonda müxtəlif rejimlərdə işləyən cihazın qısa bir videosunu göndərirəm:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
Videonu burada görməyənlər üçün link budur

Baxışa son qoymağın vaxtıdır.
Proqram haqqında bir az yazacağam, sonra bir neçə qısa nəticə. Proqramı yazanda 30,720 bayt limitini çox tez keçəcəyimi düşünmürdüm.


Kodu optimallaşdırmalı oldum. Bir çox kod parçasını alt proqramlara köçürdüm. Heç vaxt düşünməzdim ki, tərtib edilmiş formada bir keçid... hal ifadəsi bir neçə if...else ifadəsindən daha çox yer tutur. Dəyişənlərin düzgün elan edilməsi də yerə qənaət edir. Uzun massiv elan etsəniz, baytla əldə etmək olduqca mümkün olsa da, yaddaşın aşılması massivin ölçüsündən asılı olaraq 500 bayta çatır. Proqram yazarkən bu barədə düşünmürsən və yalnız sonra proqramı təhlil edəndə bəzi şeyləri səhv etdiyini başa düşürsən və kodu optimallaşdırmağa başlayırsan. Proqramın ölçüsü ilə bağlı problemlər həll edildikdən sonra RAM məhdudiyyəti ilə qarşılaşdım. Bu, proqramın yükləndikdən sonra donmağa başlaması ilə ifadə edildi. Mən pulsuz RAM hesablanması üçün bir alt proqram təqdim etməli oldum. Nəticədə, bir hava proqnozu alqoritmini tərk etmək məcburiyyətində qaldım, çünki o, ekranda nişanlar göstərməlidir. Alqoritmin özü işləyir, lakin nişanların çıxışı qeyd edilməli idi. Kodun optimallaşdırılması ilə bağlı hələ də fikirlərim var, lakin yaxın gələcəkdə onun performansını qiymətləndirmək və bütün səhvləri müəyyən etmək üçün cihazı olduğu kimi işlək vəziyyətdə qoyacağam.

İndi bəzi nəticələr
Minuslar
1) Qiymət. Bu dezavantajın əsas səbəbi, hobbinin heç vaxt ucuz olmamasıdır.

pros
1) Cihazın böyük funksionallığı
2) Artan funksiyalar yalnız istifadə olunan nəzarətçi və öz istəyinizlə məhdudlaşır
3) Nəhayət ki, bu cihazı yığıb başa çatdırmağımdan düşünməkdən estetik həzz və mənəvi məmnunluq

+85 almağı planlaşdırıram Seçilmişlərə əlavə et Rəyi bəyəndim +137 +304

Arduino UNO-da sistemin ayrı-ayrı hissələrini sınaqdan keçirdim. Bunlar. ESP modulunu uno-ya qoşdum və onu öyrəndim, ayırdım, sonra nRF24-ə qoşuldum və s. Pəncərə sensorunun son tətbiqi üçün mən Uno-ya ən yaxın miniatür kimi Arduino Pro Mini seçdim.



Enerji istehlakı baxımından Arduino Pro Mini də yaxşı görünür:

  • özü çox "yeyən" USB-TTL çeviricisi yoxdur,
  • LED 10k rezistor vasitəsilə bağlanır.

Qabaqcıl enerji qənaəti üçün nəzərdə tutulmuşdur:

  • Arduino Pro Mini-də LED - güc göstəricisini çıxarın (təəssüfləndim, lövhəyə zərər vermədim)
  • və ya Atmel ATmega328 mikroprosessorunda "çılpaq" montajdan istifadə edin (istifadə etmədi)
  • Low Power Library və ya JeeLib istifadə edin.

Aşağı Güclü Kitabxana seçdiyim kitabxanalardan sadədir və yalnız lazım olanı ehtiva edir.


Mərkəzi blok üçün ona çoxsaylı periferik qurğuların qoşulması planlaşdırıldığı üçün Arduino Mega lövhəsi seçildi. Bundan əlavə, UNO ilə tam uyğundur və daha çox yaddaşa malikdir. İrəliyə baxaraq deyəcəm ki, bu seçim tamamilə haqlı idi.


Arduino Mega-nı təxminən 8 dollara ala bilərsiniz.

Enerji və Enerji İstehlakı

İndi güc və enerji istehlakı haqqında.


Arduino Pro Mini iki növdə təqdim olunur:

  • təchizatı gərginliyi 5V və tezliyi 16MHz üçün
  • 3.3V təchizatı gərginliyi və 8MHz tezliyi üçün.

nRF24L01+ radio modulu enerji təchizatı üçün 3,3 V tələb etdiyinə və burada sürət vacib olmadığına görə 8 MHz və 3,3 V olan Arduino Pro Mini alın.


Bu halda, Arduino Pro Mini-nin təchizatı gərginliyi diapazonu:

  • 3.3V model üçün 3.35-12V
  • 5V modeli üçün 5-12V.

Artıq 5V-də Arduino Pro Minim var idi, ona görə də ondan istifadə etdim. Arduino Pro Mini-ni təxminən 4 dollara ala bilərsiniz.


Mərkəzi blok 12 V, 450 mA, 5 Vt çıxışı təmin edən kiçik enerji təchizatı vasitəsilə 220 V şəbəkədən qidalanacaq. Bunu 5 dollara bəyənin. Ayrı bir 5V pin də var.



Və bu kifayət deyilsə, daha güclü bir şey quraşdıra bilərsiniz. Başqa sözlə, mərkəzi blok üçün enerji qənaətinin çox mənası yoxdur. Ancaq uzaq simsiz sensor üçün enerjiyə qənaət ən vacib hissədir. Amma mən də funksionallığı itirmək istəməzdim.


Beləliklə, Arduino Pro Mini və nRF24 radio modulu bir dəstə 4 Ni-Mh batareya ilə təchiz ediləcək.


Və xatırlayın müasir batareyanın maksimum tutumu təxminən 2500-2700 mAh, başqa hər şey ya marketinq hiylələri (Ansmann 2850) və ya aldatmadır (UltraFire 3500).


Mən bir neçə səbəbə görə Li-Ion batareyalardan istifadə etmirəm:

  • çox bahalı
  • ətraf mühitin temperaturu 0°C-dən aşağı düşəndə ​​litium-ion batareyanın gücü 40-50%-ə qədər azalır.
  • ucuz olanlar qorunmadan istehsal olunur və təhlükəlidir (qısaqapanma və ya boşalma zamanı partlaya və yandıra bilər, YouTube-da bir dəstə videoya baxın)
  • onlar qocalır, hətta istifadə edilməsələr də (lakin bunu bütün kimyəvi elementlər haqqında demək olar), 2 ildən sonra Li-Ion batareya tutumunun təxminən 20%-ni itirir.

Prototip üçün yüksək keyfiyyətli Ni-MH AA və ya AAA batareyaları ilə əldə etmək olduqca mümkündür. Üstəlik, bizə böyük cərəyanlar lazım deyil. Ni-MH batareyalarının yeganə dezavantajı onların uzun doldurulma müddətidir.

Meteoroloji stansiyanın ümumi diaqramı

Gəlin ümumiləşdirək. Bütün bunların necə işlədiyinə dair ümumi diaqram budur.



Ardı var.

Teqlər: Teqlər əlavə edin

Əksər işləyən insanlar kimi, öz layihələrinizi həyata keçirmək sizə qalan boş vaxtınızı alır. Ona görə də uzun müddətdir heç nə yaratmırdım və nəsə etmək üçün qaşınırdım. Qəribədir ki, bu fürsət universitetdə yaranıb. Pəncərədən kənarda sentyabr, 4-cü il və dövrə dizaynı üzrə qarşıdan gələn kurs işi. Bizə dedilər ki, kurs işləri iki variantda edilə bilər: kağız və aparat.

5 ildir ki, universitetimizdə kağız kurs işləri “köhnələri götür, bir yerə yığ” prinsipi ilə aparılırdı. Bu yanaşma rutinliyinə görə mənə uyğun gəlmədi, ona görə də dərhal hardware üzrə kurs işini seçdim. Arduino mikrokontrolleri öyrənmə asanlığına görə kurs işinin ürəyi kimi təklif edilmişdir. Kurs işinin növünü təyin etdikdən sonra daha bir sual qaldı: dəqiq nə etmək lazımdır. Mikrokontrollerlərin proqramlaşdırılmasında təcrübəm olmadığı üçün dərhal Google-u açdım və mövcud layihələri öyrənməyə başladım. Bir çox layihələr var, bəziləri olduqca sadədir, bəziləri dahiyanədir (məsələn, 3D skaner), lakin böyük əksəriyyətin praktik tətbiqi yox idi. Mən sadəcə rəfdə uzanıb toz yığmayacaq bir şey istədim. Arduino dünyasına yarım saatlıq ekskursiyadan sonra ev hava stansiyaları mövzusu ilə maraqlandım və layihələri həyata keçirmək çox da çətin görünmürdü (bu, əsasən yeni gələnləri cəlb etdi).

Kurs işi üçün mövzu belə seçildi və zaman keçdikcə heç bir problem görünmədi.

Komponent seçimi

Müxtəlif layihələri nəzərdən keçirərkən başa düşdüm ki, mənim üçün bir Nano və ya hətta Pro Mini kifayətdir, amma yenə də Arduino Uno-nu seçdim ki, Arduino üçün proqramlaşdırmanı istərdim və gələcəkdə bir neçə başqa layihələr həyata keçirəcəm. Əvvəllər heç vaxt əlimdə lehimləmə dəmiri tutmamışdım, ona görə də daha asan inkişaf üçün Sensor Shield v4 almaq qərarına gəldim.

Daha ətraflı

Lövhə sensorların, modulların, servo mühərriklərin, Serial və I2C interfeyslərinin sürətli qoşulmasını asanlaşdırır, həmçinin Duemilanova/Uno forma faktorunun nəzarətçisinin bütün portlarını göstərir (həmçinin meqa seriyaya qoşula bilər, lakin məhdudiyyətlər və sonrakı nəticələrlə) . Üstündəki digər qalxanları dəstəkləyir.


Meteoroloji məlumat üçün mənbə kimi aşağıdakı sensorları seçdim:


Sensorlara qərar verdim. Bəs sensorlardan gələn məlumatlarla nə etməli? Mən onu nümayiş etdirmək qərarına gəldim. Rəngli bir şəkil istədim, ona görə də dərhal monoxrom həlləri atdım. Bir neçə dəqiqəlik axtarışdan sonra ST7735 1,8 düymlük TFT displey seçildi.

Daha ətraflı

Displey rabitə üçün 4 telli SPI protokolundan istifadə etdiyindən və öz piksel ünvanlı çərçivə tamponuna malik olduğundan, o, istənilən növ mikrokontroller ilə istifadə edilə bilər. 1,8 düymlük displey 128x160 rəngli pikselə malikdir. Bir microSD kart yuvası da var, buna görə də siz FAT16/FAT32 microSD kart fayl sistemindən tam rəngli bitmap şəkillərini asanlıqla yükləyə bilərsiniz.

Xüsusiyyətlər:

  • Ekran diaqonalı - 1,8 düym, təsvir ölçüsü 128x160 piksel, 18 bit rəngli (262,144 rəng)
  • Video yaddaş buferinin daxili piksel ünvanlanması ilə nəzarətçi
  • Daxili microSD yuvası - 2-dən çox rəqəmsal xəttdən istifadə edir
  • 3.3 və 5V ilə uyğun gəlir
  • Ölçülər: 34 mm x 56 mm x 6,5 m


Arduino Controller Proqramlaşdırma

Meteoroloji stansiyanın komponentləri haqqında qərar qəbul etdikdən sonra nəzarətçini proqramlaşdırmağa başlayacağıq. Arduino IDE, Arduino proqram təminatını yandırmaq üçün istifadə edilmişdir. Adafruit kitabxanalarından da istifadə olunur.

Eskizə keçməzdən əvvəl funksionallığa nəzər salaq:

  • Hər 10 saniyədə sensorlardan oxunuşlar alınır və yalnız əvvəlki ölçmə ilə müqayisədə dəyişmiş göstəricilər ekranda yenilənir.
  • COM portu vasitəsilə məlumatların ötürülməsi həyata keçirilir

Eskiz

#daxildir // I2C cihazları ilə ünsiyyət üçün kitabxana #include // Bütün sensorlar üçün əsas kitabxana #include // BMP180 #include üçün kitabxana // Əsas qrafik kitabxana #include // Aparat üçün xüsusi kitabxana #include // SPI cihazları ilə əlaqə üçün kitabxana #daxil edin "dht.h" // DHT üçün kitabxana #müəyyən edin DHT22_PIN 2 // DHT22 məlumat pinini 2 rəqəmsal pinlə birləşdirin #TFT_CS 10-u təyin edin // TFT-nin CS pinini 10 rəqəmsal pinə birləşdirin #define TFT_RST 9 // TFT-nin RST pinini 9 rəqəmsal pinə birləşdirin // siz bunu Arduino resetinə də qoşa bilərsiniz // bu halda bu #define pinini 0-a təyin edin! #TFT_DC 8 təyin edin // TFT-nin DC pinini 8 rəqəmsal pinə birləşdirin Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //TFT-ni işə salın #TFT_SCLK 13-ü təyin edin // TFT-nin SCLK pinini 13 rəqəmsal pinə birləşdirin #TFT_MOSI 11-i təyin edin // TFT-nin MOSI pinini 11 rəqəmsal pin dht DHT-yə qoşun; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); //BMP180-i işə salın int bmpFlag = 0; struct ( uint32_t cəmi; 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); // dht statusu etibarsız quraşdırma(void) üçün struktur ( Serial.begin(9600); Serial.println("Meteo Test"); Serial.println(""); if(!bmp.begin()) // əlaqəni yoxlayın BMP180 üçün ( Serial.print("Oooop, BMP180 aşkarlanmadı ... Naqillərinizi və ya I2C ADDR-ni yoxlayın!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB // TFT-ni işə salın və qara rəngli tft.fillScreen ilə doldurun); (ST7735_BLACK); tft.setRotation() + 1); oldPressure = 0, oldDHTRümidlik = 0, oldDHTTemperature; bool wasUpdate = yalan; void loop(void) ( if(Serial.available() > 0) // bizdə verilənlər Serial portdur ( Serial.read(); // serial portdan baytı oxuyun və son ölçülmüş məlumatı göndərin printValue("Təzyiq", oldPressure , " hPa", false printValue("Temperature", oldTemperature, "C", false printValue("Hündürlük", oldAltitude, " m", false ("Rütubət", oldDHTHumidity, "%",); false printValue("DHT_temperature", oldDHTTemperature, " C", false ("END_TRANSMISSION" sensors_event_t hadisəsi (bmp.getEvent(&event)); // məlumat əldə edin; BMP180 əgər (hadisə.təzyiq) ( bmp.getTemperature(&temperature); float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA; hündürlük = bmp.pressureToAltitude(seaLevelPressure, hadisə.təzyiq, temperatur); ) else ( Serial.println(");")sensor xətası uint32_t start = micros(); int chk = DHT.read22(DHT22_PIN); // DHT22-dən məlumat alın uint32_t stop = micros(chk) // DHT22-nin vəziyyətini yoxlayın (hal DHTLIB_OK); ok++; fasilə; = 0 || !event.pressure) // məlumatı yeniləyin ( tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("HƏTƏ BMP BAŞLAMASI0", , "", true ) else ( if(event.pressure != oldPressure) ( tft.fillRect(0, 30, 160, 7, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED) ; printVal ("Pressure", event.pressure, " hPa", oldPressure = event.pressure; tft.setTextColor("Temperature"); " C", oldTemperature = temperatur; tft.fillRect(0, 46, 160, tft.setCursor(ST7735_BLUE); hündürlük, " m", true); wasUpdate = true; tft.setTextColor(ST7735_GREEN); printValue("Rütubət", DHT.rütubət, "%", doğru); oldDHThumidity = DHT.humidity; wasUpdate = doğrudur; ) if(DHT.temperature != oldDHTTemperature) ( tft.fillRect(0, 80, 160, 7, ST7735_BLACK); tft.setCursor(0, 80); tft.setTextColor(ST7735_YELLOW); printValue("DHT_temperature"",DHT_temperature temperatur, " C", true); oldDHTTemperature = DHT.temperature wasUpdate = true; gecikmə (10000); ) void printValue(char* başlıq, ikiqat dəyər, char* ölçü, bool tftPrint) ( if(tftPrint) // məlumatları TFT-də çap edin ( tft.print(title); tft.print(": "); tft.print( value tft.println(measure ) Serial.print(title) // Serial.print(");

Bədəni yığmağın vaxtı gəldi

Kurs işinin əsas şərti təqdim olunan formada işləyən prototip idi. Buna görə də, bir mənzil almalı və bir faylla silahlanmış, hər hansı bir şəkildə hava stansiyasını mənzilə daxil etməli oldum.

Korpus yerli radioelektronika mağazasından alınıb.

Çərçivə

(Şəkildəki korpus bir az fərqlidir. Şəffaf qapağım var)



Sonra bir fayldan istifadə edərək, sensorları çıxarmaq və enerji təchizatı üçün deşiklər edildi. Sensorları bayıra köçürmək qərarına gəldim, çünki sistemi korpussuz sınaqdan keçirərkən ekranın arxa hissəsinin çox qızdığını və bunun korpusun içindəki temperatura təsir edəcəyini gördüm.

Sensorlar və güc üçün açılışları olan korpus



Ayaqları 2 sensora lehimləməli olduğumdan və onlardan birində yolu yandırdığım üçün taleyi aldatmamağa və naqilləri sensorlara lehimləməməyə qərar verdim (başqa bir şey üzərində məşq edəcəm), ancaq əlaqə üçün az və ya çox etibarlı olmaq üçün elektrik lentini geri sarmağa qərar verdim.

Sistem korpusa "doldurulmadan" əvvəl



Korpus Arduino-dan çox böyük olduğu üçün (kiçik yox idi), lövhənin korpusun içərisində hərəkət etməməsi üçün bir dayaq tapmalı oldum. Həmçinin, köpükdən bir fiqur kəsildi və içərisində korpusun içini gizlətmək üçün ekran üçün düzbucaqlı var idi. Əlimdə superglue yox idi, ona görə də iki tərəfli lentdən istifadə etməli oldum.

Möcüzə-yuda balıq-balina



Qapağı bağlayın, gücə qoşun və gözləyin.

Binada meteoroloji stansiya tamamlandı



Nəticələri ekranda göstərdikdən sonra rütubətin ölçülməsində xoşagəlməz bir səhvi müəyyən edirik: DHT22 səylə 99,90% rəqəmi yaradır (1,00% olduqca nadirdir). Problemin nə olduğunu anlamağa başlayaq. Etdiyimiz ilk şey dəyərlərin COM portuna çıxışına baxmaqdır. Yaxşı hiss olunur. Korpusun bir neçə dəfə doldurulması, sökülməsi və yenidən yığılmasından sonra ağlına Google-da cavab axtarmaq fikri gəlir. Gözlənildiyi kimi, rusiyalı Google faydalı heç nə deməyib. TAMAM. Biz ingilis dilində axtarışa başlayırıq və forumların birində oxşar problemi olan uşaqlarla rastlaşırıq. İlk dörd müzakirə səhifəsi faydalı heç nə vermir, lakin beşinci səhifədə sualımızın cavabını tapırıq:
Rütubət sensorları səhv qazlardan və ya yüksək rütubətli IIRC-yə çox uzun müddət məruz qalmadan asanlıqla təsirlənə bilər. Məlumat vərəqində sensoru necə “sıfırlamaq” proseduru var, siz cəhd edə bilərsiniz.

Qalan yeganə sual DHT22-ni nə vaxt və necə zədələyə bildiyim idi. Amma kurs işinin vaxtı yaxınlaşırdı və mən bu problemin həllini sonraya buraxdım.

Son söz

Kurs işi keçdi. Universitetdəki bütün tullantılar bağlanana qədər meteoroloji stansiya qeyri-müəyyən müddətə təxirə salınıb. Bununla belə, meteostansiyaya düşündüyümdən tez qayıtmalı olduq. Elə oldu ki, noyabrın ortalarında iş yerimi dəyişdim və yeni komandada Arduino platforması və s. ilə maraqlanan insanlarla tanış oldum. Ona görə də soyumağa vaxt tapmadan bu platformaya marağım yenidən alovlandı. Meteoroloji stansiyamı çıxardım, kompüterə qoşdum və COM portu vasitəsilə Arduino-dan məlumat ötürülməsini həyata keçirdiyimi xatırladım. Və sonra mənə Arduino-dan COM portu vasitəsilə məlumatları qəbul edən və bu məlumatları ictimai monitorinqə ötürən bir proqram yazmaq fikri gəldi.
  • Arduino
  • Teqlər əlavə edinƏksər işləyən insanlar kimi, öz layihələrinizi həyata keçirmək sizə qalan boş vaxtınızı alır. Ona görə də uzun müddətdir heç nə yaratmırdım və nəsə etmək üçün qaşınırdım. Qəribədir ki, bu fürsət universitetdə yaranıb. Pəncərədən kənarda sentyabr, 4-cü il və dövrə dizaynı üzrə qarşıdan gələn kurs işi. Bizə dedilər ki, kurs işləri iki variantda edilə bilər: kağız və aparat.

    5 ildir ki, universitetimizdə kağız kurs işləri “köhnələri götür, bir yerə yığ” prinsipi ilə aparılırdı. Bu yanaşma rutinliyinə görə mənə uyğun gəlmədi, ona görə də dərhal hardware üzrə kurs işini seçdim. Arduino mikrokontrolleri öyrənmə asanlığına görə kurs işinin ürəyi kimi təklif edilmişdir. Kurs işinin növünü təyin etdikdən sonra daha bir sual qaldı: dəqiq nə etmək lazımdır. Mikrokontrollerlərin proqramlaşdırılmasında təcrübəm olmadığı üçün dərhal Google-u açdım və mövcud layihələri öyrənməyə başladım. Bir çox layihələr var, bəziləri olduqca sadədir, bəziləri dahiyanədir (məsələn, 3D skaner), lakin böyük əksəriyyətin praktik tətbiqi yox idi. Mən sadəcə rəfdə uzanıb toz yığmayacaq bir şey istədim. Arduino dünyasına yarım saatlıq ekskursiyadan sonra ev hava stansiyaları mövzusu ilə maraqlandım və layihələri həyata keçirmək çox da çətin görünmürdü (bu, əsasən yeni gələnləri cəlb etdi).

    Kurs işi üçün mövzu belə seçildi və zaman keçdikcə heç bir problem görünmədi.

    Komponent seçimi

    Müxtəlif layihələri nəzərdən keçirərkən başa düşdüm ki, mənim üçün bir Nano və ya hətta Pro Mini kifayətdir, amma yenə də Arduino Uno-nu seçdim ki, Arduino üçün proqramlaşdırmanı istərdim və gələcəkdə bir neçə başqa layihələr həyata keçirəcəm. Əvvəllər heç vaxt əlimdə lehimləmə dəmiri tutmamışdım, ona görə də daha asan inkişaf üçün Sensor Shield v4 almaq qərarına gəldim.

    Daha ətraflı

    Lövhə sensorların, modulların, servo mühərriklərin, Serial və I2C interfeyslərinin sürətli qoşulmasını asanlaşdırır, həmçinin Duemilanova/Uno forma faktorunun nəzarətçisinin bütün portlarını göstərir (həmçinin meqa seriyaya qoşula bilər, lakin məhdudiyyətlər və sonrakı nəticələrlə) . Üstündəki digər qalxanları dəstəkləyir.


    Meteoroloji məlumat üçün mənbə kimi aşağıdakı sensorları seçdim:


    Sensorlara qərar verdim. Bəs sensorlardan gələn məlumatlarla nə etməli? Mən onu nümayiş etdirmək qərarına gəldim. Rəngli bir şəkil istədim, ona görə də dərhal monoxrom həlləri atdım. Bir neçə dəqiqəlik axtarışdan sonra ST7735 1,8 düymlük TFT displey seçildi.

    Daha ətraflı

    Displey rabitə üçün 4 telli SPI protokolundan istifadə etdiyindən və öz piksel ünvanlı çərçivə tamponuna malik olduğundan, o, istənilən növ mikrokontroller ilə istifadə edilə bilər. 1,8 düymlük displey 128x160 rəngli pikselə malikdir. Bir microSD kart yuvası da var, buna görə də siz FAT16/FAT32 microSD kart fayl sistemindən tam rəngli bitmap şəkillərini asanlıqla yükləyə bilərsiniz.

    Xüsusiyyətlər:

    • Ekran diaqonalı - 1,8 düym, təsvir ölçüsü 128x160 piksel, 18 bit rəngli (262,144 rəng)
    • Video yaddaş buferinin daxili piksel ünvanlanması ilə nəzarətçi
    • Daxili microSD yuvası - 2-dən çox rəqəmsal xəttdən istifadə edir
    • 3.3 və 5V ilə uyğun gəlir
    • Ölçülər: 34 mm x 56 mm x 6,5 m


    Arduino Controller Proqramlaşdırma

    Meteoroloji stansiyanın komponentləri haqqında qərar qəbul etdikdən sonra nəzarətçini proqramlaşdırmağa başlayacağıq. Arduino IDE, Arduino proqram təminatını yandırmaq üçün istifadə edilmişdir. Adafruit kitabxanalarından da istifadə olunur.

    Eskizə keçməzdən əvvəl funksionallığa nəzər salaq:

    • Hər 10 saniyədə sensorlardan oxunuşlar alınır və yalnız əvvəlki ölçmə ilə müqayisədə dəyişmiş göstəricilər ekranda yenilənir.
    • COM portu vasitəsilə məlumatların ötürülməsi həyata keçirilir

    Eskiz

    #daxildir // I2C cihazları ilə ünsiyyət üçün kitabxana #include // Bütün sensorlar üçün əsas kitabxana #include // BMP180 #include üçün kitabxana // Əsas qrafik kitabxana #include // Aparat üçün xüsusi kitabxana #include // SPI cihazları ilə əlaqə üçün kitabxana #daxil edin "dht.h" // DHT üçün kitabxana #müəyyən edin DHT22_PIN 2 // DHT22 məlumat pinini 2 rəqəmsal pinlə birləşdirin #TFT_CS 10-u təyin edin // TFT-nin CS pinini 10 rəqəmsal pinə birləşdirin #define TFT_RST 9 // TFT-nin RST pinini 9 rəqəmsal pinə birləşdirin // siz bunu Arduino resetinə də qoşa bilərsiniz // bu halda bu #define pinini 0-a təyin edin! #TFT_DC 8 təyin edin // TFT-nin DC pinini 8 rəqəmsal pinə birləşdirin Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //TFT-ni işə salın #TFT_SCLK 13-ü təyin edin // TFT-nin SCLK pinini 13 rəqəmsal pinə birləşdirin #TFT_MOSI 11-i təyin edin // TFT-nin MOSI pinini 11 rəqəmsal pin dht DHT-yə qoşun; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); //BMP180-i işə salın int bmpFlag = 0; struct ( uint32_t cəmi; 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); // dht statusu etibarsız quraşdırma(void) üçün struktur ( Serial.begin(9600); Serial.println("Meteo Test"); Serial.println(""); if(!bmp.begin()) // əlaqəni yoxlayın BMP180 üçün ( Serial.print("Oooop, BMP180 aşkarlanmadı ... Naqillərinizi və ya I2C ADDR-ni yoxlayın!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB // TFT-ni işə salın və qara rəngli tft.fillScreen ilə doldurun); (ST7735_BLACK); tft.setRotation() + 1); oldPressure = 0, oldDHTRümidlik = 0, oldDHTTemperature; bool wasUpdate = yalan; void loop(void) ( if(Serial.available() > 0) // bizdə verilənlər Serial portdur ( Serial.read(); // serial portdan baytı oxuyun və son ölçülmüş məlumatı göndərin printValue("Təzyiq", oldPressure , " hPa", false printValue("Temperature", oldTemperature, "C", false printValue("Hündürlük", oldAltitude, " m", false ("Rütubət", oldDHTHumidity, "%",); false printValue("DHT_temperature", oldDHTTemperature, " C", false ("END_TRANSMISSION" sensors_event_t hadisəsi (bmp.getEvent(&event)); // məlumat əldə edin; BMP180 əgər (hadisə.təzyiq) ( bmp.getTemperature(&temperature); float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA; hündürlük = bmp.pressureToAltitude(seaLevelPressure, hadisə.təzyiq, temperatur); ) else ( Serial.println(");")sensor xətası uint32_t start = micros(); int chk = DHT.read22(DHT22_PIN); // DHT22-dən məlumat alın uint32_t stop = micros(chk) // DHT22-nin vəziyyətini yoxlayın (hal DHTLIB_OK); ok++; fasilə; = 0 || !event.pressure) // məlumatı yeniləyin ( tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("HƏTƏ BMP BAŞLAMASI0", , "", true ) else ( if(event.pressure != oldPressure) ( tft.fillRect(0, 30, 160, 7, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED) ; printVal ("Pressure", event.pressure, " hPa", oldPressure = event.pressure; tft.setTextColor("Temperature"); " C", oldTemperature = temperatur; tft.fillRect(0, 46, 160, tft.setCursor(ST7735_BLUE); hündürlük, " m", true); wasUpdate = true; tft.setTextColor(ST7735_GREEN); printValue("Rütubət", DHT.rütubət, "%", doğru); oldDHThumidity = DHT.humidity; wasUpdate = doğrudur; ) if(DHT.temperature != oldDHTTemperature) ( tft.fillRect(0, 80, 160, 7, ST7735_BLACK); tft.setCursor(0, 80); tft.setTextColor(ST7735_YELLOW); printValue("DHT_temperature"",DHT_temperature temperatur, " C", true); oldDHTTemperature = DHT.temperature wasUpdate = true; gecikmə (10000); ) void printValue(char* başlıq, ikiqat dəyər, char* ölçü, bool tftPrint) ( if(tftPrint) // məlumatları TFT-də çap edin ( tft.print(title); tft.print(": "); tft.print( value tft.println(measure ) Serial.print(title) // Serial.print(");

    Bədəni yığmağın vaxtı gəldi

    Kurs işinin əsas şərti təqdim olunan formada işləyən prototip idi. Buna görə də, bir mənzil almalı və bir faylla silahlanmış, hər hansı bir şəkildə hava stansiyasını mənzilə daxil etməli oldum.

    Korpus yerli radioelektronika mağazasından alınıb.

    Çərçivə

    (Şəkildəki korpus bir az fərqlidir. Şəffaf qapağım var)



    Sonra bir fayldan istifadə edərək, sensorları çıxarmaq və enerji təchizatı üçün deşiklər edildi. Sensorları bayıra köçürmək qərarına gəldim, çünki sistemi korpussuz sınaqdan keçirərkən ekranın arxa hissəsinin çox qızdığını və bunun korpusun içindəki temperatura təsir edəcəyini gördüm.

    Sensorlar və güc üçün açılışları olan korpus



    Ayaqları 2 sensora lehimləməli olduğumdan və onlardan birində yolu yandırdığım üçün taleyi aldatmamağa və naqilləri sensorlara lehimləməməyə qərar verdim (başqa bir şey üzərində məşq edəcəm), ancaq əlaqə üçün az və ya çox etibarlı olmaq üçün elektrik lentini geri sarmağa qərar verdim.

    Sistem korpusa "doldurulmadan" əvvəl



    Korpus Arduino-dan çox böyük olduğu üçün (kiçik yox idi), lövhənin korpusun içərisində hərəkət etməməsi üçün bir dayaq tapmalı oldum. Həmçinin, köpükdən bir fiqur kəsildi və içərisində korpusun içini gizlətmək üçün ekran üçün düzbucaqlı var idi. Əlimdə superglue yox idi, ona görə də iki tərəfli lentdən istifadə etməli oldum.

    Möcüzə-yuda balıq-balina



    Qapağı bağlayın, gücə qoşun və gözləyin.

    Binada meteoroloji stansiya tamamlandı



    Nəticələri ekranda göstərdikdən sonra rütubətin ölçülməsində xoşagəlməz bir səhvi müəyyən edirik: DHT22 səylə 99,90% rəqəmi yaradır (1,00% olduqca nadirdir). Problemin nə olduğunu anlamağa başlayaq. Etdiyimiz ilk şey dəyərlərin COM portuna çıxışına baxmaqdır. Yaxşı hiss olunur. Korpusun bir neçə dəfə doldurulması, sökülməsi və yenidən yığılmasından sonra ağlına Google-da cavab axtarmaq fikri gəlir. Gözlənildiyi kimi, rusiyalı Google faydalı heç nə deməyib. TAMAM. Biz ingilis dilində axtarışa başlayırıq və forumların birində oxşar problemi olan uşaqlarla rastlaşırıq. İlk dörd müzakirə səhifəsi faydalı heç nə vermir, lakin beşinci səhifədə sualımızın cavabını tapırıq:
    Rütubət sensorları səhv qazlardan və ya yüksək rütubətli IIRC-yə çox uzun müddət məruz qalmadan asanlıqla təsirlənə bilər. Məlumat vərəqində sensoru necə “sıfırlamaq” proseduru var, siz cəhd edə bilərsiniz.

    Qalan yeganə sual DHT22-ni nə vaxt və necə zədələyə bildiyim idi. Amma kurs işinin vaxtı yaxınlaşırdı və mən bu problemin həllini sonraya buraxdım.

    Son söz

    Kurs işi keçdi. Universitetdəki bütün tullantılar bağlanana qədər meteoroloji stansiya qeyri-müəyyən müddətə təxirə salınıb. Ancaq meteostansiyaya düşündüyümdən tez qayıtmalı olduq. Elə oldu ki, noyabrın ortalarında iş yerimi dəyişdim və yeni komandada Arduino platforması və s. ilə maraqlanan insanlarla tanış oldum. Ona görə də soyumağa vaxt tapmadan bu platformaya marağım yenidən alovlandı. Meteoroloji stansiyamı çıxardım, kompüterə qoşdum və COM portu vasitəsilə Arduino-dan məlumat ötürülməsini həyata keçirdiyimi xatırladım. Sonra Arduino-dan COM portu vasitəsilə məlumatları qəbul edən və bu məlumatları ictimai monitorinqə ötürən bir proqram yazmaq fikri ağlıma gəldi, lakin bu, tamamilə fərqli bir hekayədir.

    Mən də simsiz sensorlara sahib olmaq istərdim və hələ də Arduino Pro Mini-də bir hava stansiyası tətbiq etmək istərdim. Buna görə də mən 3.3V enerji təchizatı ilə 4 Arduino Pro Mini, 4 nRF24L01+ radio modulu və bəzi əlavə sensorlar sifariş etdim, bu barədə növbəti dəfə də danışmağa çalışacağam. Bu arada, bağlamanı gözləyirəm, məlumatların yenilənməsi vaxtını və məlumatların özünü microSD kartında saxlamaq üçün real vaxt rejimində saatın qoşulmasını həyata keçirmək planları var. COM portu vasitəsilə müştəri.

    Saytın inkişafı üçün bəzi vəsaitləri köçürə və kömək edə bilərsiniz