Съдържание:

Измерете налягането с вашия микро: бит: 5 стъпки (със снимки)
Измерете налягането с вашия микро: бит: 5 стъпки (със снимки)

Видео: Измерете налягането с вашия микро: бит: 5 стъпки (със снимки)

Видео: Измерете налягането с вашия микро: бит: 5 стъпки (със снимки)
Видео: Ангел Бэби Новые серии - Игра окончена (29 серия) Поучительные мультики для детей 2024, Юли
Anonim
Измерете налягането с вашия Micro: бит
Измерете налягането с вашия Micro: бит
Измерете налягането с вашия Micro: бит
Измерете налягането с вашия Micro: бит

Следващата инструкция описва лесно за изграждане и евтино устройство за извършване на измервания на налягане и демонстрира закона на Бойл, използвайки micro: bit в комбинация с BMP280 сензор за налягане/температура.

Докато тази комбинация от спринцовка/сензор за налягане вече е описана в една от предишните ми инструкции, комбинацията с micro: bit предлага нови възможности, напр. за проекти на класни стаи.

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

Устройството позволява да се извършват количествени измервания на въздушното налягане и да се показват резултатите на micro: bit LED масив или на свързан компютър, за по -късно използване на серийния монитор или функциите на серийния плотер на Arduino IDE. Освен това имате хаптична обратна връзка, тъй като сами ще натискате или дърпате буталото на спринцовката и по този начин усещате необходимата мощност.

По подразбиране дисплеят ви позволява да оцените налягането чрез индикатора за ниво, показан на LED матрицата. Серийният плотер на Arduino IDE позволява да се направи същото, но с много по -добра разделителна способност (вижте видеото). Предлагат се и по -сложни решения, напр. на езика за обработка. Можете също така да показвате точните измерени стойности на налягане и температура на LED матрицата след натискане съответно на бутоните A или B, но серийният монитор на Arduino IDE е много по -бърз, което позволява да се показват стойности в почти реално време.

Общите разходи и техническите умения, необходими за изграждането на устройството, са доста ниски, така че може да бъде хубав проект в класната стая под наблюдението на учител. Освен това устройството може да бъде инструмент за STEM проекти с акцент върху физиката или да се използва в други проекти, при които сила или тегло трябва да се трансформират в цифрова стойност.

Принципът беше използван за конструирането на много прост микро: битов дайв-о-метър, устройство за измерване на това колко дълбоко се гмуркате.

Допълнение 27-май-2018:

Тъй като Pimoroni разработи библиотека MakeCode за сензора BMP280, това ми даде възможност да разработя скрипт, който да се използва за описаното тук устройство. Скриптът и съответният HEX-файл могат да бъдат намерени в последната стъпка на тази инструкция. За да го използвате, просто заредете HEX файла във вашия micro: bit. Няма нужда от специален софтуер и можете да използвате онлайн редактора на MakeCode за редактиране на скрипта.

Стъпка 1: Използвани материали

Използвани материали
Използвани материали
Използвани материали
Използвани материали
Използвани материали
Използвани материали
Използвани материали
Използвани материали
  • Микро: бит, взех моя от Пиморони - 13,50 GBP
  • Kitronic Edge Connector за micro: bit - чрез Pimoroni - 5 GBP, Забележка: Pimorini вече предлага удобен за конектор ръб, наречен pin: bit с щифтове на I2C портовете.
  • 2 x 2 пинови ленти за заглавки
  • Батерия или LiPo за микро: бит (не е необходимо, но полезно), кабел на батерията с превключвател (dito) - Pimoroni
  • джъмперни кабели за свързване на сензори към Edge конектор
  • дълги (!) джъмперни кабели за сензора, поне толкова дълги, колкото спринцовката,, f/f или f/m
  • BMP280 сензор за налягане и температура - Banggood - 5 US $ за три единици Обхватът на измерване за този сензор е между 550 и 1537 hPa.
  • 150 ml пластмасова спринцовка за катетър с гумено уплътнение - Amazon или магазини за хардуер и градина - около 2 - 3 US $
  • пистолет за горещо лепило/горещо лепило
  • поялник
  • компютър с инсталирана Arduino IDE

Стъпка 2: Инструкции за сглобяване

Инструкции за сглобяване
Инструкции за сглобяване
Инструкции за сглобяване
Инструкции за сглобяване
Инструкции за сглобяване
Инструкции за сглобяване

Запоявайте заглавки към пробив на сензора BMP280.

Запояйте двата 2 -пинови заглавия към щифтовете 19 и щифт 20 на конектора Edge (вижте изображението).

Свържете micro: bit към конектора Edge и компютъра.

Подгответе софтуер и micro: bit, както е описано в инструкциите за Adafruit micro: bit. Прочетете ги внимателно.

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

Отворете скрипта BMP280, прикачен в по -късна стъпка.

Свържете сензора към конектора Edge. GND до 0V, VCC до 3V, SCL към пин 19, SDA към пин 20.

Качете скрипта в micro: bit.

Проверете дали сензорът дава разумни данни, стойностите на налягането трябва да са около 1020 hPa, показани на серийния монитор. В случай, че първо проверете кабелите и връзките, след това инсталирането на софтуера и коригирайте.

Изключете micro: bit, премахнете сензора.

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

Свържете сензора към кабелите на джъмпера. Проверете дали връзките са правилни и добри. Свържете се към micro: bit.

Проверете дали сензорът работи правилно. Внимателно издърпайте кабелите, преместете сензора в горната част на спринцовката.

Поставете буталото и го преместете малко по -далеч от желаното положение за почивка (100 ml).

Добавете горещо лепило към края на отвора на спринцовката и преместете буталото малко назад. Проверете дали спринцовката е затворена херметически, в противен случай добавете още горещо лепило. Оставете горещото лепило да се охлади.

Проверете отново дали сензорът работи. Ако преместите буталото, цифрите в серийния монитор и дисплея на micro: bit трябва да се променят.

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

Стъпка 3: Малко теория и някои практически измервания

Малко теория и някои практически измервания
Малко теория и някои практически измервания
Малко теория и някои практически измервания
Малко теория и някои практически измервания

С описаното тук устройство можете да демонстрирате връзката на компресията и налягането в прости физически експерименти. Тъй като спринцовката се предлага с мащаб "ml", дори количествени експерименти са лесни за извършване.

Теорията зад него: Според закона на Бойл [Обем * Налягане] е постоянна стойност за газ при дадена температура.

Това означава, че ако компресирате даден обем газ N-кратно, т.е. крайният обем е 1/N кратно на оригинала, неговото налягане ще се увеличи N-пъти, като: P0*V0 = P1*V1 = cons t. За повече подробности, моля, разгледайте статията в Уикипедия за газовите закони. На морското равнище барометричното налягане обикновено е в диапазона от 1010 hPa (хектопаскал).

Така че започвайки от точки за почивка на напр. V0 = 100 ml и P0 = 1000 hPa, компресията на въздуха до около 66 ml (т.е. V1 = 2/3 * V0) ще доведе до налягане от около 1500 hPa (P1 = 3/2 от P0). Издърпването на буталото до 125 ml (5/4 кратен обем) води до налягане от около 800 hPa (4/5 налягане). Измерванията са удивително прецизни за такова просто устройство.

Устройството ви позволява да имате директно хаптично впечатление колко сила е необходима за компресиране или разширяване на относително малкото количество въздух в спринцовката.

Но също така можем да извършим някои изчисления и да ги проверим експериментално. Да приемем, че компресираме въздуха до 1500 hPa, при базално барометрично налягане 1000 hPa. Така че разликата в налягането е 500 hPa, или 50 000 Pa. За моята спринцовка диаметърът (d) на буталото е около 4 cm или 0,04 метра.

Сега можете да изчислите силата, необходима за задържане на буталото в това положение. Като се има предвид P = F/A (налягането е сила разделена на площ) или трансформирано F = P*A. Единицата SI за сила е "Нютон" N, за дължина "Метър" m, а 1 Pa е 1N на квадратен метър. За кръгло бутало площта може да бъде изчислена с помощта на A = ((d/2)^2)*pi, което дава 0,00125 квадратни метра за спринцовката ми. Така

50 000 Pa * 0,00125 m^2 = 63 N.

На Земята 1 N корелира с тегло от 100 gr, така че 63 N е равно на задържане на тегло от 6,3 kg.

Това може да се провери лесно с помощта на скала. Натиснете спринцовката с буталото върху скалата, докато се достигне налягане от около 1500 hPa, след което прочетете скалата. Или натискайте, докато везната покаже около 6-7 кг, след това натиснете бутона „А“и прочетете стойността, показана на светодиодната матрица на micro: bit. Както се оказа, оценката въз основа на горните изчисления не беше лоша. Налягане малко над 1500 hPa корелира с показаното „тегло“от около 7 kg по телесна скала (вижте изображенията). Можете също така да обърнете тази концепция и да използвате устройството за изграждане на проста цифрова скала въз основа на измервания на налягането.

Моля, имайте предвид, че горната граница на сензора е около 1540 hPa, така че всяко налягане над това не може да бъде измерено и може да повреди сензора.

Освен за образователни цели, системата може да се използва и за някои приложения в реалния свят, тъй като тя позволява количествено измерване на силите, които се опитват да преместят буталото по един или друг начин. Така че можете да измерите тежест, поставена върху буталото, или сила на удар, която удря буталото. Или изградете превключвател, който активира светлина или зумер или възпроизвежда звук след достигане на определена прагова стойност. Или можете да изградите музикален инструмент, който променя честотата в зависимост от силата на сила, приложена към буталото. Или го използвайте като контролер на играта. Използвайте въображението си и играйте!

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

Прикачен ще намерите моя BMP280 скрипт за micro: bit. Това е производно на скрипт BMP/BME280, който намерих някъде на уебсайта на Banggood, комбиниран с библиотеката Microbit на Adafruit. Първият ви позволява да използвате сензора Banggood, вторият опростява работата с 5x5 LED дисплея. Благодаря на разработчиците и на двете.

По подразбиране скриптът показва резултатите от измерванията на налягането в 5 стъпки на микро: битовия 5x5 LED дисплей, което позволява да се видят промените с малко забавяне. Точните стойности могат да бъдат показани паралелно на серийния монитор на Arduino IDE или по -подробна графика може да бъде показана на серийния плотер на Arduino IDE.

Ако натиснете бутона A, измерените стойности на налягането се извеждат на матрицата 5x5 LED на micro: bit. Ако натиснете бутона B, се показват температурните стойности. Макар че това позволява да се четат точните данни, значително забавя измервателните цикли.

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

#включва xxx

#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; // контейнери за измерени стойности int value0; int стойност1; int стойност2; int стойност3; int стойност4; // ------------------------------------------------ -------------------------------------------------- ------------------ 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.println ("Температура [градуса C]"); // Serial.print ("\ t"); 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; // задаване на прагови стойности за LED матричен дисплей, в hPa double max_0 = 1100; двоен макс_1 = 1230; двоен макс_2 = 1360; двоен макс_3 = 1490; readData (); temp_cal = calibration_T (temp_raw); press_cal = calibration_P (pres_raw); hum_cal = calibration_H (hum_raw); temp_act = (двойно) temp_cal / 100.0; press_act = (двойно) press_cal / 100.0; hum_act = (двойно) hum_cal / 1024.0; microbit.clear (); // нулиране на LED матрица /* Serial.print ("PRESS:"); Serial.println (press_act); Serial.print ("hPa"); Serial.print ("TEMP:"); Serial.print ("\ t"); Serial.println (temp_act); */ if (! digitalRead (PIN_BUTTON_B)) {// показването на стойности в числа забавя измерването на кръгове microbit.print ("T:"); microbit.print (temp_act, 1); microbit.print ("'C"); // Serial.println (""); } else if (! digitalRead (PIN_BUTTON_A)) {microbit.print ("P:"); microbit.print (press_act, 0); microbit.print ("hPa"); } else {// показване на стойностите на налягането като пиксели или линии на определено ниво // 5 стъпки: 1490 hPa // прагове, определени от max_n стойностите if (press_act> max_3) {(N = 0); // горен ред} else if (press_act> max_2) {(N = 1); } else if (press_act> max_1) {(N = 2); } else if (press_act> max_0) {(N = 3); } else {(N = 4); // основен ред} // Serial.println (N); // за целите на разработката // microbit.print (N); // като линия // microbit.drawLine (N, 0, 0, 4, LED_ON); // преместване на стойности към следващия ред стойност4 = стойност3; стойност3 = стойност2; стойност2 = стойност1; стойност1 = стойност0; стойност0 = N; // изчертаване на изображение, колона по колона microbit.drawPixel (0, value0, LED_ON); // като Pixel: колона, ред. 0, 0 ляв горен ъгъл microbit.drawPixel (1, стойност1, LED_ON); microbit.drawPixel (2, стойност2, LED_ON); microbit.drawPixel (3, стойност3, LED_ON); microbit.drawPixel (4, value4, LED_ON); } // изпращане на данни към сериен монитор и сериен плотер // Serial.println (press_act); // изпращане на стойност (и) до сериен порт за цифров дисплей, по избор

Serial.print (press_act); // изпраща стойност към сериен порт за плотер

// изчертаване на индикаторни линии и коригиране на показания диапазон Serial.print ("\ t"); Serial.print (600); Serial.print ("\ t"); Serial.print (1100), Serial.print ("\ t"); Serial.println (1600); забавяне (200); // Измерете три пъти в секунда} // ---------------------------------------- -------------------------------------------------- -------------------------------------------------- - // за сензора bmp/bme280 се изисква следното, запазете като невалидно readTrim () {uint8_t data [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] << 8) | данни [7]; }

подписан дълъг int calibration_T (подписан дълъг int adc_T)

{подписан дълъг int var1, var2, T; var1 = ((((adc_T >> 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) {подписан дълъг 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);}

Стъпка 5: MakeCode/JavaScript скриптове

MakeCode/JavaScript скриптове
MakeCode/JavaScript скриптове

Pimoroni наскоро пусна enviro: bit, който идва със сензор за налягане BMP280, сензор за светлина/цвят и MEMS микрофон. Те също така предлагат библиотека MicroPython и MakeCode/JavaScript.

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

Това е вариант на скрипта за micro: bit dive-o-meter. По подразбиране показва разликата в налягането като стълбовидна диаграма. Натискането на бутон А задава референтното налягане, натискането на бутон В показва разликата между действителното и референтното налягане в hPa.

В допълнение към основната версия на баркод, можете да намерите и "X", версия на кръст и "L", предназначена да улесни четенето.

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

нека остане = 0 нека ред = 0 нека Meter = 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 ("" + Delta + "hPa") 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) {Row = 1} else {ред = 0} остават = метър - ред * 100 ако (остават> = 80) {колона = 4} иначе ако (остават> = 60) {колона = 3} иначе ако (остават> = 40) {колона = 2 } else if (continue> = 20) {Column = 1} else {Column = 0} for (let ColA = 0; ColA <= Column; ColA ++) {led.plot (ColA, Row)} basic.pause (500)}})

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