Site Loader

Урок 39. Реле времени: управление устройствами по таймеру

В этом уроке мы создадим четырёхканальное реле времени. К данному устройству можно подключить до 4 приборов (лампочки, светодиодные ленты, моторы, обогреватели, вентиляторы и т.д.), каждое из которых будет включаться на заданные для него промежутки времени суток и в заданные дни недели.

Каждый из четырёх каналов нашего реле времени может выдавать не только логические уровни (1/0 — вкл/выкл), но и сигналы ШИМ (включать приборы на определённую мощность).

В реле времени имеется 20 таймеров (их количество можно уменьшить или увеличить до 128, указав нужное число в строке 16 скетча). Один таймер включает только одно устройство (канал) на заданный промежуток времени, не влияя на работу остальных устройств (каналов). Каждому устройству (каналу) можно назначить несколько таймеров, следовательно, включать и выключать каждое из устройств можно несколько раз в сутки и на разную мощность. При отключении питания, таймеры реле не сбиваются, так как их настройки хранятся в энергонезависимой памяти Arduino. Текущее время также не сбивается, так как оно берётся из модуля часов реального времени, который снабжен батарейкой.

Реле времени можно использовать для включения освещения по времени в доме, квартире, на даче, на производстве и т.д. Можно использовать для включения по времени вентиляции, котлов, обогревателей, полива газонов, систем очистки дачных бассейнов и т.д. Еще одним преимуществом реле времени является создание эффекта присутствия, например, Вас нет дома, но свет утром и вечером включается, а днём и ночью выключается, утром включается радио или телевизор, а ночью включается ночник. Это может заставить задуматься нежелательных «гостей», что дом обитаем и делать там нечего.

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

  • LiquidCrystal_I2C для работы с символьными ЖК дисплеями.
  • iarduino_Encoder_tmr для работы с энкодерами через аппаратный таймер.
  • iarduino_RTC для работы с модулями реального времени.
  • Библиотеки EEPROM, Wire и pgmspace используемые в скетче, входят в стандартный набор Arduino IDE.

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE.

Видео:


Схема подключения:

Trema модуль RTC и дисплей LCD1602 I2C подключаются к аппаратной шине I2C через Trema I2C HUB, а Trema энкодер можно подключать к любым (цифровым или аналоговым) выводам Arduino, их номера указываются в скетче (в примере использованы выводы D4, D7 и D8). Для удобства подключения используется Trema Shield.

Приборы подключаются к каналам 1-4:
  • Маломощные приборы с питанием 5 В постоянного тока до 20 мА можно подключать напрямую к одному из каналов.
  • Приборы с питанием до 30 В постоянного тока подключаются через силовой ключ.
  • Приборы с питанием от сети 220 В переменного тока подключаются через твердотельное или электромеханическое реле.
Алгоритм работы:

Режим просмотра времени:

При включении питания на индикаторе отображается текущее время, дата и день недели. Номера включённых каналов отображаются в правом верхнем углу дисплея.

Меню: Для входа в меню нужно нажать на энкодер. Далее поворачивая экодер вправо или влево можно выбрать разделы «ТАЙМЕРЫ», «ЧАСЫ», «ВЫХОД», для входа в требуемый раздел нужно опять нажать на энкодер.

Меню>часы: В данном разделе меню, поворачивая энкодер вправо или влево, можно выбрать разделы «ВРЕМЯ», «ДАТА», «ВЫХОД», для входа в требуемый раздел нужно нажать на энкодер.

Меню>часы>время: Этот раздел меню предназначен для установки текущего времени. Устанавливаемый в данный момент параметр времени (часы, минуты, секунды) должен мигать. Выбор значения осуществляется поворотом энкодера, а переход к следующему значению, нажатием на энкодер.

Меню>часы>дата: Этот раздел меню предназначен для установки текущей даты и дня недели. Устанавливаемый в данный момент параметр даты (день, месяц, год, день недели) должен мигать. Выбор значения осуществляется поворотом энкодера, а переход к следующему значению, нажатием на энкодер.

Меню>таймеры: В данном разделе меню, поворачивая энкодер вправо или влево, можно выбрать один из установленных таймеров (для их редактирования) или разделы «НОВЫЙ ТАЙМЕР», «СТЕРЕТЬ ВСЕ ТАЙМЕРЫ», «ВЫХОД», для входа в требуемый раздел нужно нажать на энкодер. Установленные таймеры отображаются в виде строки из времени их старта/сброса и номера канала «00:00-00:00-0».

Меню>таймеры>новый таймер: Выбор данного раздела приведёт к созданию нового таймера, на экране отобразится надпись «НОВЫЙ ТАЙМЕР СОЗДАН» после чего Вам будет предложено ввести время старта/сброса и указать номер канала (который будет включаться данным таймером). Данный раздел меню недоступен если установлены все таймеры.

Меню>таймеры>стереть все таймеры: Выбор данного раздела приведёт к удалению всех таймеров, на экране отобразится надпись «ВСЕ ТАЙМЕРЫ УДАЛЕНЫ». Данный раздел меню недоступен если нет ни одного установленного таймера.

Меню>таймеры>00:00-00:00-0: Вместо «00:00-00:00-0» будет строка из времени старта/сброса таймера и номера канала которым он управляет. Данный раздел меню предназначен для редактирования выбранного таймера, поворачивая энкодер вправо или влево, можно выбрать разделы «ВРЕМЯ И КАНАЛ», «ПОВТОРЫ», «УРОВЕНЬ СИГНАЛА», «СТЕРЕТЬ ТАЙМЕР», «ВЫХОД», для входа в требуемый раздел нужно нажать на энкодер.

Меню>таймеры>00:00-00:00-0>время и канал: Этот раздел меню предназначен для установки (редактирования) времени старта/сброса таймера и номера канала которым он управляет. Устанавливаемый в данный момент параметр (час старта, минута старта, час сброса, минута сброса, номер канала) должен мигать. Выбор значения осуществляется поворотом энкодера, а переход к следующему значению, нажатием на энкодер.

Меню>таймеры>00:00-00:00-0>повторы: Этот раздел меню предназначен для установки (редактирования) повторов таймера по дням недели, в которые он должен срабатывать. Под устанавливаемым в данный момент параметром (ПН, ВТ, СР, ЧТ, ПТ, СБ, ВС) должен мигать курсор. Поворот энкодера устанавливает или сбрасывает стрелочку под устанавливаемым параметром, если она у

Таймер на Ардуино с настройкой включения и выключения

Всем привет! Собрав таймер на Ардуино из этой инструкции, вы сможете контролировать включение и выключение ваших устройств в нужное вам время. Это могут быть ночные фонари, система орошения сада и т.д. Мы воспользуемся Ардуино, дисплеем и RTC 1307, отображающим и управляющим временем. Вы можете задать часы «ВКЛ» и «ВЫКЛ» при помощи 4 кнопок, что позволит вам изменять настройки микросхемы таймера.

Также вы научитесь создавать часы, базирующиеся на Ардуино. Я приложил схему из fritzing и видео, так что вы без проблем соберёте данное устройство.

Сначала посмотрите видео, чтобы понять, о чем идет речь, используйте его как руководство.

Шаг 1: Материалы

  • Arduino Uno
  • Модуль RTC 1307
  • Дисплей 16X2
  • Модуль реле 5V
  • Подстроечный потенциометр 10K
  • Резистор 1K
  • Резисторы 10K x 4 штуки
  • Кнопки x 4 штуки
  • Макетная плата, джамперы.

Шаг 2: Устанавливаем часы

Следуйте схеме из Fritzing.

Соедините 5V и GND с Ардуино с соответствующими контактами (Красный – 5V, синий – земля)

Дисплей к Ардуино:

  1. VSS к GND
  2. VDD к 5V
  3. VO к центру потенциометра
  4. RS к пину 2
  5. RW к GND
  6. EN или E к пину 3
  7. D0 NC
  8. D1 NC
  9. D2 NC
  10. D3 NC
  11. D4 к пину 4
  12. D5 к пину 5
  13. D6 к пину 6
  14. D7 к пину 7
  15. A к 5V
  16. K к GND через резистор 1K
  17. Остальные контакты потенциометра на 5V и GND

RTC к Arduino:

  • SDA к пину 4
  • SCL у пину 5
  • GND и 5V

Шаг 3: Устанавливаем время

Пришло время настроить часы. Запустите код «Set time RTC». Этот скетч возьмёт данные о дате и времени из вашего компьютера прямо во время компиляции кода и использует их для программирования RTC. Если у вас на компьютере неправильные установки, то поправьте их перед запуском программы. Затем нажмите кнопку Upload, чтобы немедленно загрузить откомпилированный код.

Внимание: Если вы скомпилируете код, а загрузите его позже, то данные о времени устареют.

Далее откройте окно Serial Monitor, чтобы увидеть, что время было установлено.

Файлы

Шаг 4: Часы

После того, как установите время, откройте и загрузите скетч «Clock with RTC LCD». Потенциометр в схеме нужен для настройки контрастности дисплея, покрутите его, чтобы чётко видеть символы.

Файлы

Шаг 5: Устанавливаем таймер

Теперь мы добавим кнопки и реле. Опять же, следуйте схеме Fritzing.

Пины 8,9, 10 и 11 соединены с GND через резисторы 10K. Когда вы нажмете на кнопку, то на контакты пойдёт напряжение 5V.

Реле соединяется с пином 12. С помощью него можно управлять вашими устройствами, но будьте осторожны с максимальной нагрузкой на реле!

Шаг 6: Таймер

Откройте и загрузите код «Timer with on off set point». Нажимайте кнопки, чтобы сместить время назад или вперёд. Если электронный таймер будет в пределах настроенного интервала, то он начнет работать сразу же. Если же он не попадает в нужный интервал, то будет ждать час «ВКЛ».

Этот код имеет интересные функции, которые можно использовать в других проектах. Я постарался отделить каждую функцию, чтобы всё было максимально понятным.

Файлы

Весь код написан мной, кроме настройки времени на RTC и дата-логгера Adafruit. Надеюсь, эта инструкция как собрать простой таймер своими руками была для вас полезна!

Прерывания и многозадачность в Arduino

#include <Servo.h>

class Flasher

{

// Переменные-участники класса устанавливаются при запуске

int ledPin; // Номер контакта со светодиодом

long OnTime; // длительность ВКЛ в мс

long OffTime; // длительность ВЫКЛ в мс

 

// Контроль текущего состояния

int ledState; // устанавливает текущее состояние светодиода

unsigned long previousMillis; // время последнего обновления состояния светодиода

 

// Конструктор — создает объект Flasher, инициализирует переменные-участники и состояние

public:

Flasher(int pin, long on, long off)

{

  ledPin = pin;

  pinMode(ledPin, OUTPUT);

 

  OnTime = on;

  OffTime = off;

 

  ledState = LOW;

  previousMillis = 0;

}

 

void Update(unsigned long currentMillis)

{

  if((ledState == HIGH) && (currentMillis — previousMillis >= OnTime))

  {

   ledState = LOW; // ВЫКЛ

   previousMillis = currentMillis; // Запомнить время

   digitalWrite(ledPin, ledState); // Обновить состояние светодиода

  }

  else if ((ledState == LOW) && (currentMillis — previousMillis >= OffTime))

  {

   ledState = HIGH; // ВКЛ

   previousMillis = currentMillis; // Запомнить время

   digitalWrite(ledPin, ledState); // Обновить состояние светодиода

  }

}

};

 

class Sweeper

{

Servo servo; // объект servo

int pos; // текущее положение сервопривода

int increment; // определяем увеличение перемещения на каждом интервале

int updateInterval; // определяем время между обновлениями

unsigned long lastUpdate; // определяем последнее обновление положения

 

public:

Sweeper(int interval)

{

  updateInterval = interval;

  increment = 1;

}

void Attach(int pin)

{

  servo.attach(pin);

}

void Detach()

{

  servo.detach();

}

void reset()

{

  pos = 0;

  servo.write(pos);

  increment = abs(increment);

}

 

void Update(unsigned long currentMillis)

{

  if((currentMillis — lastUpdate) > updateInterval) //время обновиться

  {

   lastUpdate = millis();

   pos += increment;

   servo.write(pos);

   if ((pos >= 180) || (pos <= 0)) // инициализируем конец вращения

   {

    // инициализируем обратное направление

    increment = -increment;

   }

  }

}

};

 

Flasher led1(11, 123, 400);

Flasher led2(12, 350, 350);

Flasher led3(13, 200, 222);

 

Sweeper sweeper1(25);

Sweeper sweeper2(35);

 

void setup()

{

sweeper1.Attach(9);

sweeper2.Attach(10);

 

// Timer0 уже используется millis() — прерываемся примерно посередине и вызываем ниже функцию «Compare A»

OCR0A = 0xAF;

TIMSK0 |= _BV(OCIE0A);

 

pinMode(2, INPUT_PULLUP);

attachInterrupt(0, Reset, FALLING);

}

 

void Reset()

{

sweeper1.reset();

sweeper2.reset();

}

 

// Прерывание вызывается один раз в миллисекунду, ищет любые новые данные, и если нашло, сохраняет их

SIGNAL(TIMER0_COMPA_vect)

{

unsigned long currentMillis = millis();

sweeper1.Update(currentMillis);

 

// if(digitalRead(2) == HIGH)

{

  sweeper2.Update(currentMillis);

  led1.Update(currentMillis);

}

 

led2.Update(currentMillis);

led3.Update(currentMillis);

}

 

void loop()

{

}

Кухонный таймер [Амперка / Вики]

Проекты на Arduino и Slot Shield

Простой электронный таймер запустит обратный отсчёт и громко пропищит о его окончании. Временной интервал задаётся ручкой потенциометра, а отсчёт запускается и останавливается кнопкой.

Видеоинструкция

Что потребуется

Как собрать

Скетч

Прошейте контроллер скетчем через Arduino IDE.

timer.ino
// Подключаем библиотеку для работы с дисплеем
#include <QuadDisplay2.h>
 
// номер аналогового пина пищалки
#define POT_PIN     A0
// номер цифрового пина пищалки
#define BUZZER_PIN  2
// номер цифрового пина кнопки
#define BUTTON_PIN  4
 
// создаём объект класса QuadDisplay и передаём номер пина CS
QuadDisplay qd(9);
 
// переменная для подсчёта времени
unsigned long prevMillis = 0;
 
// переменная для хранения таймера
int reverseTimer;
 
void setup()
{
  // инициализация дисплея
  qd.begin();
  // функция установки таймера
  settingTimer();
}
void loop()
{
  // если время таймера не дошло до нуля и прошла 1 секунда
  if ((reverseTimer > 0) && ((millis() - prevMillis) > 1000)) {
    // выводим значение на дисплей
    qd.displayInt(--reverseTimer);
    // запоминаем текущее время
    prevMillis = millis();
    // если таймер дошёл до нуля
    if (reverseTimer == 0) {
      // подаём звуковой сигнал и выводим «Off» на дисплей
      qd.displayDigits(QD_NONE, QD_O, QD_f, QD_f);
      tone(BUZZER_PIN, 4000, 200);
    }
  }
  // если нажата кнопка
  if (!digitalRead(BUTTON_PIN)) {
    // подаём звуковой сигнал
    tone(BUZZER_PIN, 500, 500);
    delay(1000);
    // выполняем настройку таймера
    settingTimer();
  }
}
 
// функция настройки таймера
void settingTimer()
{
  // пока кнопка не нажата
  while (digitalRead(BUTTON_PIN)) {
    // считываем значения с потенциометра
    reverseTimer = analogRead(A0);
    // и выводим его на дисплей
    qd.displayInt(reverseTimer);
    delay(30);
  }
  // после нажатия кнопки, подаём звуковой сигнал
  tone(BUZZER_PIN, 2000, 200);
  delay(300);
  tone(BUZZER_PIN, 3000, 200);
  delay(300);
  tone(BUZZER_PIN, 4000, 200);
}

Что дальше?

FAQ

Где скачать и как установить необходимые библиотеки?

У моего модуля QuadDisplay всего три ноги и расположены они слева. Можно ли использовать его в этом проекте?

Да, модуль можно использовать, но скетч, библиотеки и схема сборки отличаются.

Вставьте QuadDisplay в правый нижний слот

Прошейте контроллер скетчем через Arduino IDE.

timer.ino
// Подключаем библиотеку для работы с дисплеем
#include <QuadDisplay.h>
 
// номер аналогового пина потенциометра
#define POT_PIN     A0
// номер цифрового пина пищалки
#define BUZZER_PIN  2
// номер цифрового пина кнопки
#define BUTTON_PIN  4
// номер цифрового пина дисплея
#define DISPLAY_PIN 11
 
// переменная для подсчёта времени
unsigned long prevMillis = 0;
 
// переменная для хранения таймера
int reverseTimer;
 
void setup()
{
  // функция установки таймера
  settingTimer();
}
void loop()
{
  // если время таймера не дошло до нуля и прошла 1 секунда
  if ((reverseTimer > 0) && ((millis() - prevMillis) > 1000)) {
    // выводим значение на дисплей
    displayInt(DISPLAY_PIN, --reverseTimer);
    // запоминаем текущее время
    prevMillis = millis();
    // если таймер дошёл до нуля
    if (reverseTimer == 0) {
      // подаём звуковой сигнал и выводим «Off» на дисплей
      displayDigits(DISPLAY_PIN, QD_NONE, QD_O, QD_f, QD_f);
      tone(BUZZER_PIN, 4000, 200);
    }
  }
  // если нажата кнопка
  if (!digitalRead(BUTTON_PIN)) {
    // подаём звуковой сигнал
    tone(BUZZER_PIN, 500, 500);
    delay(1000);
    // выполняем настройку таймера
    settingTimer();
  }
}
 
// функция настройки таймера
void settingTimer()
{
  // пока кнопка не нажата
  while (digitalRead(BUTTON_PIN)) {
    // считываем значения с потенциометра
    reverseTimer = analogRead(A0);
    // и выводим его на дисплей
    displayInt(DISPLAY_PIN, reverseTimer);
    delay(30);
  }
  // после нажатия кнопки, подаём звуковой сигнал
  tone(BUZZER_PIN, 2000, 200);
  delay(300);
  tone(BUZZER_PIN, 3000, 200);
  delay(300);
  tone(BUZZER_PIN, 4000, 200);
}

Скачайте и установите библиотеку для работы с «трёхногим» дисплеем.

Timelapse таймер на Arduino / Habr

Привет, Хабр!

Одним из моих хобби является, как ни банально, фотография. Пол года назад задумался над созданием таймлапсов. Для создания таймлапсов требуется таймер, на котором можно будет выставлять частоту срабатывания затвора фотоаппарата. В поисках готового и дешевого решения были попытки заказать устройство на ebay, но так как Почта России дважды теряла мой долгожданный таймер, я решил сделать его сам.



Разработка принципиальной схемы

Идея устройства проста: сигнал с потенциометра поступает на АЦП контроллера, тем самым задает интервал выходного сигнала на камеру. Этот интервал будет отображаться на 2 индикаторах, 3-й индикатор будет обозначать нам единицу измерения интервала (секунды или минуты), а также зажигать точку в случае, если значение потенциометра не менялось дольше 1 секунды. Данная индикация нужна была для решения одной проблемы, о которой будет сказано ниже, в конце концов она не оказалось лишней. Так же на устройстве я предусмотрел пару кнопок для ручной подачи сигнала на затвор и фокус.

Управление 7 сегментными индикаторами довольно простое.

Принципиальная схема устройства

Развел плату в Eagle-Cad. Естественно старался все делать на SMD элементах и настолько компактно насколько это позволяет печать на фольге и травление в хлорном железе. В результате вышла плата размером 5х5 см.

В живую.

После этого перевел рисунок на текстолит, вытравил и залудил. Результат на картинке.

Попытался впервые нанести маску, но первый блин комом.

Прошивка

После напайки большей части компонентов настала очередь поработать с прошивкой. Во-первых, залить на ATmega8L бутлоадер Arduino NG. Во-вторых, написать код программы. И уже на первом этапе я понял, что задача не так проста, потому что Arduino NG производится на базе ATmega8 и работает с кварцем на 16 МГц, в отличие от ATmega8L, которая работает с кварцем на 8 МГц. Но благо в интернете много информации по этой теме, например бутлоадер, который помогает сделать Аrduino с кварцем на 8 МГц на 8L (ссылка на бутлоадер). Его я и залил через Arduino IDE. Увы загрузчик постоянно слетал после прошивки первого скетча. Эту проблему я так и не смог устранить, поэтому так и приходилось заново его заливать. Если кто знает как правильно залочить, буду рад помощи.

После этого принялся писать код скетча, но так как мои знания в программировании ограничиваются Паскалем первокурсника и простыми примерами для STM8, то обратился за помощью к коллеге ftp27, который с ярым энтузиазмом решил мне помочь.

Основная проблема состояла в поддержании цикла динамической индикации с одновременным отсчетом таймера для произведения снимка. Благо, в Arduino предусмотрена славная функция mills(), возвращающая кол-во миллисекунд с момента включения устройства. Так как не предусматривалось использование устройства в течении более 1 суток, то эта функция идеально подходила для тайминга.

Данная программа считывает значение с АЦП, проверяет, не изменился ли выбор времени, и если уж он изменился, то производит снимок с новым таймером. Так как значение АЦП довольно таки ощутимо бегает даже если не трогать потенциометр, то было решено брать не более 16 значений времени.

Для пущей экономии было решено выключать индикацию через 10 секунд после последней смены значения потенциометра. Сэкономили 30 мА — мелочь, а приятно.

Все файлы прошивки и схемотехники можно найти здесь (ссылка).

Сборка устройства

После проведения ряда тестов и заливки окончательной прошивки были допаяны остальные элементы. Следующая задача состояла в том, чтобы уложить все это чудо в компактный корпус. В качестве корпуса идеально подошла коробочка из-под губки для обуви. Покрасив её в черный цвет и просверлив необходимые отверстия мы уместили плату и заклеили для надежности клеем.

До

После

В итоге вышло неплохое устройство себестоимостью 200 р., которое исправно работает.

Конечно, можно было пойти по протоптанной тропинке и сделать все на NE555, но очень уж хотелось индикацию и более удобный выбор времени таймера.

В этот же день и сняли свой первый таймлапс прямо из окна рабочего места gif 8Мб.

Таймер на Arduino

Таймер на Arduino.

Скачать скетч (файл расширения flp устанавливается на Arduino при помощи Flprog)

Ссылки на компоненты:

Ардуино UNO — http://ali.pub/z6n3u

ЖК-дисплей LCD1602 (синий экран) — http://ali.pub/alnru

Модуль расширителя интерфейса (I2C) — http://ali.pub/dwj5n

1-канальный Релейный Модуль — http://ali.pub/1gl93z

Таймер на Arduino

Таймер на Arduino — управление энкодером.

Скачать скетч (файл расширения flp устанавливается на Arduino при помощи Flprog)

Ссылки на компоненты:

Ардуино UNO — http://ali.pub/z6n3u

ЖК-дисплей LCD1602 (синий экран) — http://ali.pub/alnru

Модуль расширителя интерфейса (I2C) — http://ali.pub/dwj5n

Энкодер KY-040 — http://ali.pub/1h6eim

1-канальный Релейный Модуль — http://ali.pub/1gl93z

Таймер на Arduino — управление энкодером

Модернизация таймера. Добавлена функция установки количества циклов.

Скачать скетч (файл расширения flp устанавливается на Arduino при помощи Flprog)

Ссылки на компоненты:

Ардуино UNO — http://ali.pub/z6n3u

ЖК-дисплей LCD1602 (синий экран) — http://ali.pub/alnru

Модуль расширителя интерфейса (I2C) — http://ali.pub/dwj5n

Энкодер KY-040 — http://ali.pub/1h6eim

1-канальный Релейный Модуль — http://ali.pub/1gl93z

Оставьте комментарий:

alexxlab

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *