Рассмотрим вариант такой задачи, в котором
надо организовать АВТОМАТИЧЕСКОЕ ВКЛЮЧЕНИЕ РЕЛЕ (установки, прибора, ...)
в определенное (одно и то же) время (час,
минуту...)
КАЖДЫЙ ДЕНЬ И ВЫКЛЮЧЕНИЕ
этого устройства
в другое
определенное время тоже КАЖДЫЙ день.
Для решения этой задачи необходимо устройство, называемое модулем часов
реального времени, например
Этот модуль подключается к микроконтроллерной плате и способен отсчитывать
точное время и сохранять его даже при отключении основного питания платы,
так как он имеет встроенную батарейку (обычно это элемент CR2032).
В режиме работы от такой батарейки модуль отсчитывает и хранит время на протяжении
до десятка лет!
Одним из наиболее часто используемых модулей ЧРВ (RTC - Real Time Clock) является
микросхема DS3231 от Dallas Semiconductors, которая имеет встроенный
кварцевый генератор с термостабилизацией.
Эти часы реального времени отсчитывают и хранят в своей памяти
год, месяц, день недели, часы, минуты, секунды. Дата конца месяца определяется
автоматически, с учетом каждого високосного года. Модуль может показывать время
в двух форматах: 12 или 24 часа. В 12-ти часовом формате дается указание
времени суток (AM/PM).
Чтобы увидеть ВРЕМЯ, которое хранится в этих часах, нам нужно подключить модуль
DS3231 к "Ардуино", например, так:

Далее (если это НОВЫЙ модуль) надо установить в
этом модуле время, от которого
начнётся отсчет и данные этого отсчета будут храниться в этом модуле,
т.е. запускается программа установки:
Теперь надо ОТКЛЮЧИТЬ питание "Ардуино", снова ВКЛЮЧИТЬ и запустить какую-либо
программу, например, такую:
Далее, снова ОТКЛЮЧИТЬ питание "Ардуино", ВКЛЮЧИТЬ и запустить
основную программу, которая
выводит ТЕКУЩЕЕ ВРЕМЯ на монитор компьютера, управляющего МК платой:
____________
Основная программа показа времени
на мониторе управляющего компьютера:
#include <DS1307RTC.h>
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
uint32_t tt = 0;
void setup() {
Serial.begin(9600);
while (!Serial) ; // wait until Arduino Serial Monitor opens
setSyncProvider(RTC.get);
// the function to get the time from the RTC
if(timeStatus() != timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
}
void loop(){
if (timeStatus() == timeSet) {
digitalClockDisplay(); delay(1000);}
else {
Serial.println("The time has not been set. Please run the Time");
delay(4000);
}
}
void digitalClockDisplay()
{
// digital clock display of the time
Serial.print("time: ");
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print("/ day: ");
Serial.print(day());
Serial.print("/ month: ");
Serial.print(month());
Serial.print("/ year: ");
Serial.print(year());
Serial.println();
}
void printDigits(int digits){
// utility function for digital clock display:
// prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
Запустив эту программу и включив "Монитор порта", мы должны увидеть
на экране 'бегущее текущее' время:
Предлагаем сделать это и проверить работу часов реального времени в этом
проекте!
Сведения о текущем ВРЕМЕНИ могут быть показаны на экране
мобильного устройства, подключаемого к "Ардуино" по Bluetooth
связи или по WiFi.
Задание: составьте проект, решающий эту подЗАДАЧУ - выведите
текущее время на
экран вашего мобильного устройства !
Решение должно содержать:
a) схему-рисунок устройства ("Ардуино"- часы - модуль Bluetooth),
б) программу в "Arduino-IDE",
в) выбор программы-приложения по чтению данных по
каналу Bluetooth
г) фото экрана мобильного устройства с показом данных текущего времени
перешлите все это на электронную почту E-mail: doo.svl@yandex.ru
Сведения о текущем ВРЕМЕНИ могут быть показаны И на
текстовых ЖК экранах (LCD), применяемых для вывода показаний датчиков,
отображения простых меню, подсказок и приветствий.
Соберем цепь-проект-схему:

Составим и запустим программу (внимательно читайте комментарии в программе)
вывода текущего времени на такой экран:
Программа вывода времени на LCD дисплей
И на монитор компьютера:
#include <DS1307RTC.h>// библиотека часов
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
#include <LiquidCrystal.h> //Подключим библиотеку для работы с дисплеем
// назначим переменную для дисплея
// подключаем дисплей к пинам ардуино
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7)
int m; //минуты
int h=; //часы
int s=; //секунды
uint32_t tt = 0;
void setup() {
Serial.begin(9600);
while (!Serial) ; // wait until Arduino Serial Monitor opens
setSyncProvider(RTC.get);
// the function to get the time from the RTC
if(timeStatus() != timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
}
void loop() {
if (timeStatus() == timeSet) {
digitalClockDisplay();}
else {
Serial.println("The time has not been set. Please run the Time");
delay(4000);
}
delay(990);
//Вывод на дисплей времени
lcd.begin(16, 2); //Задаем размерность экрана формат:
//кол-во символов в строке на кол-во строк
lcd.setCursor(0, 0); //Устанавливаем курсор в начало 1й строки
lcd.print("Time:"); //Выводим надпись "Time:"
lcd.setCursor(6, 0); //Устанавливаем курсор в 6й знак, 1й строки
lcd.print(hour());
//Выводим часы
lcd.setCursor(8, 0); //Устанавливаем курсор в 8й знак, 1й строки
lcd.print(":"); //Вывод двоеточие
lcd.setCursor(9, 0); //Устанавливаем курсор в 9й знак, 1й строки
lcd.print(minute());
//выводим минуты
lcd.setCursor(11, 0); //Устанавливаем курсор в 11й знак, 1й строки
lcd.print(":"); // Вывод двоеточие
lcd.setCursor(12, 0); //Устанавливаем курсор в 12й знак, 1й строки
lcd.print(second());
//Выводим секунды
lcd.setCursor(0, 1); //Устанавливаем курсор в 0й знак, 2й строки
lcd.print("Year:"); //Выводим надпись "Year:"
lcd.setCursor(6, 1); //Устанавливаем курсор в 6й знак, 1й строки
lcd.print(year());
lcd.print("/");
lcd.setCursor(11, 1); //Устанавливаем курсор в 11й знак, 1й строки
lcd.print(month());
lcd.print("/");
lcd.setCursor(13, 1); //Устанавливаем курсор в 13й знак, 1й строки
lcd.print(day());
}
void digitalClockDisplay(){
// digital clock display of the time
Serial.print("time: ");
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print("/ day: ");
Serial.print(day());
Serial.print("/ month: ");
Serial.print(month());
Serial.print("/ year: ");
Serial.print(year());
Serial.println();
}
void printDigits(int digits){
// utility function for digital clock display:
// prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
если мы запустим эту программу, то увидим на дисплее:

Отлично, но мы еще не решили поставленную задачу
- время мы уже умеем фиксировать, ТЕПЕРЬ
нужно собрать схему для автоматического ВКЛЮЧЕНИЯ
РЕЛЕ (пин9)
и индикации момента его включения (одновременное включение светодиода
(пин8)), например,
КАЖДЫЙ ДЕНЬ в 15 часов 45 минут И автоматического вЫключения
всего этого в 16 часов 45 минут того же дня.
Соберем вот такую схему:

Теперь напишем программу, решающую эту задачу.
Вот такая программа:
Программа включения РЕЛЕ по времени
#include <DS1307RTC.h>
#include <Time.h>
#include <TimeLib.h>
#include <Wire.h>
int Led0 = 8; //ledY
int Led1 = 9; //RELE
uint32_t tt = 0;
void setup() {
Serial.begin(9600);
pinMode(Led0, OUTPUT); //Y 8
pinMode(Led1, OUTPUT); //R 9
while (!Serial) ; // wait until Arduino Serial Monitor opens
setSyncProvider(RTC.get);
// the function to get the time from the RTC
if(timeStatus() != timeSet)
Serial.println("Unable to sync with the RTC");
else
Serial.println("RTC has set the system time");
}
void loop(){
if (timeStatus() == timeSet) {
digitalClockDisplay();}
else {
Serial.println("The time has not been set. Please run the Time");
delay(4000);
}
///////////////////////////////////////////////////
//включение нагрузки на 8 и 9 пинах в 15.45 и отключение в 16.45
if ((hour() == 15) && (minute() == 45)){
digitalWrite(Led0, HIGH); // 8 Y
digitalWrite(Led1, HIGH); // 9 R
}
if ((hour()==16) && (minute()>=45)){
digitalWrite(Led0, LOW); // 8 Y
digitalWrite(Led1, LOW); // 9 R
}
//// таких блоков может быть насколько - разное ВРЕМЯ разные НАГРУЗКИ
}
void digitalClockDisplay(){
int n;
n=Serial.read(); //пуск канала обмена данных по USB
if (n=='9'){
//вывод времени в монитор порта компьютера
// по команде "9"
// digital clock display of the time
Serial.print("time: ");
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print("/ day: ");
Serial.print(day());
Serial.print("/ month: ");
Serial.print(month());
Serial.print("/ year: ");
Serial.print(year());
Serial.println();
}
}
void printDigits(int digits){
// utility function for digital clock display:
// prints preceding colon and leading 0
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
Совет-Задание - соберите эту схему, напишите эту программу и проверьте её работу,
задавая различное время для пуска и остановки устройств и процессов.
|