Опубликовано

Подключение датчиков к ардуино

Подключение аналоговых датчиков к Ардуино, считывание показаний датчиков

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

О датчиках

Соответственно датчики делят на две группы:

1. Цифровые.

2. Аналоговые.

Для считывания цифровых значений могут использоваться как цифровые, так и аналоговые входы микроконтроллера, в нашем случае авр на плате Arduino. Аналоговые же датчики должны подключаться через аналогово-цифровой преобразователь (АЦП). ATMEGA328, именно он установлен в большинстве плат АРДУИНО (подробнее об этом на сайте есть статья), содержит в своей схеме встроенный АЦП. На выбор доступно целых 6 аналоговых входов.

Если вам этого не хватает, вы можете с помощью дополнительного внешнего АЦП подключить к цифровым входам, но это усложнит код и увеличит его объём, из-за добавления алгоритмов обработки и управление АЦП. Тема аналогово-цифровых преобразователей достаточно широка что можно сделать о них отдельную статью или цикл. Проще использовать плату с их большим количеством или мультиплексоры. Давайте рассмотрим, как подключить аналоговые датчики к Arduino.

Общая схема аналоговых датчиков и их подключения

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

Схема выше позволит считывать значения от 0 до 1023, благодаря тому, что всё напряжение падает на потенциометре. Здесь работает принцип делителя напряжения, в любом положении движка напряжение распределяется по поверхности резистивного слоя линейно или в логарифмическом масштабе (зависит от потенциометра) на вход попадает та часть напряжения, которая осталась между выводом ползунка (скользящего контакта) и землёй (gnd). На макетной плате такое соединение выглядит так:

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

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

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

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

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

Рисунок показывает подключение фоторезистора к ардуино.

Программная часть

Прежде чем рассказать о подключении конкретных датчиков, я решил рассмотреть программные средства для их обработки. Все аналоговые сигналы считываются с таких же портов с помощью команды analogRead(). Стоит отметить, что у Arduino UNO и других моделей на 168 и 328 атмеге 10-разрядный АЦП. Это значит, что микроконтроллер видит входной сигнал в виде числа от 0 до 1023 – итого 1024 значения. Если учесть, что напряжение питания 5 вольт, то чувствительность входа:

5/1024=0.0048 В или 4.8 мВ

То есть при значении 0 на входе, напряжение равно 0, а при значении 10 на входе – 48 мВ.

В отдельных случаях для преобразования значений до нужного уровня (например для передачи в шим выход) 1024 делят на число, а в результате деления должно должен получится необходимый максимум. Более наглядно работает функция map(источник, нч, вч, внч, ввч), где:

  • нч – нижнее число до преобразования функцией;

  • вч – верхнее;

  • внч – нижнее число после обработки функцией (на выходе);

  • ввч – верхнее.

Практическое применение для преобразования функцией входного значения для передачи в ШИМ (максимальное значение 255, для преобразования данных из ацп в выход шим 1024 делят на 4):

Вариант 1 – деление.

int x;

x = analogRead(pot) / 4;

// будет получено число от 0 до 1023

// делим его на 4, получится целое число в от 0 до 255 analogWrite(led, x);

Вариант 2 – функция MAP – открывает более широкие возможности, но об этом позже.

void loop()

{ int val = analogRead(0);

val = map(val, 0, 1023, 0, 255);

analogWrite(led, val); }

Или еще короче:

analogWrite(led, map(val, 0, 1023, 0, 255))

Далеко не у всех датчиков на выходе присутствует 5 Вольт, т.е. число 1024 не всегда удобно делить для получения тех же 256 для ШИМа (или любых других). Это может быть и 2 и 2.5 вольта и другие значения, когда максимумом сигнала будет, например 500.

Популярные аналоговые датчики

Общий вид датчика для ардуино и его подключение изображено ниже:

Обычно есть три выхода, может присутствовать четвертый – цифровой, но это особенности.

Расшифровка обозначения выводов аналогового датчика:

  • G – минус питания, общая шина, земля. Может обозначаться как GND, «-«;

  • V – плюс питания. Может обозначаться как Vcc, Vtg, «+»;

  • S – выходной сигнал, возможные обозначения – Out, SGN, Vout, sign.

Новички для освоения считывания значения датчиков выбирают проекты всевозможных термометров. Такие датчики бывают в цифровом исполнении, например DS18B20, и в аналоговом – это всевозможные микросхемы типа LM35, TMP35, TMP36 и другие. Вот пример модульного исполнения такого датчика на плате.

Погрешность датчика от 0.5 до 2 градуса. Построен на микросхеме TMP36, как и её многие аналоги его выходные значения равняются 10 мВ/°С. При 0° выходной сигнал – 0 В, а дальше прибавляется по 10 мВ на 1 градус. То есть при 25.5 градусах напряжение – 0.255 В, возможно отклонение в пределах погрешности и собственного нагрева кристалла ИМС (до 0.1°С).

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

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

Коды для работы с большинством датчиков довольно объёмны, поэтому я их приводить все не буду, их легко найти в сети по запросу «название датчик + Arduino».

Следующий датчик, который часто используют ардуинщики-роботостроители – это датчик линии. Он основан на фотоэлектронных приборах, типа фототранзисторов.

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

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

Дополню смежным датчиком – датчик расстояния от фирмы Sharp, тоже используется в робототехнике, а также в условиях контроля положения предметов в пространстве (с соответствующей ТХ погрешностью).

Работает на том же принципе. Библиотеки и примеры скетчей и проектов с ними в большом количестве есть на сайтах посвященных Arduino.

Заключение

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

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

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

Смотрите также у нас на сайте: Подключение внешних устройств к Arduino

Алексей Бартош

Измерение температуры и влажности на Arduino – подборка способов

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

Измерение терморезистором

Самым простым способом определения температуры является использование терморезистора. Это вид резистора сопротивление которого зависит от температуры окружающей среды. Выделяют терморезисторы с положительным и отрицательным температурным коэффициентом сопротивления – PTC (еще называют позисторы) и NTC-терморезисторы соответственно.

На графике ниже вы видите зависимости сопротивления от температуры. Штриховой линией изображена зависимость для терморезистора с отрицательным ТКС (NTC), а жирной сплошной линией для термистора с положительным ТКС (PTC).

Что мы здесь видим? Первое что бросается в глаза – это то, что у PTC-терморезистора график ломанный и измерять ряд значений температуры будет затруднительно или невозможно, а вот у NTC терморезистора график более-менее равномерный, хоть и явно нелинейный. Что это значит? С помощью NTC терморезистора легче измерять температуру, потому что легче выяснить, функцию по которой изменяются его значения.

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

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

Для описания этого изменение существует уравнение Штейнхарта-харта.

где A, B и C – это константы термистора определяемые по измерениям трёх температур с разницей не менее 10 градусов Цельсия. При этом разные источники указывают, что для типичного 10 кОм NTC-термистора они равны:

Примечание:

Кто хорошо понимает технический текст на английском языке и любит вычисления может ознакомиться со следующим документом: https://www.bipm.org/utils/common/pdf/ITS-90/Guide-SecTh-Thermistor-Thermometry.pdf

Это брошюра об измерениях температуры с помощью термистора выпущенная Консультативным комитетом по термометрии (ККТ).

Однако использование такого уравнение трудоёмко и в любительских проектах неоправданно, поэтому можно воспользоваться beta-уравнением для термистора.

B – бета-коэффициент, он рассчитывается на основе измерения сопротивления для двух различных температур. Указывается либо в даташите (что проиллюстрировано ниже), либо вычисляется самостоятельно.

При этом B указывается в виде:

Это значит, что коэффициент высчитывался исходя из данных полученных при измерении сопротивления при температурах 25 и 100 градусов Цельсия, именно такой вариант распространён более всего. Тогда его высчитывают по формуле:

B = (ln(R1) – ln(R2)) / (1/T1 — 1/T2)

Типовая схема подключения термистора к микроконтроллеру изображена ниже.

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

Для расчета сопротивления термистора можно использовать следующую формулу:

Rтермистора=R1⋅((Vсс/Vвыход)−1)

Чтобы перевести в понятный для ардуино язык нужно вспомнить о том, что у ардуино 10-битный АЦП, значит максимальное цифровое значение входного сигнала (напряжением 5В) будет равно 1023. Тогда условно:

  • Dmax = 1023;

  • D – фактическое значение сигнала.

Тогда:

Rтермистора=R1⋅((Dmax /D)−1)

Теперь используем это для вычисления сопротивления и последующего вычисления температуры термистора с помощью бета-уравнения на языке программирования для Ардуино. Скетч будет таким:

DS18B20

Еще большую популярность для измерения температуры с помощью. Ардуино нашёл цифровой датчик DS18B20. Он связывается с микроконтроллером по интерфейсу 1-wire, вы можете подсоединить несколько датчиков (до 127) на один провод, а для обращения к ним вам придётся узнать ID каждого из датчиков.

Примечание: ID вы должны знать даже если используете всего 1 датчик.

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

Также есть режим паразитного питания – его схема подключения выглядит так (нужно два провода вместо трёх):

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

Цифровой датчик температуры DS18B20 состоит из целого набора узлов, как и любая другая ЦИМС. Её внутреннее устройство вы можете наблюдать ниже:

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

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

DHT11 и DHT22 – датчики влажности и температуры

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

DHT11 DHT22
Определение влажности в диапазоне 20-80% 0-100%
Точность измерений 5% 2-5%
Определение температуры от 0°C до +50°C от -40°C до +125°C
Точность измерений 2,5% плюс-минус 0,5 Градусов Цельсия
Частота опроса 1 раз в секунду 1 раз в 2 секунды

Схема подключения довольно проста:

  • 1 вывод – питание;

  • 2 вывод – данные;

  • 3 вывод – не используется;

  • 4 вывод – общий провод.

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

Для работы нам нужна библиотека dht.h её нет в стандартном наборе, поэтому её нужно скачать и установить в папке libraries в папке с arduino IDE. Она поддерживает все датчики этого семейства:

  • DHT 11;

  • DHT 21 (AM2301);

  • DHT 22 (AM2302, AM2321).

Пример использования библиотеки:

Заключение

В наше время создать свою станцию для измерения температуры и влажности очень просто благодаря платформе Arduino. Стоимость таких проектов составляет 3-4 сотни рублей. Для автономной работы, а не вывода данных на компьютер, может использоваться символьный дисплей (их мы описывали в недавней статье), тогда можно построить портативный прибор для использования как дома, так и в машине. Пишите в комментариях что еще вы хотели бы узнать о простых самоделках на ардуино!

Смотрите также по этой теме: Популярные датчики для Arduino — подключение, схемы, скетчи

Алексей Бартош

Подключаем терморезистор к arduino, получим температуру в градусах по Цельсию и по Фаренгейту

Всем привет, давайте сегодня поработаем с еще одним элементом, который входит в комплект Arduino, это терморезистор.

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

Обратите внимание, черный это минус мы его берем с основной платы, где находится дисплей, красный у нас это плюс 5 вольт приходит на крайнюю ножку терморезистора, белый провод приходит в ардуино в разъем A0 – нулевой аналоговый разъем и здесь в средней точке подключается между сопротивлением на 10кОм и терморезистором.

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

#include < LiquidCrystal.h>

Определим, какие контакты у нас используются в LCD, далее объявим константу analogPin для A0, объявим магическое число beta 4090, это величина, я так понимаю, снимаемая с терморезистора и объявим переменную Resistance – сопротивление, это величина 10 кОм которые мы используем.

LiquidCrystal lcd(4, 6, 10, 11, 12, 13); #define analogPin A0 #define beta 4090 #define resistance 10

В подпрограмме setup мы подключаемся к LCD дисплею, указываем, что он у нас две строки по 16 символов, и изначально мы его очищаем.

void setup() { lcd.begin(16, 2); lcd.clear(); }

В цикле loop мы получим данные с аналогового разъёма путем analogRead из A0. Затем вставим такую длинную формулу для получения температуры в градусах Цельсия:

void loop() { long a =analogRead(analogPin); float tempC = beta /(log((1025.0 * resistance / a — resistance) / resistance) + beta / 298.0) — 273.0; ………..

мы делим бета на выражение, вычисляем логарифм 1025 умноженное на сопротивление, делённое на значение analogPin минус сопротивление, за скобкой деленное на сопротивление, плюс бета деленное на 298 и минус 273.

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

float tempF = 1.8*tempC + 32.0;

Теперь мы установим курсор в нулевую позицию на экране, выведем на печать методом print текст Temp, как вы помните из прошлых видео, кириллицу этот дисплей не поддерживает, напишем на английском. Далее выводим в этой же строке переменную tempС, которую получили ранее, весь текст будет в одном ряду, и мы выводим чуть дальше обозначение градусов Цельсия.

lcd.setCursor(0, 0); lcd.print(«Temp: «); lcd.print(tempC); lcd.print(» C»);

Обратите внимание, здесь раз-два-три пробела, чтобы текст отделялся от переменной. Затем мы устанавливаем курсор на вторую строку, для примечания напишу, что это вторая строка. Ну а это у нас первая строка. Установили курсор, вывели на второй строчке Fahr Фаренгейт и вывели переменную tempF.

lcd.setCursor(0, 1); lcd.print(«Fahr: «); lcd.print(tempF);

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

lcd.print(» F»); delay(200); }

И в конце делаем задержку в 200 миллисекунд. Форматируем наш скетч (ctrl+T), уберём лишние строки, всё у нас вроде как помещается. Давайте сохраним скетч на рабочий стол, подключим Arduino и теперь давайте его проверим и загрузим. Выполнили проверку, ошибок нет, зальём код в Arduino и посмотрим, что покажет терморезистор.

#include < LiquidCrystal.h> LiquidCrystal lcd(4, 6, 10, 11, 12, 13); #define analogPin A0 #define beta 4090 #define resistance 10 void setup() { lcd.begin(16, 2); lcd.clear(); } void loop() { long a =analogRead(analogPin); float tempC = beta /(log((1025.0 * resistance / a — resistance) / resistance) + beta / 298.0) — 273.0; float tempF = 1.8*tempC + 32.0; lcd.setCursor(0, 0); lcd.print(«Temp: «); lcd.print(tempC); lcd.print(» C»); lcd.setCursor(0, 1); lcd.print(«Fahr: «); lcd.print(tempF); lcd.print(» F»); delay(200); }

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

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

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

if (tempC > 22 && tempC < 28) //оптимальный температурный режим для включения вентилятора { digitalWrite(12,HIGH); // подадим напряжение на 12 пин и включим реле }

Реле, которые продаются на AliExpress и есть в комплекте к обучающему набору ардуино, вполне смогут коммутировать не только вентилятор, так как максимальный ток указан 10 ампер. Но работу с реле рассмотрим в следующий раз, так что впереди много чего интересного.

Потенциометры часто используются в проектах на Ардуино. Они могут применяться как управляющие механизмы или как эмулятор аналогового сигнала при отладке. Потенциометры — это переменные резисторы, которые изменяют сопротивление в зависимости от угла поворота ручки. По ссылке есть выбор из потенциометров с разным сопротивлением. Для Arduino лучше всего подходит номинал 10 кОм.

Arduino имеет аналоговые контакты, которые считывают значение напряжения. У разных моделей ардуино разное количество аналоговых пинов. На большинстве плат микроконтроллеров аналоговые пины нумеруются отдельно с ведущей строчной буквой «А».

Аналоговые выводы

Котаны, читайте на здоровье!

×

Статья проплачена кошками — всемирно известными производителями котят.

Если статья вам понравилась, то можете поддержать проект.

Закрыть

На плате UNO есть шесть выводов, которые подписаны от A0 до A5 (у других плат может быть другое число выводов). Они работают с напряжением от 0 до 5V. Для чтения показания напряжения есть встроенный метод analogRead(), возвращающий значение от 0 до 1023. Значение 0 относится к 0V, а 1023 к 5V. Таким образом, если мы хотим конвертировать значение от 0 до 5, то нужно произвести деление 1023/5 = 204.6

Кроме того, аналоговые выходы могут работать как цифровые и обозначаются как 14, 15, 16, 17, 18, 19 вместо A0..A5.

И, наоборот, цифровые порты с символом тильды ~ (3, 5, 6, 9, 10, 11) могут работать как аналоговые выходы, используя ШИМ.

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

Изучим простой пример с одним проводом и аналоговым выводом. Соединим проводом порты A0 и 3.3V. Напишем скетч.

int analogPin = A0; void setup() { Serial.begin(9600); } void loop() { int rawReading = analogRead(analogPin); float volts = rawReading / 204.6; Serial.println(volts); delay(1000); }

Откройте окно Serial Monitor и наблюдайте за показаниями. Должны выводиться числа, близкие к значению 3.3: 3.1, 3.2, 3.3. Если, не закрывая программу, вытащить конец провода из порта 3.3V и вставить в порт 5V, то показания изменятся, а на экране появятся числа 5.0. Если перекинуть конец провода на GND, то увидим значения 0.

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

01.Basics | AnalogReadSerial (Чтение аналоговых выводов через потенциометр)

С помощью потенциометра мы можем менять напряжение и считывать данные с выводов.

Продолжим изучение работы с аналоговыми выводами через пример AnalogReadSerial из меню File | Examples | 01.Basics. Цель урока — плавно изменять напряжение и подавать его на аналоговый вывод, чтобы получить с него текущее значение напряжения.

Нам понадобятся плата Arduino, потенциометр и несколько проводов (или перемычек). Соединяем парные ножки с выводами на плате 5V и GND. Среднюю ножку необходимо соединить с аналоговым выводом на плате, помеченную как A0.

Не важно, какая из крайних ножек потенциометра будет подключена к 5V, а какая к GND, поменяется только направление, в котором нужно крутить ручку для изменения напряжения. Сам сигнал считывается со средней ножки, которая связана с аналоговым портом. Для считывания аналогового сигнала, принимающего широкий спектр значений, а не просто 0 или 1, подходят только порты, помеченные на плате как ANALOG IN. Они все пронумерованы с префиксом A (A0-A5).

Схема готова. Вращая регулятором потенциометра, мы можем менять сопротивление от 5 Вольт до 0. Arduino позволяет считывать текущее напряжение, которое подаётся на среднюю ножку при помощи аналогового вывода. Результаты могут колебаться от 0 до 1023.

Код

void setup() { // инициализируем соединение на скорости 9600 бит в секунду: Serial.begin(9600); } void loop() { // Считываем данные с аналогового вывода A0 int sensorValue = analogRead(A0); // получаем текущее значение Serial.println(sensorValue); // выводим результат на монитор delay(1); // небольшая задержка для стабильности вывода результатов }

Код очень простой. При инициализации устанавливаем нужную скорость связи: Serial.begin(9600);. Далее в цикле мы постоянно считываем данные, поступающие с потенциометра при помощи метода analogRead(). Так как значения будут находиться в диапазоне от 0 до 1023, мы можем использовать тип int для переменной sensorValue.

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

Проверка (Serial Monitor)

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

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

01.Basics | ReadAnalogVoltage (Напряжение аналоговых выводов через потенциометр)

Рассмотрим урок ReadAnalogVoltage из меню File | Examples | 01.Basics. Он практически идентичен примеру AnalogReadSerial, только мы будем конвертировать значения от аналогового вывода (0…1023) в значения напряжения (0…5). Для примера нам понадобится потенциометр. Цель урока — плавно изменять напряжение и подавать его на аналоговый вывод, чтобы получить текущее значение напряжения.

Схема прежняя, ничего не меняем. Соединяем парные ножки с выводами на плате 5V и GND. Среднюю ножку необходимо соединить с аналоговым выводом на плате, помеченную как A0.

Схема готова. Вращая регулятором потенциометра, мы можем менять сопротивление от 5 Вольт до 0. Arduino позволяет считывать текущее напряжение, которое подаётся на среднюю ножку при помощи аналогового вывода. Результаты могут колебаться от 0 до 1023.

void setup() { Serial.begin(9600); } void loop() { // читаем данные с вывода A0: int sensorValue = analogRead(A0); // Конвертируем данные от 0 до 1023) в значения напряжения (0 — 5V): float voltage = sensorValue * (5.0 / 1023.0); // Выводим результат Serial.println(voltage); }

Если сравнить два примера, то разница в одной строке float voltage = sensorValue * (5.0 / 1023.0);. В цикле считываем данные, поступающие с потенциометра при помощи метода analogRead(). Так как значения будут находиться в диапазоне от 0 до 1023, мы можем использовать тип int для переменной sensorValue. Используем элементарную математику и делим результат на коэффициент.

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

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

Светодиод с плавной регулировкой

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

Принципиальная схема.

Напишем код.

int potPin = A0; int ledPin = 9; void setup() { // порт для светодиода на выход pinMode(ledPin, OUTPUT); // пин с потенциометром — вход // мы хотим считывать напряжение, // выдаваемое им pinMode(potPin, INPUT); Serial.begin(9600); } void loop() { // значение напряжения с потенциометра int rotation; // значение яркости int brightness; // считываем напряжение с потенциометра от 0 до 1023 // пропорциональное углу поворота ручки rotation = analogRead(potPin); // в brightness записываем полученное ранее значение rotation // делённое на 4. Дробная часть от деления будет отброшена. // В итоге мы получим целое число от 0 до 255 brightness = rotation / 4; // выдаём результат на светодиод analogWrite(ledPin, brightness); // выводим результат в Serial Monitor Serial.println(brightness); delay(1); // задержка для стабильности }

Практически все инструкции вам знакомы. Тут нужно уяснить момент, что яркость светодиода управляется нашим кодом, а не подачей напряжения через потенциометр. Мы считываем показания потенциометра, как в первом варианте и переводим получаемые значения в диапазон от 0 до 255. Затем воспроизводим старый пример с плавной регулировкой светодиода и подаём ему нужные значения. Теперь при вращении ручки потенциометра мы одновременно управляем степенью накала светодиода. Напомню, что светодиод следует подключить к портам с тильдой, например, ~9

03.Analog: Smoothing

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

Для демонстрации можно использовать потенциометр, хотя он выдаёт обычно нормальные данные, но нам важно узнать принцип.

Схема обычная, берём из примеров выше.

// число показаний для получения среднего значения (подбирается индивидуально) const int numReadings = 10; int readings; // массив данных от аналогового вывода int readIndex = 0; // текущий индекс int total = 0; // общее значение int average = 0; // среднее значение int inputPin = A0; // Аналоговый вывод А0 void setup() { Serial.begin(9600); // заполняем массив из 10 элементов нулями for (int thisReading = 0; thisReading < numReadings; thisReading++) { readings = 0; } } void loop() { // вычитаем значение total = total — readings; // считываем с датчика readings = analogRead(inputPin); // добавляем полученное значение total = total + readings; // переходим на следующую позицию в массиве readIndex = readIndex + 1; // если достигли конца массива… if (readIndex >= numReadings) { // …возвращаемся в начало: readIndex = 0; } // подсчитываем среднее значение average = total / numReadings; // посылаем данные на компьютер Serial.println(average); delay(1); // небольшая задержка для стабильности }

05.Control: IfStatementConditional

В примере File | Examples | 05.Control | IfStatementConditional рассматривается случай, когда показания достигают определённой величины. При достижении заданного порога включается светодиод. Урок знакомит новичка с оператором условия if (Если).

Схема без изменений (см. рисунки выше). Среднюю ножку потенциометра соединяем с аналоговым выводом A0, остальные две ножки соединяем с питанием 5В и землёй. При желании установите внешний светодиод на цифровой вывод 13 (можно обойтись встроенным светодиодом).

const int analogPin = A0; // аналоговый вывод для потенциометра const int ledPin = 13; // цифровой вывод для светодиода const int threshold = 400; // произвольный порог для показаний потенциометра void setup() { pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { // считываем данные с потенциометра int analogValue = analogRead(analogPin); // Если показания выше чем заданный порог, то включаем светодиод if (analogValue > threshold) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); // иначе держим светодиод выключенным } // выводим показания на Serial monitor Serial.println(analogValue); delay(1); // задержка для стабильности } >Другие примеры

07.Display: barGraph (Световая шкала и потенциометр)

>Ардуино подключение фоторезистора. Датчик освещенности для arduino

15 02 2017 admin Пока нет комментариев

Как работает датчик освещенности?

Основным элементом датчика являются фоторезисторы, фототранзисторы и фотодиоды.

Подключение фоторезистора Обозначение фоторезистора Обозначение фоторезистора Принцип работы фоторезистора

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

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

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

Различаются фоторезисторы по диапазону сопротивления. Например:

  • VT83N1 — 12-100кОм;
  • VT93N2 — 48-500кОм.

Это значит, что в темноте сопротивления фоторезистора равно 12кОм, а при определенной тестовой засветке — 100кОм. Конкретно в случае этих светодиодов, тестовая засветка имела параметры: освещенность -10 Люкс, и цветовая теплота — 2856К.

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

Фотодиод Фотодиод Фототранзистор Фототранзисторы и фотодиоды

Датчик освещенности — ардуино подключение



BH1750FVI цифровой модуль освещенности для Arduino

Для измерения освещенности отлично подходят на базе сенсора BH1750 датчики Gy-30 и Gy-302.

Характеристики BH1750FVI цифровой модуль освещенности для Arduino:

  • Цифровой 16-битный цифровой датчик освещённости
  • Чувствителен к видимому свету и практически не подвержен влиянию инфракрасного излучения
  • Построен на микросхеме BH1750FVI
  • Напряжение питания: +3..+5 В постоянного тока.
  • Интерфейс: I2C.
  • Диапазон измеряемой освещенности: (1 — 65535 лк).
  • Размеры: 3,3 см х 1,5 см х 1,1 см
  • Вес: 5 г
  1. Подключение модуля производится по двухпроводному интерфейсу I2C, который в плате Arduino реализован на аналоговых пинах A4 и A5, отвечающих за SDA (шина данных) и SCL (шина тактирования), соответственно. Вывод ADDR модуля GY-302 можно оставить не подключённым или заземлить.
  2. Подключаем модуль с помощью провода «Папа-Мама»

    BH1750 (Gy-30, Gy-302) Arduino Uno
    Vcc +5V
    GND GND
    SCL A5
    SDA A4
  3. Устанавливаем библиотеку. Скачанный архив распакуем в директорию со средой разработки «Arduino IDE/libraries»
  4. Загружаем скетч

// подключаем библиотеку I2C:

#include <Wire.h>

// подключаем библиотеку датчика BH1750:

#include <BH1750.h>

// объявляем объект lightMeter:

BH1750 lightMeter;

void setup() {

Serial.begin(9600); //инициализация послед. порта

lightMeter.begin(); //инициализация датчика BH1750

}

void loop() {

//считываем показания с BH1750:

uint16_t lux = lightMeter.readLightLevel();

//выводим показания в послед. порт:

Serial.println(String(lux) + » lx»);

delay(100); //задержка 100 мсек

}

В скетче мы каждые 100 мсек считываем с датчика BH1750 показания освещённости в люксах и выводим эти данные в последовательный порт.

Проверяем работу. Для этого подключаем Ардуино к ПК. Запускаем среду разработки Arduino IDE и открываем монитор последовательного через меню Инструменты (Ctrl+Shift+M). Смотрим как меняются показания, если направить свет на датчик или если его затенить.

Датчик света — это прибор, который позволяет нашему устройству оценивать уровень освещенности. Для чего нужен такой датчик? Например, для системы уличного освещения, чтобы включать лампы только тогда, когда на город спускается ночь. Еще одно применение датчиков света — это детектирование препятствия роботом, путешествующем по лабиринту. Либо детектирование линии роботом следопытом (LineFollower). Но в этих двух случаях, в паре с датчиком света используют специальный источник света. Мы же начнем с простого примера, и подключим к микроконтроллеру Ардуино Уно один из самых распространенных датчиков — фоторезистор. Как долнжо быть понятно из названия, фоторезистор — это резистор, который меняет свое сопротивление в зависимости от падающего на него света. Выглядит этот радиоэлемент так: Различаются фоторезисторы по диапазону сопротивления. Например:

  • VT83N1 — 12-100кОм;
  • VT93N2 — 48-500кОм.

Это значит, что в темноте сопротивления фоторезистора равно 12кОм, а при определенной тестовой засветке — 100кОм. Конкретно в случае этих светодиодов, тестовая засветка имела параметры: освещенность -10 Люкс, и цветовая теплота — 2856К. Кроме фоторезистора, в датчиках света часто используют фотодиод и фототранзистор. Оба выглядят как типичные светодиоды:

2. Программа

Подключив фоторезистор по нехитрой схеме, начинаем писать программу. Первое что мы сделаем, это выведем необработанный сигнал с аналогового входа в последовательный порт, для того чтобы просто понять, как меняется значение на входе A0. Соответствующая программа имеет вид: const int pinPhoto = A0; int raw = 0; void setup() { Serial.begin(9600); pinMode( pinPhoto, INPUT ); } void loop() { raw = analogRead( pinPhoto ); Serial.println( raw ); delay(200); } Запустив эту программу у нас в хакспейсе, мы получили следующие значения с датчика: А теперь прикроем датчик рукой: Видно, что значение сильно меняется. От 830 при прямом попадании света, до 500 в случае затенения (появление преграды на пути света). Зная такое поведение, мы можем численно определить порог срабатывания. Пусть он будет равен, скажем, 600. Не ровно 500, потому что мы хотим обезопасить себя от случайного срабатывания. Вдруг над датчиком пролетит муха — он слегка затенится, и покажет 530. Наконец, добавим в программу некое действие, которое будет совершаться если уровень освещенности станет ниже заданного порога. Самое простое, что мы можем сделать — это зажигать на Ардуино штатный светодиод #13. Получается такая вот программа: const int pinPhoto = A0; const int led = 13; int raw = 0; void setup() { pinMode( pinPhoto, INPUT ); pinMode( led, OUTPUT ); } void loop() { raw = analogRead( pinPhoto ); if( raw < 600) digitalWrite( led, HIGH ); else digitalWrite( led, LOW ); delay(200); } Накрываем датчик рукой (или выключаем свет в комнате) — светодиод зажигается. Убираем руку — гаснет. Работает, однако. А теперь представьте, что вы зажигаете не светодиод, а подаете сигнал на реле, которое включает лампу в подъезде вашего дома. Получаеся готовый прибор для экономии электроэнергии. Или ставите такой датчик на робота, и он при наступлении ночи ложится спать вместе с вами 🙂 В общем, как говорил профессор Фарнсворт, у датчика света тысяча и одно применение! Вконтакте Facebook Twitter Google+ 0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *