Съдържание:

A Micro: битов Dive-O-Meter: 8 стъпки (със снимки)
A Micro: битов Dive-O-Meter: 8 стъпки (със снимки)

Видео: A Micro: битов Dive-O-Meter: 8 стъпки (със снимки)

Видео: A Micro: битов Dive-O-Meter: 8 стъпки (със снимки)
Видео: Беслан. Помни / Beslan. Remember (english & español subs) 2024, Юли
Anonim
A Micro: битов Dive-O-Meter
A Micro: битов Dive-O-Meter
A Micro: битов Dive-O-Meter
A Micro: битов Dive-O-Meter
A Micro: битов Dive-O-Meter
A Micro: битов Dive-O-Meter

Лятото е тук, времето му за басейн!

Добра възможност да изведете себе си и своя micro: bit навън, а в този случай дори в басейна.

Описаният тук micro: bit dive-o-meter е прост DIY дълбокомер, който ви позволява да измервате колко дълбоко сте или сте били гмуркане. Състои се само от micro: bit, батерия или LiPo, ръбен конектор за micro: bit, датчик за барометрично налягане BMP280 или BME280 и някои джъмперни кабели. Използването на околната среда на Pimoroni: bit does прави нещата все по -опростени. Всичко това е опаковано в два слоя водонепроницаеми прозрачни пластмасови или силиконови торбички, с добавени тежести за компенсиране на силата на плаване.

Това е приложение на микро: битовото сензорно устройство, което описах в предишна инструкция.

Можете да използвате устройството e. g. за състезания по гмуркане с приятели и семейство или за да разберете колко дълбоко е езерото. Тествах го с помощта на най -дълбокия басейн в моя квартал и установих, че работи поне на дълбочина 3,2 метра. Около пет метра е теоретичният максимум. Досега не съм тествал прецизността му в никакви подробности, но отчетените числа бяха поне в очакваните граници.

Някои забележки: Това не е инструмент за истински водолази. Вашият micro: bit ще се повреди, ако се намокри. Използвате тази инструкция на свой собствен риск.

Актуализация 27 май: Сега можете да намерите MakeCode HEX-скрипт, който можете да заредите директно във вашия micro: bit. Вижте стъпка 6. Актуализиране на 13 юни: Добавена е Enviro: bit и версия на кабел. Вижте стъпки 7 и 8

Стъпка 1: Теорията зад устройството

Живеем на дъното на въздушен океан. Налягането тук е около 1020 hPa (хектопаскал), тъй като теглото на въздушната колона тук в космоса е около 1 кг на квадратен сантиметър.

Плътността на водата е много по-висока, тъй като един литър въздух тежи около 1,2 g и един литър вода 1 kg, тоест около 800 пъти. Тъй като спадът на барометричното налягане е около 1 hPa на всеки 8 метра височина, увеличаването на налягането е 1 hPa за всеки сантиметър под повърхността на водата. На дълбочина около 10 m налягането е 2000 hPa, или две атмосфери.

Използваният тук сензор за налягане има диапазон на измерване между 750 и 1500 hPa при разделителна способност около един hPa. Това означава, че можем да измерваме дълбочини до 5 метра при разделителна способност около 1 см.

Устройството ще бъде дълбокомер тип Бойл Мариот. Сглобяването му е доста просто и е описано в по -късна стъпка. Сензорът използва протокола I2C, така че крайният конектор за micro: bit е удобен. Най -критичната част са водонепроницаемите торбички, тъй като всяка влажност ще повреди micro: bit, сензора или батерията. Тъй като част от въздуха ще бъде задържан вътре в торбите, добавянето на тежести помага да се компенсира плаващата сила.

Стъпка 2: Използване на устройството

Използване на Устройството
Използване на Устройството
Използване на Устройството
Използване на Устройството
Използване на Устройството
Използване на Устройството
Използване на Устройството
Използване на Устройството

Скриптът, както е показано подробно на по -късна стъпка, е вариант на скрипт, който разработих по -рано за измервател на налягане. За да тествате устройството, можете да използвате простата камера за налягане, описана там.

За целите на гмуркане той показва дълбочината в метри, изчислена от измерванията на налягането, или като гистограма на стъпки от 20 см или, при поискване, в цифри.

Използвайки бутона A на micro: бита, ще зададете текущото налягане като референтна стойност на налягането. За да потвърдите въвеждането, матрицата мига веднъж.

Можете да използвате това или да видите колко дълбоко се гмуркате, или да запишете колко дълбоко сте се гмуркали.

В първия случай задайте текущото налягане на външния въздух като еталон. Във втория случай задайте налягането в най -дълбоката точка, където сте като еталон на налягане, което след това ви позволява да покажете колко дълбоко сте били, когато се върнете на повърхността. Бутон В показва дълбочината, изчислена от разликата в налягането, като числова стойност в метри.

Стъпка 3: Необходими материали

Необходими материали
Необходими материали
Необходими материали
Необходими материали
Необходими материали
Необходими материали

Микро: бит. Напр. на 13 GBP/16 Евро в Pimoroni UK/DE.

Краен конектор (Kitronic или Pimoroni), 5 GBP. Използвах версията Kitronic.

BMP/BME280 сензор. Използвах сензор BMP280 от Banggood, 4.33 евро за три единици.

Кабелни съединители за свързване на сензора и крайния конектор.

Отлична алтернатива на горната комбинация от конектор/сензор по -горе може да бъде Pimoroni enviro: bit (досега не е тествано, вижте последната стъпка).

Батерия или LiPo за micro: bit.

Захранващ кабел с превключвател (по избор, но полезен). Изчистете водонепроницаемите торби. Използвах силиконова торбичка за мобилен телефон и една или две малки торбички с цип. Уверете се, че материалът е достатъчно дебел, така че щифтовете на крайния конектор няма да повредят чантите.

Някои тежести. Използвах парчета оловно тегло, които се използват за риболов.

Arduino IDE и няколко библиотеки.

Стъпка 4: Монтаж

Монтаж
Монтаж
Монтаж
Монтаж
Монтаж
Монтаж
Монтаж
Монтаж

Инсталирайте Arduino IDE и необходимите библиотеки. Подробностите са описани тук.

(Не се изисква за скрипта MakeCode.) Като се има предвид, че използвате крайния конектор Kitronik, запоявайте щифтовете към I2C портовете 19 и 20. Това не е необходимо за крайния конектор на Pimoroni. Запоявайте заглавката към избухването на сензора и свържете сензора и крайния конектор с помощта на джъмперни кабели. Свържете VCC към 3V, GND към 0 V, SCL към порт 19 и SDA към порт 20. Алтернативно запоявайте кабелите директно към пробива. Свържете micro: bit към нашия компютър чрез USB кабел. Отворете предоставения скрипт и го прехвърлете в micro: bit. Използвайте серийния монитор или плотера, проверете дали сензорът дава разумни данни. Изключете micro: bit от компютъра. Свържете батерията или LiPo към micro: бита. Натиснете бутон B, прочетете стойността Натиснете бутона A. Натиснете бутона B, прочетете стойността. Поставете устройството в два слоя херметически затворени торби, оставяйки само много малко въздух в торбите. В този случай поставете тежест, за да компенсирате силата на плаваемостта. Проверете дали всичко е водонепроницаемо. Отидете до басейна и играйте.

Стъпка 5: Скриптът на MicroPython

Скриптът просто взема стойността на налягането от сензора, сравнява я с референтната стойност и след това изчислява дълбочината от разликата. За показване на стойностите като стълбовидна графика се вземат цяло число и остатъчна част от стойността на дълбочината. Първият дефинира височината на линията. Остатъкът е разделен на пет контейнера, които определят дължината на прътите. Най -горното ниво е 0 - 1 м, най -ниското 4 - 5 м. Както бе споменато по -горе, натискането на бутон А задава референтното налягане, бутон В показва "относителната дълбочина" в метри, показана като числова стойност. Понастоящем отрицателните и положителните стойности са представени като барграф на LED матрицата по същия начин. Чувствайте се свободни да оптимизирате скрипта за вашите нужди. Можете да включите определени редове, за да представите стойностите на серийния монитор или плотер на Arduino IDE. За да подражавате на функцията, можете да изградите устройството, което описах в предишна инструкция.

Не съм написал частта от скрипта, която чете сензора. Не съм сигурен за източника, но обичам да благодаря на авторите. Всякакви корекции или съвети за оптимизация са добре дошли.

#включва

#include Adafruit_Microbit_Matrix microbit; #define BME280_ADDRESS 0x76 unsigned long int hum_raw, temp_raw, pres_raw; подписан дълъг int t_fine; uint16_t dig_T1; int16_t dig_T2; int16_t dig_T3; uint16_t dig_P1; int16_t dig_P2; int16_t dig_P3; int16_t dig_P4; int16_t dig_P5; int16_t dig_P6; int16_t dig_P7; int16_t dig_P8; int16_t dig_P9; int8_t dig_H1; int16_t dig_H2; int8_t dig_H3; int16_t dig_H4; int16_t dig_H5; int8_t dig_H6; двоен press_norm = 1015; // начална стойност двойна дълбочина; // изчислена дълбочина // -------------------------------------------- -------------------------------------------------- ---------------------- void setup () {uint8_t osrs_t = 1; // Температурна свръхпроба x 1 uint8_t osrs_p = 1; // Свръхпроба на налягане x 1 uint8_t osrs_h = 1; // Свръхдискретизация на влажност x 1 режим uint8_t = 3; // Нормален режим uint8_t t_sb = 5; // Tstandby 1000ms uint8_t филтър = 0; // Филтриране на uint8_t spi3w_en = 0; // 3-жилен SPI Деактивиране на uint8_t ctrl_meas_reg = (osrs_t << 5) | (osrs_p << 2) | режим; uint8_t config_reg = (t_sb << 5) | (филтър << 2) | spi3w_en; uint8_t ctrl_hum_reg = osrs_h; pinMode (PIN_BUTTON_A, INPUT); pinMode (PIN_BUTTON_B, INPUT); Serial.begin (9600); // задаване на скорост на сериен порт Serial.print ("Налягане [hPa]"); // заглавка за сериен изход Wire.begin (); writeReg (0xF2, ctrl_hum_reg); writeReg (0xF4, ctrl_meas_reg); writeReg (0xF5, config_reg); readTrim (); // microbit.begin (); // microbit.print ("x"); забавяне (1000); } // ----------------------------------------------- ---------------------------------------------- void loop () {double temp_act = 0.0, press_act = 0.0, hum_act = 0.0; подписан дълъг int temp_cal; unsigned long int press_cal, hum_cal; int N; int М; двоен press_delta; // относително налягане int дълбочина_m; // дълбочина в метри, цяло число двойна дълбочина_cm; // остатък в см readData (); // temp_cal = calibration_T (temp_raw); press_cal = calibration_P (pres_raw); // hum_cal = calibration_H (hum_raw); // temp_act = (double) temp_cal / 100.0; press_act = (двойно) press_cal / 100.0; // hum_act = (двойно) hum_cal / 1024.0; microbit.clear (); // нулиране на LED матрицата // Бутон А задава действителната стойност като референтна (P нула) // Бутон В показва текущата стойност като дълбочина в метри (изчислена от разликата в налягането) ако (! digitalRead (PIN_BUTTON_A)) {// задава нормално въздушно налягане като нула press_norm = press_act; // microbit.print ("P0:"); // microbit.print (press_norm, 0); // microbit.print ("hPa"); microbit.fillScreen (LED_ON); // мига веднъж за потвърждение на забавяне (100); } else if (! digitalRead (PIN_BUTTON_B)) {// показва дълбочина в метри microbit.print (дълбочина, 2); microbit.print ("m"); // Serial.println (""); } else {// изчислява дълбочината от разликата в налягането press_delta = (press_act - press_norm); // изчисляваме дълбочината на относителното налягане = (press_delta/100); // дълбочина в метри дълбочина_m = int (abs (дълбочина)); // дълбочина im метри дълбочина_cm = (abs (дълбочина) - дълбочина_m); // остатък /* // използван за разработка Serial.println (дълбочина); Serial.println (дълбочина_m); Serial.println (дълбочина_см); */ // Стъпки за барграф if (дълбочина_см> 0,8) {// зададена дължина на барове (N = 4); } else if (дълбочина_см> 0,6) {(N = 3); } else if (дълбочина_см> 0,4) {(N = 2); } else if (дълбочина_см> 0,2) {(N = 1); } else {(N = 0); }

if (дълбочина_m == 4) {// задайте ниво == метър

(М = 4); } иначе ако (дълбочина_m == 3) {(M = 3); } иначе ако (дълбочина_m == 2) {(M = 2); } иначе ако (дълбочина_m == 1) {(M = 1); } else {(M = 0); // горен ред} /* // използва се за целите на разработката Serial.print ("m:"); Serial.println (дълбочина_m); Serial.print ("cm:"); Serial.println (дълбочина_см); Serial.print ("M:"); Serial.println (M); // за целите на разработката Serial.print ("N:"); Serial.println (N); // за целите на развитието забавяне (500); */ // изчертайте барграф microbit.drawLine (0, M, N, M, LED_ON); }

// изпраща стойност към сериен порт за плотер

Serial.print (press_delta); // изчертаване на индикаторни линии и коригиране на показания диапазон Serial.print ("\ t"); Serial.print (0); Serial.print ("\ t"); Serial.print (-500); Serial.print ("\ t"); Serial.println (500); забавяне (500); // Измерване два пъти в секунда} // ----------------------------------------- -------------------------------------------------- -------------------------------------------------- -------- // за сензора bmp/bme280 се изисква следното, запазете като невалидно readTrim () {uint8_t данни [32], i = 0; // Fix 2014/Wire.beginTransmission (BME280_ADDRESS); Wire.write (0x88); Wire.endTransmission (); Wire.requestFrom (BME280_ADDRESS, 24); // Fix 2014/while (Wire.available ()) {data = Wire.read (); i ++; } Wire.beginTransmission (BME280_ADDRESS); // Добавяне 2014/Wire.write (0xA1); // Добавяне 2014/Wire.endTransmission (); // Добавяне на 2014/Wire.requestFrom (BME280_ADDRESS, 1); // Добавяне на 2014/данни = Wire.read (); // Добавяне на 2014/i ++; // Добавяне на 2014/Wire.beginTransmission (BME280_ADDRESS); Wire.write (0xE1); Wire.endTransmission (); Wire.requestFrom (BME280_ADDRESS, 7); // Fix 2014/while (Wire.available ()) {data = Wire.read (); i ++; } dig_T1 = (данни [1] << 8) | данни [0]; dig_P1 = (данни [7] << 8) | данни [6]; dig_P2 = (данни [9] << 8) | данни [8]; dig_P3 = (данни [11] << 8) | данни [10]; dig_P4 = (данни [13] << 8) | данни [12]; dig_P5 = (данни [15] << 8) | данни [14]; dig_P6 = (данни [17] << 8) | данни [16]; dig_P7 = (данни [19] << 8) | данни [18]; dig_T2 = (данни [3] << 8) | данни [2]; dig_T3 = (данни [5] << 8) | данни [4]; dig_P8 = (данни [21] << 8) | данни [20]; dig_P9 = (данни [23] << 8) | данни [22]; dig_H1 = данни [24]; dig_H2 = (данни [26] << 8) | данни [25]; dig_H3 = данни [27]; dig_H4 = (данни [28] << 4) | (0x0F & данни [29]); dig_H5 = (данни [30] 4) & 0x0F); // Fix 2014/dig_H6 = данни [31]; // Поправете 2014/} void writeReg (uint8_t reg_address, uint8_t data) {Wire.beginTransmission (BME280_ADDRESS); Wire.write (reg_address); Wire.write (данни); Wire.endTransmission (); } void readData () {int i = 0; uint32_t данни [8]; Wire.beginTransmission (BME280_ADDRESS); Wire.write (0xF7); Wire.endTransmission (); Wire.requestFrom (BME280_ADDRESS, 8); while (Wire.available ()) {данни = Wire.read (); i ++; } pres_raw = (данни [0] << 12) | (данни [1] 4); temp_raw = (данни [3] << 12) | (данни [4] 4); hum_raw = (данни [6] 3) - ((подписан дълъг int) dig_T1 11; var2 = (((((adc_T >> 4) - ((подписан дълъг int) dig_T1)) * ((adc_T >> 4) - ((подписан дълъг int) dig_T1))) >> 12) * ((подписан дълъг int) dig_T3)) >> 14; t_fine = var1 + var2; T = (t_fine * 5 + 128) >> 8; връщане T; } unsigned long int calibration_P (подписано long int adc_P) {подписано long int var1, var2; беззнаково дълго int P; var1 = (((подписано дълго int) t_fine) >> 1) - (подписано дълго int) 64000; var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * ((подписан дълъг int) dig_P6); var2 = var2 + ((var1 * ((подписан дълъг int) dig_P5)) 2) + (((подписан дълъг int) dig_P4) 2) * (var1 >> 2)) >> 13)) >> 3) + ((((подписан дълъг int) dig_P2) * var1) >> 1)) >> 18; var1 = (((((32768+var1))**((подписан дълъг int) dig_P1)) >> 15); if (var1 == 0) {връщане 0; } P = (((unsigned long int) ((((long long int подписан) 1048576) -adc_P)-(var2 >> 12)))*3125; if (P <0x80000000) {P = (P << 1) / ((unsigned long int) var1); } else {P = (P / (unsigned long int) var1) * 2; } var1 = ((((подписан дълъг int) dig_P9) * ((подписан дълъг int) (((P >> 3) * (P >> 3)) >> 13))) >> 12; var2 = (((подписан дълъг int) (P >> 2)) * ((подписан дълъг int) dig_P8)) >> 13; P = (unsigned long int) ((long long int с подпис) P + ((var1 + var2 + dig_P7) >> 4)); връщане P; } unsigned long int calibration_H (подписано long int adc_H) {подписано long int v_x1; v_x1 = (t_fine - ((подписан дълъг int) 76800)); v_x1 = ((((((adc_H << 14) -(((подписан дълъг int) dig_H4) 15) * ((((((v_x1 * ((подписан дълъг int) dig_H6)) >> 10) * (((v_x1 * ((подписан дълъг int) dig_H3)) >> 11) + ((подписан дълъг int) 32768))) >> 10) + ((подписан дълъг int) 2097152)) * ((подписан дълъг int) dig_H2) + 8192) >> 14)); v_x1 = (v_x1 - (((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((подписан дълъг int) dig_H1)) >> 4)); v_x1 = (v_x1 419430400? 419430400: v_x1); return (без подпис дълъг int) (v_x1 >> 12);

Стъпка 6: Голямо опростяване: MakeCode/JavaScript кодът

Основно опростяване: MakeCode/JavaScript кодът
Основно опростяване: MakeCode/JavaScript кодът
Основно опростяване: MakeCode/JavaScript кодът
Основно опростяване: MakeCode/JavaScript кодът

През май 2018 г. Pimoroni пусна enviro: bit, който идва със сензор за налягане/влажност/температура BME280, сензор за светлина и цвят TCS3472 и MEMS микрофон. Освен това те предлагат JavaScript библиотека за редактора MakeCode и библиотека MicroPython за тези сензори.

Използвах тяхната библиотека MakeCode за разработване на скриптове за моето устройство. В прикачен файл намирате съответните шестнадесетични файлове, които можете да копирате директно във вашия micro: bit.

По -долу ще намерите съответния код на JavaScript. Тестването в пула работи добре с по -ранна версия на скрипта, така че предполагам, че и те ще работят. В допълнение към основната версия с барграф, има и версия с кръстосан шрифт (X) и L-версия, предназначени да улеснят четенето, особено при условия на слаба светлина. Изберете този, който предпочитате.

нека колона = 0

нека Meter = 0 нека остане = 0 нека Row = 0 нека Delta = 0 нека Ref = 0 нека Is = 0 Is = 1012 basic.showLeds (` # # # # # # #… # #. #. #. #… # # # # # # # `) Ref = 1180 basic.clearScreen () basic.forever (() => {basic.clearScreen () if (input.buttonIsPressed (Button. A)) {Ref = envirobit.getPressure () basic.showLeds (` #. #. #. #. #. #. # # # # #. #. #. #. #. #. #`) basic.pause (1000)} else if (input.buttonIsPressed (Button. B)) {basic.showString ("" + Row + "." + continue + "m") basic.pause (200) basic.clearScreen ()} else {Is = envirobit.getPressure () Delta = Is - Ref Meter = Math.abs (Delta) if (Meter> = 400) {Row = 4} else if (Meter> = 300) {Row = 3} else if (Meter> = 200) {Row = 2} else if (Meter> = 100) {Ред = 1} иначе {ред = 0} остават = метър - ред * 100 ако (остане> = 80) {колона = 4} иначе ако (остане> = 60) {колона = 3} иначе ако (остане> = 40) {Column = 2} else if (continue> = 20) {Column = 1} else {Column = 0} for (нека ColA = 0; ColA <= Column; ColA ++) {led.plot (C olA, ред)} basic.pause (500)}})

Стъпка 7: Enviro: битова версия

Enviro: битова версия
Enviro: битова версия
Enviro: битова версия
Enviro: битова версия
Enviro: битова версия
Enviro: битова версия

Междувременно получих enviro: bit (20 GBP) и power: bit (6 GBP), и двете от Pimoroni.

Както бе споменато по -рано, enviro: bit идва с BME280 сензор за налягане, влажност и температура, но също така и сензор за светлина и цвят (вижте приложението тук) и MEMS микрофон.

Power: bit е хубаво решение за захранване на micro: bit и се предлага с превключвател за включване/изключване.

Страхотното е, че и двете са само щракване и използване, без запояване, кабели, дъски. Добавете enviro: bit към micro: bit, заредете кода си в micro: bit, използвайте го.

В този случай използвах micro, power и enviro: bit, поставих ги в торба Ziploc, поставих я в прозрачна водонепроницаема пластмасова торбичка за мобилни телефони, готова. Много бързо и подредено решение. Вижте снимките. Превключвателят е достатъчно голям, за да го използва през защитните слоеве.

Тестван е във вода, работи добре. На дълбочина около 1,8 м измерената стойност беше около 1,7 м. Не е лошо за бързо и евтино решение, но далеч не е перфектно. Регулирането отнема известно време, така че може да се наложи да останете на определена дълбочина за около 10-15 секунди.

Стъпка 8: Версия на сонда за кабел и сензор

Версия на сонда за кабел и сензор
Версия на сонда за кабел и сензор
Версия на сонда за кабел и сензор
Версия на сонда за кабел и сензор

Това всъщност беше първата идея за микро: битов дълбокомер, последната за изграждане.

Тук запоях сензора BMP280 към 5 м от 4-жичен кабел и поставих женския джъмпер в другия край. За да предпази сензора от вода, кабелът се прокарва през използван винен корк. Краищата на тапата бяха запечатани с горещо лепило. Преди да изрежа две прорези в корка, и двата да го заобиколят. След това опаковах сензора в топка с гъба, поставих балон около него и фиксирах края на балона върху тапата (долния прорез). след това поставих 3 40 g парчета оловни тежести във втори балон, увих го около първия, тежести, поставени от външната страна, и фиксирах края на балона на втория прорез. Въздухът беше отстранен от втория балон, след което всичко беше фиксирано с тиксо. Вижте изображения, може да последват по -подробни.

Джъмперите бяха свързани към micro: bit чрез ръбов конектор, устройството се включи и беше зададено референтното налягане. След това сензорната глава се освобождава бавно към дъното на басейна (10 м скачаща кула, дълбочина около 4,5 м).

Резултати:

За мое учудване, той работеше дори с този дълъг кабел. От друга страна, но не е изненадващо, грешката при измерването изглежда е станала по -голяма при по -високи налягания, а приблизителна дълбочина от 4 m се отчита като около 3 m.

Потенциални приложения:

С някои корекции на грешки устройството може да се използва за измерване на дълбочина до около 4 m.

В комбинация с Arduino или Raspberry Pi, това може да се използва за измерване и контрол на точката на пълнене на басейн или резервоар за вода, напр. да предизвика предупреждение, ако нивата на водата надвишат или подлежат на определени прагове.

Външно фитнес предизвикателство
Външно фитнес предизвикателство
Външно фитнес предизвикателство
Външно фитнес предизвикателство

Вицешампион във фитнес предизвикателството на открито

Препоръчано: