КулЛиб - Классная библиотека! Скачать книги бесплатно 

Основы Arduino [Майкл МакРобертс] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
Основы ARDUINO

Майкл МакРобертс

Об авторе
Майк МакРобертс обнаружил Arduino в 2008 году, когда искал способы
подключить датчик температуры к ПК, чтобы сделать детектор облаков для
другого своего хобби - астрофотографии. После небольшого исследования,
Arduino показался очевидным выбором, и детектор облаков был успешно
изготовлен. У Майка началось увлечение Arduino. С тех пор он реализовал
бесчисленное количество проектов с использованием Arduino. Он регулярно
проводит семинары по Arduino в Соединенном Королевстве для хакпейсов,
предприятий и других организаций.
Он также основал онлайн-бизнес по производству стартовых комплектов
Arduino и компонентов под названием Earthshine Electronics.
Его следующий проект в использовании схемы на базе Arduino для отправки высотного воздушного шара
к границе космоса, чтобы делать кадры и видео, черт возьми, с помощью ребят из UKHAS и CUSF.
Хобби Майка электроникой началось, когда он был ребенком, и комплекты электроники 100-в-1 от
Radio Shack вошли в его список рождественских подарков. Он начал программировать как хобби, когда в
подростковом возрасте приобрел компьютер Sinclair ZX81. С тех пор он никогда не оставался без
компьютера.Он является членом London Hackspace и наблюдательным сотрудником Орпингтонского
астрономического общества, а также регулярно участвует в работе форума Arduino. Он также любит
скрываться в IRC в каналах Arduino, high altitude и london-hack-space (как «earthshine»), в Twitter как
@TheArduinoGuy, а также в Google+ под именем «Mike McRoberts» (ищите аватар с изображением
Футболка «А ты Ардуино?»). Когда он не возится с Arduinos, ему нравится заниматься астрономией,
астрофотографией, ездой на мотоцикле и парусным спортом.

xix

краткое содержание

Об авторе........��������������������������������������������������������������������������������������������������������
xix



Вступление

������������������������������������������������������������������������������������������������������� xxv



■Глава
1: Начало работы..�������������������������������������������������������������������������������������1


■Глава2:
Зажги их.....
�����.��������������������������������������������������������������������������������������21


■Глава 3: Светодиодные эффекты����������������������������������������������������������������49


■Глава 4: Простые оповещатели и датчики���������������������������������������������79


■Глава 5: Привод двигателя.����������������������������������������������������������������������������97


■Глава 6: Двоичные счетчики и ввод / вывод регистров сдвига 111


■Глава 7: Светодиодные дисплеи����������������������������������������������������������������127


■Глава
8: Жидкокристаллические
дисплеи ������������������������������������������165


■Глава
9: Сервоприводы �����������������������������������������������������������������������������������183




■Глава
10: Шаговые двигатели
и роботы������������������������������������������������199


■Глава
11: Датчики давления
������������������������������������������������������������������������223


■Глава
12: Сенсорные дисплеи.........................................................................
251


■Глава 13: Датчики температуры ����������������������������������������������������������������271
■Глава 14: Ультразвуковые дальномеры������������������������������������������������285

v

■ СОДЕРЖАНИЕ at a GlanCe



■Глава
15: Чтение и запись на SD-карту�������������������������������������������������305


■Глава
16: Создание считывателя
RFID���������������������������������������������������325


■Глава 17: Обмен данными через Ethernet �������������������������������������������341


vi



СОДЕРЖАНИЕ


xix
об авторе ���������������������������������������������������������������������������������������������������������������......

 ������������������������������������������������������������������������������������������������������������������ xxv
Вступление
■■Глава 1: Начало работы �����������������������������������������������������������������������������������������...� 1
Как пользоваться этой книгой���������������������������������������������������������������������������������������������1


Что вам понадобится�������������������������������������������������������������������������������������������������������������2


Что такое Arduino? ����������������������������������������������������������������������������������������������������������.......2


Настройка Arduino ...�������������������������������������������������������������������������������������������������������������� 5
 скетч ��������������������������������������������������������������������������������������������13
Загрузите свой первый
Arduino IDE ���������������������������������������������������������������������������������������������������������������������������

14
Резюме�������������������������������������������������������������������������������������������������������������������������������������20

■■Проекты на LED ��......................������������������������������������������������������������������������...

21
Проект 1- Светодиодная
 мигалка �����������������������������������������������������������������������������������

21

Проект 1 - Светодиодная

мигалка ���������������������������������������������������������������������������������������������������������� 21
Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������� 22
Введите код���������������������������������������������������������������������������������������������..���...........................................

23
Проект 1 - LED мигалка - Обзор кода
 ���������������������������������������������������������������������������������������������������� 23
Проект 1 — LED мигалка – Обзор схемы�����������������������������������������������������������������������������������������������27



Проект 2 – S.O.S.Сообщение азбукой Морзе�����������������������������������������������������������������.31

Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
31

Проект 2 - S.O.S.Сообщение азбукой Морзе - Обзор
кода����������������������������������������������������������..... 32
vii

■ СОДЕРЖАНИЕ

 ���������������������������������������������������������������������������������������������������������34
Проект 3 - Светофоры
Требуемые детали ��������������������������������������������������������������������������������������������������������������������������������������� 34
Подключение
������������������������������������������������������������������������������������������������������������������������������������������������� 34

Введите код��������������������������������������������������������������������������������������������������������������������������������������������������..
35


Проект 4 - Интерактивные светофоры�����������������������������������������������������������������������������36

Требуемые детали ��������������������������������������������������������������������������������������������������������������������������������������� 36
Подключение
 �������������������������������������������������������������������������������������������������������������������������������������������������� 37
Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
38

Проект 4 - Интерактивные светофоры - Обзор кода�������������������������������������������������������������������������� 40
Проект 4 - Интерактивные светофоры - Обзор компонентов ��������������������������������������������������������� 43
Логические
 состояния �������������������������������������������������������������������������������������������������������������������������������� 43
Стягивающие резисторы
���������������������������������������������������������������������������������������������������������������������...... 44

Подтягивающие
 резисторы ����������������������������������������������������������������������������������������������������������������������� 45
Внутренние подтягивающие резисторы
Arduino ���������������������������������������������������������������������������������� 47


Резюме�������������������������������������������������������������������������������������������������������������������������������������
47


 эффекты �����������������������������������������������������������������������������....49
■Глава
3: Светодиодные
Проект 5 - Эффект светодиодной
погони���������������������������������������������������������������������


49

Требуемые детали ����������������������������������������������������������������������������������������������������.����������������������������������� 49
Подключение
 �������������������������������������������������������������������������������������������������������������������������������������������������� 49
Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
50

Проект 5 - Эффект светодиодной погони - Обзор кода ���������������������������������������������������������������������......51


Проект 6 - Интерактивный светодиодный
эффект погони��������������������������������������� 52
Требуемые детали ��������������������������������������������������������������������������������������������������������������������������������������� 52
Подключение
 �������������������������������������������������������������������������������������������������������������������������������������������������� 53
Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
53

Проект 6 - Интерактивный светодиодный эффект
 погони - Обзор кода ������������������������������������� 54
Проект 6 - Интерактивный светодиодный эффект погони
- Обзор схемы..............................55


Проект 7 - Пульсирующая
 лампа ���������������������������������������������������������������������������������������� 56
Требуемые детали

����������������������������������������������������������������������������������������������������������������������������������������� 56
Подключение
 ��������������������������������������������������������������������������������������������������������������������������������������������������� 56

viii

■ СОДЕРЖАНИЕ

Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
57

Проект 7 - Пульсирующая лампа - Обзор
кода������������������������������������������������������������������������������������ 57


Проект 8 - лампа настроения RGB�������������������������������������������������������������������������������������.. 58
Требуемые детали
���������������������������������������������������������������������������������������������������������������������������������������� 58

Подключение
 �������������������������������������������������������������������������������������������������������������������������������������������������� 59
Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
59

Проект 8 - Лампа настроения - Обзоркода����������������������������������������������������������������������������������������.. 60

Проект 9 - Светодиодный
 эффект огня �����������������������������������������������������������������������....�� 63
Требуемые детали ��������������������������������������������������������������������������������������������������������������������������������������� 64
Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������� 64
Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
64

Проект 9 - Светодиодный эффект огня
 - Обзор кода������������������������������������������������������������������������ 65

Проект 10 - Лампа настроения с последовательным
управлением��������������������.....� 66

Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
66

Проект 10 - Лампа настроения с последовательным
 управлением - Обзор кода�������������������� 68
Указатели в двух словах �����������������������������������������������������������������������������������������������������������������������������71

Резюме�������������������������������������������������������������������������������������������������������������������������������������77

■Глава
4: Простые оповещатели и датчики

 ����������������������������������������������������������������� 79
Проект11 - Cигнализация c пьезозуммером�����������������������������������������������������������������79
Требуемые детали
���������������������������������������������������������������������������������������������������������������������������������������� 79

Подключение
 �������������������������������������������������������������������������������������������������������������������������������������������������� 80
Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
80

Проект 11 - Cигнализация c пьезозуммером
 - обзор кода ���������������������������������������������������������������� 81
Проект 11 - Cигнализация c пьезозуммером - обзор
схемы������������������������������������������������������������� 82


Проект 12 - Пьезозуммер - проигрыватель
мелодии ��������������������������������������������������� 83

Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
83

Проект 12 - Пьезозуммер - проигрыватель мелодии
 - обзор кода ���������������������������������������������� 85

Проект 13 - пьезодатчик детонации
��������������������������������������������������������������������������������..88

Требуемые детали
����������������������������������������������������������������������������������������������������������������������������������������� 88

Подключение
 ��������������������������������������������������������������������������������������������������������������������������������������������������� 88
ix

■ СОДЕРЖАНИЕ

Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
89

Проект 13 - пьезодатчик детонации - обзор кода��������������������������������������������������������������������������������������
90


Проект 14 - Датчик освещенности
�����������������������������������������������������������������������������������91

Требуемые детали ��������������������������������������������������������������������������������������������������������������������������������������� 91
Подключение
 �������������������������������������������������������������������������������������������������������������������������������������������������� 91
Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
92

Проект 14 - Датчик освещенности - Обзор
 устройства������������������������������������...������������������������������� 93

Резюме�������������������������������������������������������������������������������������������������������������������������������������95



■Управление
двигателем DC���������������������������������������������������....����������������������������������97

Проект 15 - Простое управление
двигателем �����������������������������������������.��������������������97
Требуемые детали ��������������������������������������������������������������������������������������������������������������������������������������� 98
 �������������������������������������������������������������������������������������������������������������������������������������������������� 98
Подключение

Введите код�����������������������������������������������������������������������������������������������������������������������������������������������������
99
Проект 15 - Простое управление двигателем - обзор кода����������������������������������.�������������.�����������������100

Проект 15 - Простое управление двигателем - Обзор
устройства �....����������������������������������������� 101
 ���������������������������������������������................����������������������������������������������������������������������������������� 101
Транзисторы

Моторы������������.������������������������������������������������������������������������������������������������������������������������������������������������
102

Диоды����������������������������������������������������������������������������������������������������������������������������������������������������������������
102

 двигателя L293D ����������������������������������������.103
Проект 16 - Использование IC драйвера

Требуемые детали���������������������������������������������������������������������������������������������������������������������������������������
103
 ������������������������������������������������������������������������������������������������������������������������������������������������ 103
Подключение

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
104

Проект 16 - Использование микросхемы драйвера двигателя
L293D - Обзор кода��������������������������� 105

Проект 16 - Использование IC драйвера двигателя L293D - обзор схемы���������������������������������������������106


Резюме�����������������������������������������������������������������������������������������������������������������������������������108



■Двоичные счетчики и ввод / вывод регистра сдвига���������..........................111

Проект17 8-битный двоичный счетчик сдвигового регистра�����������������������.���������111


Требуемые детали�������������������������������������������������������������������������������������������������������������������������������������� 111

Подключение ������������������������������������������������������������������������������������������������������������������������������������������������ 111

Введите код��������������������������������������������������������������������������������������������������������������������������������������������������� 112

x

■ СОДЕРЖАНИЕ

Двоичная система счисления�����������������������������������������������������������������������������������������������������������������
113

Проект 17 - 8-разрядный двоичный счетчик сдвигового регистра
- Обзор устройства......... 115

Проект 17 - 8-битный двоичный счетчик сдвигового регистра
- Обзор кода......................... � 117

Побитовые операторы
...............................................................................................................................� 119

Проект 17 - Обзор кода (продолжение).....................................................................................
120


Проект 18 - Двойные 8-битные двоичные
счетчики..............................................122

Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 122

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 123
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
124

Код проекта 18 и обзор оборудования...................................................................................................
125


Резюме�����������������������������������������������������������������������������������������������������������������������������������126


■Глава
7: Светодиодные дисплеи...............................................................127

Проект 19 - LED точечно-матричный дисплей - Базовая
анимация......................127

Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 127
 ������������������������������������������������������������������������������������������������������������������������������������������������ 128
Подключение

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
130

Проект 19 - LED точечная матрица - Базовая анимация - обзор
схемы.................................. 131
 анимация - Обзор кода................. 134
Проект 19 - Светодиодная точечная матрица - Базовая

 - Спрайт с прокруткой.........................137
Проект 20 - Светодиодный точечно-матричный дисплей
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
137

Проект 20 - LED точечная матрица - Спрайт с прокруткой - Обзор кода................................. 138

Проект 21 - LED точечно-матричный дисплей - Прокручиваемое
сообщение.......141

Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 141

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 142
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
143

Проект 21 - LED точечная матрица - Прокручиваемое сообщение
- Обзор устройства........ 147

Проект 21 - LED точечная матрица - Прокручиваемое сообщение
- обзор кода.................... 151


Проект 22 - LED точечно-матричный дисплей
- Игра в понг.............................. 158

Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 158

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 158

xi

■ СОДЕРЖАНИЕ

Введите код������������������������������������������������������������������������������������������������������������������������������������������������
159

Проект 22 - LED точечно-матричный
дисплей - Игра в понг - обзор кода.......................... 160


Резюме�����������������������������������������������������������������������������������������������������������������������������������163

■Глава
8: Жидкокристаллические дисплеи..............................................................165

Проект 23 - Базовое управление
ЖК-дисплеем.................................................165

Требуемые детали ������������������������������������������������������������������������������������������������������������������������������������� 165
Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 166
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
167

Project 23 – Basic LCD Control – Code Overview����������������������������������������������������������������������������������������������
170

Проект 23 - Базовое управление ЖК-дисплеем
 - Обзор схемы............................................. 174

Проект 24 - ЖК-дисплей температуры..................................................................174

Требуемые детали
��������������������������������������������������������������������������������������������������������������������������������������� 175

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 175
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
176

Проект 24 - ЖК-дисплей температуры
- обзор кода................................................................ 177


Резюме�����������������������������������������������������������������������������������������������������������������������������������181



■Глава
9:Сервоприводы...........................................................................183

Проект 25 - Сервоуправление...............................................................................184

Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 184
 ����������������������������������������������������������������������������������������������������������������������������������������������� 185
Подключение

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
186

Проект 25 - Сервоуправление - Обзор кода.......................�������������������������������������������������������������
186

Проект 25 - Сервоуправление - Обзор схемы................................���������������������������������������������������� 187

 сервоприводами...................................................188
Проект 26 - Управление двумя

Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 188

Подключение ������������������������������������������������������������������������������������������������������������������������������������������������ 189

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
189

Проект 26 - Управление двумя сервоприводами - обзор кода������������������������������������������������������� 191

xii

■ СОДЕРЖАНИЕ

Проект 27 - Сервоуправление джойстиком��������������������������������������������������������������������193

Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 193

Подключение������������������������������������������������������������������������������������������������������������������������������������������������
193

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
195

Проект 27 - Сервоуправление джойстиком - Обзор кода�������������������������������������������������������������������������� 196

Резюме�����������������������������������������������������������������������������������������������������������������������������������198

■Глава
10: Шаговые двигатели

 и роботы�����������������������������������������������������������199
Проект 28 - Базовое управление
шаговым двигателем �����������������������������������������199

Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 199

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 200
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
201

Проект 28 - Базовое управление шаговым двигателем
- Обзор кода.................................... 202

Проект 28 - Базовое управление шаговым двигателем
- обзор схемы........... ������������������������� 203


Проект 29 - Использование моторного шилда��������������������������������������������������������205
Требуемые детали..�������������������������������������������������������������������������������������������������������������������������������������
205

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 206
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
207

Проект 29 - Использование моторного шилда
 - Обзор кода ���������������������������������������������������������� 208
Проект 29 - Использование моторного шилда - Обзор оборудования���������������������������������������� 210

Проект 30 - Робот,идущий по линии......����������...............�����������������������������������������������211

Требуемыедетали
�������������������������������������������������������������������������������������������������������������������������������������� 211

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 212
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
215

Проект 30 - Робот, следящий за линией - Обзор
кода............�������������������������������������������������������� 217


Резюме�����������������������������������������������������������������������������������������������������������������������������������221

■Проект
31: Проект 31 - Цифровой
датчик давления .�������������������������������������223


Проект 31 - Цифровой датчик
 давления - обзор кода���������������������������������������223
Требуемые детали ������������������������������������������������������������������������������������������������������������������������������������� 223
Подключение
 ����������������������������������������������������������������������������������������������������������������������������������������������� 224

xiii

■ СОДЕРЖАНИЕ

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
225

Проект 31-Цифровой датчик давления - обзорe
 устройства��������������������������������������������������������� 227
I2C шина
 ���������������������������������������������������������������������������������������������������������������������������������������������������������� 228


SPI – Последовательный интерфейс
периферийных устройств........................................................234


Проект 32 - Цифровой барограф �����������������������������������������������������������������������������������236

Требуемые детали��������������������������������������������������������������������������������������������������������������������������������������� 236

Подключение ������������������������������������������������������������������������������������������������������������������������������������������������ 237

Введите код��������������������������������������������������������������������������������������������������������������������������������������������������� 239



Проект 32 - Цифровой барограф - Обзор кода ����������������������������������������������������������������������������������� 243


Резюме�����������������������������������������������������������������������������������������������������������������������������������249
в главе 32��������������������������������������������������������������������������������������� 249
■ Предметы и понятия, затронутые



■Глава 33: Сенсорные дисплеи............................................................251




25� 1

Подключение ������������������������������������������������������������������������������������������������������������������������������������������������ 252

Введите код��������������������������������������������������������������������������������������������������������������������������������������������������� 253

Проект 33 - Базовый сенсорный дисплей обзор устройств.����������������������������������������������������������� 254

Проект 33 -Базовый сенсорный дисплей



Проект 33 - Базовый сенсорный дисплей обзор кода...... ��������������������������������������������������������������� 256


Проект 34 - сенсорная клавиатура��������������������������������������������������������������������������������258


Требуемые детали ������������������������������������������������������������������������������������������������������������������������������������� 258

Подключение ����������������������������������������������������������������������������������������������������������������������������������������������� 259

Введите код��������������������������������������������������������������������������������������������������������������������������������������������������� 260



Проект 34 - сенсорная клавиатура - обзор кода...................................................................... 262


Проект 35 - Контроллер цвета с сенсорным экраном .........................................264

Требуемые детали ������������������������������������������������������������������������������������������������������������������������������������� 264

Подключение ����������������������������������������������������������������������������������������������������������������������������������������������� 265

Введите код��������������������������������������������������������������������������������������������������������������������������������������������������� 266



Проект 35 - Контроллер цвета с сенсорным экраном– Обзор кода.......................................� 268

Резюме�����������������������������������������������������������������������������������������������������������������������������������270

xiv

■ СОДЕРЖАНИЕ

■Глава
13: Датчики температуры
��������������������������������������������������������������������������271


Проект 36 - Последовательный датчик температуры��������������������������������������271
Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 271

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 272
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
273

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


Проект 37 - Цифровой однопроводной датчик
температуры ..........................275

Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 275

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 276
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
277

Проект 37 - Цифровой датчик температуры 1-Wire - Обзор
кода............................................ 281


Резюме�����������������������������������������������������������������������������������������������������������������������������������284

■Глава
14: Ультразвуковые дальномеры�����������������������������������������������������������285


Проект 38 - Простой ультразвуковой
дальномерr ���������������������������������������������285

Требуемые детали���������������������������������������������������������������������������������������������������������������������������������������
285

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 285
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
286

Проект 38 - Простой ультразвуковой дальномер - Обзор
кода...............................................287

Проект 38 - Простой ультразвуковой дальномер - Обзор
 устройства................................... 288

Проект 39 - Ультразвуковой дальномер.........................................................289

Требуемые детали���������������������������������������������������������������������������������������������������������������������������������������
289

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 290
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
292

Проект 39 - Ультразвуковой индикатор расстояния
 - Обзор кода..........................................293

Проект 40 - Ультразвуковая
 сигнализация���...���������������������������������������������������������������296
Требуемые детали���������������������������������������������������������������������������������������������������������������������������������������
296

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 297
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
297

Проект 40 - Ультразвуковая сигнализация
- Обзор кода........................................................ 299


xv

■ СОДЕРЖАНИЕ

Проект 41 - Ультразвуковой терменвокс.............................................................302
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
302

Проект 41 - Ультразвуковой терменвокс - Обзор
кода............................................................ 303


Резюме�����������������������������������������������������������������������������������������������������������������������������������304



■Чтение
и запись на SD-карту...............................................................305

Проект 42 - Простая SD-карта / чтение
и запись ���������������������������������������������������������305

Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 305
 ������������������������������������������������������������������������������������������������������������������������������������������������ 306
Подключение

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
307

Проект 42 - Простое чтение / запись SD-карты - Обзор
кода.................................................. 309


Проект 43 - Регистратор данных температуры
SD...............................................312

Требуемые детали��������������������������������������������������������������������������������������������������������������������������������������
313
 ������������������������������������������������������������������������������������������������������������������������������������������������ 313
Подключение

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
315
Проект 43 - Регистратор данных температуры SD - Обзор кода............................................ 317

Проект 43 - Регистратор данных температуры SD - Обзор
устройства..................................322


Резюме�����������������������������������������������������������������������������������������������������������������������������������323

 RFID�������������������������������������������������������������������325
■Глава
16: Создание считывателя

Проект 44 - Простой считыватель
RFID �������������������������������������������������������������������������..325

Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 325
 ������������������������������������������������������������������������������������������������������������������������������������������������ 326
Подключение

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
327

Проект 44 - Простой считыватель RFID - Обзор
кода������������������������������������������������������������������������� 327
Проект 44 - Простой считыватель RFID - Обзор устройства..................................................... 328

Проект 45 - Система контроля доступа...������������������������������������������������������������������������329

Требуемые детали��.�����������������������������������������������������������������������������������������������������������������������������������
329
 ������������������������������������������������������������������������������������������������������������������������������������������������ 330
Подключение

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
331
 код���������������������������������������������������������������������������� 334
Проект 45 - Система контроля доступа – Обзор


Резюме�����������������������������������������������������������������������������������������������������������������������������������339
xvi

■ СОДЕРЖАНИЕ

■Глава
17: Обмен данными через Ethernet.......................................................341


Проект 46 - Ethernet-шилд
 ��������������������������������������������������������������������������������������������������341
Требуемые детали
�������������������������������������������������������������������������������������������������������������������������������������� 341

Подключение
 ������������������������������������������������������������������������������������������������������������������������������������������������ 341
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
342

Что нужно знать о сети......................�����������������������������������������������������������������������������������������������������
345

Проект 46 - Ethernet - шилд - Обзор кода���������������������������������������������������������������������������������������������
346


Проект 47 - Прогноз погоды в Интернете����������������������������������������������������������������������350

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
353

Проект 47 - Прогноз погоды в Интернете – Обзор
 кода ������������������������������������������������������������������� 357

Проект 48 - Система оповещения
по электронной почте��������������������������������������360

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
360

Проект 48 - Система оповещения по электронной
почте — Обзор кода............................... 364


Проект 49 - Twitterbot�����������������������������������������������������������������������������������������������������������369
Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
369

Проект 49 - Twitterbot – Обзор кода ��������������������������������������������������������������������������������������������������������� 372

Проект 50 - RSS-программа прогноза
погоды ���������������������������������������������������������������377

Введите код���������������������������������������������������������������������������������������������������������������������������������������������������
377

Проект 50 - RSS-программа прогноза погоды–
 Обзор кода ������������������������������������������������������������� 381

Резюме�����������������������������������������������������������������������������������������������������������������������������������389



xvii

Вступление
Я впервые обнаружил Arduino в 2008 году, когда искал способы подключить датчики температуры к моему
ПК, чтобы я мог сделать детектор облаков. Я хотел опробовать концепцию обнаружения облаков,о
которой читал на метеорологическом форуме, и, поскольку она была экспериментальной, я не хотел
тратить на нее много денег в случае неудачи. На рынке было много решений, но больше всего мне
понравился Arduino. Это не только казалось простым и дешевым способом подключения необходимых
мне датчиков, но и его можно было использовать для других интересных вещей. Тысячи проектов в
блогах, видеосайтах и ​форумах показывали удивительные вещи, которые люди делали со своими
Arduino. Казалось, было огромное чувство общности, когда все пытались помочь друг другу.
Было очевидно, что я могу повеселиться с Arduino. Однако я не хотел рыться в поисках информации по
веб-сайтам. Я хотел купить книгу на эту тему, что-нибудь, что я мог бы держать в руке и читать в поезде
на работу. Осмотревшись, я нашел одну книгу. К сожалению, она был очень простой и устаревшей и не
оправдала моих ожиданий. Мне нужна была практическая книга, которая научила бы меня
программированию и электронике, чтобы я занимался практическими вещами, вместо того, чтобы
сначала пролезать страницы теории. Такой книги в то время просто не существовало.
Затем я основал Earthshine Electronics, чтобы продавать комплекты на базе Arduino. Чтобы дело пошло с
этим комплектом, я подготовил небольшой буклет с учебными пособиями, чтобы люди начали работать.
Этот небольшой буклет стал чрезвычайно популярным, и я получил сотни запросов от людей, которые
спрашивали, когда я добавлю еще проекты или продам ли я печатную версию. На самом деле, я уже
подумал, что было бы здорово написать исчерпывающую книгу для начинающих, набитую проектами и
написанную в удобном для понимания стиле. Так появилась эта книга. Эта книга оказалась настолько
успешной в обучении людей Arduino, что с тех пор она была обновлена ​до этого второго издания с
улучшениями и обновленными разделами, относящимися к изменениям в мире Arduino с тех пор, как я
начал этим заниматься.
Я написал эту книгу, исходя из предположения, что вы никогда раньше не занимались
программированием или электроникой. Я также предполагаю, что вам неинтересно читать много теории,
прежде чем вы приступите к созданию чего-либо с вашим Arduino. С самого начала книги вы сразу же
погрузитесь в создание простого проекта. Оттуда вы будете работать в общей сложности над 50
проектами, пока не станете уверенными и опытными в разработке Arduino. Я считаю, что лучший способ
чему-либо научиться - это учиться на ходу и заниматься практикой.
Книга работает так: первый проект знакомит с основными понятиями программирования Arduino и
электроники. Каждый последующий проект основан на предыдущих проектах. К тому времени, когда вы
завершите все 50 проектов, вы будете уверенны и опытны в создании собственных проектов. Вы сможете
адаптировать свои новые навыки и знания, чтобы подключить к Arduino что угодно и создавать отличные
проекты для развлечения или облегчения своей жизни.
Каждый проект начинается со списка необходимых частей. Я также привожу принципиальную схему,
показывающую, как именно соединить Arduino и детали вместе с помощью перемычек. Для создания
изображений деталей и макетов книги я использовал отличную программу с открытым исходным кодом
Fritzing (http://fritzing.org). Программа позволяет дизайнерам документировать свои прототипы, а затем
переходить к созданию печатных плат для производства.
После того, как вы создали свою схему, я предоставляю листинг кода для ввода в редактор

xxv

■ ВСТУПЛЕНИЕ

Arduino (IDE), который затем можно загрузить в ваш Arduino, чтобы проект заработал. У вас будет
полностью рабочий проект. Только после того, как вы создали свой проект и убедились, что он работает, я
объясню, как он работает. Вам объяснят электронику таким образом, чтобы вы знали, как работают
компоненты и как правильно их подключить к Arduino.
Затем код будет объяснен вам шаг за шагом, чтобы вы точно поняли, что делает каждый раздел кода.
Анализируя схему и код, вы поймете, как работает весь проект, и затем сможете применить полученные
навыки и знания к более сложным проектам, а затем к своим собственным проектам в будущем. Стиль
преподавания в этой книге очень прост. Даже если у вас нет абсолютно никакого опыта ни в
программировании, ни в электронике, вы сможете легко усвоить и понимать понятия по ходу дела. Что
еще более важно, вы получите удовольствие. Arduino - отличный и интересный продукт с открытым
исходным кодом. С помощью этой книги вы поймете, насколько это просто.
Майк МакРобертс

xxvi

ГЛАВА 1

Начало
С момента запуска проекта Arduino в 2005 году по всему миру было продано более 500 000 плат. Количество
проданных неофициальных плат-клонов, без сомнения, превышает количество официальных плат, и
вполне вероятно, что более миллиона плат Arduino или их вариантов находятся в свободном доступе. Его
популярность постоянно растет, поскольку все больше и больше людей осознают удивительный потенциал
этого невероятного проекта с открытым исходным кодом и его способность быстро и легко создавать
крутые проекты с относительно неглубокой кривой обучения.
Самым большим преимуществом Arduino перед другими платформами разработки микроконтроллеров
является простота использования, при которой люди, не являющиеся техническими специалистами, могут
овладеть основами и создавать своисобственные проекты за относительно короткий промежуток времени.
Художники, в частности, считают, чтоэто идеальный способ быстро и без специальных знаний в области
электроники создавать интерактивные произведения искусства. Существует огромное сообщество людей,
использующих Arduinos и делящихся своими кодами и схемами, чтобы другие могли использовать их и
форум Arduino - это то место, куда вы можете обратиться, если вам нужны быстрые ответы. Однако,
несмотря на огромное количество информации, доступной в Интернете для новичков, большая часть этой
информации разбросана по различным источникам, что затрудняет получение новичками нужной
информации. Здесь и вписывается эта книга. На страницах, которые вы собираетесь прочитать, есть 50
проектов, которые разработаны, чтобы шаг за шагом познакомить вас с миром электроники и легко
запрограммировать вашу Arduino. Я считаю, что лучший способ чему-либо научиться - это сразу же начать
делать это. Вот почему эта книга не утомит вас страницами теории, прежде чем вы начнете использовать
свой Arduino. Я знаю, каково это, когда вы впервые получаете Arduino или любой новый гаджет: вы хотите
подключить его, подключить светодиод и сразу же заставить его мигать, а не сначала читать страницы
руководств. Автор понимает это волнение, и поэтому мы сразу же погрузимся в подключение вещей к
нашему Arduino, загрузку кода и начало работы. Я считаю, что это лучший способ изучить предмет, и
особенно такой предмет, как физические вычисления, в чем и заключается суть Arduino.

О чем эта книга
Книга начинается с введения в Arduino, как установить программу, загрузить свой первый эскиз и
убедиться, что ваш Arduino и программа работают правильно. Затем мы расскажем про Arduino IDE
(интегрированную среду разработки) и то, как ее использовать, прежде чем мы перейдем
непосредственно к некоторым проектам, переходя от самых простых вещей к сложным. Каждый проект
начинается с описания того, как настроить устройство и какой код необходим для его работы.
Затем мы отдельно опишем код и , а также подробно объясним, как это работает. Все будет объяснено в
виде понятных и простых шагов. Книга содержит множество схем и фотографий, чтобы как можно проще
было проверить, правильно ли вы следуете проекту.В книге вы встретите некоторые термины и
понятия, которые поначалу можете не понять. Не волнуйтесь; они станут ясны по мере того,
как вы будете работать над проектами.

1

Глава 1 ■ НАЧАЛО РАБОТЫ

Что вам понадобится
Чтобы следовать проектам, описанным в этой книге, вам потребуются различные компоненты. Для
начала я предлагаю вам начать с покупки компонентов для проектов, описанных в первых
нескольких главах. По мере прохождения книги вы можете приобрести детали, необходимые для
последующих проектов.Есть несколько других предметов, которые вам понадобятся или могут
оказаться полезными. Конечно, вам нужно будет приобрести плату Arduino или одну из многих
плат-клонов на рынке, таких как Freeduino, Seeeduino (да, действительно их три), Boarduino,
Sanguino, Roboduino или любой другой «duino». Все они полностью совместимы с Arduino IDE,
Arduino Shields и всеми остальными, что вы можете использовать с официальной платой Arduino.
Помните, что Arduino - это проект с открытым исходным кодом; поэтому любой может создать клон
или другой вариант Arduino. Для проектов в этой книге мы будем использовать Arduino Uno, хотя
любая из доступных плат Arduino будет работать так же хорошо. Вам понадобится доступ к
Интернету, чтобы загрузить Arduino IDE, программу, используемое для написания вашего кода
Arduino и загрузки его на плату, а также для загрузки примеров кода из папки с кодами (если вы не
хотите вводить их самостоятельно), а также любые библиотеки, которые могут потребоваться для
работы вашего проекта. Наконец, самое главное, что вам понадобится -это энтузиазм и желание
учиться. Arduino разработан как простой и дешевый способ познакомиться с электроникой
микроконтроллера, и нет ничего слишком сложного для изучения, если вы готовы попробовать. Эта
книга поможет вам в этом путешествии и познакомит вас с этим увлекательным и творческим
хобби.

Что такое Arduino?
В Википедии говорится: «Arduino - это одноплатный микроконтроллер, разработанный, чтобы сделать
процесс использования электроники в мультидисциплинарных проектах более доступным. Аппаратное
обеспечение состоит из простой платы с открытым исходным кодом, разработанной на базе
8-разрядного микроконтроллера Atmel AVR, хотя новая модель была разработана на основе 32-разрядного
микроконтроллера Atmel ARM. Программное обеспечение состоит из компилятора стандартного языка
программирования и загрузчика, который выполняется на микроконтроллере ».

Рис.1-1. Arduino Mega

2

Глава 1 ■ НАЧАЛО РАБОТЫ

Говоря простым языком, Arduino - это крошечный компьютер, который можно запрограммировать для
обработки входных и выходных сигналов между устройством и внешними компонентами, которые вы к нему
подключаете. Arduino - это так называемая физическая или встраиваемая вычислительная платформа.
Например, простое использование Arduino - это включить свет на установленный период времени, скажем,
на 30 секунд, после нажатия кнопки. В этом примере к Arduino будет подключена лампа, а также кнопка.
Arduino будет терпеливо ждать, пока будет нажата кнопка.
Когда вы нажимаете кнопку, Arduino включает лампу и начинает отсчет. После того, как он отсчитывал 30
секунд, он выключает лампу, а затем продолжает ждать следующего нажатия кнопки. Вы можете
использовать эту установку, например, для управления лампой в шкафу.
Вы можете расширить это понятие, чтобы устройство обнаруживало, когда дверца шкафа была открыта
или произошло какое-либо другое событие, и автоматически включала лампу, выключая ее по истечении
заданного периода времени. Вы можете пойти еще дальше и подключить пассивный инфракрасный датчик
(PIR) для обнаружения движения и включения лампы при срабатывании триггера.
Это несколько простых примеров того, как вы можете использовать Arduino.
Arduino можно использовать для разработки автономных интерактивных объектов, или он может быть
подключен к компьютеру, сети или даже Интернету для извлечения и отправки данных на Arduino и
обратно, а затем воздействовать на эти данные. Например, его можно использовать для отправки набора
данных, полученных от датчиков, на веб-сайт для отображения в виде графика.
Arduino может быть подключен к светодиодам, точечно-матричным дисплеям (см. Рисунок 1-2), кнопкам,
переключателям, двигателям, датчикам температуры, датчикам давления, датчикам расстояния,
приемникам GPS, модулям Ethernet или WiFi или ко всему, что выводит данные. или можно контролировать.
Если заглянуть в Интернет, можно найти множество проектов, в которых Arduino использовалась для
чтения данных с огромного множества устройств или управления ими.

Рис. 1-2. Точечно-матричный дисплей, управляемый Arduino
Плата Arduino состоит из микропроцессора Atmel AVR, генератора вырабатывающий заданную частоту и
стабилизатора напряжения 5 В. Он также имеет разъем USB, позволяющий подключать его к ПК для
загрузки или получения данных. Плата имеет разъемы,через которые осуществляется доступ к пинам
ввода / вывода микроконтроллера, чтобы вы могли подключать эти пины к другим схемам или датчикам и
т. д.
Чтобы запрограммировать Arduino (заставить его делать то, что вы хотите), используется Arduino IDE,
часть бесплатного программного обеспечения, которое позволяет вам программировать на языке,
который понимает Arduino. Язык основан на C / C ++ и даже может быть расширен с помощью библиотек C
++. IDE позволяет вам писать программы, которая представляет собой набор пошаговых инструкций,
которые вы затем загружаете в Arduino. Затем ваш Arduino будет выполнять эти инструкции и
взаимодействовать со всем, что вы к нему подключили. В мире Arduino программы известны как
«скетчи».

3

Глава 1 ■ НАЧАЛО РАБОТЫ

Аппаратное и программное обеспечение Arduino имеют открытый исходный код, что означает, что код,
схемы, дизайн и т. д. находятся в свободном доступе. Поэтому, существует множество плат-клонов на базе
Arduino, которые можно купить или изготовить самому. В самом деле, ничто не мешает вам приобрести
соответствующие компоненты и создать свой собственный Arduino на макете или на своей собственной
печатной плате. Единственное условие, которое делает команда Arduino, заключается в том, что вы не
можете использовать слово Arduino, поскольку оно зарезервировано для официальной платы. Arduino
также может быть расширен за счет использования «шилдов», которые представляют собой печатные
платы, содержащие другие устройства (например, приемники GPS, ЖК-дисплеи, модули Ethernet и т. д.),
которые вы можете просто подключить к верхней части вашего Arduino, чтобы получить дополнительную
функциональность. Шилды также расширяют выводы (места на вашем Arduino, где вы можете выводить или
вводить данные) до верхней части их собственной печатной платы, поэтому у вас по-прежнему есть доступ
ко всем из них. Вам не обязательно использоватьшилд, если вы этого не хотите,так как вы можете сделать
точно такую ​же схему, используя макет, какой-нибудь Stripboard или Veroboard (платы, состоящие из полосок
меди в сетке для проектов с домашней пайкой), или сделав свою собственную печатную плату. Большинство
проектов в этой
. книге выполнено с использованием схем на макетной плате.
Поскольку дизайн является открытым исходным кодом, клонированная плата, такая как Freeduino, может быть
на 100 процентов совместима с Arduino и, следовательно, с любой программой,шилдами и т. д.. Кроме того,
Due (который является подлинным Arduino) имеет некоторые проблемы, такие как его работа с напряжением
3 В, которая может работать не со всеми шилдми.
Доступно множество различных вариантов Arduino. Самая распространенная из них - Uno, выпущенная в
2010 году (в настоящее время находится в редакции 3), и это плата, которую вы, скорее всего, увидите,
как используемую в подавляющем большинстве проектов Arduino в Интернете. Последние дополнения к
линейке продуктов - это Arduino Leonardo и Arduino Due, которые являются первым вторжением команды
Arduino в использование процессоров ARM вместо процессоров архитектуры AVR. Due имеет 32-битный
процессор вместо обычного 8-битного процессора, работают на частоте 84 МГц и имеют 512 КБ
флеш-памяти.
Вероятно, самый универсальный Arduino и, следовательно, причина его популярности - Uno (до Uno
самым популярным был Duemilanove). Это связано с тем, что они используют стандартный 28-контактный
чип, подключенный к гнезду IC (интегральной схемы). Прелесть этой схемы в том, что если вы делаете
что-то аккуратное с помощью Arduino, а затем хотите превратить его во что-то постоянное, вместо
использования относительно дорогой платы Arduino вы можете просто использовать Arduino для
разработки своего устройства и программирования чипа, а затем вытащить микросхему из платы и
поместить ее на свою печатную плату в собственном устройстве. Затем за пару фунтов или баксов вы
можете заменить чип AVR в вашем Arduino на новый. Чип должен быть предварительно запрограммирован с
помощью загрузчика Arduino (программа,зашитое в чип, чтобы его можно было использовать с Arduino IDE),
но вы можете либо приобрести программатор AVR, чтобы записать загрузчик самостоятельно, либо вы
можете купить готовый запрограммированный чип.
Более новый Arduino Uno имеет на борту программируемый USB-чип, который позволяет вам прошивать чип
таким образом, что при подключении устройства к компьютеру он будет отображаться как USB-устройство.
Это позволяет использовать Arduino в качестве интерфейса для создания собственных USB-устройств.
Однако это расширенная функция и не для слабонервных.
Если вы выполните поиск Arduino в Интернете, вы будете поражены огромным количеством веб-сайтов,
посвященных Arduino или на которых кто-то использовал Arduino для создания классного проекта. Arduino
- удивительное устройство, которое позволит вам создавать что угодно, от интерактивных произведений
искусства (см. Рис. 1-3) до роботов. С большим энтузиазмом по поводу того, как научиться программировать
Arduino и заставить его взаимодействовать с другими компонентами, а также немного воображения, вы
можете построить все, что только сможете придумать.

4

Глава 1 ■ НАЧАЛО РАБОТЫ

Рис. 1-3. Арт-инсталляция Антроса Ричарда В. Гилбанка, управляемая с помощью Arduino
Эта книга даст вам необходимые навыки, чтобы начать заниматься этим увлекательным и творческим
хобби. Итак, теперь, когда вы знаете, что такое Arduino, давайте подключим его к нашему компьютеру и
начнем его использовать.

Настройка вашего Arduino
В этом разделе объясняется, как настроить Arduino и IDE в первый раз. Даны инструкции как для Windows,
так и для Mac. Если вы используете Linux, обратитесь к инструкциям по началу работы на веб-сайте Arduino
по адресу http://playground.arduino.cc/learning/linux. Если у вас другой тип платы, обратитесь к
соответствующей странице в руководстве по началу работы на веб-сайте Arduino.

Рис. 1-4. Arduino Uno

5

Глава 1 ■ НАЧАЛО РАБОТЫ

Вам также понадобится USB-кабель (с разъемом от A до B), который является кабелем того же типа,
который используется в большинстве современных USB-принтеров. Если у вас есть Arduino Nano, вам
понадобится кабель USB A - Mini-B.
Затем вам нужно загрузить Arduino IDE. Это программа, которое будет использоваться для написания
своих программ (или скетчей) и загрузки их на вашу плату. Для получения последней версии IDE перейдите
на страницу загрузки Arduino по адресу
http://arduino.cc/en/Main/Software и получите версию, соответствующую вашей операционной системе.
Теперь вам нужно подключить плату Arduino перед установкой драйверов и программного обеспечения.
Подключите USB-кабель к Arduino, а другой конец подключите к USB-разъему на вашем компьютере. Вы
увидите, что на вашей плате загорится зеленый индикатор питания (помеченный PWR), чтобы показать
вам, что на нее есть питание. Если вы работаете в Windows, он попытается установить драйверы для
Arduino. Эта автоматическая попытка не удастся, и вы получите сообщение, что «Программное
обеспечение драйвера устройства не было успешноустановлено» (Рисунок 1-5); не беспокойся об этом.

Рис. 1-5. Автоматическая попытка Windows установить драйверы не удается. Это нормально
Щелкните меню «Пуск», затем щелкните «Панель управления». Перейдите в раздел «Система и
безопасность», нажмите «Система» и откройте Диспетчер устройств. В списке оборудования под «Другие
устройства» вы должны увидеть что-то похожее на рис. 1-6, на котором у вас есть «Arduino Uno» с желтым
значком опасности над ним.

6

Глава 1 ■ НАЧАЛО РАБОТЫ

Рис. 1-6. Диспетчер устройств Windows
Щелкните правой кнопкой мыши значок Arduino Uno в списке и выберите «Обновить
программное обеспечение драйвера» (рисунок 1-7).

Рис. 1-7.

7

Глава 1 ■ НАЧАЛО РАБОТЫ

Теперь выберите «Найти на моем компьютере драйверы».

Рис. 1-8. Нажмите «Найти на моем компьютере драйверы»
Затем перейдите в папку с драйверами установки Arduino и нажмите кнопку «Далее». Windows завершит
установку драйвера. Если вы получили сообщение «Windows не может проверить издателя этого
программного обеспечения драйвера», нажмите «Все равно установить этот драйвер».Теперь, когда
драйверы установлены, вы готовы открыть Arduino IDE. В Windows дважды щелкните файл arduino.exe в
распакованной папке Arduino. IDE откроется и представит вам пустой эскиз, как на рис. 1-9.

8

Глава 1 ■ НАЧАЛО РАБОТЫ

Рис. 1-9. Arduino IDE
Затем откройте пример скетча, чтобы протестировать IDE и Arduino. Щелкните Файл, затем Примеры,
затем 01.Basics,и, наконец, Blink (см. рис. 1-10).

9

Глава 1 ■ НАЧАЛО РАБОТЫ

Рис. 1-10. Файловое меню Arduino. Выберите скетч Blink
Загрузится скетч-пример Blink в IDE и будет выглядеть примерно так, как показано на рис. 1-11.

10

Глава 1 ■ НАЧАЛО РАБОТЫ

Рис. 1-11. IDE с загруженным скетчем Blink
Затем вам нужно будет выбрать свою ПЛАТУ из списка (см. Рис. 1-12) в Инструменты ➤ плата. Для
Arduino Uno выберите это в верхней части списка.

11

Глава 1 ■ НАЧАЛО РАБОТЫ

Рис. 1-12. Выберите тип вашей платы
Выберите последовательное устройство платы Arduino в Инструменты Tools Последовательный порт (см.
Рисунок 1-13). Если вы не уверены, какой у вас порт, отключите Arduino и проверьте доступные порты,
затем снова подключите Arduino и посмотрите, какой порт теперь появился (вам может потребоваться
закрыть и снова открыть меню, чтобы он отобразился).
F

12

Глава 1 ■ НАЧАЛО РАБОТЫ

Рис. 1-13. Выберите порт

Загрузите свой первый скетч
Теперь, когда вы установили драйверы и IDE и выбрали соответствующие плату и порты, вы можете
загрузить пример скетча Blink в Arduino, чтобы проверить, все ли работает правильно, прежде чем
переходить к первому проекту. После того, как вы загрузили скетч Blink в Arduino IDE, вы можете загрузить
его в Arduino, просто нажав кнопку «Загрузить» (вторая кнопка слева, которая представляет собой стрелку
вправо) и посмотрите на свой Arduino (если у вас есть Arduino Mini, NG или другая плата, вам может
потребоваться нажать кнопку сброса на плате до нажатия кнопки загрузки).
IDE скажет «Компиляция скетча. . . », Который затем изменится на« Загрузка. . . . » Затем индикаторы RX и
TX должны начать мигать, показывая, что данные передаются с вашего компьютера на плату. После
успешной загрузки скетча в строке состояния IDE появятся слова «Done uploading», а индикаторы RX и TX
перестанут мигать.
Через несколько секунд вы должны увидеть, как светодиод на контакте 13 (крошечный светодиод над
светодиодами TX и RX) начинает мигать с интервалом в одну секунду. Если это так, значит, вы только что
успешно подключили Arduino, установили драйверы и программное обеспечение и загрузили пример
скетча. Эскиз Blink - это очень простой эскиз, в котором мигает светодиод 13, представляющий собой
крошечный оранжевый светодиод, припаянный к плате и также подключенный к цифровому выводу 13
микроконтроллера (см. Рисунок 1-14).

Рис. 1-14. Мигание светодиода 13
Прежде чем мы перейдем к проекту 1, давайте взглянем на IDE Arduino, и я объясню, что делает каждая
из частей программы.

13

Глава 1 ■ НАЧАЛО РАБОТЫ

Arduino IDE
IDE Arduino IDE (интегрированная среда разработки) Arduino - это то, что вы будете использовать для
написания кода для вашего Arduino, его проверки и загрузки на свою плату. Когда вы откроете IDE Arduino,
она будет похожа на версию для Windows на изображении ниже (рис. 1-15).

Рис. 1-15. Так выглядит IDE при открытии приложения

14

Глава 1 ■ НАЧАЛО РАБОТЫ

IDE разделена на четыре части: меню «Файл» в верхней части программы (или в верхней части экрана в
OSX), панель инструментов под ним, код или окно эскиза в центре и окно сообщения внизу. . Панель
инструментов состоит из шести кнопок, а под панелью инструментов находится вкладка или набор вкладок
с именем файла скетча внутри вкладки. В дальнем правом углу есть еще одна кнопка, которая вызывает
окно Serial Monitor.Вверху находится меню файлов с раскрывающимися меню под заголовками Arduino,
Файл,Правка,Скетч,Инструменты и Помощь. Кнопки на панели инструментов (см. Рис. 1-16) обеспечивают
удобный доступ к наиболее часто используемым функциям в этом меню файла.

Проверить Загрузка

Новый открыть сохранить

монитор порта

Рис. 1-16. . Панель инструментов.

Кнопки панели инструментов перечислены на Рисунке 1-16. Функции каждой из кнопок
следующие:
Таб. 1-1. Функции кнопок панели инструментов
Проверить

Проверяет код на наличие ошибок

Загрузка

Загружает текущий скетч в Arduino

Новый

Создает новый пустой скетч

Открыть

Показывает список скетчей в вашем Sketchbook для открытия

Сохранить

Сохраняет текущий скетч в ваш Sketchbook

Монитор порта Отображает последовательные данные, отправляемые с Arduino

Кнопка «Проверить» используется для проверки правильности кода и отсутствия ошибок перед
его загрузкой на плату Arduino.
Кнопка «Загрузка» загрузит код из текущего окна скетча в ваш Arduino. Перед загрузкой необходимо
убедиться, что у вас выбраны соответствующие плата и порт (в меню «Инструменты»). Важно, чтобы вы
сохранили свой скетч перед загрузкой его на плату на случай, если из-за странной ошибки ваша система
зависнет или IDE выйдет из строя. Также рекомендуется проверить код перед загрузкой, чтобы
убедиться в отсутствии ошибок, которые необходимо сначала отладить.
Кнопка «Новый» создаст совершенно новый и пустой скетч, в который вы можете ввести свой код. IDE
попросит вас ввести имя и местоположение для вашего скетча (попробуйте использовать местоположение
по умолчанию, если возможно), а затем предоставит вам пустой скетч, готовый для кодирования. Вкладка в
верхней части скетча теперь будет содержать имя, которое вы дали новому скетчу.
Кнопка «Открыть» представит вам список скетчей, хранящихся в вашем альбоме, а также список примеров
скетчей, которые вы можете опробовать с различными периферийными устройствами после
подключения. Примеры набросков неоценимы для новичков, которые могут использовать их в качестве
основы для собственного скетча. Откройте соответствующий скетч для подключаемого устройства,а
затем измените код в соответствии с вашими потребностями.
Кнопка «Сохранить» сохранит код из окна скетча в файл скетча. После завершения вы получите
сообщение«Сохранение готово» в нижней части окна кода.

15

Глава 1 ■ НАЧАЛО РАБОТЫ

Монитор порта - очень полезный инструмент, особенно для отладки вашего кода. Монитор отображает
последовательные данные, отправляемые с вашего Arduino (USB или последовательная плата). Вы
также можете отправить последовательные данные обратно в Arduino с помощью Монитора порта. Если
вы нажмете кнопку Монитор порта, вы увидите изображение, подобное изображенному на Рис. 1-17.

Рис. 1-17. Используемый монитор порта
В правом нижнем углу вы можете выбрать скорость передачи, с которой последовательные данные будут
отправляться в / из Arduino. Скорость передачи - это скорость в секунду с которой биты (данные)
отправляются на / с платы. По умолчанию установлено значение 9600 бод, что означает, что если вы
отправляете текстовый роман по линии последовательной связи (в данном случае через USB-кабель), то
1200 букв или символов романа будут отправляться в секунду (9600 бит / 8 бит на символ = 1200 байтов или
символов - биты и байты будут объяснены позже).
Вверху находится пустое текстовое поле для ввода текста для отправки обратно в Arduino и кнопка
«Отправить» для отправки текста в этом поле. Обратите внимание, что Монитор порта не будет получать
никаких последовательных данных, если вы не настроили код внутри своего скетча для отправки
последовательных данных из Arduino. Точно так же Arduino не получит никаких данных, если вы не
закодировали его для этого.
В левом нижнем углу есть поле для галочки, где вы можете выбрать, хотите ли вы, чтобы данные в окне
Монитора порта автоматически прокручивались или нет.
Поле слева от меню скорости передачи влияет на данные, отправляемые с Монитора порта обратно в
Arduino.
По умолчанию установлено значение «без окончания строки». Это означает, что когда вы вводите данные в
текстовое поле на Мониторе порта и нажимаете «отправить», данные будут отправлены как есть. Если
щелкнуть раскрывающееся меню, появятся еще три параметра: «Новая строка» и «Возврат каретки». и Оба
NL + Cr. При выборе одного из них монитор последовательного порта (МПП) добавит код ascii для новой
строки, возврата каретки или обоих в конце любых данных, введенных в окно МПП, когда вы нажмете кнопку
«Отправить». Имейте это в виду при обработке данных, отправленных с МПП обратно на Arduino.
Наконец, основная область - это место, где будут отображаться ваши данные. На изображении выше
Arduino выполняет скетч ASCIITable, который можно найти в примерах связи. Эта программа выводит
символы ASCII из Arduino через последовательный порт (USB-кабель) на ПК, где их затем отображает
МПП.
Когда вы научитесь обмениваться данными через последовательный порт с Arduino и обратно, вы можете
использовать другие программы, такие как Processing, Flash, MaxMSP и т. д. для связи между Arduino и
вашим ПК. Мы будем использовать МПП позже в наших проектах, когда мы будем считывать данные с
датчиков

Глава 1 ■ НАЧАЛО РАБОТЫ

Под окном сообщений в левом нижнем углу вы увидите число. Это текущая строка, на которой находится
курсор в окне кода. Если у вас есть код в вашем окне, и вы перемещаетесь вниз по строкам кода (используя
клавишу ↓ на клавиатуре), вы увидите, что число увеличивается по мере продвижения вниз по строкам
кода. Это полезно для поиска ошибок, отмеченных сообщениями об ошибках.
В верхней части окна IDE вы увидите различные меню, щелкнув по которым можно получить доступ к
дополнительным пунктам меню (см. Рис. 1-18).

Рис. 1-18. Меню IDE

Рис. 1-20. Меню «Файл»
Следующее меню - это меню «Файл». (см. рис. 1-20). Здесь вы получаете доступ к параметрам для
создания нового скетча, просматриваете скетчи, хранящиеся в вашей папке с скетчами, примеры файлов,
параметры для сохранения вашего скетча (или «Сохранить как», если вы хотите дать ему другое имя). У
вас также есть возможность загрузить свой скетч в Arduino, загрузить с помощью программатора (мы не
будем использовать эту функцию), а также параметры печати для распечатки вашего кода.
Внизу находится опция «Настройки». В ней находится окно настроек, в котором вы можете изменить
различные параметры IDE, например, где хранится ваша папка со скетчами по умолчанию и т. д. Наконец,
есть параметр «Выход», который позволяет выйти из программы.

17

Глава 1 ■ НАЧАЛО РАБОТЫ

Рис. 1-21. Меню«Правка»
Далее идет меню «Правка» (см. Рис. 1-21). Здесь вы получаете опции, позволяющие вырезать, копировать и
вставлять разделы кода. Выделяйте весь свой код, а также находите в нем определенные слова или фразы.
Комментируйте свой код, чтобы объяснить, как он работает), а также увеличивайте или уменьшайте
отступы. Также включены полезные опции «Отменить» и «Вернуть», которые пригодятся, если вы
допустили ошибку.
Параметр «Копировать для форума» скопирует код в окно Sketch, но в формате, который при вставке в
форум Arduino (или большинство других форумов в этом отношении) будет отображаться так же, как в среде
IDE, вместе с раскраской синтаксиса и так далее.

Рис. 1-22. Меню скетча
Наше следующее меню - это меню Sketch (см. Рис. 1-22), которое дает нам доступ к функциям
Проверить/компилировать и некоторым другим полезным функциям, которые вы будете использовать
позже. К ним относится опция«подключить библиотеку», при нажатии на которую открывается список
доступных библиотек, хранящихся в папке ваших библиотек.

18

Глава 1 ■ НАЧАЛО РАБОТЫ

Библиотека - это набор кода, который вы можете включить в свой эскиз для улучшения
функциональности вашего проекта.Это способ не дать вам заново изобретать велосипед, повторно
используя код, уже созданный кем-то другим, с которыми вы можете столкнуться при использовании
Arduino.
Например, вы найдете одну из библиотек - Stepper, которая представляет собой набор функций,
которые вы можете использовать в своем коде для управления шаговым двигателем. Кто-то любезно
уже создал все необходимые функции, необходимые для управления шаговым двигателем, и, включив
библиотеку Stepper в наш скетч, мы можем использовать эти функции для управления двигателем по
своему желанию. Сохраняя часто используемый код в библиотеке, вы можете многократно
использовать этот код в разных проектах, а также скрывать сложные части кода от пользователя.
Позже мы более подробно рассмотрим использование библиотек.
Наконец, в меню Sketch есть опция «Показать папку скетча», которая открывает папку, в которой
хранится ваш скетч. Кроме того, есть опция «Добавить файл...», которая позволит вам добавить еще
один исходный файл в ваш скетч. Эта функция позволяет разбивать большие скетчи на файлы
меньшего размера, а затем добавлять их в основной скетч.
Следующее меню в среде IDE - это меню «Инструменты» (см. Рис. 1-23). Здесь есть возможность
выбрать используемую плату и последовательный порт, как мы это делали при первой настройке
Arduino. Также у нас есть функция автоформатирования, которая форматирует ваш код, чтобы он
выглядел лучше.

Рис. 1-23. Меню Инструменты

19

Глава 1 ■ НАЧАЛО РАБОТЫ

Опция «Архивировать скетч» позволит вам сжать эскиз в ZIP-файл и спросит вас, где вы хотите его
сохранить. Параметр «Исправить кодировку и перезагрузить» предназначен для преобразования кода,
созданного в более старых версиях среды IDE, в более новый формат.
Кнопка «программатор:» позволит вам выбрать программатор, если вы используете внешнее устройство
для загрузки кода в Arduino или хотите записать код на чип в вашем собственном проекте. Мы просто
будем использовать USB-кабель, который мы купили с нашим Arduino.
Наконец, параметр «Записать загрузчик» можно использовать для записи загрузчика Arduino (фрагмента
кода на чипе, чтобы сделать его совместимым с IDE Arduino) на чип. Эту опцию можно использовать только
в том случае, если у вас есть программатор AVR и вы заменили чип в Arduino или купили пустые чипы для
использования в собственном встроенном проекте. Если вы не планируете прожигать много микросхем,
обычно дешевле и проще просто купить микросхему ATmega (см. Рис. 1-24) с уже запрограммированным
загрузчиком Arduino. Во многих интернет-магазинах есть предварительно запрограммированные чипы, и
их можно купить довольно дешево. Чип, используемый в Arduino Uno, - это Atmel ATmega328.

Рис. 1-24. Микросхема Atmel ATmega. Сердце вашего Arduino.
Последнее меню - это меню «Справка», где вы можете найти справочные меню для получения
дополнительной информации об IDE или ссылки на справочные страницы веб-сайта Arduino и другие
полезные страницы. IDE Arduino довольно проста, и вы узнаете, как ее быстро и легко использовать, пока
мы работаем над проектами. По мере того, как вы становитесь более опытными в использовании Arduino и
программировании на C (язык программирования, который мы используем для кодирования на Arduino), вы
можете обнаружить, что IDE Arduino слишком проста и захотите использовать что-то с лучшими
функциями. Действительно, многие опытные программисты Arduino вообще не используют IDE, а вместо
этого используют профессиональные программы IDE (некоторые из которые бесплатны), такие как
Eclipse,ArduIDE, GNU / Emacs, AVR-GCC, AVR Studio и даже XCode от Apple.
Итак, теперь, когда у вас установлено программное обеспечение Arduino, плата подключена и работает,
и у вас есть базовое понимание того, как использовать IDE, давайте сразу перейдем к Project 1 - LED
Flasher.

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

20

Глава 2

Проекты на LED
Теперь вы будете работать над первыми четырьмя проектами. Во всех этих проектах светодиодное
освещение используется по-разному. Вы узнаете об управлении выходами с Arduino, а также о простых
входах, таких как нажатие кнопок. Что касается аппаратного обеспечения, вы узнаете о светодиодах,
кнопках и резисторах, включая подтягивающие и стягивающие резисторы, которые важны для
правильного считывания устройств ввода. Попутно вы познакомитесь с понятиями программирования
на языке Arduino. Давайте начнем с проекта «Hello World», который заставляет ваш Arduino мигать
внешним светодиодом.

Проект 1 - Светодиодная мигалка
Для самого первого проекта мы собираемся повторить эскиз мигания светодиода, который мы
использовали на этапе тестирования в главе 1. Мы подключим светодиод к одному из цифровых
выводов, а не используем светодиод 13, припаянный к плате. Мы также узнаем, как именно работает
аппаратное и программное обеспечение для этого проекта, по ходу дела, узнавая немного об
электронике и кодировании на языке Arduino одновременно.

Таб. 2-1. Детали, необходимые для проекта 1
Макетная плата

5 мм LED
Резистор* 10 Ом
перемычки

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

Требуемые детали
Наилучший тип макета для большинства проектов, описанных в этой книге, - это макетная плата на 840
точек. Это довольно стандартная плата, которая имеет размеры примерно 16,5 на 5,5 см и имеют 840 точек
на плате. Обычно у них есть маленькие «ласточкины хвосты» сбоку, позволяющие соединить несколько из
них вместе для создания платы более крупных размеров,что нужно для больших проектов. Однако для
этого проекта подойдет макетная плата любого размера.

21

ГЛАВА 2 ■ Зажги их

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

Подключение
Во-первых, убедитесь, что ваш Arduino выключен, отсоединив его от USB-кабеля. Затем возьмите плату,
светодиод, резистор и провода и подключите все, как показано на рисунке 2-1.

Рис. 2-1. Схема для Проекта 1 - LED мигалка
Неважно, используете ли вы провода разного цвета или разные отверстия на макетной плате, если
компоненты и провода подключены в том же порядке, что и на картинке. Будьте осторожны при установке
компонентов в макетную плату. Неправильная установка компонентов может привести к повреждению
платы. Убедитесь, что анод светодиода (обычно более длинный вывод) подключен к резистору, а катод
- на землю. Когда вы уверены, что все подключено правильно, включите Arduino, подключив USB-кабель.

22

ГЛАВА 2 ■ Зажги их

Введите код
Откройте IDE Arduino и введите код из листинга 2-1 или из папки с кодами:
Листинг 2-1. Код для проекта 1
// Project 1 - LED мигалка
int ledPin = 10;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
Теперь нажмите кнопку "Проверить" в верхней части IDE, чтобы убедиться, что в вашем коде нет
ошибок. В случае успеха теперь вы можете нажать кнопку «Загрузка», чтобы загрузить код в свой
Arduino. Если вы все сделали правильно, вы должны видеть, как светодиод на плате мигает
каждую секунду.Теперь давайте взглянем на код и и выясним, как он работает.

Проект 1 - LED Flasher - Обзор кода
Давайте посмотрим на код этого проекта. Наша первая строка
// Project 1 - LED мигалка
Это просто комментарий в нашем коде, который игнорируется компилятором. Компилятор
́
– это
программа, которая переводит текст, написанный на языке программирования, в набор машинных кодов.
Все, что следует за // (двойная косая черта) в строке, компилятор игнорирует. Это позволяет вам
добавлять примечания для себя и всех остальных, которые могут читать код, объясняющий, как он
работает.
Комментарии необходимы в вашем коде, чтобы помочь вам понять, что происходит и как работает ваш
код. Позже, когда ваши проекты станут более сложными, а ваш код расширится до сотен или, может быть,
тысяч строк, комментарии будут иметь важное значение. Вы можете придумать потрясающий фрагмент
кода, но если вы вернетесь и посмотрите на этот код через несколько дней, недель или месяцев, вы
можете забыть, как все это работает. Комментарии помогут вам вспомнить , позволят другим понять,что
происходит в вашем коде.
Вы также можете помещать комментарии в блок, используя разделители / * и * /, например:

/ * Весь текст внутри косой черты и
звездочки является комментарием и
будет проигнорирован компилятором *
/
IDE автоматически изменит цвет любого закомментированного текста на серый. Следующая строка
программы
int ledPin = 10;

23

ГЛАВА 2 ■ Зажги их

Это так называемая переменная. Переменная - это место для хранения данных. Представьте себе
переменную ввиде небольшого ящика, в котором вы можете хранить вещи. Переменная называется
переменной, потому что вы можете изменить ее содержимое. В этом случае вы настраиваете
переменную типа int или integer. Целое число - это число в диапазоне от -32 768 до 32 767. Затем вы
присвоили этому целому числу имя ledPin и присвоили ему значение 10. Мы можем назвать это число
как угодно. Но поскольку мы хотим, чтобы имя нашей переменной было описательным, мы называем
его ledPin, чтобы показать, что эта переменная использует цифровой вывод 10 платы Arduino для
подключения нашего светодиода. В конце этого оператора стоит точка с запятой. Это символ,
указывающий компилятору, что этот оператор завершен.
Хотя мы можем называть наши переменные как угодно, каждое имя переменной в C должно начинаться с
буквы; остальная часть имени может состоять из букв, цифр и символов подчеркивания. C распознает
символы верхнего и нижнего регистра как разные. Наконец, вы не можете использовать ключевые слова C,
такие как main, while, switch и т. д., в качестве имен переменных. Ключевые слова - это константы,
переменные и имена функций, которые определены как часть языка Arduino. Не используйте имя
переменной, которое совпадает с ключевым словом. Все ключевые слова в скетче будут выделены
красным цветом. Итак, вы создали область в памяти для хранения числа целого типа и сохранили в этой
области число 10. Далее у нас есть наша функция setup ():
void setup() {
pinMode(ledPin, OUTPUT);
}
Скетч Arduino должен иметь функции setup () и loop (). Функция setup () запускается один раз и только один
раз в начале программы, и именно здесь будут общие инструкции для подготовки программы перед
запуском основного цикла, такие как настройка режимов вывода, установка скорости последовательной
передачи данных и т. д. В основном, функция - это блок кода, собранный в один удобный блок. Например,
если мы создали нашу собственную функцию для выполнения целого ряда сложных математических
операций, в которых было много строк кода, мы могли бы запускать этот код столько раз, сколько захотим,
просто вызывая имя функции вместо того, чтобы писать код заново раз. Позже мы рассмотрим функции
более подробно, когда начнем создавать свои собственные. В случае нашей программы функция setup ()
должна выполнить только один оператор. Функция начинается с
void setup()
Здесь мы сообщаем компилятору, что наша функция называется setup, что она не возвращает данных
(void) и что мы не передаем ей никаких параметров (пустые скобки). Если бы наша функция вернула
целочисленное значение, и у нас также были бы целые значения для передачи ей (например,функции
для обработки), то это выглядело бы примерно так
int myFunc(int x, int y)
В этом случае мы создали функцию (или блок кода) под названием myFunc. Этой функции были
переданы два целых числа с именами x и y. После завершения функции она вернет целочисленное
значение в точку после того, как наша функция была вызвана в программе. Весь код внутри функции
заключен в фигурные скобки. Символ { начинает блок кода, а символ } закрывает блок. Все, что
находится между этими двумя символами, - это код, принадлежащий функции. Мы более подробно
рассмотрим функции в Проекте 4 в этой главе. Все, что вам нужно знать, что в этой программе у нас
есть две функции, и первая функция называется setup; его цель - настроить все необходимое для
работы нашей программы до запуска основного цикла программы.
void setup() {
pinMode(ledPin, OUTPUT);
}

24

ГЛАВА 2 ■ Зажги их

Наша функция настройки имеет только один оператор - pinMode. Здесь мы говорим Arduino, что хотим
установить режим одного из наших цифровых выводов как режим вывода, а не ввода. В скобках указываем
номер пина и режим (OUTPUT - ВЫХОД ). Номер нашего пина - ledPin, которому в нашей программе ранее
было присвоено значение 10. Следовательно, этот оператор просто сообщает Arduino, что цифровой
вывод 10 должен быть установлен в режим OUTPUT (ВЫХОД). Поскольку функция setup () выполняется
только одинраз, мы переходим к основному циклу функции.
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
Функция loop () является основной функцией программы и вызывается постоянно, пока включен наш
Arduino. Каждый оператор в функции loop () (в фигурных скобках) выполняется один за другим, шаг за
шагом, пока не будет достигнута нижняя часть функции; затем Arduino снова запускает цикл в верхней
части функции и так до бесконечности, или до тех пор, пока вы не выключите Arduino или не нажмете
кнопку сброса.
В этом проекте мы хотим, чтобы светодиод включился, оставался включенным в течение одной
секунды, выключился и оставался выключенным в течение одной секунды, а затем процесс бы
повторился. Следовательно, команды, указывающие Arduino на выполнение этого действия,
содержатся в функции loop (), поскольку мы хотим, чтобы они повторялись снова и снова. Первое
утверждение
digitalWrite(ledPin, HIGH); // HIGH - высокий уровень
... записывает значение HIGH или LOW на цифровой вывод в операторе (в данном случае ledPin, который
является цифровым выводом 10). Когда вы устанавливаете цифровой вывод на HIGH, вы отправляете на
него 5 вольт. Когда вы устанавливаете его на LOW, вывод становится 0 вольт или землей. Таким образом,
этот оператор отправляет 5 В на цифровой вывод 10 и включает светодиод. После этого оператор
delay(1000);
... просто говорит Arduino подождать 1000 миллисекунд (в секунде 1000 миллисекунд) перед
выполнением следующего оператора, который
digitalWrite(ledPin, LOW);
... отключит питание, поступающее на цифровой контакт 10, и, следовательно, погасит светодиод.
Затем идет еще один оператор задержки еще на 1000 миллисекунд, а затем функция завершается. Однако,
поскольку это наша основная функция loop (), функция снова запустится с самого начала. Еще раз
проследив пошагово структуру программы, мы увидим, что она очень проста:
// Project 1 - LED Flasher
int ledPin = 10;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}

25

ГЛАВА 2 ■ Зажги их

Мы начинаем с присвоения переменной с именем ledPin значения 10. Затем мы переходим к функции setup (),
где просто устанавливаем режим для цифрового вывода 10 в качестве выхода. В основном программном
цикле выставляем на цифровой выводе 10 HIGH,т.е 5В. Затем мы ждем секунду, а затем отключаем 5 В на
выводе 10 с помощью LOW , прежде чем ждать еще секунду.
Затем цикл начинается снова с самого начала, и светодиод будет постоянно включаться и выключаться, пока
на Arduino есть питание.
Теперь, когда вы это знаете, вы можете изменить код, чтобы включить или выключить светодиод на другой
периоды времени. Например, если мы хотим, чтобы светодиод оставался включенным в течение двух
секунд, а затем погас на полсекунды, мы могли бы сделатьтак:
void loop() {
digitalWrite(ledPin,
HIGH);delay(2000);
digitalWrite(ledPin, LOW);
delay(500);
}
Возможно, вы хотите, чтобы светодиодный индикатор оставался выключенным в течение пяти секунд, а
затем кратковременно горел (250 мс), как светодиодный индикатор в автосигнализации; тогда вы могли бы
написать следующее :
void loop() {
digitalWrite(ledPin, HIGH);
delay(250);
digitalWrite(ledPin, LOW);
delay(5000);
}
Или сделать так, чтобы светодиодный индикатор мигал очень быстро.
void loop() {
digitalWrite(ledPin, HIGH);
delay(50);
digitalWrite(ledPin, LOW);
delay(50);
}
Изменяя время включения и выключения светодиода, вы можете создать любой желаемый эффект.
Прежде чем перейти к чему-то более интересному, давайте взглянем на наше устройство и посмотрим,
как оно работает.

26

ГЛАВА 2 ■ Зажги их

Проект 1 — LED мигалка – Обзор схемы
Компоненты для нашего проекта 1

Макетная плата

5mm LED
Резистор 100 Ом*

Перемычки

* от (100 до 270) Ом
Макетная плата представляет собой беспаечное устройство многоразового пользования, которое
обычно используется для создания прототипов электронной схемы или для экспериментов со схемами.
Плата состоит из ряда отверстий в виде сетки. Эти отверстия под платой соединены полосами
проводящего металла с зажимами. Эти полосы обычно расположены так, как показано на рис. 2-2.

Рис. 2-2. Так раскладываются металлические полосы в макетной плате
Цветные линии вдоль верхней и нижней части проходят параллельно плате и предназначены для
подключения к плюсу (красная) и минусу (синяя) вашего источника питания.

27

ГЛАВА 2 ■ Зажги их

Посередине макетной платы есть зазор, позволяющий разместить микросхему (см. Рисунок 2-3).

Рис. 2-3. Микросхема,установленная на макетной плате
Следующий компонент - резистор. Резистор - это компонент, которое вызывает сопротивление
электрическому току и, вызывает падение напряжения на его выводах. Вы можете представить резистор
как водопроводную трубу, которая намного тоньше, чем труба, подключенная к нему.
По мере того, как вода (электрический ток) попадает в резистор, труба становится тоньше, и поэтому ток,
выходящий с другого конца, уменьшается. Мы используем резисторы для уменьшения напряжения или
тока в электрической цепи.
Сопротивление измеряется в единицах, называемых Ом. Символом для обозначения Ом является
греческий символ омеги . В этом случае цифровой вывод 10 выдает 5 вольт постоянного тока при 40 мА
(миллиампер), в соответствии с таблицей данных Atmega, а для наших светодиодов требуется
напряжение 2 В и ток 35 мА, соответственно даташиту. Поэтому нам нужно использовать резистор,
который снизит 5 В до 2 В и ток с 40 мА до 35 мА, если мы хотим отображать светодиод с максимальной
яркостью.

■Примечание
Никогда не используйте резистор НИЖЕ рассчитанного значения. Вы

допустите слишком большой ток через светодиод и навсегда его повредите. Вы также
можете повредить другие части вашей схемы.
Формула для определения сопротивления резистора:
R = (VS – VL) / I
Где VS - напряжение питания, VL - напряжение свечения светодиода, а I - ток светодиода. Итак,
для нашего примера у нас есть светодиод с напряжением 2 вольта и током 35 мА
(миллиампер), подключенный к цифровому выводу от Arduino, который выдает 5 вольт;
следовательно, необходимое сопротивление резистора будет:
R = (5 – 2) / 0.035
что дает значение 85,71 Ом.
Резисторы бывают стандартных номиналов, и наиболее близкое номинальное значение составляет 100
Ом. Всегда выбирайте следующий резистор стандартного номинала, который больше необходимого.
При более низком значении, через резистор будет протекать слишком большой ток, и резистор и / или
связанные с ним компоненты могут быть повреждены. Итак, как нам найти резистор 100 Ом? Резистор
слишком мал, чтобы на нем можно было писать номинальное значение сопротивления, поэтому
используется цветовой код. На резисторе обычно находятся четыре цветные полосы, и с помощью
цветового кода в Таблице 2-2 вы можете узнать номинал резистора или какой цветовой код будет иметь
конкретное сопротивление.

28

ГЛАВА 2 ■ Зажги их

Таб. 2-2. Цветовые коды резисторов
Цвет

1 диапазон

2 диапазон

3 диапозон
множитель

4 диапозон
допуск

черный

0

0

х100=1

коричневый

1

1

x101

±1%

красный

2

2

x102

±2%

оранжевый

3

3

x103

желтый

4

4

x104

зеленый

5

5

x105

±0.5%

синий

6

6

x106

±0.25%

фиолетовый

7

7

x107

±0.1%

серый

8

8

x108

±0.05%

белый

9

9

x109

Золотой

x10-1

±5%

серебряный

x10-2

±10%

пустой

±20%

Нам нужен резистор 100 Ом, поэтому, если вы посмотрите таблицу цветовой кодировки, вы увидите, что
нам нужна 1 в первой полосе, которая является коричневой, за которой следует 0 в следующей полосе,
которая является черной, и затем нам нужно умножить это на 101 (другими словами, добавить 1 ноль), что
является коричневым в 3-й полосе. Последняя полоса указывает допуск резистора. Если у вашего
резистора золотая полоса, он имеет допуск ± 5%. Следовательно, если у вас есть светодиод, который
требует два вольта и 35 мА, вам понадобится резистор с коричневой, черной и коричневой
полосой.
.

Рис. 2-4. Резистор 10 кОт с допуском 5%
Если вам нужен резистор 10 кОм (или 10 000 Ом) (см. Рисунок 2-4), вам понадобится комбинация
коричневого, черного и оранжевого цветов (1, 0, 103). 103 - добавить три нуля. Если вам нужен резистор
570 кОм (570 000 Ом), цвета будут зелеными, фиолетовыми, желтыми - 4 нуля) и так далее. Итак, если
вы нашли этот резистор и захотели узнать, какое у него значение, чтобы вы могли хранить его в
хорошо помеченном ящике для хранения резисторов,вы можете посмотреть на таблицу.

29

ГЛАВА 2 ■ Зажги их

Последний компонент - это светодиод -LED, который расшифровывается как Light Emitting Diode
- диод, испускающий свет ...при пропускании через него электрического тока. Условное обозначение,
цоколевка представлены на рис.2.5.
Диод - это устройство, которое пропускает ток в одном направлении,так что LED также обладает этим
свойством.

Рис. 2.5
При подключении светодиода к МК возможны два следующих случая:
1) светодиод подключен катодом к микроконтроллеру (вариант 1);
2) светодиод подключен анодом к микроконтроллеру (вариант 2).
рассмотрим вариант 1

Для того чтобы светодиод начал излучать свет, необходимо создать разность потенциалов между анодом и
катодом. Анод подключен к положительному выводу источника питания (VCC). Т.о. когда вывод PA7
сбрасывается в «0», на нем образуется нулевой потенциал (GND) и через светодиод начинает протекать
ток. Если вывод PA7 = 1 (VCC), то разности потенциалов не будет – и светодиод не будет излучать свет.
Рассмотрим вариант 2:

Для того чтобы светодиод начал излучать свет, необходимо создать разность потенциалов между
анодом и катодом. Катод подключен к отрицательному выводу источника питания (GND). При
сравнении с предыдущей схемой становится ясно, что когда разряд PA7 сбрасывается в «0» –
светодиод не будет излучать свет, а когда PA7 = 1 - будет.

30

ГЛАВА 2 ■ Зажги их

Теперь, когда вы знаете, как работают компоненты и как работает код в этом проекте, давайте
попробуем кое-что поинтереснее.

Project 2 – S.O.S. Сообщение азбукой Морзе
Для этого проекта мы собираемся оставить ту же схему, что и в проекте 1, но будем использовать другой
код, чтобы светодиод отображал сообщение азбукой Морзе. В этом случае мы собираемся заставить
светодиод сигнализировать S.O.S., который является международным сигналом бедствия кодом Морзе.
Код Морзе - это тип кодировки символов, который передает буквы и цифры с использованием шаблонов
включения и выключения. Поэтому он хорошо подходит для нашей цифровой системы, поскольку мы
можем включать и выключать светодиод в нужном порядке, чтобы разобрать слово или серию символов.
В этом случае мы будем сигнализировать S.O.S., который в алфавите кода Морзе состоит из трех точек
(короткие вспышки), за которыми следуют три тире (длинные вспышки), а затем снова три точки.
Таким образом, теперь мы можем закодировать наш скетч так, чтобы светодиод включался и
выключался в этой примере, сигнализируя SOS.

Ввод кода
Листинг 2-2. Код для проекта 2
// подключение LED к цифровому пину 10
int ledPin = 10;
// запускаем один раз при запуске скетча
void setup()
{
// устанавливаем цифровой вывод как выход
pinMode(ledPin, OUTPUT);
}
// бегаем снова и снова
void loop()
{
// 3 точки
for (int x=0; x 1;

// ряд 1
// массив светодиодов (инвертированный)
// двоичное число строки
// фиксируем от низкого к высокому
// битовый сдвиг вправо

Помните из обзора устройства, что процедура мультиплексирования отображает только одну строку за
раз, выключает ее и затем отображает следующую строку. Это мерцание происходит на частоте 100 Гц, что
слишком быстро для человеческого глаза.
Итак, основная концепция здесь заключается в том, что у вас есть процедура прерывания, которая
выполняется каждые 100 долей секунды. В этой процедуре вы просто просматриваете содержимое
массива экранных буферов (в данном случае led []) и отображаете его на матричном модуле по одной
строке за раз, но делается это так быстро, что кажется, что все зажигается сразу.
Основной цикл программы - просто изменить содержимое массива экранных буферов, а все
остальное сделает ISR.
Анимация в этом проекте очень проста, но, манипулируя единицами и нулями в буфере, мы можем
заставить все, что угодно, от фигур до прокручиваемого текста, появиться на модуле точечной матрицы.
Давайте попробуем этот вариант в следующем проекте; мы создадим анимированный спрайт с
прокруткой.

136

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ
ДИСПЛЕИ

Проект 20 - Светодиодный точечно-матричный дисплей - Спрайт с прокруткой
Мы собираемся использовать ту же схему, но с небольшими изменениями в коде, чтобы создать
многокадровую анимацию, которая также прокручивается справа налево. При этом мы познакомимся с
понятиями многомерных массивов. Мы также узнаем о небольшом трюке, чтобы получить побитовое
вращение (или круговой сдвиг). Для начала мы будем использовать ту же схему, что и в Project 19.

Введите код
Введите и загрузите код из Листинга 7-2.
Листинг 7-2. Код для проекта 20
// Проект 20
#include
int latchPin = 8;
int clockPin = 12;
int dataPin = 11;
byte frame = 0;
byte led[8][8] = {

//Пин подключен к выводу 12 74HC595(Latch - защелка)
//Пин подключен к контакту 11 74HC595 (Clock - такты)
//Пин подключен к выводу 14 74HC595 (Data-данные)
// переменная для хранения текущего отображаемого кадра
{0, 56, 92, 158, 158, 130, 68, 56},
// 8 кадров анимации
{0,
{0,
{0,
{0,
{0,
{0,
{0,

56,
56,
56,
56,
56,
56,
56,

124, 186, 146, 130, 68, 56},
116, 242, 242, 130, 68, 56},
68, 226, 242, 226, 68, 56},
68, 130, 242, 242, 116, 56},
68, 130, 146, 186, 124, 56},
68, 130, 158, 158, 92, 56},
68, 142, 158, 142, 68, 56} };

void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);

}

// устанавливаем 3 цифровых пина на выходы

Timer1.initialize(10000);
// устанавливаем таймер длиной 10000 микросекунд
Timer1.attachInterrupt(screenUpdate);
// присоединяем функцию screenUpdate
void loop() {
for (int i=0; i7) { frame =0;}
// убедитесь, что мы вернулись к кадру 0 после 7
delay(100);
// ждем немного между кадрами
}

137

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ ДИСПЛЕИ

void screenUpdate() {
byte row = B10000000;
for (byte k = 0; k < 8; k++) {

// функция для вывода изображения
// ряд 1

shiftOut(dataPin, clockPin, LSBFIRST, led[frame][k] );
// массив светодиодов
shiftOut(dataPin, clockPin, LSBFIRST, ~row); // выбор строки (активный минимум)

}

// создаем переход от низкого к высокому на latchPin для передачи вывода на дисплей
digitalWrite(latchPin, LOW);
digitalWrite(latchPin, HIGH);
row = row >> 1;
// битовый сдвиг вправо

// выключаем все строки до следующего прерывания таймера, чтобы последняя строка не
оставалась дольше других
shiftOut(dataPin, clockPin, LSBFIRST, 0 ); // столбец не имеет значения со всеми строками
shiftOut(dataPin, clockPin, LSBFIRST, ~0);
// не выбираем строку
// создаем переход от низкого к высокому на latchPin для передачи вывода на дисплей
digitalWrite(latchPin, LOW);
digitalWrite(latchPin, HIGH);
}
Когда мы запустим Проект 20, мы увидим, как движется анимированное колесо. Схема не изменилась,
поэтому мы не будем её обсуждать. Посмотрим, как работает этот код.

Проект 20 - Светодиодная точечная матрица - Спрайт с прокруткой - Обзор кода
Мы снова загружаем библиотеку TimerOne и устанавливаем три пина, которые управляют регистрами сдвига:
#include
int latchPin = 8; //Pin connected to Pin 12 of 74HC595 (Latch)
int clockPin = 12; //Pin connected to Pin 11 of 74HC595 (Clock)
int dataPin = 11; //Pin connected to Pin 14 of 74HC595 (Data)
Затем мы объявляем переменную типа byte и инициализируем ее нулем. Это сохранит номер
текущего отображаемого кадра восьмикадровой анимации:
byte frame = 0;

// переменная для хранения текущего отображаемого кадра

Затем мы настраиваем двумерный массив типа byte:
byte led[8][8] = { {0, 56, 92, 158, 158, 130, 68, 56},
{0, 56, 124, 186, 146, 130, 68, 56},
{0, 56, 116, 242, 242, 130, 68, 56},
{0, 56, 68, 226, 242, 226, 68, 56},
{0, 56, 68, 130, 242, 242, 116, 56},
{0, 56, 68, 130, 146, 186, 124, 56},
{0, 56, 68, 130, 158, 158, 92, 56},
{0, 56, 68, 142, 158, 142, 68, 56} };

138

// 8 кадров анимации

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ
ДИСПЛЕИ

Массивы были представлены в главе 3. Массив - это набор переменных, доступ к которым
осуществляется с помощью номера индекса. Этот массив отличается тем, что в нем есть два
набора чисел для элементов. В главе 3 мы объявили одномерный массив следующим образом:
byte ledPin[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
Здесь нам нужно создать двумерный массив с двумя наборами индексных номеров. В этом случае наш
массив составляет 8 X 8 или всего 64 элемента. Двумерный массив почти такой же, как двумерная
таблица, поскольку мы можем получить доступ к одной ячейке, указав номер строки и столбца
соответственно. Таблица 7-3 показывает нам, как получить доступ к элементам в вашем массиве.
Таб. 7-3. Элементы внашем массиве
0

1

2

3

4

5

6

7

0

0

56

92

158

158

130

68

56

1

0

56

124

186

146

130

68

56

2

0

56

116

242

242

130

68

56

3

0

56

68

226

242

226

68

56

4

0

56

68

130

242

242

116

56

5

0

56

68

130

146

186

124

56

6

0

56

68

130

158

158

92

56

7

0

56

68

142

158

142

68

56

Строки представляют собой первое число индекса массива, то есть байт led [7] [..], а столбцы представляют
второе число индекса массива, то есть байт led [..] [7]. Чтобы получить доступ к числу 158 в 6-й строке и 4-м
столбце, мы должны использовать байт led [5] [3]. Помните, что индексы начинаются с 0.
Обратите внимание, что при объявлении массива мы воспользовались возможностью одновременно
инициализировать его данными.
Чтобы сделать это с двумерным массивом, мы помещаем все данные в фигурные скобки, а каждый
набор данных из второго индекса в свою фигурную скобку с запятой после нее, например:
byte led[8][8] = { {0, 56, 92, 158, 158, 130, 68, 56},
{0, 56, 124, 186, 146, 130, 68, 56},
{0, 56, 116, 242, 242, 130, 68, 56}, // и т.д.
Двумерный массив будет хранить восемь кадров вашей анимации. Первый индекс массива будет
ссылаться на кадр анимации, а второй индекс будет составлять из 8 строк 8-битных чисел схему
включения и выключения светодиодов. Для экономии места в коде числа преобразованы из двоичных в
десятичные. Если бы мы могли видеть двоичные числа,то увидели бы следующую анимацию на рис. 7-3.

Рис. 7-3. Анимация катящегося колеса

139

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ ДИСПЛЕИ

Конечно, мы можем изменить эту анимацию на все, что захотим, а также увеличить или уменьшить
количество кадров. Нарисуйте свою анимацию на миллиметровой бумаге, а затем преобразуйте строки в
8-битные двоичные числа и поместите их в свой массив.
В функции настройки мы снова устанавливаем три пина для вывода, создаем объект таймера
длиной 10000 микросекунд и присоединяем функцию screenUpdate () к прерыванию:
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);

}

// устанавливаем 3 цифровых пина на выходы

Timer1.initialize(10000);
// устанавливаем таймер длиной 10000 микросекунд
Timer1.attachInterrupt(screenUpdate); // присоединяем функцию screenUpdate

В основном цикле, как и в Project 19, мы просматриваем восемь строк спрайта. Однако этот цикл
находится внутри другого цикла, который повторяется восемь раз, и этот цикл контролирует, какой
кадр вы хотите отобразить:
void loop() {
for (int i=0; i (a - n);
где n - количество цифр, на которое мы хотим повернуть число, а a - длина в битах вашей исходной цифры.

140

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ
ДИСПЛЕИ

Затем мы увеличиваем значение кадра на единицу, проверяем, что оно не больше семи, и, если да, снова
устанавливаем нулевое значение. Оно будет циклически проходить через каждый из восьми кадров
анимации один за другим, пока мы не дойдем до конца кадров, а затем повторяем. Наконец, есть задержка
в100 миллисекунд.
frame++;
if (frame>7) { frame =0;}
delay(100);

// переходим к следующему кадру анимации
// убедитесь, что мы вернулись к кадру 0 после 7
// ждем немного между кадрами

Затем мы запускаем функции screenUpdate () и shiftOut, как и в предыдущих проектах на основе регистра
сдвига.
В следующем проекте мы снова будем использовать светодиодную матрицу, но на этот раз мы не
будем использовать регистры сдвига,а будем использовать популярный чип MAX7219.

Проект 21 - LED точечно-матричный дисплей - Прокручиваемое сообщение
Есть много разных способов управления светодиодами. Использование регистров сдвига - это один из
способов, и у них есть свои преимущества. Тем не менее, существует множество доступных ИС, которые
специально разработаны для управления светодиодными дисплеями и значительно облегчают нам жизнь.
Одна из самых популярных микросхем драйверов светодиодов в сообществе Arduino - это 8-разрядные
микросхемы драйвера светодиодных дисплеев MAX7219 с последовательным интерфейсом,
изготовленные компанией Maxim. Эти микросхемы предназначены для управления 7-сегментными
цифровыми светодиодными дисплеями до 8 цифр, гистограммами или матричными светодиодными
дисплеями 8 × 8, для чего мы и будем их использовать. IDE Arduino поставляется с библиотекой под
названием Matrix, а также с некоторыми примерами кода, специально написанными для микросхем
MAX7219. Использование этой библиотеки упростит использование этих микросхем. Однако в этом проекте
мы не собираемся использовать какие-либо внешние библиотеки.
Вместо этого мы поступим сложным образом и будем писать каждый фрагмент кода самостоятельно.
Таким образом, вы узнаете, как именно работает микросхема MAX7219, и сможемперенести эти навыки на
использование
любой другой микросхемы драйвера светодиода по нашему желанию.
.

Требуемые детали
Мы используем чип LED драйвер MAX7219. В качестве альтернативы можно использовать AS1107,
который в значительной степени идентичен MAX7219 и будет работать без изменений вашего кода или
схемы. Точечно-матричный дисплей 8x8 должен быть с ОК , поскольку мы выводим символы по одной
строке за раз на сегментных линиях,которые предназначены для управления анодами светодиодов. См.
полный список деталей в Таблице 7-4.
Таб. 7-4. Требуемые детали для проекта 21
Конденсатор 0,1 мФ
MAX7219 (или AS1107)
Резистор (39кОм)

Матричный дисплей 8 × 8 (ОК)

141

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ ДИСПЛЕИ

Подключение
Внимательно изучите схему соединении на рис. 7-4. Убедитесь, что ваш Arduino выключен при
подключении проводов. Соединения от MAX7219 к точечно-матричному дисплею на рис. 7-4 построены
для блока дисплея, который я использовал для создания этого проекта. Распиновка вашего дисплея
вполне может быть другой. Поэтому вместо того, чтобы полагаться на соединения, показанные на
Рисунке 7-4, подключите выводы, выходящие из MAX7219, к соответствующим выводам столбцов и строк
на вашем дисплее (см. Схему выводов в Таблице 7-5). Чтение по горизонтали покажет, какие два
устройства подключены и к каким контактам. На дисплее столбцы - это катоды, а строки - аноды. На моем
дисплее я обнаружил, что строка 1 находится внизу, а строка 8 - вверху. Возможно, вам придется изменить
порядок на вашем собственном дисплее, если вы обнаружите, что буквы перевернуты или
инвертированы. Подключите 5 В от Arduino к положительной шине макета, а землю к шине заземления.

Рис. 7-4. Схема для проекта 21

142

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ
ДИСПЛЕИ

Таб. 7-5. Распиновка между Arduino, IC и точечно-матричным дисплеем

Arduino

MAX7219

Digital 2

1 (DIN)

Digital 3

12 (LOAD)

Digital 4

13 (CLK)

Display

Other

4, 9

Gnd

19

+5v

18 (ISET)

Резистор с +5v

2 (DIG 0)

Столбец 1

11 (DIG 1)

Столбец 2

6 (DIG 2)

Столбец 3

7 (DIG 3)

Столбец 4

3 (DIG 4)

Столбец 5

10 (DIG 5)

Столбец 6

5 (DIG 6)

Столбец 7

8 (DIG 7)

Столбец 8

22 (SEG DP)

Ряд 1

14 (SEG A)

Ряд 2

16 (SEG B)

Ряд 3

20 (SEG C)

Ряд 4

23 (SEG D)

Ряд 5

21 (SEG E)

Ряд 6

15 (SEG F)

Ряд 7

17 (SEG G)

Ряд 8

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

Введите код
Введите и загрузите код из Листинга 7-3.
Листинг 7-3. Код для проекта 21
#include
#include
int DataPin = 2;
int LoadPin = 3;
int ClockPin = 4;
byte buffer[8];

// Пин 1 на MAX
// Пин 12 на MAX
// Пин 13 на MAX

143

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ ДИСПЛЕИ

#define
#define
#define
#define

SCAN_LIMIT_REG 0x0B
DECODE_MODE_REG 0x09
SHUTDOWN_REG 0x0C
INTENSITY_REG 0x0A

static byte font[][8] PROGMEM = {
// TТолько печатаемые символы ASCII (32-126)
{B00000000, B00000000, B00000000, B00000000, B00000000,
{B00000100, B00000100, B00000100, B00000100, B00000100,
{B00001010, B00001010, B00001010, B00000000, B00000000,
{B00000000, B00001010, B00011111, B00001010, B00011111,
{B00000111, B00001100, B00010100, B00001100, B00000110,
{B00011001, B00011010, B00000010, B00000100, B00000100,
{B00000110, B00001010, B00010010, B00010100, B00001001,
{B00000100, B00000100, B00000100, B00000000, B00000000,
{B00000010, B00000100, B00001000, B00001000, B00001000,
{B00001000, B00000100, B00000010, B00000010, B00000010,
{B00010101, B00001110, B00011111, B00001110, B00010101,
{B00000000, B00000000, B00000100, B00000100, B00011111,
{B00000000, B00000000, B00000000, B00000000, B00000000,
{B00000000, B00000000, B00000000, B00000000, B00001110,
{B00000000, B00000000, B00000000, B00000000, B00000000,
{B00000001, B00000010, B00000010, B00000100, B00000100,
{B00001110, B00010001, B00010011, B00010001, B00010101,
{B00000100, B00001100, B00010100, B00000100, B00000100,
{B00001110, B00010001, B00010001, B00000010, B00000100,
{B00001110, B00010001, B00000001, B00001110, B00000001,
{B00010000, B00010000, B00010100, B00010100, B00011111,
{B00011111, B00010000, B00010000, B00011110, B00000001,
{B00000111, B00001000, B00010000, B00011110, B00010001,
{B00011111, B00000001, B00000001, B00000001, B00000010,
{B00001110, B00010001, B00010001, B00001110, B00010001,
{B00001110, B00010001, B00010001, B00001111, B00000001,
{B00000000, B00000100, B00000100, B00000000, B00000000,
{B00000000, B00000100, B00000100, B00000000, B00000000,
{B00000001, B00000010, B00000100, B00001000, B00001000,
{B00000000, B00000000, B00000000, B00011110, B00000000,
{B00010000, B00001000, B00000100, B00000010, B00000010,
{B00001110, B00010001, B00010001, B00000010, B00000100,
{B00001110, B00010001, B00010001, B00010101, B00010101,
{B00001110, B00010001, B00010001, B00010001, B00011111,
{B00011110, B00010001, B00010001, B00011110, B00010001,
{B00000111, B00001000, B00010000, B00010000, B00010000,
{B00011100, B00010010, B00010001, B00010001, B00010001,
{B00011111, B00010000, B00010000, B00011110, B00010000,
{B00011111, B00010000, B00010000, B00011110, B00010000,
{B00001110, B00010001, B00010000, B00010000, B00010111,
{B00010001, B00010001, B00010001, B00011111, B00010001,
{B00011111, B00000100, B00000100, B00000100, B00000100,
{B00011111, B00000100, B00000100, B00000100, B00000100,
{B00010001, B00010010, B00010100, B00011000, B00010100,
{B00010000, B00010000, B00010000, B00010000, B00010000,

144

B00000000,
B00000100,
B00000000,
B00001010,
B00000101,
B00001000,
B00010110,
B00000000,
B00001000,
B00000010,
B00000000,
B00000100,
B00000110,
B00000000,
B00000000,
B00001000,
B00010001,
B00000100,
B00001000,
B00000001,
B00000100,
B00000001,
B00010001,
B00000100,
B00010001,
B00000001,
B00000100,
B00000100,
B00000100,
B00011110,
B00000100,
B00000100,
B00010001,
B00010001,
B00010001,
B00010000,
B00010001,
B00010000,
B00010000,
B00010001,
B00010001,
B00000100,
B00000100,
B00010010,
B00010000,

B00000000,
B00000000,
B00000000,
B00011111,
B00000110,
B00001011,
B00010110,
B00000000,
B00000100,
B00000100,
B00000000,
B00000100,
B00000100,
B00000000,
B00000000,
B00001000,
B00011001,
B00000100,
B00010000,
B00010001,
B00000100,
B00000001,
B00010001,
B00001000,
B00010001,
B00000001,
B00000100,
B00000100,
B00000010,
B00000000,
B00001000,
B00000000,
B00010001,
B00010001,
B00010001,
B00001000,
B00010010,
B00010000,
B00010000,
B00010001,
B00010001,
B00000100,
B00010100,
B00010001,
B00010000,

B00000000},
B00000100},
B00000000},
B00001010},
B00011100},
B00010011},
B00001001},
B00000000},
B00000010},
B00001000},
B00000000},
B00000000},
B00001000},
B00000000},
B00000100},
B00010000},
B00001110},
B00011111},
B00011111},
B00001110},
B00000100},
B00011110},
B00001110},
B00010000},
B00001110},
B00000001},
B00000000},
B00001000},
B00000001},
B00000000},
B00010000},
B00000100},
B00011110},
B00010001},
B00011110},
B00000111},
B00011100},
B00011111},
B00010000},
B00001110},
B00010001},
B00011111},
B00001000},
B00010001},
B00011111},

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ ДИСПЛЕИ

{B00010001,
{B00010001,
{B00001110,
{B00011110,
{B00001110,
{B00011110,
{B00001110,
{B00011111,
{B00010001,
{B00010001,
{B00010001,
{B00010001,
{B00010001,
{B00011111,
{B00001110,
{B00010000,
{B00001110,
{B00000100,
{B00000000,
{B00001000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000000,
{B00000010,
{B00000100,
{B00001000,
{B00000000,
};

B00011011,
B00011001,
B00010001,
B00010001,
B00010001,
B00010001,
B00010001,
B00000100,
B00010001,
B00010001,
B00010001,
B00010001,
B00010001,
B00000001,
B00001000,
B00001000,
B00000010,
B00001010,
B00000000,
B00000100,
B00000000,
B00010000,
B00000000,
B00000001,
B00000000,
B00000011,
B00001110,
B00010000,
B00000000,
B00000010,
B00010000,
B00010000,
B00000000,
B00000000,
B00000000,
B00011100,
B00001110,
B00000000,
B00000000,
B00010000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000000,
B00000100,
B00000100,
B00000100,
B00000000,

B00011111,
B00011001,
B00010001,
B00010001,
B00010001,
B00010001,
B00010000,
B00000100,
B00010001,
B00010001,
B00010001,
B00001010,
B00001010,
B00000010,
B00001000,
B00001000,
B00000010,
B00010001,
B00000000,
B00000000,
B00000000,
B00010000,
B00000000,
B00000001,
B00000000,
B00000100,
B00001010,
B00010000,
B00000100,
B00000000,
B00010000,
B00010000,
B00000000,
B00000000,
B00000000,
B00010010,
B00010010,
B00000000,
B00001110,
B00010000,
B00000000,
B00000000,
B00000000,
B00000000,
B00010001,
B00000000,
B00000100,
B00000100,
B00000100,
B00000000,

B00010101,
B00010101,
B00010001,
B00011110,
B00010001,
B00011110,
B00001000,
B00000100,
B00010001,
B00010001,
B00010001,
B00000100,
B00000100,
B00000100,
B00001000,
B00000100,
B00000010,
B00000000,
B00000000,
B00000000,
B00001110,
B00010000,
B00001110,
B00000001,
B00011100,
B00000100,
B00001010,
B00010000,
B00000000,
B00000010,
B00010100,
B00010000,
B00001010,
B00010100,
B00001100,
B00010010,
B00010010,
B00001010,
B00010000,
B00011100,
B00010010,
B00010001,
B00010001,
B00010001,
B00001010,
B00011111,
B00000100,
B00000100,
B00000100,
B00001010,

B00010001,
B00010101,
B00010001,
B00010000,
B00010001,
B00010100,
B00000110,
B00000100,
B00010001,
B00010001,
B00010001,
B00000100,
B00000100,
B00001000,
B00001000,
B00000100,
B00000010,
B00000000,
B00000000,
B00000000,
B00010010,
B00011100,
B00010000,
B00000111,
B00010010,
B00000110,
B00001110,
B00011100,
B00000100,
B00000010,
B00011000,
B00010000,
B00010101,
B00011010,
B00010010,
B00011100,
B00001110,
B00001100,
B00001000,
B00010000,
B00010010,
B00010001,
B00010001,
B00001010,
B00000100,
B00000010,
B00001000,
B00000100,
B00000010,
B00011110,

B00010001,
B00010011,
B00010001,
B00010000,
B00010101,
B00010010,
B00000001,
B00000100,
B00010001,
B00010001,
B00010101,
B00001010,
B00000100,
B00010000,
B00001000,
B00000010,
B00000010,
B00000000,
B00000000,
B00000000,
B00010010,
B00010010,
B00010000,
B00001001,
B00011110,
B00000100,
B00000010,
B00010010,
B00000100,
B00000010,
B00011000,
B00010000,
B00010001,
B00010010,
B00010010,
B00010000,
B00000010,
B00001000,
B00000100,
B00010000,
B00010010,
B00010001,
B00010001,
B00000100,
B00001000,
B00000100,
B00000100,
B00000100,
B00000100,
B00010100,

B00010001,
B00010011,
B00010001,
B00010000,
B00010011,
B00010001,
B00010001,
B00000100,
B00010001,
B00001010,
B00010101,
B00010001,
B00000100,
B00010000,
B00001000,
B00000010,
B00000010,
B00000000,
B00000000,
B00000000,
B00010010,
B00010010,
B00010000,
B00001001,
B00010000,
B00000100,
B00000010,
B00010010,
B00000100,
B00000010,
B00010100,
B00010000,
B00010001,
B00010010,
B00010010,
B00010000,
B00000010,
B00001000,
B00000010,
B00010000,
B00010010,
B00001010,
B00010101,
B00001010,
B00001000,
B00001000,
B00000100,
B00000100,
B00000100,
B00000000,

B00010001},
B00010001},
B00001110},
B00010000},
B00001111},
B00010001},
B00001110},
B00000100},
B00001110},
B00000100},
B00001010},
B00010001},
B00000100},
B00011111},
B00001110},
B00000001},
B00001110},
B00000000},
B00011111},
B00000000},
B00001111},
B00011100},
B00001110},
B00000111},
B00001110},
B00000100},
B00001100},
B00010010},
B00000100},
B00001100},
B00010000},
B00001100},
B00010001},
B00010010},
B00001100},
B00010000},
B00000001},
B00001000},
B00011110},
B00001100},
B00001100},
B00000100},
B00001010},
B00010001},
B00010000},
B00011111},
B00000010},
B00000100},
B00001000},
B00000000}

145

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ ДИСПЛЕИ

void clearDisplay() {
for (byte x=0; x (counter + rate)) {
Char1 = constrain(myString[chrIndex],32,126);
Char2 = constrain(myString[chrIndex+1],32,126);
for (byte y= 0; y 6) {
scrollBit = 0;
chrIndex++;
}
counter = millis();
}
}
}
void screenUpdate() {
for (byte row = 0; row < 8; row++) {
writeData(row+1, buffer[row]);
}
}
void setup() {
initMAX7219();
Timer1.initialize(10000); // инициализируем timer1 и устанавливаем период прерывания
Timer1.attachInterrupt(screenUpdate);
Serial.begin(9600);
}
void loop() {
clearDisplay();
scroll("
BEGINNING ARDUINO
", 45);
scroll("
ГЛАВА 7 - LСВЕТОДИОДНЫЕ
ДИСПЛЕИ ", 45);scroll("
HELLO
} WORLD!!! :)
", 45);
Когда вы загрузите код, вы увидите сообщение, прокручиваемое по дисплею. Конечно, вы можете
изменить текст в функции цикла на свой собственный.

Проект 21 - Светодиодная точечная матрица - Прокручиваемое
сообщение - Обзор устройства
Опять же, чтобы упростить понимание кода, вам нужно сначала узнать, как работает микросхема
MAX7219.
MAX7219 работает очень похоже на регистры сдвига в том, что вы должны вводить данные
последовательно, бит за битом. Одновременно в устройство должно быть загружено всего 16 бит. Чип
прост в использовании и использует всего три вывода от Arduino. Цифровой вывод 2 Arduino
подключается к выводу 1 на MAX, который является входом данных. Цифровой вывод 3 подключен к
выводу 12 на MAX, что является НАГРУЗКОЙ, и, наконец, цифровой вывод 4 подключен к выводу 13 на
MAX, который является тактовым. См. Рис. 7-5, на котором показана распиновка MAX7219.

147

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ ДИСПЛЕИ

Рис. 7-5. Распиновка MAX7219
На выводе LOAD устанавливается низкий уровень, и первый бит данных устанавливается как HIGH или
LOW на выводе DIN. Вывод CLK настроен на частоту между LOW и HIGH с помощью Arduino. По
нарастающему фронту тактового импульса бит на выводе DIN сдвигается во внутренний регистр. Затем
тактовый импульс падает до LOW, и следующий бит данных устанавливается на выводе DIN до того, как
процесс повторится. После того, как все 16 бит данных были помещены в регистр по мере того, как тактовая
частота изменяется 16 раз, вывод LOAD, наконец, устанавливается на HIGH, и это фиксирует данные в
регистре. На рис. 7-6 представлена временная диаграмма из таблицы данных MAX7219, на которой
показано, как нужно манипулировать тремя выводми, чтобы отправлять биты данных с D0 на D15
в устройство.
Вывод DOUT, который является выводом 24, в этом проекте не используется. Но если у вас было несколько
последовательно соединенных между собой микросхем MAX7219, DOUT первой микросхемы подключается
к DIN второй и так далее. Данные синхронизируются с вывода DOUT на заднем фронте тактового цикла.

Рис. 7-6. Временная диаграмма MAX7219

148

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ
ДИСПЛЕИ

Вам необходимо воссоздать эту временную последовательность в своем коде, чтобы иметь возможность
отправлять соответствующие коды на чип.
Чип может обеспечивать ток до 100 мА, что более чем достаточно для большинства матричных дисплеев.
Устройство принимает данные в виде 16-битных пакетов (или команд). D15 или старший бит (старший бит)
отправляется первым, поэтому порядок идет от D15 до D0. Первые 4 бита - это биты «безразлично», то
есть они не используются ИС, поэтому могут быть любыми. Следующие 4 бита составляют адрес регистра,
а последние 8 бит составляют данные. В таблице 7-6 показан формат последовательных данных, а в
таблице 7-7 показанакарта адресов регистров.
Таб. 7-6. Формат последовательных данных (16 бит) MAX7219

D15

D14

D13

D12

X

X

X

X

D11

D10

D9

D8

ADDRESS

D7

D6

MSB

D5

D4

D3

D2

D1

D0
LSB

DATA
X
X
X
X
X
X
X

Таб. 7-7. Карта адресов регистров MAX7219

REGISTER
D15-D12

D11

No-Op

X

0

Digit 0

X

Digit 1

ADDRESS
D10

HEX CODE
D9

D8

0

0

0

0xX0

0

0

0

1

0xX1

X

0

0

1

0

0xX2

Digit 2

X

0

0

1

1

0xX3

Digit 3

X

0

1

0

0

0xX4

Digit 4

X

0

1

0

1

0xX5

Digit 5

X

0

1

1

0

0xX6

Digit 6

X

0

1

1

1

0xX7

Digit 7

X

1

0

0

0

0xX8

Decode Mode

X

1

0

0

1

0xX9

Intensity

X

1

0

1

0

0xXA

Scan Limit

X

1

0

1

1

0xXB

Shutdown

X

1

1

0

0

0xXC

Display Test

X

1

1

1

1

0xXF

149

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ ДИСПЛЕИ

Например, как вы можете видеть из карты адресов регистров в Таблице 7-7, адрес регистра интенсивности
- 1010 двоичный. Регистр интенсивности устанавливает яркость дисплея со значениями от самого тусклого
(0) до самого яркого (15) (от B000 до B1111). Чтобы установить интенсивность на 15 (максимум), вы должны
отправить следующие 16 бит, причем старший бит (крайний левый) будет отправлен первым, а младший
значащий бит (бит в крайнем правом углу) будет отправлен последним:
0000101000001111
Вторые 8 бит - это данные, отправляемые в регистр интенсивности. Первые 4 бита регистра
интенсивности снова равны «безразлично», поэтому вы отправляете B0000. Следующие 4 бита
определяют интенсивность. В этом случае вам нужна максимальная интенсивность, равная B1111.
Отправляя эти 16 бит на устройство, вы устанавливаете максимальную яркость дисплея.
Полное 16-битное значение, которое вы хотите отправить, - это B0000101000001111, так как оно
отправляется первым (старший значащий бит), а последним - LSB (младший бит).
Другой адрес, который вы будете использовать, - это ограничение на сканирование. Помните, что
MAX7219 разработан для работы с 7-сегментными светодиодными дисплеями (см. Рисунок 7-7).

Рис. 7-7. 7-сегментный светодиодный дисплей
Предел сканирования определяет, сколько из 8 цифр должно высветиться. В вашем случае мы
используем не 7-сегментные дисплеи, а точечно-матричные дисплеи 8 × 8. Мы используем все 8-значные
строки (0..7), управляющие нашим дисплеем, поэтому мы устанавливаем регистр ограничения
сканирования на B00000111 (управляющие цифры 0..7).
Регистр режима декодирования имеет значение только при использовании 7-сегментных дисплеев,
поэтому для отключения декодирования он будет установлен на B00000000.
Наконец, мы установим регистр выключения на B00000001, чтобы убедиться, что он находится в
нормальном режиме работы, а не в режиме выключения. Если вы установите регистр выключения на
B00000000, тогда все источники тока будут заземлены, что затем погасит дисплей.
Для получения дополнительной информации об микросхеме MAX7219 прочтите техническое описание.
Просто прочтите те части таблицы, которые имеют отношение к вашему проекту, и вы увидите, что это
намного проще для понимания, чем кажется на первый взгляд.
Теперь, когда вы (надеюсь) понимаете, как работает MAX7219, давайте взглянем на код и посмотрим, как
заставить его отображать прокручиваемый текст.

150

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ
ДИСПЛЕИ

Проект 21 - LED точечная матрица - Прокручиваемое сообщение Обзор кода
Первое, что мы делаем в начале скетча, это загружаем две библиотеки, которые вы будете использовать в коде:
#include
#include
Первая библиотека - это утилиты pgmspace или программное пространство. Функции этой библиотеки
позволяют вашей программе получать доступ к данным, хранящимся в программном пространстве или
флэш-памяти. Arduino с чипом ATmega328 имеет 32 КБ флеш-памяти (2 КБ из них используются загрузчиком,
поэтому доступно 30 КБ). Arduino Mega имеет 128 КБ флеш-памяти,4 КБ из которых используется
загрузчиком. Пространство программы - это именно то пространство, в котором будет храниться ваша
программа. Вы можете использовать свободное неиспользуемое пространство во флэш-памяти с помощью
утилит Program Space (программное пространство). Здесь вы будете хранить чрезвычайно большой
2D-массив, который будет содержать шрифт для ваших символов.
Вторая библиотека - это библиотека TimerOne, которая впервые была использована в Project 19. Затем
объявляются три цифровых вывода, которые будут взаимодействовать с MAX7219:
int DataPin = 2; // Вывод 1 на MAX
int LoadPin = 3; // Вывод 12 на MAX
int ClockPin = 4; // Вывод 13 на MAX
Затем вы создаете массив типа buffer с 8 элементами:
byte buffer[8];
В этом массиве будет храниться набор битов, который будет определять, какие светодиоды включены
или выключены, когда дисплей активен.Затем мы определяем 4 адреса в микросхеме MAX7219, которые
мы будем использовать позже в коде.
#define
#define
#define
#define

SCAN_LIMIT_REG 0x0B
DECODE_MODE_REG 0x09
SHUTDOWN_REG 0x0C
INTENSITY_REG 0x0A

Далее идет большой 2D-массив типа byte:
static byte font[][8] PROGMEM = {
//Только печатаемые символы ASCII (32-126)
{B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000},
{B00000100, B00000100, B00000100, B00000100, B00000100, B00000100, B00000000, B00000100},
..etc
В этом массиве хранится набор битов, составляющих шрифт, который вы будете использовать для отображения
текста на дисплее. Это двумерный массив типа static byte. Мы также добавили после объявления массива команду
PROGMEM.
Это атрибут из утилит Program Space, который сообщает компилятору хранить этот массив во флэш-памяти вместо
SRAM (статическая память с произвольным доступом).
SRAM - это пространство памяти на микросхеме ATmega, которое обычно используется для хранения переменных и
символьных строк, используемых в вашем скетче. При использовании они копируются из программного пространства
и в SRAM. Однако массив, используемый для хранения шрифта, состоит из 96 символов, состоящих из восьми
байтовкаждый. Массив состоит из 95 x 8 элементов, что составляет всего 760 элементов, и каждый элемент
представляет собой байт (8 бит). Таким образом, шрифт занимает всего 760 байт. ATmega328 имеет всего 2 КБ,или
примерно 2000 байт памяти для переменных. Как только вы добавите к этому другие переменные и текстовые
строки, используемыев программе, вы рискуете быстро исчерпать память.
Arduino не может предупредить вас о нехватке памяти. Вместо этого он просто вылетает. Чтобы этого не произошло,
мы сохраняем этот массив во флеш-памяти вместо SRAM, так как в нем гораздо больше места, с которым мы
можете работать. Размер скетча составляет около 2800 байт, а размер массива чуть меньше 800 байт, поэтому мы
использовали около 3,6 КБ из 30 КБ флеш-памяти, доступной вам.

151

ГЛАВА 7 ■ СВЕТОДИОДНЫЕ ДИСПЛЕИ

Затем мы начинаем создавать различные функции, которые потребуются для программы. Первая просто
очистит дисплей. Какие бы биты ни были сохранены в массиве буферов, они будут отображаться в
матрице. Функция clearDisplay () просто циклически перебирает все восемь элементов массива и
устанавливает их значения на ноль, чтобы светодиоды не горели, а дисплей оставался пустым. Затем она
вызывает функцию screenUpdate (), которая отображает шаблон, хранящийся в массиве buffer [] на
матрице. В этом случае, поскольку буфер не содержит ничего, кроме нулей, ничего не будет
отображаться.
void clearDisplay() {
for (byte x=0; x");
delay(time);
client.println("To: < fred@crunchytoad.com >");
delay(time);
client.print("SUBJECT: ");
client.println(subject);
delay(time);
client.println();
delay(time);
client.println(message1);
delay(time);
client.println(message2);
delay(time);
client.print("Temperature: ");
client.println(temp);
delay(time);
client.println(".");
delay(time);
client.println("QUIT");
delay(time);
Serial.println("Email sent.");
lastMessage=millis();
} else {
Serial.println("connection failed");
}
}
void checkEmail() {
while (client.available()) {
char c = client.read();
Serial.print(c);
}
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
}
// функция для получения температуры устройства
void getTemperature(DeviceAddress deviceAddress)
{
tempC = sensors.getTempC(deviceAddress);
tempF = DallasTemperature::toFahrenheit(tempC);
}

362

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

void setup()
{
lastMessage = 0;
Ethernet.begin(mac, ip);
Serial.begin(9600);
// Запускаем библиотеку датчиков
sensors.begin();
// устанавливаем разрешение
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
delay(1000);
}
void loop()
{
sensors.requestTemperatures();
getTemperature(insideThermometer);
Serial.println(tempC);
if (tempC >= HighThreshold && (millis()>(lastMessage+(emailInterval*1000)))) {
Serial.println("High Threshhold Exceeded");
char message1[] = "Temperature Sensor\0";
char message2[] = "High Threshold Exceeded\0";
sendEmail(subject, message1, message2, tempC);
}
else if (tempC(lastMessage+(emailInterval*1000)))) {
Serial.println("Low Threshhold Exceeded");
char message1[] = "Temperature Sensor\0";
char message2[] = "Low Threshold Exceeded\0";
sendEmail(subject, message1, message2, tempC);
}
if (client.available()) {checkEmail();}
}
Загрузите код, а затем откройте окно монитора последовательного порта (МПП). МПП будет
повторно отображатьтемпературу с первого датчика. Если температура упадет ниже значения
нижнего порога, МПП отобразит«Low Threshold Exceeded -Превышен нижний порог», а затем
отправит соответствующее предупреждение по электронной почте.
Если температура превысит верхний порог, отобразится сообщение «High Threshold Exceeded Превышен верхний порог» и будет отправлено соответствующее предупреждение.
Мы можем проверить это, установив верхний порог чуть выше температуры окружающей среды, а
затем подогревая датчик, пока температура не поднимется выше порогового значения. Это приведет
в действие систему оповещения.
Обратите внимание, что в течение первых 60 секунд система игнорирует любые ситуации с
предупреждением о температуре. Она начнет отправлять оповещения только по прошествии 60 секунд.
Если пороговые значения были превышены, система предупреждений будет продолжать отправлять
электронные письма до тех пор, пока температура не упадет до приемлемого уровня. Электронные письма
будут отправляться каждый интервал электронной почты в секундах, когда превышены пороговые
значения. Мы можете настроить этот интервал по своему усмотрению.
После того, как электронное письмо будет отправлено, система будет ждать, пока от клиента не будет
получена успешная квитанция, а затем отобразит ответ. Вы можете использовать эти данные для отладки
системы, если что-то пойдет не так, как планировалось.

363

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Проект 48 - Система оповещений по электронной почте - Обзор кода
Во-первых, библиотеки подключены:
#include
#include
#include
#include






Затем мы обеспечиваем задержку в миллисекундах при отправке данных на сервер.
#define time 1000
За этим определением следует время в секундах между отправкой каждого электронного письма.
#define emailInterval 60
Затем нам нужно установить высокий и низкий уровни температуры, которые вызовут предупреждение:
#define HighThreshold 40 // Максимально допустимая температура
#define LowThreshold 10 // Самая низкая температура
Затем вы устанавливаете пин и точность для датчиков.
#define ONE_WIRE_BUS 3
#define TEMPERATURE_PRECISION 12
Объявляем числа с плавающей запятой для хранения температуры,
float tempC, tempF;
затем пара массивов символов, которые сохранят сообщение в электронной почте
char message1[35], message2[35];
Создайте еще один массив символов для хранения темы электронного письма. Это объявлено
и инициализировано:
char subject[] = "ARDUINO: TEMPERATURE ALERT!!\0";
Поскольку вы не хотите бомбардировать пользователя сообщениями электронной почты после
превышения пороговых значений, нам необходимо сохранить время, когда было отправлено последнее
электронное письмо. Это будет сохранено в беззнаковом целом числе с именем lastMessage:
unsigned long lastMessage;
Экземпляры для датчика настраиваются вместе с адресом датчика:
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 0x10, 0x7A, 0x3B, 0xA9, 0x01, 0x08, 0x00, 0xBF };

364

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Определены MAC и IP-адрес Ethernet Shield. Обратите внимание, что MAC-адрес должен быть
уникальным номером, чтобы отличать устройство от миллиардов других подключенных к Интернету
устройств в мире. Обычно достаточно генерации случайного адреса. Обратите внимание, что
невозможно подключиться к устройству из-за пределов своей домашней сети без дополнительных
настроек сети:
byte mac[] = { 0x64, 0xB9, 0xE8, 0xC3, 0xC7, 0xE2 };
byte ip[] = { 192,168,0, 105 };
Затем мы устанавливаем IP-адрес своего почтового SMTP-сервера. Его необходимо изменить на наш
собственный IP-адрес, иначе код не будет работать.
byte server[] = { 10, 234, 219, 95 };
Создается экземпляр клиента, которому присваивается имя.
EthernetClient client
Затем идет первая из наших собственных функций. Она выполняет работу по отправке электронной почты
на сервер. Для функции требуются четыре параметра: тема электронного письма, первая строка
сообщения, вторая строка сообщения и, наконец, температура.
void sendEmail(char subject[], char message1[], char message2[], float temp) {
Пользователю сообщается, что мы пытаемся подключиться:
Serial.println("connecting...");
Затем мы проверяем, подключился ли клиент. Если это так, выполняется код в блоке if. Для функции
connect () также требуются IP-адрес и порт сервера. Это адрес и порт нашего почтового SMTP-сервера.
Изменим IP-адрес и порт в соответствии с нашими требованиями.
if (client.connect(server, 25)) {
Сначала пользователю сообщается, что вы подключились к клиенту. В данном случае
клиентом является SMTP-сервер вашей электронной почты.
Serial.println("connected");
Теперь вы отправляете команды на сервер почти так же, как в Project 46. Во-первых, вы должны
представиться SMTP-серверу. Это делается с помощью команды EHLO и сведений о сервере. После
каждой команды вы должны подождать некоторое время, чтобы команда могла быть обработана. Я
обнаружил, что для моего сервера требуется 1000 миллисекунд; вам может потребоваться увеличить или
уменьшить это число.
client.println("EHLO MYSERVER");

delay(time); // авторизоваться

Это похоже на процедуру «рукопожатия» между сервером и клиентом, в которой они представляются
друг другу. Далее нам необходимо авторизовать соединение. Если наш SMTP-сервер не требует
авторизации, мы можем закомментировать эту строку, а также строки имени пользователя и пароля.
client.println("AUTH LOGIN"); delay(time); // разрешить

365

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Иногда серверу требуется незашифрованный логин, и в этом случае мы должны отправить AUTH
PLAIN, а также имя пользователя и пароль в виде обычного текста.
Затем на сервер должны быть отправлены зашифрованные Base-64 имя пользователя и пароль:
client.println("lcbWNybbWl2JttnRzLmNvrZSbQ=="); delay(time);
client.println("GV0yVGbjLlnZ2VEw"); delay(time);
Затем нам нужно сообщить серверу, от кого идет почта и кому она будет отправляться:
client.println("MAIL FROM:");
delay(time);
client.println("RCPT TO:");
delay(time);
Их необходимо изменить на наш собственный адрес электронной почты и адрес получателя.
Большинство серверов SMTP позволяют отправлять электронную почту только с адреса электронной
почты изсобственного домена (например, вы не можете отправлять электронную почту из учетной записи
Hotmail спомощью сервера Yahoo).
Затем идет команда DATA, которая сообщает серверу, что дальше идут данные электронной почты, то
есть материал, который будет виден получателю.
client.println("DATA");

delay(time);

Вы хотите, чтобы получатель видел, кому и от кого отправлено электронное письмо, чтобы они снова
были включены для удобства получателя.
client.println("From: < sales@earthshineelectronics.com >");
delay(time);
client.println("To: < fred@crunchytoad.com >");
delay(time);
Затем мы отправляем тему электронного письма. Это слово «SUBJECT:», за которым следует тема,
переданная в функцию:
client.print("SUBJECT: ");
client.println(subject);

delay(time);

Перед телом сообщения электронной почты необходимо отправить пустую строку, чтобы отделить
ее от заголовков.
client.println();

delay(time);

Далее следуют две строки сообщения, переданного функции.
client.println(message1);
client.println(message2);

delay(time);
delay(time);

Затем мы включаем температуру:
client.print("Temperature: ");
client.println(temp);
delay(time);
Все электронные письма должны заканчиваться точкой в отдельной строке, чтобы сообщить серверу, что
мы закончили:
client.println(".");

delay(time);

Затем мы отправляем команду QUIT для отключения от сервера:
client.println("QUIT");

366

delay(time);

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Наконец, пользователю сообщается, что электронное письмо (e-mail) было отправлено:
Serial.println("Email sent.");
Затем мы сохраняем текущее значение millis () в lastMessage, так как вы будете использовать его позже,
чтобы увидеть, прошел ли указанный интервал между отправками сообщений.
lastMessage=millis();
Если соединение с клиентом не было успешным, электронное письмо не отправляется, а пользователь
сообщает:
} else {
Serial.println("connection failed");
}
Затем идет функция для чтения ответа от клиента:
void checkEmail() { // смотрим, доступны ли какие-либо данные от клиента
Пока данные доступны для считывания с клиента
while (client.available()) {
Код сохраняет этот байт в переменной c
char c = client.read();
затем выводит содержимое переменной c в окно МПП
Serial.print(c);
Если клиент НЕ подключен:
if (!client.connected()) {
пользователь информируется, система отключается, а подключенный клиент останавливается.
Serial.println();
Serial.println("disconnecting.");
client.stop();
Далее следует функция, которую вы использовали ранее для получения температуры от
однопроводного датчика.
void getTemperature(DeviceAddress deviceAddress)
{
tempC = sensors.getTempC(deviceAddress);
tempF = DallasTemperature::toFahrenheit(tempC);
}

367

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

затем следует процедура настройки, которая просто настраивает Ethernet и датчики.
void setup()
{
Ethernet.begin(mac, ip);
Serial.begin(9600);
// Запускаем библиотеку датчиков
sensors.begin();
// устанавливаем разрешение
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
delay(1000);
}
Наконец, главный цикл программы:
void loop()
Вы начинаете с запроса температуры из библиотеки DallasTemperature.
sensors.requestTemperatures();
затем вызовите функцию getTemperature, передав ей адрес датчика
getTemperature(insideThermometer);
который затем отображается в окне МПП.
Serial.println(tempC);
Затем вы проверяете эту температуру, чтобы увидеть, достигла ли она вашего верхнего порога или
превышает ее. Если да, то будет отправлено соответствующее электронное письмо. Однако вы хотите
отправлять только одно электронное письмо каждые (emailInterval * 1000) секунд, поэтому проверьте также,
что значение millis () больше, чем время последней отправки сообщения электронной почты (lastMessage)
плюс интервал времени.Если true, код выполняется.
if (tempC >= HighThreshold && (millis()>(lastMessage+(emailInterval*1000)))) {
Пользователь информируется, а затем отправляются две строки, составляющие сообщение электронной
почты:
Serial.println("High Threshhold Exceeded");
char message1[] = "Temperature Sensor\0";
char message2[] = "High Threshold Exceeded\0";
Затем вызывается функция sendEmail, передающая ей параметры, составляющие тему, первую и вторую
строку сообщения и текущую температуру:
sendEmail(subject, message1, message2, tempC);

368

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Если порог высокой температуры не был достигнут, мы проверяем, не упала ли она ниже порога низкой
температуры. Если да, выполняем ту же процедуру с соответствующим сообщением.
else if (tempC(lastMessage+(emailInterval*1000))))
Serial.println("Low Threshhold Exceeded");
char message1[] = "Temperature Sensor\0";
char message2[] = "Low Threshold Exceeded\0";
sendEmail(subject, message1, message2, tempC);
}
Наконец, мы проверяем, есть ли какие-либо данные, готовые к получению от клиента (после отправки
электронного письма), и отображаем результаты:
if (client.available()) {checkEmail();}
Эти данные полезны для целей отладки.
Этот проект дал вам базовые знания по отправке электронной почты из Arduino с Ethernet Shield. Вы
можете использовать это для отправки предупреждений или отчетов, когда произошло какое-либо
действие, например, было обнаружено, что человек входит в комнату или был открыт ящик. Система также
может выполнять другие действия, например, открывать окно, если температура в комнате становится
слишком высокой, или пополнять аквариум, если уровень воды падает слишком низко.
Далее вы узнаете, как отправлять данные из Arduino в Twitter.

Проект 49 - Twitterbot
Мы снова будем использовать схему с двумя датчиками температуры. На этот раз мы будем регулярно
отправлять обновления о состоянии двух датчиков в Twitter. Это даст нам простую систему для
проверки состояния любых датчиков, которые мы подключили к Arduino.
Twitter - это служба микроблогов, которая позволяет отправлять миниатюрные сообщения в блоге или
«твиты» длиной до 140 символов. Твиты общедоступны для всех, кто выполняет поиск, или для тех, кто
подписался на ваш блог. Twitter невероятно популярен, и к нему можно получить доступ из любого
веб-браузера или из одного из множества доступных клиентов Twitter, включая приложения для мобильных
телефонов. Это делает его идеальным для отправки простых коротких фрагментов информации, которые
вы можете проверить в пути.
Вам нужно будет перейти на Twitter.com и создать новую учетную запись. Я рекомендую создать учетную
запись только для твитов с вашего Arduino.
По состоянию на 31 августа 2010 г. Twitter изменил свою политику в отношении сторонних приложений,
получающих доступ к веб-сайту. Сейчас используется метод аутентификации, известный как OAuth, что
очень затрудняет отправку твитов непосредственно с Arduino; до этого изменения это был простой
процесс. На данный момент твитнуть можно только через третье лицо. Другими словами, вы отправляете
твит на веб-сайт или прокси-сервер, который будет твитнуть от вашего имени, используя токен OAuth (код
авторизации). Текущий Твиттербиблиотека использует этот метод.
После того, как вы настроите свою учетную запись Twitter (или воспользуетесь существующей), введите
приведенный ниже код.

Введите код
Перед загрузкой кода нам понадобится токен для учетной записи Twitter. Используемая нами библиотека
была создана NeoCat и использует его веб-сайт в качестве прокси для отправки твита. Это означает, что мы
должны сначала получить токен, который представляет собой зашифрованную версию нашего имени
пользователя и пароля, чтобы получить доступ к веб-сайту Twitter. Для этого посетите веб-сайт NeoCat по
адресуhttp://arduino-tweet.appspot.com и щелкнем ссылку «Шаг 1», чтобы получить токен. Скопируйте и
вставьте это в раздел токенов кода.

369

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Обратите внимание, что, поскольку вы используете прокси-сервер и должны указать свое имя
пользователя и пароль в Твиттере для получения токена, рекомендуется создать новую учетную запись
в Твиттере и сохранить ее анонимность (т. е. не добавлять имена или адреса электронной почты в
профиль Twitter этой учетной записи). Я считаю, что при желании можно безопасно использовать
библиотеку со своей учетной записью, но лучше перестраховаться.
Затем щелкните ссылку «Шаг 2» и получите два набора библиотек, на которых основан код: и
.Установите их в папку с библиотеками IDE Arduino. Вам нужно будет перезапустить среду IDE,
прежде чем вы сможете их использовать. В библиотеке Twitter также есть несколько примеров, которые вы
можете попробовать. Если вы хотите узнать больше о библиотеке Twitter, вы можете найти ее на игровой
площадке Arduino по адресу www.arduino.cc/playground/Code/TwitterLibrary.
После установки вашего токена и библиотек введите и загрузите код из Листинга 17-4.
Listing 17-4. Код для проекта 49
#include
#include
#include
#include
#include







// Провод данных подключен к контакту 3 на Arduino
#define ONE_WIRE_BUS 3
#define TEMPERATURE_PRECISION 12
float itempC, itempF, etempC, etempF;
boolean firstTweet = true;
// Настраиваем экземпляр oneWire для связи с любыми устройствами OneWire
OneWire oneWire(ONE_WIRE_BUS);
// Передаем нашу ссылку oneWire в Dallas Temperature.
DallasTemperature sensors(&oneWire);
// массивы для хранения адресов устройств
DeviceAddress insideThermometer = { 0x28, 0x44, 0x12, 0xC2, 0x03, 0x00, 0x00, 0x92 };
DeviceAddress outsideThermometer = { 0x28, 0xA5, 0x02, 0xC2, 0x03, 0x00, 0x00, 0xF0 };byte
mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0xF7, 0x38 };
// Ваш токен для твита (получите его на http://arduino-tweet.appspot.com/)
Twitter twitter("19735326-neITsUBnLTZHgN9UGaRkcGvAe9vYuaRP7E55K26J"); // DuinoBot
unsigned long interval = 600000; // 10 минут
unsigned long lastTime; // время с момента последнего твита
// Сообщение для публикации
char message[140], serialString[60];

370

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

// функция для получения температуры для устройства
void getTemperatures()
{
itempC = sensors.getTempC(insideThermometer);
itempF = DallasTemperature::toFahrenheit(itempC);
etempC = sensors.getTempC(outsideThermometer);
etempF = DallasTemperature::toFahrenheit(etempC);
}
void tweet(char msg[]) {
Serial.println("connecting ...");
if (twitter.post(msg)) {
int status = twitter.wait();
if (status == 200) {
Serial.println("OK. Tweet sent.");
Serial.println();
lastTime = millis();
firstTweet = false;
} else {
Serial.print("failed : code ");
Serial.println(status);
}
} else {
Serial.println("connection failed.");
}
}
void setup()
{
Ethernet.begin(mac);
Serial.begin(9600);
sensors.begin();
// set the resolution
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
sensors.requestTemperatures();
getTemperatures();
while (firstTweet) {
sprintf(message, "Int. Temp: %d C (%d F) Ext. Temp: %d C (%d F). Tweeted from Arduino. %ld",
int(itempC), int(itempF), int(etempC), int(etempF), millis());
tweet(message);
}
}
void loop()
{
Ethernet.maintain();
sensors.requestTemperatures();
sprintf(serialString, "Internal Temp: %d C

%d F. External Temp: %d C %d F", int(itempC),

371

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

int(itempF), int(etempC), int(etempF));
delay(500);
Serial.println(serialString);
Serial.println();
if (millis() >= (lastTime + interval)) {
sprintf(message, "Int. Temp: %d C (%d F) Ext. Temp: %d C (%d F). Tweeted from Arduino. %ld",
int(itempC), int(itempF), int(etempC), int(etempF), millis());
delay(500);
tweet(message);
}
delay(10000); // 10 seconds
}
После того, как вы загрузили код в Arduino, откройте окно МПП. Arduino попытается подключиться к
Twitter (на самом деле веб-сайту NeoCat) и отправить твит. Если первый твит будет успешным, вывод в
окне МПП будет примерно таким:
connecting ...
OK. Tweet sent.
Internal Temp: 26 C

79 F. External Temp: 26 C 79 F

Internal Temp: 26 C

79 F. External Temp: 26 C 79 F

Internal Temp: 26 C

79 F. External Temp: 26 C 79 F

Когда программа запускается в первый раз, она измеряет температуру, а затем продолжает попытки
подключиться к Twitter в процедуре настройки, прежде чем она перейдет в основной цикл. Она не
остановится, пока не подключится успешно. Если программе неудается подключиться, вы получите
сообщение «сбой: код 403» или «сбой подключения». Если твит будет успешным, он не будет твитать
снова, пока не пройдет период интервала. По умолчанию это значение составляет 10 минут, но мы можем
его изменить. Твиттер ограничивает нас 350 запросами в час, так что не переусердствуйте. Теперь мы
можем получить доступ к веб-сайту Twitter и просмотреть учетную запись из любого места, чтобы
проверить показания температуры.
Посмотрим, как работает этот код.

Проект 49 - Twitterbot - Обзор кода
Программа начинается с включения соответствующих библиотек:
#include
#include
#include
#include
#include







Далее устанавливаются определения для датчиков:
#define ONE_WIRE_BUS 3
#define TEMPERATURE_PRECISION 12

372

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Вы создаете четыре floats значения для температур, на этот раз для внутренних и внешних
температур в C и F:
float itempC, itempF, etempC, etempF;
В первый раз, когда программа пытается создать твит, мы хотим, чтобы она продолжала попытки, пока
она успешно не подключится и не отправит сообщение. Таким образом, создается логическое значение,
для которого устанавливается значение true, чтобы мы знали, сделали ли мы еще свой первый твит или
нет:
boolean firstTweet = true;
Как и раньше, вы создаете экземпляры для однопроводных датчиков и датчиков температуры, а
также адреса для двух датчиков:
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress insideThermometer = { 0x10, 0x7A, 0x3B, 0xA9, 0x01, 0x08, 0x00, 0xBF };
DeviceAddress outsideThermometer = { 0x10, 0xCD, 0x39, 0xA9, 0x01, 0x08, 0x00, 0xBE};
Мы даем шилду Ethernet MAC-адрес:
byte mac[] = { 0x64, 0xB9, 0xE8, 0xC3, 0xC7, 0xE2 };
Затем мы создаем экземпляр библиотеки Twitter и передаем ему токен для своей учетной записи:
Twitter twitter("19735326-neITsUBnLTZHgN9UGaRkcGvAe9vYuaRP7E55K26J");
Установлен интервал между твитами.
unsigned long interval = 600000; // 10 минут
как переменная для хранения времени последнего твита.
unsigned long lastTime; // время с момента последнего твита
Создаются два символьных массива. Они сохранят сообщение для твита и сообщение, которое мы
выведем в окно МПП.
char message[140], serialString[60];
Теперь мы создаем несколько функций. Первая - это функция получения значений температуры от двух
датчиков и их сохранения в ваших переменных.
void getTemperatures()
{
itempC = sensors.getTempC(insideThermometer);
itempF = DallasTemperature::toFahrenheit(itempC);
etempC = sensors.getTempC(outsideThermometer);
etempF = DallasTemperature::toFahrenheit(etempC);
}

373

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Далее идет функция, которая будет писать за нас твиты. Для этого требуется один параметр, который
представляет собой массив символов, в котором находится наше сообщение.
void tweet(char msg[]) {
Пользователь проинформирован о том, что мы пытаемся подключиться:
Serial.println("connecting ...");
Затем мы используем метод post () объекта Twitter для отправки сообщения. Если публикация прошла
успешно, функция возвращает true. Если не удается подключиться, возвращается false.
if (twitter.post(msg)) {
Если мы успешно подключаемся, проверяется статус сообщения с помощью метода wait (). Он возвращает
HTTP код статуса в ответе Twitter.
int status = twitter.wait();
Если код состояния 200, это способ HTTP-кода сказать, что все в порядке. Другими словами, если твит
был успешно отправлен, код в блоке будет выполнен.
if (status == 200) {
В случае успеха мы сообщаем пользователю:
Serial.println("OK. Tweet sent.");
Serial.println();
Затем установим lastTime на текущее значение в millis (). Это нужно для того, чтобы мы могли
определить, сколько времени прошло с момента последнего твита.
lastTime = millis();
В первый раз, когда мы выполняем успешный твит, мы хотим, чтобы программа выскочила из цикла while
в процедуре настройки и перешла в основной цикл, поэтому мы устанавливаем флаг firstTweet в
значение false.
firstTweet = false;
Если статус не 200, то есть публикация не удалась, то пользователь информируется, и код передается
обратно для целей отладки.
} else {
Serial.print("failed : code ");
Serial.println(status);
}
и если вы вообще не смогли подключиться, пользователь будет проинформирован об этом.
} else {
Serial.println("connection failed.");
}

374

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Пользователь выполняет свои функции, теперь мы перейдем к процедуре настройки:
void setup()
Сначала мы запускаем библиотеку Ethernet и передаем ей MAC-адрес:
Ethernet.begin(mac);
Затем мы начинаем последовательную связь со скоростью 9600 бод и настраиваем датчики, как раньше:
Serial.begin(9600);
sensors.begin();
sensors.setResolution(insideThermometer, TEMPERATURE_PRECISION);
sensors.setResolution(outsideThermometer, TEMPERATURE_PRECISION);
Температуры запрашиваются, поскольку мы собираемся их использовать:
sensors.requestTemperatures()
getTemperatures();
Теперь вы пытаетесь отправить свой первый твит. Цикл while для этого будет продолжать работать, пока
для firstTweet установлено значение true:
while (firstTweet) {
Затем мы используете команду sprintf для компиляции твита в массив message []. Вы передаете ему
четыре набора температур, а также значение millis (). Поскольку millis является длинным числом
без знака, вы используете спецификатор % ld в sprintf для вывода длинного целого числа. Команда
sprintf (форматирование строки для печати) - отличный способ упаковать множество разных битов
информации в одну строку.
sprintf(message, "Int. Temp: %d C (%d F) Ext. Temp: %d C (%d F). Tweeted from Arduino. %ld",
int(itempC), int(itempF), int(etempC), int(etempF), millis());
Функция sprintf () принимает три параметра: переменную, в которой вы будете хранить
отформатированные данные (в данном случае сообщение для твита), содержимое строки со
спецификаторами, а затем переменные. При этом первая переменная вставляется в строку, где
появляется первый % d, вторую переменную, где появляется следующий % d, и так далее.
Четыре спецификатора разделены запятыми. Поэтому в последней строке числа будут
разделены запятыми.
Итак, если бы значения переменных были
itempC
itempF
etempC
tempF
millis()

25
77
14
52
4576

тогда, после запуска команды sprintf, содержимое сообщения будет
"Int. Temp: 25 C (77 F) Ext. Temp: 14 C (52 F). Tweeted from Arduino. 4576"
Как видите, команда sprintf - это мощный инструмент для преобразования длинных комбинаций строк и
чисел в одну строку.

375

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Причина, по которой вы добавляете значение millis () в конец твита, заключается в том, что Twitter не
будет публиковать сообщение, которое совпадает с последним отправленным. Если температура не
изменилась с момента последнего твита, сообщение будет таким же, и вместо этого Twitter вернет код
ошибки. Поскольку вы хотите регулярно обновлять каждый интервал, добавив значение millis () в конец,
вы убедитесь, что сообщение отличается от последнего отправленного. Убедитесь, что длина вашего
твита не превышает 140 символов; в противном случае на вашей временной шкале Twitter появятся
странные сообщения.
Теперь, когда мы скомпилировали свое сообщение, мы передаем его функции tweet ():
tweet(message);
Далее следует основной цикл, в который мы войдем только в том случае, если первый твит в
программе настройки будет успешным:
void loop()
Сначала вы запускаете команду обслуживания в библиотеке Ethernet. Это сохраняет
автоматически назначенный IP-адрес действующим и реальным.
Ethernet.maintain();
Температуры обновлены.
sensors.requestTemperatures();
Затем мы используем команду sprintf для компиляции вывода для последовательного монитора. Это
удобнее, чем целый список команд Serial.print (), поэтому мы можем использовать его, хотя он
увеличивает размер вашего кода.
sprintf(serialString, "Internal Temp: %d C
int(itempF), int(etempC), int(etempF));

%d F. External Temp: %d C %d F", int(itempC),

Затем после небольшой задержки строка выводится на МПП:
delay(500);
Serial.println(serialString);
Serial.println();
Затем мы проверяем, прошел ли интервал с момента последнего твита, и, если да, отправляем еще
один. Мы вычисляем значение lastTime + interval и смотрим, больше ли текущее значение в millis (), чем
оно (то есть период интервала прошел с момента последнего твита). Если это так, мы компилируем
новое сообщение и снова пишем в Твиттере.
if (millis() >= (lastTime + interval)) {
sprintf(message, "Int. Temp: %d C (%d F) Ext. Temp: %d C (%d F). Tweeted from
Arduino. %ld", int(itempC), int(itempF), int(etempC), int(etempF), millis());
tweet(message);
}
Наконец, у нас есть 10-секундная задержка между обновлениями МПП, чтобы мы не засыпали
пользователя информацией:
delay(10000); // 10 секунд

376

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

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

Project 50 - RSS-программа прогноза погоды
В последнем проекте этой книги снова будет использоваться Ethernet Shield, но вместо передачи данных в
веб-службу мы будем использовать Arduino и Ethernet Shield для извлечения данных из Интернета и
последующего отображения их в окне МПП. Данные, которые мы собираемся использовать,
представляют собой канал RSS (Really Simple Syndication) с веб-сайта www.weather.gov для получения
данных о погоде для выбранной вами области в Соединенных Штатах. Этот код легко адаптируется для
чтения RSS-ленты погоды из любого другого источника, если вы находитесь за пределами США.
RSS - это веб-формат для публикации часто обновляемой информации, такой как погода, новости и т. Д.
Данные представлены в формате XML (Extensible Markup Language), который представляет собой набор
правил для кодирования документов в машиночитаемой форме. XML - это простой формат, и совсем не
обязательно понимать, как он работает. Arduino просто ищет теги в XML-коде, где хранятся данные о
температуре, влажности и давлении, и удаляет эту информацию для отображения.
Вы будете использовать XML-канал для базы ВВС Эдвардс в Калифорнии. Если вы хотите
использовать другой канал, перейдите в http://www.weather.gov/xml/current_obs/ и выберите свой
регион, затем найдите полный адрес XML-данных дляэтого канала. Измените код соответствующим
образом, чтобы отображать погоду для этой области.
Что касается устройства, на этот раз вы используете не что иное, как Ethernet Shield, подключенный к
Arduino.

Введите код
Подключите шилд Ethernet к Arduino (если его еще нет) и введите код из Листинга 17-5. Спасибо Бобу С.
(Xtalker) с форумов Arduino за код.
Листинг 17-5. Код для проекта 50
Получить текущие наблюдения за погодой для авиабазы ​Эдвардс с сайта weather.gov в формате XML
// Включаем файлы описания для других используемых библиотек (если есть)
//#include
#include
#include
Максимальная длина строки может быть изменена в зависимостиот данных, которые необходимо
извлечь
#define MAX_STRING_LEN 20
// Setup vars
char tagStr[MAX_STRING_LEN] = "";
char dataStr[MAX_STRING_LEN] = "";
char tmpStr[MAX_STRING_LEN] = "";
char endTag[3] = {'') {
затем символ добавляется в строку tmpStr.
addChar(inChar, tmpStr);
Если вы в настоящее время обрабатываете тег и достигли конца тега, вы можете скопировать весь тег
из tmpStr (временная строка) в строку тега (tgrStr). Для этого вы используете команду strncpy.
if (tagFlag) {
strncpy(tagStr, tmpStr, strlen(tmpStr)+1);
}
Команда strncpy копирует часть одной строки в другую строку. Для этого требуются три параметра: строка, в
которую мы копируем данные, строка, из которой мы копируем данные, и количество символов для
копирования. Например, если у нас
strncpy(firstString, secondString, 10);
затем первые 10 символов secondString копируются в firstString. В этом случае мы копируем все
содержимое, определяя длину временной строки (tmpStr) +1 и копируя это количество символов в
строку тега.
После того, как временная строка будет скопирована, нам нужно очистить ее, чтобы она была
готовадля следующего фрагмента данных. Для этого мы вызываем функцию clearStr и передаем ей
строку, которую хотим очистить.
clearStr(tmpStr);

385

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Для двух флагов установлено значение false, готовое для следующей части информации:
tagFlag = false;
dataFlag = true;
Если читаемый символ является переводом строки (ASCII 10)
} else if (inChar != 10) {
затем мы добавляем символ в строку, если в настоящее время обрабатывается тег.
if (tagFlag) {
addChar(inChar, tmpStr);
Мы хотим игнорировать конечные теги, поэтому мы проверяем, обрабатываем ли мы тег в данный
момент и достигли ли конца тег (путем сравнения с символами endTag).
if ( tagFlag && strcmp(tmpStr, endTag) == 0 ) {
затем тег игнорируется, строка очищается, а теги устанавливаются в значения по умолчанию.
clearStr(tmpStr);
tagFlag = false;
dataFlag = false;
Команда strcmp сравнивает две строки. В нашем случае она сравнивает временную строку (tmpStr)
с символами в массиве endTag:
strcmp(tmpStr, endTag)
Результатом будет 0, если строки совпадают, и другое значение, если нет. Сравнивая его с массивом
endTag, мы проверяем наличие любого из трех символов конечного тега.
Если текущая строка - это данные
if (dataFlag) {
затем мы добавляем текущий символ в строку данных (dataStr).
addChar(inChar, dataStr);
Приведенный выше код в основном определяет, обрабатываете ли вы тег, и если да, то сохраняет
символы в строке тега (tagStr); если это данные, он сохраняет их в строке данных (dataStr). В итоге мы
получим тег и данные, хранящиеся отдельно.
Если мы достигли символа перевода строки, значит, мы находимся в конце текущей строки. Итак,
теперь нам нужно проверить теги, чтобы узнать, являются ли они данными о температуре, влажности
или давлении, которые м ы хотим получить.
if (inChar == 10 ) {

386

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

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

if (matchTag("")) {
и, если он найден, распечатывает строку данных, которая, если тег , будет содержать температуру в
градусах Фаренгейта.
Serial.print("Temp: ");
Serial.print(dataStr);
Затем вы проверяете температуру в градусах Цельсия,
if (matchTag("")) {
Serial.print(", TempC: ");
Serial.print(dataStr);
}
влажность,
if (matchTag("")) {
Serial.print(", Humidity: ");
Serial.print(dataStr);
}
и давление.
if (matchTag("")) {
Serial.print(", Pressure: ");
Serial.print(dataStr);
Serial.println("");
}
Затем все строки очищаются и готовы к переходу к следующей строке.
clearStr(tmpStr);
clearStr(tagStr);
clearStr(dataStr);
и теги тоже очищаются.
tagFlag = false;
dataFlag = false;
У нас есть свои пользовательские функции, начиная с функции очистки строки (clearStr).
void clearStr (char* str) {
который просто находит длину строки, переданной функции, с помощью команды strLen ()
int len = strlen(str);

387

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

затем использует цикл for для заполнения каждого элемента массива символом ASCII 0 (нулями).
for (int c = 0; c < len; c++) {
str[c] = 0;
}
Следующая функция - это функция addChar. Мы передаем ему читаемый в данный момент символ и
текущую строку в качестве параметров.
void addChar (char ch, char* str) {
Мы определяем два новых массива символов и сохраняем в них сообщения об ошибках:
char *tagMsg = "";
char *dataMsg = "-TRUNCATED_DATA-";
Если мы обнаружим, что длина строк превышает MAX_STRING_LEN, мы заменим их этими
сообщениями об ошибках.
Теперь мы проверяем длину строки, чтобы увидеть, достигла ли она максимальной длины:
if (strlen(str) > MAX_STRING_LEN - 2) {
Если это так, мы в настоящее время обрабатываем тег
if (tagFlag) {
затем строка тега очищается, и мы копируем сообщение об ошибке в строку тега.
clearStr(tagStr);
strcpy(tagStr,tagMsg);
Если вы обрабатываете данные, строка данных очищается, и вы копируете сообщение об ошибке
данных в строку данных.
if (dataFlag) {
clearStr(dataStr);
strcpy(dataStr,dataMsg);
}
Временная строка и теги очищаются
clearStr(tmpStr);
tagFlag = false;
dataFlag = false;
и если длина строки не превышает максимальную длину, мы добавляем текущий считанный символ в
строку. Мы используем длину строки, чтобы узнать последний символ, то есть следующее место, куда
мы можем добавить символ.
} else {
// Add char to string
str[strlen(str)] = ch;
}

388

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

Наконец, вы попадаете в функцию matchTag, которая используется для проверки того, что тег поиска,
переданный ему в качестве параметра, был найден или нет, и если да, возвращает true или false
соответственно:
boolean matchTag (char* searchTag) {
Функция имеет логический тип, поскольку она возвращает логическое значение и требует в
качестве параметра символьный массив:
if ( strcmp(tagStr, searchTag) == 0 ) {
return true;
} else {
return false;
}
}
Изменив URL-адрес XML-канала и теги, найденные в этом канале, вы можете использовать этот код для
поиска фрагментов данных в любом RSS-канале по вашему желанию. Например, вы можете использовать
погодные каналы Yahoo на http://weather.yahoo.com, перейти в регион, который вы хотите просмотреть, и
нажать кнопку RSS. Затем URL-адрес этого канала можно ввести в код. Вы можете просмотреть
необработанный источник канала, щелкнув правой кнопкой мыши и выбрав пункт меню правой кнопки
мыши, чтобы просмотреть источник. Затем вы можете просмотреть теги и изменить код, чтобы найти
соответствующую информацию.
Этот последний проект показал вам, как использовать Ethernet Shield для получения информации из
Интернета.
Раньше вы отправляли данные из Shield во внешние источники. В этом проекте вместо этого вы читаете
данные из Интернета. Вместо того, чтобы отображать данные о погоде в окне последовательного
монитора, вы можете использовать навыки, полученные в предыдущих проектах, для отображения их на
ЖК-экране или на светодиодном точечно-матричном дисплее.

Резюме
В этой последней главе было показано, как подключить Arduino к Интернету либо с целью отправки данных
в виде обслуживаемой веб-страницы, твита в Twitter, электронной почты, данных датчиков, отправленных
в Xively, либо для запроса веб-страницы и удаление данных с нее для вашего собственного
использования. Возможность подключения Arduino к локальной сети или Интернету открывает целый
новый список потенциальных проектов. Данные могут быть отправлены в любую точку вашего дома или
офиса, где доступен порт Ethernet, или данные могут быть прочитаны из Интернета для Arduino для
обработки, отображения или действий.
Например, вы можете использовать текущую погодную ленту, чтобы определить, скоро ли идет дождь, и
предупредить вас, чтобы вы принесли белье с бельевой веревки или закрыли окно на крыше. То, что вы
делаете со своим Arduino после его подключения, ограничивается только вашим воображением.
Я надеюсь, что вам понравились 50 проектов, представленных вам в Основы Arduino, и что вам очень
нравится использовать полученные знания для создания собственных фантастических творений Arduino.
Свяжи
. тесь с нами в Twitter или G +, если вам понадобится дополнительная помощь. Всего наилучшего, Майк.
Предметы и понятия, затронутые в главе 17:


Как вручную назначить устройству MAC- и IP-адрес



Понятие клиента и сервера



Как прослушивать клиентские соединения с помощью команды client.connected ()

389

ГЛАВА 17 ■ СВЯЗЬ ЧЕРЕЗ ИНТЕРНЕТ

390



Как прослушивать клиентские соединения с помощью команды client.connected ()



Отправка HTML-кода с помощью печати клиенту



Использование Arduino в качестве веб-сервера



Подключение к Arduino из веб-браузера



Проверка данных доступна с помощью команды client.available ().



Чтение данных с помощью команды client.read ()



Отправка данных в Xively, просмотр данных в виде графиков и т. д.



Отправка твитов на Twitter.com с Arduino через прокси-сервер.



Отправка электронной почты из Arduino



Получение данных из RSS-канала и их анализ для отображения



Копирование строк с помощью команд strcpy и strncpy



Сравнение строк с помощью команды strcmp



Заполнение ячеек памяти командой memset



Определение размера массивов с помощью команды sizeof



Обработка строк с помощью команды sprintf



Определение длины строк с помощью команды strlen



Поиск подстрок с помощью команды strstr



Поиск IP-адресов с помощью команды ping



Проверка подключения клиента с помощью команды client.connect ()



Создание соединения Ethernet с помощью команды Ethernet.begin (mac, ip)



Шифрование имен пользователей и паролей до Base-64 с помощью утилит веб-сайта



Использование библиотеки Ethernet.h для автоматического назначения IP-адреса



Использование сообщений библиотеки Twitter и команд ожидания



Поиск тегов в XML-канале RSS