Stacioni i motit në shtëpi në Arduino dhe dërgimi i të dhënave te "Monitorimi i njerëzve". Stacioni im i motit i bërë vetë në stacionin e motit Arduino Nano në arduino me sensor wireless

Një kolegu im organizoi kohët e fundit një panair të vogël shkencor.
Mësuesi im më kërkoi të prezantoj një projekt elektronik për studentët e kolegjit. Kisha dy ditë për të dalë me diçka interesante dhe mjaft të thjeshtë.



Meqenëse kushtet e motit këtu janë mjaft të ndryshueshme, dhe temperatura luhatet në intervalin 30-40 ° C, vendosa të bëj një stacion moti në shtëpi.

Cilat janë funksionet e një stacioni meteorologjik në shtëpi?
Një stacion meteorologjik Arduino me një ekran është një pajisje që mbledh të dhëna për motin dhe kushtet mjedisore duke përdorur një sërë sensorësh.

Zakonisht këta janë sensorët e mëposhtëm:

  • era
  • lagështia
  • shiu
  • temperatura
  • presioni
  • lartësitë

Qëllimi im është të bëj një stacion portativ të motit desktop me duart e mia.

Ai duhet të jetë në gjendje të përcaktojë parametrat e mëposhtëm:

  • temperatura
  • lagështia
  • presioni
  • lartësia

Hapi 1: Bleni komponentët e duhur







  • DHT22, sensori i temperaturës dhe lagështisë.
  • BMP180, sensor presioni.
  • Saldim
  • Lidhës me një rresht 40 dalje

Nga pajisjet do t'ju duhet:

  • Makine per ngjitjen e metalit
  • pincë jastëk hundë
  • telat

Hapi 2: Sensori i temperaturës dhe lagështisë DHT22







Për matjen e temperaturës përdoren sensorë të ndryshëm. DHT22, DHT11, SHT1x janë të njohura

Unë do të shpjegoj se si ato ndryshojnë nga njëri-tjetri dhe pse kam përdorur DHT22.

Sensori AM2302 përdor një sinjal dixhital. Ky sensor funksionon në një sistem unik kodimi dhe teknologji sensori, kështu që të dhënat e tij janë të besueshme. Elementi i tij sensor është i lidhur me një kompjuter 8-bit me një çip.

Çdo sensor i këtij modeli kompensohet termikisht dhe kalibrohet saktësisht, koeficienti i kalibrimit ruhet në një memorie të programueshme një herë (OTP memorie). Kur lexoni një lexim, sensori do të kujtojë koeficientin nga kujtesa.

Madhësia e vogël, konsumi i ulët i energjisë, distanca e gjatë e transmetimit (100 m) e bëjnë AM2302 të përshtatshëm për pothuajse të gjitha aplikacionet dhe 4 dalje me radhë e bëjnë instalimin shumë të lehtë.

Le të shohim të mirat dhe të këqijat e tre modeleve të sensorëve.

DHT11

Pro: nuk kërkon saldim, më i liri nga tre modelet, sinjal i shpejtë i qëndrueshëm, diapazon mbi 20 m, ndërhyrje e fortë.
Kundër: Biblioteka! Nuk ka opsione rezolucioni, gabimi i matjes së temperaturës +/- 2°С, gabimi i matjes së nivelit të lagështisë relative +/- 5%, diapazoni joadekuat i temperaturave të matura (0-50°С).
Aplikimet: kopshtari, bujqësi.

DHT22

Pro: nuk kërkon saldim, kosto të ulët, kthesa të lëmuara, gabime të vogla në matje, gamë e madhe matjeje, diapazon mbi 20 m, ndërhyrje të forta.
Kundër: ndjeshmëria mund të jetë më e lartë, gjurmimi i ngadaltë i ndryshimeve të temperaturës, nevojitet një bibliotekë.
Aplikimet: studime mjedisore.

SHT1x

Pro: nuk kërkohet saldim, kthesa të lëmuara, gabime të vogla në matje, reagim i shpejtë, konsum i ulët i energjisë, modaliteti automatik i fjetjes, stabilitet i lartë dhe konsistencë e të dhënave.
Kundër: dy ndërfaqe dixhitale, gabim në matjen e nivelit të lagështisë, diapazoni i temperaturave të matura është 0-50°C, nevojitet një bibliotekë.
Aplikimet: funksionimi në mjedise të vështira dhe në instalime afatgjatë. Të tre sensorët janë relativisht të lirë.

Kompleksi

  • Vcc - 5V ose 3.3V
  • Gnd - me Gnd
  • Të dhënat - në pinin e dytë Arduino

Hapi 3: Sensori i presionit BMP180



BMP180 është një sensor barometrik i presionit atmosferik me ndërfaqe I2C.
Sensorët barometrikë të presionit matin vlerën absolute të ajrit të ambientit. Ky tregues varet nga kushtet specifike të motit dhe nga lartësia mbi nivelin e detit.

Moduli BMP180 kishte një rregullator 3.3V 662k ohm, të cilin unë, nga marrëzia ime, e shpërtheva aksidentalisht. Më duhej të bëja një goditje elektrike direkt në çip.

Për shkak të mungesës së një stabilizuesi, unë jam i kufizuar në zgjedhjen e një burimi të energjisë - tensionet mbi 3.3 V do të shkatërrojnë sensorin.
Modelet e tjera mund të mos kenë një stabilizues, sigurohuni që ta kontrolloni për të.

Diagrami i lidhjes së sensorit dhe autobusit I2C me Arduino (nano ose uno)

  • SDA-A4
  • SCL-A5
  • KQV - 3.3V
  • GND-GND

Le të flasim pak për presionin, dhe si lidhet me temperaturën dhe lartësinë.

Presioni atmosferik në çdo pikë nuk është konstant. Ndërveprimi kompleks midis rrotullimit të Tokës dhe animit të boshtit të Tokës rezulton në shumë zona me presion të lartë dhe të ulët, gjë që rezulton në modele të përditshme të motit. Duke vëzhguar ndryshimin e presionit, mund të bëni një parashikim afatshkurtër të motit.

Për shembull, një rënie e presionit zakonisht nënkupton mot me shi ose afrimin e një stuhie (duke iu afruar një zone me presion të ulët, një ciklon). Rritja e presionit zakonisht nënkupton mot të thatë dhe të kthjellët (një zonë me presion të lartë, një anticiklon, po kalon mbi ju).

Presioni atmosferik gjithashtu ndryshon me lartësinë. Presioni absolut në kampin bazë në Everest (5400 m mbi nivelin e detit) është më i ulët se presioni absolut në Delhi (216 m mbi nivelin e detit).

Meqenëse leximet e presionit absolut ndryshojnë në çdo vend, ne do t'i referohemi presionit relativ ose presionit të nivelit të detit.

Matja e lartësisë

Presioni mesatar në nivelin e detit është 1013.25 GPa (ose milibar). Nëse ngriheni mbi atmosferën, kjo vlerë do të bjerë në zero. Kurba e kësaj rënieje është mjaft e kuptueshme, kështu që ju mund ta llogaritni vetë lartësinë duke përdorur ekuacionin e mëposhtëm: alti=44330*

Nëse e merrni presionin e nivelit të detit prej 1013,25 GPa si p0, zgjidhja e ekuacionit është lartësia juaj aktuale.

Masat paraprake

Mbani në mend se sensori BMP180 ka nevojë për qasje në atmosferë për të qenë në gjendje të lexojë presionin e ajrit, mos e vendosni sensorin në një kuti të mbyllur. Një ndenja e vogël do të jetë e mjaftueshme. Por mos e lini shumë të hapur - era do të rrëzojë presionin dhe leximet e lartësisë. Merrni parasysh mbrojtjen e erës.

Mbroni nga nxehtësia. Për të matur presionin kërkohen lexime të sakta të temperaturës. Mundohuni të mbroni sensorin nga luhatjet e temperaturës dhe mos e lini pranë burimeve të temperaturave të larta.

Mbroni nga lagështia. Sensori BMP180 është i ndjeshëm ndaj niveleve të lagështisë, përpiquni të parandaloni depërtimin e mundshëm të ujit në sensor.

Mos e verboni sensorin. Surpriza ishte ndjeshmëria e silikonit në sensor ndaj dritës, e cila mund të bjerë mbi të përmes një vrime në kapakun e çipit. Për matjet më të sakta, përpiquni të mbroni sensorin nga drita e ambientit.

Hapi 4: Montimi i pajisjes







Instalimi i lidhësve me një rresht për Arduino Nano. Në thelb, i kemi prerë në madhësi dhe i kemi lyer me rërë paksa që të duken si të ishin. Pastaj i bashkojmë ato. Pas kësaj, ne instalojmë lidhës me një rresht për sensorin DHT22.

Instaloni një rezistencë 10 kΩ nga dalja e të dhënave në tokë (Gnd). Ne bashkojmë gjithçka.
Pastaj, në të njëjtën mënyrë, instalojmë një lidhës me një rresht për sensorin BMP180, e bëjmë furnizimin me energji elektrike 3.3V. Ne lidhim gjithçka me autobusin I2C.

Së fundi, ne e lidhim ekranin LCD me të njëjtin autobus I2C si sensori BMP180.
(Unë planifikoj të lidh më vonë një modul RTC (orë në kohë reale) me lidhësin e katërt në mënyrë që pajisja të tregojë gjithashtu kohën).

Hapi 5: Kodimi




Shkarkoni Bibliotekat

Për të instaluar bibliotekat në Arduino, ndiqni lidhjen

#përfshi
#include #include #include "DHT.h" #include

Presioni SFE_BMP180;

#define ALTITUDE 20.56 #define I2C_ADDR 0x27 //<<- Add your address here. #define Rs_pin 0 #define Rw_pin 1 #define En_pin 2 #define BACKLIGHT_PIN 3 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7

#define DHTPIN 2 // me cilin pin dixhital jemi lidhur

// Uncomment Whatdo lloj lloji që ju "të përdorni! // #përcaktoni dhttype dht11 // dht 11 #define dhttype dht22 // dht 22 (am2302), am2321 dht dht (dhtpin, dhtttype); likuidcrystal_i2c lcd (i2c_addr, en_pin, rw_pin, rw_pin, rw_pin, rw_pin, rw_pin, rw_pin Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);float t1,t2;

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

status = presion.getTemperature(T); if (statusi != 0) ( Serial.print ("1"); lcd.clear (); lcd.setCursor (0,0); lcd.print ("Temperatura Baro: "); lcd.setCursor(0,1 lcd.print(T,2);lcd.print("gradë C");t1=T; vonesë(3000);

status = presion.startPressure(3); nëse (statusi != 0) ( // Prisni që matja të përfundojë: vonesë(status);

status = presion.getPressure(P,T); nëse (statusi != 0) (lcd.clear(); lcd.setCursor(0,0); lcd.print("presion abslt: "); lcd.setCursor(0,1); lcd.print(P,2 lcd.print(" mb "); vonesë (3000);

p0 = presion.nivel vulosje(P,ALTITUDE); // jemi në 1655 metra (Boulder, CO)

a = presioni.lartësia (P,p0); LCD.clear(); lcd.setCursor(0,0); lcd.print("Lartësia: "); lcd.setCursor(0,1); LCD.print(a,0); lcd.print("metra"); vonesë (3000); ) ) ) ) float h = dht.lexo Lagështia(); // Lexoni temperaturën si Celsius (e parazgjedhur) float t = dht.readTemperature(); t2=t; LCD.clear(); lcd.setCursor(0,0); // shkoni te fillimi i rreshtit të dytë lcd.print("Lagështia: "); lcd.setCursor(0,1);lcd.print(h); lcd.print("%"); vonesë (3000); LCD.clear(); lcd.setCursor(0,0); // shkoni te fillimi i printimit të LCD-së së linjës së dytë ("Temperatura DHT: "); lcd.setCursor(0,1); printim LCD(t); lcd.print ("degC"); vonesë (3000); lcd.clear(); lcd.setCursor(0,0); // shkoni te fillimi i rreshtit të dytë lcd.print("Temperatura mesatare: "); lcd.setCursor(0,1); lcd.print((t1+t2)/2); lcd.print ("degC"); vonesë (3000); )

Kam përdorur versionin 1.6.5 Arduino, kodi i përshtatet saktësisht, mund të funksionojnë edhe ato të mëvonshme. Nëse kodi nuk përshtatet për ndonjë arsye, përdorni versionin 1.6.5 si bazë.

Këshillohet që të shkarkoni firmware-in përpara se të lidhni komponentët për t'u siguruar që bordi po funksionon. Pas montimit, mund të ndizni përsëri, bordi duhet të ndizet me qetësi. Në projektet me konsumatorë me fuqi të lartë në qarkun e energjisë 5V të tabelës (shirit LED të adresueshëm, servo, motorët, etj.), është e nevojshme të aplikoni energji të jashtme 5V në qark përpara se të lidhni Arduino me kompjuterin, sepse USB nuk do të sigurojë rryma e nevojshme nëse, për shembull, shiriti e kërkon atë. Kjo mund të djegë diodën mbrojtëse në tabelën Arduino. Një udhëzues për shkarkimin dhe ngarkimin e firmuerit mund të gjendet nën spoiler në rreshtin tjetër.

Përmbajtja e dosjeve në arkiv

  • bibliotekat– bibliotekat e projektit. Zëvendësoni versionet ekzistuese
  • firmware- Firmware për Arduino
  • skemat– diagramet e lidhjes së komponentëve

Për më tepër

  • Siç tregoi eksperimenti, jashtë kasës sensori i temperaturës tregon 0,5 gradë më pak se brenda! Shtë e nevojshme të rregulloni me sukses elektronikën, të hiqni dhe mbroni nxehtësinë nga elementët e ngrohjes ...

  • Nëse ekrani është shumë i zbehtë/i bardhë
    Në tabelën e drejtuesit të ekranit (me të cilën janë lidhur telat) ka një çelës kontrasti, me ndihmën e tij mund të rregulloni kontrastin me atë të dëshiruar. Gjithashtu, kontrasti varet nga këndi i shikimit të ekranit (ky është LCD) dhe ju mund ta rregulloni ekranin për një ekran të qartë edhe në një kënd "ekrani është në nivelin e kërthizës, ne shikojmë nga lart". Dhe kontrasti varet fuqimisht nga furnizimi me energji elektrike: nga 5V, ekrani shfaqet sa më qartë dhe me shkëlqim, ndërsa kur mundësohet nga USB përmes Arduino, voltazhi do të jetë rreth 4.5 V (një pjesë e tij bie në diodën mbrojtëse përgjatë USB-së linjë), dhe ekrani shfaqet jo aq i ndritshëm. Rregulloni daljen me një çelës me një furnizim të jashtëm me energji nga 5V!

  • Nëse sensori i CO2 nuk funksionon siç duhet (infa nga Evgeny Ivanov)
    Epo, ka skica për kalibrim në dosjen e bibliotekës së sensorëve në shembuj. ai gjithashtu mund të fillojë memec duke shkurtuar lidhësin "HD" në tokë për 7+ sekonda.
    Sigurisht, pikërisht në rrugë në të ftohtë, nuk është e nevojshme ta bëni këtë ... thjesht mund ta mbushni shishen me ajër të pastër me një sensor brenda dhe ta mbyllni atë. Kalibrimi zgjat të paktën 20 minuta.
    Si parazgjedhje, sensori furnizohet me kalibrimin automatik të aktivizuar, i cili ndodh çdo ditë, dhe nëse sensori përdoret në një dhomë të paajrosur, atëherë ky kalibrim merr shpejt vlerat nga norma përtej horizontit, kështu që duhet të çaktivizohet. .
    Dokumentacioni.

  • Kalibrimi automatik i sensorit CO2 është i çaktivizuar në skicë!

  • Nëse keni Sensori BME280 nuk funksionon, me shumë mundësi ka një adresë tjetër. Projekti përdor bibliotekën Adafruit_BME280, e cila nuk ka një funksion të veçantë të ndryshimit të adresës, kështu që adresa vendoset manualisht në skedarin e bibliotekës Adafruit_BME280.h pothuajse në fillim të skedarit ( është në dosjen Adafruit_BME280 në dosjen tuaj të bibliotekave, duhet ta kishit instaluar atje), moduli im kishte adresën 0x76. Si mund ta gjej adresën e modulit tim BME280? Ekziston një skicë e veçantë e quajtur skaner i2c. Mund ta kërkoni në google, mundeni. Ndizni këtë skicë, hapni portën dhe merrni një listë të adresave të pajisjeve të lidhura me autobusin i2c. Që të mos ju shqetësojnë modulet e tjera, mund t'i fikni dhe të lini vetëm BME280. Ne specifikojmë adresën e marrë në bibliotekë, ruajmë skedarin dhe ngarkojmë firmware-in e orës së motit. Të gjitha!

  • Nëse ora është prapa, problemi ka shumë të ngjarë në qarkun e energjisë. Nëse problemi vazhdon kur ndryshoni furnizimin me energji elektrike në një më të mirë, varni një kondensator për të fuqizuar modulin RTC (lidjeni direkt në tabelë me VCC dhe GND): sigurohuni që të jetë qeramike, 0,1-1 uF (shënon 103 ose 104, shih tabelën e shënimit). Ju gjithashtu mund të vendosni një elektrolit (6.3V, 47-100 uF)

Cilësimet e firmuerit

#define RESET_CLOCK 0 // rivendosni orën ndërsa firmware është duke u ngarkuar (për një modul me një bateri jo të lëvizshme). Mos harroni të vendosni 0 dhe të ndizni përsëri! #define SENS_TIME 30000 // koha e rifreskimit të leximeve të sensorit në ekran, milisekonda #define LED_MODE 0 // Lloji RGB LED: 0 - katoda kryesore, 1 - anoda kryesore # define LED_BRIGHT 255 // Shkëlqimi LED CO2 (0 - 255) # define BLUE_YELLOW 1 // ngjyrë të verdhë në vend të blusë (1 po, 0 jo) por për shkak të veçorive të lidhjes e verdha nuk është aq e ndritshme #define DISP_MODE 1 // shfaqja në këndin e sipërm djathtas: 0 - viti, 1 - dita e javës , 2 - sekonda #define WEEK_LANG 1 // gjuha e ditës së javës: 0 - Anglisht, 1 - Rusisht (i transliteruar) #define DEBUG 0 // shfaq regjistrin e inicializimit të sensorit në fillimin #define PRESSURE 1 // 0 - presion grafiku, 1 - grafiku i parashikimit të shiut (në vend të presionit ). Mos harroni të rregulloni kufijtë e grafikut // shfaqni kufijtë për grafikët #define TEMP_MIN 15 #define TEMP_MAX 35 #define HUM_MIN 0 #define HUM_MAX 100 #define PRESS_MIN -100 #define PRESS_MAX 100 CO20 #define

Stacioni i motit bëjeni vetë.

Ishte në mbrëmje, nuk kishte asgjë për të bërë pas vitit të ri. Si zakonisht, gjatë festave dimërore të Vitit të Ri, dua të zë kokën dhe duart me diçka të dobishme dhe krijuese. Gjatë këtyre festave të Vitit të Ri vendosa të bëj një stacion meteorologjik me duart e mia. Fillova të përgatitem paraprakisht, bleva dhe montova të gjithë komponentët para vitit të ri dhe programimin kryesor e bëra gjatë festave.

(Shumë foto nën prerje!)

Së pari, unë do të kaloj mbi përbërësit, nuk do të jap lidhje, pasi mallrat në eBay (në llogarinë time) kanë shkuar në arkiv. Bleva shumë komponentë me kohë në eBay. Provova ankandin për herë të parë, më parë blija gjithmonë "blej tani". Çfarë mund të them, nëse nuk nxitoni për të blerë, atëherë disa përbërës mund të blihen më lirë (nganjëherë ndryshimi është dy herë).

Sensori i presionit BMP085
Ky është sensori kryesor. Kur e pashë në eBay, kuptova se doja të ndërtoja një stacion moti në shtëpi.
Sensori mbërriti në një zarf të zakonshëm, të ngjitur me një mbështjellës të vogël flluskë brenda.

Brenda zarfit ishte kartëvizita e shitësit dhe sensori, të paketuara në një qese antistatike dhe të mbështjellë me një shtresë tjetër mbështjellësi me flluskë

Çanta antistatike u mbyll në mënyrë që lagështia gjatë fluturimit të mos kërcënonte sensorin

Ne marrim sensorin. Nga njëra anë, një linjë kontaktesh ishte ngjitur, të cilat futeshin në shkumë në mënyrë që të mos përkuleshin. Në anën tjetër është vetë sensori dhe shënimi i kontakteve.




Gjithçka do të ishte mirë, por shënimi i kontakteve zbatohet në një imazh pasqyre.
Sensori është i lidhur nëpërmjet autobusit I2C dhe mundësohet nga 3.3 V. Kjo do të thotë, nevojiten 4 tela për funksionimin normal (+, -, SDA, SCL)
Mund ta merrni në pyetje sensorin në 2 mënyra: ose përmes bibliotekës, ose duke përdorur funksionet drejtpërdrejt në skicë.
Shembull programi:

#përfshi

#define BMP085_ADDRESS 0x77 // Adresa I2C e BMP085

char pa nënshkruar OSS = 0; // Cilësimi i mbikampionimit

// Vlerat e kalibrimit
int ac1;
intac2;
intac3;
i panënshkruar int ac4;
i panënshkruar int ac5;
i panënshkruar int ac6;
int b1;
intb2;
intmb;
int mc;
intmd;

temperatura e shkurtër;
presion i gjatë;

Konfigurimi i zbrazët ()
{
Seriali.fillim(9600);
Wire.begin();
bmp085Kalibrimi();
}

Loop void ()
{
temperatura = bmp085GetTemperature(bmp085ReadUT());
presioni = bmp085GetPressure(bmp085ReadUP());
Serial.print("Temperatura: ");
Serial.print (temperatura/10.0, DEC);
Serial.println("C");
Serial.print("Presioni: ");
Serial.print(presioni/133.322, DEC);
Serial.println("mm Hg");
Seriali.println();
vonesë (1000);
}

Kalibrimi i pavlefshëm bmp085()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}

Shkurtër bmp085GetTemperature (i panënshkruar int ut)
{
e gjatë x1, x2;
x1 = (((e gjate)ut - (e gjate)ac6)*(e gjate)ac5) >> 15;
x2 = ((i gjatë) mc<< 11)/(x1 + md);
b5 = x1 + x2;

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

I gjatë bmp085GetPressure (i panënshkruar gjatë)
{
e gjatë x1, x2, x3, b3, b6, p;
e gjatë e panënshkruar b4, b7;
b6 = b5 - 4000;
// Llogarit B3
x1 = (b2 * (b6 * b6)>> 12)>> 11;
x2 = (ac2 * b6)>> 11;
x3 = x1 + x2;
b3 = ((((((i gjatë)ac1)*4 + x3)<>2;
// Llogarit B4
x1 = (ac3 * b6)>> 13;
x2 = (b1 * ((b6 * b6)>> 12))>> 16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (i gjatë i panënshkruar)(x3 + 32768))>>15;
b7 = ((i gjatë i panënshkruar) (lart - b3) * (50000>>OSS));
nëse (b7< 0x80000000)
p = (b7<<1)/b4;
tjetër
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>> 16;
x2 = (-7357 * p)>> 16;
p += (x1 + x2 + 3791)>>4;
kthimi p;
}

// Lexoni 1 bajt nga BMP085 në "adresa"
char bmp085Lexo (adresa e panënshkruar char)
{
të dhëna karakteresh të panënshkruara;

tel.shkruaj(adresa);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available())
;
ktheje Wire.read();
}

Int bmp085ReadInt (adresa char e panënshkruar)
{
char i panënshkruar msb, lsb;
Wire.beginTransmission (BMP085_ADDRESS);
tel.shkruaj(adresa);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2)
;
msb = Wire.read();
lsb = Wire.read();
kthej (int) msb<<8 | lsb;
}

// Lexoni vlerën e temperaturës së pakompensuar
i panënshkruar int bmp085ReadUT()
{
i panënshkruar int ut;
// Shkruani 0x2E në Regjistrin 0xF4
// Kjo kërkon një lexim të temperaturës
Wire.beginTransmission (BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();
// Prisni të paktën 4,5 ms
vonesë (5);
// Lexoni dy bajt nga regjistrat 0xF6 dhe 0xF7
ut = bmp085ReadInt(0xF6);
kthej ut;
}

// Lexoni vlerën e presionit të pakompensuar
i panënshkruar i gjatë bmp085ReadUP()
{
char i panënshkruar msb, lsb, xlsb;
i panënshkruar gjatë lart = 0;
// Shkruani 0x34+(OSS<<6) into register 0xF4
// Kërkoni një lexim të presionit me vendosjen e mbikampionimit
Wire.beginTransmission (BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
// Prisni për konvertim, koha e vonesës varet nga OSS
vonesë (2 + (3<// Lexoni regjistrin 0xF6 (MSB), 0xF7 (LSB) dhe 0xF8 (XLSB)
Wire.beginTransmission (BMP085_ADDRESS);
Wire.write(0xF6);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 3);
// Prisni që të dhënat të bëhen të disponueshme
while(Wire.available()< 3)
;
msb = Wire.read();
lsb = Wire.read();
xlsb = Wire.read();
lart = (((i gjatë i panënshkruar) msb<< 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
kthehu lart;
}


Përveç kësaj, sensori ka sensorin e tij termik për kompensimin e presionit dhe një lartësimatës.

Arduino Nano v3.0
Kjo është zemra e të gjithë stacionit të motit. Me fjalë të thjeshta, kontrolluesi është në madhësi miniaturë.
Blerë
Unë nuk do të flas në detaje për kontrolluesin, pasi kjo është bërë tashmë para meje:


Pakoja me lightake ishte e parafabrikuar, kontrollori erdhi në një paketë me një kabllo USB dhe një Arduino në një qese antistatike të mbyllur.

Për të vlerësuar madhësinë, pranë Arduino vendosni një monedhë me vlerë nominale 1 rubla.

Bordi i kontrolluesit nga afër



Kablloja USB është e mirë, me një unazë ferriti. Mundësuar nga Arduino me kabllo USB. Mjedisi i zhvillimit mund të shkarkohet (faqja e shkarkimit). Gjuha është e ngjashme me "C", nuk ka pasur probleme me zotërimin e saj, pasi unë programoj shumë për të në punë.

Ekran LCD
Në punë në kosha gjeta një ekran të pajtueshëm LCD 1602. Më duhej të ndërhyja me lidhjen, pasi nuk gjeta një fletë të dhënash për të. Si rezultat, LCD fitoi.

Por pas një operacioni të shkurtër, vura re se ky ekran nuk më mjafton dhe nuk do të mund të shfaq më shumë të dhëna, pasi ka vetëm 2 rreshta me 16 karaktere secila. Në fillim duket se mjaftojnë këto parametra, por kur filloni të programoni, kuptoni se mund të grumbulloni maksimum 3-4 parametra. Dhe nëse bëni një menu (po mendoja të bëja një menu në këtë ekran), atëherë mbeten 1-2 hapësirë ​​​​të lirë për parametrat.
Si rezultat, fillova të kërkoja një ekran tjetër. Në fillim shikova ekranin grafik nga Nokia 3310 dhe madje mora pjesë në ankandin e eBay për ta blerë, por nuk funksionoi (për të cilën jam shumë i lumtur), kështu që më duhej të hiqja dorë nga ky ekran. Tani e kuptoj që do të ishte shumë e vogël për qëllimet e mia, pasi ka diçka për të krahasuar.
Ndërsa shfletoja rastësisht mburojat në Arduino, hasa në ekranin grafik 12864 në kontrolluesin ST7920. Ky ekran ka madhësinë e duhur dhe rezolucion të mirë për nevojat e mia (128x64). Kjo do të thotë, mund të vendosni me siguri 6-7 rreshta me 20 karaktere në një font normalisht të lexueshëm. Duke qenë se ekrani është grafik, përveç tekstit me shkronja të ndryshme mund të vendosen edhe grafikë. Me pak fjalë, kjo është pikërisht ajo që më duhej, gjithçka ishte e pranishme në këtë ekran, ndaj nuk durova dot dhe porosita.
Parcela mbërriti shpejt dhe u paketua në një mënyrë standarde: një mbështjellës flluskë, brenda kishte një shtresë tjetër mbështjellës flluskë dhe një ekran në një qese antistatike:






Për të vlerësuar madhësinë, pranë LCD-së vendosni një monedhë me vlerë nominale 1 rubla.




Për të lidhur shpejt ekranin me Arduino, bashkova një linjë kontaktesh në kunjat LCD. LCD mund të lidhet përmes autobusit serial dhe paralel. Zgjodha opsionin e parë, pasi ka kaq pak kontakte falas Arduino.
Lidhja (marrë nga uebi):

- Pini 1 (GND) lidhet me autobusin e përbashkët
- Pini 2 (VCC) është i lidhur me autobusin e energjisë +5V dhe konsumi aktual është relativisht i vogël dhe ekrani mund të mundësohet nga rregullatori i integruar Arduino.
- Kunjat 4, 5 dhe 6 janë të lidhur me daljet dixhitale Arduino, duke formuar ndërfaqen serike SPI:
pin 4 - (RS) - korrespondon me linjën CS (për shembull 7)
pin 5 - (RW) - korrespondon me linjën MOSI (për shembull 8)
pin 6 - (E) - korrespondon me linjën SCK (për shembull 3)
Numrat e pinit Arduino mund të jenë çdo gjë, gjëja kryesore është të mos harroni t'i tregoni saktë ato më vonë në tekstin e programit kur inicializoni ekranin.
- Pin 15 (PSB) është i lidhur me autobusin e përbashkët.
- Kunjat 19 (A) dhe 20 (K) janë furnizim me energji elektrike me dritë prapa (përkatësisht +5V dhe GND). Për të rregulluar ndriçimin e dritës së prapme, mund të përdorni një rezistencë të ndryshueshme 10 kΩ të lidhur midis shinave të energjisë dhe GND. Tensioni nga motori i tij aplikohet në pinin 19 të ekranit.
Sipas këtij udhëzimi, unë lidha gjithçka përveç dritës së prapme. Kam përdorur Arduino PWM si fuqinë e dritës së prapme.
Për të lidhur në mënyrë programore LCD-në me Arduino, përdoret biblioteka u8glib. Ju mund të shkarkoni. Nëse ka probleme me shkarkimin, atëherë mund ta ngarkoj bibliotekën në narod.ru.
Vetë biblioteka nuk është e komplikuar dhe ju lejon të shfaqni tekstin me shkronja të ndryshme, të vizatoni një vijë, të vizatoni format më të thjeshta gjeometrike (drejtkëndësh, rreth), të shfaqni imazhet tuaja të përgatitura në një mënyrë të veçantë. Në parim, ky mjet është i mjaftueshëm për shumicën e detyrave.
Këtu është rezultati i një programi të thjeshtë:

Vetë programi:

#include "U8glib.h"

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

// Nënprogrami për përcaktimin e memories së lirë
int freeRam()(
extern int __heap_start, *__brkval;
intv;
kthimi (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);
}

Konfigurimi i zbrazët (i pavlefshëm) (
u8g.setFont(u8g_font_6x10); // font
u8g.setRot180(); // Kthejeni ekranin
analogWrite(6, 115); // Cakto ndriçimin e ekranit (anoda e dritës së prapme në 6 pin)
}

Cikli i zbrazët (i pavlefshëm) (
u8g.firstPage();
bej(

u8g.setPrintPos(1, 12); // pozicion
u8g.print("Përshëndetje!!!"); // prodhimi i tekstit
u8g.drawBox(0,22,128,9); // Mbushni drejtkëndëshin me të bardhë
u8g.setColorIndex(0); // bojë e bardhë, sfond i zi
u8g.setPrintPos(1, 30); // pozicion
u8g.print("Fjala..."); // prodhimi i tekstit

U8g.setColorIndex(1); // bojë e bardhë, sfond i zi
u8g.setPrintPos(1, 50); // pozicion
u8g.print ("Pas fillimit ="); // prodhimi i tekstit
u8g.setPrintPos(85, 50); // pozicion
u8g.print(millis() / 1000); // numri i daljes së sekondave pas fillimit
u8g.setPrintPos(1, 64); // pozicion
u8g.print(freeRam()); // nxjerr sa memorie është përdorur
) while(u8g.nextPage());

vonesë (200);
}

Ora në kohë reale DS1307
Një tjetër komponent për stacionin tim të motit. Kjo mburojë ka një orë në kohë reale. I porosita në eBay. Shitësi dërgoi një shami ore në një kuti jorealiste të madhe


Brenda kutisë kishte dy fletë A4 me reklamë dhe një shami ore të mbështjellë me celofan


Dua të vërej se tarifa nuk kalon madhësinë e 2 rubla. monedhë, dhe kutia kishte përmasa 13x15x5 cm.
Tabela ishte e paketuar në një qese antistatike

Shall nga afër



Më duhej të ndërhyja me këtë modul. Së pari, kishte vështirësi në lidhje. Dhe së dyti, nuk ka kuarc në këtë tabelë. Nëse do ta dija që do të shpenzoja kaq shumë kohë në modul, atëherë me shumë mundësi do ta kisha mbledhur vetë, pasi rrjeti është plot me skema. Qarku më i thjeshtë përmban 4-5 komponentë.
Në lidhje me lidhjen. Gjeta një bibliotekë që thoshte se ndërfaqja I2C mund të lidhet jo me hyrjet e zakonshme analoge të Arduino (A4 dhe A5), por me ndonjë diskrete. Bërë siç është shkruar. Në fillim, asgjë nuk funksionoi, pas një kërcimi të gjatë me një dajre, ora u mbyll. Epo, mendova, kaq, problemet mbaruan, por pasi u përpoqa të lidhja të njëjtin modul me një Arduino tjetër, vallëzimi me dajre vazhdoi. Kalova shumë kohë duke kërkuar një zgjidhje për këtë problem, dhe pothuajse kudo tregohej ose një lidhje e gabuar ose mungesa e rezistorëve tërheqës në kunjat SCL dhe SDA. Unë tashmë doja të futesha në tabelë me një hekur saldimi, por në një forum rastësisht hasa në një kod ku thuhej se SCL dhe SDA duhet të lidhen me portet standarde I2C në Arduino. Pas lidhjes standarde, gjithçka funksionoi menjëherë.
Tani në lidhje me kuarcin. Nuk e di se çfarë lloj kuarci vendosën kinezët atje, por orët me kuarc të tillë funksiononin 10-11 sekonda në ditë. Ky gabim është 5 minuta në muaj dhe 1 orë në vit. Ju nuk keni nevojë për një orë si kjo. Më duhej të shkoja përsëri në internet dhe të kërkoja se si ta rregulloja këtë gabim. Zgjidhja e parë që doli thotë se ju duhet të tokëzoni kuarcin. E bëri - rezultat zero. Gjeta diku tjetër që më duhej të gjeja një motherboard të vjetër dhe të shkrija kuarc orë. U krye - rezultati është. Tani ora ikën jo me 10-11 sekonda, por me 1.5 sekonda në ditë. Le të themi se u bë më mirë, por larg idealit. Meqenëse është më ngurrues të merret me një hekur saldimi, u vendos që të rregulloni orën në mënyrë programore, domethënë, një herë në ditë, të rregulloni orën në vlerën e dëshiruar. Pas 10 ditësh, ora ishte zhdukur jo më shumë se një sekondë. Metoda është e mirë, por vetëm kur pajisja e kohës Arduino është e lidhur me energjinë, përndryshe ora funksionon me bateri dhe ende ikën.
Program i vogël testimi:

#përfshi "Wire.h"
#define DS1307_I2C_ADDRESS 0x68 // SDA A4, SCL A5

Bajt decToBcd (bajt val)
{
kthimi ((val/10*16) + (val%10));
}

Bajt bcdToDec (vlera bajt)
{
kthimi ((val/16*10) + (val%16));
}

Set DateDs1307 i pavlefshëm (byte sekondë, // 0-59
byte minutë, // 0-59
byte orë) // 0-99
{

Wire.shkruaj(0);
Wire.write(decToBcd(sekond));
Wire.write(decToBcd(minutë));
Wire.write(decToBcd(orë));
Wire.endTransmission();
}

E pavlefshme getDateDs1307(byte *sekondë,
byte*minuta,
byte*orë)
{

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

Wire.requestFrom(DS1307_I2C_ADDRESS, 3);

*second = bcdToDec(Wire.read());
*minuta = bcdToDec(Wire.read());
*orë = bcdToDec(Wire.read());
}

Konfigurimi i zbrazët ()
{
byte sekondë, minutë, orë;
Wire.begin();
Seriali.fillim(9600);

E dyta = 45;
minuta = 5;
orë = 16;

SetDateDs1307 (sekondë, minutë, orë);
}

Loop void ()
{
byte sekondë, minutë, orë;

GetDateDs1307 (&sekond, &minuta, &orë);
Serial.print(orë, Dhjetor);
printim serik (":");
Serial.print (minuta, DEC);
printim serik (":");
Serial.println (e dyta, DEC);

vonesë (1000);
}


Biblioteka nuk përdoret këtu dhe funksionet janë të shkurtuara për kohën e leximit dhe shkrimit.

Sensori i temperaturës dhe lagështisë DHT11
Nuk ka shumë për të thënë për këtë sensor. Nuk do ta përdorja as nëse nuk do të kisha nevojë për lagështi. Fatkeqësisht, nuk e bëra një foto kur e mora, kështu që nuk do të ketë asnjë fotografi. Fotot e sensorit mund të shihen më poshtë, ku e lidha atë me Arduino. Lidhja e sensorit është e thjeshtë (+, dalje dixhitale, -). Në mënyrë tipike, sensorët bëhen me katër kunja. Me këtë faktor forme, kontakti i tretë nuk është i lidhur me asgjë.
Për t'u lidhur me Arduino, mund të përdorni bibliotekën. Ju mund të shkarkoni.
Një program i vogël testimi me dalje informacioni në ekranin LCD 1602:

// përfshin kodin e bibliotekës:
#përfshi
#përfshi

// Deklaroni objekte
dht11 Dht11;
LCD Crystal Liquid(12, 11, 6, 5, 4, 3);

#define DHT11PIN 7
int i;

Konfigurimi i zbrazët ()
{
lcd.begin(16, 2);
lcd.print("Statusi:");
i=0;
}

Loop void ()
{
int chk = DHT11.read(DHT11PIN);
lcd.setCursor(8, 0);
kaloni (chk)
{
case 0: lcd.print("OK"); break;// lcd.setCursor(11, 0); lcd.print(millis()/2000); pushim;
case -1: lcd.print(“Gabim i shumës së kontrollit”); merr(); pushim;
case -2: lcd.print("Time out error"); merr(); pushim;
default: lcd.print ("Gabim i panjohur"); merr(); pushim;
}
vonesë (500);
lcd.setCursor(15, 0);
ndërprerësi (i)
{
case 0: lcd.print("^"); lcd.setCursor(15, 1); lcd.print(" ");break;
rasti 1: lcd.print("v"); lcd.setCursor(15, 1); lcd.print(" ");break;
default: lcd.setCursor(15, 1); lcd.print("E"); pushim;
}
i=i+1;
nëse (i>1) i=0;
lcd.setCursor(0, 1);
lcd.print("H=");
lcd.setCursor(2, 1);
lcd.print((float)DHT11.lagështia, 0);
lcd.setCursor(4, 1);
printim LCD ("%");
lcd.setCursor(8, 1);
lcd.print("T=");
lcd.setCursor(10, 1);
lcd.print((float)DHT11.temperaturë, 0);
lcd.setCursor(12, 1);
lcd.print("C");

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


Sensori ka disavantazhe - të dhënat nga sensori vijnë vetëm në numra të plotë, dhe diapazoni është i dobët.

Duket se ka shkruar për të gjithë komponentët. Mbetet për të mbledhur gjithçka në një tërësi të vetme.
Oops, pothuajse harrova! Për të montuar pajisjen, ju nevojitet një kuti. Rasti u urdhërua gjithashtu në Ebay. Shitësi ishte nga Anglia. Parcela erdhi shpejt, por unë nuk e fotografova. Të gjitha fotot e trupit janë më poshtë.

Së pari, mblodha gjithçka në tryezë me ndihmën e instalimeve elektrike speciale. Shkrova një program testimi dhe e ngarkova në kontrollues.



Në fakt, ngjyra blu e dritës së prapme është shumë më e ndritshme. Edhe në ndriçimin minimal (Bright=5) korniza është e ekspozuar.

Për të mbledhur gjithçka pa tela, u vendos të bëhej një mini motherboard, dhe bordi Arduino dhe mburojat u vendosën në lidhës. Në këtë rast, ato mund të hiqen lehtësisht shpejt. Vendosa gjithashtu të lidh ekranin LCD dhe butonat e kontrollit në lidhës, vetëm të lidh sensorin e temperaturës në tela.
Kështu doli shalli



Në foton e fundit, nuk e kam larë ende fluksin. Ngjita gome poroze nën mburojat pranë lidhësve, në mënyrë që të kishte të paktën një lloj mbështetjeje. Edhe pse, në fakt, mburojat në lidhësit në kontakte janë mbajtur tashmë në mënyrë të përsosur.

Motherboard me mburoja dhe pllakë Arduino të instaluar.

Kështu duket një lidhje e plotë me motherboard


Në vend të butonave, përdora një mburojë të bërë vetë të ngjitur në një dërrasë buke. Si butona përdora butona nga minjtë e vjetër.
Siç mund ta shihni, numri i telave është zvogëluar.

Problemi kryesor i vendosjes në kuti është prerja e brazdës për ekranin LCD në mënyrë të barabartë. Sado që u përpoqa, përsëri nuk funksionoi në mënyrë perfekte. Boshllëqet në disa vende ishin pak më shumë se 1 mm. Për ta bërë gjithçka të duket e rregullt, mora një ngjitës të zi për akuariumin dhe mbusha të gjitha të çarat, në të njëjtën kohë ngjita ekranin me këtë ngjitës të veçantë. Pasi të ishte tharë ngjitësi, e preva tepricën nga jashtë. Në dritë të ndritshme, ngjitësi është i dukshëm, dhe në dritën normale, gjithçka bashkohet me rastin.
Kështu duket kasa nga brenda me ekranin LCD dhe motherboard të instaluar.

Kështu duket nga jashtë në dritë të fortë (kërkoj falje për gjurmët e gishtërinjve, i pashë kur po zgjidhja fotot).

Kam menduar për një kohë të gjatë se si t'i bashkoj butonat në kasë dhe, më e rëndësishmja, cilat butona të përdor ...
Në dyqanet elektronike më pëlqeu butoni me një gjilpërë të gjatë dhe majat që vihen në këtë kunj. Këta butona përdoren për bashkim në tabelë. Gjithçka do të ishte mirë, por ata kanë një minus - goditja e ngutshme është shumë e vogël dhe e zhurmshme.
Më duhej të vendosja butonat në dy faza: e para ishte vendosja e butonave në tabelë, e dyta ishte montimi i kësaj dërrase në një tabelë tjetër. Dhe pastaj vendoseni të gjithë këtë në trup në udhëzues.

Kështu duket shalli me kopsa:



Kështu duket bordi:


Këtu mund të shihni udhëzuesit në të cilët është futur bordi me butona. Unë bashkova disa elementë për të ngurtësuar tabelën.

Tani vendosim gjithçka në trup
Pa butona lidhës:


Me lidhjen e butonave:

Mbyllni kutinë dhe ndizni. Gjithçka funksionon mirë, butonat funksionojnë ashtu siç duhet.

Në fund postoj një video të shkurtër të pajisjes në mënyra të ndryshme:
http://www.youtube.com/watch?v=KsiVaUWkXNA&feature=youtu.be
Për ata që nuk e shohin videon këtu, këtu është lidhja për të

Është koha për të përfunduar rishikimin.
Do të shkruaj pak për programin dhe më pas do të përfundoj shkurt. Kur shkrova programin, nuk e mendoja se do të kaloja shumë shpejt në një kufi prej 30720 bajte.


Më duhej të optimizoja kodin. Zhvendosën shumë pjesë kodi në nënprograme. Nuk do ta kisha menduar kurrë se një deklaratë switch ... case në një formë të përpiluar merr më shumë hapësirë ​​se disa nëse ... tjetër. Deklarimi i saktë i variablave gjithashtu kursen hapësirë. Nëse e deklaroni një varg të gjatë, megjithëse është mjaft e mundur të kaloni me bajt, atëherë tejkalimi i memories arrin 500 bajt, në varësi të madhësisë së grupit. Kur shkruani një program, nuk mendoni për të dhe vetëm më vonë, kur analizoni programin, kuptoni se i keni bërë disa gjëra gabim dhe filloni të optimizoni kodin. Pasi u zgjidhën problemet me madhësinë e programit, hasa në një kufizim të RAM-it. Kjo u shpreh në faktin se programi filloi të varej pas ngarkimit. Më duhej të futja një nënprogram për llogaritjen e RAM-it të lirë. Si rezultat, u detyrova të braktisja një algoritëm të parashikimit të motit, pasi ai duhet të shfaqë ikona në ekran. Vetë algoritmi funksionon, por prodhimi i ikonave duhej të rezervohej. Unë kam ende ide se si të optimizoj kodin, por në të ardhmen e afërt do ta lë pajisjen të funksionojë ashtu siç është në mënyrë që të vlerësoj performancën dhe të identifikoj të gjitha gabimet.

Tani disa përfundime
Minuset
1) Çmimi. Arsyetimi për këtë minus është se një hobi nuk është kurrë i lirë.

pro
1) Funksionalitet i madh i pajisjes
2) Zgjerimi i funksionit kufizohet vetëm nga kontrolluesi i përdorur dhe dëshira juaj
3) Kënaqësi estetike nga soditja dhe kënaqësi morale nga fakti që unë megjithatë e montova dhe përfundova këtë pajisje

Kam në plan të blej +86 Shto te të preferuarat I pëlqeu rishikimi +137 +304

“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 renditura 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 E drejta. Gjegjësisht, nga përshkrimi dhe dizajni i pajisjes së ardhshme "në leter" 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 në distancë 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.