
Интернет-магазин «Неглупый Дом»
В другом проекте на сайте расширитель портов PCF8574 просто демонстрирует принцип на одном геркон-датчике. Здесь та же идея применяется для реальной задачи: несколько геркон-датчиков на разных дверях/окнах подключены к одному PCF8574, и зуммер срабатывает, как только любая из них открывается.
Принцип расширения входов такой же, как и в демонстрационном проекте: PCF8574 добавляет 8 дополнительных пинов (P0-P7) через те же два провода I2C, и Arduino получает состояние всех 8 пинов одним запросом в виде одного байта, где каждый бит соответствует одному пину. Разница — в применении: вместо одного датчика на P0 здесь используются несколько пинов одновременно (например, P0-P3 для четырёх разных дверей), и код проверяет каждый бит отдельно, определяя не только факт тревоги, но и то, какая конкретно дверь сейчас открыта.
Важная деталь безопасности: герконы обычно подключаются так, что замкнутое состояние (дверь закрыта) соответствует одному уровню сигнала, а разомкнутое (дверь открыта) — другому. Если какой-то провод случайно оборвётся, сигнал на этом пине перейдёт в состояние "дверь открыта" (так как подтягивающий резистор на входе PCF8574 держит разомкнутую линию в HIGH) — то есть обрыв провода физически воспринимается системой как открытая дверь, а не как "всё спокойно", что само по себе неплохое свойство для охранной системы.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
#include <Wire.h>
const int PCF8574_ADDR = 0x20;
const int BUZZER_PIN = 8;
const int DOOR_COUNT = 4; // сколько дверей подключено (P0-P3)
byte readPCF8574() {
Wire.requestFrom(PCF8574_ADDR, 1);
if (Wire.available()) {
return Wire.read();
}
return 0xFF;
}
void setup() {
Serial.begin(9600);
Wire.begin();
pinMode(BUZZER_PIN, OUTPUT);
Wire.beginTransmission(PCF8574_ADDR);
Wire.write(0xFF); // все 8 пинов в режим входа
Wire.endTransmission();
}
void loop() {
byte state = readPCF8574();
bool anyDoorOpen = false;
for (int door = 0; door < DOOR_COUNT; door++) {
bool open = bitRead(state, door); // подберите полярность по своей распайке герконов
if (open) {
anyDoorOpen = true;
Serial.print("Дверь ");
Serial.print(door);
Serial.println(" открыта!");
}
}
if (anyDoorOpen) {
tone(BUZZER_PIN, 2500, 100);
}
delay(300);
}
Дополнительных библиотек не требуется — только стандартный `Wire.h`. При добавлении новых дверей на пины P4-P7 просто увеличьте `DOOR_COUNT` до 8.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 167 ₽ 150 ₽ (экономия 17 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.