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

УЗ-датчик расстояния HC-SR04

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

УЗ-датчик HC-SR04 определяет расстояние до объекта, измеряя время прихода отраженной волны (рис. S3.1). Такой же принцип ультразвуковой эхолокации используют летучие мыши.

Основные характеристики

Наименование Значение
Напряжение питания, В 5
Ток покоя, мA <2
Эффективный угол менее 15°
Диапазон измерения расстояния, см 2 ÷ 400
Разрешение, см 0,3
Рабочий ток, мA 15
Рабочая частота, кГц 40
Размеры, мм 45×20×15

Внешний вид, назначение контактов

03-01-HC-SR-04

Рис. S3.1. Принцип действия УЗ-датчика

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

2-03-2-HC-SR-04

Рис.S3.2. Схема подключения УЗ-датчика

Программный код

Листинг S3.1. Определение дальности с помощью УЗ-датчика HC-SR04

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#define TrigPin 4 //Номер пина Trig Датчика расстояния(HC-SR04)
 
#define EchoPin 5 //Номер пина Echo Датчика расстояния(HC-SR04)
 
long duration, cm, inches; //переменные
 
void setup() {
 
//Инциализация последовательного порта
 
Serial.begin (9600);
 
//Установка режима работы для пинов
 
pinMode(TrigPin, OUTPUT);
 
pinMode(EchoPin, INPUT);
 
}
 
void loop(){
 
// Датчик срабатывает при высоком импульсе 10 или более микросекунд.
 
// Для большей точности установим значение LOW на пине Trig:
 
digitalWrite(TrigPin, LOW);
 
delayMicroseconds(5);
 
// Теперь установим высокий уровень на пине Trig
 
digitalWrite(TrigPin, HIGH);
 
delayMicroseconds(10);
 
digitalWrite(TrigPin, LOW);
 
//Считываем сигнал с датчика: высокий импульс,
 
//длительность которого равна времени (в микросекундах)
 
//от отправки пинга до получения его эхо-сигнала от объекта.
 
duration = pulseIn(EchoPin, HIGH);
 
cm = (duration/2)/29.1; //преобразуем время в расстояние в см
 
inches = (duration/2)/74; //преобразуем время в расстояние в дюймах
 
Serial.print(inches);
 
Serial.print("in, ");
 
Serial.print(cm);
 
Serial.print("cm");
 
Serial.println();
 
delay(250);
 
}

Результат

2-03-3-HC-SR-04

Рис. S3.3. Результаты измерений

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

Считывание выходного сигнала потенциометра

Потенциометром называется регулируемый делитель напряжения, который — в отличие от реостата — служит для регулировки напряжения при почти неизменном токе. Снимаемое с подвижного отводного контакта потенциометра напряжение (рис. S9.1) в зависимости от текущего положения подвижного контакта может изменяться от нуля до максимального значения, равного приложенному к потенциометру напряжению.

Внешний вид, назначение контактов

2-09-1-потенциометр

Рис. S9.1. Напряжение на потенциометре

Изучаем Arduino: инструменты и методы технического волшебства. 2-е изд. Подробную информацию о чтении данных с потенциометра можно найти в прилагаемой к набору книге Дж. Блума «Изучаем Arduino: инструменты и методы технического волшебства» (см. п. 3.5 «Считывание выходного сигнала потенциометра»)
https://bhv.ru/product/izuchaem-arduino-instrumenty-i-metody-tehnicheskogo-volshebstva-2-e-izd-per-s-angl/
стр.88

Считывание выходного сигнала потенциометра

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

C:\Users\acer\Documents\#Electronics\Магазин электроники\фрагменты из книг\Anansi\AppData\Local\Temp\FineReader10\media\image4.jpeg

Рис. 3.3. Монтажная схема подключения потенциометра к плате Arduino (Рисунок создан в программе Fritzing)

Вращение ручки потенциометра меняет напряжение на его среднем выводе (которое подается на аналоговый вход 0 платы Arduino) в диапазоне от 0 до 5 В. В этом можно убедиться, подключив вольтметр к выводам потенциометра, как показано на рис. 3.4, и наблюдая за показаниями на дисплее при повороте ручки потенциометра. Красный (положительный) щуп вольтметра подключается к среднему выводу потенциометра, а черный (отрицательный) к тому крайнему выводу потенциометра, который соединен с землей. Ваш потенциометр и вольтметр могут отличаться от изображенных на рис. 3.4.

C:\Users\acer\Documents\#Electronics\Магазин электроники\фрагменты из книг\Anansi\AppData\Local\Temp\FineReader10\media\image5.jpeg

Рис. 3.4. Измерение варьирующегося напряжения на потенциометре

Прежде чем использовать выходной сигнал потенциометра для управления каким-либо другим устройством, мы реализуем более простой проект — передачу цифровых данных для текущих аналоговых значений выходного напряжения потенциометра на компьютер и вывод их на экран. Для этого нам потребуется средство последовательной связи платы Arduino. Соответствующая программа приведена в листинге 3.1. Откройте в среде IDE Arduino файл программы и загрузите его в Arduino. Функция analogRead() считывает входной сигнал, подаваемый с потенциометра на контакт Arduino, а функция Serial.println() выводит соответствующие цифровые значения в окно монитора порта среды IDE Arduino.

Листинг 3.1. Программа pot.ino для считывания выходного аналогового сигнала потенциометра

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Программа для считывания выходного аналогового сигнала
 
// потенциометра
 
const int POT=0; // Сигнал с потенциометра подается на аналоговый
 
// контакт 0
 
int val = 0; // Переменная для хранения аналогового значения,
 
// полученного с контакта POT
 
void setup()
 
{
 
Serial.begin(9600);
 
}
 
void loop()
 
{
 
val = analogRead(POT);
 
Serial.println(val);
 
delay(500);
 
}

Мы исследуем функциональность последовательного интерфейса более подробно в последующих главах. На данном же этапе нам нужно знать только то, что последовательный интерфейс с компьютером необходимо запустить в функции setup(). Функция запуска Serial.begin() принимает один аргумент, значение которого указывает скорость передачи данных в бодах, или в битах в секунду. Более высокая скорость передачи данных позволяет передавать больший объем данных за меньший период времени, но в некоторых системах может также вызывать искажения передаваемых данных Обычно применяют скорость 9600 бод, которую мы и будем назначать для большинства проектов в этой книге.

При каждой итерации цикла loop() переменной val присваивается текущее цифровое значение, выдаваемое АЦП в ответ на амплитуду аналогового сигнала на контакте А0. Команде analogRead() необходимо передавать номер контакта АЦП. В данном случае это контакт А0, так как именно к нему мы подключили вывод потенциометра. Вообще то, если действовать строго по правилам, то следовало бы указать аргумент A0, обозначив тем самым аналоговый контакт, но поскольку функция analogRead() может работать только с аналоговыми контактами, то она “знает”, что 0 обозначает A0. После получения цифрового значения уровня входного сигнала (числа в диапазоне от 0 до 1023) функция Serial.println() передает это значение в программу монитора порта среды Arduino IDE, которая отображает его в своем окне, с последующим выводом символа новой строки для перевода курсора на следующую строку. Затем исполнение кода в цикле приостанавливается на 500 мс (чтобы предотвратить слишком быструю прокрутку чисел в окне монитора порта), после чего процесс повторяется.

Вы можете обратить внимание, что при исполнении этой программы светодиод платы Arduino мигает каждые 500 мс (по крайней мере, он должен так мигать). Такое мигание этого светодиода означает, что плата Arduino передает через USB-интерфейс данные программе последовательного терминала на компьютере. Для приема передаваемых платой Arduino данных можно использовать одну из множества программ последовательного терминала, но проще всего работать с программой монитора порта среды Arduino IDE. Запустите эту программу, щелкнув по значку увеличительного стекла справа на панели инструментов редактора скетчей (рис. 3.5).

C:\Users\acer\Documents\#Electronics\Магазин электроники\фрагменты из книг\Anansi\AppData\Local\Temp\FineReader10\media\image6.jpeg

Рис. 3.5. Кнопка запуска монитора порта (выделена кружком)

В открывшемся окне монитора порта должны отображаться числа, посылаемые ему платой Arduino. Поверните ручку потенциометра в ту или иную сторону. Отображаемые числа должны уменьшаться или увеличиваться, в зависимости от направления поворота. Если повернуть ручку до предела в одном направлении, то в окне монитора порта будет выводиться значение 0, а если в другом направлении — число 1023 (или наоборот). На рис. 3.6 показан пример окна монитора порта с отображаемыми в нем значениями.


Примечание

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


C:\Users\acer\Documents\#Electronics\Магазин электроники\фрагменты из книг\Anansi\AppData\Local\Temp\FineReader10\media\image7.jpeg

Рис. 3.6. Окно монитора порта с отображаемыми в нем входными данными

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

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

Модуль фоторезистора KY-018

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

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

========== Подробную информацию о подключении фоторезистора к плате Arduino вы можете найти в прилагаемой к набору книге Дж. Блума «Изучаем Arduino: инструменты и методы технического волшебства» (см. п. 3.8. «Использование переменных резисторов для создания собственных аналоговых датчиков» https://bhv.ru/product/izuchaem-arduino-instrumenty-i-metody-tehnicheskogo-volshebstva-2-e-izd-per-s-angl/ стр. 75

Внешний вид, назначение контактов

2-10-1-фоторезистор

Рис. S10.1. Устройство фоторезистора (слева) и модуль KY-018 (справа)

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

Для удобного подключения фоторезисторов существуют специальные платы (с отверстиями для крепления), на которых интегрирован фоторезистор и понижающий резистор (рис. 2.10, справа). Кроме того, там может быть размещен триммер настройки. Модуль может иметь кроме аналогового выхода дополнительный цифровой, которые будет фиксировать факт изменения освещенности выше «настроенного порога».

2-10-2-фоторезистор

Рис. S10.2. Подключение платы с фоторезистором

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

ИК-датчик движения HC-SR501

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

Пассивный инфракрасный датчик движений HC-SR501 (PIR, Passive Infrared) фиксирует движения объектов. Матрица из 15-ти небольших линз фокусирует ИК-излучение из разных участков окружающего пространства на пироэлектрический детектор, основу которого составляет пластина из танталата лития, вырабатывающая небольшое напряжение в ответ на поступающее тепловое излучение. При перемещении объекта из одной зоны в другую генерируется выходной сигнал (рис. S2.1, S2.2).

Основные характеристики

Наименование Значение
Постоянное напряжение, В 4,5 ÷ 20
Ток потребления в режиме ожидания менее 50 мкА
Наибольший потребляемый ток во время работы, мА 65
Напряжение логических уровней, В 3,3
Расстояние обнаружения 3 ÷ 7 м, по умолчанию 7 м
Максимальный угол обнаружения 110° на расстоянии 7 м 120°
Время поддержания высокого уровня выхода при присутствии 20 ÷ 300 с
Время игнорирования событий после фиксации 0,2 с
Температура окружающего воздуха при работе –15 ÷ 70°C
Размеры, мм 32×24×28

Внешний вид, назначение контактов

2-02-HC-SR501

Рис. S2.1. Датчик HC-SR501

2-03-HC-SR501

Рис. S2.2. Поле зрения датчика PIR с линзой Френеля

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

sh_L08_2

Рис. S2.3. Схема подключения датчика движения

Программный код

Листинг S2.1. Обнаружение перемещения датчиком движения HC-SR501

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#define IKPin 2 //Номер пина ИК-датчика движения HC-SR501
 
#define ledPin 13 //Номер пина встроенного светодиода
 
void setup(){
 
Serial.begin(9600);
 
pinMode(IKPin, INPUT);// Объявляем пин,
 
// к которому подключен датчик движения, входом
 
pinMode(ledPin,OUTPUT); // Объявляем пин,
 
// к которому подключен светодиод, выходом
 
}
 
void loop(){
 
int pirVal = digitalRead(IKPin); //считываем
 
// значения с датчика движения
 
// Если обнаружили движение, то транслируем
 
// сигнал тревоги в монитор порта
 
// и включаем светодиод
 
if(pirVal == HIGH) {
 
digitalWrite(ledPin, HIGH);
 
Serial.print("ALARM");
 
delay(2000);
 
}
 
else {
 
Serial.print("Scaning");
 
digitalWrite(ledPin,LOW);
 
}
 
}

Результат

C:\Users\DANILA\Desktop\Photomechanics\НАБОРЫ\Набор 2\УРОКИ И ПРОЕКТЫ\Уроки\8 урок - подключение датчика движения\Screenshot_3.png

Рис. S2.4. Фиксация движения на Мониторе порта

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

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

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

Датчики DHT11/DHT22 (рис. S1.1) предназначены для измерения температуры и влажности воздуха.

Внешний вид, назначение контактов

2-01-DHT11

Рис. S1.1. Датчик DHT11

Основные характеристики

Наименование Значение
DHT11 DHT22
Диапазон измерения температуры/точность измерения 0 ÷ 50°С /±2°C –40 ÷ 125°С /±0,5°C
Диапазон измерения относительной влажности 20 ÷ 80% /±5°C 0 ÷ 100% /±2 ÷ 5°C
Частота опроса датчиков, Гц 1 (один раз в секунду) 0,5 (1 раз в две секунды)
Размеры, мм 15,5×12,0×5,5 15,1×25,0×7,7
Напряжение питания, В 3 ÷ 5 3 ÷ 5
Максимальный ток, мА 2,5 2,5

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

S1-2-DHT11

Рис. S1.2. Подключение датчика DHT11


Внимание!

Если расстояние от датчика до Arduino небольшое, рекомендуемый номинал резистора R1 10 кОм (рис. S1.2), а для расстояния больше 20 метров, рекомендуется резистор номиналом 5,1 кОм. Если же датчик имеет только три контакта (5V, OUT и GND), то резистор R1 вообще не нужен.


Программный код

  1. Загрузите библиотеку DHT-sensor-library для работы Arduino с датчиками DHT11 и DHT22. Для этого откройте Менеджер библиотек, выполнив команду Инструменты | Управлять библиотеками. Справа вверху в строке поиска введите DHT. В открывшемся списке выберите DHT sensor library by Adafruit версии 1.2.3 (в версиях 1.3.0 и новее возможна ошибка при компиляции). Нажмите кнопку Установка.
  2. Загрузите скетч из листинга S1.1.

Электронный архив скетчей и библиотек

Электронный архив скетчей и библиотек расположен по адресу https://bhv.ru/product/umnyj-dom-na-baze-arduino-bolshoj-nabor/. Скетчи в этом архиве вы найдете в папке Скетчи, а библиотеки — в папке Библиотеки.


Листинг S1.1. Измерение температуры и влажности с помощью датчика DHT11

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "DHT.h"
 
#define DHTPIN 7 //пин для получения сигнала от датчика DHT11
 
// Раскомментируйте тип датчика, который вы используете
 
#define DHTTYPE DHT11 // DHT 11
 
//#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
 
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
 
DHT dht(DHTPIN, DHTTYPE);
 
void setup() {
 
Serial.begin(9600);
 
dht.begin();
 
}
 
void loop() {
 
// Задержка перед измерениями
 
delay(2000);
 
float h = dht.readHumidity();
 
//чтение температуры в градусах Цельсия °С (по умолчанию)
 
float t = dht.readTemperature();
 
//чтение температуры в градусах Фаренгейта °F (isFahrenheit = true)
 
float f = dht.readTemperature(true);
 
// Проверка чтения данных
 
if (isnan(h) || isnan(t) || isnan(f)) {
 
Serial.println("Failed to read from DHT sensor!");
 
return;
 
}
 
// Вычисление теплового индекса в °F (по умолчанию)
 
float hif = dht.computeHeatIndex(f, h);
 
// Вычисление теплового индекса в °С (isFahreheit = false)
 
float hic = dht.computeHeatIndex(t, h, false);
 
Serial.print("Humidity: ");
 
Serial.print(h);
 
Serial.print(" %\t");
 
Serial.print("Temperature: ");
 
Serial.print(t);
 
Serial.print(" *C ");
 
Serial.print(f);
 
Serial.print(" *F\t");
 
Serial.print("Heat index: ");
 
Serial.print(hic);
 
Serial.print(" *C ");
 
Serial.print(hif);
 
Serial.println(" *F");
 
}

Результат

Датчик2

Рис. S1.3. Результаты измерений датчика DHT11

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

Датчик уровня жидкости

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

Датчик уровня жидкости предназначен для определения уровня жидкости в различных емкостях. На датчике расположен резисторы, транзистор и чередующиеся оголенные проводящие контакты (рис. S6.1). Чем глубже датчик погружен в воду (большая часть длины контактов находится в воде), тем меньше сопротивление между проводящими контактами.

Внешний вид, назначение контактов

S6-1-уровень воды

Рис. S6.1. Датчик уровня воды (глубины)

Основные характеристики

Наименование Значение
Зона обнаружения, мм 16 ÷ 40
Напряжение питания, В 3,3 ÷ 5
Ток потребления, мА 20
Размеры, мм 62×20×8
Рабочая температура, °С 10 ÷ 30

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

S6-2-уровень воды

Рис. S6.2. Схема подключения датчика уровня жидкости

Программный код

Листинг S6.1. Измерения уровня жидкости

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#define aPin A0 // пин для подключения аналогового выхода датчика
 
int avalue=0; //переменная
 
int levels[3]={600,500,400}; // значение уровней
 
void setup(){
 
pinMode(aPin, INPUT); // настройка аналогового пина на вход
 
Serial.begin(9600); // инициализация последовательного порта
 
}
 
void loop(){
 
// получение значения с аналогового вывода датчика
 
avalue=analogRead(aPin);
 
// вывод значения в монитор последовательного порта Arduino
 
Serial.print("avalue=");
 
Serial.print(avalue);
 
if (avalue&gt;=levels[0]) Serial.println("-&gt;MAX");
 
if ((avalue&gt;levels[2])&amp;&amp;(avalue&lt;levels[0])) Serial.println("-&gt;NORM");
 
if (avalue&lt;=levels[2]) Serial.println("-&gt;MIN");
 
// пауза перед следующим получением значения 1000 мс
 
delay(1000);
 
}

Результаты измерений

Значение аналоговых сигналов на аналоговом входе Arduino вы можете определить экспериментальным путем. Они могут оказаться такими, как показано на рис. S6.3.

2-06-3-уровень воды

Рис. S6.3. Экспериментальные значения аналоговых сигналов для разных уровней погружения

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

Датчик пламени YG1006

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

Датчик пламени позволяет фиксировать наличие инфракрасного излучения (открытого пламени) в диапазоне волн 760 ÷ 1100 нм в прямой видимости на расстоянии до 1 м (рис. S4.1).

4-01-flame

Рис. S4.1. Принцип действия ИК-датчика пламени YG1006

Основные характеристики

Наименование Значение
Дальность обнаружения пламени, см 20 ÷ 100
Угол обнаружения пламени, град 60
Длина волны, нм 760 ÷ 1100
Пиковая длина волны, нм 940
Напряжение питания, В 3 ÷ 5,5
Потребляемый ток не более, мА 15
Размеры (длина × ширина), мм 36×16

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

При подключении датчика только к цифровому выходу (D0) фиксируется лишь факт наличия пламени. А при подключении к аналоговому выходу (A0) можно оценить и яркость пламени.

2-04-2-flame

Рис. S4.2. Подключение датчика пламени

Программный код

Листинг S4.1. Подключение датчика пламени

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#define ledPin 13 //номер пина встроенного светодиода
 
#define flameDigitalPin 10 //номер пина цифрового входа датчика
 
#define flameAnalogPin A0 //номер пина аналогового входа датчика
 
int valueDigital ; // переменная для цифрового значения
 
float valueAnalog; //переменная для аналогового значения
 
 
 
void setup ()
 
{
 
pinMode (ledPin, OUTPUT) ;
 
pinMode (flameDigitalPin, INPUT) ;
 
pinMode (flameAnalogPin, INPUT) ;
 
Serial.begin(9600);
 
}
 
 
 
void loop ()
 
{
 
valueAnalog = analogRead(flameAnalogPin);
 
//вывод аналогового значения в монитор порта
 
Serial.println(valueAnalog);
 
//чтение цифрового значения
 
valueDigital = digitalRead (flameDigitalPin) ;
 
if (valueDigital == HIGH) //когда на цифровом входе высокий уровень,
 
//светодиод горит
 
{
 
digitalWrite (ledPin, HIGH);
 
Serial.println("FLAME!");
 
}
 
else
 
{
 
digitalWrite (ledPin, LOW);
 
Serial.println("no flame");
 
}
 
delay(1000);
 
}

Результат

Рис. S4.3. Результаты фиксации пламени

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

Датчик звука KY-037

Датчик звука, как следует из названия, предназначен для обнаружения звука (фиксирует появление громкого звука). На рис. S8.1 показаны наиболее широко применяемые в проектах Arduino датчики звука.

Внешний вид, назначение контактов

8_01-звук

Рис. S8.1. Применяемые в проектах Arduino датчики звука

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

Работая с датчиком звука, можно использовать как цифровой, так и аналоговый его выходы (рис. S8.2). Аналоговый выход выдает значение сигнала микрофона, а цифровой выход передает 1, если сигнал превысит пороговое значение, и 0 в противном случае. Пороговое значение можно настроить с помощью потенциометра, расположенного на плате датчика. Можно подключить одновременно и два выхода (например, для настройки порогового значения).

2-08-2-звук

Рис. S8.2. Схема подключения датчика звука

Программный код

Листинг S1.8. Измерение громкости с помощью датчика звука

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#define soundAnalogPin A0 // пин, к которому аналоговый выход
 
#define soundDigitalPin 4 // пин, к которому цифровой выход
 
int analogVal=0; // Объявляем переменные для хранения значений
 
int digitalVal=0; //с датчика и задаем ее начальное значение 0
 
void setup()
 
{
 
Serial.begin(9600); // Открываем монитор порта
 
pinMode(soundAnalogPin, INPUT);//Настройка аналогового пина на вход
 
pinMode(soundDigitalPin, INPUT);// Настройка цифрового пина на вход
 
}
 
void loop()
 
{
 
//присваиваем переменной аналоговое значение
 
analogVal =analogRead(soundAnalogPin);
 
//присваиваем переменной цифровое значение
 
digitalVal=digitalRead(soundDigitalPin);
 
//Выводим полученныес датчика значения
 
Serial.print("Sound value A0: "); //
 
Serial.print(analogVal,DEC);
 
Serial.print(" D0: ");
 
Serial.println(digitalVal,DEC);
 
 
 
delay(100); //задаем паузу
 
}

Результат

2-08-3-звук

Рис. S8.3. Фиксация хлопка в ладоши на мониторе последовательного порта

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

Датчик газа MQ-135

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

Датчик газа MQ-135 предназначен для измерения наличия в окружающем воздухе вредных примесей газа. В качестве чувствительного элемента в датчике служит пластина диоксида олова (Sn02), который имеет низкую проводимость в чистом воздухе. Когда датчик оказывается в среде с парами токсичных газов, его проводимость возрастает. Датчик MQ-135 очень чувствителен к аммиаку, сульфидам, парам бензола и алкоголя, СО2 и идеально подходит для мониторинга дыма и других вредных примесей в воздухе. На рис. S7.1 показано изменение сопротивления датчика в зависимости от концентрации различных газов в окружающем воздухе в миллионных долях (от общего объема газа).

Внешний вид, назначение контактов

7-01-MQ135

Рис. S7.1. Изменение сопротивления датчика в зависимости от концентрации различных газов в окружающем воздухе

Основные характеристики

Наименование Значение
Напряжение питания, В 5
Потребляемый ток, мА 160
Рабочая температура, °С 10 ÷ 45
Относительная влажность, % менее 95
Концентрация кислорода в воздухе (стандартная), % 21
Стандартная температура измерения, °С 20
Влажность, % 65
Диапазон измерений аммиак: 10 ppm ÷ 300 ppm

бензин: 10 ppm ÷ 1000 ppm

этиловый спирт: 10 ppm ÷ 300 ppm

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

7-02-MQ135

Рис. S7.2. Подключение датчика газа

Программный код

Листинг S7.1. Измерение концентрации газов с помощью датчика MQ-135

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#define MQPin A0 //пин, к которому подключен датчик газа
 
#define ledPin 13 //пин встроенного светодиода
 
int sensorValue = 0; //переменная для хранения значений
 
void setup() {
 
Serial.begin(9600);
 
pinMode(ledPin, OUTPUT);
 
Serial.println("MQ135 Test" ); //Посылаем текст в монитор порта
 
}
 
void loop() {
 
// Считываем значения с датчика
 
sensorValue = analogRead(MQPin);
 
if (sensorValue &gt;= 400)
 
// и, если превышен заданный порог,
 
{
 
digitalWrite(ledPin, HIGH); // то включаем светодиод,
 
}
 
else // а если нет…
 
{
 
digitalWrite(ledPin, LOW); // то выключаем
 
}
 
Serial.print("MQ135 value= " );
 
// Для отслеживания данных с датчиков
 
// транслируем их в монитор порта
 
Serial.println(sensorValue);
 
delay(1000);
 
}

Результат

2-07-4-MQ135

Рис. S7.4. Результаты измерений

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

Датчик влажности почвы YL-38

По материалам руководства к набору “Умный дом на базе Arduino. Большой набор + КНИГА

Модуль датчика состоит из двух частей: контактного щупа и датчика YL-38 (рис. S5.1), в комплекте также идут провода для подключения. Между двумя электродами щупа создается небольшое напряжение. Если почва сухая, то сопротивление большое, а ток небольшой. Если земля увлажняется (например, поливом), то сопротивление уменьшается, а ток немного увеличивается (рис. S5.2).

Внешний вид, назначение контактов

2-05-1-влажность почвы

Рис. S5.1. Датчик влажности почвы YL-38

5-02-влажность почвы

Рис. S5.2. Принцип работы датчика влажности почвы

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

2-05-4-влажность почвы

Рис. S5.3. Использование гвоздей в качестве датчика влажности почвы

Основные характеристики

Наименование Значение
Рабочее напряжение, В 3 ÷ 5
Ток потребления, мА 15
Напряжение цифрового выхода, В 3 ÷ 5
Напряжение аналогового выхода, В 0 ÷ 5

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

2-05-2-влажность почвы

Рис. S5.4. Подключение датчика измерения влажности почвы

Программный код

Листинг S5.1. Подключение датчика влажности почвы

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#define sensorPin A0 //номер пина влажности почвы
 
int sensorValue = 0; //переменная значения влажности
 
void setup() {
 
Serial.begin(9600);
 
}
 
void loop() {
 
sensorValue = analogRead(sensorPin);
 
Serial.println(sensorValue);
 
delay(100);
 
}

В процессе эксплуатации контактный щуп окисляется, и это происходит достаточно быстро. Чтобы окисление проходило медленнее, можно подключить питание датчика на цифровой вход Arduino и подавать напряжение только на время измерения (см. https://mxjournal.ru/blog/1319). В нашем примере контакт питания от модуля влажности (VCC) следует соединить на плате Arduino Uno не с пином 5V, а с цифровым пином — например, D8 (на рис. S5.4 показано пунктиром). В этом случае код может быть переписан следующим образом (листинг S5.2) — мы вводим переменную timing, в которой будет храниться количество миллисекунд. По умолчанию значение переменной равно 0. В основной части программы проверяем условие: если количество миллисекунд с запуска микроконтроллера минус число, записанное в переменную timing, больше, чем записано в переменную interval (в минутах), то выполняется функция get_sensor().

Листинг S5.2. Измерение влажности почвы с интервалом

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#define sensorPin A0 //номер аналогового пина влажности почвы
 
#define powerPin 8 //номер пина питания датчика влажности почвы
 
int sensorValue = 0; //переменная значения влажности
 
unsigned long timing = 0; //переменная для хранения точки отсчета
 
int interval=60; //интервал измерений в минутах
 
void setup() {
 
Serial.begin(9600);
 
pinMode (powerPin, OUTPUT); // питание датчика влажности
 
digitalWrite (powerPin, LOW);
 
digitalWrite (13, LOW);
 
}
 
void loop() {
 
if (abs(millis() - timing)/1000 &gt; interval*60) { //один раз в час
 
get_sensor(); // снимаем показания датчика влажности почвы
 
timing = millis();
 
}
 
}
 
void get_sensor() {
 
digitalWrite (powerPin, HIGH); //включаем датчик влажности
 
digitalWrite (13, HIGH); //включаем датчик влажности
 
delay (3000);
 
sensorValue = analogRead(A0); //получение значения влажности с
 
//аналогового вывода датчика
 
Serial.println(sensorValue); //конролируем влажность на
 
//Мониторе порта
 
delay(100);
 
digitalWrite (powerPin, LOW); //выключаем датчик влажности
 
}