Відповідь:
Для того щоб розширити наявні GPIO, можливо скористатися (і так зазвичай роблять) i2c-розширювачем портів.
Але основна проблема не у тому щоб читати/записувати значення GPIO через i2c, а в тому, як оперативно отримувати переривання події на входах розширювача.
Так от, кожен GPIO-розширювач має спеціальний пін-вихід. Цей пін встановлюється в логічну одиницю, якщо відбулася зміна стану портів розширювача, які налаштовано як входи (наприклад, кнопки).
Звісно ж, є і інший шлях – постійно читати шину i2c і самостійно знімати такі дані. Але це не вихід, бо тоді контролер буде зайнятий тільки цим.
З настанов дизайну відомо, що затримка інтерфейсів користувача має бути не більше ніж 400 мс.
Для декількох кнопок (або інших входів) можна використовувати один GPIO з перериванням на NodeMCU.
Приклад такого рішення PCA9538 – i2c GPIO port extender