Vytvorenie meteorologickej stanice na arduino s lokálnym serverom. Bezdrôtová meteostanica

Meteostanica typu Urob si sám.

Bol večer, po novom roku sa nedalo nič robiť. Ako obvykle, počas zimných novoročných sviatkov chcem zamestnať hlavu a ruky niečím užitočným a kreatívnym. Počas týchto novoročných sviatkov som sa rozhodol vyrobiť meteorologickú stanicu vlastnými rukami. Začal som sa vopred pripravovať, pred novým rokom som nakúpil a poskladal všetky komponenty a cez prázdniny som robil hlavné programovanie.

(Veľa fotiek pod rezom!)

Najprv prejdem komponenty, nebudem dávať odkazy, pretože tovar na eBay (v mojom účte) prešiel do archívu. Na eBay som kúpil veľa komponentov. Prvýkrát som vyskúšal aukciu, zvykol som si vždy kúpiť „kúp to hneď“. Čo môžem povedať, ak sa s nákupom neponáhľate, niektoré komponenty sa dajú kúpiť lacnejšie (niekedy je rozdiel dvojnásobný).

Snímač tlaku BMP085
Toto je hlavný snímač. Keď som to videl na eBay, uvedomil som si, že si chcem postaviť domácu meteostanicu.
Senzor prišiel v obyčajnej obálke, prelepenej malou bublinkovou fóliou vo vnútri.

Vo vnútri obálky bola vizitka predajcu a snímač, zabalené v antistatickom sáčku a zabalené v ďalšej vrstve bublinkovej fólie

Antistatický vak bol utesnený, aby vlhkosť počas letu neohrozovala senzor

Dostávame senzor. Na jednej strane bola prispájkovaná línia kontaktov, ktoré boli vložené do peny, aby sa neohýbali. Na druhej strane je samotný snímač a označenie kontaktov.




Všetko by bolo v poriadku, ale označenie kontaktov je aplikované zrkadlovo.
Senzor je pripojený cez zbernicu I2C a je napájaný 3,3 V. To znamená, že pre normálnu prevádzku sú potrebné 4 vodiče (+, -, SDA, SCL)
Senzor môžete interogovať 2 spôsobmi: buď cez knižnicu, alebo pomocou funkcií priamo v náčrte.
Príklad programu:

#include

#define BMP085_ADDRESS 0x77 // I2C adresa BMP085

Const unsigned char OSS = 0; // Nastavenie prevzorkovania

// Kalibračné hodnoty
int ac1;
intac2;
intac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
intb2;
intmb;
int mc;
intmd;

krátka teplota;
dlhý tlak;

Void setup()
{
Serial.begin(9600);
Wire.begin();
bmp085Calibration();
}

Void loop()
{
teplota = bmp085GetTemperature(bmp085ReadUT());
tlak = bmp085GetPressure(bmp085ReadUP());
Serial.print("Teplota: ");
Serial.print(teplota/10,0, DEC);
Serial.println("C");
Serial.print("Tlak: ");
Serial.print(tlak/133,322, DEC);
Serial.println("mm Hg");
Serial.println();
oneskorenie(1000);
}

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

Krátke bmp085GetTemperature (nepodpísané int ut)
{
dlhé x1, x2;
x1 = (((dlhé)ut - (dlhé)ac6)*(dlhé)ac5) >> 15;
x2 = ((dlhá)mc<< 11)/(x1 + md);
b5 = x1 + x2;

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

Dlhé bmp085GetPressure (nepodpísané dlho hore)
{
dlhé x1, x2, x3, b3, b6, p;
bez znamienka dlhé b4, b7;
b6 = b5 - 4000;
// Vypočítajte B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((dlhé)ac1)*4 + x3)<>2;
// Vypočítajte B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (dlhá bez znamienka)(x3 + 32768))>>15;
b7 = ((dlhé bez znamienka)(hore - b3) * (50 000>>OSS));
ak (b7< 0x80000000)
p = (b7<<1)/b4;
inak
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p+= (x1 + x2 + 3791)>>4;
vrátiť p;
}

// Prečítajte si 1 bajt z BMP085 na "adrese"
char bmp085Read (nepodpísaná char adresa)
{
nepodpísané char dáta;

drôt.zapis(adresa);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available())
;
return Wire.read();
}

Int bmp085ReadInt (nepodpísaná char adresa)
{
unsigned char msb, lsb;
Wire.beginTransmission(BMP085_ADDRESS);
drôt.zapis(adresa);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
vrátiť (int) msb<<8 | lsb;
}

// Prečítajte si nekompenzovanú hodnotu teploty
unsigned int bmp085ReadUT()
{
unsigned int ut;
// Zapíšte 0x2E do registra 0xF4
// Toto vyžaduje odčítanie teploty
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
// Počkajte aspoň 4,5 ms
oneskorenie(5);
// Čítanie dvoch bajtov z registrov 0xF6 a 0xF7
ut = bmp085ReadInt(0xF6);
vrátiť ut;
}

// Prečítajte si nekompenzovanú hodnotu tlaku
nepodpísané dlhé bmp085ReadUP()
{
unsigned char msb, lsb, xlsb;
unsigned long up = 0;
// Napíšte 0x34+(OSS<<6) into register 0xF4
// Vyžiadanie odčítania tlaku s nastavením prevzorkovania
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// Čakanie na konverziu, čas oneskorenia závisí od OSS
oneskorenie (2 + (3<// Čítanie registra 0xF6 (MSB), 0xF7 (LSB) a 0xF8 (XLSB)
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Počkajte, kým budú dostupné údaje
while(Wire.available()< 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
hore = (((nepodpísané dlhé) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
vrátiť sa;
}


Senzor má navyše vlastný tepelný senzor na kompenzáciu tlaku a výškomer.

Arduino Nano v3.0
Toto je srdce celej meteostanice. Jednoducho povedané, ovládač je v miniatúrnej veľkosti.
Kúpené
Nebudem hovoriť podrobne o kontrolórovi, pretože to už bolo urobené predo mnou:


Lightake balenie bolo prefabrikované, ovládač prišiel v balení s USB káblom a Arduinom v zapečatenom antistatickom sáčku.

Ak chcete odhadnúť veľkosť, vedľa Arduina vložte mincu s nominálnou hodnotou 1 rubeľ.

Doska ovládača zblízka



Kábel USB je dobrý, s feritovým krúžkom. Poháňané Arduino cez USB kábel. Vývojové prostredie je možné stiahnuť (stránka na stiahnutie). Jazyk je podobný „C“, s jeho ovládaním neboli žiadne problémy, keďže v práci na ňom veľa programujem.

LCD obrazovka
Pri práci v košoch som našiel kompatibilnú obrazovku LCD 1602. Musel som sa pohrať s pripojením, keďže som k nemu nenašiel datasheet. V dôsledku toho LCD zarobil.

Ale po krátkej operácii som si všimol, že táto obrazovka mi nestačí a nebudem môcť zobraziť viac údajov, pretože má iba 2 riadky po 16 znakov. Spočiatku sa zdá, že tieto parametre stačia, ale keď začnete programovať, pochopíte, že môžete napchať maximálne 3-4 parametre. A ak urobíte menu (nakoniec som uvažoval o vytvorení menu na tejto obrazovke), tak zostane 1-2 voľné miesto na parametre.
V dôsledku toho som začal hľadať inú obrazovku. Najprv som si pozeral grafickú obrazovku z Nokie 3310 a dokonca som sa zúčastnil aj aukcie na eBay, aby som ju kúpil, no nevyšlo to (čo ma veľmi teší), takže som sa tejto obrazovky musel vzdať. Teraz chápem, že pre moje účely by to bolo príliš malé, keďže je s čím porovnávať.
Pri prehliadaní štítov na Arduine som náhodou narazil na grafickú obrazovku 12864 na radiči ST7920. Táto obrazovka má správnu veľkosť a dobré rozlíšenie pre moje potreby (128 x 64). To znamená, že môžete bezpečne umiestniť 6-7 riadkov s 20 znakmi v bežne čitateľnom písme. Keďže je obrazovka grafická, okrem textu v rôznych typoch písma je možné umiestniť aj grafiku. Presne toto som skrátka potreboval, v tejto obrazovke bolo všetko, tak som to nevydržal a objednal.
Balík prišiel rýchlo a bol štandardne zabalený: bublinková fólia, vo vnútri bola ďalšia vrstva bublinkovej fólie a zástena v antistatickom vrecku:






Ak chcete odhadnúť veľkosť, vedľa LCD vložte mincu s nominálnou hodnotou 1 rubeľ.




Na rýchle pripojenie obrazovky k Arduinu som prispájkoval rad kontaktov na kolíky LCD. LCD je možné pripojiť cez sériovú zbernicu a paralelne. Vybral som si prvú možnosť, keďže je tak málo voľných Arduino kontaktov.
Pripojenie (prevzaté z webu):

- Pin 1 (GND) sa pripája na spoločnú zbernicu
- Pin 2 (VCC) je pripojený k +5V napájacej lište a spotreba prúdu je relatívne malá a displej je možné napájať zo vstavaného regulátora Arduino.
- Piny 4, 5 a 6 sú pripojené k digitálnym výstupom Arduino, ktoré tvoria sériové rozhranie SPI:
kolík 4 - (RS) - zodpovedá línii CS (napríklad 7)
pin 5 - (RW) - zodpovedá línii MOSI (napríklad 8)
kolík 6 - (E) - zodpovedá línii SCK (napríklad 3)
Čísla pinov Arduino môžu byť čokoľvek, hlavnou vecou je nezabudnúť ich správne uviesť neskôr v texte programu pri inicializácii displeja.
- Pin 15 (PSB) je pripojený k spoločnej zbernici.
- Kolíky 19 (A) a 20 (K) sú napájanie podsvietenia (+5V a GND). Na nastavenie jasu podsvietenia môžete použiť 10kΩ premenlivý odpor pripojený medzi napájacie lišty a GND. Napätie z jeho motora sa privádza na kolík 19 displeja.
Podľa tohto návodu som zapojil všetko okrem podsvietenia. Ako napájanie podsvietenia som použil Arduino PWM.
Na programové pripojenie LCD k Arduinu sa používa knižnica u8glib. Môžete si stiahnuť. Ak sa vyskytnú problémy so sťahovaním, môžem nahrať knižnicu na narod.ru.
Samotná knižnica nie je zložitá a umožňuje zobraziť text v rôznych typoch písma, nakresliť čiaru, nakresliť najjednoduchšie geometrické tvary (obdĺžnik, kruh), zobraziť svoje obrázky pripravené špeciálnym spôsobom. V zásade tento nástroj postačuje na väčšinu úloh.
Tu je výsledok jednoduchého programu:

Samotný program:

#include "U8glib.h"

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

// Podprogram na určenie voľnej pamäte
int freeRam()(
extern int __heap_start, *__brkval;
intv;
return (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

Void setup(void) (
u8g.setFont(u8g_font_6x10); // písmo
u8g.setRot180(); // Otočte obrazovku
analogWrite(6, 115); // Nastavenie jasu obrazovky (anóda podsvietenia na 6 pinov)
}

Void loop(void) (
u8g.firstPage();
robiť (

u8g.setPrintPos(1, 12); // pozíciu
u8g.print("Ahoj!!!"); // textový výstup
u8g.drawBox(0,22,128,9); // Vyplňte obdĺžnik bielou farbou
u8g.setColorIndex(0); // biely atrament, čierne pozadie
u8g.setPrintPos(1, 30); // pozíciu
u8g.print("Slovo..."); // textový výstup

U8g.setColorIndex(1); // biely atrament, čierne pozadie
u8g.setPrintPos(1, 50); // pozíciu
u8g.print("Po spustení ="); // textový výstup
u8g.setPrintPos(85, 50); // pozíciu
u8g.print(millis() / 1000); // výstup počtu sekúnd po spustení
u8g.setPrintPos(1, 64); // pozíciu
u8g.print(freeRam()); // vypíše, koľko pamäte sa používa
) while(u8g.nextPage());

oneskorenie(200);
}

Hodiny reálneho času DS1307
Ďalší komponent pre moju meteorologickú stanicu. Tento štít má hodiny reálneho času. Objednal som si ich cez eBay. Predajca poslal hodinkovú vreckovku v neskutočne veľkej krabici


Vo vnútri škatule boli dva listy A4 s reklamou a vreckovka na hodinky zabalené v celofáne


Chcem poznamenať, že poplatok nepresahuje veľkosť 2 rubľov. mince a krabička mala rozmer 13x15x5 cm.
Doska bola zabalená v antistatickom vrecku

Šál zblízka



Musel som sa pohrať s týmto modulom. Po prvé, boli tu problémy s pripojením. A po druhé, na tejto doske nie je kremeň. Keby som vedel, že na module strávim toľko času, s najväčšou pravdepodobnosťou by som si ho zostavil sám, keďže sieť je plná schém. Najjednoduchší obvod obsahuje 4-5 komponentov.
Čo sa týka spojenia. Našiel som knižnicu, ktorá hovorila, že rozhranie I2C je možné pripojiť nie k obvyklým analógovým vstupom Arduino (A4 a A5), ale k akýmkoľvek diskrétnym. Urobil ako je napísané. Spočiatku nič nefungovalo, po dlhom tanci s tamburínou sa hodiny natáčali. No, pomyslel som si, to je ono, problémy sú zažehnané, ale keď som sa pokúsil pripojiť ten istý modul k inému Arduinu, tancovanie s tamburínou pokračovalo. Strávil som veľa času hľadaním riešenia tohto problému a takmer všade bolo indikované buď nesprávne zapojenie alebo absencia pull-up rezistorov na pinoch SCL a SDA. Už som chcel liezť do dosky spájkovačkou, ale na jednom fóre som náhodou natrafil na kód, kde sa hovorilo, že SCL a SDA treba na Arduine pripojiť na štandardné I2C porty. Po štandardnom pripojení všetko hneď fungovalo.
Teraz o kremeni. Neviem, aký druh kremeňa tam Číňania dali, ale hodinky s takým kremeňom bežali 10-11 sekúnd denne. Táto chyba je 5 minút za mesiac a 1 hodina za rok. Takéto hodiny nepotrebujete. Musel som ísť znova online a hľadať, ako túto chybu opraviť. Prvé riešenie, ktoré prišlo, hovorí, že musíte kremeň uzemniť. Podarilo sa - nulový výsledok. Našiel som niekde inde, že potrebujem nájsť starú základnú dosku a odtiaľ odspájkovať hodinový kremeň. Hotovo - výsledok je. Teraz hodiny utekajú nie o 10-11 sekúnd, ale o 1,5 sekundy za deň. Povedzme, že sa to zlepšilo, ale ďaleko od ideálu. Nakoľko je zdráhavejšie sa popasovať s spájkovačkou, rozhodlo sa hodiny nastavovať programovo, teda raz za deň nastaviť hodiny na požadovanú hodnotu. Po 10 dňoch sa hodiny minuli nie viac ako o sekundu. Metóda je dobrá, ale iba vtedy, keď je časovacie zariadenie Arduino pripojené k napájaniu, inak hodiny bežia na batériu a stále bežia.
Malý testovací program:

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

Bajt decToBcd (byte val)
{
návrat ((val/10*16) + (val%10));
}

Bajt bcdToDec(bajtová hodnota)
{
návrat ((val/16*10) + (val%16));
}

Void setDateDs1307(bajtová sekunda, // 0-59
bajt minúta, // 0-59
bajtová hodina) // 0-99
{

Wire.write(0);
Wire.write(decToBcd(sekunda));
Wire.write(decToBcd(minúta));
Wire.write(decToBcd(hodina));
Wire.endTransmission();
}

Void getDateDs1307(bajt *sekunda,
bajt*minúta,
bajt*hodina)
{

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

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*druhá = bcdToDec(Wire.read());
*minúta = bcdToDec(Wire.read());
*hodina = bcdToDec(Wire.read());
}

Void setup()
{
byte sekunda, minúta, hodina;
Wire.begin();
Serial.begin(9600);

Druhá = 45;
minúty = 5;
hodiny = 16;

SetDateDs1307(sekunda, minúta, hodina);
}

Void loop()
{
byte sekunda, minúta, hodina;

GetDateDs1307(&sekunda, &minúta, &hodina);
Serial.print(hodina, DEC);
sériová tlač(":");
Serial.print(minúta, DEC);
sériová tlač(":");
Serial.println(druhý, DEC);

oneskorenie(1000);
}


Knižnica sa tu nepoužíva a funkcie sú skrátené pre čas čítania a zápisu.

Senzor teploty a vlhkosti DHT11
O tomto senzore nie je veľa čo povedať. Ani by som to nepoužíval, keby som nepotreboval vlhkosť. Žiaľ, pri preberaní som ho neodfotil, takže obrázky nebudú. Fotografie snímača si môžete pozrieť nižšie, kde som ho pripojil k Arduinu. Pripojenie snímača je jednoduché (+, digitálny výstup, -). Typicky sú snímače vyrobené so štyrmi kolíkmi. S týmto tvarovým faktorom nie je tretí kontakt s ničím spojený.
Na pripojenie k Arduinu môžete použiť knižnicu. Môžete si stiahnuť.
Malý testovací program s výstupom informácií na LCD displej 1602:

// zahrňte kód knižnice:
#include
#include

// Deklarovanie objektov
dht11 Dht11;
LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

#define DHT11PIN 7
int i;

Void setup()
{
lcd.begin(16, 2);
lcd.print("Stav: ");
i=0;
}

Void loop()
{
int chk = DHT11.read(DHT11PIN);
lcd.setCursor(8, 0);
prepínač (chk)
{
prípad 0: lcd.print("OK"); break;// lcd.setCursor(11, 0); lcd.print(millis()/2000); prestávka;
case -1: lcd.print(“Chyba kontrolného súčtu”); merr(); prestávka;
case -2: lcd.print("Chyba vypršania časového limitu"); merr(); prestávka;
predvolene: lcd.print("Neznáma chyba"); merr(); prestávka;
}
oneskorenie(500);
lcd.setCursor(15, 0);
prepínač (i)
{
prípad 0: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" ");prestávka;
prípad 1: lcd.print("v"); lcd.setCursor(15, 1); lcd.print(" ");prestávka;
predvolene: lcd.setCursor(15, 1); lcd.print("E"); prestávka;
}
i=i+1;
ak (i>1) i=0;
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd.print((float)DHT11.vlhkosť, 0);
lcd.setCursor(4, 1);
lcd print("%");
lcd.setCursor(8, 1);
lcd.print("T=");
lcd.setCursor(10, 1);
lcd.print((float)DHT11.teplota, 0);
lcd.setCursor(12, 1);
lcd.print("C");

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


Snímač má nevýhody - údaje zo snímača prichádzajú iba v celých číslach a rozsah je slabý.

Zdá sa, že písal o všetkých komponentoch. Zostáva zhromaždiť všetko do jedného celku.
Ups, skoro som zabudol! Na zostavenie zariadenia potrebujete puzdro. Prípad si objednal aj na Ebayi. Predajca bol z Anglicka. Balík prišiel rýchlo, no neodfotila som ho. Všetky fotografie tela sú nižšie.

Najprv som všetko na stole poskladal pomocou špeciálnej kabeláže. Napísal som testovací program a nahral ho do ovládača.



V skutočnosti je modrá farba podsvietenia oveľa jasnejšia. Aj pri minimálnom jase (Bright=5) je rám exponovaný.

Na zostavenie všetkého bez drôtov bolo rozhodnuté vyrobiť mini základnú dosku a na konektory bola umiestnená doska Arduino a štíty. V takom prípade sa dajú ľahko rýchlo odstrániť. Tiež som sa rozhodol zavesiť LCD obrazovku a ovládacie tlačidlá na konektory, iba spájkovať snímač teploty na vodiče.
Takto vyšla šatka



Na poslednej fotke som tavidlo ešte nezmyl. Pod štíty vedľa konektorov som nalepil poréznu gumu, aby tam bola aspoň akási opora. Aj keď v skutočnosti sú štíty v konektoroch na kontaktoch už dokonale držané.

Základná doska s nainštalovanými štítmi a doskou Arduino.

Takto vyzerá kompletné pripojenie k základnej doske


Namiesto gombíkov som použil domáci štít priletovaný na doštičke. Ako gombíky som použil gombíky zo starých myší.
Ako vidíte, počet drôtov sa znížil.

Hlavným problémom umiestnenia v puzdre je rovnomerné vyrezanie drážky pre LCD obrazovku. Nech som sa snažil akokoľvek, stále to nevyšlo ideálne. Medzery boli na niektorých miestach o niečo viac ako 1 mm. Aby všetko vyzeralo úhľadne, zobral som čierny tmel na akvárium a vyplnil som všetky škáry, zároveň som na tento konkrétny tmel pripevnil sito. Po zaschnutí tmelu som prebytok z vonkajšej strany odrezal. Pri jasnom svetle je tmel viditeľný a pri normálnom svetle všetko splýva s puzdrom.
Takto vyzerá skrinka zvnútra s LCD obrazovkou a nainštalovanou základnou doskou.

Takto to vyzerá zvonku pri ostrom svetle (ospravedlňujem sa za odtlačky prstov, videl som ich, keď som triedil fotky).

Dlho som premýšľal, ako pripevniť tlačidlá na puzdro a čo je najdôležitejšie, ktoré tlačidlá použiť ...
V elektronických obchodoch sa mi páčil gombík s dlhým špendlíkom a hrotmi, ktoré sa na tento špendlík nasadzujú. Tieto tlačidlá sa používajú na spájkovanie na dosku. Všetko by bolo v poriadku, ale majú mínus - lisovací zdvih je veľmi malý a hlasný.
Tlačidlá som musel umiestniť v dvoch etapách: prvou bolo umiestnenie tlačidiel na dosku, druhou bolo namontovanie tejto dosky na inú dosku. A toto všetko potom dajte do tela na vodidlách.

Takto vyzerá šál s gombíkmi:



Takto vyzerá tabuľa:


Tu vidíte vodidlá, do ktorých je vložená doska s tlačidlami. Spájkoval som niektoré prvky, aby som vystužil dosku.

Teraz dáme všetko do tela
Bez spojovacích tlačidiel:


S tlačidlovým pripojením:

Zatvorte krabicu a zapnite ju. Všetko funguje ako má, tlačidlá fungujú ako majú.

Na záver uverejňujem krátke video zariadenia v rôznych režimoch:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
Pre tých, ktorí tu video nevideli, tu je odkaz

Je čas recenziu ukončiť.
Napíšem niečo o programe a potom krátke závery. Keď som písal program, nemyslel som si, že veľmi rýchlo narazím na limit 30720 bajtov.


Musel som optimalizovať kód. Presunuli mnohé časti kódu do podprogramov. Nikdy by som si nepomyslel, že príkaz switch ... case v skompilovanej forme zaberá viac miesta ako niekoľko, ak ... inak. Správna deklarácia premenných tiež šetrí miesto. Ak deklarujete pole dlhé, hoci je celkom možné vystačiť si s bajtom, prekročenie pamäte dosiahne 500 bajtov, v závislosti od veľkosti poľa. Keď píšete program, nepremýšľate o tom a až neskôr, keď analyzujete program, zistíte, že ste urobili niektoré veci zle, a začnete optimalizovať kód. Po vyriešení problémov s veľkosťou programu som narazil na obmedzenie pamäte RAM. To sa prejavilo v tom, že program začal po načítaní visieť. Musel som zadať podprogram na výpočet voľnej pamäte RAM. V dôsledku toho som bol nútený opustiť jeden algoritmus predpovede počasia, pretože musí zobrazovať ikony na obrazovke. Samotný algoritmus funguje, ale výstup ikon musel byť vyhradený. Stále mám nápady, ako optimalizovať kód, ale v blízkej budúcnosti nechám zariadenie fungovať tak, ako je, aby som mohol vyhodnotiť výkon a identifikovať všetky chyby.

Teraz nejaké závery
Mínusy
1) Cena. Ospravedlnenie tohto mínusu je, že koníček nie je nikdy lacný.

klady
1) Skvelá funkčnosť zariadenia
2) Rozšírenie funkcií je obmedzené len použitým ovládačom a vašou vlastnou túžbou
3) Estetické potešenie z rozjímania a morálna satisfakcia z toho, že som toto zariadenie napriek tomu zostavil a dokončil

Plánujem kúpiť +86 Pridať k obľúbeným Páčila sa recenzia +137 +304

Nejako som pri prechádzke mestom uvidel nový obchod s rádiovou elektronikou, ktorý sa otvoril. Keď som sa do toho pustil, našiel som veľké množstvo štítov pre Arduino. Mal som doma Arduino Uno a Arduino Nano a hneď ma napadlo pohrať sa s vysielačmi signálu na diaľku. Rozhodol som sa kúpiť najlacnejší vysielač a prijímač na 433 MHz:

Vysielač signálu.


prijímač signálu.

Po zaznamenaní najjednoduchšieho náčrtu prenosu údajov (príklad prevzatý odtiaľto) sa ukázalo, že vysielacie zariadenia môžu byť celkom vhodné na prenos jednoduchých údajov, ako je teplota, vlhkosť.

Vysielač má nasledujúce vlastnosti:
1. Model: MX-FS-03V
2. Akčný rádius (závisí od prítomnosti blokujúcich predmetov): 20-200 metrov
3. Pracovné napätie: 3,5 -12V
4. Rozmery modulu: 19*19mm
5. Modulácia signálu: AM
6. Výkon vysielača: 10mW
7. Frekvencia: 433MHz
8. Požadovaná dĺžka externej antény: 25cm
9. Jednoduché pripojenie (iba tri vodiče): DATA ; VCC; Zem.

Vlastnosti prijímacieho modulu:
1. Pracovné napätie: DC 5V
2. Prúd: 4mA
3. Pracovná frekvencia: 433,92MHz
4. Citlivosť: - 105dB
5. Rozmery modulu: 30*14*7mm
6. Potrebná externá anténa: 32 cm.

V rozľahlosti internetu sa hovorí, že dosah prenosu informácií rýchlosťou 2Kb/s môže dosiahnuť až 150m. Sám som to nekontroloval, ale v dvojizbovom byte to akceptuje všade.

Hardvér domácej meteorologickej stanice

Po niekoľkých experimentoch som sa rozhodol pripojiť k Arduino Nano snímač teploty, vlhkosti a vysielač.


Teplotný senzor DS18D20 je pripojený k arduinu nasledovne:

1) GND na mínus mikrokontroléra.
2) DQ cez pull-up odpor na zem a na D2 pin Arduina
3) Vdd až +5V.

Vysielací modul MX -FS - 03V je napájaný 5V, dátový výstup (ADATA) je pripojený na pin D13.

K Arduino Uno som pripojil LCD displej a barometer BMP085.


schéma zapojenia pre arduino uno

Prijímač signálu je pripojený na pin D10.

Modul BMP085 je digitálny snímač atmosférického tlaku. Senzor umožňuje merať teplotu, tlak a nadmorskú výšku. Rozhranie pripojenia: I2C. Napájacie napätie snímača 1,8-3,6V

Modul je pripojený k Arduinu rovnakým spôsobom ako ostatné I2C zariadenia:

  • VCC - VCC (3,3 V);
  • GND-GND;
  • SCL - na analógový kolík 5;
  • SDA - na analógový pin 4.
  • Veľmi nízke náklady
  • Napájanie a I/O 3-5V
  • Stanovenie vlhkosti 20-80% s presnosťou 5%.
  • Stanovenie teploty 0-50 stupňov. s presnosťou 2 %.
  • Frekvencia dotazovania nie viac ako 1 Hz (nie viac ako raz za 1 sekundu)
  • Rozmery 15,5 mm x 12 mm x 5,5 mm
  • 4 kolíky s rozstupom nôh 0,1".

DHT má 4 kolíky:

  1. Vcc (3-5V napájanie)
  2. Dáta von - Dátový výstup
  3. Nepoužité
  4. generál

Pripája sa k D8 Arduino.

Softvér domácej meteorologickej stanice

Modul vysielača meria a vysiela teplotu každých 10 minút.

Nižšie je uvedený program:

/* Verzia náčrtu 1.0 Posielať teplotu každých 10 min. */ #include #include #include #define ONE_WIRE_BUS 2 //Kolík na pripojenie snímača Dallas OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors (&oneWire); DeviceAddress vo vnútri teplomera; void setup(void) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // Vyžaduje sa pre DR3100 vw_setup(2000); // Nastavenie prenosovej rýchlosti (bps) sensors.begin(); if (!sensors .getAddress (insideThermometer, 0)); printAddress(insideThermometer); sensors.setResolution(insideThermometer, 9); ) void printTemperature(DeviceAddress deviceAddress) ( float tempC = sensors.getTempC(deviceAddress); //Serial.print("Temp C : " ); //Serial.println(tempC); //Vytvorenie údajov na odoslanie int číslo = tempC; symbol char = "c"; //Symbol služby na určenie, že ide o snímač String strMsg = "z "; strMsg + = symbol; strMsg += " "; strMsg += číslo; strMsg += " "; char msg; strMsg.toCharArray(msg, 255); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); / / Počkajte, kým prenos dokončí oneskorenie(200); ) void loop(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); } }

Prijímacie zariadenie prijíma dáta, meria tlak a teplotu v miestnosti a prenáša ich na displej.

#include #include LiquidCrystal lcd(12, 10, 5, 4, 3, 2); #include dht11 senzor; #define DHT11PIN 8 #include #include BMP085 dps = BMP085(); dlhá Teplota = 0, Tlak = 0, Nadmorská výška = 0; void setup() ( Serial.begin(9600); vw_set_ptt_inverted(true); // Vyžaduje sa pre DR3100 vw_setup(2000); // Nastaví rýchlosť príjmu vw_rx_start(); // Spustí monitorovanie vzduchu lcd.begin(16, 2); Wire.begin(); delay(1000); dps.init(); //lcd.setCursor(14,0); //lcd.write(byte(0)); //lcd.home(); ) void loop() ( uint8_t buf; // Vyrovnávacia pamäť správy uint8_t buflen = VW_MAX_MESSAGE_LEN; // Dĺžka vyrovnávacej pamäte if (vw_get_message(buf, &buflen)) // Ak je správa prijatá ( // Začať analyzovať int i; // Ak je správa nie je adresované nám , ukončite if (buf != "z") ( return; ) char príkaz = buf; // Príkaz je na indexe 2 // Numerický parameter začína na indexe 4 i = 4; int číslo = 0; // Keďže prenos prebieha znak po znaku , potom musíte previesť znakovú sadu na číslo while (buf[i] != " ") ( číslo *= 10; číslo += buf[i] - "0"; i++; ) dps.getPressure(&Tlak); dps.getAltitude (&Výška); dps.getTemperature(&Temperature); //Serial.print(command); Serial.print(" "); Sériová tlačln(číslo); lcd.print("T="); lcd.setCursor(2,0); lcd print(cislo); lcd.setCursor(5,0); lcd.print("P="); lcd.print(Tlak/133,3); lcd.print("mmH"); lcd.setCursor(0,1); lcd.print("T="); lcd.print(Teplota*0,1); lcd.print("H="); lcd.print(senzor.vlhkosti); lcd.home(); //oneskorenie(2000); int chk = sensor.read(DHT11PIN); switch (chk) ( case DHTLIB_OK: //Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: //Serial.println("Chyba kontrolneho suctu"); break; case DHTLIB_ERROR_TIMEOUT: //Serial.println("Time out chyba"); break; predvolené: //Serial.println("Neznáma chyba"); break; ) ) )

P.S. V budúcnosti plánujem pridať nasledovné:
- snímač vlhkosti do vysielača, prepracovať algoritmus prenosu dát
- senzor na meranie rýchlosti a smeru vetra.
- pridať ďalší displej k prijímaču.
- preniesť prijímač a vysielač do samostatného mikrokontroléra.

Nižšie je fotografia toho, čo sa stalo:

Zoznam rádiových prvkov

Označenie Typ Denominácia Množstvo PoznámkaskóreMôj poznámkový blok
vysielacia časť.
Arduino doska

Arduino Nano 3.0

1 Do poznámkového bloku
teplotný senzor

DS18B20

1 Do poznámkového bloku
Rezistor

220 ohmov

1 Do poznámkového bloku
modul vysielačaMX-FS-03V (433 MHz)1 Do poznámkového bloku
časť pre príjem rádia.
Arduino doska

Arduino Uno

1 Do poznámkového bloku
Trimmerový odpor 1 Do poznámkového bloku
Rezistor

Pred pripojením komponentov je vhodné stiahnuť si firmvér, aby ste sa uistili, že doska funguje. Po zložení môžete opäť blikať, doska by mala pokojne blikať. V projektoch s vysokovýkonnými spotrebičmi v 5V napájacom obvode dosky (adresovateľný LED pásik, servá, motory atď.) je potrebné pred pripojením Arduina k počítaču pripojiť externé 5V napájanie, pretože USB neposkytuje potrebný prúd, ak to napríklad pás vyžaduje. To môže spáliť ochrannú diódu na doske Arduino. Návod na stiahnutie a nahranie firmvéru nájdete pod spojlerom na ďalšom riadku.

Obsah priečinkov v archíve

  • knižnice– projektové knižnice. Nahradiť existujúce verzie
  • firmvéru- Firmvér pre Arduino
  • schém– schémy zapojenia komponentov

Okrem toho

  • Ako ukázal experiment, snímač teploty vonku ukazuje o 0,5 stupňa menej ako vo vnútri! Je potrebné úspešnejšie usporiadať elektroniku, odoberať a chrániť teplo z vykurovacích telies ...

  • Ak je displej príliš tmavý/biely
    Na doske ovládača displeja (ku ktorej sú pripojené vodiče) je gombík kontrastu, pomocou ktorého môžete nastaviť kontrast na požadovaný. Taktiež kontrast závisí od uhla pohľadu displeja (ide o LCD) a displej si viete nastaviť pre jasné zobrazenie aj pod uhlom “displej je v úrovni pupka, pozeráme sa zhora”. A kontrast silno závisí od napájania: od 5V displej zobrazuje čo najjasnejšie a najjasnejšie, pri napájaní z USB cez Arduino bude napätie cca 4,5V (časť dopadá na ochrannú diódu pozdĺž USB riadok) a displej nie je taký jasný. Nastavte výstup pomocou gombíka s externým napájaním od 5V!

  • Ak snímač CO2 nefunguje správne (infa od Evgeny Ivanov)
    V zložke knižnice snímačov sú v príkladoch náčrty na kalibráciu. dá sa tiež spustiť ako hlúposť skratovaním „HD“ konektora k zemi na 7+ sekúnd.
    Samozrejme, priamo na ulici v chlade to nie je potrebné ... stačí naplniť fľašu čerstvým vzduchom so senzorom vo vnútri a utesniť ju. kalibrácia trvá minimálne 20 minút.
    Štandardne je snímač dodávaný so zapnutou autokalibráciou, ktorá prebieha každý deň a ak sa snímač používa v nevetranej miestnosti, tak táto kalibrácia rýchlo naberie hodnoty od normy za horizont, preto ju treba deaktivovať .
    Dokumentácia.

  • Automatická kalibrácia snímača CO2 je v náčrte zakázané!

  • Ak máte Senzor BME280 nefunguje, s najväčšou pravdepodobnosťou má inú adresu. Projekt využíva knižnicu Adafruit_BME280, ktorá nemá samostatnú funkciu zmeny adresy, takže adresa sa nastavuje manuálne v súbore knižnice Adafruit_BME280.h takmer na začiatku súboru ( je v priečinku Adafruit_BME280 v priečinku vašich knižníc, mali ste ho tam nainštalovať), môj modul mal adresu 0x76. Ako zistím adresu svojho modulu BME280? Existuje špeciálna skica nazývaná i2c skener. Môžete si to vygoogliť, môžete. Flash tento náčrt, otvorte port a získajte zoznam adries zariadení pripojených k zbernici i2c. Aby vás ostatné moduly neobťažovali, môžete ich vypnúť a nechať len BME280. Zadáme prijatú adresu v knižnici, uložíme súbor a načítame firmvér hodín počasia. Všetko!

  • Ak sú hodiny pozadu, problém je s najväčšou pravdepodobnosťou v napájacom obvode. Ak problém pretrváva aj pri výmene napájacieho zdroja za lepší, zaveste kondenzátor na napájanie modulu RTC (spájkujte priamo na doske na VCC a GND): nevyhnutne keramický, 0,1-1 uF (označenie 103 alebo 104, pozri tabuľku s označením ). Môžete tiež pridať elektrolyt (6,3 V, 47-100 uF)

Nastavenia firmvéru

#define RESET_CLOCK 0 // resetovanie hodín počas načítavania firmvéru (pre modul s nevyberateľnou batériou). Nezabudnite zadať 0 a znova blikať! #define SENS_TIME 30000 // čas obnovenia údajov snímača na obrazovke, milisekundy #define LED_MODE 0 // Typ RGB LED: 0 - hlavná katóda, 1 - hlavná anóda #define LED_BRIGHT 255 // Jas CO2 LED (0 - 255) # definuj BLUE_YELLOW 1 // žltá farba namiesto modrej (1 áno, 0 nie), ale kvôli funkciám pripojenia žltá nie je taká jasná #define DISP_MODE 1 // zobrazenie v pravom hornom rohu: 0 - rok, 1 - deň v týždni , 2 - sekundy #define WEEK_LANG 1 // jazyk dňa v týždni: 0 - angličtina, 1 - ruština (prepis) #define DEBUG 0 // zobrazenie protokolu inicializácie snímača pri spustení #define PRESSURE 1 // 0 - tlak graf, 1 - graf predpovede dažďa (namiesto tlaku ). Nezabudnite opraviť limity grafu // limity zobrazenia pre grafy #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 #2002_MAX

Môj kolega nedávno usporiadal malý vedecký veľtrh.
Môj učiteľ ma požiadal, aby som študentom vysokej školy predstavil projekt elektroniky. Mal som dva dni na to, aby som vymyslel niečo zaujímavé a dostatočne jednoduché.



Keďže poveternostné podmienky sú tu dosť premenlivé, a teplota sa pohybuje v rozmedzí 30-40°C, rozhodol som sa vyrobiť si domácu meteostanicu.

Aké sú funkcie domácej meteostanice?
Meteostanica na báze Arduina s displejom je zariadenie, ktoré zhromažďuje údaje o počasí a podmienkach prostredia pomocou rôznych senzorov.

Zvyčajne sú to nasledujúce senzory:

  • vietor
  • vlhkosť
  • dážď
  • teplota
  • tlak
  • výšky

Mojím cieľom je vyrobiť si prenosnú stolnú meteostanicu vlastnými rukami.

Mal by byť schopný definovať nasledujúce parametre:

  • teplota
  • vlhkosť
  • tlak
  • výška

Krok 1: Kúpte si správne komponenty







  • DHT22, snímač teploty a vlhkosti.
  • BMP180, snímač tlaku.
  • Spájka
  • Jednoradový konektor 40 výstupov

Z vybavenia budete potrebovať:

  • spájkovačka
  • kliešte na nosové podložky
  • drôty

Krok 2: Snímač teploty a vlhkosti DHT22







Na meranie teploty sa používajú rôzne senzory. Obľúbené sú DHT22, DHT11, SHT1x

Vysvetlím, ako sa navzájom líšia a prečo som použil DHT22.

Snímač AM2302 využíva digitálny signál. Tento senzor pracuje na jedinečnom kódovacom systéme a technológii senzorov, takže jeho dáta sú spoľahlivé. Jeho senzorový prvok je pripojený k 8-bitovému jednočipovému počítaču.

Každý snímač tohto modelu je tepelne kompenzovaný a presne kalibrovaný, kalibračný koeficient je uložený v jednorazovej programovateľnej pamäti (OTP pamäť). Pri čítaní hodnoty snímač vyvolá koeficient z pamäte.

Vďaka malým rozmerom, nízkej spotrebe energie, veľkej prenosovej vzdialenosti (100 m) je AM2302 vhodný pre takmer všetky aplikácie a 4 výstupy v rade veľmi uľahčujú inštaláciu.

Pozrime sa na výhody a nevýhody troch modelov snímačov.

DHT11

Plusy: nevyžaduje spájkovanie, najlacnejší z troch modelov, rýchly stabilný signál, dosah nad 20 m, silné rušenie.
Nevýhody: Knižnica! Žiadne možnosti rozlíšenia, chyba merania teploty +/- 2°С, chyba merania relatívnej vlhkosti +/- 5%, neadekvátny rozsah nameraných teplôt (0-50°С).
Použitie: záhradníctvo, poľnohospodárstvo.

DHT22

Plusy: nevyžaduje spájkovanie, nízka cena, hladké krivky, malé chyby merania, veľký rozsah merania, dosah nad 20 m, silné rušenie.
Nevýhody: citlivosť by mohla byť vyššia, pomalé sledovanie zmien teploty, potrebná knižnica.
Aplikácie: environmentálne štúdie.

SHT1x

Plusy: nie je potrebné spájkovanie, hladké krivky, malé chyby merania, rýchla odozva, nízka spotreba energie, automatický režim spánku, vysoká stabilita a konzistencia dát.
Zápory: dve digitálne rozhrania, chyba merania úrovne vlhkosti, rozsah meraných teplôt 0-50°C, potrebná knižnica.
Aplikácie: prevádzka v náročných prostrediach a pri dlhodobých inštaláciách. Všetky tri senzory sú relatívne lacné.

Zlúčenina

  • Vcc - 5V alebo 3,3V
  • Gnd - s Gnd
  • Dáta - na druhý pin Arduino

Krok 3: Tlakový snímač BMP180



BMP180 je barometrický snímač atmosférického tlaku s rozhraním I2C.
Senzory barometrického tlaku merajú absolútnu hodnotu okolitého vzduchu. Tento ukazovateľ závisí od konkrétnych poveternostných podmienok a od nadmorskej výšky.

Modul BMP180 mal 3,3V 662k ohmový regulátor, ktorý som vlastnou hlúposťou nechtiac vyhodil do vzduchu. Musel som urobiť silový zdvih priamo na čip.

Kvôli chýbajúcemu stabilizátoru som obmedzený vo výbere zdroja - napätie nad 3,3V zničí snímač.
Ostatné modely nemusia mať stabilizátor, určite ho skontrolujte.

Schéma zapojenia senzora a I2C zbernice s Arduino (nano alebo uno)

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

Povedzme si niečo o tlaku a o tom, ako súvisí s teplotou a nadmorskou výškou.

Atmosférický tlak v žiadnom bode nie je konštantný. Zložitá súhra medzi zemskou rotáciou a sklonom zemskej osi má za následok vznik mnohých oblastí vysokého a nízkeho tlaku, čo následne vedie k denným vzorcom počasia. Pozorovaním zmeny tlaku môžete urobiť krátkodobú predpoveď počasia.

Napríklad pokles tlaku zvyčajne znamená daždivé počasie alebo priblíženie sa búrky (približovanie sa k oblasti nízkeho tlaku, cyklóne). Stúpajúci tlak zvyčajne znamená suché, jasné počasie (nad vami prechádza oblasť vysokého tlaku, tlaková výš).

Atmosférický tlak sa tiež mení s nadmorskou výškou. Absolútny tlak v základnom tábore na Evereste (5400 m n. m.) je nižší ako absolútny tlak v Dillí (216 m n. m.).

Keďže hodnoty absolútneho tlaku sa na každom mieste líšia, budeme sa odvolávať na relatívny tlak alebo tlak na hladine mora.

Meranie výšky

Priemerný tlak na hladine mora je 1013,25 GPa (alebo milibarov). Ak vystúpite nad atmosféru, táto hodnota klesne na nulu. Krivka tohto pádu je celkom pochopiteľná, takže výšku si môžete vypočítať sami pomocou nasledujúcej rovnice: alti=44330*

Ak vezmete tlak na hladine mora 1013,25 GPa ako p0, riešením rovnice je vaša aktuálna nadmorská výška.

Preventívne opatrenia

Majte na pamäti, že BMP180 potrebuje prístup do atmosféry, aby mohol čítať tlak vzduchu, neumiestňujte senzor do uzavretého puzdra. Postačí malý prieduch. Nenechávajte ho však príliš otvorený – vietor zníži tlak a nadmorskú výšku. Zvážte ochranu pred vetrom.

Chráňte pred teplom. Na meranie tlaku sú potrebné presné údaje o teplote. Snažte sa chrániť snímač pred teplotnými výkyvmi a nenechávajte ho v blízkosti zdrojov vysokých teplôt.

Chráňte pred vlhkosťou. Senzor BMP180 je citlivý na úroveň vlhkosti, snažte sa zabrániť prípadnému vniknutiu vody na senzor.

Nezaslepujte snímač. Prekvapením bola citlivosť silikónu v snímači na svetlo, ktoré naň môže dopadať cez otvor v kryte čipu. Pre čo najpresnejšie merania sa snažte chrániť snímač pred okolitým svetlom.

Krok 4: Zostavenie zariadenia







Inštalácia jednoradových konektorov pre Arduino Nano. V podstate sme ich narezali na mieru a trochu obrúsili, aby vyzerali ako keby boli. Potom ich prispájkujeme. Potom nainštalujeme jednoradové konektory pre snímač DHT22.

Nainštalujte odpor 10 kΩ z dátového výstupu na zem (Gnd). Všetko spájkujeme.
Potom rovnakým spôsobom nainštalujeme jednoradový konektor pre snímač BMP180, napájanie urobíme 3,3V. Všetko spájame so zbernicou I2C.

Nakoniec pripojíme LCD displej k rovnakej zbernici I2C ako snímač BMP180.
(Na štvrtý konektor plánujem neskôr pripojiť modul RTC (hodiny reálneho času), aby zariadenie ukazovalo aj čas).

Krok 5: Kódovanie




Stiahnite si knižnice

Ak chcete nainštalovať knižnice na Arduino, kliknite na odkaz

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

tlak SFE_BMP180;

#define ALTITUDE 20,56 #define 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 // na aký digitálny pin sme pripojení

// Odkomentujte akýkoľvek typ, ktorý používate! //#define DHTTYPE DHT11 // DHT 11 #define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 DHT dht(DHTPIN, DHTTYPE); LiquidCrystal_I2C lcd,En_pin,ADRw Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);float 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);

stav = tlak.getTeplota(T); if (stav != 0) ( Serial.print("1"); lcd.clear(); lcd.setCursor(0,0); lcd.print("Baro Temperature: "); lcd.setCursor(0,1 ); lcd.print(T,2); lcd.print(" stupeň C "); t1=T; delay(3000);

stav = tlak.startPressure(3); if (stav != 0) ( // Počkajte na dokončenie merania: delay(status);

stav = tlak.getPressure(P,T); if (stav != 0) (lcd.clear(); lcd.setCursor(0,0); lcd.print("abslt pressure: "); lcd.setCursor(0,1); lcd.print(P,2 );lcd.print(" mb "); delay(3000);

p0 = tlak.hladina mora(P,NADMORSKA); // sme vo výške 1655 metrov (balvan, CO)

a = tlak.nadmorska vyska(P,p0); lcd.clear(); lcd.setCursor(0,0); lcd.print("Nadmorska vyska: "); lcd.setCursor(0,1); lcd.print(a,0); lcd.print("metre"); oneskorenie(3000); ) ) ) ) float h = dht.readHumidity(); // Čítanie teploty ako Celzia (predvolené) float t = dht.readTemperature(); t2=t; lcd.clear(); lcd.setCursor(0,0); // prechod na začiatok 2. riadku lcd.print("Vlhkosť: "); lcd.setCursor(0,1);lcd.print(h); lcd.print("%"); oneskorenie(3000); lcd.clear(); lcd.setCursor(0,0); // prechod na začiatok 2. riadku lcd print("DHT Tempurature: "); lcd.setCursor(0,1); lcd print(t); lcd.print("degC"); oneskorenie(3000); lcd.clear(); lcd.setCursor(0,0); // prejdite na začiatok 2. riadku lcd.print("Priemerná teplota: "); lcd.setCursor(0,1); lcd.print((t1+t2)/2); lcd.print("degC"); oneskorenie(3000); )

Použil som Arduino verzie 1.6.5, kód tomu presne sedí, môžu fungovať aj neskoršie. Ak kód z nejakého dôvodu nesedí, použite verziu 1.6.5 ako základnú.

Sledovanie počasia je veľmi vzrušujúca činnosť. Rozhodol som sa postaviť svoju meteorologickú stanicu na základe populárnej .

Prototyp meteorologickej stanice vyzerá takto:

Funkcie mojej meteostanice:

  • meranie a zobrazovanie izbovej a vonkajšej teploty;
  • zobrazenie aktuálneho času (hodiny a minúty);
  • zobrazenie aktuálnych fáz mesiaca a lunárneho dňa;
  • prenos výsledkov merania do počítača cez sériové pripojenie;
  • prenos výsledkov meraní protokolom MQTT pomocou aplikácie v počítači.


hex
- súbor
firmvér pre (verzia z 9. mája 2018) - .
Ako blikať hex- súbor na palubu Arduino opísal som.

Mikrokontrolér Arduino Nano 3.0

„Srdcom“ mojej meteostanice je mikrokontrolér eBay):

Na ovládanie indikácie a dotazovania snímačov používam časovač 1 Arduino, čo spôsobuje prerušenia s frekvenciou 200 Hz (perióda - 5 ms).

Indikátor

Pre zobrazenie nameraných hodnôt snímačov a aktuálneho času som sa pripojil k Arduinoštvormiestny LED indikátor Foryard FYQ-5643BH so spoločnými anódami (spájajú sa anódy identických segmentov všetkých výbojov).
Indikátor obsahuje štyri sedemsegmentové číslice a dve oddeľujúce (hodinové) bodky:

Anódy indikátora sú pripojené cez odpory obmedzujúce prúd na svorky Arduino:

vypúšťanie 1 2 3 4
záver A3 A2 D3 D9

Segmentové katódy spojené s kolíkmi Arduino:

segment a b c d e f g p
záver D7 D12 D4 D5 D6 D11 D8 D13

Segment indikátora sa rozsvieti, ak má anóda príslušného výboja vysoký potenciál (1) a nízky potenciál (0) na katóde.

Na zobrazenie informácií na indikátore používam dynamickú indikáciu - vždy je aktívna iba jedna číslica. Aktívne výboje sa striedajú s frekvenciou 200 Hz (doba zobrazenia 5 ms). Zároveň je blikanie segmentov pre oči nepostrehnuteľné.

Snímač teploty DS18x20

Pre možnosť diaľkového merania teploty som pripojil čidlo , ktorý poskytuje široký rozsah meraní vonkajšej teploty. Senzor je pripojený na zbernicu 1 drôt a má tri výstupy - výkon ( VCC), údaje ( DAT), Zem ( GND):

výstup snímača VCC DAT GND
záver Arduino 5V A1 GND

Medzi kolíky VCC a DAT Zahrnul som 4,7 k ohm pull-up odpor.

Na prevod medzi stupňami Celzia a Fahrenheita môžete použiť nasledujúcu platňu:

Senzor som umiestnil mimo okna domu v plastovom puzdre z guľôčkového pera:

\

Profesionálne meteostanice používajú Stevensonovu clonu, ktorá chráni teplomer pred priamym slnečným žiarením a umožňuje cirkuláciu vzduchu. obrazovka stevenson):

Snímač tlaku a teploty BMP280

Merkúrové a aneroidné barometre sa tradične používajú na meranie atmosférického tlaku.

AT ortuťový barometer atmosférický tlak je vyvážený hmotnosťou ortuťového stĺpca, ktorého výška sa používa na meranie tlaku:

AT aneroidný barometer používa sa stlačenie a natiahnutie krabice pod atmosférickým tlakom:

Na meranie atmosférického tlaku a izbovej teploty v domácej meteostanici používam senzor - malý smd- 2 x 2,5 mm snímač založený na piezorezistívnej technológii:

Na trhovisku bola zakúpená vreckovka so senzorom eBay:

Senzor je pripojený na zbernicu I2C(údajový kontakt - SDA/SDI, synchronizačný pin - SCL/SCK):

výstup snímača VCC GND SDI SCK
záver Arduino 3v3 GND A4 A5

adafruit- súbory Adafruit_Sensor.h, Adafruit_BMP280.h, Adafruit_BMP280.cpp.

Jednotky atmosférického tlaku

Senzor cez funkciu prečítaťTlak udáva hodnotu atmosférického tlaku v pascaloch. Základnou jednotkou na meranie atmosférického tlaku je hektopascal(hPa) (1 hPa = 100 Pa), ktorého analógom je jednotka mimo systému " milibar" (mbar) (1 mbar = 100Pa = 1hPa). Na prevod medzi bežne používanou nesystémovou tlakovou jednotkou " milimeter ortuti" (mm Hg) a hektopascaly, používajú sa tieto pomery:
1 hPa = 0,75006 mmHg čl. ≈ 3/4 mm Hg; 1 mmHg =1,3332 hPa ≈ 4/3 hPa.

Závislosť atmosférického tlaku od nadmorskej výšky

Atmosférický tlak môže byť vyjadrený v absolútnej aj relatívnej forme.
Absolútny tlak QFE(Angličtina) absolútny tlak) je skutočný atmosférický tlak bez zohľadnenia korekcie nad hladinou mora.
Atmosférický tlak klesá asi o 1 hPa s nárastom nadmorskej výšky 1 m:

Barometrický vzorec vám umožňuje určiť korekciu hodnôt barometra na získanie relatívneho tlaku (v mmHg):
$\Delta P = 760 \cdot (1 - (1 \over (10^ ( (0,0081350 \cdot H) \over (T + 0,00178308 \cdot H) )))))$ ,
kde $T$ je priemerná teplota vzduchu na Rankinovej stupnici, ° Ra, $H$ - výška nad hladinou mora, stopy.
Prevod stupňov Celzia na stupne Rankina:
$^(\circ)Ra = (^(\circ)C \cdot 1,8) + 491,67 $
Barometrický vzorec sa používa na barometrickú niveláciu – určenie výšok (s chybou 0,1 – 0,5 %). Vzorec nezohľadňuje vlhkosť vzduchu a zmenu zrýchlenia voľného pádu s výškou. Pre malé výškové rozdiely možno túto exponenciálnu závislosť aproximovať s dostatočnou presnosťou lineárnou závislosťou.
Relatívny tlak QNH(Angličtina) relatívny tlak, Námorná výška v kóde Q) je atmosférický tlak upravený pre strednú hladinu mora. Stredná hladina mora, MSL) (pre ISA a teplotu 15 stupňov Celzia) a na začiatku sa nastavuje s ohľadom na nadmorskú výšku, v ktorej sa meteorologická stanica nachádza. Dá sa zistiť z údajov meteorologickej služby, údajov kalibrovaných prístrojov na verejných miestach, letiska (zo správ METAR), z internetu.
Napríklad pre neďaleké letisko Gomel ( UMGG) Vidím aktuálnu správu o počasí METAR na ru.allmetsat.com/metar-taf/russia.php?icao=UMGG:
UMGG 191800Z 16003MPS CAVOK M06/M15 Q1014 R28/CLRD//NOSIG ,
kde Q1014- tlak QNH na letisku je 1014 hPa.
História bulletinov METAR k dispozícii na stránke aviationwxchartsarchive.com/product/metar.
Pre normálny relatívny tlak vzduchu QNH akceptovaný je tlak 760 mm Hg. čl. alebo 1013,25 hPa (pri teplote 0ºС, pod zemepisnou šírkou 45º severnej alebo južnej pologule).
Nastavil som tlak pre aneroidný barometer QNH s nastavovacou skrutkou citlivosti:

Predpoveď počasia

Analýza zmien tlaku umožňuje zostaviť predpoveď počasia a jej presnosť je tým vyššia, čím prudšie sa tlak mení. Napríklad staré pravidlo navigátora hovorí, že pokles tlaku o 10 hPa (7,5 mmHg) za 8 hodín znamená, že je na ceste silný vietor.

Odkiaľ pochádza vietor? Vzduch prúdi do stredu oblasti nízkeho tlaku, vietor- horizontálny pohyb vzduchu z oblastí vysokého tlaku do oblastí nízkeho tlaku (vysoký atmosférický tlak stláča vzduchové hmoty do oblastí nízkeho atmosférického tlaku). Ak je tlak veľmi nízky, vietor môže dosiahnuť búrka. Zároveň v oblasti znížený tlak (barická depresia alebo cyklóna), teplý vzduch stúpa a vytvára oblačnosť, ktorá často prináša dážď alebo sneh.

Smer vetra v meteorológii je smer, z ktorého vietor fúka:

Tento smer je zredukovaný na osem bodov.

Algoritmus sa často používa na predpovedanie počasia na základe atmosférického tlaku a smeru vetra. Zambretti.

Senzor vlhkosti

Na určenie relatívnej vlhkosti vzduchu používam modul DHT11(kúpené na trhu eBay):

Senzor vlhkosti DHT11 má tri výstupy - výkon ( + ), údaje ( von), Zem ( - ):

výstup snímača + von -
záver Arduino 5V D10 GND

Na prácu so snímačom používam knižnicu od adafruit- súbory DHT.h, DHT.cpp.

Vlhkosť charakterizuje množstvo vodnej pary obsiahnutej vo vzduchu. Relatívna vlhkosť zobrazuje podiel vlhkosti vo vzduchu (v percentách) vo vzťahu k maximálnemu možnému množstvu pri aktuálnej teplote. Používa sa na meranie relatívnej vlhkosti :

Pre človeka je optimálny rozsah vlhkosti vzduchu 40 ... 60%.

Hodiny reálneho času

Ako hodiny reálneho času som použil modul RTC DS1302(na trhu bola zakúpená vreckovka s hodinkami eBay):

modul DS1302 pripojený k autobusu 3 drôt. Ak chcete použiť tento modul s Arduino vyvinutá knižnica arduino_RTC( od iarduino.ru).

Doska s modulom DS1302 má päť kolíkov, ktoré som spojil s kolíkmi dosky Arduino Nano:

záver RTC VCC GND RST CLK DAT
záver Arduino 5V GND D2 D1 D0

Aby som zachoval správne hodnoty hodín pri vypnutom napájaní, vložil som do zásuvky na doske batériu. CR2032.

Presnosť môjho hodinového modulu nebola veľmi vysoká - hodiny sú rýchlejšie asi o jednu minútu za štyri dni. Preto som po zapnutí meteostanice vynuloval minúty na „nulu“ a hodiny na najbližšie podržaním tlačidla pripojeného na pin A0 Arduina. Po inicializácii sa pin A0 používa na prenos dát cez sériové pripojenie.

Prenos dát do počítača a práca cez protokol MQTT

Na prenos údajov cez sériové pripojenie do Arduino spája USB-UART prevodník:

Záver Arduino slúži na prenos údajov vo formáte 8N1(8 dátových bitov, žiadna parita, 1 stop bit) pri 9600 bps. Dáta sa prenášajú v paketoch a dĺžka paketu je 4 znaky. Prenos dát sa vykonáva v " malý tresk", bez použitia hardvérového sériového portu Arduino.

Formát prenášaných údajov:

Parameter 1. bajt 2. bajt 3. bajt 4. bajt
vonkajšia teplota o priestor alebo mínus desiatky stupňov alebo priestor jednotky stupňov
izbová teplota i priestor alebo mínus desiatky stupňov alebo priestor jednotky stupňov
Atmosférický tlak p stovky mm čl. desiatky mm Hg jednotky mmHg s.
relatívna vlhkosť h priestor desiatky percent alebo priestor jednotky percent
aktuálny čas desiatky hodín jednotky hodín desiatky minút jednotky minút

MQTT

golang aplikácia - protokolový klient MQTT, ktorý odosiela informácie prijaté z meteorologickej stanice na server ( MQTT- maklér) :

servis vám umožňuje vytvoriť si účet s bezplatným plánom " " (limity: 10 pripojení, 10 Kbps):

Na sledovanie hodnôt meteorologickej stanice môžete použiť Android- Príloha :

Jedlo

Na napájanie meteostanice používam nabíjačku zo starého mobilu. Motorola, ktorý vydáva napätie 5 V s prúdom do 0,55 A a je pripojený ku kontaktom 5V(+) a GND (-):

Na napájanie môžete použiť aj 9 V batériu, pripojenú na kontakty VIN(+) a GND (-).

Prevádzka meteostanice

Pri spustení sa senzory inicializujú a skontrolujú.

Pri absencii snímača DS18x20 ak nie je k dispozícii žiadny snímač, zobrazí sa chyba „E1“. - chyba "E3".

Potom sa spustí pracovný cyklus meteorologickej stanice:

  • meranie a zobrazovanie vonkajšej teploty;
  • meranie a zobrazenie izbovej teploty;
  • meranie a zobrazovanie atmosférického tlaku a trendu jeho zmeny;
  • meranie a zobrazovanie relatívnej vlhkosti vzduchu;
  • zobrazenie aktuálneho času;
  • zobrazenie fázy mesiaca a lunárneho dňa.


Video mojej meteorologickej stanice je dostupné na mojom -kanál: https://youtu.be/vVLbirO-FVU

Zobrazenie teploty

Pri meraní teploty sa zobrazujú dve číslice teploty a pre zápornú teplotu znamienko mínus (so symbolom stupňa na číslici úplne vpravo);
pre vonkajšiu teplotu sa v hornej časti zobrazuje znak stupňa:


pre izbovú teplotu - nižšie:

Zobrazenie tlaku

Pri meraní tlaku sa zobrazujú tri číslice tlaku v mmHg (so symbolom " P"na číslici úplne vpravo):

Ak tlak prudko klesol, potom namiesto symbolu " P„znak“ sa zobrazí číslicou úplne vpravo L"ak prudko vzrástol - potom" H". Kritérium pre ostrosť zmeny je 8 mm Hg za 8 hodín:

Keďže moja meteorologická stanica zobrazuje absolútny tlak ( QFE), potom sa hodnoty ukážu ako trochu podhodnotené v porovnaní s informáciami v súhrne METAR(ktorý poskytuje QNH) (14 UTC, 28. marca 2018):

Pomer tlaku (podľa ATIS) bola $(1015 \viac ako 998) = $1,017. Nadmorská výška letiska Gomel (kód ICAO UMGG) nad morom je 143,6 m. Teplota podľa ATIS bola 1 ° C.

Údaje mojej meteorologickej stanice sa takmer zhodovali s absolútnym tlakom QFE podľa ATIS!

Max/min tlak ( QFE) zaznamenané mojou meteorologickou stanicou za celé obdobie pozorovania:

Zobrazenie relatívnej vlhkosti

Relatívna vlhkosť vzduchu sa zobrazuje v percentách (symbol percent je zobrazený v dvoch pravých čísliciach):

Zobrazenie aktuálneho času

Aktuálny čas sa zobrazuje na indikátore vo formáte „HH:MM“, pričom oddeľovacia dvojbodka bliká raz za sekundu:

Zobrazenie fáz mesiaca a lunárneho dňa

Prvé dve číslice indikátora zobrazujú aktuálnu lunárnu fázu a ďalšie dve - aktuálny lunárny deň:

Mesiac má osem fáz (uvádzajú sa anglické a ruské (modré - nepresné) názvy):

Na indikátore fázy sú zobrazené piktogramy:

fáza piktogram
rastúci kosák (mesiac)
ubúdajúci polmesiac (mesiac)

Prenos dát do počítača

Ak pripojíte meteostanicu s USB-UART prevodník (napríklad na základe mikroobvodu CP2102) pripojený k USB-port počítača, potom môžete pomocou programu terminálu sledovať údaje prenášané meteorologickou stanicou:

Vyvíjal som v programovacom jazyku golang program, ktorý vedie denník meteorologických pozorovaní a odosiela údaje do služby a je možné si ju pozrieť na Android-smartfón pomocou aplikácie :

Podľa denníka meteorologických pozorovaní môžete napríklad zostaviť graf zmien atmosférického tlaku:
príklad grafu s viditeľným minimom tlaku


príklad grafu s miernym zvýšením tlaku

Plánované vylepšenia:

  • pridanie snímačov smeru a rýchlosti vetra

V meteorologických staniciach sa na meranie rýchlosti vetra používa anemometer s tromi šálkami (1) a na určenie smeru vetra sa používa korouhvička (2):

Používa sa aj na meranie rýchlosti vetra. vláknité anemometre s horúcim drôtom(Angličtina) anemometer s horúcim drôtom). Ako vyhrievaný drôt môžete použiť volfrámové vlákno zo žiarovky s rozbitým sklom. V priemyselných anemometroch s horúcim drôtom je snímač zvyčajne umiestnený na teleskopickej trubici:

Princíp činnosti tohto zariadenia spočíva v tom, že teplo sa odoberá z vykurovacieho telesa konvekciou prúdením vzduchu - vetrom. V tomto prípade je odpor vlákna určený teplotou vlákna. Zákon zmeny odporu vlákna $R_T$ od teploty $T$ má tvar:
$R_T = R_0 \cdot (1 + (\alpha \cdot (T - T_0)))$ ,
kde $R_0$ je odpor vlákna pri teplote $T_0$, $\alpha$ je teplotný koeficient odporu (pre volfrám $\alpha = 4,5\cdot(10^(-3) (^(\circ)(C^ (-1))))$).

So zmenou rýchlosti prúdenia vzduchu sa teplota mení pri konštantnom prúde vlákna (anemometer s jednosmerným prúdom, eng. CCA). Ak je teplota vykurovacieho telesa udržiavaná na konštantnej hodnote, potom prúd cez teleso bude úmerný rýchlosti prúdenia vzduchu (anemometer konštantnej teploty, vr. CTA).

Pokračovanie nabudúce

KATEGÓRIE

POPULÁRNE ČLÁNKY

2022 "kingad.ru" - ultrazvukové vyšetrenie ľudských orgánov