
Интернет-магазин «Неглупый Дом»
У Arduino Uno/Nano всего 6 аналоговых входов — мультиплексор CD74HC4067 позволяет подключить к плате сразу до 16 аналоговых датчиков через один-единственный аналоговый пин, переключая каналы программно. В этом проекте в канал 0 подключён фоторезистор, а остальные 15 каналов остаются свободными для любых других аналоговых модулей.
CD74HC4067 — это цифровой переключатель на 16 направлений: четыре адресных пина (S0-S3) задают 4-битный номер канала от 0000 до 1111 (0-15), и в этот момент внутренний ключ соединяет выбранный канал (C0-C15) с общим выводом SIG. Arduino читает `analogRead()` с одного пина SIG, но перед каждым чтением сначала выставляет нужную комбинацию на S0-S3 — получается, что один аналоговый вход платы "превращается" в шестнадцать, просто опрашиваемых по очереди, а не одновременно.
У модуля часто есть ещё и пин EN (enable), обычно активный по низкому уровню — его нужно подключить к GND, чтобы мультиплексор был постоянно включён (если его оставить "в воздухе" или подать на него HIGH, каналы могут не переключаться). Поскольку каналы опрашиваются последовательно, а не параллельно, между переключением канала и самим измерением стоит дать сигналу короткую паузу на стабилизацию — для таких медленных датчиков, как фоторезистор, это несущественные доли миллисекунды.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, которые указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, так как я языковая
// модель, а не специализированный кодер, и могу что-то упустить. Основу
// и идею я накидал, но проверьте под свою схему.
const int S0 = 2;
const int S1 = 3;
const int S2 = 4;
const int S3 = 5;
const int SIG_PIN = A0;
void setup() {
Serial.begin(9600);
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
}
// Выставляет на адресных пинах 4-битный номер канала (0-15)
void selectChannel(int channel) {
digitalWrite(S0, channel & 0x01);
digitalWrite(S1, (channel >> 1) & 0x01);
digitalWrite(S2, (channel >> 2) & 0x01);
digitalWrite(S3, (channel >> 3) & 0x01);
}
void loop() {
selectChannel(0); // канал 0 — фоторезистор
delayMicroseconds(50); // короткая пауза на стабилизацию сигнала после переключения канала
int lightValue = analogRead(SIG_PIN);
Serial.print("Канал 0 (свет): ");
Serial.println(lightValue);
// Пример опроса ещё одного свободного канала (если туда что-то подключено):
// selectChannel(1);
// delayMicroseconds(50);
// int secondValue = analogRead(SIG_PIN);
delay(300);
}
Никаких дополнительных библиотек не требуется — вся логика строится на `digitalWrite()` для выбора канала и обычном `analogRead()`. Если показания "скачут" между каналами — увеличьте паузу `delayMicroseconds()` после `selectChannel()`.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 144 ₽ 130 ₽ (экономия 14 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.