
Интернет-магазин «Неглупый Дом»
В больших проектах (дисплей, часы реального времени, EEPROM) цифровые пины Arduino быстро заканчиваются — модуль PCF8574 добавляет 8 дополнительных входов/выходов через те же два провода I2C, которые уже заняты другими модулями, а геркон-датчик в этом проекте показывает, как использовать один из этих новых входов для открытия/закрытия двери или окна.
PCF8574 — расширитель портов ввода-вывода: он не измеряет ничего сам, а просто предоставляет Arduino 8 дополнительных "виртуальных" пинов (P0-P7), доступных по той же I2C шине SDA/SCL. Адрес модуля на шине задаётся тремя адресными перемычками/выводами A0-A2 (посажены на GND или VCC) — при всех трёх на GND типичный адрес 0x20. Это позволяет поставить на одну шину несколько таких расширителей с разными адресами и получить десятки дополнительных пинов, используя всего 2 провода.
Каждый пин PCF8574 может быть и входом, и выходом одновременно — переключение между режимами происходит просто записью 1 (вход, пин "подвешен" на внутренний резистор) или 0 (выход, пин притянут к земле) в соответствующий бит. В этом проекте все 8 пинов оставлены входами (во все пины записана 1), и геркон-датчик подключён на пин P0 — его размыкание/замыкание читается как 0 или 1 в соответствующем бите байта, который Arduino получает одним I2C-запросом сразу по всем 8 пинам. Остальные 7 пинов (P1-P7) свободны для ещё семи геркон- или других пороговых датчиков по той же схеме.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
#include <Wire.h>
const int PCF8574_ADDR = 0x20; // адрес при A0-A2 на GND
byte readPCF8574() {
Wire.requestFrom(PCF8574_ADDR, 1); // один байт = состояние всех 8 пинов P0-P7
if (Wire.available()) {
return Wire.read();
}
return 0xFF; // если связи нет — считаем все пины "высокими"
}
void setup() {
Serial.begin(9600);
Wire.begin();
// переводим все 8 пинов в режим входа — просто пишем в модуль байт из всех единиц
Wire.beginTransmission(PCF8574_ADDR);
Wire.write(0xFF);
Wire.endTransmission();
}
void loop() {
byte state = readPCF8574();
bool reedP0 = bitRead(state, 0); // геркон на пине P0
Serial.print("P0 (геркон): ");
Serial.println(reedP0 ? "разомкнут" : "замкнут");
// для датчика на P1 было бы: bitRead(state, 1); на P2 — bitRead(state, 2); и так далее.
delay(300);
}
Дополнительных библиотек не требуется — только стандартный `Wire.h`, протокол PCF8574 предельно простой (один байт на чтение/запись). Если устройство не отвечает — проверьте реальный адрес отдельным скетчем-сканером шины I2C, он зависит от положения перемычек A0-A2.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 196 ₽ 176 ₽ (экономия 20 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.