Изучаем Arduino: инструметы и методы технического волшебства - [44]
- 174 -
Рис. 8.4. Схема подключения датчика температуры использовать А4 и AS как аналоговые входы нельзя, потому что они заняты обменом с устройствами I>2C.
Теперь нужно написать программу, которая определяет действия Arduino для получения данных от I 2 С-датчика температуры. С помощью библиотеки Wire сделать это довольно легко. Чтобы не допустить ошибки, следует внимательно прочесть справочную информацию об алгоритме связи, который поддерживает именно этот чип. Давайте проанализируем протокол взаимодействия, представленный в таблицах и на графиках, показанных на рис. 8.5 и 8.6.
На рис. 8.6 показано, как осуществлять чтение и запись данных для датчика ТС74.
Микросхема имеет два регистра: в первом хранится значение текущей температуры
- 175 -
рис. 8.5. Протокол обмена датчика ТС74
в градусах Цельсия, во втором - информация о конфигурации чипа (включая режим ожидания и режим передачи данных). Это ясно из табл. 4.1 на рис. 8.6. Нет необходимости вникать в юоансы конфигурации, требуется только получить значение температуры от устройства. В табл. 4.3 и 4.4 на рис. 8.6 показано, как хранится информация о температуре внутри 8-разрядного регистра.
В секции Write Byte fonnat на рис. 8.5 показано, как прочитать значение температуры из ТС74:
• послать адрес устройства в режиме записи и выставить 0, чтобы указать, что нужно перейти в режим чтения из регистра данных;
• отправить на адрес устройства команду запроса (1 байт) на чтение информации от устройства;
• подождать прихода всех 8 битов информации о значении температуры.
Теперь становится понятно, как работать с подобными I>2C-устройствами. Если вы еще не все уяснили, поищите в Интернете примеры программ подключения Arduino
- 176 -
Рис. 8.6. Страница из технического описания датчика ТС742
- 177 -
к различным устройствам I>2C. Далее перейдем к написанию программы, которая выполняет три действия, описанные ранее.
Как уже упоминалось, в 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.8). По существу нужно лишь добавить сдвиговый регистр к схеме, изображенной на рис. 8.4.
Рис. 8.8. I>2C-датчик температуры с гистограммным индикатором на основе сдвигового регистра