- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программируем Arduino. Основы работы со скетчами - Монк Саймон
Шрифт:
Интервал:
Закладка:
Рис. 8.2. Список ведомых устройств 1-Wire
Для работы функции search требуется массив размером 8 байт, куда она могла бы поместить следующий найденный адрес. После последнего обнаруженного устройства она возвращает 0. Это позволяет выполнять итерации в цикле while, как в предыдущем примере, пока не будут определены все адреса. Последний байт адреса в действительности является циклической контрольной суммой (Cyclic Redundancy Check, CRC), позволяющей проверить целостность адреса. Библиотека OneWire включает специальную функцию для проверки контрольной суммы CRC.
Использование DS18B20
Следующий пример иллюстрирует использование библиотеки OneWire с температурным датчиком DS18B20. На рис. 8.3 изображена схема подключения DS18B20 к плате Arduino. Обратите внимание на то, что у самого датчика всего три контакта и он имеет вид обычного транзистора.

Рис. 8.3. Схема подключения DS18B20 к Arduino
Для датчика температуры компании Dallas Semiconductor имеется собственная библиотека, упрощающая операцию запроса температуры и декодирования результата. Библиотека DallasTemperature доступна для загрузки по адресу https://github.com/milesburton/Arduino-Temperature-Control-Library.
// sketch_08_02_OneWire_DS18B20
#include <OneWire.h>
#include <DallasTemperature.h>
const int busPin = 10;
OneWire bus(busPin);
DallasTemperature sensors(&bus);
DeviceAddress sensor;
void setup()
{
Serial.begin(9600);
sensors.begin();
if (!sensors.getAddress(sensor, 0))
{
Serial.println("NO DS18B20 FOUND!");
}
}
void loop()
{
sensors.requestTemperatures();
float tempC = sensors.getTempC(sensor);
Serial.println(tempC);
delay(1000);
}
Этот скетч выводит в окно монитора последовательного порта температуру в градусах Цельсия, прочитанную с единственного датчика температуры (рис. 8.4).

Рис. 8.4. Вывод температуры, прочитанной с датчика DS18B20
В этом примере используется только один датчик температуры, но его легко можно распространить на случай с несколькими датчиками. Библиотека DallasTemperature сама определяет адреса устройств с помощью OneWire в функции getAddress, вторым параметром которой передается номер позиции датчика. Чтобы добавить второй датчик, нужно определить новую переменную для хранения его адреса и затем определить адрес вызовом getAddress. Пример с использованием двух датчиков можно загрузить с сайта книги, где он хранится под именем sketch_08_03_OneWire_DS18B20_2.
В заключение
В этой главе вы познакомились с шиной 1-Wire и узнали, как использовать ее для подключения популярного температурного датчика DS18B20.
В следующей главе мы исследуем еще одну разновидность последовательного интерфейса с названием SPI.
9. Взаимодействие с устройствами SPI
Последовательный периферийный интерфейс (Serial Peripheral Interface, SPI) — еще одна последовательная шина для подключения периферийных устройств к плате Arduino. Это быстрая шина, но для передачи данных в ней используются четыре линии против двух, используемых интерфейсом I2C. В действительности SPI не является истинной шиной, так как четвертая линия в нем называется «выбор ведомого» (Slave Select, SS). Каждое периферийное устройство на шине должно быть соединено своей линией SS с отдельным контактом на плате Arduino. Такая схема подключения эффективно выбирает нужное периферийное устройство на шине, отключая все остальные.
Интерфейс SPI поддерживается широким спектром устройств, включая многие типы тех же устройств, что поддерживают I2C. Нередко периферийные устройства поддерживают оба интерфейса, I2C и SPI.
Операции с битами
Взаимодействие по интерфейсу SPI часто связано с выполнением большого объема операций с отдельными битами. Первый пример, демонстрирующий использование АЦП на основе микросхемы MCP3008, в частности, требует хорошего понимания битовых операций и того, как маскировать ненужные биты, чтобы получить целое значение при чтении аналогового сигнала. По этой причине, прежде чем погружаться в особенности работы SPI, я хочу подробно поговорить об операциях с битами.
Двоичное и шестнадцатеричное представление
Впервые с битами мы встретились в главе 4 (см. рис. 4.2). Оперируя битами в байте или в слове (два байта), можно использовать их десятичные значения, но выполнять мысленно преобразования между двоичным и десятичным представлениями очень неудобно. Поэтому в скетчах для Arduino значения часто выражаются в виде двоичных констант, для чего поддерживается специальный синтаксис:
byte x = 0b00000011; // 3
unsigned int y = 0b0000000000000011; // 3
В первой строке определяется байт с десятичным значением 3 (2 + 1). Ведущие нули при желании можно опустить, но они служат отличным напоминанием о том, что определяется 8-битное значение.
Во второй строке определяется значение типа int, состоящее из 16 бит. Квалификатор unsigned перед именем типа int указывает, что определяемая переменная может хранить только положительные числа. Этот квалификатор имеет значение лишь для операций с переменной, таких как +, –, * и др., которые не должны применяться, если переменная предназначена для манипуляций с битами. Но добавление слова unsigned в определения таких переменных считается хорошей практикой.
Когда дело доходит до 16-битных значений, двоичное представление становится слишком громоздким. По этой причине многие предпочитают использовать шестнадцатеричную форму записи.
Шестнадцатеричные числа — это числа в системе счисления с основанием 16, для обозначения цифр в этой системе используются не только десятичные цифры от 0 до 9, но и буквы от A до F, представляющие десятичные значения от 10 до 15. В этом представлении каждые четыре бита числа можно представить единственной шестнадцатеричной цифрой. В табл. 9.1 перечислены десятичные значения от 0 до 15 и показаны их двоичные и шестнадцатеричные представления.
Таблица 9.1. Двоичные и шестнадцатеричные числа
Десятичное значение
Двоичное значение
Шестнадцатеричное значение
0
0000
0
1
0001
1
2
0010
2
3
0011
3
4
0100
4
5
0101
5
6
0110
6
7
0111
7
8
1000
8
9
1001
9
10
1010
A
11
1011
B
12
1100
C
13
1101
D
14
1110
E
15
1111
F
Шестнадцатеричные константы, как и двоичные, имеют специальную форму записи:
int x = 0x0003; // 3
int y = 0x010F; // 271 (256 + 15)
Эту форму записи используют не только в программном коде на C, но и в документации, чтобы показать, что число является шестнадцатеричным, а не десятичным.
Маскирование битов
Нередко при приеме данных от периферийных устройств, независимо от вида связи, данные поступают упакованными в байты, в которых часть битов может нести служебную информацию. Создатели периферийных устройств часто стараются втолкнуть как можно больше информации в минимальное число бит, чтобы добиться максимальной скорости передачи, но это усложняет программирование взаимодействий с такими устройствами.
Операция маскирования битов позволяет игнорировать некоторую часть данных в байте или в большой структуре данных. На рис. 9.1 показано, как выполнить маскирование байта, содержащего разнородные данные, и получить число, определяемое тремя младшими битами.

