Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства
- Название:Изучаем Arduino: инструметы и методы технического волшебства
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2015
- Город:Санкт-Петербург
- ISBN:978-5-9775-3585-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Джереми Блум - Изучаем Arduino: инструметы и методы технического волшебства краткое содержание
Для радиолюбителей
Изучаем Arduino: инструметы и методы технического волшебства - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Во-вторых, нужно добавить фрагмент кода для работы со сдвиговым регистром ( см. главу 7) и изменить функцию map(), приводящую светодиодные значения к требуемому диапазону температур. Еще раз взгляните на листинг 7.3, откуда мы возьмем большую часть кода и внесем туда небольшие коррективы. Сначала уменьшим число элементов массива для отображения гистограммы с девяти до восьми. Это нужно, чтобы один светодиод показывал, что система работает (нулевой элемент исключаем из массива). Также следует изменить значение переменных для масштабирования, чтобы отобразить интересующий диапазон температур.
Я выбрал диапазон от 24 до 31°С (75-88 F), но вы можете задать любой другой.
Листинг 8.2 содержит полный текст программы.
Листинг 8.2. Чтение данных с I 2C-датчика температуры с отображением на светодиодной гистограмме и отправкой в последователный порт -
// Чтение температуры из I 2C-датчика температуры,
// отображение на светодиодной гистограмме и вывод
// в 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 уже передает необработанные данные на компьютер. Необходимо написать программу обработки, которая сможет интерпретировать их и отобразить на компьютере в удобном виде.
Так как обновлять текст нужно в режиме реального времени, необходимо сначала узнать, как загрузить шрифты в программу на Processing. Откройте Processing приложение и создайте новый пустой проект. Сохраните файл, прежде чем продолжить. Затем через контекстное меню Tools -> Create Font вызовите окно, которое изображено на рис. 8.9.
Рис. 8.9. Загрузка шрифтов в Processing-приложение
Выберите свой любимый шрифт и размер (для этой программы я рекомендую размер около 200). После этого нажмите кнопку ОК. Шрифт будет автоматически установлен в папку data данного проекта.
Программа на Processing должна выполнить следующее:
• Сгенерировать графическое окно на компьютере для отображения данных температуры в градусах Цельсия и Фаренгейта.2
- 183 -
• Прочитать входящие данные из последовательного порта, преобразовать их и сохранить значения в локальных переменных для отображения на компьютере.
• Постоянно обновлять экран при получении новых значений из последовательного порта.
Скопируйте код из листинга 8.3, задайте правильное наименование порта для вашего компьютера и имя выбранного шрифта. Подключите плату Arduino к компьютеру и нажмите на кнопку Выполнить. И наслаждайтесь волшебной картинкой!
Листинг 8.3. Программа на Processing для отображения данных температуры - display_temp.pde
// Отображение температуры, получаемой с I 2C-датчика
import processing.serial.*;
Serial port;
String temp_c = "";
String temp_f = "";
String data = "";
int index = 0;
PFont font;
void setup()
{
size(400,400);
// Измените "СОМ9" на имя вашего последовательного порта
port = new Serial(this, "СОМ9", 9600);
port.bufferUntil('.');
// Измените имя шрифта, выбранное вами
font = loadFont("AgencyFB-Bold-200.vlw");
textFont(font, 200);
}
void draw()
{
background(0,0,0);
fill(46, 209, 2);
text(temp_c, 70, 175);
fill(0, 102, 153);
text(temp_f, 70, 370);
}
void serialEvent (Serial port)
{
data = port.readStringUntil('.');
data = data.substring(0, data.length() - 1);
// Ищем запятую - разделитель данных по Цельсию и Фаренгейту
index = data.indexOf(",");
- 184 -
// Получить температуру в градусах Цельсия
temp_c = data.substring(0, index);
// Получить температуру по Фаренгейту
temp_f = data.substring(index+1, data.length());
}
Как и в предыдущих примерах на Processing, программа начинается с импорта библиотеки serial и настройки последовательного порта. В секции setup() задается размер окна отображения, загружается сгенерированный шрифт и настраивается загрузка данных последовательного порта в буфер до получения символа точки.
Функция draw() заполняет фон окна черным цветом и выводит значения температуры по Цельсию и по Фаренгейту двумя цветами. С помощью команды fill() вы сообщаете Processing о цвете (в значениях RGB) следующего элемента, который будет добавлен на экран. Функция serialEvent() вызывается при наступлении события bufferuntil(), она считывает содержимое буфера в строку, а затем разбивает его, учитывая расположение запятой. Два значения температуры хранятся в переменных, которые затем выводятся в окно приложения.
Результат выполнения программы показан на рис. 8.10.

Рис. 8.10. Отображение температуры на Processing
При изменении температуры датчика данные в окне Processing-приложения, а также светодиодная гистограмма должны обновиться.
ПРИМЕЧАНИЕ
Для просмотра демонстрационного видеофильма системы мониторинга температуры посетите страницу http:/lwww.exploringarduino.com/content/ch8. Этот видеофильм доступен также на сайте издательства Wiley.
- 185 -
Резюме
• Как организовать связь платы Arduino с несколькими I 2C ведомыми 2 устройствами (если они имеют разные адреса) по двухпроводному протоколу I c.
Читать дальшеИнтервал:
Закладка: