Arduino:Примеры/Чтение данных с I2C-датчика температуры TC74A0-5.0VAT с отображением данных на гистограмме и программе на Processing

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Проверка/Оформление/Редактирование: Мякишев Е.А.



Чтение данных с I2C-датчика температуры TC74A0-5.0VAT с отображением данных на гистограмме и программе на Processing

Данный пример демонстрирует чтение данных с I2C-датчика температуры TC74A0-5.0VAT,подключенного к Arduino Uno и отображение данных на гистограмме и программе на Processing.

Необходимые компоненты

Монтажная схема

Соберите схему согласно монтажной схеме.

Распиновка сдвигового регистра 74HC595
Контакты 1-7, 15 Q0-Q7 Выходные контакты
Контакт 8 GND «Земля», Vss
Контакт 9 Q7’’ Контакт для вывода последовательных данных
Контакт 10 MR Контакт, позволяющий «очистить» значения на всех выходных контактах и выставить их на LOW (если подать на него LOW)
Контакт 11 SH_CP Тактовый контакт для сдвигового регистра
Контакт 12 ST_CP Тактовый контакт для регистра данных (контакт-защелка)
Контакт 13 OE Контакт, разрешающий вывод данных (если подать на него LOW)
Контакт 14 DS Контакт для ввода последовательных данных
Контакт 16 Vcc Контакт для питания напряжением с положительным зарядом
Распиновка I2C-датчика температуры TC74A0-5.0VAT

Код для Arduino

#include <Wire.h>                              // Подключаем библиотеку Wire

#define SER   8                                // Контакт для ввода последовательных данных в сдвиговый регистр
#define LATCH 9                                // Тактовый контакт для регистра данных (контакт-защелка) 
                                               // служит для одновременного вывода полученных последовательных данных  
                                               // на параллельные выходы сдвигового регистра
#define CLK   10                               // Тактовый контакт для сдвигового регистра
                                               // При подаче HIGH происходит запись одного бита в сдвиговый регистр

int vals[8] = {1,3,7,15,31,63,127,255};        // возможные значения для регистра сдвига 

int temp_address = 72;                         // Адрес(1001000) I2C-датчика температуры TC74A0-5.0VAT в десятичной нотации

void setup()
{
  Serial.begin(9600);                          // Инициализация передачи по последовательному порту на скорости 9600 бод
  Wire.begin();                                // Создание объекта Wire
 
  // Установка выводов как выходов
  pinMode(SER, OUTPUT);
  pinMode(LATCH, OUTPUT);
  pinMode(CLK, OUTPUT);
}

void loop()
{
  // Отправка запроса
  Wire.beginTransmission(temp_address);        // Выбор ведомого устройства отправкой его адреса
  Wire.write(0);                               // Отправка 0, тем самым указывая что мы хотим прочитать данные из регистра температуры нашего датчика
  Wire.endTransmission();                      // Отправка стоп-бита, тем самым сообщаем об окончании записи на устройство
  
  // Чтение температуры с датчика 
  Wire.requestFrom(temp_address, 1);           // Запрос 1 байта по адресу устройства 
  while(Wire.available() == 0);                // Ожидаем ответа
  int c = Wire.read();                         // Чтение данных в переменную 
 
  int graph = map(c, 24, 31, 0, 7);            // Масштабирование значений для светодиодной гистограммы
  graph = constrain(graph,0,7);                // Накладываем ограничение на диапазон возможных значений

  digitalWrite(LATCH, LOW);                    // устанавливаем LATCH в LOW, чтобы значения на параллельных выходах
                                               // сдвигового регистра не изменялись во время ввода последовательных 
                                               // данных
  shiftOut(SER, CLK, MSBFIRST, vals[graph]);   // ввод последовательных данных в сдвиговый регистр
  digitalWrite(LATCH, HIGH);                   // устанавливаем LATCH в HIGH для вывода значений
                                               // на параллельные выводы сдвигового регистра
 
  int f = round(c * 9.0 / 5.0 + 32.0);         // Переводим Цельсии в Фаренгейты и округляем результат
 
  // Передаем считанную температуру в последовательный порт
  Serial.print(c);
  Serial.print("C,");
  Serial.print(f);
  Serial.print("F.");
 
  delay(500);                                  // Задержка 500 мс.
}

Код для Processing

  • Сохраните код проекта;
  • Перейдите в Tools -> Create Font;
  • Выберете понравившийся шрифт и укажите в поле Size размер шрифта равным примерно 200;
  • При желании вы можете дать свое название шрифту в поле Filename;
  • Скопируйте текст из поля Filename в буфер;
  • Нажмите OK;
  • Вставьте из буфера и замените AgencyFB-Bold-200.vlw в коде(14 строчка) на название вашего шрифта;
import processing.serial.*;
Serial port;
String temp_c = "";
String temp_f = "";
String data = "";
int index = 0;
PFont font;

void setup()
{
  size(400,400);
  port = new Serial(this, "COM5", 9600);            // Измените "COM5" на номер порта к которому подключена ваша плата Arduino
  port.bufferUntil('.'); 
  font = loadFont("AgencyFB-Bold-200.vlw");         // Измените "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(",");                        // Ищем в строке позицию символа ','(запятая)
  temp_c = data.substring(0, index);                // Сохраняем градусы Цельсия
  temp_f = data.substring(index+1, data.length());  // Сохраняем градусы Фаренгейта
}

См.также

Внешние ссылки