Как подключить датчик давления к ардуино

Шаг 1. Что нам понадобится

Arduino — в нашем уроке мы используем стандартный Arduino Uno, другие версии Arduino или клоны должны также работать.

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

Датчик нагрузки на 5 кг. Датчик нагрузки представляют собой металлические детали специальной формы к которым приклеиваются тензодатчики. Тензорезисторы — это резисторы, которые меняют свое сопротивление, когда они изогнуты. Когда металлическая часть изгибается, сопротивление тензодатчика изменяется (HX711 точно измеряет это небольшое изменение сопротивления). Вы можете купить HX711 и весоизмерительную ячейку здесь, например, на Амазоне — https://www.amazon.com/Degraw-Load-Cell-HX711-Combo/dp/B075317R45/.

Прочная плоская монтажная поверхность (x2) — идеальная жесткая деталь из твердой древесины или металла.

Провода разных цветов для подключения всех частей.

Электропитание для Arduino.

Исходный код программы

Прежде чем приступить к написанию программы для нашего устройства, вспомним немного основы работы с АЦП в Arduino Uno. Плата Arduino имеет шесть каналов АЦП. Мы можем использовать любой из них. Разрешение АЦП Arduino составляет 10 бит – то есть мы сможем работать с диапазоном целых чисел (0-(2^10) 1023)). Это означает что данный АЦП преобразует входное напряжение от 0 до 5 Вольт в целое число от 0 до 1023. То есть имеем точность АЦП 5/1024= 4.9 мВ. То есть один шаг приращения целого числа на выходе АЦП равен изменению в 4.9 мВ на его входе.

В нашей схеме для АЦП мы будем использовать канал A0. Для осуществления функций АЦП мы должны в программе сделать следующие вещи:

Все каналы АЦП платы Arduino Uno имеют опорное напряжение 5В – то есть это максимальное значение входного напряжения, которое способны обрабатывать данные каналы. Поскольку, к примеру, некоторые датчики обеспечивают на своем выходе диапазон напряжений 0-2.5В, то использование опорного напряжения 5В в данном случае приведет к уменьшению точности измерений. Поэтому в подобных случаях для изменения опорного напряжения целесообразно использовать функцию “analogReference();”. Мы в рассматриваемом случае оставим значение опорного напряжения без изменений.

По умолчанию разрешающая способность каналов АЦП платы Arduino Uno составляет 10 бит. Однако в некоторых случаях (например, для увеличения скорости преобразования) можно уменьшить эту разрешающую способность с помощью команды “analogReadResolution(bits);”. Мы в нашем примере не будем изменять разрешающую способность каналов АЦП.

Если все необходимые настройки канала АЦП сделаны (или оставлены по умолчанию), то для чтения значения с выхода АЦП можно воспользоваться функцией “analogRead(pin);”, где pin обозначает контакт платы Arduino, который мы будем использовать для аналого-цифрового преобразования, в нашем случае это будет контакт “A0”. Для того чтобы сразу сохранить значение с выхода АЦП в переменной целого типа можно использовать команду вида ”int SENSORVALUE = analogRead(A0);”, в результате этой команды значение с выхода АЦП будет сохранено в переменной “SENSORVALUE”.

Контакты платы Arduino Uno, на которых возможно формирование ШИМ сигнала, обозначены символом “~”. Всего таких каналов на плате Arduino Uno шесть. Мы в рассматриваемом примере для формирования ШИМ сигнала будем использовать контакт PIN3.

Как использовать ШИМ сигнал в Arduino? Это можно сделать, к примеру, с помощью функции analogWrite(3,VALUE) – эта функция на 3-м контакте сформирует ШИМ сигнала со значением (коэффициентом заполнения), определяемым параметром VALUE. Параметр VALUE может изменяться в диапазоне от 0 до 255. 0 соответствует самому низшему значению, а 255 – самому высшему. При VALUE=255 в результате приведенной команды мы получим 5В на контакте PIN3. Если VALUE=125, то на PIN3 мы получим среднее значение напряжения равное 2,5 В.

То есть на выходе АЦП значение может изменяться в диапазоне 0-1024, а коэффициент заполнения ШИМ может изменяться в диапазоне 0-255. То есть значение на выходе АЦП примерно в 4 раза превышает значение необходимого нам коэффициента заполнения сигнала ШИМ. Поэтому если мы разделим значение с выхода АЦП на 4, то мы получим примерное значение нужного нам коэффициента заполнения ШИМ.

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

Далее представлен полный текст программы.

Что такое AREF?

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

Для более популярных плат Arduino, таких как платы Uno, Mega, Duemilanove и Leonardo / Yún, рабочее напряжение 5В. Если у вас есть плата Arduino Due, рабочее напряжение составляет 3,3 В. Таким образом, если у Вас есть опорное напряжение 5 В, каждый блок, возвращаемого analogRead() оценивается в 0.00488 В. (Это рассчитывается путем деления 1024 на 5В). Что если мы хотим измерить напряжения между 0 и 2 или 0 и 4,6? Как АЦП узнает, что составляет 100% от нашего диапазона напряжений?

И в этом заключается причина существования вывода AREF. AREF означает Analog Reference. Это позволяет нам «скормить» Arduino опорное напряжение от внешнего источника питания. Например, если мы хотим измерить напряжения с максимальным диапазоном 3,3 В, мы бы подали хорошие плавные 3,3 В на вывод AREF, например, от ИС регулятора напряжения.

Тогда каждый шаг АЦП будет представлять около 3,22 милливольт (разделить 1024 на 3,3В)

Обратите внимание, что самое низкое опорное напряжение вы можете иметь 1.1В. Существует две формы AREF — внутренняя и внешняя, поэтому давайте их проверим

Подключение тензодатчика к плате Ардуино

Каждый человек, так или иначе, старается облегчить свой быт и труд. Для чего во все времена использовались различные вспомогательные механизмы или прирученные животные. В наше время, функции управления первыми, и некоторые возможности вторых возлагаются на компьютеры. Существуют и миниатюрные их варианты, предназначенные в первую очередь, для управления различными устройствами. Причем речь идет не только о бесконечном и однообразном повторении установленных изначально действий, но и об участии в процессе определенной логики. Которая, в свою очередь, опирается на текущее состояние различных внешних факторов. Мы говорим о микроконтроллерах — ограниченных ресурсами компьютерах, возможностей которых тем не менее достаточно для получения информации с чувствительных устройств — датчиков, обработки ее и передачи определенных команд конечным исполнителям.

В разрезе темы статьи речь пойдет о популярной платформе Arduino, аналого-цифровом преобразователе HX711 и подключаемых к нему тензодатчиках.

Подключение тензодатчика к плате Ардуино

Каждый человек, так или иначе, старается облегчить свой быт и труд. Для чего во все времена использовались различные вспомогательные механизмы или прирученные животные. В наше время, функции управления первыми, и некоторые возможности вторых возлагаются на компьютеры. Существуют и миниатюрные их варианты, предназначенные в первую очередь, для управления различными устройствами. Причем речь идет не только о бесконечном и однообразном повторении установленных изначально действий, но и об участии в процессе определенной логики. Которая, в свою очередь, опирается на текущее состояние различных внешних факторов. Мы говорим о микроконтроллерах — ограниченных ресурсами компьютерах, возможностей которых тем не менее достаточно для получения информации с чувствительных устройств — датчиков, обработки ее и передачи определенных команд конечным исполнителям.

В разрезе темы статьи речь пойдет о популярной платформе Arduino, аналого-цифровом преобразователе HX711 и подключаемых к нему тензодатчиках.

Библиотека HX711.h

Все сказанное ранее описывает всего несколько команд управляющих HX711. Далее представлен их полный список с расшифровкой. Нужно только напомнить, что инициализация подключаемого модуля проводится так:

#define DT A0 #define SCK A1 #include «HX711.h» HX711 scale; // структура через которую будет идти обращение

Название Параметры по порядку На выходе Описание
begin() A1 — Вывод Ардуино, где DT,

A3 — разрядность датчика 32(B), 64 или 128(A). По умолчанию 128

Ничего Инициализация
is_ready() Ничего True — готов, False — не готов Тест состояния АЦП
set_gain() 32,64,128 Ничего Установка значения усиления
read() Ничего Сырое значение АЦП Возвращает «чистый» ответ HX711 без поправочных сведений
read_average() Сколько делать проб Возвращает среднюю цифру от выполненных проб (унция) Получить усредненные данные
get_value() Сколько делать проб На выходе средняя масса (унция) без упаковки Получение поправленного значения без веса упаковки
get_units() Сколько делать проб Усредненная поправленная масса (унция) Возвращает массу с учетом упаковки и поправочных значений.
Tare() Сколько делать проб Масса упаковки (унция) Получение массы упаковки
set_scale() Коэффициент Ничего Задание значения корректировки
get_scale() Ничего Значение Получение текущего значения заданного set_scale()
set_offset() Вес (унция) Ничего Ручная установка веса упаковки
Get_offset() Ничего Масса (унция) Запрос установленного вручную параметра упаковки
power_down() Ничего Ничего Перевести HX711 в состояние «сна»
power_up() Ничего Ничего Вывод модуля АЦП из «сна»

Характеристики оборудования, его настройка, примечания

Здесь начать стоит непосредственно с преобразователя аналогового сигнала в цифровой, а конкретно с платы-посредника между Arduino и тензодатчиками — HX711:

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

Коэффициент Пиковый ток
32 ± 80 мА
64 ± 40 мА
238 ± 20 мА

В тех случаях, когда на вход АЦП поступает ток меньше нижней границы диапазона, на его выходе будет выдано 800000h, а если больше верхней — 7FFFFFh.

К сожалению, есть у преобразователя HX711 определенные проблемы. К примеру, точность его работы сильно зависит от температуры окружающей среды. Дополнительно, даже в нормальном режиме, происходит изменение определяемых аналоговых значений. То есть, результирующие коды все время «бегают» в определенных, достаточно сильных пределах:

Один из немногих дельных советов для таких случаев, выясненный при помощи интернет, — использовать для питания ровно 5 В в отношении датчиков и самого АЦП, а также снизить частоту определения до 10 Гц. Кроме того, пользователи названой платы применяют линейные фильтры на вводе и рекомендуют делать больший упор в конструкциях на канал B — он менее шумный. Также хорошим стабилизатором показаний будет опрос 10 значений и вывода среднего. Вариантом можно применить сборки на основе АЦП HX710A. Названый конвертер дополнительно оснащен сенсором температуры, корректирующим выходные данные.

К Ардуино преобразователь соединяется четырьмя контактами, два из которых питание, а остальные применяются в деле передачи данных:

Arduino HX711
5V VCC
GND GND
DT Цифровой вывод
SCK Цифровой вывод

Закончив с конвертером аналога в цифру для Ардуино, перейдем к характеристикам, которыми обладают сами тензодатчики:

На выходе полу мостового тензодатчика три провода, которыми он подключается к HX711. Классически они имеют следующее цветовое разделение:

Контакт Цвет
А+ Белый
E- Черный
E+ Красный

У мостового детектора четыре исходящих контакта, имеющих следующую цветовую дифференциацию:

Контакт Цвет
А+ Белый
E- Черный
E+ Красный
A- Зеленый

На обоих видах резистивных детекторов присутствуют отверстия под крепежные болты M4/5.

Установка датчика нагрузки на платформу и базу

Этот этап вы можете пропустить и не использовать никакой платформы/основания, но лучше все таки его сделать для более удобной работы с проектируемыми нами весами. Таким образом, нам необходимо сделать каркас или платформу, на которую мы потом будем класть вещи, вес которых мы хотим измерить. База (основание) также желательна для фиксации на ней датчика нагрузки с помощью болтов. В нашем проекте мы использовали жесткий картон для изготовления каркаса и деревянную доску в качестве базы/основания. Теперь нам осталось сделать всего лишь несколько соединений и наше устройство будет готово.

Работа схемы

Схема устройства представлена на следующем рисунке.

Для подключения ЖК дисплея его контакты RS, EN, d4, d5, d6, и d7 соединяются с контактами 8, 9, 10, 11, 12 и 13 платы Arduino соответственно. Контакты DT и SCK модуля HX711 непосредственно подключаются к контактам A0 и A1 платы Arduino. Соединение датчика нагрузки с модулем усиления HX711 было описано в предыдущем разделе статьи.

Перед началом работы устройства его необходимо откалибровать. Сразу после включения питания система автоматически начинает процесс собственной калибровки. Но если вы хотите откалибровать его вручную, то для этого необходимо будет нажать соответствующую кнопку. При нажатии этой кнопки будет запускаться функция void calibrate(), описанная в следующем разделе статьи.

Для начала процесса калибровки подождите пока на экране ЖК дисплея загорится надпись “put 100g” (положите 100 грамм), после этого положите 100 грамм на датчик нагрузки и подождите. Спустя несколько секунд процесс калибровки будет закончен. После этого вы можете класть на наши самодельные весы любую вещь массой до 40 кг и на экране ЖК дисплея высветится ее вес в граммах.

В этом проекте плата Arduino управляет всем процессом. Датчик нагрузки измеряет вес и передает электрический аналоговый сигнал на модуль усиления HX711, который усиливает и превращает в цифровую форму сигнал с выхода датчика нагрузки. Затем это усиленное значение сигнала подается на вход платы Arduino, которая измеряет величину этого сигнала, конвертирует его в значение веса в граммах и показывает его на ЖК дисплее. Кнопка используется для запуска процесса ручной калибровки устройства. Структурная схема работы нашего проекта показана на следующем рисунке.

Подключение HX711 к Arduino


Поскольку резисторы тензорного датчика включены по мостовой схеме, от устройства отходят 4 проводника, имеющих разную цветовую маркировку. На два плеча моста подаётся опорное напряжение, а с двух других плеч снимается выходное напряжение, которое подаётся на вход операционного усилителя микросхемы НХ711. Подключение по цветам проводов осуществляется следующим образом:

  • Красный – Е +
  • Чёрный – Е –
  • Белый – А –
  • Зелёный – А +

Для дальнейшей обработки и передачи информации осуществляется подключение НХ711 к Ардуино UNO. Для этого контакты питания GND и VCC HX711 подключаются к точкам GND и 5V разъёма POWER модуля Arduino UNO, а контакты DT и SCK подключаются к точкам A1 и A0 разъёма ANALOG IN. Тензодатчик НХ711 через контроллер Arduino UNO можно подключить к жидкокристаллическому дисплею LCD 1602 или компьютеру, используя USB порт и стандартные библиотеки для Ардуино.

Поскольку на выходе измерительного моста изменяется напряжение, то именно оно преобразуется в бинарный код. Диапазон контролируемых напряжений зависит от выбранного коэффициента усиления. Если коэффициент равен 128, диапазон измеряемых напряжений варьируется от – 20 mV до + 20 mV, выбор коэффициента усиления 64 определяет пределы измерения от – 40 mV до + 40 mV и при коэффициенте равном 32 пределы измерения определяются величинами – 80 mV и + 80 mV. Эти данные будут корректными только при напряжении питания +5 V. Если входное напряжение выйдет за нижнюю границу диапазона, АЦП выдаст код 800000h, а если за верхнюю, то код будет 7FFFFFh. Для калибровки и измерений можно использовать следующие коды:

//код для калибровки
//код для калибровки
#include "HX711.h"

HX711 scale(A1, A0); // DT, CLK

float Calibration_Factor_Of_Load_cell = -3.7; // этот калибровочный коэффициент настраивается в соответствии с тензодатчиком
float U;
float O;

void setup() {
  Serial.begin(9600);
  Serial.println("HX711 calibration sketch");
  Serial.println("Remove all weight from scale");
  Serial.println("After readings begin, place known weight on scale");
  Serial.println("Press + or a to increase calibration factor");
  Serial.println("Press - or z to decrease calibration factor");

  scale.set_scale();
  scale.tare(); //Сбросьте масштаб до 0
  long zero_factor = scale.read_average(); //Получаем базовое чтение
  Serial.print("Zero factor: "); //Это можно использовать, чтобы устранить необходимость тарирования шкалы. Полезно в проектах постоянного масштаба.
  Serial.println(zero_factor);
}

void loop() {

  scale.set_scale(Calibration_Factor_Of_Load_cell); //Отрегулируйте этот калибровочный коэффициент
  Serial.print("Reading: ");
  U = scale.get_units();
  if (U < 0)
  {
    U = 0.00;
  }
  O = U * 0.035274;
  Serial.print(O);
  Serial.print(" grams");
  Serial.print(" Calibration_Factor_Of_Load_cell: ");
  Serial.print(Calibration_Factor_Of_Load_cell);
  Serial.println();

  if (Serial.available())
  {
    char temp = Serial.read();
    if (temp == '+' || temp == 'a')
      Calibration_Factor_Of_Load_cell += 1;
    else if (temp == '-' || temp == 'z')
      Calibration_Factor_Of_Load_cell -= 1;
  }
}

Особенности конструкции и принцип действия датчика вибрации

Датчик вибрации имеет три выхода:

  • Земля;
  • Питание;
  • Выход аналогового сигнала А0.

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

Срабатывание датчика происходит в независимости от его пространственного расположения.

Технические параметры датчиков вибрации для Ардуино (могут отличаться в зависимости от модели устройства):

  • Питающее напряжение от 3 до 5 В;
  • Ток потребления 4-5мА;
  • С наличием или отсутствием цифрового выхода;
  • С наличием или отсутствием регулировки чувствительности.

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

Загрузка кода расходомера в Arduino и измерение расхода воды

Ниже вы можете скачать или скопировать код Ардуино датчика расхода воды:

byte statusLed    = 13;

byte sensorInterrupt = 0;  // 0 = digital pin 2
byte sensorPin       = 2;

// The hall-effect flow sensor outputs approximately 4.5 pulses per second per
// litre/minute of flow.
float calibrationFactor = 4.5;

volatile byte pulseCount;  

float flowRate;
unsigned int flowMilliLitres;
unsigned long totalMilliLitres;

unsigned long oldTime;

void setup()
{
  
  // Initialize a serial connection for reporting values to the host
  Serial.begin(38400);
   
  // Set up the status LED line as an output
  pinMode(statusLed, OUTPUT);
  digitalWrite(statusLed, HIGH);  // We have an active-low LED attached
  
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);

  pulseCount        = 0;
  flowRate          = 0.0;
  flowMilliLitres   = 0;
  totalMilliLitres  = 0;
  oldTime           = 0;

  // The Hall-effect sensor is connected to pin 2 which uses interrupt 0.
  // Configured to trigger on a FALLING state change (transition from HIGH
  // state to LOW state)
  attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
}

/**
 * Main program loop
 */
void loop()
{
   
   if((millis() - oldTime) > 1000)    // Only process counters once per second
  { 
    // Disable the interrupt while calculating flow rate and sending the value to
    // the host
    detachInterrupt(sensorInterrupt);
        
    // Because this loop may not complete in exactly 1 second intervals we calculate
    // the number of milliseconds that have passed since the last execution and use
    // that to scale the output. We also apply the calibrationFactor to scale the output
    // based on the number of pulses per second per units of measure (litres/minute in
    // this case) coming from the sensor.
    flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / calibrationFactor;
    
    // Note the time this processing pass was executed. Note that because we've
    // disabled interrupts the millis() function won't actually be incrementing right
    // at this point, but it will still return the value it was set to just before
    // interrupts went away.
    oldTime = millis();
    
    // Divide the flow rate in litres/minute by 60 to determine how many litres have
    // passed through the sensor in this 1 second interval, then multiply by 1000 to
    // convert to millilitres.
    flowMilliLitres = (flowRate / 60) * 1000;
    
    // Add the millilitres passed in this second to the cumulative total
    totalMilliLitres += flowMilliLitres;
      
    unsigned int frac;
    
    // Print the flow rate for this second in litres / minute
    Serial.print("Flow rate: ");
    Serial.print(int(flowRate));  // Print the integer part of the variable
    Serial.print(".");             // Print the decimal point
    // Determine the fractional part. The 10 multiplier gives us 1 decimal place.
    frac = (flowRate - int(flowRate)) * 10;
    Serial.print(frac, DEC) ;      // Print the fractional part of the variable
    Serial.print("L/min");
    // Print the number of litres flowed in this second
    Serial.print("  Current Liquid Flowing: ");             // Output separator
    Serial.print(flowMilliLitres);
    Serial.print("mL/Sec");

    // Print the cumulative total of litres flowed since starting
    Serial.print("  Output Liquid Quantity: ");             // Output separator
    Serial.print(totalMilliLitres);
    Serial.println("mL"); 

    // Reset the pulse counter so we can start incrementing again
    pulseCount = 0;
    
    // Enable the interrupt again now that we've finished sending output
    attachInterrupt(sensorInterrupt, pulseCounter, FALLING);
  }
}

/*
Insterrupt Service Routine
 */
void pulseCounter()
{
  // Increment the pulse counter
  pulseCount++;
}

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

В этом датчике расхода Arduino на каждый литр жидкости, проходящей через него в минуту, он выдает около 4,5 импульсов. Разделив общее число импульсов на 4,5, вы получите общее количество жидкости, проходящей через него, в литрах в минуту. Умножив это на 60, вы получите скорость потока в литрах в час, которая даст нам общее количество или количество воды/жидкости, прошедшей через него. Датчик с точностью до 3%.

Используйте этот датчик расхода жидкости Arduino с электромагнитным клапаном для контроля и управления используемой водой. Вы можете использовать его в своей садовой системе или связать с ЖК-дисплеем для других приложений, требующих измерения расхода и количества воды. Удачи с вашим новым проектом Arduino!

Программа и скетч мигающего светодиода

Давайте теперь рассмотрим программу, которую мы загрузили из примеров и проанализируем.

Пример программы мигалки Blink

Во-первых, давайте пока уберем большой блок комментарий – они обозначены в Arduino IDE серым цветом. На данном этапе они немного мешают нам, хотя они крайне важны и вы всегда должны писать комментарии к своим программам.

Программа Blink без комментариев

Если вы обратите внимание на блок loop, то именно в нем и сосредоточены наши команды, управляющие светодиодом:

Функции setup и loop в коде программы Blink

digitalWrite – это название функции, которая отвечает за подачу напряжения на пин. Подробнее о ней можно прочитать в отдельной статье о digitalWrite.

LED_BUILDIN – это название внутреннего светодиода. В большинстве плат за этим названием прячется цифра 13. Для плат Uno, Nano можно смело писать 13 вместо LED_BUILDIN.

HIGH – условное название высокого уровня сигнала. Включает светодиод. Можно заменить цифрой 1.

LOW – условное обозначение низкого уровня сигнала. Выключает светодиод. Можно заменить цифрой 0.

delay – функция, которая останавливает выполнение скетча на определенное время. Крайне нежелательно использовать ее в реальных проектах, но в нашем простом примере она отработает замечательно. В скобках мы указываем цифру – это количество микросекунд, которые нужно ждать. 1000 – это 1 секунда. Подробнее можно прочитать в нашем материале о delay() .

// LED_BUILTIN - встроенная константа, определяющая номер пина. В Arduino Uno и Nano это 13 пин.

void setup() {
  pinMode(LED_BUILTIN, OUTPUT); // Установка пина в режим OUTPUT
}

// Этот блок команд выполняется постоянно
void loop() { 
  digitalWrite(LED_BUILTIN, HIGH); // Включение светодиода
  delay(1000);                     // Задержка
  digitalWrite(LED_BUILTIN, LOW);  // Выключение светодиода
  delay(1000);                     // Задержка

  // Когда программа дойдет до этого места, она автоматически продолжится сначала
}

Как только программа дойдет до конца, контроллер перейдет в начало блока loop и будет выполнять все команды заново. И так раз за разом, целую вечность (пока есть свет). Наш светодиод мигает без остановки.

Проект “Маячок” с мигающим светодиодом

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

Вам понадобится:

  • Плата Arduino Uno или Nano
  • Макетная плата для монтажа без пайки
  • Резистор номиналом 220 Ом
  • Светодиод
  • Провода для соединения

Сложность:  простой проект.

Что мы узнаем:

  • Как подключить светодиод к ардуино.
  • Повторим процедуру загрузки скетча в микроконтроллер.

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

Соедините все элементы согласно следующей схемы для Arduino UNO. Для Arduino Nano светодиод подключается по той же схеме – к пину 13.

Схема подключения мигающего светодиода к Ардуино

Если вы не меняли программу с предыдущего шага, то можно считать, что все сделано. Подключаем плату к компьютеру – светодиод должен немного помигать хаотично, а затем с точно установленным периодом.

Если вы еще не загружали программу, то вам надо повторить ту же последовательность действий, что и для работы со встроенным светодиодом. Загружаем пример, затем программу в контроллер и наблюдаем за результатом.

Попробуйте внести изменения в программу. Сделайте так, чтобы маячок мигал медленней и быстрее (чаще). Добейтесь того, чтобы частота мигания стала такой, что мигание света стало бы незаметным.

Мигание светодиода после нажатия на кнопку

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

Полная схема проекта изображена на рисунке:

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

/*
  Скетч для схемы с использованием тактовой кнопки и светодиода
  Светодиод мигает, пока нажата кнопка.
  Кнопка подтянута к земле, нажатию соответствует HIGH на входе
*/

const int PIN_BUTTON = 2;
const int PIN_LED = 13;

void setup() {
  Serial.begin(9600);
  pinMode(PIN_LED, OUTPUT);
}

void loop() {
  // Получаем состояние кнопки
  int buttonState = digitalRead(PIN_BUTTON);
  Serial.println(buttonState);
  // Если кнопка не нажата, то ничего не делаем
  if (!buttonState) {
    delay(50);
    return;
  }

  // Этот блок кода будет выполняться, если кнопка нажата
  // Мигаем светодиодом
  digitalWrite(PIN_LED, HIGH);
  delay(1000);
  digitalWrite(PIN_LED, LOW);
  delay(1000);
}

Нажимаем и держим – светодиод мигает. Отпускаем – он гаснет. Именно то , что хотели. Хлопаем от радости в ладоши и приступаем к анализу того, что сделали.

Давайте посмотрим на скетч. В нем мы видим довольно простую логику.

  1. Определяем, нажата ли кнопка.
  2. Если кнопка не нажата, то просто выходим из метода loop, ничего не включая и не меняя.
  3. Если кнопка нажата, то выполняем мигание, используя фрагмент стандартного скетча:
    1. Включаем светодиод, подавая напряжение на нужный порт
    2. Делаем нужную паузу при включенном светодиоде
    3. Выключаем светодиод
    4. Делаем нужную паузу при выключенном светодиоде

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

Что измеряет сенсор

Давление — некая физическая величина численно равная перпендикулярно направленной силе действующей на единицу площади поверхности. Сам датчик можно представить своеобразными очень чувствительными весами. Последнее замечание сделано по причине того, что и вода, и газы тоже имеют свою массу, которая влияет на поверхность под ними. На практике, за счет указанного фактора, можно определить глубину погружения (чем ниже, тем больше вес слоя воды) или высоту подъема в атмосферу (чем выше — тем меньше плотность, а значит и слабее воздействие). Кроме того, в отношении давления воздуха не стоит забывать о погодных колебаниях. Резкое падение названой характеристики атмосферы — к дождю или буре.

Опять же, насчет газов и частично жидкостей. Их можно сжимать. Но, уплотненные вещества будут стремиться вернуться в первоначальное состояние. И чем сильнее компрессия, тем мощнее будет конечное давление газа или жидкости внутри сосуда их содержащего.

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

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий