Взаимодействие с окружающим миром
Наши устройства будут взаимодействовать с окружающим миром с помощью различных датчиков. Датчики бывают аналоговыми и цифровыми.
В этом уроке мы научимся подключать датчики к Arduino и считывать их показания. Давайте попробуем подключить несколько датчиков к Arduino. Готовые скетчи в прикрепленных файлах.
Нам понадобятся
- Резстор на 10 КОм и на 220 Ом
- Термистор
- Фоторезистор
- Кнопка тактовая
- Светодиод
- Соединительные провода «Папа-Папа»
Термистор
Термистор – это резистор, сопротивление которого изменяется в зависимости от его нагрева. С помощью термистора можно измерять температуру.
Давайте соберем небольшой эксперимент с термистором. Внимание на схему сборки.
А теперь давайте немного покодим.
//Показания термистора выводятся не в градусах.Для того, чтобы их перевести в градусы, нужно воспользоваться хитрой формулой. //В этой формуле нам нужны будут логарифмы, поэтому мы подключим библиотеку. #include <math.h> void setup() { //Для того, чтобы снять показания с нашего мини-термометра, нам нужно включить SerialMonitor. //Он предназначен для связи Arduino с компьютером. //О нем можно прочитать здесь: http://arduino.ru/Reference/Serial //Мы будем выводить показания нашего датчика в Serial Monitor. //Чтобы его открыть, зажмите Ctrl+Shift+M Serial.begin(9600); } void loop() { //Есть переменные различных типов.В этом эксперименте мы должны создать переменную с плавающей запятой. //Подробнее о таких переменных переменных читайте здесь: http://arduino.ru/Reference/Float //Нужно указывать дробную часть у всех констант. Иначе, дробная часть отбросится. float i = analogRead(A2) * 5.0 / 1024.0; //Создадим промежуточную переменную,в которую запомним //показания термистора. //Считываем с помощью функции AnalogRead. //О ней: http://arduino.ru/Reference/AnalogRead // Эта часть кода "* 5.0 / 1024.0" приводит считываемые //значения в нужную нам форму, для применения в формуле. float temp = -14.5 * log((10000.0 * i) / (5.0 - i) / 27074.0); //Мы создали переменную для вывода в Serial monitor. //И, чтобы найти значение температуры,применяем нашу формулу. Serial.println (temp); //Теперь выводим нашу температуру в Serial monitor. delay(1000); //Делаем небольшую задержку перед выводами значений в Serial monitor. } //Теперь откроем Serial monitor.Открываем после компиляции программы.
Пояснения к коду
#include – С помощью этой функции мы можем подключать различные библиотеки, нужные для выполнения различных задач. Библиотека представляет собой набор функций, шаблонов и всякой всячины. Она нужна для расширения возможностей языков программирования.
Serial - Позволяет установить соединение с компьютером. С помощью Serial monitor можно получать на экран компьютера показания датчиков и отправлять команды на контроллер. Очень полезная штука при отладке скетчей. Как это делать будет описано в последующих уроках.
Фоторезистор
Фоторезистор тоже резистор, но его сопротивление изменяется в зависимости от освещенности. Давайте его подключим.
А теперь код.
// Теперь подключим фоторезистор. void setup() { Serial.begin(9600); // Снова подключим Serial monitor } void loop() { float i = analogRead(A2); i = map(i, 0, 1023, 0, 4); //Приведем значения, считываемые с датчика в нужную нам форму. Serial.println(i); //Выведем значение переменной i в Serial monitor delay(1000); //Сделаем небольшую паузу. } //Теперь мы получаем данные об освещенности в диапазоне от 0 до 4.
Пояснения к коду
Коды похожи? Внимательный читатель заметил, что коды примеров очень похожи. Отсюда можно сделать вывод, что все аналоговые датчики подключаются и считываются одинаково. Каждый из аналоговых датчиков выдает на выходе какое-либо значение, которое мы потом используем для наших зада
Цифровой датчик
Цифровые датчики считываются почти как аналоговые, изменения только в подключении их к цифровым пинам. Еще используются другие функции для считывания. Примером цифрового датчика является кнопка. Давайте сделаем небольшой эксперимент с кнопкой, при нажатии которой, будет загораться светодиод.
#define LED 8 //Это светодиод. #define BUT 12 // Это кнопка, с помощью которой, светодиод будет включаться. void setup() { pinMode(LED, OUTPUT); //Обозначим светодиод как выход. pinMode(BUT, INPUT_PULLUP); //INPUT_PULLUP позволяет не включать подтягивающий/стягивающий резистор в //схему. //На пинах Arduino уже предусмотрен подтягивающий резистор. Serial.begin(9600); //Установим связь с компьютером, чтобы посмотреть, какие сигналы идут от кнопки. } void loop() { boolean val = digitalRead(BUT); //Создаем переменную типа boolean. //Это логическая переменная.О ней: http://arduino.ru/Reference/BooleanVariables //Ей можно задавать всего два значения True ли False. if (!val) //Это оператор с условием.В скобках задается условие. //Мы задали:Если принято значение "не val", включить светодиод,иначе - выключить. //Знак ! обращает логическое значение в обратное ему.Про него: //http://cppstudio.com/post/297/ //В не нажатом состоянии значение кнопки равно 1.В нажатом- 0. //Поэтому мы использовали ! { digitalWrite(LED, HIGH); } else //Если значение val равно единице- выключаем светодиод. { digitalWrite(LED, LOW); } Serial.println(val); //Выведем в Serial monitor значение, считываемое с кнопки, чтобы убедиться, что //оно может быть 1 или 0, TRUE или FALSE. }
Пояснения к коду
INPUT_PULLUP - предназначен для включения встроенного в Arduino подтягивающего резистора. Подтягивающий резистор нужен, чтобы гарантировать на пине, с которым соединен проводник, высокий или низкий уровень .Попробуйте настроить пин просто как INPUT, вы увидите, что светодиод горит, независимо от того, нажата ли кнопка.
BOOLEAN - Это тип логических данных. Он может быть либо true(1), либо false(0).
IF – Оператор условия. Проверяет данное условие или условия и, в зависимости от результата сравнения, выполняет определенные действия.
Вывод
В этом уроке мы научились считывать значения с нескольких датчиков. А с помощью значения, считываемого с кнопки, мы включали и выключали светодиод. Так же мы узнали новый тип переменных - логическая переменная и научились применять ветвление программы. Отлично! Можно двигаться дальше.
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
Плата Arduino | Arduino Uno | 1 | Поиск в магазине Отрон | |||
Светодиод | АЛ307ВМ | 1 | Поиск в магазине Отрон | |||
Термистор | B57164-K 103-J | 1 | Поиск в магазине Отрон | |||
Резистор | 10 кОм | 1 | Поиск в магазине Отрон | |||
Резистор | 220 Ом | 1 | Поиск в магазине Отрон | |||
Фоторезистор | VT90N2 | 1 | Поиск в магазине Отрон | |||
Кнопка тактовая | Без фиксатора | 1 | Поиск в магазине Отрон | |||
Макетная плата | Breadboard-half | 1 | Поиск в магазине Отрон | |||
Соединительные провода | "Папа-Папа" | 4 | Поиск в магазине Отрон | |||
Скачать список элементов (PDF)
Прикрепленные файлы:
- Termistor.ino (3 Кб)
- Fotorez.ino (1 Кб)
- Buttion.ino (2 Кб)
Комментарии (2) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
Если хочется получать показания от 0 до 4, применяйте вот такую функцию.