Как выполнять ежедневные задачи с Arduino

В этом руководстве мы покажем вам, как выполнять ежедневные задачи с Arduino. Мы будем включать и выключать светодиод в определённое время суток, каждый день. Затем вы сможете легко модифицировать предоставленный пример для выполнения любой другой задачи.

Как выполнять ежедневные задачи с Arduino

Обзор проекта

Обзор проекта - ежедневные задачи с Arduino

Необходимые компоненты

Для этого примера вам понадобятся следующие компоненты (нажмите на ссылки ниже, чтобы найти лучшую цену на Maker Advisor):

Вы можете использовать приведённые выше ссылки или перейти напрямую на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

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

Подключите модуль DS1307 RTC к Arduino и светодиод, как показано на схеме ниже.

Схема подключения Arduino с модулем DS1307 RTC и светодиодом

Вы также можете обратиться к следующей таблице для подключения модуля DS1307 RTC к Arduino.

Вывод модуля DS1307 RTC

Подключение к Arduino Uno

SCL

A5

SDA

A4

VCC

5V

GND

GND

Установка библиотек

Для этого примера вам необходимо установить следующие библиотеки: Time, TimeAlarms и DS1307RTC, созданные Майклом Марголисом (Michael Margolis) и поддерживаемые Полом Стоффрегеном (Paul Stoffregen):

Установка библиотек Time, TimeAlarms и DS1307RTC

Чтобы установить эти библиотеки, в Arduino IDE перейдите в Sketch > Include Library > Manage Libraries. Затем введите название библиотеки для её установки.

Менеджер библиотек Arduino IDE

Установка времени модуля DS1307 RTC

Чтобы установить время модуля DS1307 RTC, вам нужно загрузить следующий скетч на плату Arduino и запустить его один раз:

/*
SetTime.ino sketch to set the time of DS1307 RTC - created by Paul Stoffregen
github.com/PaulStoffregen/DS1307RTC/blob/master/examples/SetTime/SetTime.ino
 */

#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

const char *monthName[12] = {
  "Jan", "Feb", "Mar", "Apr", "May", "Jun",
  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
};

tmElements_t tm;

void setup() {
  bool parse=false;
  bool config=false;

  // get the date and time the compiler was run
  if (getDate(__DATE__) && getTime(__TIME__)) {
    parse = true;
    // and configure the RTC with this info
    if (RTC.write(tm)) {
      config = true;
    }
  }

  Serial.begin(9600);
  while (!Serial) ; // wait for Arduino Serial Monitor
  delay(200);
  if (parse && config) {
    Serial.print("DS1307 configured Time=");
    Serial.print(__TIME__);
    Serial.print(", Date=");
    Serial.println(__DATE__);
  } else if (parse) {
    Serial.println("DS1307 Communication Error :-{");
    Serial.println("Please check your circuitry");
  } else {
    Serial.print("Could not parse info from the compiler, Time=\"");
    Serial.print(__TIME__);
    Serial.print("\", Date=\"");
    Serial.print(__DATE__);
    Serial.println("\"");
  }
}

void loop() {
}

bool getTime(const char *str)
{
  int Hour, Min, Sec;

  if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec) != 3) return false;
  tm.Hour = Hour;
  tm.Minute = Min;
  tm.Second = Sec;
  return true;
}

bool getDate(const char *str)
{
  char Month[12];
  int Day, Year;
  uint8_t monthIndex;

  if (sscanf(str, "%s %d %d", Month, &Day, &Year) != 3) return false;
  for (monthIndex = 0; monthIndex < 12; monthIndex++) {
    if (strcmp(Month, monthName[monthIndex]) == 0) break;
  }
  if (monthIndex >= 12) return false;
  tm.Day = Day;
  tm.Month = monthIndex + 1;
  tm.Year = CalendarYrToTm(Year);
  return true;
}

Посмотреть исходный код

Вот что вы увидите в мониторе порта Arduino IDE:

Монитор порта Arduino IDE - установка времени DS1307 RTC

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

Код

Предоставленный код выключает светодиод каждое утро в 9:00, и включает его каждый вечер в 19:00 (7:00 PM). Скопируйте следующий код в Arduino IDE и загрузите его на плату Arduino.

/*
 *
 * Complete project details at https://randomnerdtutorials.com
 * Based on TimeAlarmExample from TimeAlarms library created by Michael Margolis
 *
 */

#include <TimeLib.h>
#include <TimeAlarms.h>
#include <Wire.h>
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t

const int led = 7;

void setup() {
  // prepare pin as output
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);

  Serial.begin(9600);
  // wait for Arduino Serial Monitor
  while (!Serial) ;

  // get and set the time from the RTC
  setSyncProvider(RTC.get);
  if (timeStatus() != timeSet)
     Serial.println("Unable to sync with the RTC");
  else
     Serial.println("RTC has set the system time");

  // to test your project, you can set the time manually
  //setTime(8,29,0,1,1,11); // set time to Saturday 8:29:00am Jan 1 2011

  // create the alarms, to trigger functions at specific times
  Alarm.alarmRepeat(9,0,0,MorningAlarm);  // 9:00am every day
  Alarm.alarmRepeat(19,0,0,EveningAlarm);  // 19:00 -> 7:00pm every day
}

void loop() {
  digitalClockDisplay();
  // wait one second between each clock display in serial monitor
  Alarm.delay(1000);
}

// functions to be called when an alarm triggers
void MorningAlarm() {
  // write here the task to perform every morning
  Serial.println("Tturn light off");
  digitalWrite(led, LOW);
}
void EveningAlarm() {
  // write here the task to perform every evening
  Serial.println("Turn light on");
  digitalWrite(led, HIGH);
}

void digitalClockDisplay() {
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println();
}
void printDigits(int digits) {
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

Посмотреть исходный код

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

Импорт библиотек

Сначала вы импортируете необходимые библиотеки для создания временных будильников и для взаимодействия с модулем RTC:

#include <TimeLib.h>
#include <TimeAlarms.h>
#include <Wire.h>
#include <DS1307RTC.h>

Получение времени

В функции setup() вы получаете время от RTC следующей строкой:

setSyncProvider(RTC.get);

Вы также выводите сообщение в монитор порта, чтобы знать, было ли время успешно синхронизировано:

if (timeStatus() != timeSet)
  Serial.println("Unable to sync with the RTC");
else
 Serial.println("RTC has set the system time");

Вы можете установить время вручную – просто раскомментируйте следующую строку. Это особенно полезно для тестирования ваших скетчей, потому что вы можете легко изменить время и проверить, срабатывают ли будильники.

//setTime(8,29,0,1,1,11); // set time to Saturday 8:29:00am Jan 1 2011

Настройка будильников

Следующая строка запускает функцию MorningAlarm в 9:00 утра каждый день. Функция MorningAlarm определена после цикла loop().

Alarm.alarmRepeat(9,0,0, MorningAlarm); // 9:00am every day

Чтобы изменить время, вам нужно просто изменить числа 9,0,0 на желаемое время. Первое число – это часы, второе число – минуты, а третье – секунды.

Функция EveningAlarm срабатывает в 7:00 вечера (19:00) каждый день.

Alarm.alarmRepeat(19,0,0, EveningAlarm); // 19:00 -> 7:00pm every day

loop()

В функции loop() вы отображаете время в мониторе порта каждую секунду, вызывая функцию digitalClockDisplay(), определённую далее в коде.

void loop() {
  digitalClockDisplay();
  Alarm.delay(1000); // wait one second between clock display
}

Определение задач

Функции MorningAlarm() и EveningAlarm() будут вызваны в то время, которое вы определили в функции setup().

Чтобы изменить ваши задачи, вам просто нужно написать свои задачи внутри функций MorningAlarm() и EveningAlarm().

void MorningAlarm() {
  // write here the task to perform every morning
  Serial.println("Alarm: - turn lights off");
  digitalWrite(led, LOW);
}
void EveningAlarm() {
  // write here the task to perform every evening
  Serial.println("Alarm: - turn lights on");
  digitalWrite(led, HIGH);
}

Здесь мы просто выводим сообщение в монитор порта и включаем/выключаем светодиод.

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

Заключение

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

  • Включение/выключение освещения в определённое время

  • Закрытие оконных жалюзи

  • Кормление домашних животных

Планируете ли вы использовать ежедневные задачи Arduino в одном из ваших проектов? Дайте нам знать, оставив комментарий ниже.

Если вам нравится Arduino, вам могут понравиться следующие статьи:

Надеемся, что эта статья была вам полезна. Спасибо за чтение.