Arduino:Примеры/Чтение данных с I2C-датчика температуры TC74A0-5.0VAT с отображением данных на гистограмме и программе на Processing
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Поддержать проект | Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Проверка/Оформление/Редактирование: Мякишев Е.А.
![]() |
Черновик |
Чтение данных с I2C-датчика температуры TC74A0-5.0VAT с отображением данных на гистограмме и программе на Processing
Данный пример демонстрирует чтение данных с I2C-датчика температуры TC74A0-5.0VAT,подключенного к Arduino Uno и отображение данных на гистограмме и программе на Processing.
Необходимые компоненты
- Плата Arduino Uno, 1 шт.;
- I2C-датчика температуры TC74A0-5.0VAT, 1 шт.;
- Сдвиговый регистр 74HC595, 1 шт.;
- Резистор 4,7 кОм, 2 шт.;
- Резистор на 220 Ом, 8 шт.;
- Красный светодиод, 1 шт.;
- Желтый светодиод, 3 шт.;
- Зеленый светодиод, 4 шт.;
- Макетная плата;
- Провода перемычки;
Монтажная схема
Соберите схему согласно монтажной схеме.
Контакты 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()); // Сохраняем градусы Фаренгейта
}