продолжить ->

Специальная задача управления


Рассмотрим вариант такой задачи, в котором
надо организовать АВТОМАТИЧЕСКОЕ ВКЛЮЧЕНИЕ РЕЛЕ (установки, прибора, ...) в определенное (одно и то же) время (час, минуту...) КАЖДЫЙ ДЕНЬ И ВЫКЛЮЧЕНИЕ этого устройства в другое определенное время тоже КАЖДЫЙ день.


Для решения этой задачи необходимо устройство, называемое модулем часов реального времени, например

Этот модуль подключается к микроконтроллерной плате и способен отсчитывать точное время и сохранять его даже при отключении основного питания платы, так как он имеет встроенную батарейку (обычно это элемент 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);
}

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



продолжить -->