Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • U kontaktu sa
  • Projekti Arduino pro mini meteoroloških stanica. BMP085 Modul senzora barometrijskog tlaka za arduino (ili kako napraviti meteorološku stanicu vlastitim rukama)

Projekti Arduino pro mini meteoroloških stanica. BMP085 Modul senzora barometrijskog tlaka za arduino (ili kako napraviti meteorološku stanicu vlastitim rukama)

Kao i većina zaposlenih ljudi, bavljenje vlastitim projektima oduzima vam jedino slobodno vrijeme koje vam preostaje. Zato dugo nisam ništa stvarao i žudio sam da nešto uradim. Ova prilika pojavio, začudo, na univerzitetu. Iza prozora je septembar, 4. godina i nadolazeći kurs o dizajnu kola. Rečeno nam je da se nastavni rad može raditi u dvije varijante: papir i hardver.

Punih 5 godina na našem fakultetu se radila nastava na papiru po principu „uzmi stare i složi ih“. Ovakav pristup mi nije odgovarao zbog svoje rutine, pa sam odmah odabrao nastavu iz hardvera. Kao srž predmeta je predloženo Arduino mikrokontroler zbog svoje lakoće učenja. Nakon određivanja vrste nastave, ostalo je još jedno pitanje: šta tačno treba uraditi. Kako nisam imao iskustva u programiranju mikrokontrolera, odmah sam otvorio Google i počeo proučavati postojeće projekte. Postoji mnogo projekata, neki od njih su prilično jednostavni, neki su genijalni (3D skener, na primjer), ali velika većina nije imala praktična primjena. A ja sam samo htjela nešto što neće ležati na polici i skupljati prašinu. Nakon polusatnog izleta u svijet Arduina, zainteresirala sam se za temu kućnih meteoroloških stanica, a projekti se nisu činili teškim za implementaciju (što je uglavnom privuklo pridošlicu).

Ovako je odabrana tema za nastavni rad i vremenom se činilo da nije bilo problema.

Odabir komponenti

Gledajući kroz različite projekte, shvatio sam da je Nano ili čak Pro Mini, ali sam ipak odabrao Arduino Uno u nadi da bih želio programirati za Arduino i da ću implementirati još neke projekte u budućnosti. Nikada prije nisam držao lemilicu u rukama, pa sam radi lakšeg razvoja odlučio kupiti i Sensor Shield v4.

Više detalja

Naknada doprinosi brza veza senzore, module, servo motore, serijski i I2C interfejs, a takođe prikazuje sve portove kontrolera Duemilanova/Uno form faktora (može se povezati i na mega seriju, ali sa ograničenjima i posledicama). Podržava druge štitove na sebi.


Za izvore meteoroloških podataka odabrao sam sljedeće senzore:


Odlučio sam se za senzore. Ali šta učiniti s podacima koji dolaze od senzora? Odlučio sam da ga prikažem. Želeo sam sliku u boji, pa sam odmah odbacio jednobojna rešenja. Nakon nekoliko minuta pretraživanja, odabran je ST7735 TFT ekran od 1,8 inča.

Više detalja

Budući da zaslon koristi 4-žični SPI protokol za komunikaciju i ima vlastiti bafer okvira koji se može adresirati u pikselima, može se koristiti sa bilo kojom vrstom mikrokontrolera. Ekran od 1,8 inča ima 128x160 piksela u boji. Tu je i slot za kartice microSD memorija, stoga možete lako preuzeti punu boju rasterske slike od FAT16/FAT32 sistem podataka microSD kartice.

karakteristike:

  • Dijagonala ekrana - 1,8 inča, rezolucija 128x160 piksela, 18-bitna boja (262.144 boje)
  • Kontroler sa ugrađenim pikselskim adresiranjem bafera video memorije
  • Ugrađeni microSD slot - koristi više od 2 digitalne linije
  • Kompatibilan sa 3.3 i 5V
  • Dimenzije: 34 mm x 56 mm x 6,5 m


Programiranje Arduino kontrolera

Nakon što smo se odlučili za komponente za meteorološku stanicu, počet ćemo s programiranjem kontrolera. Okruženje korišteno za Arduino firmver Arduino razvoj IDE. Također se koriste biblioteke iz Adafruita.

Prije nego pređemo na skicu, pogledajmo funkcionalnost:

  • Očitavanja se uzimaju sa senzora svakih 10 sekundi i na ekranu se ažuriraju samo oni indikatori koji su se promijenili u odnosu na prethodno mjerenje
  • Implementiran prijenos podataka preko COM porta

Skica

#include // biblioteka za komunikaciju sa I2C uređajima #include // Osnovna biblioteka za sve senzore #include // biblioteka za BMP180 #include // Osnovna grafička biblioteka #include // Biblioteka specifična za hardver #include // biblioteka za komunikaciju sa SPI uređajima #include "dht.h" // biblioteka za DHT #define DHT22_PIN 2 // poveži podatkovni pin DHT22 na 2 digitalna pina #define TFT_CS 10 // poveži CS pin TFT-a na 10 digitalni pin #define TFT_RST 9 // spojite RST pin TFT-a na 9 digitalni pin // ovo također možete povezati s Arduino resetiranjem // u tom slučaju postavite ovaj #define pin na 0! #define TFT_DC 8 // povežite DC pin TFT-a na 8 digitalni pin Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); //inicijaliziraj TFT #define TFT_SCLK 13 // poveži SCLK pin TFT-a na 13 digitalni pin #define TFT_MOSI 11 // poveži MOSI pin TFT-a na 11 digitalni pin dht DHT; Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085); //inicijaliziraj BMP180 int bmpFlag = 0; struct (uint32_t ukupno; uint32_t ok; uint32_t crc_error; uint32_t time_out; uint32_t connect; uint32_t ack_l; uint32_t ack_h; uint32_t nepoznato; ) stat = (0,0,0,0,0); // struktura za dht status void setup(void) ( Serial.begin(9600); Serial.println("Meteo test"); Serial.println(""); if(!bmp.begin()) // provjerite vezu za BMP180 ( Serial.print("Ups, nije otkriven BMP180 ... Provjerite svoje ožičenje ili I2C ADDR!"); bmpFlag = 1; ) tft.initR(INITR_BLACKTAB // Inicijalizirajte TFT i popunite crnom bojom tft.fillScreen); (ST7735_BLACK) tft.setRotation() + 1.5 // kašnjenje da bi se osiguralo da je TFT inicijaliziran) // posljednji izmjereni podaci float = 0, oldAltitude = 0); oldPrissure = 0, oldDHTHvlažnost = 0, oldDHTTemperature; bool wasUpdate = lažno; void loop(void) ( if(Serial.available() > 0) // imamo podatke serijski port ( Serial.read(); // čitamo bajt sa serijskog porta i šaljemo posljednje izmjerene podatke printValue("Pressure", oldPressure) , "hPa", false("Temperatura", oldTemperature, "C", false("Altitude", "m", false); false ("DHT_temperature", oldDHTTemperature, "C", false) sensors_event_t event if(bmpFlag == 0)(bmp.getEvent(&event) ; // dobiti podatke iz BMP180); if (event.pressure) ( bmp.getTemperature(&temperature); float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA; altitude = bmp.pressureToAltitude(seaLevelPressure, event.pressure, temperature); ) else ( Serial.println(");3)t greška start = micros() int chk = DHT.read22(DHT22_PIN); ; break; case DHTLIB_ERROR_CHECKSUM: stat.crc_error++; Serial.print("Greška kontrolne sume,\t"); break; slučaj DHTLIB_ERROR_TIMEOUT: stat.time_out++; Serial.print("Greška isteka vremena,\t"); break; case DHTLIB_ERROR_CONNECT: stat.connect++; Serial.print("Greška povezivanja,\t"); break; case DHTLIB_ERROR_ACK_L: stat.ack_l++; Serial.print("Ack Low error,\t"); break; case DHTLIB_ERROR_ACK_H: stat.ack_h++; Serial.print("Ack High error,\t"); break; default: stat.unknown++; Serial.print("Nepoznata greška,\t"); break; ) if(bmpFlag ! = 0 || !event.pressure) // ažuriranje podataka ( tft.fillRect(0, 30, 160, 6, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED); printValue("GREŠKA BMP INITIALIZATION", 0 , "", true ) else ( if(event.pressure != oldPressure) ( tft.fillRect(0, 30, 160, 7, ST7735_BLACK); tft.setCursor(0, 30); tft.setTextColor(ST7735_RED) ; printValue) ; ("Pritisak", "hPa", "staropritisak" = "Temperatura" ; "C", trueTemperature = tft.fillRect(0, 46, 160, 7, tft.setCursor(0, 46) tft. visina, "m", true wasUpdate = true ) ) if(DHT.humidity != oldDHTHumidity) (tft.fillRect(0, 54, 160, 7, ST7735_BLACK); tft.setCursor(0, 54); tft.setTextColor(ST7735_GREEN); printValue("Vlažnost", DHT.vlažnost, "%", istina); oldDHTHumidity = DHT.vlažnost; wasUpdate = istina; ) if(DHT.temperature != oldDHTTemperature) ( tft.fillRect(0, 80, 160, 7, ST7735_BLACK); tft.setCursor(0, 80); tft.setTextColor(ST7735_YELLOW); printValue.("DHT_tempera."), temperatura, " C ", oldDHTTemperature = DHT.temperatura = istina (wasUpdate) (Serial.println("END_TRANSMISSION"); ) wasUpdate = false; kašnjenje (10000); ) void printValue(char* naslov, dvostruka vrijednost, char* mjera, bool tftPrint) ( if(tftPrint) // ispis podataka na TFT ( tft.print(title); tft.print(": "); tft.print( vrijednost tft.println(measure ) Serial.print(title);

Vrijeme je da sastavite tijelo

Glavni uvjet rada bio je radni prototip u prezentabilnom obliku. Stoga sam morao kupiti kućište i, naoružan turpijem, na bilo koji način umetnuti meteorološku stanicu u kućište.

Kućište je kupljeno u lokalnoj radnji radio elektronike.

Okvir

(Kućište na fotografiji je malo drugačije. Imam prozirni poklopac)



Zatim su pomoću datoteke napravljene rupe za izlaz senzora i napajanje. Odlučio sam da izmjestim senzore van, jer sam prilikom testiranja sistema bez kućišta primijetio da se stražnji dio ekrana jako zagrijao, što bi uticalo na temperaturu unutar kućišta.

Kućište sa otvorima za senzore i napajanje



Pošto sam morao da zalemim noge na 2 senzora i na jednom sam zapalio stazu, odlučio sam da ne iskušavam sudbinu i da ne lemim žice na senzore (vežbaću na nečem drugom), već da bih spojio da budem manje-više pouzdan, odlučio sam da premotam električnu traku.

Sistem prije nego što se „nabije“ u kućište



Pošto je kućište mnogo veće od Arduina (manjeg nije bilo), morao sam smisliti oslonac kako se ploča ne bi pomicala unutar kućišta. Takođe, iz pene je izrezana figura, au njoj je bio pravougaonik za ekran kako bi se sakrila unutrašnjost kućišta. Nisam imao super ljepilo pri ruci, pa sam morao koristiti dvostranu traku.

Čudo-yuda riba-kit



Zavrnite poklopac, priključite napajanje i pričekajte.

Završena meteorološka stanica u zgradi



Nakon prikaza rezultata na ekranu, identifikujemo neprijatnu grešku u merenju vlažnosti: DHT22 marljivo daje brojku od 99,90% (1,00% je izuzetno retko). Počnimo da otkrivamo u čemu je problem. Prva stvar koju radimo je da pogledamo izlaz vrijednosti ​​​na COM port. Dobro je. Nakon nekoliko dopunjavanja, rastavljanja i ponovnog sastavljanja kućišta, pada mi na pamet ideja da odgovor potražimo na Google-u. Očekivano, ruski Google nije rekao ništa korisno. UREDU. Počinjemo da tražimo na engleskom i na jednom od foruma nailazimo na momke sa sličnim problemom. Prve četiri stranice rasprave ne daju ništa korisno, ali na petoj strani nalazimo odgovor na naše pitanje:
Senzori vlažnosti mogu lako biti pogođeni pogrešnim plinovima ili vrlo dugom izloženošću visokoj vlažnosti IIRC. U datasheet-u postoji procedura kako da "resetujete" senzor, možete ga isprobati.

Ostalo je samo pitanje kada i kako sam uspio oštetiti DHT22. Ali približavalo se vrijeme za polaganje predmeta i zato sam ostavio rješenje ovog problema za kasnije.

Pogovor

Radovi su položeni. Meteorološka stanica je odgođena na neodređeno vrijeme dok se ne zatvore sva jalovišta na univerzitetu. Međutim, morali smo se vratiti na meteorološku stanicu ranije nego što sam mislio. Desilo se da sam sredinom novembra promijenio radno mjesto i u novom timu upoznao ljude koji su zainteresovani za Arduino platformu i slično. Stoga je moje interesovanje za ovu platformu, bez vremena da se ohladi, ponovo rasplamsalo. Izvadio sam svoju meteorološku stanicu, spojio je na kompjuter i sjetio se da sam implementirao prijenos podataka sa Arduina preko COM porta. A onda mi je sinula ideja da napišem program koji prima podatke preko COM porta od Arduina i prenosi te podatke na javni nadzor
  • Arduino
  • Dodaj oznake

    Nastavljamo sa razvojem naše meteorološke stanice.

    Prije nego što pređemo na ažuriranje, želim malo pojasniti.

    Jedan od naših kolega mi je napisao pitanje zašto je uveden watchdog tajmer?

    Watchdog tajmer je postavljen u slučaju nužde. Kao što pokazuje praksa, ENC28J60 ne traje duže (ako memorija ne pokvari) 4 istovremene veze. S obzirom na to koliko se servisnih konekcija stalno javlja za održavanje rada same mreže, a tek prepušteni promet koji stvaraju razne vrste igračaka za domaćinstvo (npr. modernih televizora, skeniranje dostupnih hostova na mreži i njihovih otvorenih portova) dizajn jednostavno pada u stupor. ENC28J60 ne može raditi samostalno mrežni protokoli i sve je implementirano u bibliotekama. Možda su to samo oni.
    Provjerio sve dostupne biblioteke i različiti moduli(iznenada brak), ali postići stabilan rad Nisam to mogao dugo vremena. Maksimalni rok bilo oko 3-4 sedmice.
    Zbog toga se "pas" tu vrti i, ako se nešto dogodi, povlači kontroler. Nakon ovoga problem je nestao.
    Također ne poričem da mogu postojati određene nijanse ili problemi u mojoj kućnoj mreži. Ali pošto sam ja imao problem, možda ga ima i druga osoba. Do sada sam pronašao samo ovo rješenje.
    Koliko ja znam, čipovi iz Wizneta (W5100 i noviji) nemaju ovo, ili jednostavno nisu izgledali dovoljno dobro.

    Idemo dalje na ažuriranje

    Ono što je najvažnije, mi se udaljavamo od čipa ENC28J60 i idi na W5100. Pokušao sam sve implementirati na starom čipu, ali nema dovoljno memorije mikrokontrolera zbog veoma velikih biblioteka za ENC28J60. Kada koristite novi čip, standardno biblioteke od programera i svih napravljenih promjena, ostaje još više 20% slobodna memorija mikrokontroler ATMega328. A ovo su nove lepinje!

    U ovoj verziji (nazovimo je drugom) mogućnost prijenosa očitavanja sa senzora putem bežična komunikacija koristeći frekvenciju 433 MHz. Same module sam uzeo od Kineza, oznake XY-MK-5V. Želio bih napomenuti da je kvalitet prijenosa daleko od savršenog. Mogući gubitak signala, šum, nemogućnost istovremenog prenosa itd, itd. Ali njihova cijena (manje od 1 USD po setu) kompenzira ove nedostatke. Odaću vam tajnu da se ovi (najjeftiniji) moduli nalaze u mnogim brendiranim meteorološkim stanicama za kućnu upotrebu. Vau, neočekivano?

    Počnimo sa baznom stanicom

    Selimo se u Arduino UNO I Ethernet Shield(prva verzija) bazirana na čipu W5100. Ovo je sendvič i nema smisla ga opisivati. Opisaću samo dodatno uključene kontakte za module XY-MK-5V.

    Modul predajnika koristi napajanje 5V, GND(gdje bismo bili bez majke) i D2 pin na kontroleru. Uredite kontakt D2 (Podaci) možete koristiti funkciju vw_set_tx_pin iz vw biblioteke.

    Za razliku od prethodne skice, ova uključuje dvije dodatne biblioteke:

    #include #include

    Sama skica

    Skriveni tekst

    #include #include #include #include #include #include #include #include #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); bajt mac = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); char server = "narodmon.ru"; int port = 8283; IP adresa ip(192,168,0,201); EthernetClient klijent; BMP085 dps = BMP085(); dugo Temperatura = 0, Pritisak = 0; float H, dP, dPt; bool interval = istina; EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( ID bajta; // ID uređaja int Temperatura; // Temperatura plutajući Tlak; // Tlak plutajući Vlažnost; // Vlažnost float rosa; // Tačka rose/mraz ); SEND_DATA_STRUCTURE emitiranje; void setup() ( // Inicijaliziraj Watchdog timer wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // Inicijaliziraj konzolu Serial.begin(9600); // Inicijaliziraj DHT senzor dht.begin(); / / Inicijalizacija 433 MHz modula ET.begin(details(broadcast)); vw_set_tx_pin(2000); // dodijelimo sebi adresu if (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // Inicijalizacija 1-Wire Wire.begin(); init (MODE_STANDARD, 3200, true) // Inicijalizacija BMP180 dps.init() // Šalje prve podatke odmah nakon uključivanja funkcije send_info(true)); NOAA / / referenca (1) : http://wahiduddin.net/calc/density_algorithms.htm // referenca (2) : http://www.colorado.edu/geography/weather_station/Geog_site/about.htm double dewPoint( dvostruki Celzijus, dvostruka vlažnost) ( // (1) Pritisak pare zasićenja = ESGG(T) dvostruki ODNOS = 373,15 / (273,15 + celzijus); dvostruki RHS = -7,90298 * (RACIO - 1); RHS += 5,02808 * log10(RACIO); RHS += -1,3816e-7 * (pow(10, (11,344 * (1 - 1/RATIO))) - 1) ; RHS += 8,1328e-3 * (pow(10, (-3,49149 * (RACIO - 1))) - 1) ; RHS += log10(1013.246); // faktor -3 je podešavanje jedinica - Pritisak pare SVP * vlažnost duplo VP = pow(10, RHS - 3) * vlažnost; // (2) TAČKA ROSE = F(pritisak pare) duplo T = log(VP/0,61078); // temp var return (241,88 * T) / (17,558 - T); ) void send_info(bool eth) ( bool fail = true; while(fail) ( // Pokušavamo čitati podatke sa DHT senzora vlažnosti dok ne dobijemo // rezultat. U 90% slučajeva sve radi dobro, ali trebamo 100 % if((H = dht.readHumidity()) >= 0) ( // Dobivanje vlage i temperature sa senzora BMP180 dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Izračunajte tačku rose ako temperatura je vani iznad 0 stepeni Celzijusa // i očekujte rezultat iznad 0, u suprotnom ispišite 0. Ovo je neophodno // kako ne bismo zavarali tokom zimske sezone. // dP = Temperatura>0?((dPt=Tačka rose(Temperatura*0,1, H))<0?0:dPt):0; dP = dewPoint(Temperature*0.1, H); // Отправляем данные в эфир 433 мГц broadcast.ID = 1; broadcast.Temperature = floor(Temperature*0.1); broadcast.Pressure = floor(Pressure/133.3*10)/10; broadcast.Humidity = floor(H*10)/10; broadcast.dewPoint = floor(dP*10)/10; ET.sendData(); delay(250); if(eth) { // Подключаемся к серверу "Народный мониторинг" if(client.connect(server, port)) { // Начинаем передачу данных // адрес_устройства_в_проекте, имя_устройства, GPS широта, GPS долгота client.print(F("#fe-31-31-0e-5a-3b#Arduino Uno#71.344699#27.200014\n")); // Температура client.print(F("#T0#")); client.print(Temperature*0.1); client.print(F("#Температура\n")); // Давление client.print("#P1#"); client.print(Pressure/133.3); client.print(F("#Давление\n")); // Влажность client.print("#H1#"); client.print(H); client.print(F("#Влажность\n")); // Точка росы\инея client.print("#T1#"); client.print(dP); client.print((dP <= 0)? F("#Точка инея\n"):F("#Точка росы\n")); //client.print(F("#Точка росы\n")); // Отправляем конец телеграммы client.print("##"); // Даем время отработать Ethernet модулю и разрываем соединение delay(250); client.stop(); } } // Останавливаем цикл, если передача завершена fail = !fail; break; } delay(250); } } void loop() { // Каждые 4 секунды сбрасываем сторожевой таймер микроконтроллера // Каждые 6 минут отправляем данные на "Народный мониторинг" // Каждые 30 секунд отсылаем данные в эфир 433 if(!(millis()%1000)) wdt_reset(); if(!(millis()%360000)) send_info(true); if(!(millis()%30000)) send_info(false); }

    Samim modulima se mora dodati antena. Za 433 MHz Dovoljna je obična duga bakarna žica 17 cm. Bez antene možete zaboraviti na normalan rad.

    Pređimo na najvažniji dio ovog ažuriranja - lokalnu bežičnu stanicu

    Za implementaciju (na koljenu) koristio sam analogni Arduino NANO(na bazi ATMega328) I TFT prikaz na čipu ST7735S uz dozvolu 128 x 160

    Skriveni tekst



    Pinout displej -> kontroler

    ============================= LED | 3.3V SCK | SCK (13) SDA | MOSI(11)A0 | DC (9) RESET | RST(8)CS | CS (10) GND | GND VCC | 5V =============================

    Modul prijemnika je povezan samo na isti način kao i predajnik PODACI to pin D7.

    Par slika kako to izgleda:

    Skriveni tekst

    Skica prijemnika

    Skriveni tekst

    #include #include #include #include int x, y; int w = 128, h = 160; int size; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( ID bajta; // ID uređaja int Temperatura; // Temperatura plutajući Tlak; // Tlak plutajući Vlažnost; // Vlažnost float rosa; // Tačka rose/mraz ); SEND_DATA_STRUCTURE emitiranje; int Log_Temperature = -1; float Log_Pressure = -1; float Log_Vlažnost = -1; float Log_dewPoint = -1; // TFT #define cs 10 #define dc 9 #define rst 8 char Temperatura, Pressure, Humidity, Dewpoint; String info; TFT TFTscreen = TFT(cs, dc, rst); void setup())( Serial.begin(9600); // Inicijalizacija 433 MHz modula ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_rx_pin(7); vw_setup(2000); vw_rx_start(); // Inicijalizacija i početno podešavanje prikaza TFTscreen.setRotation(2) // Nacrtaj statičke elemente // 1. Posjetite nas TFTscreen.stroke(255; , 255 TFTscreen.setTextSize(" ", 10, 10); "%", w/2+5, 100 ("C", w/2+5, 120); ; ) void loop())( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature); Serial. println(broadcast.Pressure); Serial.println(broadcast.Humidity) Serial.println( */ ) void changes(int size, int y, bool up, bool clear = false) (if(clear) TFTscreen.stroke(0, 0, 0)); ; else ( promjene(veličina, x, y, !gore, istina); TFTscreen.stroke((gore)?0:255, 0, (gore)?255:0); ) if((size%2) == 0 ) size++; while(size > 0) ( TFTscreen.line(x, y, x+(size--), y); ++x, (gore)?--y:++y, --size; ) /* while( veličina > 0) ( TFTscreen.line(x, y, (gore)?x+size-1:x, (gore)?y:y+size-1); ++x, ++y, --size; ) */ ) int x_center(int w, int dužina, int veličina) ( return floor((w-length*(size*5)+size*2)/2); ) int x_alignment_right(int w, int length, int veličina) ( vrati ceil(w-dužina*(veličina*5)+veličina*2); ) void TFTPrint() ( veličina = 3; // ================= =================================================== === =============== // Prikaz očitavanja temperature // ============== =========== =============================================== if(emitovanje. Temperatura != Log_Temperature) ( TFTscreen.setTextSize(size); // Prepiši zastarjele podatke String info = String(Log_Temperature); info.concat(" C"); if(Log_Temperature > 0) info = "+"+info; info .toCharArray(Temperatura, info.length()+1 TFTscreen.stroke(0, 0, 0, size), 35 // Prikaz novih očitanja = String (emitovanje); temperatura); info.concat("C"); if(broadcast.Temperature > 0) info = "+"+info; info.toCharArray(Temperatura, info.length()+1); // Mijenjamo boju vrijednosti temperature ovisno o samoj temperaturi int r, g = 0, b; if(broadcast.Temperature > 0) ( r = map(broadcast.Temperature, 0, 40, 255, 150); // Crvena b = map(broadcast.Temperature, 0, 40, 30, 0); // Promijenite nijansa za vizualniji prijelaz kroz nulu ) else ( r = map(broadcast.Temperature, -40, 0, 0, 30); // Promijenite nijansu za vizualniji prijelaz kroz nulu b = map(broadcast.Temperature, - 40, 0, 150, 255 // Plava ) TFTscreen.stroke(b, g, r); // PAŽNJA: pozicije boja u biblioteci su pomiješane, RGB mjesto koristi BGR! TFTscreen.text(Temperatura, x_center(w, info.length()+1, veličina), 35); ) veličina = 1; // ================================================= ==== ===================================== // Očitavanje izlaznog pritiska // === ====== ============================================= ========= ======================= if(broadcast.Pressure != Log_Prissure) ( TFTscreen.setTextSize(size); / / Prepiši zastarjele podatke = String(Log_Pressure )(Pritisak, info.length()(0, 0, 0, TFTscreen.text(Pritisak, x_alignment_right(w/2-5); .length(), size), 80 // Prikaz novih očitanja = String -5, info.length(), 80 promjene(10, 106, 85, (broadcast.Pressure > Log_Pressure)?true:false else (promjene(10, 106, 85, true, true)); ; promjene (10, 106, 85, false, true) // ================================ ================================================ = // Izlaz očitanja vlažnosti // =============================================== ========== ========================================= if(broadcast.Humidity != Log_Humidity) ( TFTscreen.setTextSize(size); // Prepiši zastarjele podatke info = String(Log_Humidity); info.toCharArray(Vlažnost, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Vlažnost, x_alignment_right(w/2-5, info.length(), veličina), 100); // Prikaz novih očitanja info = String(broadcast.Humidity); info.toCharArray(Vlažnost, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Vlažnost, x_alignment_right(w/2-5, info.length(), veličina), 100); promjene(10, 106, 105, (broadcast.Humidity > Log_Humidity)?true:false); ) else ( changes(10, 106, 105, true, true); changes(10, 106, 105, false, true); ) // =================== =================================================== === ============== // Izlaz očitavanja tačke rose/tačke smrzavanja // ============ ========= ============================================= ====== if(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(size); // Prebrišite zastarjele podatke info = String(Log_dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text); (dewPoint, x_alignment_right(w/2-5, info.length(), size), 120 // Izlaz novih očitanja info = String(broadcast.dewPoint(dewPoint, info.length()); TFTscreen.stroke(255, 255, 255) Log_dewPoint)?true:false ) else ( changes(10, 106, 125, true, true); changes(10, 106, 125, false, true); ) // Ažurirajte vrijednosti u zapisnicima za naredne); poređenje očitanja Log_Temperature = emitirana.Temperatura; Log_Prissure = emitiranje.Pritisak; Log_Humidity = emitiranje.Vlažnost; Log_dewPoint = broadcast.dewPoint; )

    Očitavanja su prikazana prilično kompaktno, ali kako praksa pokazuje (i savjet mojih drugova) - „ukus i boja, čak ni žena nije prijatelj.“ Slušao sam mnogo savjeta i sugestija, ali su jedni drugima u suprotnosti. Stoga, uradite to po svom ukusu.

    Činilo mi se da je dizajn dio projekta koji oduzima najviše vremena!

    Skriveni tekst

    Neki od podataka su izmišljeni da odražavaju neke elemente dizajna.

    Artefakti na displeju su prašina i druga prljavština koja se nakupila tokom dužeg vremena u kojoj je displej bio... tu negde,... eto, ne sećam se odakle mi! Ostavi me na miru!

    Skica ima funkcije pozicioniranja. Oni su prilično primitivni, ali vam omogućavaju da postignete određene efekte.

    1. x_center
    2. x_alignment_right

    Prvi centrira tekst, a drugi ga poravnava na desnu stranu navedene zone. Svi proračuni se vrše u odnosu na dimenzije dati tekst, na osnovu izraza 1 veličina = 1PX x 1PX segmentu fonta.

    Displej također prikazuje elemente koji odgovaraju povećanju ili smanjenju određene vrijednosti očitavanja. Prikazuju se u obliku trokuta. Ali u kodu funkcije promjene Postoji alternativni displej u obliku trouglova rotiranih za 45 stepeni. Ako se očitanja povećaju, element je crven, u suprotnom plavi.

    Usput, boja i nijansa glavne temperature mijenjaju se ovisno o samoj temperaturi. Prilično kontroverzna odluka, ali po mom mišljenju, vizuelno udobna. Borio sam se s tim neko vrijeme i shvatio da su vrijednosti u funkciji moždani udar, objekt TFT ekran, navedeni su pogrešnim redoslijedom. BGR mjesto RGB. Ovo je greška programera ili ja nešto ne razumijem.

    PS: Sve je dosta zanimljivo, ali po mom mišljenju zaslužuje dalji razvoj. To ćemo uraditi nakon nekog vremena.

    Jednog dana, šetajući gradom, ugledao sam novu radnju radio elektronike koja je otvorena. Kad sam ušao, našao sam veliki brojŠtitovi za Arduino jer Imao sam kod kuće Arduino Uno i Arduino Nano i odmah je došla ideja da se igram sa predajnicima signala na daljinu. Odlučio sam kupiti najjeftiniji predajnik i prijemnik na 433 MHz:

    Predajnik signala.


    Prijemnik signala.

    Nakon snimanja jednostavne skice prijenosa podataka (primjer preuzet odavde), pokazalo se da uređaji za prijenos mogu biti sasvim prikladni za prijenos jednostavnih podataka, kao što su temperatura, vlažnost.

    Predajnik ima sljedeće karakteristike:
    1. Model: MX-FS - 03V
    2. Domet (u zavisnosti od prisustva blokirajućih objekata): 20-200 metara
    3. Radni napon: 3,5 -12V
    4. Dimenzije modula: 19 * 19 mm
    5. Modulacija signala: AM
    6. Snaga predajnika: 10mW
    7. Frekvencija: 433MHz
    8. Potrebna dužina vanjske antene: 25 cm
    9. Jednostavan za povezivanje (samo tri žice): DATA ; VCC ; Zemlja.

    Karakteristike prijemnog modula:
    1. Radni napon: DC 5V
    2. Struja: 4mA
    3. Radna frekvencija: 433,92 MHz
    4. Osetljivost: - 105dB
    5. Dimenzije modula: 30 * 14 * 7 mm
    6. Neophodan eksterna antena: 32 cm.

    Internet kaže da opseg prenosa informacija brzinom od 2Kb/sec može dostići i do 150m. Nisam lično proveravao, ali u dvosobnom stanu je svuda prihvaćeno.

    Hardver kućne meteorološke stanice

    Nakon nekoliko eksperimenata, odlučio sam spojiti senzor temperature, vlažnosti i predajnik na Arduino Nano.


    Senzor temperature DS18D20 je povezan na Arduino na sljedeći način:

    1) GND na minus mikrokontrolera.
    2) DQ kroz pull-up otpornik na masu i na pin D2 Arduina
    3) Vdd do +5V.

    Modul predajnika MX-FS - 03V se napaja sa 5 volti, izlaz podataka (ADATA) je povezan na pin D13.

    Povezano na Arduino Uno LCD ekran i barometar BMP085.


    Dijagram povezivanja na Arduino Uno

    Prijemnik signala je spojen na pin D10.

    Modul BMP085 - digitalni senzor atmosferski pritisak. Senzor vam omogućava mjerenje temperature, pritiska i nadmorske visine. Interfejs veze: I2C. Napon napajanja senzora 1,8-3,6 V

    Modul je povezan na Arduino na isti način kao i ostali I2C uređaji:

    • VCC - VCC (3,3 V);
    • GND - GND;
    • SCL - na analogni pin 5;
    • SDA - na analogni pin 4.
    • Veoma jeftino
    • Snaga i I/O 3-5 V
    • Određivanje vlažnosti 20-80% sa tačnošću od 5%.
    • Detekcija temperature 0-50 stepeni. sa 2% tačnosti
    • Frekvencija prozivanja ne veća od 1 Hz (ne više od jednom u 1 sekundi)
    • Dimenzije 15,5 mm x 12 mm x 5,5 mm
    • 4 pina sa razmakom od 0,1" pinova

    DHT ima 4 pina:

    1. Vcc (3-5V napajanje)
    2. Izlaz podataka - Izlaz podataka
    3. Nije korišteno
    4. Generale

    Povezuje se na D8 Arduina.

    Softverski dio kućne meteorološke stanice

    Predajni modul mjeri i prenosi temperaturu svakih 10 minuta.

    Ispod je program:

    /* Sketch verzija 1.0 Šalji temperaturu svakih 10 minuta. */ #include #include #include #define ONE_WIRE_BUS 2 //Pin za povezivanje Dallas OneWire senzora oneWire(ONE_WIRE_BUS); Dallas temperaturni senzori (&oneWire); Adresa uređaja insideThermometer; void setup(void) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // Neophodno za DR3100 vw_setup(2000); // Postavite brzinu prijenosa (bit/s) sensors.begin(); if (! senzori .getAddress(insideThermometer, 0) printAddress(insideThermometer, 9) void printTemperature(DeviceAddress deviceAddress) (float tempC = sensors.getTempC(deviceAddress); //Serial.print); : "); //Serial.println(tempC); //Formiranje podataka za slanje int number = tempC; char simbol = "c"; //Servisni simbol za utvrđivanje da je ovo senzor String strMsg = "z"; strMsg += simbol strMsg.toCharArray(200); 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); } }

    Prijemni uređaj prima podatke, mjeri pritisak i temperaturu u prostoriji i prenosi ih na displej.

    #include #include LiquidCrystal lcd(12, 10, 5, 4, 3, 2); #include dht11 senzor; #define DHT11PIN 8 #include #include BMP085 dps = BMP085(); dugo Temperatura = 0, Pritisak = 0, Visina = 0; void setup() ( Serial.begin(9600); vw_set_ptt_inverted(true); // Neophodno za DR3100 vw_setup(2000); // Postavite brzinu prijema vw_rx_start(); // Pokrenite praćenje emitiranja lcd.begin(16, 2) ; Wire.begin(1000) //lcd.write(0) (uint8_t buflen); ; // Dužina međuspremnika if (vw_get_message(buf, &buflen)) // Ako je poruka primljena ( // Pokreni raščlanjivanje int i; // Ako poruka nije adresirana na nas, izađi iz if (buf != "z") ( return; ) char command = buf // Naredba je na indeksu 2 // Numerički parametar počinje sa indeksom 4 i = 4 // Pošto je prijenos znak po znak; znakova u broj while (buf[i] != " ") (broj *= 10; broj += buf[i] - "0"; i++; ) dps.getPressure(&Altitude); getTemperature(&Temperature) //Serial.print(command); lcd.print("T="); lcd.setCursor(2,0); lcd.print(broj); lcd.setCursor(5,0); lcd.print("P="); lcd.print(Pritisak/133.3); lcd.print("mmH"); lcd.setCursor(0,1); lcd.print("T="); lcd.print (temperatura*0,1); lcd.print("H="); lcd.print(sensor.humidity); lcd.home(); //delay(2000); int chk = sensor.read(DHT11PIN); switch (chk) ( case DHTLIB_OK: //Serial.println("OK"); break; case DHTLIB_ERROR_CHECKSUM: //Serial.println("Checksum error"); break; case DHTLIB_ERROR_TIMEOUT: //Serial.println("Time out error"); break; default: //Serial.println("Nepoznata greška"); break; ) ) )

    P.S. U budućnosti planiram dodati sljedeće:
    - senzor vlage na transmiter, preraditi algoritam za prenos podataka
    - senzor za mjerenje brzine i smjera vjetra.
    - dodati još jedan ekran prijemnom uređaju.
    - prebaciti prijemnik i predajnik u poseban mikrokontroler.

    Ispod je fotografija onoga što se dogodilo:

    Spisak radioelemenata

    Oznaka Tip Denominacija Količina BilješkaProdavnicaMoja beležnica
    Predajni dio.
    Arduino ploča

    Arduino Nano 3.0

    1 U notes
    temperaturni senzor

    DS18B20

    1 U notes
    Otpornik

    220 Ohm

    1 U notes
    Modul predajnikaMX-FS-03V (433 MHz)1 U notes
    Radio prijemni dio.
    Arduino ploča

    Arduino Uno

    1 U notes
    Trimer otpornik 1 U notes
    Otpornik

    Za osnovu je uzet projekat meteorološke stanice iz knjige V. Petina “Projekti koristeći Arduino kontroler”, 2. izdanje (projekat 5, dodatak 2). Koristio Arduino IDE 1.8.5 na Windows 10.
    Došlo je do greške prilikom pokretanja skice

    Na internetu možete preuzeti biblioteke za Arduino koje imaju iste nazive, ali različit sadržaj. Skica možda neće raditi ako koristite pogrešnu biblioteku. Očigledno sam naišao na pogrešne biblioteke. Projektu sam dodao senzor BMP180 za mjerenje atmosferskog tlaka i preradio skicu.

    Dijagram povezivanja

    Skeniranje adresa

    Prvo povežite BMP180 senzor i LCD1602 indikator na Arduino. Sastavite skicu I2C skenera i pokrenite je da odredite adrese uređaja na I2C magistrali.

    Svakih 5 sekundi program skenira uređaje i izdaje adrese na COM portu. Našao sam dva uređaja sa adresama 0x3F i 0x77. BMP180 podrazumevano ima adresu 0x77, što znači da LCD indikator ima adresu 0x3F.
    U nekim krugovima knjige, mjesta na kojima su SDA i SCL signali povezani na Arduino ploču su pomiješana. Trebao bi biti: SDA - do A4, SCL - do A5. Ako modul BMP180 ima pet pinova, tada se +5 volti dovodi na VIN pin.

    Dijagram ožičenja

    Sada kompletno sastavite krug. Koristio sam uobičajenu katodnu RGB LED diodu montiranu na ploču zajedno sa otpornicima od 150 oma. Zajednička katoda je spojena na GND pin, preostali pinovi su povezani prema dijagramu. Nema potrebe za mijenjanjem skice, jer se svjetlina LED dioda mijenja prema cikličnom zakonu.
    Dijagram prikazuje vezu RGB LED-a sa zajedničkom anodom, kao u knjizi.
    Ako na LCD1602 ekranu nisu vidljivi znakovi, okrenite kontrolu svjetline. Pozadinsko osvetljenje indikatora troši dosta struje, pa koristite napajanje sa strujom od najmanje 2 A. Koristio sam USB hub sa eksternim napajanjem od 2 A.
    Kolo je koristilo piezo zvono ZP-22. Otpornik spojen na zvono je 100 oma. Frekvencija zvuka se može promijeniti u programu. Odabrao sam frekvenciju od 1000 Hz. Ako naiđete na zujalicu sa fiksnom frekvencijom zvuka, onda ga možete uključiti i isključiti jednostavnim primjenom i uklanjanjem napona, poput obične LED diode. Kada skica počne, čuje se kratak bip. Možete omogućiti periodično signaliziranje dok je program pokrenut dekomentiranjem reda //bzz(100); u skici.
    U projektu sam koristio DHT11 senzor u obliku modula sa već montiranim otpornikom od 4,7 kOhm. Otpor može biti od 4,7 do 10 kOhm.
    Povežite Vcc pin modula sata DS1302 na sabirnicu +5 Volt. Na ovaj način ćete smanjiti trošenje baterije, u suštini će raditi samo kada je napajanje Arduina isključeno.

    Program (skica)

    Biblioteka bmp085 se koristi za servisiranje BMP180. Vrijednost pritiska ovisi o nadmorskoj visini područja. Za ispravnu vrijednost atmosferskog tlaka potrebno je odabrati nadmorsku visinu. Da biste to učinili, uredite liniju dps.init(MODE_STANDARD, 10000, true); Moja visina je 100 m (10000 cm). Fragment proračuna tlaka preuzet je iz primjera BMP085_test2.ino biblioteke bmp085.

    Skica meteo_P

    #include
    #include
    #include
    #include "DHT.h"
    #include
    BMP085 dps = BMP085();
    dugačak pritisak = 0, visina = 0;
    unsigned long time1 = 0;

    #defini DHTPIN 10
    #define DHTTYPE 11 // 11 - DHT11, 22 - DHT22
    DHT dht(DHTPIN, DHTTYPE);

    int kCePin = 4; // RST DS1302
    int kIoPin = 3; // Podaci DS1302
    int kSclkPin = 2; //CLK DS1302
    DS1302 rtc(kCePin, kIoPin, kSclkPin);

    int REDpin = 9;
    int GREENpin = 6;
    int BLUEpin = 11;

    LiquidCrystal_I2C lcd(0x3f, 16, 2); // unesite svoju adresu 0x20...0xff adresu
    unsigned long memTime;
    int bzzPin = 8;

    void HumTempRead() (
    float hum = dht.readHumidity();
    float temp = dht.readTemperature();
    if (isnan(hum) || isnan(temp)) (
    Serial.println("Neuspjelo čitanje sa DHT senzora!");
    lcd.setCursor(0, 1);
    lcd.print("H=--% T=---");
    lcd.setCursor(11, 1);
    lcd.print((char)223);
    lcd.setCursor(12, 1);
    lcd.print("C");
    ) drugo (
    lcd.setCursor(0, 1);
    lcd.print("H=");
    lcd.setCursor(2, 1);
    lcd.print(hum);
    lcd.setCursor(4, 1);
    lcd.print("% T=+");
    lcd.setCursor(9, 1);
    lcd.print(temp);
    lcd.setCursor(11, 1);
    lcd.print((char)223);
    lcd.setCursor(12, 1);
    lcd.print("C") ;
    }
    }

    void setup_bzz() (
    pinMode(bzzPin, OUTPUT);
    }

    void bzz(int _bzzTime) (
    tone(bzzPin, 1000, _bzzTime); // frekvencija 1000 Hz
    }

    void setup() (
    Serial.begin(9600);
    Wire.begin();
    kašnjenje (1000);

    dps.init(MODE_STANDARD, 10000, istina); // 100 metara (visina iznad nivoa mora u cm)

    dht.begin();
    setup_bzz();
    bzz(100);

    Lcd.init();
    lcd.backlight();
    lcd.home();
    // lcd.setCursor(0, 0);

    rtc.halt(false);
    rtc.writeProtect(false);

    //rtc.setDOW(FRIDAY); // Postavite dan u sedmici na PETAK postavite dan u sedmici
    //rtc.setTime(4, 58, 0); // Postavite vrijeme na 12:00:00 (24h format)
    //rtc.setDate(6, 8, 2010); // Postavite datum na 6. avgust 2010. postavite datum (dan, mjesec, godina)
    }

    lcd.setCursor(8, 0);
    lcd.print(rtc.getTimeStr());

    if ((millis() - memTime > 2000) ili (milis()< memTime)) { // DHT11/22 1 time each 2 seconds
    HumTempRead();
    memTime = millis();
    }
    kašnjenje (100);

    if (((milis() - vrijeme1) / 1000,0) >= 1,0) (
    dps.calcTrueTemperature();
    vrijeme1 = millis();
    }
    dps.getPressure(&Prissure);
    Serial.print(" Pritisak(Pa):");
    Serial.println(Pritisak);

    dugo p2;
    int pi;
    p2 = (Pritisak / 133,3224); // Pa u mmHg.
    pi = trunc(p2); // odbacivanje razlomka broja

    lcd.setCursor(0, 0);
    lcd.print("P=");
    lcd.setCursor(2, 0);
    lcd.print(pi); // izlazni atm. pritisak na LCD-u
    lcd.setCursor(5, 0);
    lcd.print("mm");
    // kašnjenje (3000);
    //bzz(100); // dekomentirajte ako želite slušati signale
    {
    for (int value = 0 ; vrijednost<= 255; value += 1) {
    analogWrite(REDpin, vrijednost);
    analogWrite(GREENpin, 255 - vrijednost);
    analogWrite(BLUEpin, 255);
    kašnjenje(5);
    }

    za (int vrijednost = 0; vrijednost<= 255; value += 1) {
    analogWrite(REDpin, 255);
    analogWrite(GREENpin, vrijednost);
    analogWrite(BLUEpin, 255 - vrijednost);
    kašnjenje(5);
    }

    za (int vrijednost = 0; vrijednost<= 255; value += 1) {
    analogWrite(REDpin, 255 - vrijednost);
    analogWrite(GREENpin, 255);
    analogWrite(BLUEpin, vrijednost);
    kašnjenje(5);
    }
    }
    }

    U Katalogu datoteka možete preuzeti skicu i biblioteke koje su korištene u projektu.

    Uvezite LiquidCrystal_I2C.zip, bmp085.zip, DS1302.zip i DHT.zip biblioteke iz preuzete arhive u Arduino IDE. Idite na meni Skica Povežite biblioteku Dodaj .ZIP biblioteku... i u prozoru izaberite zip arhivu biblioteke.
    Otpremite meteo_P skicu. Zamijenite adresu LCD1602 na skici vrijednošću dobivenom skeniranjem I2C magistrale. Sastavite i pokrenite skicu.
    Ako skica radi, otvorite monitor porta i pogledajte prikazane poruke. Podesite visinu u naredbi dps.init(MODE_STANDARD, 10000 , istina); da dobijete stvarne vrednosti pritiska.
    Podesite svoj sat. Dekomentirajte red //rtc.setTime(4, 58, 0); a u zagradama navedite trenutno vrijeme (sat, minute i sekunde odvojene zarezima) i ponovo učitajte skicu u kontroler. Nakon što je vrijeme postavljeno, ponovo komentirajte ovu liniju i ponovo pokrenite skicu.
    Ako vas nervira noćno osvjetljenje, možete ga prilagoditi promjenom dužine kašnjenja u for petljama na kraju skice. Sa zakašnjenjem(2); ciklus traje 2-3 sekunde, sa kašnjenjem(5); — od 4 do 5 sekundi, sa kašnjenjem (30); - do 15-16 sekundi. Informacije o indikatoru će se ažurirati u istom intervalu.
    Kada se meteorološka stanica koristi autonomno, tj. bez povezivanja na USB port računara, komentarišite linije na skici rečima Serial ... da biste onemogućili izlaz informacija na monitor COM porta.

    PS. Na skici knjige i u primjerima za DHT biblioteku navedena je linija definicije #define DHTTYPE DHT 11. Skica počinje, ali se ruši nakon nekoliko sati. Sat se zaustavlja, displej se ne menja. Na monitoru porta pojavljuje se nejasna poruka koja sadrži vezu na dht.
    U ovom redu sam uklonio slova DHT, tj. učinio #define DHTTYPE 11. Nakon toga, skica je počela stabilno raditi.

    Članak ažuriran 25. juna 2018

    Korišteni resursi
    1. Petin V.A. Projekti koji koriste Arduino kontroler (Elektronika) 2. izdanje, St. Petersburg. BHV-Peterburg, 2015. 464 str.
    2. Petin V. A., Binyakovsky A. A. Praktična enciklopedija Arduina. - M., DMK Press, 2017. - 152 str.
    3. http://arduinolearning.com/code/i2c-scanner.php
    4. http://arduino.ru/forum/programmirovanie/ds1302lcd1602
    5. http://robotehnika18.rf/how-to-connect-lcd-1602-to-arduino-via-i2c/
    6. primjer BMP085_test2.ino iz biblioteke bmp085.zip
    7. http://proginfo.ru/round/
    8. http://homes-smart.ru/index.php?id=14&Itemid=149&option=com_content&view=article
    9. http://iarduino.ru/lib/datasheet%20bmp180.pdf
    10. http://it-donnet.ru/hd44780_dht11_arduino/

    DIY meteorološka stanica.

    Bilo je veče, posle Nove godine nije bilo šta da se radi. Kao i obično, tokom zimskih novogodišnjih praznika želim da okupiram glavu i ruke nečim korisnim i kreativnim. Tokom ovih novogodišnjih praznika odlučio sam da napravim meteorološku stanicu svojim rukama. Počeo sam da se pripremam unapred, nabavio sam i sastavio sve komponente pred Novu godinu, a glavni program radio sam tokom praznika.

    (ispod reza ima dosta fotografija!)

    Prvo ću pregledati komponente, neću davati linkove, jer su proizvodi na eBayu (u mom ličnom računu) arhivirani. Lagano sam kupio mnoge komponente na eBayu. Prvi put sam pokušao na aukciji prije nego što sam uvijek kupio “kupi odmah”. Šta reći, ako ne žurite u kupovinu, neke komponente možete kupiti jeftinije (razlika je ponekad i duplo veća).

    Senzor pritiska VMR085
    Ovo je glavni senzor. Kada sam to vidio na eBayu, znao sam da želim da napravim kućnu meteorološku stanicu.
    Senzor je stigao u običnoj koverti, prekrivenoj folijom iznutra.

    Unutar koverte je bila prodavačeva vizit karta i senzor, upakovani u antistatičku vrećicu i umotani u drugi sloj folije.

    Antistatička vrećica je zapečaćena tako da vlaga tokom leta ne ugrozi senzor

    Izvadimo senzor. Na jednoj strani nalazi se zalemljena linija kontakata, koji su umetnuti u pjenu kako bi se spriječilo savijanje. Sa druge strane nalazi se sam senzor i kontaktne oznake.




    Sve bi bilo u redu, ali kontaktne oznake su nanesene u ogledalu.
    Senzor je povezan preko I2C magistrale i napaja se od 3,3 V. To jest, za normalan rad su vam potrebne 4 žice (+, -, SDA, SCL)
    Senzor možete ispitivati ​​na 2 načina: ili kroz biblioteku, ili koristeći funkcije direktno u skici.
    Primjer programa:

    #include

    #define BMP085_ADDRESS 0x77 // I2C adresa BMP085

    Const unsigned char OSS = 0; // Postavka preduzorkovanja

    // Vrijednosti kalibracije
    int ac1;
    int ac2;
    int ac3;
    unsigned int ac4;
    unsigned int ac5;
    unsigned int ac6;
    int b1;
    int b2;
    int mb;
    int mc;
    int md;

    Kratka temperatura;
    dug pritisak;

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

    void loop()
    {
    temperatura = bmp085GetTemperature(bmp085ReadUT());
    pritisak = bmp085GetPressure(bmp085ReadUP());
    Serial.print("Temperatura: „);
    Serial.print(temperatura/10.0, DEC);
    Serial.println("C");
    Serial.print("Pritisak: „);
    Serial.print(pritisak/133.322, DEC);
    Serial.println(“mm Hg”);
    Serial.println();
    kašnjenje (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);
    }

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

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

    Long bmp085GetPressure (nepotpisan dugo gore)
    {
    dugo x1, x2, x3, b3, b6, p;
    neoznačeno dugo b4, b7;
    b6 = b5 - 4000;
    // Izračunaj B3
    x1 = (b2 * (b6 * b6)>>12)>>11;
    x2 = (ac2 * b6)>>11;
    x3 = x1 + x2;
    b3 = (((((dugo)ac1)*4 + x3)<>2;
    // Izračunaj B4
    x1 = (ac3 * b6)>>13;
    x2 = (b1 * ((b6 * b6)>>12))>>16;
    x3 = ((x1 + x2) + 2)>>2;
    b4 = (ac4 * (nepotpisano dugo)(x3 + 32768))>>15;
    b7 = ((nepotpisano dugo)(gore - b3) * (50000>>OSS));
    ako (b7< 0x80000000)
    p = (b7<<1)/b4;
    ostalo
    p = (b7/b4)<<1;
    x1 = (p>>8) * (p>>8);
    x1 = (x1 * 3038)>>16;
    x2 = (-7357 * p)>>16;
    p += (x1 + x2 + 3791)>>4;
    return p;
    }

    // Pročitaj 1 bajt sa BMP085 na "adresi"
    char bmp085Read (nepotpisana char adresa)
    {
    podaci bez predznaka;

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

    Int bmp085ReadInt (nepotpisana char adresa)
    {
    unsigned char msb, lsb;
    Wire.beginTransmission(BMP085_ADDRESS);
    Wire.write(adresa);
    Wire.endTransmission();
    Wire.requestFrom(BMP085_ADRESA, 2);
    while(Wire.available()<2)
    ;
    msb = Wire.read();
    lsb = Wire.read();
    povratak (int) msb<<8 | lsb;
    }

    // Čitanje nekompenzirane vrijednosti temperature
    unsigned int bmp085ReadUT()
    {
    unsigned int ut;
    // Upisuje 0x2E u registar 0xF4
    // Ovo zahtijeva očitavanje temperature
    Wire.beginTransmission(BMP085_ADDRESS);
    Wire.write(0xF4);
    Wire.write(0x2E);
    Wire.endTransmission();
    // Pričekajte najmanje 4,5 ms
    kašnjenje(5);
    // Čita dva bajta iz registara 0xF6 i 0xF7
    ut = bmp085ReadInt(0xF6);
    return ut;
    }

    // Očitajte nekompenziranu vrijednost tlaka
    unsigned long bmp085ReadUP()
    {
    unsigned char msb, lsb, xlsb;
    unsigned long up = 0;
    // Zapiši 0x34+(OSS<<6) into register 0xF4
    // Zahtjev za očitavanje tlaka s postavkom prevelikog uzorkovanja
    Wire.beginTransmission(BMP085_ADDRESS);
    Wire.write(0xF4);
    Wire.write(0x34 + (OSS<<6));
    Wire.endTransmission();
    // Čekanje na konverziju, vrijeme kašnjenja ovisi o OSS-u
    kašnjenje (2 + (3<// Čitanje registra 0xF6 (MSB), 0xF7 (LSB) i 0xF8 (XLSB)
    Wire.beginTransmission(BMP085_ADDRESS);
    Wire.write(0xF6);
    Wire.endTransmission();
    Wire.requestFrom(BMP085_ADRESA, 3);
    // Pričekajte da podaci postanu dostupni
    while(Wire.available()< 3)
    ;
    msb = Wire.read();
    lsb = Wire.read();
    xlsb = Wire.read();
    gore = (((nepotpisano dugo) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
    povratak gore;
    }


    Osim toga, senzor ima vlastiti termalni senzor za kompenzaciju pritiska i visinomjer

    Arduino Nano v3.0
    Ovo je srce cijele meteorološke stanice. Jednostavno rečeno, kontroler je minijaturne veličine.
    kupio sam
    Neću detaljno govoriti o kontroleru, jer je ovo već urađeno prije mene:


    Lightake paket je bio montažni, kontroler je došao u paketu koji sadrži USB kabel i Arduino u zapečaćenoj antistatičkoj vrećici.

    Da bih procijenio veličinu, stavio sam novčić od 1 rublje pored Arduina.

    Kontrolna ploča izbliza



    USB kabl je dobar, sa feritnim prstenom. Arduino se napaja preko USB kabla. Razvojno okruženje se može preuzeti (stranica za preuzimanje). Jezik je "C"-a, nije bilo problema sa savladavanjem, pošto na poslu dosta programiram na njemu.

    LCD ekran
    Na poslu sam pronašao kompatibilni LCD 1602 ekran u kantama. Morao sam da petljam sa vezom, pošto nisam mogao da pronađem datasheet za to. Kao rezultat toga, LCD je počeo raditi.

    Ali nakon kratkog perioda korištenja primijetio sam da mi ovaj ekran nije dovoljan i da ne bi bilo moguće prikazati više podataka, jer ima samo 2 reda od po 16 karaktera. U početku se čini da su ovi parametri dovoljni, ali kada počnete programirati, shvatite da je maksimum koji možete ugurati je 3-4 parametra. A ako napravite meni (razmišljao sam da napravim meni na ovom ekranu), onda ostaje samo 1-2 parametra slobodnog prostora.
    Kao rezultat toga, počeo sam tražiti drugi ekran. U početku sam pažljivo pogledao grafički ekran iz Nokia 3310 i čak sam učestvovao na eBay aukciji da ga kupim, ali nije išlo (što mi je jako drago), pa sam morao da odustanem od ovog ekrana. Sada shvatam da bi to bilo premalo za moje potrebe, jer ima sa čime da se poredim.
    Dok sam nasumično gledao kroz štitove na Arduinu, naišao sam na 12864 grafički ekran na ST7920 kontroleru. Ovaj ekran ima pravu veličinu i dobru rezoluciju za moje potrebe (128x64). Odnosno, lako možete postaviti 6-7 redova od 20 znakova u normalno čitljiv font. Kako je ekran grafički, osim teksta, grafike se mogu postaviti u različitim fontovima. Ukratko, ovo je upravo ono što mi je trebalo, sve je bilo prisutno na ovom ekranu, pa nisam mogao odoljeti i naručio sam.
    Paket je stigao brzo i bio je standardno zapakiran: omotnica sa mjehurićima, unutra je bio još jedan sloj folije i ekran u antistatičkoj vrećici:






    Da bih procijenio veličinu, stavio sam novčić od 1 rublje pored LCD-a.




    Za brzo povezivanje ekrana na Arduino, zalemio sam liniju kontakata na pinove LCD-a. LCD se može povezati putem serijske ili paralelne magistrale. Odabrao sam prvu opciju, jer već postoji nekoliko besplatnih Arduino kontakata.
    Veza (preuzeto sa weba):

    - Pin 1 (GND) je spojen na zajedničku magistralu
    - Pin 2 (VCC) je spojen na +5V sabirnicu napajanja, a trenutna potrošnja je relativno mala i zaslon se može napajati iz ugrađenog Arduino stabilizatora.
    - Pinovi 4, 5 i 6 se povezuju na Arduino digitalne izlaze, formirajući SPI serijski interfejs:
    pin 4 – (RS) – odgovara CS liniji (na primjer 7)
    pin 5 – (RW) – odgovara MOSI liniji (na primjer 8)
    pin 6 – (E) – odgovara liniji SCK (na primjer 3)
    Arduino kontaktni brojevi mogu biti bilo koji, glavna stvar je da ih ne zaboravite ispravno navesti u tekstu programa prilikom inicijalizacije ekrana.
    - Pin 15 (PSB) je spojen na zajedničku magistralu.
    - Kontakti 19 (A) i 20 (K) su napajanje pozadinskog osvetljenja (+5V i GND, respektivno). Za podešavanje svjetline pozadinskog osvjetljenja možete koristiti promjenjivi otpornik od 10 kOhm povezan između sabirnice napajanja i GND-a. Napon iz njegovog motora se dovodi na pin 19 displeja.
    Po ovim uputstvima spojio sam sve osim pozadinskog osvjetljenja. Koristio sam Arduino PWM za napajanje pozadinskog osvjetljenja.
    Za programsko povezivanje LCD-a sa Arduinom, koristi se biblioteka u8glib. Možete ga preuzeti. Ako bude problema sa preuzimanjem, mogu da učitam biblioteku na narod.ru.
    Sama biblioteka nije komplikovana i omogućava vam da prikažete tekst u različitim fontovima, nacrtate liniju, nacrtate jednostavne geometrijske oblike (pravougaonik, krug) i prikažete sopstvene slike pripremljene na poseban način. U principu, ovaj alat je dovoljan za većinu zadataka.
    Evo rezultata jednostavnog programa:

    Sam program:

    #include "U8glib.h"

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

    // Potprogram za određivanje slobodne memorije
    int freeRam() (
    extern int __heap_start, *__brkval;
    int v;
    return (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
    }

    Void setup(void) (
    u8g.setFont(u8g_font_6x10); // font
    u8g.setRot180(); //Okrenite ekran
    analogWrite(6, 115); // Postavite svjetlinu ekrana (anoda pozadinskog osvjetljenja na 6 pinova)
    }

    Void loop(void) (
    u8g.firstPage();
    uraditi(

    u8g.setPrintPos(1, 12); // pozicija
    u8g.print("Zdravo!!!"); // izlazni tekst
    u8g.drawBox(0,22,128,9); // Obojite pravougaonik u bijelo
    u8g.setColorIndex(0); // bijela tinta, crna pozadina
    u8g.setPrintPos(1, 30); // pozicija
    u8g.print("Riječ..."); // izlazni tekst

    U8g.setColorIndex(1); // bijela tinta, crna pozadina
    u8g.setPrintPos(1, 50); // pozicija
    u8g.print("Nakon početka ="); // izlazni tekst
    u8g.setPrintPos(85, 50); // pozicija
    u8g.print(millis() / 1000); // ispisuje broj sekundi nakon pokretanja
    u8g.setPrintPos(1, 64); // pozicija
    u8g.print(freeRam()); // ispisuje koliko je memorije zauzeto
    ) while(u8g.nextPage());

    Kašnjenje(200);
    }

    Sat realnog vremena DS1307
    Još jedna komponenta za moju meteorološku stanicu. Ovaj štit implementira sat realnog vremena. Naručio sam ih na eBayu. Prodavac je šal za sat poslao u nerealno velikoj kutiji


    Unutar kutije su bila dva A4 lista reklama i maramica za sat umotana u celofan


    Želio bih napomenuti da naknada ne prelazi 2 rublje. novčić, a dimenzije kutije su 13x15x5 cm.
    Ploča je bila upakovana u antistatičku vrećicu

    Šal izbliza



    Morao sam se pozabaviti ovim modulom. Prvo, bilo je poteškoća u povezivanju. I drugo, na ovoj ploči nema kvarca. Da sam znao da ću toliko vremena potrošiti na modul, najvjerovatnije bih ga sam sastavio, pošto je internet pun dijagrama. Najjednostavniji sklop sadrži 4-5 komponenti.
    Što se tiče veze. Našao sam biblioteku koja kaže da se I2C sučelje može povezati ne na uobičajene Arduino analogne ulaze (A4 i A5), već na bilo koje diskretne. Uradio sam to kako je napisano. Isprva ništa nije išlo, ali nakon dugog plesa uz tamburu sat je pokrenuo. Pa, mislio sam, to je to, problemi su gotovi, ali nakon što sam pokušao spojiti isti modul na drugi Arduino, ples s tamburom se nastavio. Proveo sam dosta vremena tražeći rješenje za ovaj problem i gotovo svugdje je bilo naznačeno ili neispravna veza ili nepostojanje pull-up otpornika na SCL i SDA kontaktima. Već sam htio ući u ploču sa lemilom, ali na jednom forumu sam slučajno naišao na kod gdje je rečeno da se SCL i SDA spoje na standardne I2C portove na Arduinu. Nakon standardne veze, sve je odmah proradilo.
    Sada o kvarcu. Ne znam kakav su kvarc Kinezi tamo stavili, ali satovi sa takvim kvarcom bježe za 10-11 sekundi dnevno. Ova greška iznosi 5 minuta mjesečno i 1 sat godišnje. Nema potrebe za ovakvim satom. Morao sam ponovo ići na internet i tražiti kako da popravim ovu grešku. Prvo rješenje koje se pojavi kaže da morate uzemljiti kvarc. Uradio sam to - rezultat je bio nula. Također sam negdje našao da moram pronaći staru matičnu ploču i odatle ukloniti kvarc za sat. Uspio sam - rezultat ima. Sada sat ne bježi za 10-11 sekundi, već za 1,5 sekundi dnevno. Recimo da je postalo bolje, ali je daleko od idealnog. Pošto mi se više ne da petljati sa lemilom, odlučeno je da se sat podesi programski, odnosno da se sat podesi na potrebnu vrijednost jednom dnevno. Nakon 10 dana, sat je otkucao za ne više od sekunde. Metoda je dobra, ali samo kada je Arduino uređaj za sinhronizaciju priključen na napajanje, inače sat radi na bateriju i dalje bježi.
    Mali program za testiranje:

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

    Byte decToBcd(byte val)
    {
    povratak ((val/10*16) + (val%10));
    }

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

    Poništi setDateDs1307 (bajt sekunde, // 0-59
    bajt minuta, // 0-59
    bajt sat) // 0-99
    {

    Wire.write(0);
    Wire.write(decToBcd(drugi));
    Wire.write(decToBcd(minuta));
    Wire.write(decToBcd(sat));
    Wire.endTransmission();
    }

    Poništi getDateDs1307(bajt *sekunda,
    bajt *minuta,
    bajt *sat)
    {

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

    Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

    *second = bcdToDec(Wire.read());
    *minute = bcdToDec(Wire.read());
    *sat = bcdToDec(Wire.read());
    }

    Void setup()
    {
    bajt sekunda, minuta, sat;
    Wire.begin();
    Serial.begin(9600);

    Drugi = 45;
    minuta = 5;
    sat = 16;

    SetDateDs1307(sekunda, minuta, sat);
    }

    void loop()
    {
    bajt sekunda, minuta, sat;

    GetDateDs1307(&second, &minute, &hour);
    Serial.print(sat, DEC);
    Serial.print(":");
    Serial.print(minuta, DEC);
    Serial.print(":");
    Serial.println(drugo, DEC);

    Kašnjenje(1000);
    }


    Biblioteka se ovdje ne koristi, a funkcije za vrijeme čitanja i pisanja su skraćene.

    Senzor temperature i vlage DHT11
    Nema se šta reći o ovom senzoru. Ne bih ga ni koristio da vlažnost nije potrebna. Nažalost, nisam ga slikao kada sam ga dobio, tako da neće biti fotografija. Fotografije senzora možete vidjeti ispod, gdje sam ga spojio na Arduino. Povezivanje senzora je jednostavno (+, digitalni izlaz, -). Tipično, senzori su napravljeni sa četiri pina. Sa ovim faktorom forme, treći pin nije povezan ni sa čim.
    Možete koristiti biblioteku za povezivanje na Arduino. Možete ga preuzeti.
    Mali test program sa izlazom informacija na LCD displeju 1602:

    // uključuje kod biblioteke:
    #include
    #include

    // Deklariranje objekata
    dht11 DHT11;
    LiquidCrystal lcd(12, 11, 6, 5, 4, 3);

    #defini DHT11PIN 7
    int i;

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

    void loop()
    {
    int chk = DHT11.read(DHT11PIN);
    lcd.setCursor(8, 0);
    prekidač (chk)
    {
    slučaj 0: lcd.print(“OK „); break;// lcd.setCursor(11, 0); lcd.print(millis()/2000); break;
    case -1: lcd.print(“Greška kontrolne sume”); mErr(); break;
    case -2: lcd.print("Greška isteka vremena"); mErr(); break;
    default: lcd.print("Nepoznata greška"); mErr(); break;
    }
    kašnjenje (500);
    lcd.setCursor(15, 0);
    prekidač(i)
    {
    slučaj 0: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" ");prekid;
    slučaj 1: lcd.print("v"); lcd.setCursor(15, 1); lcd.print(" ");prekid;
    default: lcd.setCursor(15, 1); lcd.print("E"); break;
    }
    i=i+1;
    ako (i>1) i=0;
    lcd.setCursor(0, 1);
    lcd.print("H=");
    lcd.setCursor(2, 1);
    lcd.print((float)DHT11.vlažnost, 0);
    lcd.setCursor(4, 1);
    lcd.print("%");
    lcd.setCursor(8, 1);
    lcd.print("T=");
    lcd.setCursor(10, 1);
    lcd.print((float)DHT11.temperature, 0);
    lcd.setCursor(12, 1);
    lcd.print("C");

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


    Senzor ima neke nedostatke - podaci sa senzora su samo u cijelim brojevima, a raspon je slab.

    Čini se da sam pisao o svim komponentama. Ostaje samo sabrati sve u jednu cjelinu.
    Ups, skoro sam zaboravio! Da biste sastavili uređaj, potrebna vam je futrola. Naručio sam i slučaj na Ebayu. Ispostavilo se da je prodavac iz Engleske. Paket je stigao brzo, ali je nisam slikao. Sve fotografije kućišta su ispod.

    Prvo sam sastavio sve na stolu koristeći posebne žice. Napisao sam testni program i postavio ga na kontroler.



    U stvari, plava boja pozadinskog osvetljenja je mnogo svetlija. Čak i pri minimalnoj svjetlini (Bright=5), okvir je osvijetljen.

    Kako bi se sve spojilo bežično, odlučeno je da se napravi mini matična ploča, a na konektore su stavljene Arduino ploče i štitovi. Ako se nešto dogodi, mogu se brzo i lako ukloniti. Odlučio sam i LCD ekran i kontrolne tipke pričvrstiti na konektore, samo da zalemim senzor temperature na žicama.
    Ovako je ispao šal



    Na posljednjoj fotografiji nisam potpuno isprao fluks. Zalijepio sam poroznu gumu ispod štitova pored konektora tako da ima barem malo potpore. Iako se u stvari štitovi u konektorima na kontaktima dobro drže.

    Matična ploča sa ugrađenim štitovima i Arduino pločom.

    Ovako izgleda kompletna veza sa matičnom pločom


    Umjesto dugmadi koristio sam domaći štit zalemljen na matičnu ploču. Koristio sam dugmad od starih miševa kao dugmad.
    Kao što vidite, broj žica se smanjio.

    Glavni problem postavljanja u kućište je izrezivanje glatkog utora za LCD ekran. Koliko god se trudio, i dalje nije išlo savršeno. Zazori su na pojedinim mjestima bili nešto veći od 1 mm. Da bi sve izgledalo uredno, uzeo sam crni akvarijumski zaptivač i popunio sve pukotine, a istovremeno sam pričvrstio ekran na ovaj zaptivač. Nakon što se zaptivač osušio, odrezao sam višak sa vanjske strane. Pri jakom svjetlu zaptivač je vidljiv, ali pri normalnom svjetlu sve se spaja sa tijelom.
    Ovako izgleda kućište iznutra sa ugrađenim LCD ekranom i matičnom pločom.

    Ovako to izgleda spolja na jakom svetlu (izvinjavam se zbog otisaka prstiju, video sam ih kada sam slagao fotografije).

    Dugo sam razmišljao kako da uklopim dugmad u futrolu i, što je najvažnije, koje tastere da koristim...
    U radio-elektroničkim radnjama svidjelo im se dugme sa dugačkom iglom i vrhovi koji staju na ovu iglu. Ova dugmad se koriste za lemljenje na ploču. Sve bi bilo u redu, ali imaju minus - pritisak pritiska je vrlo mali i glasan.
    Dugme smo morali postaviti u dvije faze: prva je bila postavljanje dugmadi na ploču, druga je bila postavljanje ove ploče na drugu ploču. I onda sve ovo stavite u tijelo na vodilice.

    Ovako izgleda šal sa dugmadima:



    Ovako izgleda tabla držača:


    Ovdje možete vidjeti vodilice u koje je umetnuta ploča sa dugmadima. Neki elementi su zalemljeni kako bi se dala krutost ploče.

    Sada stavljamo sve u tijelo
    Bez povezivanja dugmadi:


    Sa vezom na dugmad:

    Zatvorite kućište i uključite ga. Sve radi odlično, dugmad rade kako treba.

    Na kraju postavljam kratak video o radu uređaja u različitim režimima:
    http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
    Za one koji ne vide video ovde, evo linka do

    Vrijeme je da završimo recenziju.
    Napisat ću malo o programu, a zatim i neke kratke zaključke. Kada sam pisao program, nisam mislio da ću vrlo brzo dostići granicu od 30.720 bajtova.


    Morao sam optimizirati kod. Premjestio sam mnoge dijelove koda u potprograme. Nikada ne bih pomislio da naredba switch...case u prevedenom obliku zauzima više prostora od nekoliko if...else naredbi. Ispravna deklaracija varijabli također štedi prostor. Ako deklarišete dug niz, iako je sasvim moguće doći do bajtova, tada prekoračenje memorije dostiže 500 bajtova, ovisno o veličini niza. Kada napišete program, ne razmišljate o njemu, a tek kasnije, kada analizirate program, shvatite da ste nešto pogriješili i počnete optimizirati kod. Nakon što su problemi s veličinom programa riješeni, naišao sam na ograničenje RAM-a. To je bilo izraženo u činjenici da je program počeo da se smrzava nakon učitavanja. Morao sam da uvedem potprogram za izračunavanje slobodne RAM memorije. Kao rezultat toga, bio sam primoran da napustim jedan algoritam vremenske prognoze, jer mora da prikazuje ikone na ekranu. Sam algoritam radi, ali je izlaz ikona morao biti snimljen. Još uvijek imam ideje kako optimizirati kod, ali u bliskoj budućnosti ću ostaviti uređaj da radi kako bi procijenio njegove performanse i identificirao sve greške.

    Sada neki zaključci
    Minusi
    1) Cijena. Opravdanje za ovaj nedostatak je da hobi nikada nije jeftin.

    pros
    1) Odlična funkcionalnost uređaja
    2) Povećanje funkcija je ograničeno samo kontrolorom koji se koristi i vašom vlastitom željom
    3) Estetski užitak od kontemplacije i moralna satisfakcija od činjenice da sam konačno sastavio i kompletirao ovaj uređaj

    Planiram kupiti +85 Dodaj u favorite Svidjela mi se recenzija +137 +304

    Najbolji članci na ovu temu