Подключение датчика напряжения к Arduino

Подключение датчика напряжения к Arduino

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

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

В этом руководстве мы рассмотрим, как использовать датчик напряжения с Arduino, чтобы сделать задачи измерения напряжения проще и эффективнее. Давайте начнём!

Обзор оборудования

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

Подключение датчика напряжения к Arduino

Принципиальная схема датчика напряжения показана на следующем изображении.

Подключение датчика напряжения к Arduino

В этой схеме два резистора. Резистор (R1), расположенный ближе к входному напряжению, имеет номинал 30 КОм, а резистор (R2), расположенный ближе к земле, — 7.5 КОм. Падение напряжения на R2 и есть наше разделённое напряжение. Этот сигнал выведен на контактный вывод, обозначенный S.

Эта простая схема делит входное напряжение в 5 раз. Именно поэтому этот датчик напряжения может помочь вам измерять напряжения менее 25 вольт с помощью Arduino.

Считывание показаний датчика напряжения

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

Подключение датчика напряжения к Arduino

Уравнение делителя напряжения предполагает, что вам известны три значения приведённой выше схемы: входное напряжение (Vin) и оба значения резисторов (R1 и R2). Зная эти значения, мы можем использовать уравнение для нахождения выходного напряжения (Vout):

Подключение датчика напряжения к Arduino

Однако в нашем случае мы будем измерять выходное напряжение (Vout) схемы делителя напряжения с помощью АЦП Arduino. Следовательно, неизвестным значением является Vin.

Давайте перестроим уравнение выше для нахождения входного напряжения (Vin).

Подключение датчика напряжения к Arduino

Это уравнение говорит нам, что входное напряжение (Vin) равно выходному напряжению (Vout), делённому на отношение сопротивления второго резистора (R2) к суммарному сопротивлению (R1 + R2) в цепи.

Распиновка датчика напряжения

Теперь давайте рассмотрим распиновку.

Подключение датчика напряжения к Arduino

Входная клемма

VCC — подключается к положительному выводу источника напряжения, который вы хотите измерить. Рекомендуемый диапазон напряжения для этого вывода — от 0 до 25В.

GND — подключается к отрицательному выводу источника входного напряжения.

Выходной разъём

S — вывод сигнала датчика напряжения. Он выдаёт аналоговое напряжение, пропорциональное уровню входного напряжения. Обычно подключается к одному из аналоговых входных выводов Arduino.

+ — ни к чему не подключён.

— общий вывод заземления.

Схема подключения

Подключить датчик напряжения к Arduino очень просто.

Для начала подключите источник напряжения, который вы хотите измерить, к входной винтовой клемме. Затем подключите вывод «S» датчика напряжения к аналоговому пину «A0» на Arduino, а вывод «–» — к земле.

Изображение ниже показывает, как всё подключить.

Подключение датчика напряжения к Arduino

Пример кода для Arduino

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

// Define analog input
#define ANALOG_IN_PIN A0

// Floats for ADC voltage & Input voltage
float adc_voltage = 0.0;
float in_voltage = 0.0;

// Floats for resistor values in divider (in ohms)
float R1 = 30000.0;
float R2 = 7500.0;

// Float for Reference Voltage
float ref_voltage = 5.0;

// Integer for ADC value
int adc_value = 0;

void setup(){
  // Setup Serial Monitor
  Serial.begin(9600);
}

void loop(){
  // Read the Analog Input
  adc_value = analogRead(ANALOG_IN_PIN);

  // Determine voltage at ADC input
  adc_voltage  = (adc_value * ref_voltage) / 1024.0;

  // Calculate voltage at divider input
  in_voltage = adc_voltage*(R1+R2)/R2;

  // Print results to Serial Monitor to 2 decimal places
  Serial.print("Input Voltage = ");
  Serial.println(in_voltage, 2);

  // Short delay
  delay(500);
}

Загрузите скетч в Arduino и наблюдайте за результатами.

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

Следующий результат получен при подаче 5В на датчик напряжения:

Подключение датчика напряжения к Arduino

А при подаче 12В:

Подключение датчика напряжения к Arduino

Объяснение кода:

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

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

#define ANALOG_IN_PIN A0

Далее определяются два числа с плавающей точкой — adc_voltage и in_voltage — для хранения показаний напряжения на АЦП и на входе делителя напряжения соответственно.

float adc_voltage = 0.0;
float in_voltage = 0.0;

Переменные R1 и R2 хранят значения сопротивлений делителя напряжения. Если вы используете другие резисторы для создания собственного делителя напряжения, вам нужно будет изменить эти значения.

float R1 = 30000.0;
float R2 = 7500.0;

ref_voltage — опорное напряжение для АЦП, обычно 5В для Arduino Uno.

float ref_voltage = 5.0;

Последняя переменная adc_value используется для хранения необработанного цифрового значения, считанного с АЦП.

int adc_value = 0;

В функции setup() мы настраиваем последовательную связь со скоростью 9600 бод.

void setup(){
  Serial.begin(9600);
}

В основном цикле функция analogRead() используется для чтения напряжения на пине A0. Возвращённое значение сохраняется в переменной adc_value.

adc_value = analogRead(ANALOG_IN_PIN);

Это значение затем преобразуется в напряжение (adc_voltage) путём умножения на опорное напряжение и деления на 1024 (поскольку Arduino имеет 10-битный АЦП, значит 2^10 = 1024 различных значений).

adc_voltage  = (adc_value * ref_voltage) / 1024.0;

Входное напряжение делителя напряжения затем вычисляется по формуле делителя напряжения:

Подключение датчика напряжения к Arduino
in_voltage = adc_voltage*(R1+R2)/R2;

Наконец, вычисленное входное напряжение выводится в монитор последовательного порта с точностью до 2 десятичных знаков. После этого Arduino ждёт 500 миллисекунд перед повторением цикла.

Serial.print("Input Voltage = ");
Serial.println(in_voltage, 2);

delay(500);