Программа из листинга 8.1 также преобразует температуру по Цельсию в градусы Фаренгейта. Формулу такого преобразования можно найти в Интернете. В нашем примере результат округлен до целого числа.
Теперь запустите код листинга 8.1 на плате Arduino и откройте монитор последовательного порта. Вы должны увидеть вывод данных в последовательный порт, который выглядит примерно так, как на рис. 8.7.
Рис. 8.7. Отправка данных из I2C-датчика температуры в последовательный порт
- 179 -
8.4. Проект, объединяющий регистр сдвига, последовательный порт и шину I2C
Теперь у нас есть простая схема, получающая данные от I2C-устройства и выводящая результаты в последовательный порт, и можно сделать нечто более интересное. Подключив сдвиговый регистр ( см. главу 7), а также Processing-приложение, визуализируем температуру на экране компьютера.
Сначала соберем схему устройства (рис. 8.8). По существу нужно лишь добавить сдвиговый регистр к схеме, изображенной на рис. 8.4.
Рис. 8.8. I2C-датчик температуры с гистограммным индикатором на основе сдвигового регистра
- 180 -
Чтобы упростить последовательную связь с Processing-приложением и реализовать функциональность сдвигового регистра, в листинг 8.1 нужно внести два изменения.
Во-первых, измените операторы вывода данных в последовательный порт следующим образом:
Serial.print(c);
Serial.print("C,");
Serial.print(f);
Serial.print("F.");
Программа на Processing должна выдавать температуру в градусах Цельсия и Фаренгейта. Заменяя пробелы и символы возврата каретки запятыми и точками, можно отображать данные в виде, удобном для анализа.
Во-вторых, нужно добавить фрагмент кода для работы со сдвиговым регистром ( см. главу 7) и изменить функцию map(), приводящую светодиодные значения к требуемому диапазону температур. Еще раз взгляните на листинг 7.3, откуда мы возьмем большую часть кода и внесем туда небольшие коррективы. Сначала уменьшим число элементов массива для отображения гистограммы с девяти до восьми. Это нужно, чтобы один светодиод показывал, что система работает (нулевой элемент исключаем из массива). Также следует изменить значение переменных для масштабирования, чтобы отобразить интересующий диапазон температур.
Я выбрал диапазон от 24 до 31°С (75-88 F), но вы можете задать любой другой.
Листинг 8.2 содержит полный текст программы.
Листинг 8.2. Чтение данных с I2C-датчика температуры с отображением на светодиодной гистограмме и отправкой в последователный порт -
// Чтение температуры из I2C-датчика температуры,
// отображение на светодиодной гистограмме и вывод
// в Processing-приложение
// Подключение библиотеки Wire
#include
// Контакт для подключения вывода DATA
const int SER =8;
const int LATCH =9; // Контакт для подключения вывода LATCH
const int CLK =10; // Контакт для подключения вывода CLOCK
int temp_address = 72;
// Задание значений светодиодов
int vals[8] = {1,3,7,15,31,63,127,255};
void setup()
{
// Запуск последовательного порта
Serial.begin(9600);
// Создание объекта Wire
Wire.begin();
- 181 -
// Установить контакты на вывод (OUTPUT)
pinMode(SER, OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(CLK, OUTPUT);
}
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 graph = map(c, 24, 31, 0, 7);
graph = constrain(graph,0,7);
digitaJWrite(LATCH, LOW);
// LATCH - низкий - начало отправки
shiftOut(SER, CLK, MSBFIRST, vals[graph]); // Отправка, старший
// бит - первый
digitalWrite(LATCH, HIGH);
// LATCH - высокий, окончание отправки
// Перевод данных из шкалы Цельсия в шкалу Фаренгейта
int f = round(c*9,0/5,0 +32,0);
// Отправка значения в градусах Цельсия и Фаренгейта
// в последовательный порт
Serial.print(c);
Serial.print("C,");
Serial.print(f);
Serial.print("F.");
delay(500);
}
После загрузки кода листинга 8.2 в плату Arduino можно наблюдать, как меняется цвет светодиодов при изменении температуры. Дотроньтесь до датчика рукой, чтобы повысить температуру. Светодиодная гистограмма должна измениться. Теперь
- 182 -
нужно написать программу на Processing, которая будет отображать значение температуры на компьютере в удобном для чтения формате.
На данный момент плата Arduino уже передает необработанные данные на компьютер. Необходимо написать программу обработки, которая сможет интерпретировать их и отобразить на компьютере в удобном виде.
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии