Оглавление:

A Micro: bit Dive-O-Meter: 8 шагов (с изображениями)
A Micro: bit Dive-O-Meter: 8 шагов (с изображениями)

Видео: A Micro: bit Dive-O-Meter: 8 шагов (с изображениями)

Видео: A Micro: bit Dive-O-Meter: 8 шагов (с изображениями)
Видео: Дубай. Орёл и Решка. Чудеса света (eng, rus sub) 2024, Июль
Anonim
A Micro: битовый измеритель глубины погружения
A Micro: битовый измеритель глубины погружения
A Micro: битовый измеритель глубины погружения
A Micro: битовый измеритель глубины погружения
A Micro: битовый измеритель глубины погружения
A Micro: битовый измеритель глубины погружения

Настало лето, пора бассейна!

Хорошая возможность вывести себя и свой micro: bit на улицу, а в данном случае даже в бассейн.

Описанный здесь микрометр для погружений представляет собой простой измеритель глубины, сделанный своими руками, который позволяет вам измерить, насколько глубоко вы ныряете или погружались. Он состоит только из micro: bit, аккумуляторной батареи или LiPo, краевого разъема для micro: bit, датчика барометрического давления BMP280 или BME280 и нескольких соединительных кабелей. Использование Pimoroni enviro: bit делает вещи еще проще. Все это упаковано в два слоя водонепроницаемых прозрачных пластиковых или силиконовых пакетов с добавленными грузами для компенсации выталкивающей силы.

Это приложение датчика давления micro: bit, которое я описал в предыдущем руководстве.

Вы можете использовать устройство e. грамм. для соревнований по подводному плаванию с друзьями и семьей или для выяснения глубины пруда. Я протестировал его, используя самый глубокий бассейн в моем районе, и обнаружил, что он работает как минимум на глубине 3,2 метра. Теоретический максимум - около пяти метров. До сих пор я не проверял его точность в деталях, но полученные цифры были, по крайней мере, в ожидаемом диапазоне.

Некоторые замечания: Это не предназначенный для настоящих дайверов инструмент. Ваш micro: bit будет поврежден, если намокнет. Вы используете это руководство на свой страх и риск.

Обновление от 27 мая: теперь вы можете найти HEX-скрипт MakeCode, который можно загрузить прямо в свой micro: bit. См. Шаг 6. Обновление 13 июня: добавлены Enviro: bit и кабельная версия. См. Шаги 7 и 8.

Шаг 1. Теория, лежащая в основе устройства

Мы живем на дне воздушного океана. Давление здесь составляет около 1020 гПа (гектопаскаль), так как вес столба воздуха, образующегося здесь в космосе, составляет около 1 кг на квадратный сантиметр.

Плотность воды намного выше, так как один литр воздуха весит около 1,2 г, а один литр воды 1 кг, то есть примерно в 800 раз. Так как падение барометрического давления составляет около 1 гПа на каждые 8 метров высоты, увеличение давления составляет 1 гПа на каждый сантиметр ниже поверхности воды. На глубине около 10 м давление составляет 2000 гПа, или две атмосферы.

Используемый здесь датчик давления имеет диапазон измерения от 750 до 1500 гПа с разрешением около одного гПа. Это означает, что мы можем измерять глубину до 5 метров с разрешением около 1 см.

Это будет глубиномер типа Boyle Marriotte. Его сборка довольно проста и описана позже. Датчик использует протокол I2C, поэтому крайний разъем для micro: bit пригодится. Наиболее важной частью являются водонепроницаемые пакеты, так как любая влажность может повредить микробит, датчик или батарею. Поскольку некоторое количество воздуха будет задерживаться внутри мешков, добавление грузов помогает компенсировать выталкивающую силу.

Шаг 2: Использование устройства

Использование устройства
Использование устройства
Использование устройства
Использование устройства
Использование устройства
Использование устройства
Использование устройства
Использование устройства

Сценарий, как подробно показано на более позднем этапе, представляет собой вариант сценария, который я разработал ранее для измерителя давления. Для проверки устройства вы можете использовать описанную там простую барокамеру.

Для дайвинга он показывает глубину в метрах, рассчитанную по измерениям давления, либо в виде гистограммы с шагом 20 см, либо, по запросу, в цифрах.

Используя кнопку A на микробите, вы установите текущее давление в качестве эталонного значения давления. Для подтверждения ввода матрица мигнет один раз.

Вы можете использовать это, чтобы увидеть, насколько глубоко вы ныряете, или записать, насколько глубоко вы ныряли.

В первом случае установите текущее давление наружного воздуха в качестве эталона. Во втором случае установите давление в самой глубокой точке, в которой вы находитесь, в качестве эталона давления, что затем позволит вам показать, насколько глубоко вы были, когда вернетесь на поверхность. Кнопка B отображает глубину, рассчитанную по разнице давлений, в виде числового значения в метрах.

Шаг 3: Необходимые материалы

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

Микро: бит. Например. по 13 фунтов стерлингов / 16 евро в Pimoroni UK / DE.

Торцевой соединитель (Kitronic или Pimoroni), 5 фунтов стерлингов. Я использовал версию 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 к 3 В, GND к 0 В, SCL к порту 19 и SDA к порту 20. В качестве альтернативы припаяйте кабели непосредственно к коммутационному разъему. Подключите micro: bit к нашему компьютеру с помощью кабеля USB. Откройте предоставленный скрипт и запишите его на micro: bit. Воспользуйтесь последовательным монитором или плоттером, проверьте, дает ли датчик достоверные данные. Отключите micro: bit от компьютера. Подключите аккумулятор или LiPo к micro: bit. Нажмите кнопку B, прочтите значение. Нажмите кнопку A. Нажмите кнопку B, прочтите значение. Поместите устройство в два слоя герметичных пакетов, оставив в них очень мало воздуха. На всякий случай поместите груз для компенсации выталкивающей силы. Проверьте, все ли водонепроницаемо. Сходи в бассейн и играй.

Шаг 5: Скрипт MicroPython

Сценарий просто берет значение давления с датчика, сравнивает его с эталонным значением, а затем вычисляет глубину по разнице. Для отображения значений в виде гистограммы берется целая и остаточная часть значения глубины. Первый действительно определяет высоту линии. Остальная часть разбита на пять интервалов, которые определяют длину стержней. Верхний уровень составляет 0-1 м, самый низкий 4-5 м. Как упоминалось ранее, нажатие кнопки A устанавливает эталонное давление, кнопка B отображает «относительную глубину» в метрах, отображаемую в виде числового значения. К настоящему моменту отрицательные и положительные значения отображаются в виде гистограммы на светодиодной матрице одинаково. Не стесняйтесь оптимизировать скрипт под свои нужды. Вы можете включить звук определенных строк, чтобы отобразить значения на последовательном мониторе или плоттере Arduino IDE. Чтобы эмулировать функцию, вы можете построить устройство, которое я описал в предыдущем руководстве.

Я не написал ту часть скрипта, которая считывает датчик. Я не уверен в источнике, но хочу поблагодарить авторов. Любые исправления или подсказки по оптимизации приветствуются.

#включают

#include Adafruit_Microbit_Matrix microbit; #define BME280_ADDRESS 0x76 беззнаковое длинное целое число hum_raw, temp_raw, pres_raw; подписанный long 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; double press_norm = 1015; // начальное значение double depth; // вычисляемая глубина // -------------------------------------------- -------------------------------------------------- ---------------------- 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 mode = 3; // Нормальный режим uint8_t t_sb = 5; // Tstandby 1000 мс uint8_t filter = 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 ("Давление [гПа]"); // заголовок для последовательного вывода 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; подписанный long int temp_cal; беззнаковый длинный int press_cal, hum_cal; int N; int M; double press_delta; // относительное давление int depth_m; // глубина в метрах, целая часть double depth_cm; // остаток в см readData (); // temp_cal = калибровка_T (temp_raw); пресс_кал = калибровка_ (предварительная_расширение); // hum_cal = калибровка_H (hum_raw); // temp_act = (двойной) temp_cal / 100.0; press_act = (двойной) press_cal / 100.0; // hum_act = (двойной) hum_cal / 1024.0; microbit.clear (); // сбросить светодиодную матрицу // Кнопка A устанавливает фактическое значение как эталонное (P ноль) // Кнопка B отображает текущее значение как глубину в метрах (рассчитывается по разнице давления) if (! digitalRead (PIN_BUTTON_A)) {// устанавливает нормальное давление воздуха как ноль press_norm = press_act; // microbit.print ("P0:"); // microbit.print (press_norm, 0); // microbit.print ("гПа"); microbit.fillScreen (LED_ON); // мигаем один раз для подтверждения delay (100); } else if (! digitalRead (PIN_BUTTON_B)) {// отображаем глубину в метрах microbit.print (depth, 2); microbit.print («м»); // Serial.println (""); } else {// вычисляем глубину по разнице давлений press_delta = (press_act - press_norm); // вычисляем относительное давление depth = (press_delta / 100); // глубина в метрах depth_m = int (abs (depth)); // глубина в метрах depth_cm = (abs (depth) - depth_m); // остаток / * // используется для разработки Serial.println (depth); Serial.println (глубина_м); Serial.println (глубина_см); * / // Шаги для гистограммы if (depth_cm> 0.8) {// установить длину столбцов (N = 4); } иначе, если (глубина_см> 0,6) {(N = 3); } иначе, если (глубина_см> 0,4) {(N = 2); } иначе, если (глубина_см> 0,2) {(N = 1); } else {(N = 0); }

if (depth_m == 4) {// установить уровень == метр

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

// отправляем значение в последовательный порт для плоттера

Serial.print (press_delta); // рисуем линии индикатора и фиксируем отображаемый диапазон Serial.print ("\ t"); Serial.print (0); Serial.print ("\ t"); Серийный принт (-500); Serial.print ("\ t"); Serial.println (500); задержка (500); // Измерение дважды в секунду} // ----------------------------------------- -------------------------------------------------- -------------------------------------------------- -------- // для датчика bmp / bme280 требуется следующее, оставьте как недействительный readTrim () {uint8_t data [32], i = 0; // Исправить 2014 / Wire.beginTransmission (BME280_ADDRESS); Wire.write (0x88); Wire.endTransmission (); Wire.requestFrom (BME280_ADDRESS, 24); // Исправить 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 / data = Wire.read (); // Добавить 2014 / i ++; // Добавить 2014 / Wire.beginTransmission (BME280_ADDRESS); Wire.write (0xE1); Wire.endTransmission (); Wire.requestFrom (BME280_ADDRESS, 7); // Исправить 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); // Исправить 2014 / dig_H6 = data [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 я = 0; uint32_t data [8]; Wire.beginTransmission (BME280_ADDRESS); Wire.write (0xF7); Wire.endTransmission (); Wire.requestFrom (BME280_ADDRESS, 8); в то время как (Wire.available ()) {data = Wire.read (); i ++; } pres_raw = (данные [0] << 12) | (данные [1] 4); temp_raw = (данные [3] << 12) | (данные [4] 4); hum_raw = (data [6] 3) - ((длинное целое число со знаком) dig_T1 11; var2 = (((((adc_T >> 4) - ((длинное целое число со знаком) dig_T1)) * ((adc_T >> 4) - ((длинное целое число со знаком) dig_T1))) >> 12) * ((длинное целое число со знаком) dig_T3)) >> 14; t_fine = var1 + var2; T = (t_fine * 5 + 128) >> 8; return T; } unsigned long int калибровка_P (signed long int adc_P) {signed long int var1, var2; unsigned long int P; var1 = (((signed long int) t_fine) >> 1) - (signed long int) 64000; var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * ((длинное целое со знаком) dig_P6); var2 = var2 + ((var1 * ((длинное целое со знаком) dig_P5)) 2) + (((длинное целое число со знаком) dig_P4) 2) * (var1 >> 2)) >> 13)) >> 3) + ((((длинное целое число со знаком) dig_P2) * var1) >> 1)) >> 18; var1 = ((((32768 + var1)) * ((длинное целое число со знаком) dig_P1)) >> 15); если (var1 == 0) {возврат 0; } P = (((длинное целое число без знака) (((длинное целое число со знаком) 1048576) -adc_P) - (var2 >> 12))) * 3125; если (P <0x80000000) {P = (P << 1) / ((unsigned long int) var1); } else {P = (P / (длинное целое число без знака) var1) * 2; } var1 = (((длинное целое число со знаком) dig_P9) * ((длинное целое число со знаком) (((P >> 3) * (P >> 3)) >> 13))) >> 12; var2 = (((длинное целое число со знаком) (P >> 2)) * ((длинное целое число со знаком) dig_P8)) >> 13; P = (длинное целое число без знака) ((длинное целое число со знаком) P + ((var1 + var2 + dig_P7) >> 4)); return P; } длинное целое число без знака калибровка_H (длинное целое число со знаком adc_H) {длинное целое число со знаком v_x1; v_x1 = (t_fine - ((длинное целое число со знаком) 76800)); v_x1 = ((((adc_H << 14) - (((длинное целое со знаком) dig_H4) 15) * (((((((v_x1 * ((длинное целое со знаком) dig_H6)) >> 10) * (((v_x1 * ((длинное целое со знаком) dig_H3)) >> 11) + ((длинное целое со знаком) 32768))) >> 10) + ((длинное целое со знаком) 2097152)) * ((длинное целое со знаком) dig_H2) + 8192) >> 14)); v_x1 = (v_x1 - ((((((v_x1 >> 15) * (v_x1 >> 15)) >> 7) * ((длинное целое число со знаком) dig_H1)) >> 4)); v_x1 = (v_x1 419430400? 419430400: v_x1); return (unsigned long 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

let Meter = 0 let stay = 0 let Row = 0 let Delta = 0 let Ref = 0 let 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 + "." + stay + "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) {Row = 1} else {Row = 0} stay = Meter - Row * 100 if (Осталось> = 80) {Column = 4} else if (Осталось> = 60) {Column = 3} else if (Осталось> = 40) {Column = 2} else if (Осталось> = 20) {Column = 1} else {Column = 0} for (let ColA = 0; ColA <= Column; ColA ++) {led.plot (C olA, Row)} basic.pause (500)}})

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

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

Тем временем я получил enviro: bit (20 фунтов стерлингов) и power: bit (6 фунтов стерлингов) от Пиморони.

Как упоминалось ранее, 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: Версия кабеля и сенсорного зонда

Версия с кабелем и датчиком
Версия с кабелем и датчиком
Версия с кабелем и датчиком
Версия с кабелем и датчиком

На самом деле это была первая идея для измерителя глубины micro: bit, последняя из созданных.

Здесь я припаял датчик BMP280 к 5 м 4-жильного кабеля и поместил перемычку-гнездо на другом конце. Чтобы защитить датчик от воды, кабель пропустили через использованную винную пробку. Концы пробки заклеивали горячим клеем. Раньше я вырезал на пробке две выемки, обе по периметру. Затем я упаковал датчик в шарик из губки, поместил вокруг него шарик и закрепил конец шарика на пробке (нижняя выемка). Затем я поместил 3 куска свинцовых гирь по 40 г во второй баллон, обернул им первый, утяжелил на внешней стороне и закрепил конец баллона во второй выемке. Из второго баллона удалили воздух, затем все закрепили изолентой. Смотрите изображения, могут быть более подробные.

Перемычки были подключены к micro: bit через краевой соединитель, устройство включилось и было установлено эталонное давление. Затем головку датчика медленно опустили на дно бассейна (10-метровая вышка для прыжков, глубина около 4,5 м).

Полученные результаты:

К моему удивлению, он работал даже с этим длинным кабелем. С другой стороны, что неудивительно, ошибка измерения, казалось, увеличивалась при более высоких давлениях, и предполагаемая глубина в 4 м была оценена как около 3 м.

Возможное применение:

С некоторыми исправлениями ошибок прибор можно использовать для измерения глубины до 4 м.

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

Фитнес-вызов на открытом воздухе
Фитнес-вызов на открытом воздухе
Фитнес-вызов на открытом воздухе
Фитнес-вызов на открытом воздухе

Финалист в соревнованиях по фитнесу на открытом воздухе

Рекомендуемые: