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

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

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


Pixel Art Mini Meow Animated.gif Черновик


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

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

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

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

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

Arduino uno ledbar i2c tc74 74hc595 1.png
Распиновка сдвигового регистра 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

 1 #include <Wire.h>                              // Подключаем библиотеку Wire
 2 
 3 #define SER   8                                // Контакт для ввода последовательных данных в сдвиговый регистр
 4 #define LATCH 9                                // Тактовый контакт для регистра данных (контакт-защелка) 
 5                                                // служит для одновременного вывода полученных последовательных данных  
 6                                                // на параллельные выходы сдвигового регистра
 7 #define CLK   10                               // Тактовый контакт для сдвигового регистра
 8                                                // При подаче HIGH происходит запись одного бита в сдвиговый регистр
 9 
10 int vals[8] = {1,3,7,15,31,63,127,255};        // возможные значения для регистра сдвига 
11 
12 int temp_address = 72;                         // Адрес(1001000) I2C-датчика температуры TC74A0-5.0VAT в десятичной нотации
13 
14 void setup()
15 {
16   Serial.begin(9600);                          // Инициализация передачи по последовательному порту на скорости 9600 бод
17   Wire.begin();                                // Создание объекта Wire
18  
19   // Установка выводов как выходов
20   pinMode(SER, OUTPUT);
21   pinMode(LATCH, OUTPUT);
22   pinMode(CLK, OUTPUT);
23 }
24 
25 void loop()
26 {
27   // Отправка запроса
28   Wire.beginTransmission(temp_address);        // Выбор ведомого устройства отправкой его адреса
29   Wire.write(0);                               // Отправка 0, тем самым указывая что мы хотим прочитать данные из регистра температуры нашего датчика
30   Wire.endTransmission();                      // Отправка стоп-бита, тем самым сообщаем об окончании записи на устройство
31   
32   // Чтение температуры с датчика 
33   Wire.requestFrom(temp_address, 1);           // Запрос 1 байта по адресу устройства 
34   while(Wire.available() == 0);                // Ожидаем ответа
35   int c = Wire.read();                         // Чтение данных в переменную 
36  
37   int graph = map(c, 24, 31, 0, 7);            // Масштабирование значений для светодиодной гистограммы
38   graph = constrain(graph,0,7);                // Накладываем ограничение на диапазон возможных значений
39 
40   digitalWrite(LATCH, LOW);                    // устанавливаем LATCH в LOW, чтобы значения на параллельных выходах
41                                                // сдвигового регистра не изменялись во время ввода последовательных 
42                                                // данных
43   shiftOut(SER, CLK, MSBFIRST, vals[graph]);   // ввод последовательных данных в сдвиговый регистр
44   digitalWrite(LATCH, HIGH);                   // устанавливаем LATCH в HIGH для вывода значений
45                                                // на параллельные выводы сдвигового регистра
46  
47   int f = round(c * 9.0 / 5.0 + 32.0);         // Переводим Цельсии в Фаренгейты и округляем результат
48  
49   // Передаем считанную температуру в последовательный порт
50   Serial.print(c);
51   Serial.print("C,");
52   Serial.print(f);
53   Serial.print("F.");
54  
55   delay(500);                                  // Задержка 500 мс.
56 }

Код для Processing

  • Сохраните код проекта;
  • Перейдите в Tools -> Create Font;
  • Выберете понравившийся шрифт и укажите в поле Size размер шрифта равным примерно 200;
  • При желании вы можете дать свое название шрифту в поле Filename;
  • Скопируйте текст из поля Filename в буфер;
  • Нажмите OK;
  • Вставьте из буфера и замените AgencyFB-Bold-200.vlw в коде(14 строчка) на название вашего шрифта;
 1 import processing.serial.*;
 2 Serial port;
 3 String temp_c = "";
 4 String temp_f = "";
 5 String data = "";
 6 int index = 0;
 7 PFont font;
 8 
 9 void setup()
10 {
11   size(400,400);
12   port = new Serial(this, "COM5", 9600);            // Измените "COM5" на номер порта к которому подключена ваша плата Arduino
13   port.bufferUntil('.'); 
14   font = loadFont("AgencyFB-Bold-200.vlw");         // Измените "AgencyFB-Bold-200.vlw" на тот шрифт который вы создали
15   textFont(font, 200);
16 }
17 
18 void draw()
19 {
20   background(0,0,0);
21   fill(46, 209, 2);
22   text(temp_c, 70, 175);
23   fill(0, 102, 153);
24   text(temp_f, 70, 370);
25 }
26  
27 void serialEvent (Serial port)
28 {
29   data = port.readStringUntil('.');
30   data = data.substring(0, data.length() - 1);
31  
32   index = data.indexOf(",");                        // Ищем в строке позицию символа ','(запятая)
33   temp_c = data.substring(0, index);                // Сохраняем градусы Цельсия
34   temp_f = data.substring(index+1, data.length());  // Сохраняем градусы Фаренгейта
35 }

См.также

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