Meteorologinė stotis Arduino. Vidinė oro stotis Arduino Orų stoties grandinėse Arduino uno

Norėjau turėti savo orų stotį, kuri daviklius rodmenis perduoda į žmonių stebėjimo žemėlapį (Google paieškoti užtrunka 5 sekundes). Paaiškėjo, kad tai nėra taip sunku, kaip atrodo. Apsvarstykite, kas buvo padaryta.

Šiam veiksmui paėmiau Arduino Uno ir Ethernet Shield w5100. Visa tai buvo užsakyta iš Kinijos „Aliexpress“.

Taip pat ten užsisakiau jutiklius: DHT22, DHT11, DS18B20, BMP280 (numatyti ir dujų, dūmų davikliai...)

Rūkydamas forumus, Google, Yandex, radau gerą eskizo versiją - https://student-proger.ru/2014/11/meteostanciya-2-1/

Toje pačioje vietoje komentaruose žmogus paskelbė užbaigtą eskizą su šviesos ir dujų jutikliais. Aš juos paėmiau kaip pagrindą.

Tuose eskizuose 280 slėgio jutiklio palaikymo nebuvo, kalbėjomės su autoriumi, jis 180 pakeitė 280. Viskas veikė puikiai (ačiū už tai)

Žemiau pateikiamas mano gauto galutinio eskizo pavyzdys.

Šiuo metu turiu prijungtus jutiklius:
DHT22 - 1 vnt.
DHT11 - 1 vnt.
BMP280 - 1 vnt.
DS18B20 - 2 vnt.

DĖMESIO! Prieš įkeldami eskizą, nepamirškite pakeisti įrenginio MAC adreso, kad nepersidengtumėte su kitais (pavyzdžiui, paimkite savo mobiliojo telefono Mac adresą ir pakeiskite paskutines jame esančias raides / skaičius, o tai nebus " trikdyti“ jūsų vietinį tinklą!

Apytikslė prijungimo schema (nuotrauka paimta internete iš šio eskizo):

Dėl techninių priežasčių negaliu čia patalpinti eskizo. Įdėjau į archyvą. Nuoroda į ją yra aukščiau.

Kaip matote, yra rodmenų, jie veikia tinkamai, pavyzdžiui, aš paskelbsiu keletą ekrano kopijų iš savo jutiklių:

Laisvalaikiu ir šį kartą rašiau instrukcijas, kaip pasidaryti nedidelę orų stotį. Jis veiks kaip laikrodis su data ir parodys temperatūrą kambaryje ir už jos ribų. Kaip pagrindinį valdiklį naudosime „Arduino UNO“, tačiau tiks ir kita plokštė su „Atmega328p“. Ekranui naudojame WG12864B grafinį ekraną. Taip pat sujungsime du ds18b20 temperatūros jutiklius. Vienas yra patalpoje, kitas išnešamas į lauką. Pradėkime.

Gaminant naminius gaminius mums reikia:

Arduino UNO (arba bet kuri kita su Arduino suderinama plokštė)
- WG12864B grafinis ekranas
- temperatūros jutiklis ds18b20, 2 vnt
- Maitinimas 6 - 12 V
- Rezistoriai 4,7 Kom 0,25 W, 2 vnt.
- Rezistoriai 100 omų 0,25 W
- Baterijų skyrius 4 AAA "mažojo pirštelio" baterijoms
- Dėžutė iš SEGA konsolės kasetės
- Izoliacinė juosta
- Jungiamieji laidai
- Grandinės plokštė
- Mygtukai
- Kanceliarinis peilis
- lituoklis
- Lydmetalis, kanifolija
- Dvipusė juosta

1 veiksmas Paruoškite WG12864B3.
Anksčiau su ekranais nedirbusius gali gąsdinti daugybė iš pažiūros vienodų ekranų modifikacijų. Truputį paaiškinsiu. Dauguma tokio tipo ekranų veikia su ks0107/ks0108 lustais. Visus ekranus galima suskirstyti į 4 tipus:

A variantas: HDM64GS12L-4, Crystalfontz CFAG12864B, Sparkfun LCD-00710CM, NKC Electronics LCD-0022, WinStar WG12864B-TML-T

B variantas: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ ekranai AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LDW1, Digi6t LDW1,828 86 4F, TM12864L-2, 12864J-1

C variantas: Shenzhen Jinghua Displays Co Ltd. JM12864

D variantas: Wintek- Cascades WD-G1906G, Wintek - GEN/WD-G1906G/KS0108B, Wintek/WD-G1906G/S6B0108A, TECDIS/Y19061/HD61202, Varitronix/MGLS191264/

Jie atrodo beveik vienodai. Tačiau jungties kaiščiai skiriasi. Aš pasirinkau ir jums rekomenduoju WG12864B3 V2.0, bet jei ekranas buvo kitoks arba tiesiog neturite jo po ranka, galite lengvai tai išsiaiškinti naudodami lentelę:

Trumpos specifikacijos:

Internete yra daug įvairių prisijungimo schemų ir atrodo, kad viskas veikia. Reikalas tas, kad yra ne tik skirtingi ekranai, bet ir du jų prijungimo būdai: nuoseklus ir lygiagretus. Naudojant nuoseklųjį prievadą, mums reikia tik 3 mikrovaldiklio išėjimų. Su lygiagrečiu minimumu 13. Pasirinkimas šiuo atveju akivaizdus, ​​Arduino išvadų šiaip ar taip nėra. Lygiagrečiam prijungimui prijungimo schema yra tokia:

Nuosekliajam ryšiui, kurį naudosime, schema yra tokia:

WG12864B – Arduino UNO 1 (GND) – GND 2 (VCC) – +5V 4 (RS) – 10 5 (R/W) – 11 6 (E) – 13 15 (PSB) – GND 19 (BLA) – per rezistorių 100 omų – ​​+5V 20 (BLK) – GND

Norint sureguliuoti kontrastą, ekrane turi būti potenciometras. Yra ekranų be jo, bet dabar tai reta:

100 omų rezistorius reikalingas, kad 5 voltų įtampa netyčia nesudegintų foninio apšvietimo diodų.

2 veiksmas.
Korpusui paimkite dėžutę iš Sega priedėlio kasetės. Jei nerandate šios dėžutės po ranka, galite naudoti kitą dėklą. Svarbiausia, kad jame tilptų ekranas ir „Arduino“.

Nupjaukite permatomą plėvelę, esančią dėžutės viršuje, kad neliktų gabalėlių:

Tada naudodami kanceliarinį peilį išpjaukite ekranui 37x69 langą.

Kitoje pusėje, išilgai išpjovos krašto, klijuojame dvipusę juostą, geriausia juodą:

Nuimame apsauginį popierių nuo lipnios juostos ir klijuojame ekraną:

Iš išorės jis turėtų atrodyti taip:

Po ekranu, taip pat ant dvipusės juostos, montuojame Arduino, prieš tai padarę USB prievado ir maitinimo lizdo išpjovas:

Abiejose dėžutės pusėse turi būti padarytos išpjovos Arduino lizdams, kad ji galėtų laisvai užsidaryti:

3 žingsnis Temperatūros jutikliai.
Naudosime skaitmeninius temperatūros jutiklius DS18B20. Naudodami juos gauname didesnį matavimo tikslumą, paklaidą ne didesnę kaip 0,5 °C, plačiame temperatūrų diapazone -55 ... + 125 °C. Be to, jutiklis yra skaitmeninis ir pats atlieka visus skaičiavimus, o Arduino tiesiog gauna jau paruoštus rodmenis. Jungdami šį jutiklį nepamirškite apie 4,7KΩ ištraukiamąjį rezistorių tarp DQ ir VDD kaiščių. Taip pat galimi keli prijungimo variantai. Su išorine galia, mano nuomone, geriausias pasirinkimas, mes jį naudosime:

Su bet kokia maitinimo parinktimi jutikliai yra prijungti lygiagrečiai:

Patalpų temperatūros jutiklį pastatysime ant nedidelės lentos kartu su dviem mygtukais, kuriais nustatysime laikrodžio laiką ir datą:

Mes prijungiame bendrą laidą nuo abiejų mygtukų prie GND, laidą nuo pirmojo mygtuko prijungiame prie A0, nuo antrojo prie A1.
Užfiksuojame ant dvipusės juostos šalia „Arduino“:

Jutiklį, kuris turėtų būti pastatytas už patalpos ribų, geriau pasirinkti metaliniame, dulkėms atspariame korpuse:

Apskaičiuokite reikiamo ilgio laidą, kad galėtumėte pakabinti jutiklį už lango, svarbiausia, kad jis nebūtų didesnis nei 5 metrai, jei reikia ilgesnio ilgio, turėsite sumažinti traukos vertę. aukštyn rezistorius.

Mes prijungiame laidą iš abiejų jutiklių DQ duomenų magistralės prie Arduino 5 kaiščio.
Vdd - +5 Arduino.
GND – GND Arduino.

4 žingsnis Mityba.
Maitinti galite naudoti maitinimo šaltinį, kurio įtampa yra nuo 6 iki 12 voltų. Maitinimo blykstės laido gale prilituokite kištuką, kuris tinka Arduino maitinimo lizdui:

Arba į dėklą galite įdėti baterijų skyrių keturioms „AAA“, „mažojo pirštelio“ baterijoms. Ir prijunkite teigiamą laidą nuo įlankos prie Vin Arduino, o neigiamą laidą - prie GND.

5 žingsnis Paruoškite programavimo aplinką.
Pirmiausia turite atsisiųsti ir įdiegti „Arduino IDE“ iš oficialios svetainės

Taip pat pridėkite prie dviejų eskizui reikalingų bibliotekų. OneWire – reikalingas ryšiui su ds18b20 jutikliais:

U8glib – naudojamas informacijai rodyti ekrane:

Bibliotekų atsisiuntimas. Tada išpakuojame archyvus, o archyvų turinį perkeliame į aplanką „bibliotekos“, esantį aplanke su įdiegta Arduino IDE. Taip pat galite pridėti bibliotekų naudodami „Arduino IDE“. Norėdami tai padaryti, neišpakuodami archyvų, paleiskite Arduino IDE, meniu pasirinkite Sketch - Connect Library. Pačiame išskleidžiamojo sąrašo viršuje pasirinkite elementą "Pridėti ZIP biblioteką". Nurodykite atsisiųstų archyvų vietą. Atlikę visus veiksmus, turite iš naujo paleisti Arduino IDE.

6 žingsnis Eskizo redagavimas.
Temperatūros jutikliai veikia naudodami One Wire protokolą ir turi unikalų kiekvieno įrenginio adresą – 64 bitų kodą. Eskize nepatartina pridėti komandų ieškant jutiklių. Nereikia kiekvieną kartą įkelti „Arduino“, kad jutikliai užkluptų. Todėl pirmiausia, viską surinkę, užpildome Arduino eskizą, esantį meniu Failas - Pavyzdžiai - Dalaso temperatūra - OneWireSearch. Tada paleidžiame Tools - Port Monitor. Arduino turėtų rasti mūsų jutiklius, parašyti adresus ir temperatūros rodmenis. Šiuos adresus reikia užsirašyti arba tiesiog kur nors nukopijuoti. Dabar atidarykite Ard_Tic_Tak_WG12864B_2_x_Term_Serial eskizą ir ieškokite eilučių:

Byte addr1=(0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63);// vidinio baito adresas addr2=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x16, 09, 0x5 jutiklis);

Vietą atitinkančių jutiklių adresus pakeičiame savo adresais.
Mūsų laikrodis nenaudoja RTC modulio (realaus laiko laikrodžio), todėl būtina koreguoti laikrodį. Kad būtų patogiau, panaikinkite eilutės komentarą (ekrane pasirodys sekundės):

//u8g.setPrintPos(44, 50); u8g.print(sec); // Išvesties sekundes, kad būtų galima valdyti judesio teisingumą

Nustatykite tinkamą laiką naudodami prievado monitorių. Norėdami tai padaryti, atidarykite prievado monitorių, palaukite, kol baigsis pradiniai temperatūros matavimai, ir įveskite dabartinę datą ir laiką formatu „diena, mėnuo, metai, valandos, minutės, sekundės“. Tarpų nėra, skaičiai atskiriami kableliais arba taškais.

Jei laikrodis skuba, pakeiskite reikšmę į didesnę, rekomenduoju eksperimentuoti su 100 vienetų žingsniu. Jei atsilieka, vertė eilutėje turėtų būti sumažinta:

If (micros() - prevmicros >494000) ( // pakeisti į ką nors kitą, kad pakoreguotų tai buvo 500000

Empiriškai nustatome skaičių, kuriuo laikrodis veikia pakankamai tiksliai. Norint nustatyti judesio tikslumą, reikia sekundžių išvesties. Tiksliai sukalibravus skaičių, sekundes galima komentuoti ir taip pašalinti iš ekrano.
Įkeliamas eskizas.

Kažkaip vaikščiodamas po miestą pamačiau atsidariusią naują radijo elektronikos parduotuvę. Eidamas į tai radau daugybę Arduino skydų. Namuose turėjau Arduino Uno ir Arduino Nano ir iškart kilo mintis pažaisti su signalų siųstuvais iš toli. Nusprendžiau nusipirkti pigiausią 433 MHz siųstuvą ir imtuvą:

Signalo siųstuvas.


signalo imtuvas.

Užfiksavus patį paprasčiausią duomenų perdavimo eskizą (pavyzdys paimtas iš čia), paaiškėjo, kad perdavimo įrenginiai gali būti visai tinkami paprastiems duomenims, tokiems kaip temperatūra, drėgmė, perduoti.

Siųstuvas turi šias charakteristikas:
1. Modelis: MX-FS-03V
2. Veikimo spindulys (priklauso nuo blokuojančių objektų buvimo): 20-200 metrų
3. Darbinė įtampa: 3,5 -12V
4. Modulio matmenys: 19*19mm
5. Signalo moduliavimas: AM
6. Siųstuvo galia: 10mW
7. Dažnis: 433MHz
8. Reikalingas išorinės antenos ilgis: 25cm
9. Lengva prijungti (tik trys laidai): DUOMENYS ; VCC ; Žemė.

Priėmimo modulio charakteristikos:
1. Darbinė įtampa: DC 5V
2. Srovė: 4mA
3. Darbinis dažnis: 433,92MHz
4. Jautrumas: - 105dB
5. Modulio matmenys: 30*14*7mm
6. Reikalinga išorinė antena: 32 cm.

Interneto platybėse sakoma, kad informacijos perdavimo diapazonas 2Kb/s gali siekti iki 150m. Pats netikrinau, bet dviejų kambarių bute visur priima.

Namų oro stoties techninė įranga

Po kelių eksperimentų nusprendžiau prie Arduino Nano prijungti temperatūros, drėgmės jutiklį ir siųstuvą.


DS18D20 temperatūros jutiklis prijungiamas prie arduino taip:

1) GND iki mikrovaldiklio minuso.
2) DQ per ištraukimo rezistorių į žemę ir į Arduino D2 kaištį
3) Vdd iki +5V.

Siųstuvo modulis MX -FS - 03V maitinamas 5 voltais, duomenų išvestis (ADATA) prijungta prie D13 kaiščio.

Prie Arduino Uno prijungiau LCD ekraną ir BMP085 barometrą.


Arduino uno laidų schema

Signalo imtuvas prijungtas prie kaiščio D10.

BMP085 modulis yra skaitmeninis atmosferos slėgio jutiklis. Jutiklis leidžia matuoti temperatūrą, slėgį ir aukštį virš jūros lygio. Ryšio sąsaja: I2C. Jutiklio maitinimo įtampa 1,8-3,6 V

Modulis yra prijungtas prie Arduino taip pat, kaip ir kiti I2C įrenginiai:

  • VCC - VCC (3.3V);
  • GND-GND;
  • SCL - į analoginį kaištį 5;
  • SDA – į analoginį 4 kaištį.
  • Labai maža kaina
  • Maitinimas ir I/O 3-5V
  • Drėgmės nustatymas 20-80% 5% tikslumu
  • Temperatūros nustatymas 0-50 laipsnių. 2% tikslumu
  • Apklausos dažnis ne didesnis kaip 1 Hz (ne dažniau kaip kartą per 1 sek.)
  • Matmenys 15,5 mm x 12 mm x 5,5 mm
  • 4 kaiščiai su 0,1 colio atstumu tarp kojų

DHT turi 4 kaiščius:

  1. Vcc (3–5 V maitinimas)
  2. Data out – duomenų išvestis
  3. Nėra naudojamas
  4. Generolas

Prisijungia prie D8 Arduino.

Namų oro stoties programinė įranga

Siųstuvo modulis matuoja ir perduoda temperatūrą kas 10 minučių.

Žemiau yra programa:

/* Eskizo versija 1.0 Siųsti temperatūrą kas 10 min. */ #include #include #include #define ONE_WIRE_BUS 2 //Dallas jutiklio prijungimo kaištis OneWire oneWire(ONE_WIRE_BUS); Dalaso temperatūros jutikliai (&oneWire); Įrenginio adresas termometro viduje; void setup(void) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // Reikalingas DR3100 vw_setup(2000); // Nustatyti duomenų perdavimo spartą (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); //Duomenų formavimas int numeriui siųsti = tempC; char simbolis = "c"; //Paslaugos simbolis, skirtas nustatyti, ar tai yra jutiklis String strMsg = "z "; strMsg + = simbolis; strMsg += " "; strMsg += skaičius; strMsg += " "; char msg; strMsg.toCharArray(msg, 255); vw_send((uint8_t *)msg, strlen(msg)); vw_wait_tx(); / / Palaukite, kol perkėlimas baigsis delay(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); } }

Priimantis įrenginys priima duomenis, matuoja slėgį ir temperatūrą patalpoje ir perduoda juos į ekraną.

#include #include LiquidCrystal lcd(12, 10, 5, 4, 3, 2); #įtraukti dht11 jutiklį; #apibrėžti DHT11PIN 8 #įtraukti #įtraukti BMP085 dps = BMP085(); ilgas Temperatūra = 0, Slėgis = 0, Aukštis = 0; void setup() ( Serial.begin(9600); vw_set_ptt_inverted(true); // Reikalingas DR3100 vw_setup(2000); // Nustatyti priėmimo spartą vw_rx_start(); // Pradėti oro stebėjimą 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; // Pranešimų buferis uint8_t buflen = VW_MAX_MESSAGE_LEN; // Buferio ilgis if (vw_get_message(buf, &buflen)) // Jei pranešimas gautas ( // Pradėkite analizuoti int i; // Jei pranešimas yra neskirtas mums , išeiti if (buf != "z") ( return; ) char command = buf; // Komanda yra 2 indekse // Skaitinis parametras prasideda nuo 4 indekso i = 4; int skaičius = 0; // Kadangi perkėlimas vyksta po simbolio , simbolių rinkinį reikia konvertuoti į skaičių while (buf[i] != " ") ( skaičius *= 10; skaičius += buf[i] - "0"; i++; ) dps.getPressure(&Pressure); dps.getAltitude (&Altitude); dps.getTemperature(&Temperature); //Serial.print(command); Serial.print(" "); Serial.println(numeris); lcd.print("T="); lcd.setCursor(2,0); LCD spausdinimas(numeris); lcd.setCursor(5,0); lcd.print("P="); lcd.print(Slėgis/133.3); lcd.print("mmH"); lcd.setCursor(0,1); lcd.print("T="); lcd.print(Temperatūra*0,1); lcd.print("H="); lcd.print(jutiklis.drėgmė); lcd.home(); //delay(2000); int chk = sensor.read(DHT11PIN); jungiklis (chk) ( atvejis DHTLIB_OK: //Serial.println("Gerai"); pertrauka; atvejis DHTLIB_ERROR_CHECKSUM: //Serial.println("Patikros sumos klaida"); pertrauka; atvejis DHTLIB_ERROR_TIMEOUT: //Serial.println("Time out klaida"); pertrauka; numatytasis: //Serial.println("Nežinoma klaida"); pertrauka; ) ) )

P.S. Ateityje planuoju pridėti šiuos dalykus:
- drėgmės jutiklis prie siųstuvo, pertvarkykite duomenų perdavimo algoritmą
- jutiklis, skirtas matuoti vėjo greitį ir kryptį.
- pridėkite kitą ekraną prie imtuvo.
- perkelkite imtuvą ir siųstuvą į atskirą mikrovaldiklį.

Žemiau yra nuotrauka, kas nutiko:

Radijo elementų sąrašas

Paskyrimas Tipas Denominacija Kiekis PastabaParduotuvėMano užrašų knygelė
perduodanti dalis.
Arduino lenta

Arduino Nano 3.0

1 Į užrašų knygelę
temperatūros jutiklis

DS18B20

1 Į užrašų knygelę
Rezistorius

220 omų

1 Į užrašų knygelę
siųstuvo modulisMX-FS-03V (433 MHz)1 Į užrašų knygelę
radijo imtuvo dalis.
Arduino lenta

Arduino Uno

1 Į užrašų knygelę
Trimerio rezistorius 1 Į užrašų knygelę
Rezistorius


„Taigi, iš karto susitarkime: nekursite filmo Holivudui. Netgi Stebuklų šalyje patvirtinama ne daugiau kaip penki procentai visų scenarijų, o tik vienas procentas pradedamas gaminti ... Taigi, vietoj viso to, jūs ketinate sukurti savo Holivudą.
Edas Gaskelis „Skaitmeninio kino filmavimas arba Holivudas namuose“

Pratarmė

Ką, dar viena Arduino oro stotis?! Taip, dar vienas ir, kažkas man sako, ne paskutinis daiktų internete.


Kaip kiekvienas programuotojas privalo parašyti „Hello World!“ programą, taip ir kiekvienas arduinietis turi turėti patirties kuriant paprastą ar nelabai meteorologinę stotį.
Aprašyta nemažai jau sukurtų orų stočių projektų internete, skaitytojas gali pasirinkti bet kurį iš jų įgyvendinimui. Atvirai kalbant, atidžiai išstudijavau apie dešimt panašių projektų ir krūvą susijusių. Todėl negalima sakyti, kad viską kūriau nuo nulio, žinoma, „stojau ant milžinų pečių“.


Iš karto turiu pasakyti, kad į mano planus nebuvo įtrauktas trečiųjų šalių paslaugų naudojimas duomenims saugoti ir rodyti. Norėjau asmeniškai pajusti ir suprasti, kaip visa tai veikia iš vidaus nuo pradžios iki pabaigos, nuo A iki Z.


Taigi tiems, kurie nori greitai ką nors iš nieko prikalti, ši straipsnių serija greičiausiai netiks. Lengviau eiti ir nusipirkti paruoštą rinkinį su surinkimo instrukcijomis. Mikroelektronikos profesionalams čia absoliučiai nėra ką veikti, gal žiopčioti ir prisiminti save kelionės pradžioje.
Bet tiems, kurie tikrai nori suprasti, manau, patiks. Galbūt medžiaga bus naudinga kaip mokymo priemonė.



Šis projektas buvo įgyvendintas dar 2016 m., bet tikiuosi, kad jis vis dar aktualus.

Technologijų rinkinys

Studijuosime ir dirbsime su paprastais ir sudėtingais dalykais:

  • temperatūros ir drėgmės jutikliai, tipai DHT22, DHT11
  • barometrinio slėgio jutiklis, tipas BMP180
  • WiFi modulis ESP8266
  • radijo modulio tipas nRF24 2,4 GHz
  • šeimos Arduino Pro Mini, Arduino Mega
  • saulės baterijos ir baterijos
  • programavimo kalba C/C++
  • PHP programavimo kalba
  • MySQL duomenų bazių valdymo sistema
  • „Java“ programavimo kalba ir „Android“ sistema (sukuriama „Adnroid“ programa, skirta orų duomenims rodyti išmaniajame telefone).

Kai kurios išvardintos temos nėra vertos, o kai kurias galima studijuoti metų metus. Todėl sudėtingus dalykus paliesime tik su šiuo projektu tiesiogiai susijusioje dalyje, kad suprastumėte, kaip visa tai veikia.


Bet pradėsime nuo pat pradžių Teisingai. Būtent iš būsimo įrenginio aprašymo ir dizaino "ant lapo" kad galiausiai kiekviena plyta gulėtų savo vietoje.

prototipų kūrimas

Kaip teisingai mums sako Vikipedija, prototipų kūrimas yra greitas veikiančios sistemos įgyvendinimo projektas. Kuris, taip, neveiks visiškai neefektyviai ir su tam tikromis klaidomis, bet leis suprasti, ar amatą reikėtų sukurti iki pramoninio dizaino. Prototipo kūrimo procesas neturėtų trukti ilgai. Po prototipų kūrimo etapo seka sistemos analizė ir jos tobulinimas.


Tačiau tai yra pramonėje, kurioje darbuotojai dirba visą darbo dieną.


Kiekvienas, vakarais kniedė savo augintinio projekto amatus „daiktų internetui“, turėtų žinoti, kad kuria prototipą, pusgaminį. Tai labai toli nuo įprasto pramoninio produkto lygio. Štai kodėl mūsų mėgėjų amatams neturėtumėte patikėti jokių svarbių gyvybę palaikančių sričių ir tikiuosi, kad jie mūsų nenuvils.


Pramoninis produktas yra sukurtas pramoninių elementų pagrindu, o tada pereina daug daugiau etapų, įskaitant derinimą, testavimą ir priežiūrą, kol tampa bestseleriu.


Taigi vietoj viso to nuobodulio kursime savo žaislą, bet ne paprastą. Su techninės kūrybos elementais, programavimo pradžia ir daugelio kitų susijusių dalykų žinojimu (kūrimo procese).


Žinoma, elektronikos inžinieriams programavimo etape bus sunku, o programuotojams teks paprakaituoti dėl grandinių, tačiau autorius stengsis viską išdėstyti kuo prieinamiau ir aiškiai aprašyti, kodėl buvo naudojami tam tikri sprendimai.

Reikalavimai

Paprastai šis žingsnis praleidžiamas. Nusprendus ką nors panašaus padaryti dabar, o tada paaiškėja mažos smulkmenos, dėl kurių visas projektas atsiduria aklavietėje ar net tampa nepakeliamu. Visas mūsų pageidavimų sąrašas turi būti įrašytas, aš naudoju „Google“ diską, jis pasiekiamas kompiuteryje ir mobiliajame įrenginyje.


Taigi, mūsų meteorologinė stotis turėtų:

  • išmatuoti temperatūrą ir drėgmę lauke
  • išmatuoti temperatūrą ir drėgmę namuose
  • išmatuoti atmosferos slėgį
  • rodyti nurodytas vertes ekrane
  • perkelti duomenis į serverį internete, kur duomenys bus saugomi duomenų bazėje ir rodomi tinklalapyje arba naudojami mobiliojoje programėlėje.

Jutikliai naudojami paprasčiausi ir pigiausi. Pavyzdžiui, žvelgdamas į priekį, pasakysiu, kad DHT22 gana tiksliai matuoja temperatūrą, bet šiek tiek netiksliai su drėgme. Bet vėlgi, kartoju, nesvarbu, nes prieš mus yra prototipas, o 5% drėgmės išsibarstymas nieko svarbaus mūsų gyvenime neturės įtakos.


Sistemos architektūra, aparatinė ir programinė įranga turi leisti sistemą dar labiau išplėsti, kad būtų galima pridėti naujų jutiklių ir naujų galimybių.

Geležis. Komponentų pasirinkimas

Tai yra pati svarbiausia dalis, o ne litavimas ar programavimas. Apibrėžus sistemai keliamus reikalavimus, reikia apsispręsti, kas tiksliai jie bus įgyvendinami.


Čia yra vienas niuansas. Norint parinkti komponentus, reikia gerai išmanyti jų galimybes, reikia išmanyti pačias technologijas. Tai yra, kitaip tariant, čia jūs turite būti toli nuo pradedančiojo elektronikos inžinieriaus ir programuotojo. Taigi ką dabar praleisti porą metų tyrinėjant visą galimų įrenginių spektrą?


Užburtas ratas? Tačiau užburtas ratas egzistuoja tam, kad juos sulaužytų.


Yra išėjimas. Galite tiesiog imti ir pakartoti kažkieno projektą. Išstudijavau jau esamus orų stočių projektus ir tikiuosi, kad žengiau žingsnį į priekį.


Taigi. Orų stoties architektūra paremta Arduino. Kadangi „Arduino“ turi mažą įėjimo slenkstį ir aš jau su tuo susitvarkiau. Tada lengviau pasirinkti.


Iš karto tapo aišku, kad meteorologinėje stotyje bus nuotolinis, už lango esantis jutiklis ir centrinis modulis.


Centrinis, pagrindinis blokas bus patalpoje. Svarbu tai nustatyti pradiniame etape, iš to tokios svarbios charakteristikos kaip temperatūros režimas ir galios „šokis“.


Nuotolinis jutiklis (ar jutikliai) bus be „smegenų“, jo užduotis – periodiškai atlikti matavimus ir perduoti duomenis į centrinį namų bloką. Centrinis blokas gauna duomenis iš visų jutiklių, atvaizduoja juos ekrane ir siunčia į internetą į duomenų bazę. Na, ten jau daug lengviau, kai tik duomenys atsiduria duomenų bazėje, su jais galima daryti ką nori, net braižyti grafikus.


Bendravimui su išoriniu pasauliu internetą vienareikšmiškai pasirinko ESP8266 WiFi modulis beveik neturintis alternatyvos (atkreipkite dėmesį, galbūt dabar tokių alternatyvų atsirado). „Arduino“ yra eterneto išplėtimo plokštės, bet aš visai nenorėjau būti pririštas prie kabelio.



Įdomus klausimas buvo, kaip užtikrinti ryšį tarp išorinio jutiklio (ar jutiklių, pamenate apie sistemos išplėtimo reikalavimą?) ir centro. 433 MHz radijo švyturiai tikrai netinka (visai niekam netinka).


Vėl naudoti ESP8266?


Šio sprendimo trūkumai:

    Reikalingas stabilus WiFi už namų ribų

    ryšio diapazonas nebus didelis

    nukentės patikimumas, sugesus internetui nematysime savo nuotolinių jutiklių

    daugiau energijos suvartojimo.

    Energijos suvartojimas ESP8266:

    kai perduodama 120-170 mA

    kai gauna 50-56 mA

    gilaus miego režimu 10 µA (µA)

    išjungta būsena 5 µA (µA).

Galų gale, norint sujungti nuotolinius jutiklius su pagrindiniu namų įrenginiu, buvo pasirinktas lustas nRF24L01 + su 2,4 GHz siųstuvu ir imtuvu viename buteliuke, su papildoma išorine antena, kad tikrai „pramuštų“ sienas.



Energijos suvartojimas nRF24L01+ 2,4 GHz:

  • kai gaunama 11 mA
  • perduodant 2Mbps greičiu – 13 mA
  • budėjimo I režimu - 26 μA (μA)
  • išjungta būsena 900 nA (nA).

Tiek ESP8266, tiek nRF24L01+ turi tinkamą darbo temperatūros diapazoną: nuo -40 ℃ iki +80 ℃.


Galite nusipirkti nRF24L01+ už maždaug 1 USD arba su išorine antena už 3 USD. Galite nusipirkti ESP8266-01 už maždaug 4 USD. Atidžiai perskaitykite produkto aprašymą! Kitu atveju pirkite vieną anteną.


Atsirado sistemos branduolys. Pereikime prie pačių jutiklių.


Gatvėje, kaip žinote, temperatūra gali pasiekti neigiamas reikšmes, todėl DHT11 jutiklis netinka, bet DHT22 tinka.



DHT22 / AM2302 specifikacijos:

  • Maitinimas nuo 3,3 V iki 5 V, rekomenduojamas 5 V
  • maksimalus suvartojimas 2,5 mA matavimo ir duomenų perdavimo metu
  • drėgmės matavimo diapazonas 0-100% su 2-5% paklaida
  • temperatūros matavimo diapazonas nuo -40 iki +125°C su ±0,5°C paklaida
  • užklausa išmatuoti ne daugiau kaip 0,5 Hz – kartą per 2 sekundes.

Namo viduje tikiuosi nebus neigiamos temperaturos, tad galima naudoti DHT11, juolab kad as jau turejau.


DHT11 savybės:

  • Maitinimas nuo 3,3 V iki 5 V
  • didžiausias suvartojimas 2,5 mA, matavimo ir duomenų perdavimo metu
  • drėgmės matavimo diapazonas 20-80% su 5% paklaida
  • temperatūros matavimo diapazonas nuo 0 iki +50°C su ±2°C paklaida
  • matavimo užklausa ne daugiau kaip 1 Hz – kartą per sekundę.

Galite nusipirkti DHT22 už maždaug 3 USD. DHT11 kainuoja mažiau – 1 USD, tačiau jis taip pat yra ne toks tikslus.


Dabar vėl grįžkite į Arduino. Kokią lentą pasirinkti?


Išbandžiau atskiras sistemos dalis „Arduino UNO“. Tie. Aš prijungiau ESP modulį prie uno ir jį ištyriau, išjungiau, tada prijungiau nRF24 ir pan. Galutiniam lango jutiklio įgyvendinimui pasirinkau Arduino Pro Mini kaip artimiausią miniatiūrą Uno.



Kalbant apie energijos suvartojimą, „Arduino Pro Mini“ taip pat atrodo gerai:

  • nėra USB-TTL keitiklio, kuris pats „valgo“ daug,
  • LED yra prijungtas per 10k rezistorių.

Pažangiam energijos taupymui buvo numatyta:

  • nuimkite šviesos diodą - maitinimo indikatorių iš „Arduino Pro Mini“ (apgailestauju, kad nesugadinau plokštės)
  • arba naudoti "pliką" mazgą ant Atmel ATmega328 mikroprocesoriaus (jo nenaudojo)
  • naudokite mažai galios biblioteką arba JeeLib .

Iš bibliotekų pasirinkau Low Power Library, ji paprasta ir joje yra tik tai, ko reikia.


Centriniam blokui, kadangi buvo planuojama prie jo prijungti daugybę periferinių įrenginių, buvo pasirinkta Arduino Mega plokštė. Be to, jis visiškai suderinamas su UNO ir turi daugiau atminties. Žvelgdamas į ateitį, pasakysiu, kad šis pasirinkimas buvo visiškai pagrįstas.


Galite nusipirkti „Arduino Mega“ už maždaug 8 USD.

Galia ir energijos suvartojimas

Dabar apie maistą ir energijos suvartojimą.


Yra dviejų tipų Arduino Pro Mini:

  • maitinimo įtampai 5V ir dažniui 16MHz
  • 3,3 V maitinimo įtampai ir 8 MHz dažniui.

Kadangi radijo moduliui nRF24L01+ reikalingas 3.3V maitinimas, o greitis čia nėra svarbus, pirkite Arduino Pro Mini 8MHz ir 3.3V.


Šiuo atveju Arduino Pro Mini maitinimo įtampos diapazonas yra:

  • 3,35-12V 3,3V modeliui
  • 5-12V 5V modeliui.

Jau turėjau 5V Arduino Pro Mini, todėl jį ir naudojau. Galite nusipirkti „Arduino Pro Mini“ už maždaug 4 USD.


Centrinio bloko maitinimas bus tiekiamas iš 220 V tinklo per nedidelį maitinimo bloką, duodantį 12V, 450mA, 5W išėjimą. Kažkas panašaus už 5 USD. Taip pat yra atskiras išėjimas 5V.



Ir jei to nepakanka, galite tai padaryti galingiau. Kitaip tariant, taupyti centrinio bloko energiją nėra labai prasminga. Tačiau nuotolinio belaidžio jutiklio atveju svarbiausia yra energijos taupymas. Tačiau nenoriu prarasti funkcionalumo.


Todėl „Arduino Pro Mini“ ir „nRF24“ radijo modulis bus maitinamas 4 Ni-Mh baterijų pluoštu.


Ir prisimink maksimali šiuolaikinės baterijos talpa apie 2500–2700 mAh, bet kas daugiau yra rinkodaros triukas (Ansmann 2850) arba apgaulė (UltraFire 3500).


Ličio jonų baterijų nenaudoju dėl kelių priežasčių:

  • labai brangus
  • aplinkos temperatūrai nukritus žemiau 0°C, ličio jonų akumuliatoriaus galia sumažėja iki 40-50 proc.
  • pigios pagamintos be apsaugos ir nesaugios (trumpojo jungimo ar iškrovos metu gali sprogti ir sudegti, žiūrėkite krūvą vaizdo įrašų YouTube)
  • sensta, net jei jie nenaudojami (tačiau tai galima pasakyti apie visus cheminius elementus), po 2 metų Li-Ion baterija praranda apie 20% talpos.

Prototipui visiškai įmanoma išsiversti su aukštos kokybės Ni-MH AA arba AAA baterijomis. Be to, mums nereikia didelių srovių. Vienintelis Ni-MH baterijų trūkumas yra ilgas įkrovimo laikas.

Bendra meteorologinės stoties schema

Apibendrinkime. Čia yra bendra schema, kaip visa tai veikia.



Tęsinys.

Mes ir toliau plėtojame savo meteorologinę stotį.

Prieš pereinant prie atnaujinimo, noriu šiek tiek paaiškinti.

Vienas iš mūsų kolegų man parašė klausdamas, kodėl buvo įvestas sarginio šuns laikmatis?

Apsauginio šuns laikmatis nustatomas avariniu atveju. Kaip rodo praktika, ENC28J60 netraukia daugiau nei (jei atmintis nesugenda) 4 vienu metu jungtis. Atsižvelgiant į tai, kiek paslaugų jungčių nuolat atsiranda, kad būtų palaikomas pats tinklas, ir tik paliktą srautą, kurį sukuria įvairūs namų žaislai (pavyzdžiui, šiuolaikiniai televizoriai nuskaito turimus tinklo pagrindinius kompiuterius ir atsidaro jų prievadai), dizainas tiesiog nutrūksta. . ENC28J60 nemoka savarankiškai dirbti su tinklo protokolais ir viskas yra įdiegta bibliotekose. Galbūt tai tik jie.
Patikrinau visas turimas bibliotekas ir skirtingus modulius (staiga santuoka), bet stabilaus darbo pasiekti ilgai nepavyko. Maksimalus laikotarpis buvo apie 3-4 savaites.
Būtent tam „šuo“ ten sukasi ir tokiu atveju traukia valdiklį. Po to problema išnyko.
Taip pat neneigiu, kad mano namų tinkle yra tam tikrų niuansų ar problemų. Bet kadangi problema buvo su manimi, tai gali sugalvoti kitas žmogus. Kol kas radau tik šį sprendimą.
Kiek žinau, Wiznet lustai (W5100 ir naujesni) to neturi arba tiesiog nelabai ieškojo.

Pereikime prie atnaujinimo

Svarbiausia, kad mes tolstame nuo lusto ENC28J60 ir eik į W5100. Bandžiau viską įdiegti sename luste, bet trūksta mikrovaldiklio atminties dėl labai didelių bibliotekų ENC28J60. Naudojant naują lustą, standartinis bibliotekos nuo kūrėjo ir visų atliktų pakeitimų, lieka dar daugiau 20% laisva mikrovaldiklio atmintis ATMega328. O tai naujos bandelės!

Ši versija (vadinkime ją antrąja) suteikia galimybę belaidžiu būdu perduoti rodmenis iš jutiklių naudojant dažnį 433 MHz. Pačius modulius paėmiau iš kinų, žymėjimą XY-MK-5V. Noriu pastebėti, kad perdavimo kokybė toli gražu nėra tobula. Gali būti signalo praradimas, triukšmas, ne galimybė vienu metu perduoti ir pan., ir t.t. Tačiau jų kaina (mažiau nei 1 USD už rinkinį) kompensuoja šiuos trūkumus. Išduosiu paslaptį, kad būtent šie (pigiausi) moduliai yra daugelyje firminių oro stočių, skirtų naudoti namuose. Oho, netikėta?

Pradėkime nuo bazinės stoties

Mes persikeliame į Arduino UNO Ir Ethernet skydas(pirmoji versija), pagrįsta lustu W5100. Tai yra sumuštinis ir nėra prasmės jo apibūdinti. Aprašysiu tik papildomai įtrauktus modulių kontaktus XY-MK-5V.

Siųstuvo modulis naudoja energiją 5V, GND(kur tada be mamos) ir D2 kaištis ant valdiklio. Redaguoti kontaktą D2 (DUOMENYS) galite naudoti funkciją vw_set_tx_pin iš vw bibliotekos.

Skirtingai nuo ankstesnio eskizo, šiame eskize naudojamos dvi papildomos bibliotekos:

#įtraukti #įtraukti

Pats eskizas

Paslėptas tekstas

#įtraukti #įtraukti #įtraukti #įtraukti #įtraukti #įtraukti #įtraukti #įtraukti #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); baitas mac = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); charserver = "narodmon.ru"; vidinis prievadas = 8283; IP adresas ip(192,168,0,201); „EthernetClient“ klientas; BMP085 dps = BMP085(); ilgas Temperatūra = 0, Slėgis = 0; plūdė H, dP, dPt; bool intervalas = tiesa; EasyTransferVirtualWireET; struct SEND_DATA_STRUCTURE( baito ID; // Įrenginio ID int Temperature; // Temperature float Pressure; // Pressure float Humidity; // Humidity float rasos taškas; // Rasos/užšalimo taškas ); SEND_DATA_STRUCTURE transliacija; void setup() ( // Inicijuoti Watchdog laikmatį wdt_disable(); delay(8000); wdt_enable(WDTO_8S); // Inicijuoti konsolę Serial.begin(9600); // Inicijuoti DHT jutiklį dht.begin(); // Inicijuoti 433 MHz modulis ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // Paleiskite tinklą, jei nelaukėme duomenų iš DHCP serverio, tada // patys priskirkite sau adresą, jei (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // Inicijuoti 1-Wire Wire.begin(); delay(200); // Inicijuoti BMP180 su aukščio reguliavimu // dps.init (MODE_STANDARD, 3200, tiesa); // Inicijuoti BMP180 dps.init(); Serial.println(Ethernet.localIP()); // Pirmuosius duomenis išsiųskite iš karto po to, kai įrenginys įjungtas send_info(true ); ) // dewPoint funkcija NOAA // nuoroda (1) : http://wahiduddin.net/calc/density_algorithms.htm // nuoroda (2) : http://www.colorado.edu/geography/weather_station/Geog_site /apie.htm dvigubas rasos taškas(dvigubas celsijaus , dvigubas drėgnumas) ( // (1) Sočiųjų garų slėgis = ESGG(T) double RATIO = 373,15 / (273,15 + celsijaus); dvigubas RHS = -7,90298 * (SANTYKIS - 1); RHS += 5,02808 * log10(SANTYKIS); RHS += -1,3816e-7 * (pow(10, (11,344 * (1 - 1/RATIO))) - 1); RHS += 8,1328e-3 * (pow(10, (-3,49149 * (SANTYKIS - 1))) - 1) ; RHS += log10(1013.246); // koeficientas -3 skirtas reguliuoti vienetus - Garų slėgis SVP * drėgmė dviguba VP = pow(10, RHS - 3) * drėgmė; // (2) RASOS TAŠKAS = F(garų slėgis) double T = log(VP/0,61078); // temp var return (241,88 * T) / (17,558 - T); ) void send_info(bool eth) ( bool fail = true; while(fail) ( // Bandoma nuskaityti duomenis iš DHT drėgmės jutiklio, kol gausime // rezultatą. 90% atvejų viskas veikia gerai, bet reikia 100 % if((H = dht.readHumidity()) >= 0) ( // Gaukite drėgmę ir temperatūrą iš BMP180 jutiklio dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Apskaičiuokite rasos tašką, jei temperatūra lauke viršija 0 laipsnių Celsijaus // ir tikimasi rezultato virš 0, kitu atveju išvestis 0. Tai būtina // kad neklaidintumėte žiemos sezonu. // dP = Temperatūra>0?((dPt=rasos taškas(Temperatūra*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); }

Antena turi būti pridėta prie pačių modulių. Dėl 433 MHz pakanka įprastos varinės vielos 17 cm. Be antenos galite pamiršti įprastą veikimą.

Pereinama prie svarbiausios šio atnaujinimo dalies – vietinės belaidės stoties

Norėdami jį įgyvendinti (ant savo kelio), naudojau analogą Arduino NANO(ant pagrindo ATMega328) Ir TFT rodyti ant lusto ST7735S su leidimu 128x160

Paslėptas tekstas



Pinout ekranas -> valdiklis

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

Imtuvo modulis prijungiamas taip pat, kaip ir siųstuvas, tik DUOMENYS Prisegti D7.

Pora nuotraukų, kaip tai atrodo:

Paslėptas tekstas

Imtuvo eskizas

Paslėptas tekstas

#įtraukti #įtraukti #įtraukti #įtraukti int x, y; int w = 128, h = 160; intsize; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( baito ID; // Įrenginio ID int Temperature; // Temperature float Pressure; // Pressure float Humidity; // Humidity float rasos taškas; // Rasos/užšalimo taškas ); SEND_DATA_STRUCTURE transliacija; int Log_Temperatūra = -1; float Log_Pressure = -1; float Log_Humidity = -1; float Log_dewPoint = -1; // TFT #define cs 10 #define dc 9 #define rst 8 char Temperatūra, slėgis, drėgmė, rasos taškas; Stringinfo; TFT TFTscreen = TFT(cs, dc, pirmas); void setup()( Serial.begin(9600); // Inicijuoti 433MHz modulį ET.begin(details(broadcast)); vw_set_ptt_inverted(true); vw_set_rx_pin(7); vw_setup(2000); vw_rx_start( ir //initial(); pradinė ekrano sąranka TFTscreen.begin(); TFTscreen.setRotation(2); TFTscreen.background(0, 0, 0); // Nubrėžkite statinius elementus // 1. Aplankykite mus TFTscreen.stroke(255, 255, 255); TFTscreen .setTextSize(1); TFTscreen.text(" ", 10, 10); // 2. Jutiklių rodmenų aprašymas TFTscreen.text("mmHg", w/2+5, 80); TFTscreen.text ("% ", w/2+5, 100); TFTscreen.text("C", w/2+5, 120); transliacija. Temperatūra = 0; transliacija. Slėgis = 0; transliacija. Drėgmė = 0; transliacija .rasos taškas = 0; TFTPrint(); ) void loop()( if(ET.receiveData())( if(broadcast.ID == 1) TFTPrint(); /* Serial.println(broadcast.Temperature); Serial. println(broadcast .Slėgis); Serial.println(transliacija.Drėgmė); Serial.println(broadcast.dewPoint); Serial.println(); */ ) ) galiojantys pakeitimai (int dydis, int x, int y, bool up, bool clear = false) ( if(clear) TFTscreen.stroke(0, 0, 0); else ( Changes(dydis, x, y, !up, true); TFTscreen.stroke((up)?0:255, 0, (up)?255:0); ) if((dydis%2) == 0 )dydis++; while(dydis > 0) ( TFTscreen.line(x, y, x+(dydis--), y); ++x, (aukštyn)?--y:++y, --size; ) /* while( dydis > 0) ( TFTscreen.line(x, y, (aukštyn)?x+dydis-1:x, (aukštyn)?y:y+dydis-1); ++x, ++y, --size; ) */ ) int x_center(int w, int ilgis, int size) ( return floor ((w-ilgis*(dydis*5)+dydis*2)/2); ) int x_alignment_right(int w, int ilgis, int dydis) ( return ceil(w-length*(dydis*5)+dydis*2); ) void TFTPrint() ( dydis = 3; // ================= ================================================== = ============== // Ekrano temperatūros rodmenys // ============================= = ================================================= == == if(broadcast.Temperature != Log_Temperature) ( TFTscreen.setTextSize(size); // Perrašyti pasenusius duomenis String info = String(Log_Temperature); info.concat(" C"); if(Log_Temperature > 0) info = " +"+informacija; info.toCharArray(Temperatūra, info.length()+1); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Temperature, x_center(w, info.length()+1 , size) ), 35); // Išvesti naujus rodmenis info = String(transliuoti. temperatūra); info.concat("C"); if(broadcast.Temperature > 0) info = "+"+info; info.toCharArray(Temperatūra, info.ilgis()+1); // Keisti temperatūros reikšmės spalvą priklausomai nuo pačios temperatūros int r, g = 0, b; if(broadcast.Temperature > 0) ( r = žemėlapis(transliacija.Temperatūra, 0, 40, 255, 150); // Raudona b = žemėlapis(transliacija.Temperatūra, 0, 40, 30, 0); // Keisti atspalvį jei norite vizualiai kirsti nulį , 255); // Mėlyna ) TFTscreen.stroke(b, g, r); // DĖMESIO: spalvų pozicijos bibliotekoje keičiamos, RGB vieta naudojama BGR! TFTscreen.text(Temperatūra, x_centras(w, info.length()+1, size), 35); ) dydis = 1; // ================================================ =================================== // Rodomi slėgio rodmenys // ======== = ================================================== ====================== if(broadcast.Pressure != Log_Pressure) ( TFTscreen.setTextSize(size); // Perrašyti pasenusių duomenų informaciją = String(Log_Pressure ); info.toCharArray(slėgis, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(slėgis, x_alignment_right(w/2-5, info.length(), dydis), 80 ); // Išvesti naujus rodmenis info = String(broadcast.Pressure); info.toCharArray(Pressure, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Pressure, x_alignment_right(w/) 2-5, info.length(), dydis), 80); pakeitimai (10, 106, 85, (transliuoti.Slėgis > Log_slėgis)?true:false); ) else ( pakeitimai (10, 106, 85, tiesa, tiesa); pakeitimai (10, 106, 85, klaidingi, teisingi); ) // ============================== = ================================================= = / / Rodyti drėgmės rodmenis // ========================================== === =================================== if(broadcast.Humidity != Log_Humidity) ( TFTscreen.setTextSize( dydis); // Perrašyti pasenusių duomenų info = String(Log_Humidity); info.toCharArray(Drėgmė, info.ilgis()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Drėgmė, x_lyginimas_dešinė(w/2-5, info.length(), dydis), 100); // Išvesti naujus rodmenis info = String(broadcast.Humidity); info.toCharArray(Drėgmė, info.ilgis()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Drėgmė, x_lyginimas_dešinė(w/2-5, info.length(), dydis), 100); pakeitimai(10, 106, 105, (transliacija.Drėgmė > Log_Drėgmė)?true:false); ) else ( pakeitimai(10, 106, 105, tiesa, tiesa); pakeitimai (10, 106, 105, klaidinga, tiesa); ) // ================== ================================================== = ============= // Rodomas rasos taškas\šalnas // =========================== == ================================================ === === if(broadcast.dewPoint! = Log_dewPoint) ( TFTscreen.setTextSize(dydis); // Perrašyti pasenusių duomenų informaciją = String(Log_dewPoint); info.toCharArray(rasos taškas, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text (rasos taškas, x_lyginimo_dešinė(w/2-5, info.length(), dydis), 120); // Rodyti naujus rodmenis info = String(broadcast.dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(255, 255, 255);TFTscreen.text(rasos taškas, x_lyginimas_dešinė(w/2-5, info.length(), dydis), 120);pakeitimai(10, 106, 125, (broadcast.dewPoint > Log_dewPoint)?true:false); ) else ( pakeitimai (10, 106, 125, true, true); pakeitimai (10, 106, 125, false, true); ) // Atnaujinkite reikšmes žurnaluose, kad galėtumėte naudoti vėliau palyginimas Log_Temperature = transliacija.Temperatūra; Log_Pressure = transliacija.Slėgis; Log_Humidity = transliacija.Drėgmė; log_dewPoint = broadcast.dewPoint; )

Rodmenys rodomi gana kompaktiškai, bet kaip rodo praktika (ir mano bendražygių patarimai) – „skonis ir spalva, net žmona ne draugė“. Išklausiau aibę patarimų ir pasiūlymų, bet jie vienas kitam prieštarauja. Taigi darykite tai pagal savo skonį.

Man atrodė, kad dizainas yra ta projekto dalis, kuri užima daugiausiai laiko!

Paslėptas tekstas

Dalis duomenų sukurta tam, kad būtų rodomi kai kurie dizaino elementai.

Ekrane esantys artefaktai yra dulkės ir kiti nešvarumai, susikaupę per ilgą laiką, kai ekranas buvo... kažkur ten... na, nepamenu, iš kur jį gavau! Palik mane vieną!

Eskizas turi padėties nustatymo funkcijas. Jie gana primityvūs, tačiau leidžia pasiekti tam tikrų efektų.

  1. x_centras
  2. x_alignment_right

Pirmasis centruoja tekstą, o antrasis sulygiuoja jį su nurodytos zonos dešine puse. Visi skaičiavimai atliekami atsižvelgiant į pateikto teksto dydį, remiantis išraiška 1 dydis = 1PX x 1PXšrifto segmentas.

Ekrane taip pat rodomi elementai, atitinkantys vienos ar kitos skaitymo reikšmės padidėjimą arba sumažėjimą. Jie rodomi kaip trikampiai. Bet funkcijos kode pokyčius Yra alternatyvus ekranas trikampių pavidalu, pasuktų 45 laipsnių kampu. Jei rodmuo didėja, elementas yra raudonas, o kitu atveju jis yra mėlynas.

Beje, pagrindinės temperatūros spalva ir atspalvis kinta priklausomai nuo pačios temperatūros. Gana prieštaringas sprendimas, bet, mano nuomone, vizualiai patogus. Kurį laiką su tuo kovojau ir supratau, kad funkcijos reikšmės insultas, TFT rodymo objektas, išvardyti neteisinga tvarka. BGR vieta RGB. Tai kūrėjo klaida, arba aš kažko nesuprantu.

PS: Viskas gana įdomu, bet, mano nuomone, verta toliau plėtoti. Ką po kurio laiko padarysime.



Dalintis