
Интернет-магазин «Неглупый Дом»
В другом проекте на сайте мультиплексор CD74HC4067 просто демонстрирует принцип опроса нескольких аналоговых датчиков на одном пине. Здесь та же идея применяется для практической задачи: Arduino по очереди опрашивает несколько "зон" (например, несколько комнат с одинаковыми пороговыми датчиками) через один мультиплексор и поднимает тревогу, если хотя бы в одной из них показание превысило порог — не называя, что именно это за датчики, принцип работает с любым аналоговым сенсором.
Принцип переключения каналов такой же, как и в демонстрационном проекте: 4 цифровых пина (S0-S3) задают 4-битный код номера канала (от 0000 до 1111, то есть каналы 0-15), и мультиплексор подключает выбранный канал к общему сигнальному пину SIG, который Arduino читает обычным `analogRead()`. Разница в этом проекте — не в самом мультиплексоре, а в логике опроса: код проходит по нескольким зонам ПОДРЯД в цикле, за каждую проверяет превышение порога, и включает общий зуммер, если хотя бы одна зона сейчас "в тревоге" — без разделения по каналам в самом сигнале тревоги (хотя при необходимости легко вывести в Serial именно номер сработавшей зоны).
Главное практическое преимущество такого подхода — не тратить по одному аналоговому пину Arduino на каждую зону (которых у UNO/Nano всего 6), а подключить гораздо больше зон через один мультиплексор, используя всего 5 пинов (4 на выбор канала + 1 общий сигнальный) независимо от того, 3 зоны или все 16.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
const int S0 = 2, S1 = 3, S2 = 4, S3 = 5;
const int SIG_PIN = A0;
const int BUZZER_PIN = 8;
const int ZONE_CHANNELS[3] = {0, 1, 2}; // номера каналов мультиплексора, используемых как зоны
const int ZONE_THRESHOLD = 600; // подберите под свои датчики зон
void selectChannel(int channel) {
digitalWrite(S0, bitRead(channel, 0));
digitalWrite(S1, bitRead(channel, 1));
digitalWrite(S2, bitRead(channel, 2));
digitalWrite(S3, bitRead(channel, 3));
}
void setup() {
Serial.begin(9600);
pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
}
void loop() {
bool anyZoneAlarmed = false;
for (int i = 0; i < 3; i++) {
selectChannel(ZONE_CHANNELS[i]);
delayMicroseconds(50); // короткая пауза на переключение канала перед чтением
int value = analogRead(SIG_PIN);
Serial.print("Зона ");
Serial.print(i);
Serial.print(": ");
Serial.println(value);
if (value > ZONE_THRESHOLD) {
anyZoneAlarmed = true;
}
}
if (anyZoneAlarmed) {
tone(BUZZER_PIN, 2500, 100);
}
delay(200);
}
Дополнительных библиотек не требуется — только `digitalWrite()`, `analogRead()` и `tone()`. При добавлении новых зон просто добавьте номер канала в массив `ZONE_CHANNELS` и увеличьте размер циклов соответственно.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 146 ₽ 131 ₽ (экономия 15 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.