
Интернет-магазин «Неглупый Дом»
Рептилиям нужен строгий световой день с УФ-лампой. GUVA-S12SD проверяет, действительно ли лампа физически горит (а не перегорела незаметно), пока реле включает и выключает её по внутреннему таймеру Arduino.
Логика проекта строится на двух независимых задачах: таймер светового дня (реле включает/выключает лампу по заданным интервалам 12/12 часов) и контроль исправности (датчик УФ проверяет, что лампа, которая, по мнению реле, должна гореть, действительно излучает ультрафиолет). Это разделение важно, потому что обычная лампа накаливания или светящийся нагревательный элемент могут визуально выглядеть "горящими" даже после выхода из строя УФ-излучающей части — глазом это не всегда заметно.
Таймер основан на `millis()`, а не на `delay()` для всего цикла — это специально сделано так, чтобы Arduino могла одновременно проверять датчик и реагировать на события, а не "спать" половину суток в одном `delay()`. Вычисление `elapsed = millis() - cycleStart` корректно работает даже при переполнении счётчика `millis()` (это происходит раз в ~49.7 дня) благодаря особенностям беззнаковой арифметики — разность всё равно получается правильной.
Так как реализации данного модуля бывают разные, если у вас на плате нет тех контактов, что указаны ниже — сориентируйтесь по названиям контактов на своей плате.
// ВНИМАНИЕ: рекомендую отладить код через монитор порта, я языковая
// модель, а не специализированный кодер, могу что-то упустить.
// При работе с сетевым напряжением 220V соблюдайте технику безопасности,
// используйте только промышленные модули реле с гальванической изоляцией.
const int uvSensorPin = A0;
const int relayPin = 7;
const int buzzerPin = 8;
const unsigned long onDuration = 43200000UL; // 12 часов светового дня
const unsigned long offDuration = 43200000UL; // 12 часов темноты
unsigned long cycleStart = 0;
bool lampOn = true;
void setup() {
Serial.begin(9600);
pinMode(relayPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
digitalWrite(relayPin, HIGH);
}
void loop() {
unsigned long elapsed = millis() - cycleStart;
unsigned long duration = lampOn ? onDuration : offDuration;
if (elapsed > duration) {
lampOn = !lampOn;
digitalWrite(relayPin, lampOn ? HIGH : LOW);
cycleStart = millis();
}
if (lampOn) {
int uvValue = analogRead(uvSensorPin);
Serial.print("УФ-показание: ");
Serial.println(uvValue);
digitalWrite(buzzerPin, (uvValue < 50) ? HIGH : LOW); // лампа должна гореть, но УФ не фиксируется
} else {
digitalWrite(buzzerPin, LOW);
}
delay(60000);
}
Пока реле держит лампу включённой, датчик должен фиксировать УФ-излучение — если этого не происходит, значит лампа перегорела, и зуммер предупредит владельца раньше, чем это заметит рептилия.
Ещё модули для Arduino: Электронные модули.
🎁 Купить весь комплект со скидкой 10%
Все 2 товара сразу в корзину: 301 ₽ 271 ₽ (экономия 30 ₽)
Скидка применяется автоматически при оформлении заказа, если в корзине именно этот комплект.
Остались вопросы? Проконсультируйтесь с ИИ-инженером — он уже в курсе темы статьи и сразу ответит, ничего вводить не нужно.