Микросхемы расширения портов ввода вывода. Как расширить количество аналоговых входов и выходов на вашем Arduino

Новые статьи

● 5.4. Расширение цифровых портов для NodeMCU ESP8266 с помощью микросхемы MCP23017

Введем светодиодную индикацию и звуковую сигнализацию и при использовании в качестве контроллера умного дома модуля Nodemcu. Количество выводов у модуля Nodemcu гораздо меньше, чем у Arduino Mega, поэтому нам понадобится микросхема расширителя входов MCP23017. Микросхема MCP23017 добавляет 16 портов,которые можно настроить как на вход,так и на выход (рис. 5.7). Микросхема использует популярную двухпроводную шину I2C.

Рис. 5.7. Выводы микросхемы MCP23017

Адрес микросхемы MCP23017 для протокола I2C можно установить комбинацией сигналов на цифровых входах A0 - A2 (рис. 5.8), что позволяет к микроконтроллеру подключиь одновременно 8 микросхем MCP23017, соответственно 16*8=128 контактов.

Рис. 5.8. Установка адреса микросхемы MCP23017

Микросхема имеет 2 банка портов A (GPA0- GPA7) и B (GPB0- GPAB), каждый из которых можно настроить на ввод или вывод.
В листинге 5.3. показан пример настройки банков выводов A и B.

Листинг 5.3

// подключение библиотеки Wire.h #include byte input=0 ; void setup () { Serial.begin(9600 ); Wire.begin(0 ,2 ); // запуск I2C Wire.beginTransmission(0x20 ); // i2c - адрес (A0-0,A1-0,A2-0) Wire.write(0x00 ); // IODIRA register Wire.write(0x00 ); // настроить PORT A как output Wire.endTransmission(); } void loop () { // чтение данных из PORT B Wire.beginTransmission(0x20 ); Wire.write(0x13 ); Wire.endTransmission(); Wire.requestFrom(0x20 , 1 ); input=Wire.read(); // записать полученные данные в PORT A Wire.beginTransmission(0x20 ); Wire.write(0x12 ); // address PORT A Wire.write(input); // PORT A Wire.endTransmission(); delay(100 ); // пауза }

Использование микросхемы MCP23017 позволит расширить количество цифровых контактов модуля Nodemcu на 16 и позволит организовать светодиодную индикацию и звуковую сигнализацию о критических параметрах датчиков.

Всем хороши недорогие платы Arduino, но так часто для проекта не хватает буквально одного-двух свободных портов! А иногда портов хватает, но не хочется тянуть к другой части конструкции пучок проводов. Допустим, на передней панели устройства надо разместить несколько кнопок и светодиодов. Надежнее и проще соединить их с основной платой всего двумя проводами шины данных, а не шлейфом или жгутом, не так ли?

Для таких ситуаций предназначены различные расширители (экспандеры) портов Arduino.

Обычно выводы микроконтроллера реализуют несколько различных функций, поэтому расширители бывают разные:

  1. Расширитель стандартных портов ввода-вывода GPIO
  2. Расширитель выходов ШИМ
  3. Расширители аналоговых входов – мультиплексоры и внешние АЦП

Отдельно стоит упомянуть цифро-аналоговые преобразователи (ЦАП) и расширители адресного пространства шины I2C. Эти устройства не дублируют функции портов напрямую, но расширяют возможности микроконтроллеров.

В первой статье цикла мы поговорим о самых простых и полезных экспандерах, которые работают в качестве цифровых портов ввода-вывода. Это микросхемы и . Они устроены и работают абсолютно идентично, и различаются только количеством портов.

Выбираем модуль расширителя для Arduino

Самый популярный и недорогой модуль изготовлен на микросхеме PCF8574 (рис. 1)

Рис. 1. Популярный модуль расширителя портов PCF8574

Достоинства:
  • Низкая цена.
  • Модули можно соединять цепочкой, просто вставляя штекеры одного модуля в гнезда предыдущего. Не забудьте установить перемычками разные адреса модулей!
Недостатки:
  • Нельзя вставить прямо в макетную плату (рекомендую перепаять разъем портов на обратную сторону).
  • Всего восемь портов в одном модуле.

Если вы настроены на более серьезные проекты, закажите на Aliexpress 16-разрядный модуль на PCF8575 . Настоятельно рекомендую именно модуль, изображенный на рис. 2.

Рис. 2. Модуль расширителя портов PCF8575

Достоинства:
  • Вдвое больше портов.
  • Встроенный источник питания на 3.3 вольта, можно питать другие модули.
  • Встроенное согласование логических уровней для шины I2C при разном напряжении питания.
  • Удобный формат для макетной платы.
Недостатки:
  • Выше цена.

Принцип работы расширителя портов GPIO PCF8574/PCF8575

Обмен данными происходит по шине I2C. Для подключения к плате Arduino требуется лишь четыре провода, включая питание. Адрес расширителя задается тремя перемычками на входах A0…A2, поэтому к шине можно одновременно подключить восемь одинаковых микросхем и получить максимум 8*8=64 дополнительных порта с PCF8574 или 8*16=128 с микросхемой PCF8575.

Чтобы вывести данные в порт, записывают байт данных по адресу модуля на шине I2C. Чтобы прочитать данные с порта, читают байт по этому же адресу. Байт всегда пишется и читается целиком, работа с отдельными разрядами происходит программно.

Выходы микросхемы одновременно являются входами, и никакого служебного регистра, определяющего назначение вывода, нет. Есть только регистр-защелка, в который записывают выходной байт. Как такое возможно?

Порты работают по схеме, аналогичной открытому коллектору и оснащены внутренними подтягивающими резисторами. Если в выход записан логический ноль, то открывается выходной транзистор, который принудительно тянет вывод «на землю». Чтение из такого порта всегда будет возвращать ноль.

Будьте осторожны – при подаче прямого напряжения питания на вывод с низким уровнем или при превышении допустимого тока 50 мА вы испортите микросхему!

Чтобы использовать порт как вход, запишите в него единицу. В этом случае внутренний транзистор будет закрыт, а результат чтения будет определяться внешним логическим уровнем, приложенным к выводу. Свободный вывод подтянут к питанию встроенным резистором.

Чтобы одновременно использовать часть портов как входы, а часть как выходы, перед каждой записью байта данных в экспандер необходимо при помощи операции «логическое ИЛИ» накладывать маску из единиц на те разряды, которые соответствуют входам. Вот и все)))

Генерация прерывания

Расширители портов PCF857* генерируют импульс прерывания низкого уровня на выходе INT при любом изменении входного сигнала на любом входе микросхемы. Это удобно, если расширитель обслуживает кнопочную панель. Но вы должны сами определить в обработчике прерывания, какая кнопка была нажата или отпущена. Генератор прерывания оснащен фильтром подавления дребезга контактов.

Пример 1. Использование модуля PCF8574

Соберем простую схему из четырех светодиодов, модуля PCF8574 и платы Arduino (рис. 3 и 4). При такой схеме включения нам даже не требуются гасящие резисторы для светодиодов. Ток протекает через светодиод и встроенный резистор, подключенный к шине питания.

Рис. 3. Схема подключения модуля PCF8574

Рис. 4. Макет схемы с модулем PCF8574

Скопируйте и запишите в плату Arduino скетч 1:

// Адрес модуля на шине (A0, A1, A2 = 0) int address = 0x38; // Данные, прочитанные из модуля uint8_t dataReceive; // Данные для записи в модуль uint8_t dataSend; void setup() { Wire.begin(); Serial.begin(9600); // Высокий уровень во все порты PCF8574 dataSend = B11111111; pcf8574_write(dataSend); } void loop() { // Читаем байт из модуля dataReceive = pcf8574_read(); // Выводим в монитор в двоичном формате Serial.println(dataReceive, BIN); // Сдвигаем биты влево на полубайт dataSend = dataReceive << 4; // Накладываем битовую маску dataSend |= B00001111; // Записываем байт в модуль pcf8574_write(dataSend); delay(500); } // Процедура записи байта в модуль void pcf8574_write(uint8_t dt) { Wire.beginTransmission(address); Wire.write(dt); Wire.endTransmission(); } // Процедура чтения байта из модуля int8_t pcf8574_read() { Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(address, 1); return (Wire.read()); }

Во все порты микросхемы изначально записывается высокий уровень, поэтому порты P0…P3 могут работать, как входы.

Уровни на выводах порта считываются каждые 500 мс и результат считывания выводится в монитор. Если вы соединяете один из входов P0…P3 с общим проводом, в его разряде появляется ноль. Затем считанное значение сдвигается влево на четыре бита, результат выводится в порт и гаснет один из светодиодов. Например, если прочитан ноль на выводе P0, то погаснет светодиод, подключенный к выводу P4.

Обратите внимание, что мы должны перед каждой записью в расширитель наложить битовую маску из единиц на все разряды, которые должны быть входами: dataSend |= B00001111;

Подпрограммы работы с шиной I2C предельно упрощены, никакие ошибки не обрабатываются.

Совет: для поиска и проверки адреса модуля на шине I2C можно использовать . Он выводит в терминал адреса всех устройств, которые отвечают на запрос шины.

Пример 2. Использование модуля PCF8575

Особенность модуля PCF8575 состоит в том, что у него 16 портов, поэтому в него всегда записывают по два байта и читают по два байта . Это правило надо соблюдать, даже если второй байт не нужен.

Немного изменим схему. Светодиоды подключим к портам P10…P13, а соединять перемычкой с общим проводом будем порты P00…P03 (рис. 5 и 6).

Рис. 5. Схема подключения модуля PCF8575

Рис. 6. Макет схемы с модулем PCF8575

В скетче 2 сначала записываются единицы во все порты, затем каждые 500 мс читается их состояние. Процедура чтения возвращает 16-разрядное слово, которое разделяется на байты. Содержимое младшего байта (выводы P00…P07) копируется в старший байт и выгружается обратно в модуль. Если соединить с общим проводом один из выводов P00…P03, то погаснет один из светодиодов, подключенных к P10…P13.

// Библиотека для работы с I2C #include // Адрес модуля на шине по умолчанию int address = 0x20; // Данные, прочитанные из модуля uint8_t hi, lo; uint16_t dataReceive; uint8_t dataHighByte; // Старший байт (P10...P17) uint8_t dataLowByte; // Младший байт (P00...P07) void setup() { Wire.begin(); Serial.begin(9600); // Высокий уровень во все порты PCF8575 dataHighByte = B11111111; dataLowByte = B11111111; pcf8575_write(dataLowByte, dataHighByte); } void loop() { // Читаем байт из модуля dataReceive = pcf8575_read(); // Выводим в монитор в двоичном формате Serial.println(dataReceive, BIN); // Выделяем младший байт из длинного слова dataLowByte = lowByte(dataReceive); // Копируем младший байт в старший байт dataHighByte = dataLowByte; // Накладываем маску на младший байт dataLowByte |= B11111111; // Записываем новые данные в модуль, два байта pcf8575_write(dataLowByte, dataHighByte); delay(500); } // Процедура записи байта в модуль void pcf8575_write(uint8_t dtl, int8_t dth) { Wire.beginTransmission(address); Wire.write(dtl); // Записываем младший байт (P00...P07) Wire.write(dth); // Записываем старший байт (P10...P17) Wire.endTransmission(); } // Процедура чтения байта из модуля int16_t pcf8575_read() { Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(address, 2); lo = Wire.read(); // Читаем младший байт (P00...P07) hi = Wire.read(); // Читаем старший байт (P10...P17) return (word(hi, lo)); // Возвращаем длинное слово }

Библиотека Arduino для PCF8574/PCF8575

Библиотеку можно скачать на GitHub . Но, как вы могли видеть, работа с расширителями портов очень проста и можно легко обойтись без специальной библиотеки.

Тринадцать цифровых линий и шесть аналоговых входов – это все, что может предложить Arduino в качестве средств ввода/вывода. Но в некоторых случаях (особенно в проектах с большим количеством периферийных устройств) такого набора линий портов недостаточно.



В связи с этим встает вопрос о целесообразности расширения количества линий ввода/вывода. В данном материале будет показан пример такого расширения с помощью микросхемы MCP23017.


Возможно, вы знаете, что 6 аналоговых контактов также могут использоваться как цифровые линии ввода/вывода таким образом:


Аналоговый вход 0 = линия 14
Аналоговый вход 1 = линия 15
Аналоговый вход 2 = линия 16
Аналоговый вход 3 = линия 17
Аналоговый вход 4 = линия 18
Аналоговый вход 5 = линия 19

То есть на самом деле мы можем ссылаться на аналоговый вход 5 как на цифровую линию следующим образом: digitalWrite(19,HIGH). Такая команда запишет логическую единицу в порт 19, то есть аналоговую линию 5.


Технически мы можем использовать линии последовательного порта TX/RX. Но в некоторых случаях это сделать крайне затруднительно, особенно когда в коде используются функции типа Serial.begin(), нужные для работы последовательного порта. Таким образом, общее количество контактов, доступных для пользователя, все же будет 17. Но разве можно с семнадцатью выводами управлять большим количеством светодиодов или сервомоторов? В этом случае лучше воспользоваться специальными внешними микросхемами. Зачастую в этих целях используют сдвиговый регистр вроде 74HC595. Но он требует три дополнительных линии для управления и не позволяет одновременно «расширить» все линии. Дисплейные драйверы, такие как MAX7219 тоже фактически «расширяют» количество контактов. Но MAX7219 является дорогостоящей микросхемой. Поэтому дешевле и рациональнее взять микросхему расширителя портов MCP23017. Эта микросхема рассчитана на 16 линий, имеет широкий диапазон рабочего напряжения от 1.8 до 5.5 В и управляется по интерфейсу I2C.


MCP23017 будет использовать 2 контакта Arduino и даст 16 линий ввода/вывода. Так что технически вы можете использовать 8 штук MCP23017 для расширения одного 16-контактного Arduino до 16 x 8 = 128 контактов. Arduino имеет библиотеку для шины I2C под названием Wire.h, поэтому взаимодействие с MCP23017 будет очень простым. Ниже приведена схема подключения Arduino и MCP23017.




#include "Wire.h" void setup() { Wire.begin(); // активируем шину I2C // устанавливаем линии на выход Wire.beginTransmission(0x20); Wire.write(0x00); // регистр IODIRA Wire.write(0x00); // устанавливаем все линии порта A на выход Wire.endTransmission(); } void loop() { Wire.beginTransmission(0x20); Wire.write(0x12); // адресный банк A Wire.write((byte)0xAA); // отправляемое значение - все линии в лог. 1 Wire.endTransmission(); delay(500); Wire.beginTransmission(0x20); Wire.write(0x12); // адресный банк A Wire.write((byte)0x55); // отправляемое значение - все линии в лог. 1 Wire.endTransmission(); delay(500); }

Описание Expander Shield

Expander Shield – оригинальный дополнительный модуль, предназначенный для увеличения количества портов ввода/вывода микроконтроллеров на базе платформы Arduino, а также других микроконтроллеров, используя расширители портов с SPI или I2C интерфейсом.


Основным элементами дополнительного модуля Expander Shield являются две микросхемы MCP23S17 или MCP23017 (два 16-разрядных расширителя портов ввода/вывода с SPI или I2C интерфейсом, соответственно), позволяющие добавить четыре 8-битных порта ввода/вывода, то есть 32 дополнительных "ноги".

Комплектация

Модуль Expander Shield поставляется либо в собраном виде в варианте для шин SPI или I2C (с соответствующими микросхемами), либо в виде набора для сборки без микросхем, которые могут быть приобретены отдельно.

На выводы модуля могут быть одеты транспортировочные фиксаторы, которые необходимо снять перед началом работы.

Expander Shield SPI 1100 р. 850 р. В корзину

форме заказа .

ExpanderShield на шину SPI (с микросхемами MCP23S17).

Expander Shield I2C 1100 р. 850 р. В корзину

Внимание! У Вас отключено выполнение JavaScript. Нормальная работа системы заказа и корзины невозможна. Если по каким-то причинам Вы не можете включить JavaScript, просто перечислите заказываемые товары в форме заказа .

ExpanderShield на шину I2C (с микросхемами MCP23017).

Технические характеристики

Приведем наиболее важные функциональные особенности модуля Expander Shield.

  • удобный переключатель режима работы модуля в зависимости от типа установленных в данный момент микросхем расширителей портов;
  • для каждой из двух применяемых микросхем 16-разрядных расширителей портов ввода/вывода с помощью перемычек задается трехбитный адрес на шине, что позволяет размещать на одной шине до 8 таких микросхем;
  • возможность выбора с помощью перемычки номера соответствующего выхода микроконтроллера Freeduino/Arduino (digital pin 8, 9 или 10) для сигнала CS шины SPI;
  • в модуле применены "проходные" разъемы, позволяющие состыковывать несколько модулей без сдвига относительно платы Arduino;
  • сигналы микросхем выведены на четыре разъема PBD-10R с дополнительными контактами "земля" и +5В;
  • возможность выбора отдельного или совместного аппаратного сброса (кнопкой RESET) микросхем 16-разрядных расширителей портов ввода/вывода и микроконтроллера Freeduino/Arduino с помощью перемычек;
  • дополнительный разъем JPIC с выводами прерываний (INTA, INTB), аппаратного сброса (RST) и выбора микросхемы (CS);

Прочие характеристики модуля определяются в первую очередь характеристиками микросхем MCP23S17/MCP23017, техническое описание которых доступно в документации производителя.

Кроме того, перед началом работы с дополнительным модулем Expander Shield рекомендуем ознакомиться с его принципиальной электрической схемой.

Режимы работы

Режим работы Expander Shield выбирается с помощью DIP-переключателя и перемычек.

Выбор интерфейса и управление подтяжкой шины I2C

С помощью DIP переключателя выбирается либо режим SPI (включением контактной группы 1-4) для микросхем MCP23S17, либо режим I2C (включением контактной группы 5-6) для микросхем MCP23017. Также, в режиме I2C с помощью 7 и 8 контактной группы при необходимости шина I2C подтягивается через токоограничивающие сопротивления к шине питания +5В. Как правило, подтягивающие резисторы должны быть подключены если на шине I2C только одно устройство. Если устройств несколько, то резисторы подключаются только у одного из устройств.

Одновременное включение шины SPI и I2C, а также шины SPI и 7, 8 контактной группы не допускается .

Комбинированный режим работы, когда одна из двух микросхем в одном модуле Expander Shield работает по SPI интерфейсу (MCP23S17), а другая по I2C интерфейсу (MCP23017) невозможен.

Если требуется организовать работу одновременно по SPI и I2C интерфейсу необходимо использовать два (несколько) дополнительных модулей Expander Shield, с соотвтетствующим положением переключателей.

Выбор номера вывода для управления сигналом CS шины SPI

Для шины SPI необходимо выбрать вывод микроконтроллера Freeduino/Arduino, используемый в качестве сигнала CS. Обычно используется вывод 10, что соответствует крайнему левому положению перемычки на разъеме SS1. Переставляя перемычку на одно из двух других положений, возможен выбор 9 и 8 вывода соответственно.

Выбор адреса микросхем на шине

Младшие три бита адреса микросхем MCP23S17/MCP23017 выбираются с помощью перемычек на разъемах IC1_addr/IC2_addr притягиванием битов 0, 1, 2 к "земле" (Gnd) или +5В (5V).

Адрес каждой микросхемы должен быть уникальным.

Таким образом, на одной шине можно разместить до 8 микросхем (объединив, например, 4 штуки Expander Shield).

Выбор режима работы аппаратного сброса (кнопкой RESET)

Возможна организация одного из ряда режимов работы кнопки RESET

  • Кнопка RESET сбрасывает Freeduino/Arduino и микросхемы MCP23S17/MCP23017
  • Кнопка RESET сбрасывает только Freeduino/Arduino
  • Кнопка RESET сбрасывает только микросхемы MCP23S17/MCP23017

Соответствующие положения перемычек на разъеме JRS (слева направо) показаны ниже.

Библиотека MCP23xxx

Для упрощения работы с этим, и рядом других модулей, разработана библиотека MCP23xxx, предоставляющая простой интерфейс к функционалу микросхем серии MCP23xxx. Библиотека доступна для свободного скачивания: Библиотека совместима с ПО Arduino версии 1.0.5 (также предполагается совместимость и с более поздними версиями).

Фактически, это набор из двух библиотек: MCP23xxx и LiquidCrystal_MCP23x17.

Более подробно установка библиотек описана в разделе подключение библиотек . Структура каталогов папки libraries после установки должна стать такой:

/libraries/LiquidCrystal_MCP23x17
/libraries/MCP23xxx

В библиотеке MCP23xxx реализованы шаблоны классов, организующие работу с расширителями портов MCP23017, MCP23S17, MCP23008 и MCP23S08. Библиотека LiquidCrystal_MCP23x17 - это модифицированная стандартная библиотека LiquidCrystal, поддерживающая русский язык, и работающая через расширитель портов.

К библиотеке прилагаются примеры, поясняющие работу с ней. Также доступна для скачивания предыдущая версия библиотеки:

Рассмотрим пример работы с модулем для шины I2C:

//В примере считывается состояние выводов 1-го чипа, и такие же значения выставляются на 2-м

//Для I2C версии подключаем Wire.h:
#include
//подключаем библиотеку
#include

//Создаем два объекта класса CMCP23017, но не инициализируем, т.к. шина I2C не готова
CMCP23017 mcp23_1;
CMCP23017 mcp23_2;

void setup()
{
//Инициализируем шину I2C ...
Wire.begin () ;
//... и объекты MCP23* с адресами 0 и 1
mcp23_1.init (0 ) ;
mcp23_2.init (1 ) ;

//Все выводы 1-го чипа нужно сделать входами, а 2-го - выходами
//Это можно сделать в цикле
for (int i= 0 ; i< 16 ; i++ ) {
mcp23_1.pinMode (i, INPUT) ;
mcp23_2.pinMode (i, OUTPUT) ;
}
//или за один раз, вызовом метод pinMode16
//mcp23_1.pinMode16(0x0ffff);
//mcp23_2.pinMode16(0x00000);
}

void loop()
{
//Прочесть все входы 1-го чипа, и выставить то же самое на 2-м можно в цикле
for (int i= 0 ; i< 16 ; i++ ) {
mcp23_2.digitalWrite (i, mcp23_1.digitalRead (i) ) ;
}
//или за раз, используя методы digitalRead16 и digitalWrite16
//mcp23_2.digitalWrite16(mcp23_1.digitalRead16());
}

Чипы SPI или I2C ADC легко доступны в диапазоне разрешений, скорости дискретизации и количества каналов. Их довольно просто добавить в любой Arduino.

Например, MCP3208 даст 8 каналов 12-битного разрешения на SPI, что означает 3 контакта (MOSI/MISO/SCK) + 1 на микросхему (SS). Таким образом, 1 чип будет 4 булавки, 2 фишки 5 контактов, 3 фишки 6 контактов и т. Д.

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

Чипы I2C могут быть сложнее иметь их, поскольку на шине I2C имеется только ограниченное количество адресов - плюс на многих Arduinos I2C также является двумя аналоговыми контактами, которые вы, возможно, не захотите жертвовать.

Второй вариант включает использование аналоговых мультиплексоров (например, 4051) для переключения различных источников на существующие аналоговые входы.

Третий вариант, который вы, вероятно, не рассматривали, состоит в том, чтобы иметь несколько ардуинов (или других недорогих микроконтроллеров), каждый из которых выполняет некоторую выборку, а затем реализует какой-то метод связи между ними (или с одним мастером). Это дает дополнительное преимущество в том, что тогда можно одновременно сэмплировать несколько каналов (по одному на микроконтроллер), что несколько ускоряет вашу работу.

Развернувшись на ответ Маженко, вы можете использовать аналоговый мультиплексор, такой как 74HC4051, чтобы превратить один аналоговый порт в 8.

Его кузен, 74HC4067, будет мультиплексировать 16 портов. Теперь с 6 аналоговыми входами на Arduino Uno вы можете иметь 6 x 16 входов = 96. Сигналы управления A/B/C могут быть параллельны.

Это позволит вам обрабатывать 96 входов с 6 дополнительными чипами и довольно простым кодом. У меня есть примеры кода на моей странице о мультиплексоре/демультиплексоре 74HC4051 .

Для 8 входов код:

// Example of using the 74HC4051 multiplexer/demultiplexer // Author: Nick Gammon // Date: 14 March 2013 const byte sensor = A0; //where the multiplexer in/out port is connected // the multiplexer address select lines (A/B/C) const byte addressA = 6;//low-order bit const byte addressB = 5; const byte addressC = 4;//high-order bit void setup () { Serial.begin (115200); Serial.println ("Starting multiplexer test ..."); pinMode (addressA, OUTPUT); pinMode (addressB, OUTPUT); pinMode (addressC, OUTPUT); } //end of setup int readSensor (const byte which) { //select correct MUX channel digitalWrite (addressA, (which & 1) ? HIGH: LOW); //low-order bit digitalWrite (addressB, (which & 2) ? HIGH: LOW); digitalWrite (addressC, (which & 4) ? HIGH: LOW); //high-order bit //now read the sensor return analogRead (sensor); } //end of readSensor void loop () { //show all 8 sensor readings for (byte i = 0; i < 7; i++) { Serial.print ("Sensor "); Serial.print (i); Serial.print (" reads: "); Serial.println (readSensor (i)); } delay (1000); } //end of loop

Я точно работал с тем же вопросом. Мне нужна программа, которая читает 100 термисторов... Почему? ну, раз вам это нужно.

Я уже закончил это.

Я попробовал мультиплексор/демультиплексор 74HC4051. Но по какой-то причине я не получил желаемого результата.

Первое, что вы найдете... POWER, вам понадобится внешний источник питания, в моем случае я просто сделал делитель напряжения и подключил термистор к этой мощности, а затем просто используйте аналоговый порт для чтения...

Я использую протокол I2C, 8 arduino Mega 7 slaves и один мастер. и после отправки send Integer, float и blah blah не помог мне просто сделать это. Он может отправлять аналоговое чтение через I2C, и мастер делает все необходимое преобразование.

Если вы все еще заинтересованы, я могу отправить вам исходный код для master и slaves. С помощью этого шаблона вы можете подключить до 50 ардуинов, и мастер будет искать каждый подключенный в сети arduino и запрашивать данные.

Похожие публикации