Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

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

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

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


Ambox content.png Черновик


Чтение данных с 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. }

См.также

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