Оглавление:

Измерьте давление с помощью вашего Micro: бит: 5 шагов (с изображениями)
Измерьте давление с помощью вашего Micro: бит: 5 шагов (с изображениями)

Видео: Измерьте давление с помощью вашего Micro: бит: 5 шагов (с изображениями)

Видео: Измерьте давление с помощью вашего Micro: бит: 5 шагов (с изображениями)
Видео: Тест на Самый Острый Слух в Мире 2024, Июль
Anonim
Измерьте давление с помощью Micro: bit
Измерьте давление с помощью Micro: bit
Измерьте давление с помощью Micro: bit
Измерьте давление с помощью Micro: bit

В следующей инструкции описывается простое в сборке и недорогое устройство для измерения давления и демонстрации закона Бойля с использованием микробита в сочетании с датчиком давления / температуры BMP280.

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

Кроме того, количество описаний приложений, в которых micro: bit используется в сочетании с датчиком, управляемым I2C, пока довольно ограничено. Я надеюсь, что это руководство может стать отправной точкой для других проектов.

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

По умолчанию дисплей позволяет оценить давление по индикатору уровня, отображаемому на светодиодной матрице. Последовательный плоттер Arduino IDE позволяет делать то же самое, но с гораздо лучшим разрешением (см. Видео). Также доступны более сложные решения, например на языке обработки. Вы также можете отображать точные измеренные значения давления и температуры на светодиодной матрице после нажатия кнопок A или B соответственно, но последовательный монитор Arduino IDE работает намного быстрее, что позволяет отображать значения почти в реальном времени.

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

Этот принцип был использован для создания очень простого микрометра для погружения - устройства для измерения глубины вашего погружения.

Приложение 27 мая 2018 г.:

Поскольку Пиморони разработал библиотеку MakeCode для датчика BMP280, это дало мне возможность разработать сценарий, который будет использоваться для устройства, описанного здесь. Сценарий и соответствующий HEX-файл можно найти на последнем шаге этой инструкции. Чтобы использовать его, просто загрузите файл HEX в свой micro: bit. Нет необходимости в специальном программном обеспечении, и вы можете использовать онлайн-редактор MakeCode для редактирования скрипта.

Шаг 1: Использованные материалы

Используемые материалы
Используемые материалы
Используемые материалы
Используемые материалы
Используемые материалы
Используемые материалы
Используемые материалы
Используемые материалы
  • Микро: бит, получил мой от Пиморони - 13,50 фунтов стерлингов
  • Kitronic Edge Connector для micro: bit - через Pimoroni - 5 фунтов стерлингов, Примечание: Pimorini теперь предлагает удобный для макетной платы краевой разъем, называемый pin: bit, с контактами на портах I2C.
  • 2 x 2-контактные полоски заголовка
  • Аккумулятор или LiPo для micro: bit (не обязательно, но полезно), кабель аккумулятора с переключателем (dito) - Pimoroni
  • кабели-перемычки для подключения датчиков к коннектору Edge
  • длинные (!) соединительные кабели для датчика, не меньше длины шприца,, f / f или f / m
  • Датчик давления и температуры BMP280 - Banggood - 5 долларов США за три устройства Диапазон измерения этого датчика составляет от 550 до 1537 гПа.
  • Шприц с пластиковым катетером на 150 мл с резиновой прокладкой - Amazon или хозяйственные и садовые магазины - около 2 - 3 долларов США.
  • горячий клей / пистолет для горячего клея
  • паяльник
  • компьютер с установленной Arduino IDE

Шаг 2: Инструкции по сборке

Руководство по сборке
Руководство по сборке
Руководство по сборке
Руководство по сборке
Руководство по сборке
Руководство по сборке

Припаяйте разъемы к разъему датчика BMP280.

Припаяйте два 2-контактных разъема к контактам 19 и 20 разъема Edge (см. Изображение).

Подключите micro: bit к разъему Edge и к компьютеру.

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

Установите необходимые библиотеки в IDE Arduino.

Откройте сценарий BMP280, прикрепленный на более позднем этапе.

Подключите датчик к коннектору Edge. GND к 0 В, VCC к 3 В, SCL к контакту 19, SDA к контакту 20.

Загрузите скрипт в micro: bit.

Убедитесь, что датчик выдает разумные данные, значения давления должны быть около 1020 гПа, отображаемые на последовательном мониторе. На всякий случай сначала проверьте кабели и соединения, затем установите программное обеспечение и исправьте.

Выключите micro: bit, снимите датчик.

Пропустите длинные соединительные кабели через выпускное отверстие шприца. На случай, если вам придется расширить проем. Будьте осторожны, чтобы не повредить кабели.

Подключите датчик к перемычкам. Убедитесь, что соединения правильные и исправные. Подключитесь к micro: bit.

Убедитесь, что датчик работает правильно. Осторожно потянув за кабели, переместите датчик в верхнюю часть шприца.

Вставьте поршень и переместите его немного дальше желаемого положения покоя (100 мл).

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

Еще раз проверьте, что датчик работает. Если вы переместите поршень, цифры на последовательном мониторе и на дисплее micro: bit должны измениться.

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

Шаг 3: Немного теории и некоторые практические измерения

Немного теории и некоторые практические измерения
Немного теории и некоторые практические измерения
Немного теории и некоторые практические измерения
Немного теории и некоторые практические измерения

С помощью устройства, описанного здесь, вы можете продемонстрировать соотношение сжатия и давления в простых физических экспериментах. Поскольку на шприце имеется шкала «мл», даже количественные эксперименты проводить легко.

Теория, лежащая в основе этого: Согласно закону Бойля, [Объем * Давление] является постоянным значением для газа при данной температуре.

Это означает, что если вы сжимаете данный объем газа в N раз, то есть конечный объем в 1 / N раз больше исходного, его давление возрастет в N раз, как: P0 * V0 = P1 * V1 = cons t. Для получения более подробной информации, пожалуйста, прочтите статью в Википедии о газовых законах. На уровне моря атмосферное давление обычно находится в диапазоне 1010 гПа (гектопаскаль).

Итак, начиная с точек покоя, например, V0 = 100 мл и P0 = 1000 гПа, сжатие воздуха примерно до 66 мл (т. Е. V1 = 2/3 * V0) приведет к давлению примерно 1500 гПа (P1 = 3/2 от P0). Вытягивание поршня до 125 мл (5/4 кратного объема) дает давление около 800 гПа (давление 4/5). Измерения удивительно точны для такого простого устройства.

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

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

Теперь вы можете рассчитать силу, необходимую для удержания поршня в этом положении. Дано P = F / A (давление - это сила, деленная на площадь) или преобразованное F = P * A. В системе СИ единица измерения силы - «Ньютон» Н, длина «метр» м, а 1 Па составляет 1 Н на квадратный метр. Для круглого поршня площадь можно рассчитать, используя A = ((d / 2) ^ 2) * pi, что дает 0,00125 квадратных метров для моего шприца. Так

50 000 Па * 0,00125 м ^ 2 = 63 Н.

На Земле 1 Н соответствует весу 100 г, поэтому 63 Н соответствуют весу 6,3 кг.

Это легко проверить по шкале. Надавите шприц с поршнем на весы до достижения давления около 1500 гПа, затем снимите показания шкалы. Или нажимайте, пока шкала не покажет около 6-7 кг, затем нажмите кнопку «A» и прочтите значение, отображаемое на светодиодной матрице micro: bit. Как оказалось, оценка на основе приведенных выше расчетов оказалась неплохой. Давление немного выше 1500 гПа соответствовало отображаемому «весу» около 7 кг по шкале тела (см. Изображения). Вы также можете изменить эту концепцию и использовать устройство для создания простой цифровой шкалы на основе измерений давления.

Имейте в виду, что верхний предел для датчика составляет около 1540 гПа, поэтому любое давление выше этого значения невозможно измерить и может повредить датчик.

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

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

В приложении вы найдете мой сценарий BMP280 для micro: bit. Это производная от сценария BMP / BME280, который я нашел где-то на веб-сайте Banggood, в сочетании с библиотекой Adafruit Microbit. Первый позволяет использовать датчик Banggood, второй упрощает работу со светодиодным дисплеем 5x5. Я благодарен разработчикам обоих.

По умолчанию скрипт отображает результаты измерения давления в 5 шагов на светодиодном дисплее micro: bit 5x5, что позволяет видеть изменения с небольшой задержкой. Точные значения могут отображаться параллельно на последовательном мониторе Arduino IDE, или более подробный график может отображаться на последовательном плоттере Arduino IDE.

Если вы нажмете кнопку A, измеренные значения давления отобразятся на светодиодной матрице 5x5 micro: bit. Если вы нажмете кнопку B, отобразятся значения температуры. Хотя это позволяет считывать точные данные, это значительно замедляет циклы измерения.

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

#include xxx

#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; // контейнеры для измеренных значений int value0; int value1; int value2; int value3; int value4; // ------------------------------------------------ -------------------------------------------------- ------------------ 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.println ("Температура [градус C]"); // Serial.print ("\ t"); 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; // устанавливаем пороговые значения для отображения светодиодной матрицы, в гПа double max_0 = 1100; двойной max_1 = 1230; двойной max_2 = 1360; двойной max_3 = 1490; 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 (); // сброс светодиодной матрицы / * Serial.print ("PRESS:"); Serial.println (press_act); Serial.print («гПа»); Serial.print ("ТЕМП:"); 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 (""); } иначе, если (! digitalRead (PIN_BUTTON_A)) {microbit.print ("P:"); microbit.print (press_act, 0); microbit.print («гПа»); } else {// отображение значений давления в виде пикселей или линий на определенном уровне // 5 шагов: 1490 гПа // пороговые значения, определяемые значениями max_n if (press_act> max_3) {(N = 0); // верхняя строка} else if (press_act> max_2) {(N = 1); } иначе, если (press_act> max_1) {(N = 2); } иначе, если (press_act> max_0) {(N = 3); } else {(N = 4); // базовая строка} // Serial.println (N); // в целях разработки // microbit.print (N); // как строка // microbit.drawLine (N, 0, 0, 4, LED_ON); // переносить значения на следующую строку value4 = value3; значение3 = значение2; значение2 = значение1; значение1 = значение0; значение0 = N; // рисуем изображение, столбец за столбцом microbit.drawPixel (0, value0, LED_ON); // как пиксель: столбец, строка. 0, 0 левый верхний угол microbit.drawPixel (1, value1, LED_ON); microbit.drawPixel (2, значение2, LED_ON); microbit.drawPixel (3, значение3, LED_ON); microbit.drawPixel (4, значение4, LED_ON); } // отправляем данные на серийный монитор и серийный плоттер // Serial.println (press_act); // отправляем значение (я) в последовательный порт для числового отображения, необязательно

Серийный.принт (press_act); // отправляем значение в последовательный порт для плоттера

// рисуем линии индикатора и фиксируем отображаемый диапазон Serial.print ("\ t"); Серийный принт (600); Serial.print ("\ t"); Serial.print (1100), Serial.print ("\ t"); Serial.println (1600); задержка (200); // Измерение три раза в секунду} // ---------------------------------------- -------------------------------------------------- -------------------------------------------------- - // для датчика 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 = (данные [6] << 8) | данные [7]; }

длинное целое число со знаком калибровки_Т (длинное целое число со знаком adc_T)

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

Шаг 5: скрипты MakeCode / JavaScript

MakeCode / скрипты JavaScript
MakeCode / скрипты JavaScript

Пиморони недавно выпустил enviro: bit, который поставляется с датчиком давления BMP280, датчиком света / цвета и микрофоном MEMS. Они также предлагают MicroPython и библиотеку MakeCode / JavaScript.

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

Это разновидность скрипта для дайвомера micro: bit. По умолчанию он отображает разницу давлений в виде гистограммы. Нажатие кнопки A устанавливает эталонное давление, нажатие кнопки B отображает разницу между фактическим и эталонным давлением в гПа.

В дополнение к базовой версии штрих-кода вы также найдете версию «X», версию с перекрестием и версию «L», предназначенную для облегчения чтения.

пусть столбец = 0

let stay = 0 let Row = 0 let Meter = 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 ("" + Delta + "hPa") basic.pause (200) basic.clearScreen ()} else {Is = envirobit.getPressure () Delta = Is - Ref Meter = Math.abs (Delta) если (Метр> = 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 (stay> = 20) {Column = 1} else {Column = 0} for (let ColA = 0; ColA <= Column; ColA ++) {led.plot (ColA, Row)} basic.pause (500)}})

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