- 176 -
Рис. 8.6. Страница из технического описания датчика ТС742
- 177 -
к различным устройствам I 2C. Далее перейдем к написанию программы, которая выполняет три действия, описанные ранее.
8.3.3. Написание программы
Как уже упоминалось, в Arduino есть библиотека Wire для связи устройств по протоколу I 2C. После подключения библиотеки можно читать данные из устройства и записывать данные в него. Загрузите код из листинга 8.1, который иллюстрирует преимущества функций, встроенных в библиотеку Wire.
Листинг 8.1. Чтение данных с I 2C-датчика температуры - read_temp.ino
// Чтение температуры из I 2C-датчика
// и вывод значений в последовательный порт
// Подключение библиотеки Wire
#include
int temp_address=72; // Запись адреса 1001000
void setup()
{
// Запуск последовательного порта
Serial.begin(9600);
// Создание объекта Wire
Wire.begin();
}
void loop()
{
// Отправка запроса
// Выбор устройства отправкой адреса устройства
Wire.beginTransmission(temp_address);
// Установка бита asking в 0 для чтения
Wire.write(0);
// Отправка стоп-бита
Wire.endTransmission();
// Чтение температуры из устройства
// Получить 1 байт по адресу устройства
Wire.requestFrom(temp_address, 1);
// Ожидание ответа
while(Wire.available() == 0);
// Чтение данных в переменную
int с = Wire.read();
// Перевод данных из шкалы Цельсия в шкалу Фаренгейта
int f = round(c*9.0/5.0 +32.0);
- 178 -
// Отправка значения в градусах Цельсия и Фаренгейта
// в последовательный порт
Serial.print(c);
Serial.print("C ");
Serial.print(f);
Serial.println("F");
delay(500);
}
Рассмотрим программу подробнее. Команда Wire.beginTransmission() начинает общение с ведомым устройством, отправляя адрес (уникальный идентификатор) устройства. Команда wire.write(0) отправляет "0", указывая, что вы хотите читать из регистра температуры. Затем передаем стоп-бит, вызывая функцию Wire.endTransmission(), чтобы указать окончание записи на устройство. Далее мастер получает информацию от ведомого устройства I 2C. Команда Wire.requestFrom() мастер запрашивает получение одного байта данных из I 2C-устройства. Команда Wire.available() будет блокировать выполнение остальной части кода, пока данные не станут доступны на линии I 2C. Наконец, 8-разрядное значение считывается в переменную командой Wire.read().
Программа из листинга 8.1 также преобразует температуру по Цельсию в градусы Фаренгейта. Формулу такого преобразования можно найти в Интернете. В нашем примере результат округлен до целого числа.
Теперь запустите код листинга 8.1 на плате Arduino и откройте монитор последовательного порта. Вы должны увидеть вывод данных в последовательный порт, который выглядит примерно так, как на рис. 8.7.
Рис. 8.7. Отправка данных из I 2C-датчика температуры в последовательный порт
- 179 -
8.4. Проект, объединяющий регистр сдвига, последовательный порт и шину I 2C
Теперь у нас есть простая схема, получающая данные от I 2C-устройства и выводящая результаты в последовательный порт, и можно сделать нечто более интересное. Подключив сдвиговый регистр ( см. главу 7), а также Processing-приложение, визуализируем температуру на экране компьютера.
8.4.1. Создание системы мониторинга температуры
Сначала соберем схему устройства (рис. 8.8). По существу нужно лишь добавить сдвиговый регистр к схеме, изображенной на рис. 8.4.
Рис. 8.8. I 2C-датчик температуры с гистограммным индикатором на основе сдвигового регистра
- 180 -
8.4.2. Модификация кода программы
Чтобы упростить последовательную связь с Processing-приложением и реализовать функциональность сдвигового регистра, в листинг 8.1 нужно внести два изменения.
Во-первых, измените операторы вывода данных в последовательный порт следующим образом:
Serial.print(c);
Serial.print("C,");
Serial.print(f);
Serial.print("F.");
Программа на Processing должна выдавать температуру в градусах Цельсия и Фаренгейта. Заменяя пробелы и символы возврата каретки запятыми и точками, можно отображать данные в виде, удобном для анализа.
Во-вторых, нужно добавить фрагмент кода для работы со сдвиговым регистром ( см. главу 7) и изменить функцию map(), приводящую светодиодные значения к требуемому диапазону температур. Еще раз взгляните на листинг 7.3, откуда мы возьмем большую часть кода и внесем туда небольшие коррективы. Сначала уменьшим число элементов массива для отображения гистограммы с девяти до восьми. Это нужно, чтобы один светодиод показывал, что система работает (нулевой элемент исключаем из массива). Также следует изменить значение переменных для масштабирования, чтобы отобразить интересующий диапазон температур.
Читать дальше