Интерфейс i2c Ардуино, сканер i2c шины (scl sda)

I2C Arduino (i2c — Inter-Integrated Circuits) — это протокол последовательной связи по двум линиям связи. Эти линии также называются: шина SDA (последовательные данные) и шина SCL (последовательный тактовый генератор). Порты SDA и SCL Ардуино подтягиваются к шине питания микроконтроллера через резисторы. Рассмотрим, что такое шина i2c Arduino Nano и как подключить к плате Ардуино несколько устройств по интерфейсу i2c.
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- lcd 1602 i2c дисплей
- модуль rtc ds1307 i2c
- коннекторы
- библиотека LiquidCrystal_I2C.h и iarduino_RTC.h
- Подключение устройств по шине SPI к Arduino
- Порты коммуникации на Arduino Uno, Nano, Mega
- Язык программирования Ардуино C++
Микроконтроллеры Arduino используют два контакта для работы i2c. В Arduino Uno и Nano линия SDA соответствует аналоговому порту A4, а SCL — аналоговому порту A5. В Ardunio Mega линия SDA — это 20 вывод, а линия SCL — 21 вывод. Чтобы облегчить работу с шиной i2c и обмен данными между устройствами, для IDE Arduino написана стандартная библиотека Wire (скачивать и устанавливать библиотеку не требуется).
Протокол интерфейс i2c Ардуино: описание

Каждому устройству при подключении к микроконтроллеру по протоколу i2c присваивается уникальный адрес (можно подключить до 127 устройств). Изменить адрес устройства на шине невозможно, так как он встроен в микросхему. Часто производители модулей предлагают возможность изменения адреса устройства в небольшом диапазоне, что позволяет подключить к шине iic Arduino несколько одинаковых устройств одновременно.
I2C scanner Arduino (сканер шины i2c)

| LCD 1602 i2c | Arduino Uno | Arduino Nano | Arduino Mega |
| GND | GND | GND | GND |
| VCC | 5V | 5V | 5V |
| SDA | A4 | A4 | 20 |
| SCL | A5 | A5 | 21 |
Следующая программа позволяет узнать адреса всех устройств, подключенных к шине i2c. Если устройство не было подключено или подключено неправильно, на мониторе порта появится сообщение о том, что устройство не найдено. Вместо дисплея можно подключить любое устройство, поддерживающее связь с микроконтроллером по протоколу iic — модуль часов реального времени DS1302, датчик атмосферного давления BMP180 и т.д.
Скетч для сканирования шины I2C Arduino
#include "Wire.h" void setup() < Wire.begin(); Serial.begin(9600); >void loop() < byte error, address; int nDevices; Serial.println("Scanning. "); nDevices = 0; for(address = 8; address < 127; address++ )< Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0)< Serial.print("I2C device found at address 0x"); if (address < 16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; >else if (error == 4) < Serial.print("Unknow error at address 0x"); if (address < 16) Serial.print("0"); Serial.println(address,HEX); >> if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); >
Подключение несколько устройств к шине i2c Ардуино

| DS1307 i2c | Arduino Uno | Arduino Nano | Arduino Mega |
| GND | GND | GND | GND |
| VCC | 5V | 5V | 5V |
| SDA | A4 | A4 | 20 |
| SCL | A5 | A5 | 21 |
В следующем примере два устройства: дисплей 1602 и модуль часов времени будут подключены к шине IIC. После сборки схемы можно провести предварительное сканирование шины, используя программу, размещенную выше. Адреса всех устройств различны, и можно изменить только iic адрес жк дисплея 1602 i2c. Для остальных устройств адреса «жестко привязаны» и используются в библиотеках по умолчанию.
Скетч несколько устройств на i2c, scanner i2c шины
#include "Wire.h" #include "LiquidCrystal_I2C.h" LiquidCrystal_I2C LCD(0x27,16,2); #include "iarduino_RTC.h" iarduino_RTC time (RTC_DS1307); // DS1307 i2C // iarduino_RTC time (RTC_DS3231); // DS3231 i2C void setup() < Serial.begin(9600); LCD.init(); LCD.backlight(); time.begin(); // 0 sec, 30 min, 18 hour, 2 date, january, 2022, wed time.settime(0, 30, 18, 2, 1, 22, 0); >void loop() < // выводим время 1 раз в секунду if (millis() % 1000 == 0) < Serial.println(time.gettime("d-m-Y, H:i:s, D")); LCD.setCursor(0,0); LCD.print(time.gettime("d M Y, D")); LCD.setCursor(4,1); LCD.print(time.gettime("H:i:s")); >>
Заключение. Мы исследовали возможность подключения нескольких i2c устройств к плате Ардуино, что будет полезно знать при разработке различных DIY проектов. Например, метеостанции на Ардуино с дисплеем и датчиком давления. Если у вас остались вопросы о сканере шины i2c или о подключении нескольких периферийных устройств по этому протоколу, не стесняйтесь оставлять их в комментариях к этой статье.
Подключение LCD дисплея к Ардуино

LCD дисплей Arduino позволяет визуально отображать данные с датчиков. Расскажем, как правильно подключить модуль QAPASS LCD к Arduino по I2C и рассмотрим основные команды инициализации и управления LCD 1602. Также рассмотрим различные функции в языке программирования C++, для вывода текстовой информации на дисплее, который часто требуется использовать в проектах Ардуино.
Как подключить к Arduino LCD без I2C
Текстовый экран 16×2 используется для вывода информации с датчиков, отображения меню или подсказок. На экране выводятся черные символы размером 5×8 пикселей. Встроенная подсветка включается подачей питания на пины модуля. Текстовый дисплей 16×2 без модуля IIC подключается к микроконтроллеру через 16 контактов. Распиновка экрана с примером подключения размещена ниже.
Для этого занятия потребуется:
- Arduino Uno / Arduino Nano / Arduino Mega;
- LCD монитор 1602 i2c;
- провода «папа-мама».

| LCD 1602 i2c | Arduino Uno | Arduino Nano | Arduino Mega |
| GND | GND | GND | GND |
| VCC | 5V | 5V | 5V |
| SDA | A4 | A4 | 20 |
| SCL | A5 | A5 | 21 |
Жидкокристаллический дисплей имеет 2 ряда по 16 символов, отсюда и его название LCD 1602. В память устройства встроено 192 знака, еще 8 знаков может определить сам пользователь. При подключении дисплея без IIC модуля потребуется использовать 6 портов общего назначения у микроконтроллера Arduino, не считая питания. Соберите схему, как на картинке выше и загрузите следующую программу в плату.
Скетч. Ардуино и LCD 1602 без I2C модуля
// подключаем библиотеку для работы с экраном #include LiquidCrystal.h> // объявляем объект, для управления дисплеем указываем пины LiquidCrystal LCD(13, 12, 11, 10, 9, 8); void setup() < LCD.begin(16, 2); // указываем количество строк и столбцов LCD.setCursor(1, 0); // ставим курсор на 1 символ первой строки LCD.print(«I LOVE»); // печатаем сообщение на первой строке LCD.setCursor(8, 1); // ставим курсор на 1 символ второй строки LCD.print(«ARDUINO»); // печатаем сообщение на второй строке > void loop()
Пояснения к коду:
- для данного примера используется стандартная библиотека LiquidCrystal.h для QAPASS, которая не поддерживает кириллицу;
- чтобы упростить схему и не использовать большое количество пинов микроконтроллера, следует использовать дисплей с модулем I2C.
Принцип работы I2C интерфейса Arduino
I2C — последовательная двухпроводная шина для связи интегральных схем внутри электронных приборов, известна, как I²C или IIC (англ. Inter-Integrated Circuit). I²C была разработана фирмой Philips в начале 1980-х годов, как простая 8-битная шина для внутренней связи между схемами в управляющей электронике (например, в компьютерах на материнских платах, в мобильных телефонах и т.д.).

В простой системе I²C может быть несколько ведомых устройств и одно ведущее устройство, которое инициирует передачу данных и синхронизирует сигнал. К линиям SDA (линия данных) и SCL (линия синхронизации) можно подключить несколько ведомых устройств. Часто ведущим устройством является контроллер Ардуино, а ведомыми устройствами: часы реального времени или LCD Display.
Как подключить LCD 1602 I2C к Arduino
Жидкокристаллический дисплей 1602 с I2C модулем подключается к плате Ардуино всего 4 проводами — 2 провода данных и 2 провода питания. Подключение QAPASS 1602a к Arduino проводится стандартно для шины I2C: вывод SDA подключается к порту A4, вывод SCL – к порту A5. Питание LCD дисплея осуществляется от порта +5V. Смотрите подробнее схему подключения жк монитора 1602 на фото ниже.

После подключения LCD монитора к Ардуино через I2C вам потребуется установить библиотеку LiquidCrystal_I2C.h для работы с LCD дисплеем по интерфейсу I2C и библиотека Wire.h (имеется в стандартной программе Arduino IDE). Скачать рабочую библиотеку LiquidCrystal_I2C.h для LCD 1602 с модулем I2C можно на странице Библиотеки для Ардуино на нашем сайте по прямой ссылке с Google Drive.
Скетч для жк дисплея QAPASS 1602 I2C
#include Wire.h> // библиотека для управления устройствами по I2C #include LiquidCrystal_I2C.h> // подключаем библиотеку для QAPASS 1602 LiquidCrystal_I2C LCD(0x27,16,2); // присваиваем имя LCD для дисплея void setup() < LCD.init(); // инициализация LCD дисплея LCD.backlight(); // включение подсветки дисплея LCD.setCursor(1, 0); // ставим курсор на 1 символ первой строки LCD.print("I LOVE"); // печатаем сообщение на первой строке LCD.setCursor(8, 1); // ставим курсор на 1 символ второй строки LCD.print("ARDUINO"); // печатаем сообщение на второй строке > void loop() < LCD.noDisplay(); // выключаем и включаем надпись на дисплее delay(1000); LCD.display(); delay(1000); >
Пояснения к коду:
- перед выводом информации на дисплей, необходимо задать положение курсора командой setCursor(0,1) , где 0 — номер символа в строке, 1 — номер строки;
- в отличии от clear() — команда noDisplay() не удаляет надпись, а отключает ее вывод на дисплее и ее можно снова показать.
Подключение двух дисплеев по I2C
По умолчанию у всех дисплеев 1602 с модулем I2C адрес — «0x27», но можно изменить адрес текстового экрана и узнать его через сканер iic шины. Таким образом, если у вас есть необходимость подключить к одному микроконтроллеру несколько дисплеев 1602, то следует изменить адреса устройств, что бы не было совпадений. Давайте рассмотрим, каким образом изменить IIC адрес жидкокристаллического дисплея.

Если перевернуть дисплей и посмотреть на IIC модуль (смотри фото выше), то там можно заметить контакты, обозначенные, как «A0», «A1» и «A2». Если по умолчанию LCD имеет адрес «0x27» на шине IIC, то замкнув перемычку «A0», адрес дисплея сменится на «0x26». Таким образом, к одной шине можно подключить несколько дисплеев, не забыв указать их адреса в скетче — смотри следующий пример кода.
Скетч. Подключение нескольких LCD 1602 к шине i2c

Перед загрузкой следующего скетча, сначала соберите схему с двумя дисплеями и просканируйте шину IIC. Это необходимо сделать, чтобы убедится в том, что плата Arduino «видит» оба устройства на шине. А также перепроверить правильность адресов. После этого можно загружать следующий код, который позволит управлять сразу двумя дисплеями с модулями IIC от одного микроконтроллера Arduino Uno.
#include Wire.h> // библиотека для шины I2C #include LiquidCrystal_I2C.h> // библиотека для 16x2 I2C LiquidCrystal_I2C LCD1(0x27, 16, 2); // присваиваем имя первому дисплею LiquidCrystal_I2C LCD2(0x26, 16, 2); // присваиваем имя второму дисплею void setup() < LCD1.init(); // инициализация первого дисплея LCD2.init(); // инициализация второго дисплея LCD1.backlight(); // включение подсветки LCD2.backlight(); // включение подсветки > void loop() < // прокручиваем надпись на первом дисплее LCD1.setCursor(1, 0); LCD1.print("I LOVE ARDUINO"); LCD1.scrollDisplayLeft(); // прокручиваем надпись на втором дисплее LCD2.setCursor(1, 0); LCD2.print("HELLO WORLD"); LCD2.scrollDisplayRight(); delay(300); >
Пояснения к коду:
- в программе у каждого дисплея имя должно быть уникальным.
Библиотека LiquidCrystal_I2C.h для LCD дисплея
В следующем примере разберем сразу несколько возможностей, которая дает библиотека LiquidCrystal_I2C Arduino (на самом деле мы взяли команды из стандартной библиотеки). Продемонстрируем вывод мигающего курсора, как убрать надпись с экрана на некоторое время без удаления и, как управлять подсветкой дисплея из кода программы. Для этого загрузите в Ардуино следующий код программы.
Скетч. Описание библиотеки LiquidCrystal_I2C.h
#include Wire.h> // библиотека для управления устройствами по I2C #include LiquidCrystal_I2C.h> // подключаем библиотеку для QAPASS 16x2 LiquidCrystal_I2C LCD(0x27,16,2); // присваиваем имя LCD для дисплея void setup() < LCD.init(); // инициализация LCD дисплея LCD.backlight(); // включение подсветки дисплея LCD.blink(); // включение мигающего курсора delay(2000); LCD.noBlink(); LCD.setCursor(1, 0); // ставим курсор на 1 символ первой строки LCD.print("I LOVE"); // печатаем сообщение на первой строке LCD.setCursor(8, 1); // ставим курсор на 1 символ второй строки LCD.print("ARDUINO"); // печатаем сообщение на второй строке delay(2000); LCD.cursor(); // включение текущей позиции курсора delay(2000); LCD.noCursor(); > void loop() < LCD.noBacklight(); // выключаем и включаем подсветку экрана delay(1000); LCD.backlight(); delay(1000); >
Пояснения к коду:
- библиотека LiquidCrystal_I2C.h содержит встроенные команды для управления LCD дисплея по шине I²C и позволяет значительно упростить скетч.
- читайте также про возможность авто прокрутки строки на дисплее Ардуино.
Заключение: Используя программы Ардуино для lcd 1602a из этой записи и схему подключения lcd 1602 к Ардуино по i2c вы сможете применять данный дисплей в проектах Ардуино с LCD и в различных примерах. Если у вас остались вопросы по использованию монитора 1602 i2c Arduino — оставляйте их в комментариях на этой странице. Возможно, то что вы ищете уже решено и есть в ответах.
Сборка схемы из модулей


Микроконтроллер – очень универсальная штука, его можно научить взаимодействовать практически с любым другим электронным устройством: аналоговые датчики, цифровые датчики, всякие разные микросхемы, дисплеи, драйверы, контроллеры… Чтобы схема работала, входящие в неё компоненты нужно правильно соединить между собой. В этом уроке мы рассмотрим подключение электронных модулей.
Электронный модуль
Модуль – это специальная удобная плата на базе какой-то микросхемы или электронного компонента. Модуль может быть датчиком, драйвером, интерфейсом, памятью, дисплеем и так далее. Зачем использовать модуль, почему не взять конкретный компонент? Если вы хотите делать электронное устройство на печатной плате – конечно же лучше собирать его из голых компонентов, а не из модулей, потому что в большинстве случаев это выйдет дешевле, а также изготовление такой платы можно заказать вместе со сборкой на производстве (например на JLCPCB). Но мы с вами собираемся сначала научиться программировать, поэтому модули имеют неоспоримые преимущества:
- Основная концепция Ардуино – электронный конструктор, быстрое и простое создание прототипов электронных устройств без помощи паяльника.
- Микросхема очень маленькая, подключать её к чему-то – не очень приятная затея. У модуля выведена рейка для подключения проводов и работы на макетной плате.
- Чтобы подключить голую микросхему – понадобится изучить документацию. У модуля все нужные для подключения пины выведены и подписаны.
- Для корректной работы большинства микросхем требуются дополнительные компоненты (драйверы, контроллеры, резисторы, стабилизаторы, конденсаторы, индуктивности, кварцевые генераторы), посчитанные, выбранные и установленные согласно документации. На плате модуля всё это уже есть.
- У некоторых модулей на плате предусмотрена настройка: крутилки, джамперы, переключатели, перемычки для спайки паяльником.
Макетная плата
Макетная плата, она же макетка или брэдборд (breadboard) – самый удобный способ создания электронных макетов. Отверстия расположены со стандартным шагом 2.54мм, внутри каждого – пружинная клемма. Это позволяет вставлять в плату любые Arduino-модули, а также микросхемы в DIP корпусах.
Для соединения отверстий в пределах макетки используются провода штырёк-штырёк, рекомендую вариант с цилиндрическими штекерами (я пользуюсь одним комплектом на протяжении уже 5-ти лет). Также существуют провода с квадратными штекерами, они есть в вариантах гнездо-гнездо, гнездо-штырёк и штырёк-штырёк. Эти провода менее качественные, но вариант гнездо-штырёк позволяет подключить модуль к макетке, не втыкая модуль в макетку:

Что происходит на этом фото и как работает брэдборд? Очень просто! Контакты в нём соединены следующим образом:

“Простые” модули
Цифровые
Простые цифровые модули имеют два пина питания и пин с логическим выходом, он может быть подписан как OUT, S, D или DO. Плата таких модулей имеет синий цвет и содержит типовую схему – крутилка (синий корпус) и операционный усилитель (чёрная микросхема рядом с крутилкой). Такой модуль выдаёт только два состояния: датчик “сработал” и “не сработал”, на цифровом выходе появляется соответственно VCC (напряжение питания) или 0 Вольт, т.е. высокий и низкий цифровой сигнал. Крутилка на плате позволяет настроить порог срабатывания. Такие датчики подключаются к питанию и любому цифровому пину (GPIO). Опрашиваются стандартными средствами Arduino.
Примеры на картинке ниже: датчик звука, температуры, освещённости, приближения, магнитного поля.
Аналоговые
У аналоговых модулей помимо питания есть аналоговый выход, может быть маркирован как OUT, S, A или AO. Такие модули выдают аналоговый сигнал, пропорциональный показанию датчика. Подключаются к питанию и любому аналоговому пину (ADC) и опрашиваются стандартными средствами Arduino.
Примеры на картинке ниже: датчик звука, уровня жидкости, индуктивный датчик влажности почвы, обычный датчик влажности почвы, потенциометр (просто крутилка).
Смешанные
Некоторые модули имеют цифровой и аналоговый выходы одновременно, пины у них обычно подписаны как DO – цифровой выход и AO – аналоговый. Крутилка на плате настраивает порог срабатывания у цифрового выхода, а аналоговый просто выдаёт “сырой” сигнал с датчика. Опрашиваются как цифровые и аналоговые датчики соответственно.
Общая схема для всех перечисленных выше типов модулей:

Примеры на картинке ниже: датчик вибрации, звука, магнитного поля, влажности почвы и освещённости.
KY-модули
Существует также целое семейство модулей с названием KY-цифра, это самые дешёвые модули на чёрных платах. Среди них есть и цифровые, и аналоговые, и интерфейсные датчики, а также индикация (светодиоды, пищалки) и реле. Проблема в том, что пины почти у всех плат подписаны одинаково:
- – (минус) – минус, GND
- Средний пин без подписи – плюс, VCC
- S – сигнал

Сигналом здесь может быть как исходящий из датчика цифровой или аналоговый сигнал, так и цифровой сигнал управления, который нужно подать на модуль с микроконтроллера. Обязательно читайте описание к модулю такого типа, если не знаете, что делает компонент на его плате!

Интерфейсные модули
Некоторые модули имеют один или несколько логических выходов и передают данные по цифровому интерфейсу связи. Сигнальные пины таких датчиков могут быть подписаны как SCK, SDA, SCL, MISO, MOSI, SS и прочими аббревиатурами, отличными от OUT, как в “простых” модулях. Подключаются такие модули к пинам интерфейсов (подробнее в этом уроке) на плате и опрашиваются при помощи сторонних библиотек. Для работы с такими модулями нужно найти в интернете статью с описанием и примерами. Подробное описание к некоторым популярным модулям можно найти в базе примеров к набору GyverKIT, а также у меня в каталоге ссылок на Ардуино-компоненты. Примеры таких модулей:
Давайте вкратце рассмотрим самые распространённые интерфейсы и особенности подключения модулей с ними. Напомню распиновку плат Arduino Nano и Wemos Mini:

UART
- Названия пинов:
- TX
- RX
- Подключение осуществляется “наоборот”: RX -> TX, TX -> RX
I2C (Wire)
- Названия пинов (в скобках указаны варианты надписей на плате модуля):
- SDA (D)
- SCL (C, SCK)
- Подключение осуществляется в пины с таким же названием, смотрите распиновку своей платы

SPI
- Названия пинов (в скобках указаны варианты надписей на плате модуля):
- MOSI (SDI, DI, DIN, SI)
- MISO (SDO, DO, DON, SO)
- SCLK (SCK, CLK, SPC)
- CS (SS, RCK) – на любой GPIO
- Подключение осуществляется в пины с таким же названием (за исключением CS)

Полезные страницы
- Набор GyverKIT – большой стартовый набор Arduino моей разработки, продаётся в России
- Каталог ссылок на дешёвые Ардуины, датчики, модули и прочие железки с AliExpress у проверенных продавцов
- Подборка библиотек для Arduino, самых интересных и полезных, официальных и не очень
- Полная документация по языку Ардуино, все встроенные функции и макросы, все доступные типы данных
- Сборник полезных алгоритмов для написания скетчей: структура кода, таймеры, фильтры, парсинг данных
- Видео уроки по программированию Arduino с канала “Заметки Ардуинщика” – одни из самых подробных в рунете
- Поддержать автора за работу над уроками
- Обратная связь – сообщить об ошибке в уроке или предложить дополнение по тексту ([email protected])
How to Connect Multiple I 2 C devices to an Arduino Microcontroller
In this project, we will show how to connect multiple I 2 C devices to an arduino microcontroller.
The I 2 C bus is a bus which enables high-speed two-way communication between devices while using a minimal number of I/O pins to facilitate communication.
An I 2 C bus is controlled by a master device (usually a microcontroller) and contains one ore more slave devices that receive information from the master device.
The I 2 C protocol was created by Phillips in the early 1980s and was standardized and adopted widespread in the 1990s. The protocol is known as the «two-wire» protocol because 2 lines are used for communication. These 2 lines are the clock line and data line.
I 2 C protocol can use multiple devices that all share the same communication lines: a clock signal (SCL) and a bidirectional data line used for sending information back and forth between the master and slave (SDA).
In order to work, the 2 lines of the I 2 C, the clock and data lines, need pull-up resistors to the positive voltage source.
The I 2 C bus allows multiple slave devices to share communication lines with a single master device. The Arduino acts as the master device. The bus master is responsible for initiating all communications. Slave devices cannot initiate communications; they only respond to requests that are sent by the master device. This prevents multiple slave devices from all trying to communicate at the same thing, causing garbled messages.
When a command or request is sent out by the master device, it is received by all slave devices on the bus. Each I 2 C device has a unique 7-bit address, or ID number. When communication is initiated by the master device, a device ID is transmitted. I 2 C slave devices react to data on the bus only when it is drected at their ID number. Since all the devices are receiving all the data transmitted by the master device, each device has to have a unique ID number so that the master can speak to a particular slave device.
Some I 2 C devices have selectable addresses whereas others come form the manufacturer with a fixed address.
An example of an I 2 C device that has fixed addresses is the TC74 temperature sensor. This means that the addresses are fixed by the manufacturer. However, just because it is fixed doesn’t mean you can’t have multiple TC74 sensors connected together. It’s possible to connect possible sensors to an I 2 C bus by purchasing this IC with eight different ID numbers. So you could connect up to eight of them on a single bus. Each of the 8 lines having different addresses.
Other I 2 C, such as the AD7414 and AD7415, have address select (AS) pins that allow you to configure the I 2 C address of the device.
- The Master device sends a start bit
- The Master sends 7-bit slave address of the slave device it wants to talk to
- The Master sends a read (1) or write (0) bit depending on whether it wants to write data into an I 2 C device’s register or if it wants to read from one of the I 2 C device’s registers.
- The Slave device then responds with an «acknowledge» or ACK bit (a logic low)
- In write mode, the master sends 1 byte of information at a time, and slave responds with ACKs. In read mode, the master receives 1 byte of information at a time and sends an ACK to the slave after each byte
- When communication has been completed, the master sends a stop bit
- TC74A0-5.0VAT sensor
- TC74A1-5.0VAT sensor
- 2 4.7KΩ resistors
- Arduino microcontroller
The TC74 temperature we use specifically is the TC74A0-5.0VAT and the TC74A1-5.0VAT sensor.
These sensors both run on 5V on power.
The only difference between these sensors is that they have addresses. Being that we are connecting 2 TC74 sensors to an arduino, they need to have distinguishable addresses so that the arduino can differentiate how to communicate with each of these sensors. If we bought 2 TC74A0s, they would have the same address
The TC74 sensor has 5 pins.

The NC pin is just a Not Connected pin. It doesn’t connect to our circuit.
The SDA is the serial data pin. This is how the arduino microcontroller and the temperature sensor share data with each other. Data is shared bidirectionally.
The third pin is the power ground pin.
The fourth pin is the SCLK pin. This allows for communication on a clock signal.
And the fifth pin is VDD, which gets connected +5V.
Circuit Connecting 2 I 2 C TC74 Temperature Sensors to an Arduino Microcontroller
The I 2 C temperature sensors circuit we will build with an Arduino is shown below.

In this circuit, the hardware connections are very simple.
Pin 1 is NC, which means Not Connected. So we leave that pin unconnected.
Pin 2 is the SDA pin, which is the Serial Data pin. This transmits data bidirectionally between the master device and the slave device. Both SDA pins of the 2 sensors connect to analog pin 4 on the arduino.
Pin 3 is the power ground, so they connect to the ground terminal of the arduino.
Pin 4 is the SCLK pin, which is the Serial Clock pin. This pin clocks data into and out of the TC74 sensor. Both SCLK pins of the 2 sensors connect to pin 4 on the arduino.
Pin 5 is the VDD pin, which is the positive voltage power source for the sensor. These are tied together from both sensors and connect to the +5V pin of the arduino.
And these complete the hardware connections from the arduino microcontroller to the I 2 C sensors.
Code
The code so that we can connect the I 2 C TC74 sensors to an arduino microcontroller is shown below.
Arduino’s I 2 C communication library is called the Wire library. With this library, you can easily write to and read from I 2 C devices.
int address_sensor1= 72; //binary equivalent is 1001000
int address_sensor2= 73; //binary equivalent is 1001001
Serial.begin(9600); //this creates the Serial Monitor
Wire.begin(); //this creates a Wire object
>void loop() Wire.beginTransmission(address_sensor1); //Send a request to begin communication with the device at the specified address
Wire.write(0); //Sends a bit asking for register 0, the data register of the TC74 sensor
Wire.endTransmission(); //this ends transmission of data from the arduino to the temperature sensor
//this now reads the temperature from the TC74 sensor
Wire.requestFrom(address_sensor1, 1); //this requests 1 byte from the specified addresswhile(Wire.available() == 0);
int celsius1= Wire.read();int fahrenheit1= round(celsius1 * 9.0/5.0 + 32.0);
Serial.print(«Temperature sensor 1:»);
Serial.print(celsius1);
Serial.print(«degrees celsius «);
Serial.print(fahrenheit1);
Serial.print(» degrees Fahrenheit»);delay(2000);
Wire.beginTransmission(address_sensor2); //Send a request to begin communication with the device at the specified addressWire.write(0); //Sends a bit asking for register 0, the data register of the TC74 sensor
Wire.endTransmission(); //this ends transmission of data from the arduino to the temperature sensor
//this now reads the temperature from the TC74 sensor
Wire.requestFrom(address_sensor2, 1); //this requests 1 byte from the specified addresswhile(Wire.available() == 0);
int celsius2= Wire.read();int fahrenheit2= round(celsius2 * 9.0/5.0 + 32.0);
Serial.print(«Temperature sensor 2:»); Serial.print(celsius2);
Serial.print(«degrees celsius «);
Serial.print(fahrenheit2);
Serial.print(» degrees Fahrenheit»);First, we import the Wire library, which is the library for communicating with I 2 C devices.
Next, we initialize the value of the address which we want to communicate. The TC74 sensors that run on 5V comes in 8 different IC packages. These are TC74A0 to TC74A7. Depending on which TC74 sensor you use determines the address that we will initialize to. The TC74 datasheet has all the addresses listed for all the various TC74s. Therefore, you just need to look up the address on the datasheet. Being that we are using a TC74A0, the address is 1001000; the decimal equivalent of this is 72. Therefore, we initialize the first address to 72. For the TC74A1 sensor, the address is 1001001; the decimal equivalent of this is 73. Therefore, we initialize the second address to 73. Therefore, we can now address both sensors independently.
Next, we have the setup() function. This creates the Serial monitor where we can see the reading of our temperature. And we create a Wire object, which allows for communication between the master and slave devices.
Next, we have our loop() function. We begin a transmission in which we communicate with the first sensor at the address we initially specified. This allows the master device to communicate with that slave device (at that address). Since we specify the first address, which is sensor 1 (address 72), we communicate first with that sensor. Next, we communicate with the second sensor (at address 73).
Next, we send a bit asking for register 0 of the TC74, which is the data register of the sensor. We will then read from this data register to find out the temperature. We then end the transmission of data from the master to the slave device.
We then request 1 byte from the TC74 sensor. This value will come in the value celsius. We then calculate the fahrenheit based on this celsius value. And then print out the values in both celsius and fahrenehit.
We give 2-second delay for the next sensor.
We then repeat the same process for the second sensor. We create a print statement as «Temperature Sensor 2:» so that we know it’s the second sensor. We did the same for the first sensor.
With a circuit such as this, we can address each of the sensor, obtain temperatures with each of the sensors, so that we can see whether they are similar in output. If we have another device that’s measuring the temperature that is highly accurate, we can see which of the TC74 sensors are closer in value to that temperature sensor. It’s a way we can gauge which temperature sensor is more accurate.
And this is how multiple I 2 C devices can be connected to an arduino microcontroller.