Tworzenie stacji pogodowej na Arduino z lokalnym serwerem. Bezprzewodowa stacja pogodowa

Stacja pogodowa DIY.

Był wieczór, po Nowym Roku nie było nic do roboty. Jak zwykle podczas zimowych wakacji sylwestrowych chcę zająć głowę i ręce czymś pożytecznym i kreatywnym. Podczas świąt noworocznych postanowiłem własnoręcznie zrobić stację pogodową. Zacząłem przygotowania z wyprzedzeniem, kupiłem i zmontowałem wszystkie komponenty przed Nowym Rokiem, a główne programowanie zrobiłem w czasie wakacji.

(pod wycięciem jest mnóstwo zdjęć!)

Najpierw omówię komponenty; nie podam linków, ponieważ produkty w serwisie eBay (na moim koncie osobistym) zostały zarchiwizowane. Wiele komponentów kupiłem spokojnie na eBayu. Po raz pierwszy próbowałem aukcji; wcześniej zawsze kupowałem „kup teraz”. Cóż mogę powiedzieć, jeśli nie spieszysz się z zakupami, niektóre komponenty możesz kupić taniej (różnica jest czasami dwukrotnie większa).

Czujnik ciśnienia VMR085
To jest główny czujnik. Kiedy zobaczyłem to w serwisie eBay, wiedziałem, że chcę zbudować domową stację pogodową.
Czujnik przyszedł w zwykłej kopercie, wewnątrz owiniętej folią bąbelkową.

Wewnątrz koperty znajdowała się wizytówka sprzedawcy oraz czujnik, zapakowane w torbę antystatyczną i owinięte w kolejną warstwę folii bąbelkowej.

Torbę antystatyczną zamknięto tak, aby wilgoć podczas lotu nie zagrażała czujnikowi

Wyciągamy czujnik. Z jednej strony znajduje się wlutowana linia styków, które włożono w piankę, aby zapobiec ich wygięciu. Z drugiej strony znajduje się sam czujnik i oznaczenia styków.




Wszystko byłoby dobrze, ale oznaczenia styków są naniesione w odbiciu lustrzanym.
Czujnik podłączany jest poprzez magistralę I2C i zasilany jest napięciem 3,3 V. Czyli do normalnej pracy potrzebne są 4 przewody (+, -, SDA, SCL)
Możesz sprawdzić czujnik na 2 sposoby: albo poprzez bibliotekę, albo używając funkcji bezpośrednio na szkicu.
Przykładowy program:

#włączać

#define BMP085_ADDRESS 0x77 // Adres I2C BMP085

Stały znak bez znaku OSS = 0; // Ustawienie nadpróbkowania

// Wartości kalibracyjne
int ac1;
int ac2;
int ac3;
bez znaku int ac4;
bez znaku int ac5;
bez znaku int ac6;
int b1;
int b2;
intmb;
int mc;
int md;

Krótka temperatura;
długie ciśnienie;

Unieważnij konfigurację()
{
Serial.begin(9600);
Przewód.rozpocznij();
bmp085Kalibracja();
}

pusta pętla()
{
temperatura = bmp085GetTemperature(bmp085ReadUT());
ciśnienie = bmp085GetPressure(bmp085ReadUP());
Serial.print("Temperatura: „);
Druk seryjny (temperatura/10,0, grudzień);
Serial.println("C");
Serial.print("Ciśnienie: „);
Druk seryjny (ciśnienie/133,322, grudzień);
Serial.println(„mm Hg”);
Numer seryjny.println();
opóźnienie (1000);
}

Unieważnij kalibrację bmp085()
{
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);
}

Krótki bmp085GetTemperature(unsigned int ut)
{
długie x1, x2;
x1 = (((długi)ut - (długi)ac6)*(długi)ac5) >> 15;
x2 = ((długi)mc<< 11)/(x1 + md);
b5 = x1 + x2;

Powrót ((b5 + 8)>>4);
}

Długie bmp085GetPressure (bez znaku, długie w górę)
{
długie x1, x2, x3, b3, b6, p;
bez znaku długie b4, b7;
b6 = b5 - 4000;
// Oblicz B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = ((((((długi)ac1)*4 + x3)<>2;
// Oblicz B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (długi bez znaku)(x3 + 32768))>>15;
b7 = ((długi bez znaku)(w górę - b3) * (50000>>OSS));
jeśli (b7< 0x80000000)
p = (b7<<1)/b4;
w przeciwnym razie
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;
zwróć p;
}

// Odczytaj 1 bajt z BMP085 pod „adresem”
char bmp085Read (adres bez znaku)
{
dane znakowe bez znaku;

Wire.write(adres);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
podczas(!Przewód.dostępny())
;
return Wire.read();
}

Int bmp085ReadInt (adres bez znaku)
{
unsigned char msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(adres);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
póki(Przewód.dostępny()<2)
;
msb = Wire.read();
lsb = Wire.read();
return (int) msb<<8 | lsb;
}

// Odczytaj nieskompensowaną wartość temperatury
bez znaku int bmp085ReadUT()
{
bez znaku int ut;
// Zapisz 0x2E do rejestru 0xF4
// Żąda odczytu temperatury
Wire.beginTransmission(BMP085_ADDRESS);
Przewód.zapis(0xF4);
Przewód.zapis(0x2E);
Wire.endTransmission();
// Poczekaj co najmniej 4,5 ms
opóźnienie(5);
// Odczytaj dwa bajty z rejestrów 0xF6 i 0xF7
ut = bmp085ReadInt(0xF6);
zwróć;
}

// Odczytaj wartość nieskompensowanego ciśnienia
długi bez znaku bmp085ReadUP()
{
unsigned char msb, lsb, xlsb;
bez znaku, długi w górę = 0;
// Zapisz 0x34+(OSS<<6) into register 0xF4
// Żądanie odczytu ciśnienia z ustawieniem oversamplingu
Wire.beginTransmission(BMP085_ADDRESS);
Przewód.zapis(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// Poczekaj na konwersję, czas opóźnienia zależny od OSS
opóźnienie(2 + (3<// Odczyt rejestru 0xF6 (MSB), 0xF7 (LSB) i 0xF8 (XLSB)
Wire.beginTransmission(BMP085_ADDRESS);
Przewód.zapis(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Poczekaj, aż dane staną się dostępne
póki(Przewód.dostępny()< 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
up = (((długi bez znaku) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
wrócić;
}


Ponadto czujnik posiada własny czujnik termiczny do kompensacji ciśnienia i wysokościomierz

Arduino Nano v3.0
To serce całej stacji pogodowej. Mówiąc najprościej, kontroler jest miniaturowy.
kupiłem
Nie będę szczegółowo omawiał kontrolera, ponieważ zostało to już zrobione przede mną:


Pakiet Lightake został prefabrykowany, kontroler był w opakowaniu zawierającym kabel USB i Arduino w szczelnie zamkniętej torbie antystatycznej.

Aby oszacować rozmiar, umieściłem monetę 1 rubel obok Arduino.

Płyta kontrolera z bliska



Kabel USB jest dobry, z pierścieniem ferrytowym. Arduino zasilane jest poprzez kabel USB. Środowisko programistyczne można pobrać (strona pobierania). Język jest zbliżony do „C”, nie było problemów z jego opanowaniem, ponieważ dużo w nim programuję w pracy.

ekran LCD
W pracy znalazłem w śmietniku kompatybilny ekran LCD 1602. Musiałem majstrować przy połączeniu, ponieważ nie mogłem znaleźć jego arkusza danych. W rezultacie wyświetlacz LCD zaczął działać.

Jednak po krótkim okresie użytkowania zauważyłem, że ten ekran mi nie wystarcza i nie da się wyświetlić większej ilości danych, bo ma tylko 2 linijki po 16 znaków każda. Na początku wydaje się, że te parametry wystarczą, ale kiedy zaczynasz programować, zdajesz sobie sprawę, że maksymalnie można wcisnąć 3-4 parametry. A jeśli utworzysz menu (myślałem o zrobieniu menu na tym ekranie), to pozostanie tylko 1-2 parametry.
W rezultacie zacząłem szukać innego ekranu. Na początku przyglądałem się uważnie ekranowi graficznemu Nokii 3310, a nawet brałem udział w aukcji na eBayu, żeby go kupić, ale nie wyszło (z czego bardzo się cieszę), więc musiałem z tego ekranu zrezygnować. Teraz rozumiem, że byłoby to za małe do moich celów, ponieważ jest z czym porównać.
Przeglądając losowo osłony Arduino, natknąłem się na ekran graficzny 12864 na kontrolerze ST7920. Ten ekran ma odpowiedni rozmiar i dobrą rozdzielczość dla moich potrzeb (128x64). Oznacza to, że można łatwo umieścić 6-7 wierszy po 20 znaków normalnie czytelną czcionką. Ponieważ ekran jest graficzny, oprócz tekstu, grafikę można umieścić różnymi czcionkami. Krótko mówiąc, właśnie tego potrzebowałem, wszystko było na tym ekranie, więc nie mogłem się powstrzymać i zamówiłem.
Przesyłka dotarła szybko i była standardowo zapakowana: koperta bąbelkowa, w środku kolejna warstwa folii bąbelkowej oraz screen w woreczku antystatycznym:






Aby oszacować rozmiar, umieściłem monetę 1 rubel obok wyświetlacza LCD.




Aby szybko podłączyć ekran do Arduino, przylutowałem linię styków do pinów LCD. Wyświetlacz LCD można podłączyć poprzez magistralę szeregową lub magistralę równoległą. Wybrałem pierwszą opcję, ponieważ wolnych kontaktów Arduino jest już niewiele.
Połączenie (pobrane z Internetu):

- Pin 1 (GND) jest podłączony do wspólnej magistrali
- Pin 2 (VCC) podłączony jest do szyny zasilającej +5V, a pobór prądu jest stosunkowo niewielki, a wyświetlacz można zasilać z wbudowanego stabilizatora Arduino.
- Piny 4, 5 i 6 łączą się z wyjściami cyfrowymi Arduino, tworząc interfejs szeregowy SPI:
pin 4 – (RS) – odpowiada linii CS (np. 7)
pin 5 – (RW) – odpowiada linii MOSI (np. 8)
pin 6 – (E) – odpowiada linii SCK (przykładowo 3)
Numery kontaktowe Arduino mogą być dowolne, najważniejsze jest, aby nie zapomnieć o ich prawidłowym wskazaniu w tekście programu podczas inicjalizacji wyświetlacza.
- Pin 15 (PSB) jest podłączony do wspólnej magistrali.
- Styki 19 (A) i 20 (K) to zasilanie podświetlenia (odpowiednio +5V i GND). Do regulacji jasności podświetlenia można zastosować rezystor zmienny 10 kOhm podłączony pomiędzy szyną zasilającą a GND. Napięcie z silnika jest podawane na pin 19 wyświetlacza.
Według tej instrukcji podłączyłem wszystko oprócz podświetlenia. Do zasilania podświetlenia użyłem Arduino PWM.
W celu programowego podłączenia LCD do Arduino wykorzystywana jest biblioteka u8glib. Możesz go pobrać. W przypadku problemów z pobieraniem mogę przesłać bibliotekę na stronę narod.ru.
Sama biblioteka nie jest skomplikowana i pozwala na wyświetlanie tekstu różnymi czcionkami, rysowanie linii, rysowanie prostych kształtów geometrycznych (prostokąt, koło), a także wyświetlanie własnych, specjalnie przygotowanych obrazów. W zasadzie to narzędzie jest wystarczające do większości zadań.
Oto wynik prostego programu:

Sam program:

#include „U8glib.h”

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

// Podprogram określający wolną pamięć
int wolna ramka() (
extern int __heap_start, *__brkval;
w telewizji;
return (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

Unieważnij konfigurację (unieważnij) (
u8g.setFont(u8g_font_6x10); // czcionka
u8g.setRot180(); //Odwróć ekran
analogZapisz(6, 115); // Ustaw jasność ekranu (anoda podświetlenia na 6 pinach)
}

Pusta pętla (pusta) (
u8g.pierwsza strona();
Do (

u8g.setPrintPos(1, 12); // pozycja
u8g.print("Witam!!!"); // tekst wyjściowy
u8g.drawBox(0,22,128,9); // Pomaluj prostokąt na biało
u8g.setColorIndex(0); // biały tusz, czarne tło
u8g.setPrintPos(1, 30); // pozycja
u8g.print("Słowo..."); // tekst wyjściowy

U8g.setColorIndex(1); // biały tusz, czarne tło
u8g.setPrintPos(1, 50); // pozycja
u8g.print("Po uruchomieniu ="); // tekst wyjściowy
u8g.setPrintPos(85, 50); // pozycja
u8g.print(millis() / 1000); // wypisz liczbę sekund po uruchomieniu
u8g.setPrintPos(1, 64); // pozycja
u8g.print(freeRam()); // wyświetla ilość zajętej pamięci
) podczas(u8g.nextPage());

Opóźnienie (200);
}

Zegar czasu rzeczywistego DS1307
Kolejny element mojej stacji pogodowej. Tarcza ta implementuje zegar czasu rzeczywistego. Zamówiłem je w serwisie eBay. Sprzedawca wysłał szalik do zegarka w nierealistycznie dużym pudełku


W pudełku znajdowały się dwa arkusze reklamowe formatu A4 i chusteczka do zegarka zawinięta w celofan


Chciałbym zauważyć, że opłata nie przekracza 2 rubli. moneta, a pudełko miało wymiary 13x15x5 cm.
Tablica została zapakowana w torbę antystatyczną

Szal z bliska



Musiałem pokombinować z tym modułem. Po pierwsze, były trudności z połączeniem. A po drugie, na tej płycie nie ma kwarcu. Gdybym wiedział, że tyle czasu spędzę nad modułem, to pewnie sam bym go złożył, bo w internecie pełno jest schematów. Najprostszy obwód zawiera 4-5 elementów.
Odnośnie połączenia. Znalazłem bibliotekę, która mówi, że interfejs I2C można podłączyć nie do zwykłych wejść analogowych Arduino (A4 i A5), ale do dowolnych dyskretnych. Zrobiłem tak jak było napisane. Na początku nic nie działało, ale po długim tańcu z tamburynem zegar ruszył. No cóż, pomyślałem, koniec problemów, jednak gdy próbowałem podłączyć ten sam moduł do innego Arduino, taniec z tamburynem trwał dalej. Spędziłem dużo czasu szukając rozwiązania tego problemu i prawie wszędzie wskazano albo nieprawidłowe połączenie, albo brak rezystorów podciągających na stykach SCL i SDA. Chciałem już dostać się do płytki lutownicą, ale na jednym z forów przypadkowo natknąłem się na kod, w którym było powiedziane, że należy podłączyć SCL i SDA do standardowych portów I2C w Arduino. Po standardowym połączeniu wszystko zadziałało od razu.
Teraz o kwarcu. Nie wiem, jaki kwarc Chińczycy tam wstawili, ale zegarki z takim kwarcem uciekały o 10-11 sekund na dobę. Ten błąd wynosi 5 minut miesięcznie i 1 godzinę rocznie. Taki zegarek jest niepotrzebny. Musiałem ponownie połączyć się z Internetem i poszukać sposobu naprawienia tego błędu. Pierwsze rozwiązanie, które się pojawia, mówi, że kwarc należy zmielić. Zrobiłem to - wynik był zerowy. Znalazłem też gdzieś, że muszę znaleźć starą płytę główną i wyjąć stamtąd kwarc zegara. Zrobiłem to - jest rezultat. Teraz zegar biegnie nie o 10-11 sekund, ale o 1,5 sekundy dziennie. Powiedzmy, że jest lepiej, ale daleko mu do ideału. Ponieważ nie mam już ochoty bawić się lutownicą, zdecydowano się na programową regulację zegara, czyli ustawianie zegara na wymaganą wartość raz dziennie. Po 10 dniach zegar przełączył się nie więcej niż o sekundę. Metoda jest dobra, ale tylko wtedy, gdy urządzenie synchronizujące Arduino jest podłączone do zasilania, w przeciwnym razie zegar działa na zasilaniu akumulatorowym i nadal ucieka.
Mały program testowy:

#include „Przewód.h”
#define DS1307_I2C_ADDRESS 0x68 // SDA A4, SCL A5

Bajt decToBcd (wartość bajtu)
{
zwrot ((val/10*16) + (val%10));
}

Bajt bcdToDec (wartość bajtu)
{
zwrot ((val/16*10) + (val%16));
}

Void setDateDs1307(bajt sekunda, // 0-59
bajt minuta, // 0-59
bajt godzina) // 0-99
{

Przewód.zapis(0);
Wire.write(decToBcd(sekunda));
Wire.write(decToBcd(minuta));
Wire.write(decToBcd(godzina));
Wire.endTransmission();
}

Unieważnij getDateDs1307(bajt * sekunda,
bajt *minuta,
bajt *godzina)
{

Wire.beginTransmission(DS1307_I2C_ADDRESS);
Przewód.zapis(0);
Wire.endTransmission();

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*sekunda = bcdToDec(Wire.read());
*minuta = bcdToDec(Wire.read());
*godzina = bcdToDec(Wire.read());
}

Unieważnij konfigurację()
{
bajt sekunda, minuta, godzina;
Przewód.rozpocznij();
Serial.begin(9600);

Drugi = 45;
minuta = 5;
godzina = 16;

SetDateDs1307(sekunda, minuta, godzina);
}

pusta pętla()
{
bajt sekunda, minuta, godzina;

GetDateDs1307(&sekunda, &minuta, &godzina);
Serial.print(godzina, grudzień);
Serial.print(":");
Serial.print (minuta, DEC);
Serial.print(":");
Serial.println(sekunda, DEC);

Opóźnienie (1000);
}


Biblioteka nie jest tutaj używana, a funkcje czasu odczytu i zapisu są obcięte.

Czujnik temperatury i wilgotności DHT11
O tym czujniku nie ma nic do powiedzenia. Nawet bym go nie używał, gdyby wilgotność nie była potrzebna. Niestety nie zrobiłem zdjęcia po otrzymaniu przesyłki, więc zdjęć nie będzie. Zdjęcia czujnika można zobaczyć poniżej, gdzie podłączyłem go do Arduino. Podłączenie czujnika jest proste (+, wyjście cyfrowe, -). Zazwyczaj czujniki są wykonane z czterema pinami. W tej obudowie trzeci pin nie jest do niczego podłączony.
Możesz użyć biblioteki, aby połączyć się z Arduino. Możesz go pobrać.
Mały program testowy z wyświetlaniem informacji na wyświetlaczu LCD 1602:

// dołącz kod biblioteki:
#włączać
#włączać

// Deklaracja obiektów
dht11 DHT11;
Wyświetlacz ciekłokrystaliczny (12, 11, 6, 5, 4, 3);

#zdefiniuj DHT11PIN 7
int i;

Unieważnij konfigurację()
{
lcd.begin(16, 2);
lcd.print("Stan: „);
ja=0;
}

pusta pętla()
{
int chk = DHT11.read(DHT11PIN);
lcd.setCursor(8, 0);
przełącznik (chk)
{
przypadek 0: lcd.print(“OK”); przerwa;// lcd.setCursor(11, 0); lcd.print(millis()/2000); przerwa;
przypadek -1: lcd.print(“Błąd sumy kontrolnej”); mErr(); przerwa;
przypadek -2: lcd.print("Błąd przekroczenia limitu czasu"); mErr(); przerwa;
domyślnie: lcd.print("Nieznany błąd"); mErr(); przerwa;
}
opóźnienie (500);
lcd.setCursor(15, 0);
przełącznik(i)
{
przypadek 0: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" ");przerwa;
przypadek 1: lcd.print("v"); lcd.setCursor(15, 1); lcd.print(" ");przerwa;
domyślnie: lcd.setCursor(15, 1); lcd.print("E"); przerwa;
}
i=i+1;
jeśli (i>1) i=0;
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd.print((float)DHT11.wilgotność, 0);
lcd.setCursor(4, 1);
lcd.print("%");
lcd.setCursor(8, 1);
lcd.print("T=");
lcd.setCursor(10, 1);
lcd.print((float)DHT11.temperatura, 0);
lcd.setCursor(12, 1);
lcd.print("C");

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


Czujnik ma pewne wady - dane z czujnika podawane są tylko w liczbach całkowitych, a zasięg jest słaby.

Zdaje się, że pisałem o wszystkich elementach. Pozostaje tylko zebrać wszystko w jedną całość.
Ups, prawie zapomniałem! Do złożenia urządzenia potrzebna jest obudowa. Zamówiłem również obudowę na Ebayu. Sprzedawca okazał się pochodzić z Anglii. Przesyłka dotarła szybko, jednak nie zrobiłam jej zdjęć. Wszystkie zdjęcia obudowy poniżej.

Najpierw zmontowałem wszystko na stole za pomocą specjalnego okablowania. Napisałem program testowy i wgrałem go do sterownika.



W rzeczywistości niebieski kolor podświetlenia jest znacznie jaśniejszy. Nawet przy minimalnej jasności (Jasny=5) ramka jest oświetlona.

Aby wszystko złożyć bezprzewodowo zdecydowano się na wykonanie mini płyty głównej, a na złączach umieszczono płytki Arduino i nakładki. Jeśli coś się stanie, można je szybko i łatwo usunąć. Postanowiłem także podłączyć do złączy ekran LCD i przyciski sterujące, jedynie po to, aby wlutować czujnik temperatury na przewody.
Tak wyszedł szalik



Na ostatnim zdjęciu nie do końca zmyłem topnik. Pod osłonki obok złączy wkleiłem porowatą gumę, żeby było chociaż jakieś podparcie. Chociaż faktycznie osłony w złączach na stykach trzymają się dobrze.

Płyta główna z zainstalowanymi nakładkami i płytką Arduino.

Tak wygląda kompletne połączenie z płytą główną


Zamiast przycisków zastosowałem domowej roboty tarczę wlutowaną na płytce stykowej. Jako guziki użyłem przycisków ze starych myszy.
Jak widać ilość przewodów uległa zmniejszeniu.

Głównym problemem umiejscowienia w etui jest wycięcie gładkiego rowka na ekran LCD. Bez względu na to, jak bardzo się starałem, nadal nie wyszło idealnie. Szczeliny w niektórych miejscach były nieco większe niż 1 mm. Aby wszystko wyglądało schludnie wziąłem czarny uszczelniacz akwariowy i wypełniłem wszystkie pęknięcia, jednocześnie przyklejając ten uszczelniacz do ekranu. Po wyschnięciu szczeliwa odciąłem nadmiar z zewnątrz. W jasnym świetle szczeliwo jest widoczne, ale w normalnym świetle wszystko łączy się z ciałem.
Tak wygląda obudowa od środka z zamontowanym ekranem LCD i płytą główną.

Tak to wygląda z zewnątrz w jasnym świetle (przepraszam za odciski palców, zauważyłem je sortując zdjęcia).

Długo zastanawiałem się, jak zmieścić przyciski w etui i co najważniejsze, jakich przycisków użyć…
W sklepach radioelektronicznych spodobał im się przycisk z długą szpilką i końcówkami pasującymi do tej szpilki. Przyciski te służą do przylutowania do płytki. Wszystko byłoby dobrze, ale mają minus - skok docisku jest bardzo mały i głośny.
Umieszczenie przycisków musieliśmy wykonać w dwóch etapach: pierwszy polegał na umieszczeniu przycisków na płytce, drugi polegał na zamontowaniu tej płytki na innej płytce. A potem włóż to wszystko do korpusu na prowadnicach.

Tak wygląda szalik z guzikami:



Tak wygląda tablica uchwytów:


Tutaj możesz zobaczyć prowadnice, w które wkładana jest tablica z przyciskami. Niektóre elementy zostały przylutowane w celu nadania płytce sztywności.

Teraz wkładamy wszystko do ciała
Bez przycisków łączących:


Z podłączeniem przycisku:

Zamknij obudowę i włącz ją. Wszystko działa świetnie, przyciski działają jak należy.

Na koniec wrzucam krótki filmik przedstawiający pracę urządzenia w różnych trybach:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
Dla tych, którzy nie widzieli tutaj filmu, poniżej znajduje się link do niego

Czas zakończyć recenzję.
Napiszę trochę o programie, a potem kilka krótkich wniosków. Pisząc program, nie sądziłem, że tak szybko osiągnę limit 30 720 bajtów.


Musiałem zoptymalizować kod. Wiele fragmentów kodu przeniosłem do podprogramów. Nigdy bym nie pomyślał, że instrukcja switch...case w postaci skompilowanej zajmuje więcej miejsca niż kilka instrukcji if...else. Prawidłowa deklaracja zmiennych również oszczędza miejsce. Jeśli zadeklarujesz długą tablicę, chociaż jest całkiem możliwe, aby uzyskać bajt, wówczas przepełnienie pamięci osiągnie 500 bajtów, w zależności od rozmiaru tablicy. Kiedy piszesz program, nie myślisz o tym, a dopiero później, analizując program, zdajesz sobie sprawę, że coś zrobiłeś źle i zaczynasz optymalizować kod. Po rozwiązaniu problemów z rozmiarem programu napotkałem ograniczenie pamięci RAM. Wyrażało się to w tym, że program zaczął się zawieszać po załadowaniu. Musiałem wprowadzić podprogram do obliczania wolnej pamięci RAM. W rezultacie byłem zmuszony porzucić jeden algorytm prognozowania pogody, ponieważ musi on wyświetlać ikony na ekranie. Sam algorytm działa, ale wynik działania ikon musiał zostać zarejestrowany. Wciąż mam pomysły, jak zoptymalizować kod, ale w najbliższej przyszłości pozostawię urządzenie uruchomione, aby ocenić jego wydajność i zidentyfikować wszystkie błędy.

Teraz kilka wniosków
Minusy
1) Cena. Uzasadnieniem tej wady jest to, że hobby nigdy nie jest tanie.

plusy
1) Świetna funkcjonalność urządzenia
2) Zwiększanie funkcji ograniczone jest jedynie zastosowanym kontrolerem i własnymi chęciami
3) Estetyczna przyjemność z kontemplacji i moralna satysfakcja z faktu, że w końcu udało mi się złożyć i skompletować to urządzenie

Planuję kupić +86 Dodaj do ulubionych Recenzja przypadła mi do gustu +137 +304

Któregoś dnia spacerując po mieście zauważyłem, że otwarto nowy sklep z elektroniką radiową. Po wejściu do niego znalazłem dużą liczbę nakładek dla Arduino, ponieważ... Miałem w domu Arduino Uno i Arduino Nano i od razu przyszedł mi do głowy pomysł zabawy z nadajnikami sygnału na odległość. Zdecydowałem się kupić najtańszy nadajnik i odbiornik na 433 MHz:

Nadajnik sygnału.


Odbiornik sygnału.

Po spisaniu prostego schematu transmisji danych (przykład wzięty stąd) okazało się, że urządzenia nadawcze mogą nadawać się do przesyłania prostych danych, takich jak temperatura, wilgotność.

Nadajnik ma następujące cechy:
1. Model: MX-FS - 03 V
2. Zasięg (w zależności od obecności obiektów blokujących): 20-200 metrów
3. Napięcie robocze: 3,5 -12 V
4. Wymiary modułu: 19*19 mm
5. Modulacja sygnału: AM
6. Moc nadajnika: 10mW
7. Częstotliwość: 433 MHz
8. Wymagana długość anteny zewnętrznej: 25cm
9. Łatwe podłączenie (tylko trzy przewody): DATA ; VCC ; Ziemia.

Charakterystyka modułu odbiorczego:
1. Napięcie robocze: DC 5 V
2. Prąd: 4mA
3. Częstotliwość robocza: 433,92 MHz
4. Czułość: - 105dB
5. Wymiary modułu: 30*14*7 mm
6. Wymagana antena zewnętrzna: 32 cm.

Internet podaje, że zasięg transmisji informacji przy prędkości 2Kb/s może sięgać nawet 150m. Sam tego nie sprawdzałem, ale w dwupokojowym mieszkaniu jest to akceptowane wszędzie.

Sprzęt do domowej stacji pogodowej

Po kilku eksperymentach zdecydowałem się podłączyć czujnik temperatury, wilgotności i nadajnik do Arduino Nano.


Czujnik temperatury DS18D20 podłącza się do Arduino w następujący sposób:

1) GND do minusa mikrokontrolera.
2) DQ przez rezystor podciągający do masy i do pinu D2 Arduino
3) Vdd do +5 V.

Moduł nadajnika MX-FS - 03V zasilany jest napięciem 5 V, wyjście danych (ADATA) jest podłączone do pinu D13.

Do Arduino Uno podłączyłem wyświetlacz LCD i barometr BMP085.


Schemat podłączenia do Arduino Uno

Odbiornik sygnału jest podłączony do pinu D10.

Moduł BMP085 - cyfrowy czujnik ciśnienia atmosferycznego. Czujnik umożliwia pomiar temperatury, ciśnienia oraz wysokości nad poziomem morza. Interfejs połączenia: I2C. Napięcie zasilania czujnika 1,8-3,6 V

Moduł podłącza się do Arduino w taki sam sposób, jak inne urządzenia I2C:

  • VCC - VCC (3,3 V);
  • GND - GND;
  • SCL - do pinu analogowego 5;
  • SDA - do pinu analogowego 4.
  • Bardzo niski koszt
  • Zasilanie i wejścia/wyjścia 3–5 V
  • Oznaczanie wilgotności 20-80% z dokładnością 5%.
  • Wykrywanie temperatury 0-50 stopni. z dokładnością 2%.
  • Częstotliwość odpytywania nie większa niż 1 Hz (nie więcej niż raz na 1 sekundę)
  • Wymiary 15,5 mm x 12 mm x 5,5 mm
  • 4 piny z odstępem między pinami 0,1 cala

DHT ma 4 piny:

  1. Vcc (zasilanie 3-5 V)
  2. Wyjście danych - Wyjście danych
  3. Nieużywany
  4. Ogólny

Łączy się z D8 Arduino.

Część oprogramowania domowej stacji pogodowej

Moduł nadawczy mierzy i przesyła temperaturę co 10 minut.

Poniżej znajduje się program:

/* Wersja szkicu 1.0 Wysyłaj temperaturę co 10 minut. */ #include #include #include #define ONE_WIRE_BUS 2 //Pin do podłączenia czujnika Dallas OneWire oneWire(ONE_WIRE_BUS); DallasCzujniki temperatury(&oneWire); Adres urządzenia wewnątrzTermometr; void setup(void) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // Konieczne dla DR3100 vw_setup(2000); // Ustaw prędkość transmisji (bit/s) Sensors.begin(); if (! czujniki .getAddress(insideThermometer, 0)); printAddress(insideThermometer); czujniki.setResolution(insideThermometer, 9); void printTemperature(Adres urządzeniaAdres urządzenia) ( float tempC = czujniki.getTempC(adres urządzenia); //Serial.print("Temp C : "); //Serial.println(tempC); //Tworzenie danych do wysłania int number = tempC; char symbol = "c"; //Symbol usługi pozwalający określić, czy jest to czujnik String strMsg = "z"; strMsg += symbol; strMsg += " "; strMsg += " "; strMsg.toCharArray(msg, 255); / Poczekaj, aż transfer zostanie zakończony opóźnienie(200); pusta pętla (void) ( for (int j=0 ; J<= 6; j++) { sensors.requestTemperatures(); printTemperature(insideThermometer); delay(600000); } } //Определение адреса void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { if (deviceAddress[i] < 16); //Serial.print("0"); //Serial.print(deviceAddress[i], HEX); } }

Urządzenie odbiorcze odbiera dane, mierzy ciśnienie i temperaturę w pomieszczeniu i przesyła je do wyświetlacza.

#include #include LiquidCrystal LCD(12, 10, 5, 4, 3, 2); #włącz czujnik dht11; #zdefiniuj DHT11PIN 8 #include #include BMP085 dps = BMP085(); długi Temperatura = 0, Ciśnienie = 0, Wysokość = 0; void setup() ( Serial.begin(9600); vw_set_ptt_inverted(true); // Konieczne dla DR3100 vw_setup(2000); // Ustaw prędkość odbioru vw_rx_start(); // Rozpocznij monitorowanie transmisji lcd.begin(16, 2) ; Wire.begin(); opóźnienie (1000); //lcd.setCursor(14,0); //lcd.write(0)); pętla ( uint8_t buf; // Bufor dla wiadomości uint8_t buflen = VW_MAX_MESSAGE_LEN ; // Długość bufora if (vw_get_message(buf, &buflen)) // Jeśli wiadomość zostanie odebrana ( // Rozpocznij analizę int i; // Jeśli wiadomość nie jest adresowana do nas, wyjdź if (buf != "z") ( return; ) char polecenie = buf; // Polecenie znajduje się pod indeksem 2 // Parametr numeryczny zaczyna się od indeksu 4 i = 4; // Ponieważ transmisja odbywa się znak po znaku, należy przekonwertować zestaw znaków na liczbę while (buf[i] != " ") ( liczba *= 10; liczba += buf[i] - "0"; i++; ) dps.getPressure(&Pressure); (&Altitude); getTemperatura(&Temperatura); //Serial.print(polecenie); lcd.print("T="); lcd.setCursor(2,0); lcd.print(liczba); lcd.setCursor(5,0); lcd.print("P="); lcd.print (ciśnienie/133,3); lcd.print("mmH"); lcd.setCursor(0,1); lcd.print("T="); lcd.print (temperatura*0,1); lcd.print("H="); lcd.print(czujnik.wilgotności); lcd.home(); //opóźnienie (2000); int chk = czujnik.odczyt(DHT11PIN); przełącznik (chk) ( case DHTLIB_OK: //Serial.println("OK"); przerwa; case DHTLIB_ERROR_CHECKSUM: //Serial.println("Błąd sumy kontrolnej"); przerwa; case DHTLIB_ERROR_TIMEOUT: //Serial.println("Upłynął limit czasu błąd"); przerwa; domyślnie: //Serial.println("Nieznany błąd"); przerwa; ) ) )

P.S. W przyszłości planuję dodać:
- czujnik wilgotności do przetwornika, przerobić algorytm transmisji danych
- czujnik do pomiaru prędkości i kierunku wiatru.
- dodaj kolejny wyświetlacz do urządzenia odbiorczego.
- przenieść odbiornik i nadajnik do osobnego mikrokontrolera.

Poniżej zdjęcie tego co się stało:

Lista radioelementów

Przeznaczenie Typ Określenie Ilość NotatkaSklepMój notatnik
Część nadawcza.
Płyta Arduino

Arduino Nano 3.0

1 Do notatnika
czujnik temperatury

DS18B20

1 Do notatnika
Rezystor

220 omów

1 Do notatnika
Moduł nadajnikaMX-FS-03V (433 MHz)1 Do notatnika
Część odbiorcza radia.
Płyta Arduino

Arduino Uno

1 Do notatnika
Rezystor trymera 1 Do notatnika
Rezystor

Zaleca się pobranie oprogramowania przed podłączeniem komponentów, aby mieć pewność, że płyta działa. Po złożeniu można go ponownie flashować, płytka powinna być płynnie flashowana. W projektach z mocnymi odbiornikami w obwodzie zasilania 5 V płytki (adresowalne paski LED, serwa, silniki itp.) konieczne jest doprowadzenie zewnętrznego zasilania 5 V do obwodu przed podłączeniem Arduino do komputera, ponieważ USB nie zapewni wymagany prąd, jeśli np. listwa tego wymaga. Może to spowodować przepalenie diody zabezpieczającej na płycie Arduino. Instrukcję pobierania i przesyłania oprogramowania sprzętowego można znaleźć pod spoilerem w następnej linii.

Zawartość folderów w archiwum

  • biblioteki– biblioteki projektów. Zastąp istniejące wersje
  • oprogramowanie sprzętowe– oprogramowanie dla Arduino
  • schematy– schematy połączeń komponentów

Dodatkowo

  • Jak pokazał eksperyment, czujnik temperatury na zewnątrz obudowy pokazuje o 0,5 stopnia mniej niż wewnątrz! Trzeba lepiej rozmieścić elektronikę, odprowadzić i osłonić ciepło z elementów grzejnych...

  • Jeśli wyświetlacz jest zbyt ciemny/na białym tle
    Na płycie sterownika wyświetlacza (do której podłączone są przewody) znajduje się pokrętło kontrastu, za jego pomocą można dostosować kontrast do pożądanego. Ponadto kontrast zależy od kąta patrzenia wyświetlacza (jest to wyświetlacz LCD) i można ustawić wyświetlacz tak, aby wyświetlał wyraźny obraz nawet pod kątem „wyświetlacz na poziomie pępka, patrząc z góry”. A kontrast mocno zależy od zasilania: od 5V wyświetlacz pokazuje tak wyraźnie i jasno jak to tylko możliwe, natomiast przy zasilaniu z USB przez Arduino napięcie wyniesie około 4,5V (część z niego spada na diodę zabezpieczającą wzdłuż linii USB ), a wyświetlacz nie jest już tak jasny. Dostosuj moc wyjściową za pomocą pokrętła z zewnętrznym zasilaniem od 5V!

  • Jeśli czujnik CO2 nie działa prawidłowo (informacje od Jewgienija Iwanowa)
    Cóż, w przykładach znajdują się szkice do kalibracji w folderze biblioteki czujników. można go także uruchomić, zwierając na ślepo złącze „HD” do masy na ponad 7 sekund.
    Oczywiście nie musisz tego robić bezpośrednio na zewnątrz, gdy jest zimno… możesz po prostu napełnić butelkę świeżym powietrzem z czujnikiem w środku i zamknąć ją. Kalibracja trwa co najmniej 20 minut.
    Domyślnie czujnik ma włączoną autokalibrację, która odbywa się codziennie, a jeśli czujnik używany jest w niewentylowanym pomieszczeniu, to kalibracja ta szybko przesuwa wartości poza normę, dlatego należy ją wyłączyć.
    Dokumentacja.

  • Automatyczna kalibracja czujnika CO2 jest wyłączone na szkicu!

  • Jeśli masz Czujnik BME280 nie działa, najprawdopodobniej jego adres jest inny. W projekcie wykorzystano bibliotekę Adafruit_BME280, która nie posiada osobnej funkcji zmiany adresu, dlatego adres ustawiany jest ręcznie w pliku biblioteki Adafruit_BME280.h niemal na samym początku pliku ( znajduje się w folderze Adafruit_BME280 w folderze bibliotek, powinieneś go tam zainstalować), mój moduł miał adres 0x76. Jak mogę znaleźć adres mojego modułu BME280? Istnieje specjalny szkic zwany skanerem i2c. Możesz wpisać w Google, możesz. Flashujesz ten szkic, otwierasz port i otrzymujesz listę adresów urządzeń podłączonych do magistrali i2c. Aby inne moduły Ci nie przeszkadzały, możesz je wyłączyć i pozostawić tylko BME280. Otrzymany adres wskazujemy w bibliotece, zapisujemy plik i ładujemy firmware zegara pogodowego. Wszystko!

  • Jeśli zegar jest powolny, problem najprawdopodobniej tkwi w zasilaniu obwodu. Jeśli problem nie zniknie po zmianie zasilacza na lepszy, podłącz kondensator do zasilania modułu RTC (wlutuj bezpośrednio na płytkę na VCC i GND): zawsze ceramiczny, 0,1-1 µF (oznaczenie 103 lub 104 , patrz tabela znakowania). Można także dostarczyć elektrolit (6,3 V, 47-100 uF)

Ustawienia oprogramowania

#define RESET_CLOCK 0 // resetuje zegar podczas ładowania oprogramowania (dla modułu z niewymienną baterią). Nie zapomnij wpisać 0 i sflashuj go ponownie! #define SENS_TIME 30000 // czas aktualizacji odczytów czujnika na ekranie, milisekundy #define LED_MODE 0 // Typ diody RGB: 0 - katoda główna, 1 - anoda główna #define LED_BRIGHT 255 // Jasność diody CO2 (0 - 255) # zdefiniuj BLUE_YELLOW 1 // kolor żółty zamiast niebieskiego (1 tak, 0 nie), ale ze względu na możliwości połączenia żółty nie jest tak jasny #define DISP_MODE 1 // wyświetlacz w prawym górnym rogu: 0 - rok, 1 - dzień tygodnia, 2 - sekundy #define WEEK_LANG 1 // język dnia tygodnia: 0 - angielski, 1 - rosyjski (transliterowany) #define DEBUG 0 // wyświetl dziennik inicjalizacji czujnika przy uruchomieniu #define PRESSURE 1 // 0 - wykres ciśnienia, 1 - wykres prognozy opadów (zamiast ciśnienia). Nie zapomnij dostosować limitów wykresu // limitów wyświetlania wykresów #define TEMP_MIN 15 #define TEMP_MAX 35 #define HUM_MIN 0 #define HUM_MAX 100 #define PRESS_MIN -100 #define PRESS_MAX 100 #define CO2_MIN 300 #define CO2_MAX 2000

Niedawno mój kolega zorganizował małą wystawę naukową.
Nauczyciel poprosił mnie, abym przedstawił studentom na studiach projekt z elektroniki. Miałem dwa dni na wymyślenie czegoś ciekawego i w miarę prostego.



Jako że warunki atmosferyczne są tu dość zmienne, a temperatura waha się w granicach 30-40°C, postanowiłem zrobić domową stację pogodową.

Jakie funkcje pełni domowa stacja pogodowa?
Stacja pogodowa Arduino z wyświetlaczem to urządzenie zbierające dane o pogodzie i warunkach środowiskowych za pomocą różnorodnych czujników.

Zazwyczaj są to następujące czujniki:

  • wiatr
  • wilgotność
  • deszcz
  • temperatura
  • ciśnienie
  • wysokości

Moim celem jest zbudowanie własnoręcznie przenośnej, stacjonarnej stacji pogodowej.

Powinien być w stanie określić następujące parametry:

  • temperatura
  • wilgotność
  • ciśnienie
  • wysokość

Krok 1: Kup niezbędne komponenty







  • DHT22, czujnik temperatury i wilgotności.
  • BMP180, czujnik ciśnienia.
  • Lutować
  • Jednorzędowe złącze wyjściowe 40

Sprzęt, którego będziesz potrzebować:

  • Lutownica
  • Szczypce do nosa
  • Przewody

Krok 2: Czujnik temperatury i wilgotności DHT22







Do pomiaru temperatury wykorzystuje się różne czujniki. Popularne są DHT22, DHT11, SHT1x

Wyjaśnię czym się od siebie różnią i dlaczego użyłem DHT22.

Czujnik AM2302 wykorzystuje sygnał cyfrowy. Czujnik ten działa w oparciu o unikalny system kodowania i technologię czujników, dzięki czemu jego dane są wiarygodne. Jego element czujnikowy jest podłączony do 8-bitowego komputera jednoukładowego.

Każdy czujnik tego modelu posiada kompensację temperaturową i jest precyzyjnie skalibrowany; współczynnik kalibracji umieszczony jest w pamięci programowalnej jednorazowo (pamięć OTP). Podczas odczytu odczytów czujnik przywoła współczynnik z pamięci.

Małe rozmiary, niski pobór mocy, duża odległość transmisji (100 m) sprawiają, że AM2302 nadaje się do prawie wszystkich zastosowań, a 4 wyjścia w jednym rzędzie sprawiają, że instalacja jest bardzo prosta.

Przyjrzyjmy się zaletom i wadom trzech modeli czujników.

DHT11

Plusy: nie wymaga lutowania, najtańszy z trzech modeli, szybki stabilny sygnał, zasięg ponad 20 m, silne zakłócenia.
Minusy: Biblioteka! Brak opcji rozdzielczości, błąd pomiaru temperatury +/- 2°C, błąd pomiaru poziomu wilgotności względnej +/- 5%, nieodpowiedni zakres mierzonych temperatur (0-50°C).
Obszary zastosowania: ogrodnictwo, rolnictwo.

DHT22

Zalety: nie wymaga lutowania, niski koszt, wygładzone krzywe, małe błędy pomiarowe, duży zakres pomiarowy, zasięg większy niż 20 m, silne zakłócenia.
Wady: czułość mogłaby być wyższa, powolne śledzenie zmian temperatury, wymaga biblioteki.
Obszary zastosowania: badania środowiskowe.

SHT1x

Zalety: brak konieczności lutowania, gładkie krzywe, niskie błędy pomiaru, szybka reakcja, niskie zużycie energii, automatyczny tryb uśpienia, wysoka stabilność i spójność danych.
Wady: dwa interfejsy cyfrowe, błąd pomiaru poziomu wilgotności, zakres mierzonych temperatur 0-50°C, wymagana biblioteka.
Obszary zastosowania: praca w trudnych warunkach i w instalacjach długoterminowych. Wszystkie trzy czujniki są stosunkowo niedrogie.

Mieszanina

  • Vcc – 5 V lub 3,3 V
  • Gnd - z Gnd
  • Dane – do drugiego pinu Arduino

Krok 3: Czujnik ciśnienia BMP180



BMP180 – barometryczny czujnik ciśnienia atmosferycznego z interfejsem I2C.
Czujniki ciśnienia barometrycznego mierzą wartość bezwzględną otaczającego powietrza. Wskaźnik ten zależy od konkretnych warunków pogodowych i wysokości nad poziomem morza.

Moduł BMP180 miał stabilizator 3,3V 662kOhm, który przez własną głupotę przez przypadek wysadziłem. Musiałem poprowadzić zasilanie bezpośrednio do chipa.

Ze względu na brak stabilizatora jestem ograniczony w wyborze źródła zasilania - napięcie powyżej 3,3V zniszczy czujnik.
Inne modele mogą nie posiadać stabilizatora, koniecznie sprawdź jego obecność.

Schemat podłączenia czujnika i magistrali I2C z Arduino (nano lub uno)

  • SDA-A4
  • SCL-A5
  • VCC – 3,3 V
  • GND - GND

Porozmawiajmy trochę o ciśnieniu i jego związku z temperaturą i wysokością.

Ciśnienie atmosferyczne w żadnym punkcie nie jest stałe. Złożona interakcja między obrotem Ziemi a nachyleniem osi Ziemi prowadzi do pojawienia się wielu obszarów wysokiego i niskiego ciśnienia, co z kolei prowadzi do codziennych zmian warunków pogodowych. Obserwując zmiany ciśnienia, możesz tworzyć krótkoterminowe prognozy pogody.

Na przykład spadek ciśnienia zwykle oznacza deszczową pogodę lub nadejście burzy (zbliżanie się do obszaru niskiego ciśnienia, cyklonu). Wzrost ciśnienia zwykle oznacza suchą i bezchmurną pogodę (przechodzi nad tobą obszar wysokiego ciśnienia, antycyklon).

Ciśnienie atmosferyczne zmienia się również wraz z wysokością. Ciśnienie bezwzględne w Everest Base Camp (5400 m n.p.m.) jest niższe niż ciśnienie bezwzględne w Delhi (216 m n.p.m.).

Ponieważ odczyty ciśnienia bezwzględnego różnią się w zależności od lokalizacji, będziemy odnosić się do ciśnienia względnego lub ciśnienia na poziomie morza.

Pomiar wzrostu

Średnie ciśnienie na poziomie morza wynosi 1013,25 GPa (lub milibarów). Jeśli wzniesiesz się ponad atmosferę, wartość ta spadnie do zera. Krzywa tego spadku jest dość wyraźna, więc wysokość nad poziomem morza możesz obliczyć samodzielnie, korzystając z poniższego równania: alti=44330*

Jeśli przyjąć ciśnienie na poziomie morza wynoszące 1013,25 GPa jako p0, rozwiązaniem równania jest aktualna wysokość nad poziomem morza.

Środki ostrożności

Pamiętaj, że czujnik BMP180 potrzebuje dostępu do otaczającej atmosfery, aby móc odczytać ciśnienie powietrza, nie umieszczaj czujnika w zamkniętej obudowie. Wystarczy mały otwór wentylacyjny. Ale nie zostawiaj go zbyt otwartego – wiatr pomyli odczyty ciśnienia i wysokości. Weź pod uwagę ochronę przed wiatrem.

Chronić przed ciepłem. Pomiar ciśnienia wymaga dokładnych odczytów temperatury. Staraj się chronić czujnik przed zmianami temperatury i nie zostawiaj go w pobliżu źródeł wysokich temperatur.

Chronić przed wilgocią. Czujnik BMP180 jest wrażliwy na poziom wilgotności, należy starać się zapobiegać przedostawaniu się wody do czujnika.

Nie zaślepiaj czujnika. Nieoczekiwana była wrażliwość silikonu w czujniku na światło, które mogło do niego docierać przez otwór w osłonie chipa. Aby uzyskać jak najdokładniejsze pomiary, należy chronić czujnik przed światłem otoczenia.

Krok 4: Montaż urządzenia







Instalowanie złączy jednorzędowych dla Arduino Nano. Zasadniczo przycinamy je na wymiar i trochę szlifujemy, aby wyglądały tak, jak były. Następnie je lutujemy. Następnie montujemy złącza jednorzędowe pod czujnik DHT22.

Instalujemy rezystor 10 kOhm od wyjścia danych do masy (Gnd). Wszystko lutujemy.
Następnie w identyczny sposób montujemy złącze jednorzędowe dla czujnika BMP180, uzyskując napięcie zasilania 3,3V. Całość podłączamy do magistrali I2C.

Na koniec podłączamy wyświetlacz LCD do tej samej magistrali I2C, co czujnik BMP180.
(Planuję później podłączyć moduł RTC (zegar czasu rzeczywistego) do czwartego złącza, aby urządzenie także pokazywało godzinę).

Krok 5: Kodowanie




Pobierz biblioteki

Aby zainstalować biblioteki na Arduino, kliknij link

#włączać
#include #include #include "DHT.h" #include

ciśnienie SFE_BMP180;

#zdefiniuj WYSOKOŚĆ 20,56 #zdefiniuj I2C_ADDR 0x27 //<<- Add your address here. #define Rs_pin 0 #define Rw_pin 1 #define En_pin 2 #define BACKLIGHT_PIN 3 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7

#define DHTPIN 2 // do jakiego cyfrowego pinu jesteśmy podłączeni

// Odkomentuj dowolny typ, którego używasz! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin pływak t1, t2;

void setup() ( Serial.begin(9600); lcd.begin(16,2); //<<-- our LCD is a 20x4, change for your LCD if needed // LCD Backlight ON lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home on LCD lcd.print("Weather Station"); delay(5000); dht.begin(); pressure.begin(); } void loop() { char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0) { delay(status);

status = ciśnienie.getTemperatura(T); if (status != 0) ( Serial.print("1"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Temperatura Baro: "); lcd.setCursor(0,1 ); lcd.print(T,2); lcd.print("stopień C ");

status = ciśnienie.startNacisk(3); if (status != 0) ( // Poczekaj na zakończenie pomiaru: opóźnienie(status);

status = ciśnienie.getPressure(P,T); if (status != 0) (lcd.clear(); lcd.setCursor(0,0); lcd.print("ciśnienie abslt: "); lcd.setCursor(0,1); lcd.print(P,2 ); lcd.print("mb"); opóźnienie(3000);

p0 = ciśnienie.poziom morza(P,WYSOKOŚĆ); // jesteśmy na wysokości 1655 metrów (Boulder, Kolorado)

a = ciśnienie.wysokość(P,p0); wyczyść.LCD(); lcd.setCursor(0,0); lcd.print("Wysokość: "); lcd.setCursor(0,1); lcd.print(a,0); lcd.print("metry"); opóźnienie (3000); ) ) ) ) float h = dht.readHumidity(); // Odczyt temperatury w stopniach Celsjusza (domyślnie) float t = dht.readTemperature(); t2=t; wyczyść.LCD(); lcd.setCursor(0,0); // przejdź na początek drugiej linii lcd.print("Wilgotność: "); lcd.setCursor(0,1);lcd.print(h); lcd.print("%"); opóźnienie (3000); wyczyść.LCD(); lcd.setCursor(0,0); // przejdź na początek drugiej linii lcd.print("Temperatura DHT: "); lcd.setCursor(0,1); lcd.print(t); lcd.print("stopień C"); opóźnienie (3000); wyczyść.LCD(); lcd.setCursor(0,0); // przejdź na początek drugiej linii lcd.print("Średnia temperatura: "); lcd.setCursor(0,1); lcd.print((t1+t2)/2); lcd.print("stopień C"); opóźnienie (3000); )

Użyłem Arduino w wersji 1.6.5, kod pasuje dokładnie i może pasować także do późniejszych. Jeśli z jakiegoś powodu kod nie jest odpowiedni, użyj wersji 1.6.5 jako bazy.

Obserwowanie pogody to bardzo ekscytujące zajęcie. Postanowiłem zbudować własną stację pogodową opartą na popularnej .

Prototyp stacji pogodowej wygląda następująco:

Funkcje mojej stacji pogodowej:

  • pomiar i wyświetlanie temperatur w pomieszczeniach i na zewnątrz;
  • wyświetlanie aktualnego czasu (godziny i minuty);
  • wyświetlanie aktualnych faz księżyca i dnia księżycowego;
  • przesyłanie wyników pomiarów do komputera poprzez łącze szeregowe;
  • transmisja wyników pomiarów za pomocą protokołu MQTT za pomocą aplikacji na komputerze.


Klątwa
-plik
oprogramowanie dla (wersja z dnia 9 maja 2018 r.) - .
Jak flashować klątwa-plik na pokład Arduino, opisałem.

Mikrokontroler Arduino Nano 3.0

„Sercem” mojej stacji pogodowej jest mikrokontroler eBay'u):

Do sterowania wyświetlaniem i odpytywaniem czujników używam timera 1 Arduino, powodując przerwy o częstotliwości 200 Hz (okres - 5 ms).

Wskaźnik

Aby wyświetlić zmierzone odczyty czujnika i aktualny czas, podłączyłem się do Arduino czterocyfrowy wskaźnik LED Foryard FYQ-5643BH ze wspólnymi anodami (anody identycznych segmentów wszystkich wyładowań są łączone).
Wskaźnik zawiera cztery cyfry siedmiosegmentowe i dwie kropki oddzielające (godzinowe):

Anody wskaźnikowe są podłączone do zacisków poprzez rezystory ograniczające prąd Arduino:

wypisać 1 2 3 4
wniosek A3 A2 D3 D9

Katody segmentów są połączone z kołkami Arduino:

człon A B C D mi F G P
wniosek D7 D12 D4 D5 D6 D11 D8 D13

Segment wskaźnika zapala się, jeśli na anodzie odpowiedniego wyładowania (1) występuje wysoki potencjał, a na katodzie (0) niski potencjał.

Do wyświetlania informacji na wskaźniku używam wyświetlacza dynamicznego - w danej chwili aktywna jest tylko jedna cyfra. Aktywne wyładowania zmieniają się z częstotliwością 200 Hz (okres wyświetlania 5 ms). Jednocześnie migotanie segmentów jest niewidoczne dla oka.

Czujnik temperatury DS18x20

Aby móc zdalnie mierzyć temperaturę, podłączyłem czujnik , który umożliwia pomiar temperatury zewnętrznej w szerokim zakresie. Czujnik jest podłączony do magistrali 1-przewodowy i posiada trzy wyjścia - zasilanie ( VCC), dane ( DATA), Ziemia ( GND):

wyjście czujnika VCC DATA GND
wniosek Arduino 5 V A1 GND

Między pinami VCC I DATA Dołączyłem rezystor podciągający 4,7 kOhm.

Aby przeliczyć stopnie Celsjusza na Fahrenheita, możesz skorzystać z poniższej tabeli:

Czujnik umieściłem za oknem domu w plastikowym etui na długopis:

\

Profesjonalne stacje pogodowe wykorzystują ekran Stevensona, który chroni termometr przed bezpośrednim działaniem promieni słonecznych i zapewnia cyrkulację powietrza. Ekran Stevensona):

Czujnik ciśnienia i temperatury BMP280

Do pomiaru ciśnienia atmosferycznego tradycyjnie używa się barometrów rtęciowych i barometrów aneroidowych.

W barometr rtęciowy ciśnienie atmosferyczne równoważy ciężar słupa rtęci, którego wysokość służy do pomiaru ciśnienia:

W barometr aneroidowy stosuje się ściskanie i rozszerzanie skrzynki pod ciśnieniem atmosferycznym:

Do pomiaru ciśnienia atmosferycznego i temperatury pokojowej w mojej domowej stacji pogodowej używam czujnika - mały SMD-rozmiar czujnika 2 x 2,5 mm, oparty na technologii piezorezystancyjnej:

Szalik z czujnikiem został zakupiony na platformie handlowej eBay'u:

Czujnik jest podłączony do magistrali I2C(szczegóły kontaktu - SDA/SDI, styk synchronizacyjny - SCL/SCK):

wyjście czujnika VCC GND SDI SCK
wniosek Arduino 3V3 GND A4 A5

Adafruit- akta Adafruit_Sensor.h, Adafruit_BMP280.h, Adafruit_BMP280.cpp.

Jednostki ciśnienia atmosferycznego

Czujnik poprzez funkcję czytajCiśnienie wyświetla ciśnienie atmosferyczne w paskalach. Podstawową jednostką miary ciśnienia atmosferycznego jest hektopaskal(hPa) (1 hPa = 100 Pa), którego analogiem jest jednostka niesystemowa ” milibar" (mbar) (1 mbar = 100Pa = 1hPa). Do konwersji pomiędzy powszechnie używanymi jednostkami ciśnienia poza układem " milimetr rtęci" (mmHg) i hektopaskali stosuje się następujące współczynniki:
1 hPa = 0,75006 mm Hg. Sztuka. ≈ 3/4 mmHg; 1 mmHg =1,3332 hPa ≈ 4/3 hPa.

Zależność ciśnienia atmosferycznego od wysokości nad poziomem morza

Ciśnienie atmosferyczne można przedstawić zarówno w formie bezwzględnej, jak i względnej.
Absolutne ciśnienie QFE(Język angielski) ciśnienie absolutne) to aktualne ciśnienie atmosferyczne, które nie uwzględnia korekty nad poziomem morza.
Wraz ze wzrostem wysokości o 1 m ciśnienie atmosferyczne spada o około 1 hPa:

Wzór barometryczny pozwala określić korektę odczytów barometru w celu uzyskania ciśnienia względnego (w mmHg):
$\Delta P = 760 \cdot (1 - (1 \over (10^ ( (0.0081350 \cdot H) \over (T + 0.00178308 \cdot H) ))))$ ,
gdzie $T$ to średnia temperatura powietrza w skali Rankina, ° Ra, $H$ - wysokość nad poziomem morza, stopy.
Zamiana stopni Celsjusza na stopnie Rankine’a:
$^(\circ)Ra = (^(\circ)C \cdot 1.8) + 491,67 $
Wzór barometryczny służy do niwelacji barometrycznej - wyznaczania wysokości (z błędem 0,1 - 0,5%). Wzór nie uwzględnia wilgotności powietrza i zmiany przyspieszenia grawitacyjnego wraz z wysokością. W przypadku małych różnic wysokości tę wykładniczą zależność można z wystarczającą dokładnością przybliżyć za pomocą zależności liniowej.
Ciśnienie względne QNH(Język angielski) ciśnienie względne, Wysokość morska kodu Q) to ciśnienie atmosferyczne dostosowane do średniego poziomu morza. Średni poziom morza, MSL) (Dla JEST i temperatura 15 stopni Celsjusza) i jest wstępnie ustawiany z uwzględnieniem wysokości, na której znajduje się stacja pogodowa. Można się tego dowiedzieć z danych służb pogodowych, odczytów ze skalibrowanych przyrządów w miejscach publicznych, na lotniskach (z raportów METAR), z Internetu.
Na przykład dla pobliskiego lotniska Homel ( UMGG) Widzę aktualny raport o pogodzie METAR na ru.allmetsat.com/metar-taf/russia.php?icao=UMGG:
UMGG 191800Z 16003MPS CAVOK M06/M15 Q1014 R28/CLRD//NOSIG ,
Gdzie Q1014- ciśnienie QNH na lotnisku wynosi 1014 hPa.
Historia raportów METAR dostępne na stronie lotniczejwxchartsarchive.com/product/metar.
Dla normalnego względnego ciśnienia powietrza QNH akceptowane ciśnienie wynosi 760 mm Hg. Sztuka. lub 1013,25 hPa (w temperaturze 0°С, na 45° szerokości geograficznej północnej lub południowej półkuli).
Ustawiłem ciśnienie dla barometru aneroidowego QNH za pomocą śruby regulacji czułości:

Prognoza pogody

Analiza zmian ciśnienia pozwala na zbudowanie prognozy pogody, a jej dokładność jest tym większa, im gwałtowniejsze są zmiany ciśnienia. Na przykład stara praktyczna zasada obowiązująca żeglarzy mówi, że spadek ciśnienia o 10 hPa (7,5 mm Hg) w ciągu 8 godzin wskazuje na zbliżanie się silnego wiatru.

Skąd bierze się wiatr? Powietrze przepływa do środka obszaru niskiego ciśnienia, tworząc wiatr- poziomy ruch powietrza z obszarów o podwyższonym ciśnieniu do obszarów o obniżonym ciśnieniu (wysokie ciśnienie atmosferyczne wciska masy powietrza w obszary o niskim ciśnieniu atmosferycznym). Jeśli ciśnienie jest bardzo niskie, wiatr może osiągnąć silny wiatr burze. Jednocześnie w okolicy zredukowany ciśnienie (obniżenie ciśnienia lub cyklon), ciepłe powietrze unosi się i tworzy chmury, które często przynoszą deszcz Lub śnieg.

W meteorologii za kierunek wiatru przyjmuje się kierunek, z którego wieje wiatr:

Kierunek ten sprowadza się do ośmiu punktów.

Do przewidywania pogody często wykorzystuje się algorytm na podstawie ciśnienia barometrycznego i kierunku wiatru. Zambrettiego.

Czujnik wilgotności

Do określenia wilgotności względnej powietrza wykorzystuję moduł DHT11(kupione na targu eBay'u):

Czujnik wilgotności DHT11 posiada trzy wyjścia - zasilanie ( + ), dane ( na zewnątrz), Ziemia ( - ):

wyjście czujnika + na zewnątrz -
wniosek Arduino 5 V D10 GND

Do pracy z czujnikiem korzystam z biblioteki z Adafruit- akta DHT.h, DHT.cpp.

Wilgotność powietrza charakteryzuje ilość pary wodnej zawartej w powietrzu. Wilgotność względna pokazuje procentową zawartość wilgoci w powietrzu w stosunku do maksymalnej możliwej ilości przy aktualnej temperaturze. Służy do pomiaru wilgotności względnej :

Dla człowieka optymalny zakres wilgotności powietrza wynosi 40…60%.

Zegar czasu rzeczywistego

Moduł wykorzystałem jako zegar czasu rzeczywistego RTC DS1302(szalik z zegarkiem został zakupiony na platformie handlowej eBay'u):

Moduł DS1302łączy się z autobusem 3-przewodowy. Aby używać tego modułu w połączeniu z Arduino rozwinęła się biblioteka iarduino_RTC ( z iarduino.ru).

Płytka z modułem DS1302 ma pięć pinów, które podłączyłem do pinów płytki Arduino Nano:

wniosek RTC VCC GND RST CLK DATA
wniosek Arduino 5 V GND D2 D1 D0

Aby utrzymać prawidłowe odczyty zegara przy wyłączonym zasilaniu, włożyłem baterię do gniazda na płycie CR2032.

Dokładność mojego modułu zegara okazała się niezbyt wysoka - zegar śpieszy się o około jedną minutę w ciągu czterech dni. Dlatego resetuję minuty do „zero”, a godzinę do najbliższej, przytrzymując przycisk podłączony do pinu A0 Arduino po włączeniu zasilania stacji pogodowej. Po inicjalizacji pin A0 służy do transmisji danych poprzez połączenie szeregowe.

Przesyłanie danych do komputera i praca poprzez protokół MQTT

Aby przesłać dane poprzez połączenie szeregowe do Arduinołączy USB-UART przetwornik:

Wniosek Arduino używany do przesyłania danych w formacie 8N1(8 bitów danych, bez parzystości, 1 bit stopu) przy 9600 bps. Dane przesyłane są w pakietach, których długość wynosi 4 znaki. Transfer danych odbywa się w „ trochę huk", bez użycia sprzętowego portu szeregowego Arduino.

Format przesyłanych danych:

Parametr 1. bajt 2. bajt Trzeci bajt 4. bajt
temperatura na zewnątrz o spacja lub minus dziesiątki stopni lub przestrzeń jednostki stopni
temperatura pokojowa I spacja lub minus dziesiątki stopni lub przestrzeń jednostki stopni
Ciśnienie atmosferyczne P setki mm r. Sztuka. dziesiątki mmHg jednostki mmHg Z.
wilgotność względna H przestrzeń dziesiątki procent lub spacja jednostki procentowe
Obecny czas dziesiątki godzin jednostki godzin dziesiątki minut jednostki minut

MQTT

Golang aplikacja kliencka protokołu MQTT, przesyłanie informacji otrzymanych ze stacji pogodowej na serwer ( MQTT-pośrednik) :

Praca umożliwia utworzenie konta z bezpłatnym planem taryfowym" " (limit: 10 połączeń, 10 Kb/s):

Aby monitorować odczyty stacji pogodowej, możesz użyć Android-aplikacja :

Odżywianie

Do zasilania stacji pogodowej używam ładowarki ze starego telefonu komórkowego Motoroli, wytwarzający napięcie 5 V o prądzie do 0,55 A i podłączony do styków 5 V(+) i GND (-):

Do zasilania można także wykorzystać baterię 9 V podłączoną do styków. VIN(+) i GND (-).

Obsługa stacji pogodowej

Podczas uruchamiania czujniki są inicjowane i testowane.

W przypadku braku czujnika DS18x20 przy braku czujnika wyświetla się błąd "E1". - błąd „E3”.

Następnie rozpoczyna się cykl pracy stacji pogodowej:

  • pomiar i wyświetlanie temperatury zewnętrznej;
  • pomiar i wyświetlanie temperatury pokojowej;
  • pomiar i wyświetlanie ciśnienia atmosferycznego oraz jego trendu;
  • pomiar i wyświetlanie wilgotności względnej powietrza;
  • wyświetlanie aktualnego czasu;
  • wyświetlanie fazy księżyca i dnia księżycowego.


Film przedstawiający działanie mojej stacji pogodowej jest dostępny na moim -kanał: https://youtu.be/vVLbirO-FVU

Wyświetlacz temperatury

Podczas pomiaru temperatury wyświetlane są dwie cyfry temperatury, a dla temperatury ujemnej znak minus (z symbolem stopnia w skrajnej prawej cyfrze);
w przypadku temperatury zewnętrznej na górze wyświetlany jest znak stopnia:


dla temperatury pokojowej - poniżej:

Wyświetlacz ciśnienia

Podczas pomiaru ciśnienia wyświetlane są trzy cyfry ciśnienia w mmHg (z symbolem „ P" w skrajnym prawym miejscu):

Jeśli ciśnienie gwałtownie spadnie, zamiast symbolu „ P„Symbol” jest wyświetlany na skrajnej prawej cyfrze L„jeśli gwałtownie urósł, to” H„. Kryterium ostrości zmiany wynosi 8 mm Hg w ciągu 8 godzin:

Ponieważ moja stacja pogodowa wyświetla ciśnienie bezwzględne ( QFE), wówczas odczyty okazują się nieco zaniżone w stosunku do informacji zawartych w raporcie METAR(co zapewnia QNH) (14 UTC, 28 marca 2018 r.):

Stosunek ciśnień (wg ATIS) wyniosło $(1015 \ponad 998) = 1,017 $. Wysokość lotniska w Homelu (kod ICAO UMGG) nad poziomem morza wynosi 143,6 m. Temperatura według ATIS wyniosła 1° C.

Odczyty z mojej stacji pogodowej prawie pokrywały się z ciśnieniem bezwzględnym QFE według informacji ATIS!

Maksymalne/minimalne ciśnienie ( QFE), zarejestrowane przez moją stację pogodową przez cały okres obserwacji:

Wyświetlacz wilgotności względnej

Wilgotność względna powietrza wyświetlana jest w procentach (symbol procentu jest wyświetlany w dwóch prawych cyfrach):

Wyświetl aktualny czas

Aktualna godzina wyświetlana jest na wskaźniku w formacie „GG:MM”, ​​przy czym dwukropek oddzielający miga raz na sekundę:

Wyświetlanie faz księżyca i dnia księżycowego

Pierwsze dwie cyfry wskaźnika informują o aktualnej fazie księżyca, a dwie kolejne - o aktualnym dniu księżycowym:

Księżyc ma osiem faz (podano nazwy angielskie i rosyjskie (na niebiesko - niedokładne)):

Fazy ​​są wyświetlane na wskaźniku za pomocą piktogramów:

faza piktogram
rosnący sierp (półksiężyc)
zanikający sierp (półksiężyc)

Przesyłanie danych do komputera

Jeśli podłączysz stację pogodową za pomocą USB-UART konwerter (na przykład oparty na mikroukładzie CP2102), połączony z USB- port komputera, można wykorzystać program terminalowy do obserwacji danych przesyłanych przez stację pogodową:

Rozwijałem się w języku programowania golang program prowadzący rejestr obserwacji pogody i przesyłający dane do serwisu i można je oglądać na Android-smartfon korzystający z aplikacji :

Na podstawie dziennika obserwacji pogody można np. zbudować wykres zmian ciśnienia atmosferycznego:
przykład wykresu z zauważalnym ciśnieniem minimalnym


przykład wykresu z niewielkim wzrostem ciśnienia

Planowane ulepszenia:

  • dodanie czujników kierunku i prędkości wiatru

Na stacjach pogodowych do pomiaru prędkości wiatru stosuje się anemometr z trzema czaszami (1), a do określenia kierunku wiatru stosuje się wiatrowskaz (2):

Służy również do pomiaru prędkości wiatru anemometry z gorącym drutem(Język angielski) anemometr z gorącym drutem). Jako podgrzewany drut możesz użyć żarnika wolframowego z żarówki z potłuczonym szkłem. W produkowanych przemysłowo anemometrach z gorącym drutem czujnik jest zwykle umieszczony na rurze teleskopowej:

Zasada działania tego urządzenia polega na tym, że ciepło jest odbierane z elementu grzejnego w wyniku konwekcji przez przepływ powietrza - wiatr. W tym przypadku opór żarnika zależy od temperatury żarnika. Prawo zmiany rezystancji włókna $R_T$ w zależności od temperatury $T$ ma postać:
$R_T = R_0 \cdot (1 + (\alfa \cdot (T - T_0)))$ ,
gdzie $R_0$ to opór żarnika w temperaturze $T_0$, $\alpha$ to temperaturowy współczynnik oporu (dla wolframu $\alpha = 4,5\cdot(10^(-3) (^(\circ)( C^(-1))))$).

Wraz ze zmianą prędkości przepływu powietrza temperatura zmienia się przy stałym prądzie żarnika (anemometr stałoprądowy, ang. CSW). Jeśli temperatura elementu grzejnego będzie utrzymywana na stałym poziomie, wówczas prąd płynący przez element będzie proporcjonalny do prędkości przepływu powietrza (anemometr stałotemperaturowy, ang.). wezwanie do działania).

Ciąg dalszy nastąpi

KATEGORIE

POPULARNE ARTYKUŁY

2024 „kingad.ru” - badanie ultrasonograficzne narządów ludzkich