Përmbajtje:

Termometër regjistrimi DIY me 2 sensorë: 3 hapa (me fotografi)
Termometër regjistrimi DIY me 2 sensorë: 3 hapa (me fotografi)

Video: Termometër regjistrimi DIY me 2 sensorë: 3 hapa (me fotografi)

Video: Termometër regjistrimi DIY me 2 sensorë: 3 hapa (me fotografi)
Video: BTT Manta M8P v2 - Basics with CB1 v2.2 2024, Korrik
Anonim
Termometër regjistrimi DIY me 2 sensorë
Termometër regjistrimi DIY me 2 sensorë
Termometër regjistrimi DIY me 2 sensorë
Termometër regjistrimi DIY me 2 sensorë

Ky projekt është një përmirësim i projektit tim të mëparshëm "Termometri i prerjes DIY". Ai regjistron matjet e temperaturës në një kartë mikro SD.

Ndryshimet e harduerit

Shtova një sensor të temperaturës DS18B20 në modulin e orës në kohë reale, ku ka dispozitë në tabelën e qarkut të shtypur për këtë pajisje; dhe shtoi telin e duhur nga kunja "DS" e RTC në D2 të Arduino.

Ndryshimet e softuerit

Pastaj shtova dhe ndryshova softuerin. Ndryshimet kryesore janë:

Ekrani LCD tregon dy temperatura "In" dhe "Out".

Skedarët e regjistrit të regjistruar në kartën SD kanë dy fusha të temperaturës, "temperatura brenda" dhe "temperatura jashtë".

Për shkak të regjistrimit më të gjatë në kartën SD, tamponët e punës për EEPROM ishin më të mëdhenj dhe si rezultat i kësaj fillova të kem probleme të konfliktit të kujtesës. Kam bërë një numër ndryshimesh që synojnë zvogëlimin e përdorimit të kujtesës dinamike, duke përfshirë përdorimin e vargjeve të karaktereve për të gjitha vargjet në vend të objektit String.

Pjesa e softuerit që merr temperaturat ka modifikime të mëdha, shumica e të cilave kanë të bëjnë me identifikimin se cila sondë është "brenda" dhe cila është "jashtë". Ky identifikim është kryesisht automatik. Nëse për ndonjë arsye sondat ndërrohen, mund të korrigjohet duke shkëputur sondën "jashtë" dhe pastaj duke e lidhur përsëri. Unë nuk e kam përjetuar këtë përmbysje vetë. Programuesi ose përdoruesi nuk kanë nevojë të shkruajnë adresat e sensorit, programi zbulon adresat e sensorit të temperaturës në vetvete.

Sipas testimit që kam bërë, identifikimi i sondave të temperaturës dhe përgjigja ndaj heqjes dhe zëvendësimit të kartës SD, ende funksionojnë pa probleme.

Hapi 1: Zhvillimi i softuerit

Ky hap ju jep softuerin e plotë për projektin e përfunduar. Unë e përpilova duke përdorur Arduino IDE 1.6.12. Përdor 21, 400 bajt memorie programi (69%) dhe 1, 278 bajt memorie dinamike (62%).

Unë kam vënë komente në kod me shpresën se do ta bëjnë të qartë se çfarë po ndodh.

Hapi 2: Puna me dy sensorë të temperaturës - detaje

Ky program përdor bibliotekën "OneWire". Nuk përdor asnjë "DallasTemperature" ose biblioteka të ngjashme. Në vend të kësaj komandat dhe të dhënat nga sensorët e temperaturës bëhen nga skica dhe mund të shihen dhe kuptohen fare lehtë. Kam gjetur një listë të dobishme të komandave të bibliotekës OneWire në

www.pjrc.com/teensy/td_libs_OneWire.html

Kur ka dy (ose më shumë) sensorë të temperaturës, bëhet e nevojshme të identifikohet se cili është cili.

I thirra dy sensorët e mi "brenda" dhe "jashtë", që është tipike për njësitë tregtare që kanë një sensor në modulin e ekranit i cili normalisht është "brenda", dhe sensorin tjetër në një kabllo në mënyrë që të mund të vendoset në anën tjetër të një muri të jashtëm dhe kështu të jetë "jashtë".

Qasja e zakonshme për identifikimin e sondave të ndryshme është zbulimi i adresave të pajisjes dhe vendosja e tyre në softuer së bashku me një etiketë identifikuese. Të gjitha projektet e tjera që kam parë përdorin këtë qasje, pavarësisht nëse përdorin apo jo bibliotekën DallasTemperature apo jo.

Synimi im ishte që programi kompjuterik duhet të identifikojë automatikisht sensorët dhe t'i ndajë ato në mënyrë "në" dhe "jashtë". Kjo është mjaft e lehtë për tu bërë duke i vendosur në kunja të veçanta Arduino. Në këtë projekt, A0 në A3 dhe A6 dhe A7 janë të gjithë të papërdorur, kështu që një nga këto mund të ishte përdorur në këtë rast. Sidoqoftë, unë arrita të punoja me identifikimin automatik me sensorët të dy në të njëjtin autobus OneWire.

Punon kështu.

Biblioteka OneWire ka një komandë "OneWireObject.search (adresa)" ku "adresa" është një grup prej 8 bajtësh dhe "OneWireObject" është emri i një shembulli të objektit OneWire që është krijuar më parë. Mund të ketë çdo emër që ju pëlqen. I imi quhet "ds". Kur lëshoni këtë komandë "kërkimi", biblioteka OneWire bën disa sinjalizime në autobusin me një tel. Nëse gjen një sensor që përgjigjet, ai kthen një vlerë boolean "TRUE" dhe plotëson grupin "adresa" me identifikuesin unik 8 bajt të sensorit. Ky identifikues përfshin një kod familjar (në fillim) dhe një shumë kontrolli (në fund). Në mes janë 6 bajtë që identifikojnë në mënyrë unike sensorin brenda familjes së tij.

Një rezultat (adresa dhe kthimi TRUE) merret sa herë që jepet kjo komandë, duke qarkulluar nëpër të gjitha pajisjet në autobusin OneWire. Pasi çdo pajisje të jetë përgjigjur, herën tjetër kur lëshohet "kërkimi", kthimi është "FALSE", duke treguar se çdo pajisje në autobus është përgjigjur tashmë. Nëse "kërkimi" lëshohet përsëri, pajisja e parë përgjigjet përsëri - dhe kështu me radhë për një kohë të pacaktuar. Pajisjet gjithmonë përgjigjen në të njëjtën mënyrë. Rendi i përgjigjeve bazohet në identifikuesit e pajisjeve në autobusin OneWire. Duket se është një kërkim binar duke filluar nga pjesët më pak të rëndësishme të identifikuesve të pajisjes. Protokolli i përdorur për të gjetur këta identifikues është mjaft kompleks dhe përshkruhet në faqet 51 - 54 të dokumentit "Libri i Standardeve të iButton", i cili është një dokument pdf në https://pdfserv.maximintegrated.com/en/an/AN937.pd …

E testova këtë proces kërkimi me 1 deri në 11 sensorë në një autobus të vetëm dhe zbulova se urdhri i përgjigjes për një grup të caktuar pajisjesh ishte gjithmonë i njëjtë, por kur shtova një pajisje të re në fund të autobusit, nuk kishte asnjë mënyrë Mund të parashikoja se ku do të shfaqet në rendin e kërkimit. Për shembull, sensori i 11 -të që shtova erdhi në pozicionin Nr.5; dhe sensori i parë që vura në autobus ishte larg i fundit në rendin e kërkimit.

Në këtë projekt me dy sensorë, njëri prej tyre është ngjitur në vend në modulin RTC; tjetra lidhet duke përdorur një kokë mashkullore në tabelë dhe një kokë femre në kabllo. Mund të shkëputet lehtësisht.

Kur sensori në kabllo (sensori "jashtë" është shkëputur, komanda "kërko" prodhon kthime alternative "TRUE" dhe "FALSE".

Kur sensori në kabllo është i bashkangjitur, komanda "kërko" prodhon një cikël me 3 faza, me dy "TRUE" dhe një "FALSE".

Procedura ime është të lëshoj 1, 2 ose 3 komanda "kërkimi", derisa të kthehet një rezultat FALSE. Pastaj lëshoj 2 komanda të tjera "kërkimi". Nëse e dyta dështon (dmth FALSE) e di që ka vetëm një sensor në autobus dhe se ai është sensori "in". Identiteti i pajisjes regjistrohet dhe i ndahet sensorit "in".

Në një kohë të mëvonshme, nëse kthimet e para dhe të dyta janë të VUERTETA, e di që ka dy sensorë në autobus. Unë kontrolloj se cili prej tyre ka një identitet të barabartë me sensorin "in" dhe e ndaj tjetrin si sensor "jashtë".

Pika tjetër e vogël është se mbledhja e rezultateve nga dy sensorët bëhet duke dërguar "konvertimin e fillimit" me atë që njihet si një komandë "kapërce ROM". Ne kemi mundësinë e dërgimit të komandave në një pajisje të vetme (duke përdorur identifikuesin e saj unik) ose në të gjitha pajisjet në autobus (kaloni ROM). Kodi duket kështu:

ds.reset (); //

// dërgoni komandën "kapërce ROM" (kështu që komanda tjetër punon në të dy sensorët) ds.write (0xCC); // Kalo komandën ROM ds.write (0x44, 0); // filloni konvertimin në të dy sondat temperature_state = prisni_konvertimin; // shkoni në gjendjen e vonuar

Kur të ketë kaluar koha e kërkuar e vonesës, temperaturat merren nga secili sensor individualisht. Këtu është kodi për sensorin e dytë (p.sh. sensori OUT).

nëse (flamuri2) {

prezent = ds.reset (); ds.zgjidh (DS18B20_addr_out); ds.shkruaj (0xBE); // Lexoni Scratchpad të të dhënave të sondës "jashtë" [0] = ds.read (); të dhënat [1] = ds.read (); temperature_out = (të dhëna [1] << 8) + të dhëna [0]; temperatura_out = (6 * temperatura_ jashtë) + temperatura_përtej / 4; // shumëzoni me 6.25} tjetër {// jo flag2 - dmth Sensori jashtë nuk është i lidhur temperatura_out = 30000; // rregulloni në 300.00 C nëse sensori i temperaturës nuk punon} // fundi i if (flag2)

Kam përpunuar shumicën e këtij programi në një skicë të pavarur që sapo kishte sensorë të temperaturës në të, pa ndërlikimet e mbështetjes së kartave LCD, RTC dhe SD. Ky skicë e zhvillimit është në skedarin më poshtë.

Hapi 3: Rezultatet paraprake

Rezultatet paraprake
Rezultatet paraprake

Kjo tabelë është një kombinim i dy ditëve të para të leximit.

Recommended: