Дневной и ночной режимы освещения

Приветствую, Хабр!

14a6b202c989e04ad27a1f60a36f57a5.jpg

Читал недавно книгу, один из героев которой, заходя в санузел, кинул фразу: почему еще не изобрели лампочку, которая ночью бы светили тусклее чем днем. Дело тут, конечно, не в экономии электричества, а в том, чтобы ночью не слепить «посетителя» со сна. Идея мне показалась довольно здравой.

Многие из нас стараются соблюдать режим сна, так как это положительно влияет на умственное и физическое состояние. Поэтому, достаточно просто выяснить, что является ночным и дневным режимами (применительно к нашему освещению). Я, например, укладываюсь в 23:00 — 00:00, а встаю в 7 часов. То есть устройство (лампочка) должно следить за временем суток и как-то на это реагировать. На ум пришло сразу несколько вариантов решения данной задачи.

  1. Возможно есть Wi-Fi лампочки с программируемой яркостью, включением по таймеру и тому подобное, которое имеют завязку на время суток, но я даже гуглить не буду — не интересно.

  2. Разработать лампочку со встроенным RTC (real time clock). Я разрабатывал только две лампочки за все время. Первая — светодиодная с модулем ZigBee, вторая — просто светодиодная лампочка (даже не спрашивайте). Вся проблема — это практически полное отсутствие места в цоколе и радиаторе для размещения дополнительных печатных плат с компонентами.

  3. Разработать устройство с RTC и симистором, которое будет управлять диммируемыми лампочками (светодиодными или накаливания). Стоимость таких лампочек несколько дороже, но не критична.

  4. Разработать устройство с RTC и реле, которое будет включать нужное количество ламп в зависимости от времени суток. Тут есть основной минус — это неравномерность освещения в одном помещении.

У меня в санузле стоят 2 обычные светодиодные лампы с цоколем GU5.3. Мне очень понравился 3 вариант с диммированием, но для начала я решил разработать 4. Думаю для помещения ~1 м^2 такая реализация подойдет, если не понравится, сделаю на симисторе с возможности регулировки, но тогда придется менять лампочки. Также есть идея использовать такое устройство немного в другом режиме на даче, разнеся лампочки в разные места, а там нужно зажигать отдельно.

Порылся у себя в закромах и нашел плату Arduino nano. Подключил к компу — работает. Отлично! Для RTC я использовал уже довольно много разных микросхем, но есть одна (точнее три), которые я никуда не ставил. Давненько сделал печатную плату, чтобы проверить работу, да так и забросил. И это PCA2129T в огромном корпусе и со встроенным кварцем. Пролежала оно уже 10 лет, пора бы и поработать. Для проверки припаял RTC к Arduino.

Рис.1. Прототип для оценки RTC

Рис. 1. Прототип для оценки RTC

Тут как раз та самая макетка для RTC. Дополнительно припаял кнопку для сброса времени и батарейный отсек 2032. Вообще можно было и плату не делать. Взять реле и блок питания, все это соединить и готово. Да, но нет.

Рис.2. Схема устройства

Рис. 2. Схема устройства

Для корпуса буду использовать коробку от блока питания. Там достаточно места, чтобы разместить AC/DC питатель на 12В. За его основу возьму микросхему LNK306PN. Несколько раз уже использовал данную схему в своих разработках, показала себя отлично. Для согласования уровней I2C поставил RS0302YH8 — отличный недорогой вариант (советую). Как раз хотел затестить, чтобы не использовать транзисторы.  

На плате «Arduino nano» стоит CH340C у которой есть выход 3.3В, его буду использовать для питания PCA2129T и конвертора уровней, чтобы не ставить ничего дополнительно. Напряжение 5В тоже из Arduino. Реле на 5А, управление 12В через полевик.

Чтобы проще было все коммутировать под реечным подвесным потолком, поставил три винтовых разъема. Один вход и два выхода. Первый выход проброшен напрямую, туда будет подключаться первая лампочка, которая загорается даже при отсутствии напряжения при любом раскладе. Второй выход через реле на «дневной» вариант.

Рис.3. Печатная плата устройства в Altium

Рис. 3. Печатная плата устройства в Altium

Тестовый пятиминутный код с готовой либиной «FaBoRTC_PCF2129». Чтобы не городить кучу кнопок, дисплей и всякую ересь, просто по нажатию одной кнопки будем сбрасывать время на 00:00:00. Жать ее будем, соответственно, в полночь при полной луне.

#include 
#include 

FaBoRTC_PCF2129 faboRTC;

int KEY_SET_TIME = PD4;
int LED_STATUS = 13;

void setup() {
  pinMode (KEY_SET_TIME, INPUT);  
  pinMode(LED_STATUS, OUTPUT);
  digitalWrite(LED_STATUS, LOW);

  Serial.begin(9600);
  Serial.println();
  Serial.println("RESET");

  Serial.println("Checking I2C device...");
  if (faboRTC.searchDevice()) {
    Serial.println("configuring FaBo RTC I2C Brick");
    faboRTC.configure();
  } else {
    Serial.println("device not found");
    while(1);
  }
}

void loop() {
  if ((digitalRead(KEY_SET_TIME) == 0)) 
   {
      Serial.println("set date/time");
      faboRTC.setDate(2023,5,11,0,0,0);
      delay(100);
      Serial.println("TIME RESET");
      digitalWrite(LED_STATUS, HIGH);
      delay(100);
      digitalWrite(LED_STATUS, LOW);
    }
  delay(100);  
  DateTime now = faboRTC.now();
  Serial.print("Time: ");
  Serial.print(now.year());
  Serial.print("/");
  Serial.print(now.month());
  Serial.print("/");
  Serial.print(now.day());
  Serial.print(" ");
  Serial.print(now.hour());
  if (now.hour() > 6)
    digitalWrite(LED_STATUS, HIGH);
  Serial.print(":");
  Serial.print(now.minute());
  Serial.print(":");
  Serial.print(now.second());
  Serial.println();
  delay(700);
}

Рис.4. Вывод лога

Рис. 4. Вывод лога

Собираем/прошиваем. Все гуд. Уже в течение 5 суток время отлично тикает. По моим расчетам должно работать (не включать вторую лампочку) с 0 до 7 часов. Ниже уберу всю отладку, чтобы не было задержки на включение второй лампочки.

Рис.5. Печатная плата с завода

Рис. 5. Печатная плата с завода

Габариты печатной платы 46×82. В корпус отлично встала.

Рис.6. Печатная плата с компонентами

Рис. 6. Печатная плата с компонентами

Все компоненты отлично встали. Кнопку поставил высокую, чтобы проще было нажимать. Отверстие в корпусе делать не стану, так как время можно будет сбросить в 00:00 подключив mini-USB.

Небольшая засада была после прошивки скетча. Прошиваю, включаю, задержка на включение реле примерно 1 секунда. Удалил из скетча все лишнее, оставил только GPIO реле. Задержка. Тааак. Получается, что одна лампочка будет зажигаться сразу, а вторая через 1 секунду — это плохо. Стал искать пути решения в интернете.

Первое, что сделал — это убрал конденсатор между DTR CH340C и RESET — не помогло. Оказывается, чтобы этого не происходило необходимо прошить плату через программатор. У меня как раз есть USBasp.

Старт без задержки. Отлично! Ниже почищенный скетч:

#include 
#include 

FaBoRTC_PCF2129 faboRTC;

int KEY_SET_TIME = 4;
int RELAY = 12;

void setup() {
  pinMode(RELAY, OUTPUT);
  digitalWrite(RELAY, LOW);

  if (faboRTC.searchDevice()) {
    faboRTC.configure();
  }
  DateTime now = faboRTC.now();

  if (now.hour() > 6)
    digitalWrite(RELAY, HIGH);

  pinMode (KEY_SET_TIME, INPUT);  
}

void loop() {
  if ((digitalRead(KEY_SET_TIME) == 0)) 
   {
      faboRTC.setDate(2023,5,11,0,0,0);
      digitalWrite(RELAY, LOW);
      delay(500);
      digitalWrite(RELAY, HIGH);
      delay(500);
    }
}

Рис.7. Устройство в корпусе (со снятой крышкой)

Рис. 7. Устройство в корпусе (со снятой крышкой)

Вот и все. Устройство собрано. Тестирую. Также сделал проект на симисторе, но еще не заказывал печатки. Посмотрим, как будет себя вести с реле.  

Спасибо за внимание и успехов!

© Habrahabr.ru