Иногда для проекта не хватает портов микроконтроллера. И если для плат Arduino на основе ATMEGA328, чаще всего хватает свободных портов, то очень интересные и недорогие микроконтроллеры ESP8266 этим похвастаться не могут - всего 11 портов и к тому-же большинство из них имеют ограничения использования при загрузке.

Для решения этой проблемы можно использовать расширители портов с интерфейсом I2C

Довольно распространенная микросхема PCF8574 позволяет по двум проводам подключить жидкокристаллический индикатор или просто использовать восемь дополнительных цифровых входов или выходов. Максимально к микроконтроллеру можно подключить 8 таких плат с разными адресами и в сумме получить 64 дополнительных вывода. 
Микросхема может питаться в большом диапазоне напряжений 3-5,5 Вольт.
На вышеприведенной плате кроме собственно микросхемы расположены джамперы выбора адреса I2C и пара подтягивающих резистора, необходимых для функционирования протокола I2C

Адреса выставляются джамперами следующим образом:
A0 — 0 // A1 — 0 // A2 — 0 // — 0x20
A0 — 0 // A1 — 0 // A2 — 1 // — 0x21
A0 — 0 // A1 — 1 // A2 — 0 // — 0x22
A0 — 0 // A1 — 1 // A2 — 1 // — 0x23
A0 — 1 // A1 — 0 // A2 — 0 // — 0x24
A0 — 1 // A1 — 0 // A2 — 1 // — 0x25
A0 — 1 // A1 — 1 // A2 — 0 // — 0x26
A0 — 1 // A1 — 1 // A2 — 1 // — 0x27

Для работы с модулем необходимо установить библиотеку «PCF8574» найти ее версию для Arduino и ESP8266 можно на гитхабе - https://github.com/xreef/PCF8574_library

В папке примеров есть примеры для всех платформ.

Применение достаточно простое, в секции объявлений нужно указать
#include "PCF8574.h" // Подключение библиотеки PCF8574
PCF8574 pcf8574(0x20); // Создаем объект и указываем адрес устройства 0x20
В секции void setup() указываем какие выводы будут работать на вход, а какие на выход
pcf8574.pinMode(P1, INPUT_PULLUP); 
pcf8574.pinMode(P3, INPUT);                  // Устанавливаем выход P3, как вход
pcf8574.pinMode(P4, OUTPUT);              // Устанавливаем выход P4, как выход

и инициализируем его
pcf8574.begin();
Чтение цифрового значения
int p1Digital = PCF8574.digitalRead(P1); // read P1
int p1Digital = PCF8574.digitalRead(P1, true); // read P1 without debounce
Записать цифровое значение тоже довольно просто:
PCF8574.digitalWrite(P1, HIGH);
PCF8574.digitalWrite(P1, LOW);
Хорошее руководство по работе с библиотекой есть тут:
https://www.mischianti.org/2019/01/02/pcf8574-i2c-digital-i-o-expander-fast-easy-usage/