Stacioni i motit në Arduino. Stacioni i brendshëm i motit në Arduino Qarqet e stacionit të motit në Arduino uno

Doja të kisha stacionin tim të motit, i cili transmeton lexime nga sensorët në hartën e monitorimit të njerëzve (kërkimi në Google kërkon 5 sekonda). Doli të ishte jo aq e vështirë sa duket. Mendoni se çfarë është bërë.

Për këtë veprim, mora një Arduino Uno dhe një Ethernet Shield w5100 për të. E gjithë kjo është porositur nga Kina në Aliexpress.

Unë gjithashtu porosita sensorë atje: DHT22, DHT11, DS18B20, BMP280 (sensorët e gazit, tymit janë planifikuar gjithashtu ...)

Duke pasur forume të tymosur, Google, Yandex, gjeta një version të mirë të skicës - https://student-proger.ru/2014/11/meteostanciya-2-1/

Në të njëjtin vend, në komente, një person postoi një skicë të plotësuar me sensorë të dritës dhe gazit. I mora si bazë.

Në ato skica nuk kishte mbështetje për sensorin e presionit të 280-të, biseduam me autorin, ai e zëvendësoi 180 me 280. Gjithçka funksionoi mirë (faleminderit shumë për këtë)

Më poshtë është një shembull i skicës përfundimtare që kam marrë.

Për momentin kam sensorë të lidhur:
DHT22 - 1 copë.
DHT11 - 1 copë.
BMP280 - 1 copë.
DS18B20 - 2 copë.

KUJDES! Para se të ngarkoni skicën, mos harroni të ndryshoni adresën MAC të pajisjes në mënyrë që të mos mbivendoseni me të tjerët (për shembull, merrni adresën Mac të telefonit tuaj celular dhe ndryshoni shkronjat / numrat e fundit në të, të cilat nuk do të " shqetësoni" rrjetin tuaj lokal!

Diagrami i përafërt i lidhjes (foto e marrë në internet nga kjo skicë):

Për arsye teknike, nuk mund ta postoj skicën këtu. E futa në arkiv. Lidhja për të është më lart.

Siç mund ta shihni, ka lexime, ato po funksionojnë siç duhet, për shembull, unë do të postoj disa pamje nga sensorët e mi:

Në kohën time të lirë, dhe këtë herë kam shkruar udhëzime për të bërë një stacion të vogël meteorologjik. Ajo do të funksionojë si një orë me një datë dhe do të tregojë temperaturat brenda dhe jashtë dhomës. Ne do të përdorim një Arduino UNO si kontrolluesin kryesor, por një tjetër bord me një Atmega328p në bord do ta bëjë këtë. Për shfaqje, ne përdorim ekranin grafik WG12864B. Ne gjithashtu do të lidhim dy sensorë të temperaturës ds18b20. Njëra është brenda, tjetra është nxjerrë jashtë. Le të fillojmë.

Në procesin e prodhimit të produkteve shtëpiake, na duhen:

Arduino UNO (ose ndonjë bord tjetër i pajtueshëm me Arduino)
- Ekran grafik WG12864B
- Sensori i temperaturës ds18b20, 2 copë
- Furnizimi me energji elektrike 6 - 12 V
- Rezistenca 4,7 Kom 0,25 W, 2 copë.
- Rezistenca 100 ohm 0,25 W
- Ndarja e baterive për 4 bateri AAA "little gisht".
- Kuti nga fisheku i konsolës SEGA
- Shirit izolues
- Lidhja e telave
- Pllaka qarkore
- Butonat
- Thikë shkrimi
- Makine per ngjitjen e metalit
- Saldim, kolofon
- Shirit me dy anë

Hapi 1 Përgatitni WG12864B3.
Ata që nuk kanë punuar më parë me ekrane mund të frikësohen nga numri i madh i modifikimeve të ekraneve në dukje identike. Unë do të shpjegoj pak. Shumica e ekraneve të këtij lloji punojnë në çipa ks0107/ks0108. Të gjitha ekranet mund të ndahen në 4 lloje:

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

Option B: HDM64GS12L-5, Lumex LCM-S12864GSF, Futurlec BLUE128X64LCD, AZ Displays AGM1264F, Displaytech 64128A BC, Adafruit GLCD, DataVision DG12864-88, Topway LM12864LDW, Digitron SG12864J4, QY-12864F, TM12864J4, QY-12864F, TM12864F

Opsioni C: Shenzhen Jinghua Displays Co Ltd. JM12864

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

Ata duken pothuajse njësoj. Por kunjat e lidhjes janë të ndryshme. Zgjodha dhe ju rekomandoj WG12864B3 V2.0, por nëse ekrani erdhi në një tjetër, ose thjesht nuk e keni në dorë, mund ta kuptoni lehtësisht duke përdorur tabelën:

Specifikime të shkurtra:

Ka shumë skema të ndryshme lidhjesh në internet dhe gjithçka duket se funksionon. Puna është se nuk ka vetëm ekrane të ndryshëm, por edhe dy mënyra për t'i lidhur ato: serial dhe paralel. Kur përdorim një lidhje me portën serike, na duhen vetëm 3 dalje të mikrokontrolluesit. Me një minimum paralel prej 13. Zgjedhja në këtë rast është e dukshme, Arduino gjithsesi nuk ka shumë përfundime. Për lidhjen paralele, diagrami i lidhjes është si më poshtë:

Për një lidhje serike, të cilën do të përdorim, skema është si më poshtë:

WG12864B - Arduino UNO 1 (GND) - GND 2 (VCC) - +5V 4 (RS) - 10 5 (R/W) - 11 6 (E) - 13 15 (PSB) - GND 19 (BLA) - nëpërmjet rezistencës 100 Ohm - +5V 20 (BLK) - GND

Për të rregulluar kontrastin, një potenciometër duhet të jetë në ekran. Ka ekrane pa të, por kjo tani është e rrallë:

Nevojitet një rezistencë 100 ohm në mënyrë që një tension prej 5 volt të mos djegë aksidentalisht diodat e dritës së prapme.

Hapi 2 Krijimi i rastit.
Për rastin, merrni kutinë nga fisheku i set-top box-it Sega. Nëse nuk e gjeni këtë kuti pranë, mund të përdorni një kasë tjetër. Gjëja kryesore është që ekrani dhe Arduino përshtaten në të.

Prisni filmin transparent në majë të kutisë, në mënyrë që të mos mbeten copa:

Më pas, duke përdorur një thikë klerikale, prisni një dritare 37x69 për ekranin.

Në anën e pasme, përgjatë skajit të prerjes, ngjitim shirit të dyanshëm, mundësisht të zi:

Ne heqim letrën mbrojtëse nga shiriti ngjitës dhe ngjisim ekranin tonë mbi të:

Nga jashtë duhet të duket kështu:

Poshtë ekranit, gjithashtu në shirit të dyanshëm, ne montojmë Arduino, pasi kemi bërë më parë prerje për portën USB dhe prizën e rrymës:

Prerjet për prizat Arduino duhet të bëhen në të dy anët e kutisë në mënyrë që ajo të mbyllet lirshëm:

Hapi 3 Sensorët e temperaturës.
Ne do të përdorim sensorë dixhital të temperaturës DS18B20. Duke i përdorur ato, marrim saktësi më të madhe të matjes, një gabim jo më shumë se 0,5 °C, në një gamë të gjerë temperaturash prej -55 ... + 125 °C. Për më tepër, sensori është dixhital dhe i kryen vetë të gjitha llogaritjet, dhe Arduino thjesht merr lexime të gatshme. Kur lidhni këtë sensor, mos harroni për rezistencën tërheqëse 4,7 KΩ midis kunjave DQ dhe VDD. Disa opsione lidhjeje janë gjithashtu të mundshme. Me fuqi të jashtme, për mendimin tim opsioni më i mirë, ne do ta përdorim atë:

Me çdo opsion të furnizimit me energji elektrike, sensorët janë të lidhur paralelisht:

Ne do të vendosim sensorin e temperaturës së brendshme në një tabelë të vogël së bashku me dy butona që do t'i përdorim për të vendosur orën dhe datën e orës:

Ne lidhim telin e përbashkët nga të dy butonat në GND, lidhim telin nga butoni i parë në A0, nga i dyti në A1.
Ne e rregullojmë atë në shirit të dyanshëm pranë Arduino:

Sensori, i cili supozohet të vendoset jashtë dhomës, është më mirë të zgjidhet në një strehë metalike, të mbrojtur nga pluhuri:

Llogaritni telin e gjatësisë së kërkuar në mënyrë që të mund ta varni sensorin jashtë dritares, gjëja kryesore është që të mos jetë më shumë se 5 metra, nëse keni nevojë për një gjatësi më të gjatë, do t'ju duhet të zvogëloni vlerën e tërheqjes- rezistencë lart.

Ne e lidhim telin nga autobusi i të dhënave DQ të të dy sensorëve me pinin 5 të Arduino.
Vdd - +5 Arduino.
GND - GND Arduino.

Hapi 4 Ushqyerja.
Për energji, mund të përdorni një furnizim me energji elektrike me një tension prej 6 deri në 12 volt. Në fund të telit të ndezjes së energjisë, lidhni një prizë që i përshtatet prizës së energjisë Arduino:

Ose mund të vendosni një ndarje baterie për katër bateri "AAA", "gishti i vogël" në kasë. Dhe lidhni telin pozitiv nga gjiri në Vin Arduino, dhe telin negativ me GND.

Hapi 5 Përgatitni mjedisin e programimit.
Së pari ju duhet të shkarkoni dhe instaloni Arduino IDE nga faqja zyrtare e internetit

Dhe gjithashtu shtoni në dy bibliotekat e nevojshme për skicën. OneWire - kërkohet për komunikim me sensorë ds18b20:

U8glib - përdoret për të shfaqur informacionin në ekran:

Shkarkimi i bibliotekave. Pastaj ne shpaketojmë arkivat dhe zhvendosim përmbajtjen e arkivave në dosjen "bibliotekat", e vendosur në dosjen me Arduino IDE të instaluar. Ju gjithashtu mund të shtoni biblioteka përmes Arduino IDE. Për ta bërë këtë, pa shpaketuar arkivat, ekzekutoni Arduino IDE, zgjidhni Sketch - Connect Library nga menyja. Në krye të listës rënëse, zgjidhni artikullin "Shto Bibliotekën Zip". Specifikoni vendndodhjen e arkivave të shkarkuar. Pas të gjitha hapave, duhet të rinisni Arduino IDE.

Hapi 6 Redaktimi i skicës.
Sensorët e temperaturës punojnë duke përdorur protokollin One Wire dhe kanë një adresë unike për secilën pajisje - një kod 64-bit. Nuk këshillohet të shtoni komanda për të kërkuar sensorë në skicë. Nuk ka nevojë të ngarkoni Arduino çdo herë për sensorët e lemzës. Prandaj, së pari, pasi kemi mbledhur gjithçka së bashku, plotësojmë skicën Arduino, të vendosur në menunë Skedar - Shembuj - Temperatura e Dallas - OneWireSearch. Më pas nisim Tools - Port Monitor. Arduino duhet të gjejë sensorët tanë, të shkruajë adresat dhe leximet e temperaturës. Këto adresa duhet të shkruhen ose thjesht të kopjohen diku. Tani hapni skicën Ard_Tic_Tak_WG12864B_2_x_Term_Serial dhe kërkoni rreshtat:

Byte addr1=(0x28, 0xFF, 0x75, 0x4E, 0x87, 0x16, 0x5, 0x63);// adresa e bajtit të brendshëm addr2=(0x28, 0xFF, 0xDD, 0x14, 0xB4, 0x5, 0x1, sensor);

Ne zëvendësojmë adresat e sensorëve që korrespondojnë me vendndodhjen me adresat tona.
Ora jonë nuk përdor modulin RTC (orë në kohë reale), ndaj është e nevojshme të korrigjohet ora. Për lehtësi, hiqni komentin e rreshtit (sekonda do të shfaqen në ekran):

//u8g.setPrintPos(44, 50); u8g.print(sek); // Nxjerr sekonda për të kontrolluar korrektësinë e lëvizjes

Vendosni kohën e duhur duke përdorur monitorin e portit. Për ta bërë këtë, hapni monitorin e portit, prisni që matjet fillestare të temperaturës të përfundojnë dhe futni datën dhe orën aktuale në formatin "ditë, muaj, vit, orë, minuta, sekonda". Nuk ka hapësira, numrat ndahen me presje ose pika.

Nëse ora është me nxitim, ndryshoni vlerën në një më të madhe, unë rekomandoj të eksperimentoni me një hap prej 100 njësive. Nëse mbetet prapa, duhet të ulet vlera në rresht:

Nëse (micros() - prevmicros >494000) ( // ndryshoni në diçka tjetër për të rregulluar ishte 500000

Në mënyrë empirike, ne përcaktojmë numrin në të cilin ora funksionon me saktësi mjaftueshëm. Për të përcaktuar saktësinë e lëvizjes, ju nevojitet prodhimi i sekondave. Pas kalibrimit të saktë të numrit, sekondat mund të komentohen dhe kështu të hiqen nga ekrani.
Ngarkimi i skicës.

Disi, duke ecur nëpër qytet, pashë një dyqan të ri elektronik radioje që ishte hapur. Duke hyrë në të, gjeta një numër të madh mburojash për Arduino. Kisha një Arduino Uno dhe një Arduino Nano në shtëpi dhe menjëherë më lindi ideja të luaja me transmetuesit e sinjalit nga distanca. Vendosa të blej transmetuesin dhe marrësin më të lirë në 433 MHz:

Transmetuesi i sinjalit.


marrës sinjalesh.

Pasi regjistroi skicën më të thjeshtë të transmetimit të të dhënave (një shembull është marrë nga këtu), doli që pajisjet transmetuese mund të jenë mjaft të përshtatshme për transmetimin e të dhënave të thjeshta, siç janë temperatura, lagështia.

Transmetuesi ka karakteristikat e mëposhtme:
1. Modeli: MX-FS-03V
2. Rrezja e veprimit (varet nga prania e objekteve bllokuese): 20-200 metra
3. Tensioni i punës: 3.5 -12V
4. Dimensionet e modulit: 19*19mm
5. Modulimi i sinjalit: AM
6. Fuqia e transmetuesit: 10mW
7. Frekuenca: 433 MHz
8. Gjatësia e kërkuar e antenës së jashtme: 25cm
9. Lehtë për t'u lidhur (vetëm tre tela): DATA ; KQV ; Toka.

Karakteristikat e modulit të marrjes:
1. Tensioni i punës: DC 5V
2. Rryma: 4mA
3. Frekuenca e punës: 433.92MHz
4. Ndjeshmëria: - 105dB
5. Dimensionet e modulit: 30*14*7mm
6. Kërkohet antenë e jashtme: 32 cm.

Në pafundësinë e internetit thuhet se diapazoni i transmetimit të informacionit në 2Kb/s mund të arrijë deri në 150 m. Unë nuk e kontrollova vetë, por në një apartament me dy dhoma pranon kudo.

Pajisjet e stacionit të motit në shtëpi

Pas disa eksperimenteve, vendosa të lidh një sensor të temperaturës, lagështisë dhe një transmetues me Arduino Nano.


Sensori i temperaturës DS18D20 është i lidhur me arduino si më poshtë:

1) GND në minus të mikrokontrolluesit.
2) DQ përmes një rezistence tërheqëse në tokë dhe në pinin D2 të Arduino
3) Vdd në +5V.

Moduli i transmetuesit MX -FS - 03V mundësohet nga 5 Volt, dalja e të dhënave (ADATA) është e lidhur me pinin D13.

Kam lidhur një ekran LCD dhe një barometër BMP085 me Arduino Uno.


Diagrami i lidhjeve për arduino uno

Marrësi i sinjalit është i lidhur me pinin D10.

Moduli BMP085 është një sensor dixhital i presionit atmosferik. Sensori ju lejon të matni temperaturën, presionin dhe lartësinë. Ndërfaqja e lidhjes: I2C. Tensioni i furnizimit të sensorit 1.8-3.6 V

Moduli është i lidhur me Arduino në të njëjtën mënyrë si pajisjet e tjera I2C:

  • KQV - KQV (3.3V);
  • GND-GND;
  • SCL - në pinin analog 5;
  • SDA - në pinin analog 4.
  • Kosto shumë e ulët
  • Fuqia dhe I/O 3-5V
  • Përcaktimi i lagështisë 20-80% me saktësi 5%.
  • Përcaktimi i temperaturës 0-50 gradë. me saktësi 2%.
  • Frekuenca e votimit jo më shumë se 1 Hz (jo më shumë se një herë në 1 sekondë.)
  • Dimensionet 15.5mm x 12mm x 5.5mm
  • 4 kunja me hapësirë ​​0,1" të këmbëve

DHT ka 4 kunja:

  1. Vcc (furnizimi 3-5V)
  2. Dalja e të dhënave - Dalja e të dhënave
  3. I pa perdorur
  4. Gjeneral

Lidhet me D8 Arduino.

Softueri i stacionit të motit në shtëpi

Moduli i transmetuesit mat dhe transmeton temperaturën çdo 10 minuta.

Më poshtë është programi:

/* Sketch version 1.0 Dërgo temperaturën çdo 10 min. */ #include #include #include #define ONE_WIRE_BUS 2 //Pin për lidhjen e sensorit të Dallas OneWire oneWire(ONE_WIRE_BUS); Sensorët e temperaturës në Dallas (&oneWire); Adresa e pajisjes brenda Termometrit; konfigurimi i zbrazët (void) ( //Serial.begin(9600); vw_set_ptt_inverted(true); // Kërkohet për DR3100 vw_setup(2000); // Cakto sensorët e shpejtësisë së zhurmës (bps).begin(); nëse (!sensorët .getAddress (Termometri i brendshëm, 0)); Adresa e printimit (Termometri i brendshëm); sensorë.setRezolucioni (Termometri i brendshëm, 9); ) Temperatura e printimit të pavlefshme(Adresa e pajisjes së Adresës) (float tempC = sensors.getTempC(Adresa e pajisjes); //Serial.print("Temp C:" ); //Serial.println(tempC); //Formimi i të dhënave për dërgimin e numrit int = tempC; simboli char = "c"; //Simboli i shërbimit për përcaktimin se ky është një sensor String strMsg = "z "; strMsg + = simbol; strMsg += " "; strMsg += numër; strMsg += " "; mesazh char; strMsg.toCharArray(msg, 255); vw_send ((uint8_t *)msg, strlen(msg)); vw_prit_tx(); / / Prisni që transferimi të përfundojë vonesa (200); ) void loop (void) ( për (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); } }

Pajisja marrëse merr të dhëna, mat presionin dhe temperaturën në dhomë dhe i transmeton ato në ekran.

#include #include LCD Crystal Liquid(12, 10, 5, 4, 3, 2); #përfshi sensorin dht11; #define DHT11PIN 8 #include #include BMP085 dps = BMP085(); gjatë Temperatura = 0, Presioni = 0, Lartësia = 0; void setup() ( Serial.begin(9600); vw_set_ptt_inverted(true); // Kërkohet për DR3100 vw_setup(2000); // Cakto shkallën e pranimit vw_rx_start(); // Nis monitorimin e ajrit lcd.begin(16, 2); Wire.begin(); vonesë(1000); dps.init(); //lcd.setCursor(14,0); //lcd.write(byte(0)); //lcd.home(); ) i pavlefshëm loop() ( uint8_t buf; // Buferi i mesazheve uint8_t buflen = VW_MAX_MESSAGE_LEN; // Gjatësia e buferit nëse (vw_get_message(buf, &buflen)) // Nëse merret një mesazh ( // Filloni analizimin int i; // Nëse mesazhi është nuk na drejtohet neve, dilni nëse (buf != "z") (kthim; ) komanda char = buf; // Komanda është në indeksin 2 // Parametri numerik fillon në indeksin 4 i = 4; numri int = 0; // Meqenëse transferimi bëhet karakter për karakter , atëherë ju duhet të konvertoni grupin e karaktereve në një numër ndërsa (buf[i] != " ") (numri *= 10; numri += buf[i] - "0"; i++; ) dps.getPressure(&Pressure); dps.getAltitude (&Lartësia); dps.getTemperature(&Temperaturë); //Serial.print(komandë); Serial.print(" "); Println serike (numri); lcd.print("T="); lcd.setCursor(2,0); printim LCD (numri); lcd.setCursor(5,0); lcd.print("P="); lcd.print(Presion/133.3); lcd.print("mmH"); lcd.setCursor(0,1); lcd.print("T="); lcd.print(Temperatura*0.1); lcd.print("H="); LCD.print(sensor.lagështia); LCD.home(); //vonesa (2000); int chk = sensor.lexo(DHT11PIN); ndërprerësi (chk) (rasti DHTLIB_OK: //Serial.println("OK"); pushim; rasti DHTLIB_ERROR_CHECKSUM: //Serial.println("Gabim i shumës së kontrollit"); ndërprerje; rasti DHTLIB_ERROR_TIMEOUT: //Serial.println("Përfundoi koha gabim"); pushim; parazgjedhje: //Serial.println("Gabim i panjohur"); pushim; ) ) )

P.S. Në të ardhmen, unë planifikoj të shtoj sa vijon:
- Sensori i lagështisë në transmetues, ripërpunoni algoritmin e transmetimit të të dhënave
- sensor për matjen e shpejtësisë dhe drejtimit të erës.
- shtoni një tjetër ekran te marrësi.
- transferoni marrësin dhe transmetuesin në një mikrokontrollues të veçantë.

Më poshtë keni një foto të asaj që ndodhi:

Lista e elementeve të radios

Emërtimi Lloji i Emërtimi sasi shënimRezultatiblloku im i shënimeve
pjesë transmetuese.
Pllaka Arduino

Arduino Nano 3.0

1 Në bllokun e shënimeve
sensor temperature

DS18B20

1 Në bllokun e shënimeve
Rezistencë

220 ohm

1 Në bllokun e shënimeve
moduli i transmetuesitMX-FS-03V (433 MHz)1 Në bllokun e shënimeve
pjesë marrëse e radios.
Pllaka Arduino

Arduino Uno

1 Në bllokun e shënimeve
Rezistencë prerëse 1 Në bllokun e shënimeve
Rezistencë


“Pra, le të biem dakord menjëherë: ju nuk do të bëni një film për Hollywood. Edhe në Botën e Çudirave, jo më shumë se pesë për qind e të gjithë skenarëve miratohen, dhe vetëm një për qind më pas shkon në prodhim... Pra, në vend të gjithë kësaj, ju do të krijoni Hollywood-in tuaj.”
Ed Gaskel "Xhirimi i kinemasë dixhitale, ose Hollywood në shtëpi"

Parathënie

Çfarë, një tjetër stacion meteorologjik Arduino?! Po, edhe një dhe, diçka më thotë, jo e fundit në Internetin e gjërave.


Ashtu si çdo programues kërkohet të shkruajë një program "Hello World!", ashtu edhe çdo arduinian duhet të ketë përvojë në ndërtimin e një stacioni të thjeshtë ose jo shumë të motit.
Përshkruhen një numër i konsiderueshëm i projekteve tashmë të krijuara të stacioneve të motit në internet, lexuesi mund të zgjedhë cilindo prej tyre për zbatim. Sinqerisht, kam studiuar me kujdes rreth një duzinë projekte të ngjashme dhe një bandë të lidhura. Ndaj nuk mund të thuhet se gjithçka e kam krijuar nga e para, sigurisht që kam “qëndruar mbi supet e gjigantëve”.


Duhet të them menjëherë se planet e mia nuk përfshinin përdorimin e shërbimeve të palëve të treta për ruajtjen dhe shfaqjen e të dhënave. Doja të ndjeja personalisht dhe të kuptoja se si funksionon gjithçka nga brenda nga fillimi në fund, nga A në Z.


Pra, për ata që duan të nxjerrin shpejt diçka nga asgjëja, kjo seri artikujsh ka shumë të ngjarë të mos jetë e përshtatshme. Është më e lehtë të shkosh dhe të blesh një komplet të gatshëm me udhëzime montimi. Profesionistët e mikroelektronikës nuk kanë absolutisht asgjë për të bërë këtu, ndoshta duke qarë dhe kujtuar veten në fillim të udhëtimit.
Por për ata që duan vërtet të kuptojnë, mendoj se do t'u pëlqejë. Ndoshta materiali do të jetë i dobishëm si një mjet mësimor.



Ky projekt u zbatua në vitin 2016, por shpresoj se është ende relevant.

Komplet teknologjik

Ne do të studiojmë dhe punojmë me gjëra të thjeshta dhe komplekse:

  • sensorë të temperaturës dhe lagështisë së tipit DHT22, DHT11
  • Sensori i presionit barometrik i tipit BMP180
  • Moduli WiFi ESP8266
  • moduli radio i tipit nRF24 2.4 GHz
  • familja Arduino Pro Mini, Arduino Mega
  • panele diellore dhe bateri
  • gjuhë programimi C/C++
  • Gjuha e programimit PHP
  • Sistemi i menaxhimit të bazës së të dhënave MySQL
  • gjuhën e programimit Java dhe kornizën Android (krijimi i një aplikacioni për Adnroid për të shfaqur të dhënat e motit në një smartphone).

Disa nga temat e listuara nuk ia vlejnë aspak dhe disa mund të studiohen me vite. Prandaj, ne do të prekim gjëra komplekse vetëm në pjesën që lidhet drejtpërdrejt me këtë projekt, në mënyrë që të kuptoni se si funksionon gjithçka.


Por do ta fillojmë që nga fillimi drejtë. Gjegjësisht, nga përshkrimi dhe dizajni i pajisjes së ardhshme "në letër" në mënyrë që në fund çdo tullë të shtrihej në vendin e saj.

prototipizim

Siç na thotë saktë Wikipedia, prototipizimështë një projekt-zbatim i shpejtë i një sistemi pune. E cila, po, nuk do të funksionojë plotësisht në mënyrë joefikase dhe me disa gabime, por do të japë një ide nëse zanati duhet të zhvillohet në një dizajn industrial. Procesi i krijimit të një prototipi nuk duhet të jetë i gjatë. Faza e prototipit pasohet nga analiza e sistemit dhe rafinimi i tij.


Por kjo është në një industri ku punëtorët janë të punësuar me kohë të plotë.


Të gjithë ata që i përdorin zanatet e tyre për "internetin e gjërave" në mbrëmje, duhet të jenë të vetëdijshëm se po krijojnë një prototip, një produkt gjysëm të gatshëm. Është shumë larg nivelit të një produkti industrial normal. Kjo është arsyeja pse ju nuk duhet t'i besoni zanateve tona amatore asnjë zonë kritike të mbështetjes së jetës dhe shpresoj që të mos na lëshojnë.


Një produkt industrial ndërtohet mbi një bazë elementi industrial dhe më pas kalon nëpër shumë faza të tjera, duke përfshirë korrigjimin, testimin dhe mirëmbajtjen, përpara se të bëhet bestseller.


Pra, në vend të gjithë kësaj lodhjeje, ne do të krijojmë lodrën tonë, por jo të thjeshtë. Me elemente të krijimtarisë teknike, fillimet e programimit dhe njohja (në procesin e krijimit) e shumë gjërave të tjera të lidhura.


Sigurisht, inxhinierët elektronikë do të kenë një kohë të vështirë në fazën e programimit dhe programuesit do të duhet të djersiten mbi qarkun, por autori do të përpiqet të tregojë gjithçka sa më të arritshme dhe të përshkruajë qartë pse u përdorën zgjidhje të caktuara.

Kërkesat

Zakonisht ky hap anashkalohet. Të vendosësh të bësh diçka të tillë pikërisht tani, dhe më pas të dalin detaje të vogla që e vendosin të gjithë projektin në një rrugë pa krye ose madje e bëjnë të padurueshëm. E gjithë lista jonë e dëshirave duhet të regjistrohet, unë përdor Google Drive për këtë, është e disponueshme nga një kompjuter dhe nga një pajisje celulare.


Pra, stacioni ynë i motit duhet:

  • matni temperaturën dhe lagështinë jashtë
  • matni temperaturën dhe lagështinë në shtëpi
  • matja e presionit atmosferik
  • shfaqni vlerat e treguara në ekran
  • transferoni të dhënat në një server në internet, ku të dhënat do të ruhen në një bazë të dhënash dhe do të shfaqen në një faqe interneti, ose do të përdoren në një aplikacion celular.

Sensorët përdoren më të thjeshtë dhe më të lirë. Për shembull, duke parë përpara, do të them se DHT22 mat temperaturën mjaft saktë, por është paksa e pasaktë me lagështinë. Por, përsëri, e përsëris, nuk ka rëndësi, sepse ne kemi një prototip përpara, dhe një shpërndarje prej 5% lagështirë nuk do të ndikojë në asgjë të rëndësishme në jetën tonë.


Arkitektura e sistemit, hardueri dhe softueri duhet të lejojnë që sistemi të zgjerohet më tej për të shtuar sensorë të rinj dhe aftësi të reja.

Hekuri. Përzgjedhja e komponentëve

Kjo është pjesa më e rëndësishme, dhe jo bashkimi apo programimi fare. Pas përcaktimit të kërkesave për sistemin, është e nevojshme të vendosni se çfarë saktësisht do të zbatohen.


Këtu ka një nuancë. Për të zgjedhur komponentët, duhet të njihni mirë aftësitë e tyre, duhet të njihni vetë teknologjitë. Kjo do të thotë, me fjalë të tjera, këtu duhet të jeni larg një inxhinieri dhe programuesi fillestar elektronik. Pra, çfarë të shpenzoni tani për disa vjet duke studiuar të gjithë gamën e pajisjeve të mundshme?


Rreth vicioz? Por qarqet vicioze ekzistojnë për t'i thyer ato.


Ka një dalje. Ju thjesht mund të merrni dhe përsërisni projektin e dikujt. Kam studiuar projektet tashmë ekzistuese të stacioneve të motit dhe shpresoj të kem bërë një hap përpara.


Kështu që. Arkitektura e stacionit të motit bazohet në Arduino. Sepse Arduino ka një prag të vogël hyrjeje dhe unë tashmë jam marrë me këtë. Atëherë është më e lehtë të zgjedhësh.


Menjëherë u bë e qartë se stacioni i motit do të përfshinte një sensor të largët, jashtë dritares dhe një modul qendror.


Njësia qendrore, kryesore do të jetë e vendosur brenda. Është e rëndësishme të përcaktohet kjo në fazën fillestare; karakteristika të tilla të rëndësishme si regjimi i temperaturës së funksionimit dhe "vallet" e fuqisë nga kjo.


Sensori i largët (ose sensorët) do të jetë pa "tru", detyra e tij është të marrë periodikisht matje dhe të transmetojë të dhëna në njësinë qendrore të shtëpisë. Njësia qendrore merr të dhëna nga të gjithë sensorët, i shfaq ato në ekran dhe i dërgon në internet në bazën e të dhënave. Epo, tashmë është shumë më e lehtë atje, sapo të dhënat janë në bazën e të dhënave, mund të bëni çfarë të doni me to, madje edhe të vizatoni grafikë.


Për komunikim me botën e jashtme, Interneti u zgjodh pa mëdyshje nga moduli WiFi ESP8266 pa pothuajse asnjë alternativë (vini re, ndoshta tani janë shfaqur alternativa të tilla). Pllakat e zgjerimit të Ethernet janë të disponueshme për Arduino, por unë nuk doja të lidhesha fare me një kabllo.



Një pyetje interesante ishte se si të sigurohet komunikimi midis sensorit të jashtëm (ose sensorëve, mbani mend kërkesën për zgjerimin e sistemit?) dhe qendrës. Fenerët e radios 433 MHz definitivisht nuk janë të përshtatshëm (ata nuk janë fare të përshtatshëm për asgjë).


Të përdoret përsëri ESP8266?


Disavantazhet e kësaj zgjidhjeje:

    Kërkon WiFi të qëndrueshme jashtë shtëpisë

    diapazoni i komunikimit nuk do të jetë i madh

    besueshmëria do të vuajë, nëse interneti dështon, ne nuk do t'i shohim sensorët tanë në distancë

    më shumë konsum të energjisë.

    Konsumi i energjisë ESP8266:

    kur transmeton 120-170 mA

    kur merr 50-56 mA

    në modalitetin e gjumit të thellë 10 µA (µA)

    gjendje joaktive 5 µA (µA).

Në fund, për të lidhur sensorët e largët me njësinë kryesore të shtëpisë, u zgjodh çipi nRF24L01 + me një transmetues dhe marrës 2.4 GHz në një shishe, me një antenë të jashtme shtesë, për të "thyer" me siguri muret.



Konsumi i energjisë nRF24L01+ 2.4 GHz:

  • kur merr 11 mA
  • kur transmetoni me një shpejtësi prej 2 Mbps - 13 mA
  • në modalitetin gatishmëri-I - 26 μA (μA)
  • gjendje joaktive 900 nA (nA).

Të dy ESP8266 dhe nRF24L01+ kanë një gamë të përshtatshme të temperaturës së funksionimit: nga -40℃ në +80℃.


Mund ta blini nRF24L01+ për rreth 1 dollarë, ose me një antenë të jashtme për 3 dollarë. Mund të blini ESP8266-01 për rreth 4 dollarë. Lexoni me kujdes përshkrimin e produktit! Përndryshe, blini një antenë.


Thelbi i sistemit u shfaq. Le të kalojmë te vetë sensorët.


Në rrugë, siç e dini, temperatura mund të arrijë vlera negative, kështu që sensori DHT11 nuk është i përshtatshëm, por DHT22 është i duhuri.



Specifikimet e DHT22 / AM2302:

  • Furnizimi 3.3V deri në 5V, rekomandohet 5V
  • konsumi maksimal 2.5 mA, në momentin e matjes dhe transferimit të të dhënave
  • diapazoni i matjes së lagështisë 0-100% me një gabim 2-5%
  • diapazoni i matjes së temperaturës nga -40 në +125°C me një gabim prej ±0,5°C
  • kërkesa për matje jo më shumë se 0,5 Hz - një herë në 2 sekonda.

Brenda shtëpisë, shpresoj të mos ketë temperatura negative, kështu që mund të përdorni DHT11, veçanërisht pasi unë e kisha tashmë.


Karakteristikat e DHT11:

  • Furnizimi 3.3 V deri në 5 V
  • konsumi maksimal 2.5 mA, në momentin e matjes dhe transferimit të të dhënave
  • diapazoni i matjes së lagështisë 20-80% me një gabim prej 5%
  • diapazoni i matjes së temperaturës nga 0 në +50°C me një gabim prej ±2°C
  • kërkesa për matje jo më shumë se 1 Hz - një herë në sekondë.

Mund të blini DHT22 për rreth 3 dollarë. DHT11 kushton më pak - 1 dollarë, por është gjithashtu më pak i saktë.


Tani kthehu përsëri te Arduino. Cilin bord të zgjidhni?


Kam testuar pjesë individuale të sistemit në Arduino UNO. Ato. E lidha modulin ESP me uno dhe e studiova, e fika, më pas lidha nRF24, etj. Për zbatimin përfundimtar të sensorit të dritares, zgjodha Arduino Pro Mini si miniaturën më të afërt me Uno.



Për sa i përket konsumit të energjisë, Arduino Pro Mini gjithashtu duket i mirë:

  • nuk ka asnjë konvertues USB-TTL, i cili vetë "ha" shumë,
  • LED është i lidhur përmes një rezistence 10k.

Për ruajtjen e avancuar të energjisë, ishte planifikuar:

  • hiqni LED - treguesin e energjisë në Arduino Pro Mini (u pendova që nuk e prisha tabelën)
  • ose përdorni një asamble "të zhveshur" në një mikroprocesor Atmel ATmega328 (nuk e përdori atë)
  • përdorni Bibliotekën me fuqi të ulët ose JeeLib.

Nga bibliotekat që zgjodha Low Power Library, është e thjeshtë dhe përmban vetëm atë që ju nevojitet.


Për njësinë qendrore, meqenëse ishte planifikuar të lidheshin me të shumë pajisje periferike, u zgjodh bordi Arduino Mega. Përveç kësaj, është plotësisht i pajtueshëm me UNO dhe ka më shumë memorie. Duke parë përpara, do të them se kjo zgjedhje ishte plotësisht e justifikuar.


Ju mund të blini Arduino Mega për rreth 8 dollarë.

Fuqia dhe konsumi i energjisë

Tani për ushqimin dhe konsumin e energjisë.


Ekzistojnë dy lloje të Arduino Pro Mini:

  • për tensionin e furnizimit 5V dhe frekuencën 16MHz
  • për një tension furnizimi prej 3.3 V dhe një frekuencë prej 8 MHz.

Meqenëse moduli i radios nRF24L01+ kërkon 3.3V për furnizim me energji elektrike dhe shpejtësia nuk është e rëndësishme këtu, blini një Arduino Pro Mini në 8MHz dhe 3.3V.


Në këtë rast, diapazoni i tensionit të furnizimit të Arduino Pro Mini është:

  • 3.35-12V për modelin 3.3V
  • 5-12V për modelin 5V.

Unë tashmë kisha një Arduino Pro Mini 5V, prandaj e përdora atë. Mund të blini një Arduino Pro Mini për rreth 4 dollarë.


Furnizimi me energji i njësisë qendrore do të jetë nga rrjeti 220 V përmes një njësie të vogël furnizimi me energji elektrike, duke dhënë një dalje 12V, 450mA, 5W. Diçka e tillë për 5 dollarë. Ekziston edhe një dalje e veçantë për 5V.



Dhe nëse kjo nuk mjafton, atëherë mund ta vendosni më fuqishëm. Me fjalë të tjera, kursimi i energjisë për njësinë qendrore nuk ka shumë kuptim. Por për një sensor me valë në distancë, kursimi i energjisë është pjesa më e rëndësishme. Por nuk dua të humbas as funksionalitetin.


Prandaj, Arduino Pro Mini dhe moduli radio nRF24 do të mundësohen nga një paketë prej 4 baterish Ni-Mh.


Dhe mbani mend kapaciteti maksimal i një baterie moderne rreth 2500-2700 mAh, çdo gjë më shumë është ose një mashtrim marketingu (Ansmann 2850) ose një mashtrim (UltraFire 3500).


Unë nuk përdor bateri Li-Ion për disa arsye:

  • shumë e shtrenjtë
  • kur temperatura e ambientit bie nën 0°C, fuqia e baterisë litium-jon zvogëlohet në 40-50%
  • ato që janë të lira janë bërë pa mbrojtje dhe janë të pasigurta (gjatë një qarku të shkurtër ose shkarkimi, ato mund të shpërthejnë dhe digjen, shikoni një sërë videosh në YouTube)
  • plaken, edhe nëse nuk përdoren (megjithatë, kjo mund të thuhet për të gjithë elementët kimikë), pas 2 vjetësh një bateri Li-Ion humbet rreth 20% të kapacitetit të saj.

Për një prototip, është mjaft e mundur të përballeni me bateri Ni-MH AA ose AAA me cilësi të lartë. Për më tepër, ne nuk kemi nevojë për rryma të mëdha. Disavantazhi i vetëm i baterive Ni-MH është koha e gjatë e karikimit të tyre.

Skema e përgjithshme e stacionit të motit

Le të përmbledhim. Këtu është një diagram i përgjithshëm se si funksionon gjithçka.



Vazhdon.

Ne vazhdojmë të zhvillojmë stacionin tonë të motit.

Para se të kaloj në përditësimin, dua të sqaroj pak.

Një nga kolegët tanë më shkroi duke pyetur pse u prezantua kohëmatësi i rojes?

Kohëmatësi i rojes është vendosur në rast urgjence. Siç tregon praktika, ENC28J60 nuk tërheq më shumë se (nëse kujtesa nuk dështon) 4 lidhje të njëkohshme. Duke marrë parasysh se sa lidhje shërbimi ndodhin vazhdimisht për të mirëmbajtur vetë rrjetin dhe vetëm trafikun e mbetur të krijuar nga të gjitha llojet e lodrave të shtëpisë (për shembull, televizorët modernë skanojnë hostet e disponueshëm në rrjet dhe portat e tyre të hapura), dizajni thjesht shkon në hutim. . ENC28J60 nuk di të punojë në mënyrë të pavarur me protokollet e rrjetit dhe gjithçka zbatohet në biblioteka. Ndoshta janë vetëm ata.
Kontrollova të gjitha bibliotekat në dispozicion dhe module të ndryshme (papritmas një martesë), por nuk arrita të arrij një punë të qëndrueshme për një kohë të gjatë. Periudha maksimale ishte rreth 3-4 javë.
Është për këtë që "qeni" rrotullohet atje dhe, në këtë rast, tërheq kontrolluesin. Pas kësaj problemi u largua.
Unë gjithashtu nuk e mohoj që ka disa nuanca apo probleme në rrjetin tim të shtëpisë. Por duke qenë se problemi ishte tek unë, mund të dalë me një person tjetër. Unë kam gjetur vetëm këtë zgjidhje deri tani.
Me sa di unë, çipat Wiznet (W5100 dhe më lart) nuk e kanë këtë, ose thjesht nuk e kërkuan mirë.

Le të kalojmë te përditësimi

Më e rëndësishmja, ne po largohemi nga çipi ENC28J60 dhe shkoni në W5100. Unë u përpoqa të zbatoja gjithçka në një çip të vjetër, por nuk ka memorie të mjaftueshme të mikrokontrolluesit për shkak të bibliotekave shumë të mëdha për ENC28J60. Kur përdorni një çip të ri, standard bibliotekat nga zhvilluesi dhe të gjitha ndryshimet e bëra, mbetet edhe më shumë 20% memoria e lirë e mikrokontrolluesit ATMega328. Dhe këto janë simite të reja!

Ky version (le ta quajmë i dyti) shton aftësinë për të transmetuar lexime nga sensorët me valë duke përdorur frekuencën 433 MHz. Unë i mora vetë modulet nga kinezët, duke shënuar XY-MK-5V. Dua të vërej se cilësia e transmetimit është larg të qenit perfekt. Mund të ketë humbje sinjali, zhurmë, jo mundësi transmetimi të njëkohshëm etj., etj. Por çmimi i tyre (më pak se 1 dollarë për grup) kompenson këto mangësi. Unë do t'ju them një sekret se janë këto module (më të lira) që janë në shumë stacione moti të markave për përdorim shtëpiak. Wow, e papritur?

Le të fillojmë me stacionin bazë

Ne po lëvizim në Arduino UNO dhe Mburoja Ethernet(versioni i parë) i bazuar në çip W5100. Ky është një sanduiç dhe nuk ka kuptim ta përshkruajmë atë. Unë do të përshkruaj vetëm kontaktet e përfshira shtesë për modulet XY-MK-5V.

Moduli i transmetuesit përdor energji 5 V, GND(ku pa nënë atëherë) dhe D2 pin në kontrollues. Redakto kontaktin D2 (TË DHËNAT) mund të përdorni funksionin vw_set_tx_pin nga biblioteka e vw.

Ndryshe nga skica e mëparshme, kjo përdor dy biblioteka shtesë:

#përfshi #përfshi

Vetë skica

Teksti i fshehur

#përfshi #përfshi #përfshi #përfshi #përfshi #përfshi #përfshi #përfshi #define DHTTYPE DHT22 #define DHTPIN 5 DHT dht(DHTPIN, DHTTYPE); byte mac = (0x54, 0x34, 0x31, 0x31, 0x31, 0x31); charserver = "narodmon.ru"; porta int = 8283; IPadresa ip (192,168,0,201); Klienti EthernetClient; BMP085 dps = BMP085(); gjatë Temperatura = 0, Presioni = 0; noton H, dP, dPt; interval bool = e vërtetë; EasyTransferVirtualWireET; struct SEND_DATA_STRUCTURE( ID e bajtit; // ID e pajisjes int Temperatura; // Presioni i notimit të temperaturës; // Lagështia e notimit me presion; // float e lagështisë në pikën e vesës; // Pika e vesës/ ngrirjes); SEND_DATA_STRUCTURE transmetim; void setup() ( // Inicializoni kohëmatësin e Watchdog wdt_disable(); vonesë(8000); wdt_enable(WDTO_8S); // Inicializoni konsolën Serial.begin(9600); // Inicializoni sensorin DHT dht.begin(); // Inicializimi i moduli 433 MHz ET.begin(detajet(transmetim)); vw_set_ptt_inverted(true); vw_set_tx_pin(2); vw_setup(2000); // Filloni rrjetin, nëse nuk prisnim të dhëna nga serveri DHCP, atëherë // i caktojmë vetes një adresë nëse (Ethernet.begin(mac) == 0) Ethernet.begin(mac, ip); // Inicializojmë 1-Wire Wire.begin(); vonesë(200); // Inicializojmë BMP180 me rregullimin e lartësisë // dps.init (MODE_STANDARD, 3200, e vërtetë); // Inicializoni BMP180 dps.init(); Serial.println(Ethernet.localIP()); // Dërgoni të dhënat e para menjëherë pasi pajisja të jetë ndezur send_info(e vërtetë ); ) // funksioni dewPoint NOAA / / referencë (1): http://wahiduddin.net/calc/density_algorithms.htm // referencë (2): http://www.colorado.edu/geography/weather_station/Geog_site /about.htm dyfishi i vesës (celsius dyfish, lagështi e dyfishtë) ( // (1) Presioni i avullit të ngopjes = ESGG(T) RAPORTI i dyfishtë = 373,15 / (273,15 + celsius); dyfishtë RHS = -7,90298 * (RATIO - 1); RHS += 5,02808 * log10(RAPORTI); RHS += -1,3816e-7 * (pow(10, (11,344 * (1 - 1/RATIO))) - 1) ; RHS += 8,1328e-3 * (pow(10, (-3,49149 * (RATIO - 1))) - 1) ; RHS += log10 (1013.246); // faktori -3 është për të rregulluar njësitë - Presioni i avullit SVP * lagështia e dyfishtë VP = pow(10, RHS - 3) * lagështia; // (2) DEWPOINT = F (Presioni i avullit) dyfishi T = log (VP/0.61078); // kthimi temp var (241,88 * T) / (17,558 - T); ) void send_info(bool eth) ( bool fail = true; while(fail) ( // Përpjekja për të lexuar të dhënat nga sensori i lagështisë DHT derisa të marrim // rezultatin. Në 90% të rasteve gjithçka funksionon mirë, por na duhen 100 % if((H = dht.read Humidity()) >= 0) ( // Merrni lagështinë dhe temperaturën nga sensori BMP180 dps.getPressure(&Pressure); dps.getTemperature(&Temperature); // Llogaritni pikën e vesës nëse temperatura është jashtë mbi 0 gradë Celsius // dhe prisni një rezultat mbi 0, përndryshe prodhimi 0. Kjo është e nevojshme // në mënyrë që të mos jetë mashtruese në stinën e dimrit. // dP = Temperatura>0?((dPt=pika e vesës(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); }

Një antenë duhet t'i shtohet vetë moduleve. Për 433 MHz mjafton teli normal i bakrit 17 cm. Pa një antenë, mund të harroni funksionimin normal.

Kalimi në pjesën më të rëndësishme të këtij përditësimi - stacioni lokal me valë

Për ta zbatuar atë (në gjurin tim), përdora një analog Arduino NANO(në bazë ATMega328) dhe TFT shfaqja në një çip ST7735S me leje 128x160

Teksti i fshehur



Ekrani i pikës -> kontrolluesi

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

Moduli i marrësit është i lidhur vetëm në të njëjtën mënyrë si transmetuesi TË DHËNAT për të fiksuar D7.

Disa foto se si duket:

Teksti i fshehur

Skica e Marrësit

Teksti i fshehur

#përfshi #përfshi #përfshi #përfshi int x, y; int w = 128, h = 160; intsize; // 433 EasyTransferVirtualWire ET; struct SEND_DATA_STRUCTURE( ID e bajtit; // ID e pajisjes int Temperatura; // Presioni i notimit të temperaturës; // Lagështia e notimit me presion; // float e lagështisë në pikën e vesës; // Pika e vesës/ ngrirjes); SEND_DATA_STRUCTURE transmetim; int Log_Temperatura = -1; float Log_Pressure = -1; float Log_Lagështia = -1; float Log_dewPoint = -1; // TFT #define cs 10 #define dc 9 #define rst 8 char Temperatura, Presioni, Lagështia, Pika e vesës; Stringinfo; TFT TFTekran = TFT(cs, dc, rst); void setup()( Serial.begin(9600); // Inicializoni modulin 433MHz ET.begin(details(transmetim)); vw_set_ptt_inverted(true); vw_set_rx_pin(7); vw_setup(2000); vw_rx_start(dhe/); konfigurimi fillestar i ekranit TFTscreen.begin(); TFTscreen.setRotation(2); TFTscreen.background(0, 0, 0); // Vizatoni elemente statike // 1. Na vizitoni TFTscreen.stroke(255, 255, 255); TFTscreen .setTextSize(1); TFTscreen.text(" ", 10, 10); // 2. Përshkrimi i leximeve nga sensorët TFTscreen.text("mmHg", w/2+5, 80); TFTscreen.text ("% ", w/2+5, 100); TFTscreen.text("C", w/2+5, 120); transmetimi. Temperatura = 0; transmetimi. Presioni = 0; transmetimi. Lagështia = 0; transmetimi .dewpoint = 0; TFTPrint(); ) void loop()( if(ET.receiveData())( if(transmetim.ID == 1) TFTPrint(); /* Serial.println(transmetim.Temperatura); Serial. println(transmetim .Pressure); Serial.println(transmetim. Lagështia); Serial.println(transmetim.dewPoint); Serial.println(); */ ) ) ndryshime të pavlefshme (madhësia int, int x , int y, bool up, bool clear = false) ( if(clear) TFTscreen.stroke(0, 0, 0); else (ndryshimet(madhësia, x, y, !lart, e vërtetë); TFTscreen.stroke((lart)?0:255, 0, (lart)?255:0); ) if((madhësia%2) == 0 )madhësia ++; ndërsa(madhësia > 0) ( TFTscreen.line (x, y, x+(madhësia--), y); ++x, (lart)?--y:++y, --madhësia; ) /* ndërsa( madhësia > 0) ( TFTscreen.line (x, y, (lart)?x+madhësia-1:x, (lart)?y:y+madhësia-1); ++x, ++y, --madhësia; ) */ ) int x_center(int w, gjatësia int, madhësia int) (kati i kthimit ((w-gjatësia*(madhësia*5)+madhësia*2)/2); ) int x_alignment_right(int w, gjatësia int, int madhësia) ( tavani i kthimit (gjatësia w * (madhësia * 5) + madhësia * 2); ) i pavlefshëm TFTPrint () (madhësia = 3; // ================ ========================================================================== ============== // Shfaq leximet e temperaturës // ============================= ======================================================================= == if(transmetimi.Temperatura != Temperatura_Log) (TFTscreen.setTextSize(madhësia); // Mbishkruani të dhënat e vjetruara 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); TFTscreen.text(Temperatura, x_center(w, info.length()+1, madhësia ), 35); // Nxjerr lexime të reja i info = String (transmetim. temperatura); info.concat ("C"); if(transmetim.Temperatura > 0) info = "+"+info; info.toCharArray(Temperatura, info.length()+1); // Ndrysho ngjyrën e vlerës së temperaturës në varësi të vetë temperaturës int r, g = 0, b; if (transmetim. Temperatura > 0) ( r = harta (transmetim. Temperatura, 0, 40, 255, 150); // E kuqe b = harta (transmetim. Temperatura, 0, 40, 30, 0); // Ndrysho ngjyren për më shumë kalim vizual të zeros ) tjetër ( r = harta (transmetim. Temperatura, -40, 0, 0, 30); // Ndrysho ngjyrën për më shumë kalim vizual të zeros b = harta (transmetim. Temperatura, -40, 0, 150 , 255); // Blu) TFTscreen.stroke(b, g, r); // KUJDES: pozicionet e ngjyrave janë të kundërta në bibliotekë, vendi RGB përdoret nga BGR! TFTscreen.text(Temperatura, x_center(w, info.length()+1, madhësia), 35); ) madhësia = 1; // ========================================================================= =================================== // Shfaqja e leximeve të presionit // ======== = ================================================= ====================== if(transmetim. Presioni != Log_Pressure) ( TFTscreen.setTextSize(madhësia); // Mbishkruani informacionin e të dhënave të ndenjur = String(Log_Pressure ). ); // Nxjerr informacionin e leximeve të reja = String (transmetim. Presioni); info.toCharArray (Pressure, info.length()); TFTscreen.stroke (255, 255, 255); TFTscreen.text (Presion, x_alignment_right (w/ 2-5, info.length(), madhësia), 80); ndryshime (10, 106, 85, (transmetim. Presioni > Presioni_log)?true:false); ) tjetër (ndryshimet(10, 106, 85, e vërtetë, e vërtetë); ndryshime (10, 106, 85, e rreme, e vërtetë); ) // =============================== ======================================================================= / Leximet e lagështisë në dalje // =================== ========================================================================== ============= if(transmetim. Lagështia != Log_Humidity) ( TFTscreen.setTextSize(madhësia); // Mbishkruani informacionin e të dhënave bajate = String(Log_Humidity); info.toCharArray(Lagështia, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text(Lagështia, x_radhitja_djathtas (w/2-5, info.length(), madhësia), 100); // Nxjerr informacionin e leximeve të reja = String (transmetim. Lagështia); info.toCharArray(Lagështia, info.length()); TFTscreen.stroke(255, 255, 255); TFTscreen.text(Lagështia, x_radhitja_djathtas (w/2-5, info.length(), madhësia), 100); ndryshimet(10, 106, 105, (transmetim. Lagështia > Regjistri_Lagështia)? e vërtetë: e gabuar); ) else ( ndryshime (10, 106, 105, e vërtetë, e vërtetë); ndryshime (10, 106, 105, e rreme, e vërtetë); ) // ================== ========================================================================== =============// Shfaq pikën e vesës\frost // ========================= == ============================================================================ === if(broadcast.dewPoint ! = Log_dewPoint) ( TFTscreen.setTextSize(madhësia); // Mbishkruani të dhënat e vjetra = String(Log_dewPoint); info.toCharArray(dewPoint, info.length()); TFTscreen.stroke(0, 0, 0); TFTscreen.text (Pika e vesës, x_alignment_right (w/2-5, info.length (), madhësia), 120); // Shfaq informacionin e leximeve të reja = String (broadcast.dewPoint); info.toCharArray (pika e vesës, info.length ()); TFTscreen.stroke(255, 255, 255);TFTscreen.text(dewPoint, x_alignment_right(w/2-5, info.length(), madhësia), 120);ndryshime (10, 106, 125, (transmetim.dewPoint > Log_dewPoint)?true:false); ) else (ndryshime(10, 106, 125, e vërtetë, e vërtetë); ndryshime (10, 106, 125, false, e vërtetë); ) // Përditëso vlerat në regjistrat për më vonë krahasimi Log_Temperature = transmetim.Temperatura; Log_Pressure = transmetim.Presion; Log_Humidity = transmetim.Lagështia; log_dewpoint = transmetim.dewPoint; )

Leximet shfaqen mjaft kompakte, por siç tregon praktika (dhe këshillat e shokëve të mi) - "shija dhe ngjyra, madje edhe gruaja nuk është shoqe". Kam dëgjuar një mori këshillash dhe sugjerimesh, por ato bien ndesh me njëra-tjetrën. Kështu që bëjeni sipas dëshirës tuaj.

Më dukej se dizajni është pjesa e projektit që merr shumicën e kohës!

Teksti i fshehur

Një pjesë e të dhënave është krijuar për të shfaqur disa elementë të dizajnit.

Artefaktet në ekran janë pluhuri dhe papastërtitë e tjera të grumbulluara gjatë një kohe të gjatë, ekrani ishte ... diku atje ... mirë, nuk mbaj mend nga e kam marrë! Më lini të qetë!

Skica ka funksione pozicionimi. Ato janë mjaft primitive, por ju lejojnë të arrini efekte të caktuara.

  1. x_qendra
  2. x_drejtimi_djathtas

E para e vendos tekstin në qendër dhe e dyta e rreshton atë në anën e djathtë të zonës së specifikuar. Të gjitha llogaritjet bëhen në lidhje me madhësinë e tekstit të dhënë, bazuar në shprehjen 1 madhësi = 1PX x 1PX segmenti i fontit.

Ekrani tregon gjithashtu elementët që korrespondojnë me një rritje ose ulje në një ose një vlerë tjetër leximi. Ato shfaqen si trekëndësha. Por në kodin e funksionit ndryshimet ekziston një ekran alternativ në formën e trekëndëshave të rrotulluar me 45 gradë. Nëse leximi rritet, atëherë elementi është i kuq, përndryshe është blu.

Nga rruga, ngjyra dhe hija e temperaturës kryesore ndryshon në varësi të vetë temperaturës. Një vendim mjaft i diskutueshëm, por për mendimin tim, vizualisht i rehatshëm. Unë luftova me të për një kohë dhe kuptova se vlerat në funksion goditje në tru, objekti i ekranit TFT, renditen në rendin e gabuar. BGR vend RGB. Ky është një gabim zhvilluesi, mirë, ose nuk kuptoj diçka.

PS: Gjithçka është mjaft interesante, por për mendimin tim meriton zhvillim të mëtejshëm. Të cilën do ta bëjmë pas pak.



Shpërndaje