RTC Часы

Suren
Offline
Зарегистрирован: 19.12.2017

Привет всем.Я сделал обычный RTC часы,который показывает часы и дату.Все работает отлично.Сейчас хочю,чтобы,скажем в 21:00, на быходе arduino nano D10 было наприжение 5V,то есть когда будет 21:00 делать следушее digitalWrite(D10, HIGH);

Вот код...

#include <LiquidCrystal.h>
#include <DS1307.h>
 
DS1307 rtc(6, 7);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int led = 8;
 
void setup()
{
  pinMode(led, OUTPUT);
  rtc.halt(false);
  lcd.begin(16, 2);
 
  // The following lines can be commented out to use the values already stored in the DS1307
// rtc.setDOW(MON);        // Set Day-of-Week to SUNDAY
// rtc.setTime(00, 45, 45);     // Set the time to 12:00:00 (24hr format)
 //rtc.setDate(19, 12, 2017);   // Set the date to October 3th, 2010
}
 
void loop()
{
  lcd.setCursor(0, 0);
  lcd.print("Time: ");
  
  lcd.setCursor(6, 0);
  lcd.print(rtc.getTimeStr());
  
  lcd.setCursor(0, 1);
  lcd.print("Date: ");
  
  lcd.setCursor(6, 1);
  lcd.print(rtc.getDateStr(FORMAT_LONG));
 
 if (Вот тут нужна помощь)
 {
  digitalWrite(led, HIGH);
 }
}
Suren
Offline
Зарегистрирован: 19.12.2017

За ранее спасибо Всем.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Suren пишет:

Сейчас хочю,чтобы,скажем в 21:00, на быходе arduino nano D10 было наприжение 5V,то есть когда будет 21:00 делать следушее digitalWrite(D10, HIGH);

Ну, хоЧЕТЕ, и что? Я вот, может быть "Ларису Ивановну хочЮ", так что ж теперь? Хотите - делайте. У Вас какие-то проблемы?

Suren
Offline
Зарегистрирован: 19.12.2017

Я думаю Вы на армянском точно ничего не напишите.Так что извините за мой русский.

А проблема в том,что не могу читать часы,то есть не могу написать функцию чтоб на 21:00 на выходе D10 у меня был HIGH

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Посмотрите пример в библиотеке. похоже что так

#include <LiquidCrystal.h>
#include <DS1307.h>

DS1307 rtc(6, 7);
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int led = 8;

Time  t;

void setup()
{
  pinMode(led, OUTPUT);
  rtc.halt(false);
  lcd.begin(16, 2);

  // The following lines can be commented out to use the values already stored in the DS1307
  // rtc.setDOW(MON);        // Set Day-of-Week to SUNDAY
  // rtc.setTime(00, 45, 45);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(19, 12, 2017);   // Set the date to October 3th, 2010
}

void loop()
{
  // Получить данные из DS1307
  t = rtc.getTime();

  lcd.setCursor(0, 0);
  lcd.print("Time: ");

  lcd.setCursor(6, 0);
  lcd.print(rtc.getTimeStr());

  lcd.setCursor(0, 1);
  lcd.print("Date: ");

  lcd.setCursor(6, 1);
  lcd.print(rtc.getDateStr(FORMAT_LONG));

  if (t.hour == 21)
  {
    digitalWrite(led, HIGH);
  }
}

 

Suren
Offline
Зарегистрирован: 19.12.2017

Вот спасибо,вот молодец.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Suren пишет:

А проблема в том,что не могу читать часы,то есть не могу написать функцию чтоб на 21:00 на выходе D10 у меня был HIGH

Тут есть маленькая хитрость.

На словах мы говориим так: "нужно ровно в 21:00 переключить пин". Но (если нет аппаратной поддержки такой команды) в точности запрограммировать это невозможно, т.к. контроллер работает с ограниченной скоростью и:

- сначала часы переключатся в 21:00,

- потом контроллер считает их показания,

- потом ему нужно время на сравнение и принятие решения,

- а потом еще время на переключение пина.

Т.е. на самом деле переключение произойдет не в 21:00, а немного позже. Но это действительно очено "немного", так что, как правило, переживать по этому поводу не стоит.

Но есть еще один момент - Вам ведь нужно один раз переключать из LOW в HIGH, а не осуществлять переключение несколько тысяч раз в секунду (а у конотрллера хватит скорости, чтобы сделать именно так). Поэтому Вам нужно завести переменную, которая будет соответствовать состоянию пина. При переключении пина одновременно изменить значение переменной. И потом, когда часы по прежнему будут показывать подходящее для переключения время, проверить переменную - если она уже в новом состоянии, второй (третий...сотый) раз переключать пин уже не нужно - он и так находится в нужном состоянии.

 

Кстати, код из потса №4 делает именно так, как я не рекомендую - по достижении заданного времени будет долюбить пин без конца.

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

Suren пишет:
Сейчас хочю,чтобы,скажем в 21:00, на быходе arduino nano D10 было наприжение 5V

Для этого лучше взять модуль RTC на чипе DS3231, у которого есть два аппаратных будильника. По цене - не сильно дороже, зато по точности - значительно лучше.