модуль и будильник

EnergY123
Offline
Зарегистрирован: 13.02.2020

Здравствуйте!

Прошу вашей помощи. Сделал Часы с плеером. Добавил будильник. НО: 

Нужен тройной будильник. Нужно оповещение утром (9:00), днем (13:00)и вечером (19:00).  Накидал скетч. По аналогии (clock.setAlarm2(0, 13, 10, 10, DS3231_MATCH_H_M_S)) ставил остальные два будильника, но без результата. Может кто подсказать куда "капать"?. Были мысли брать отчет от 9:00 + 4 часа(13:00) и 9:00 +10часов (19:00), но реализовать не получилось.  Помогите, пожалуйста. работы много и пропускаешь часто нужное время для приема лекарств).

Кнопку просто "припаял", для баловства с плеером.

Библиотека на модуль часов от https://github.com/jarzebski/Arduino-DS3231

Сайт  библиотеки http://www.jarzebski.pl

//************ПОДКЛЮЧАЕМ БИБЛИОТЕКИ***************************************
#include <SoftwareSerial.h>     // подключаем библиотеку SoftwareSerial
#include <DFPlayer_Mini_Mp3.h> // подключаем библиотеку DFPlayer_Mini_Mp3
#include <OLED_I2C.h>         // Подключение библиотеки для дисплея
#include <Wire.h>            // Подключаем бибилиотеку для работы с I2C устройствами
#include <Time.h>           // для часов
#include <DS1307RTC.h>
#include <DS3231.h>           // Подключаем библиотеку для работы с RTC DS3231
//*************************************************************************

DS3231 clock;                 // Связываем объект clock с библиотекой DS3231
RTCDateTime DateTime;         // Определяем сущность структуры RTCDateTime (описанной в библиотеке DS3231) для хранения считанных с часов даты и времени
RTCAlarmTime Alarm1;          // Определяем сущность структуры RTCAlarmTime (описанной в библиотеке DS3231) для хранения считанных с первого будильника настроек даты и времени

boolean isAlarm = false;      // Логическая переменная для обработки сигнала о срабатывании будильника
boolean alarmState = false;   // Логическая переменная для обработки индикации при срабатывании будильника
bool isClick = 1; 
int pinButton = 4;
SoftwareSerial mySerial(11, 10); // используем PIN 10 и PIN 11 для программного порта// 11 - RX, 10 - TX

OLED  myOLED(SDA, SCL, 8);    
extern uint8_t MegaNumbers[]; // Подключение больших шрифтов
extern uint8_t SmallFont[];   // Подключение маленьких шрифтов
extern uint8_t RusFont[];
#define DS3231_ADDRESS 0x68
 byte tMSB, tLSB;
 float temp3231;
 
void alarmFunction()                                  // Функция, вызываемая при срабатывании будильника
 {
  isAlarm = true;                                     // Присваиваем значение "истина" переменной для обработки срабатывания будильника
 }
 
void setup () {
  pinMode(pinButton, INPUT_PULLUP);  
  mySerial.begin (9600); // открываем софт-порт
  clock.begin();                    // Инициализируем работу с объектом библиотеки DS3231
  clock.enableOutput(false);        // Определяем назначение вывода SQW (INT) для генерации прерываний при сработке будильников
  mp3_set_serial (mySerial); // задаем порт для плеера
  mp3_set_volume (15); //устанавливаем уровень громкости
 myOLED.begin();
 
//***************************************настраиваем будильник***************************************************
clock.setAlarm1(0, 9, 10, 10, DS3231_MATCH_H_M_S);     // Установить будильник-каждые 09ч: 10м: 10С в каждый день
attachInterrupt(0, alarmFunction, FALLING);            // Задаем функцию для обработки прерывания 0 (на пине 2)
}
//***************************************************************************************************************

void loop () {
   isClick = ClickButton(isClick);
   if (isClick == 0)
   {
      mp3_play(random(1, 10));
      Serial.println("Play");
   }
  tmElements_t tm;
  (RTC.read(tm)) ; //читаем данные из часов
  myOLED.setBrightness(255); // устанавливаем яркость. от 0 до 255. При 0 свечение в половину яркости.
  myOLED.setFont(SmallFont); //Ставим маленький шрифт
  myOLED.setFont(RusFont); //Используем русскоязычный шрифт
 // myOLED.printNumI(tm.Wday, 16, 0);
switch (tm.Wday+1) // В этой переменной содержится значение дня недели. Начиная с воскресенья
  {
    case 1:     myOLED.print("DJCRHTCTYMT", CENTER, 0);    break; //воскресенье
    case 2:     myOLED.print("GJYTLTKMYBR", CENTER, 0);    break; // Отображение дня недели, тут понедельник
    case 3:     myOLED.print("DNJHYBR", CENTER, 0);        break; //вторник
    case 4:     myOLED.print("CHTLF", CENTER, 0);          break; // итд
    case 5:     myOLED.print("XTNDTHU", CENTER, 0);        break;
    case 6:     myOLED.print("GZNYBWF", CENTER, 0);        break;
    case 7:     myOLED.print("CE<<JNF", CENTER, 0);        break;
    }  
  myOLED.printNumI(get3231Temp(), 0, 0);// выводим температуру микросхемы часов 
  myOLED.setFont(MegaNumbers); //Подключаем большие шрифты для часов.
  if(tm.Hour < 10)
  {
  myOLED.print("0", 4, 13); 
  myOLED.printNumI(tm.Hour, 26, 13);
  }
  else
  {
    myOLED.printNumI(tm.Hour, 4, 13);
  }
  myOLED.print("/", 51, 13);  // Отображение двоеточия
  if (tm.Minute<10){                  //далее отображаем минуты, 
    myOLED.print("0", 75, 13);        //если минут менее 10, то отображаем первым 0
    myOLED.printNumI(tm.Minute, 97, 13);
  }
  else {
  myOLED.printNumI(tm.Minute, 75, 13);
  }
  
  myOLED.setFont(SmallFont);
  if (tm.Day<10){
    myOLED.print("0", 40, 57);
    myOLED.printNumI(tm.Day , 46, 57);// Отображение даты 
  }
  else {
  myOLED.printNumI(tm.Day , 40, 57); // Отображение даты
  }
   myOLED.print("." , 52, 57);// Отображение даты
  if (tm.Month<10){
  myOLED.print("0" , 56, 57);// Отображение даты  
  myOLED.printNumI(tm.Month , 62, 57);// Отображение даты  
  }
  else{
  myOLED.printNumI(tm.Month , 56, 57);// Отображение даты
  }
  myOLED.print("." , 68, 57);// Отображение даты
  myOLED.printNumI(50+1970 , 73, 57);// Отображение даты
  myOLED.update();
  delay(500);
  myOLED.setFont(MegaNumbers);                     // Скрытие двоеточия
  myOLED.print("-", 51, 12);
  myOLED.update();
  delay(500);
  
//первый будильник (начало)**********************************************************
  DateTime = clock.getDateTime();   // Считываем c часов текущие значения даты и времени в сущность DateTime
  Alarm1 = clock.getAlarm1();    // Считываем c первого будильника текущие настройки даты и времени в сущность Alarm1
  Serial.println("Alarm: " + String(clock.dateFormat("H:i:s", Alarm1)));      // Выводим настройки будильника
  Serial.println();                                                               // Перевод строки
  if (isAlarm)                                                                    // Если поступил сигнал о сработке будильника
  {
     mp3_play(random(11, 13)); // Отправляем логическое значение выводу питания светодиода при каждом срабатывании будильника
     Serial.println("Play");                                           
    alarmState = !alarmState; // Меняем это значение на противоположное
    isAlarm = false;       // Отключаем сигнал о сработке будильника
    clock.clearAlarm1();    // Очищаем состояние сработки будильника
   }
 }
 
float get3231Temp()
 {
   //temp registers (11h-12h) get updated automatically every 64s
   Wire.beginTransmission(DS3231_ADDRESS);
   Wire.write(0x11);
   Wire.endTransmission();
   Wire.requestFrom(DS3231_ADDRESS, 2);    //Функция по считыванию и преобразованию температуры микросхемы 
   if(Wire.available()) {
     tMSB = Wire.read(); //2's complement int portion
     tLSB = Wire.read(); //fraction portion      
     temp3231 = (tMSB & B01111111); //do 2's math on Tmsb
     temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8
   }
   else {
     //oh noes, no data!
   }   
   return temp3231;
 }

// метод обработки нажатия кнопки
boolean ClickButton(boolean lastClick)
{   
  boolean clickButton = digitalRead(pinButton);
  if (clickButton != lastClick)
  {
    delay(5);
    clickButton = digitalRead(pinButton);
  }
  return clickButton;
}

 

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

А зачем две библиотеки часов в строка 7 и 8?

EnergY123
Offline
Зарегистрирован: 13.02.2020

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

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

EnergY123 пишет:

 По аналогии (clock.setAlarm2(0, 13, 10, 10, DS3231_MATCH_H_M_S)) ставил остальные два будильника, но без результата. Может кто подсказать куда "капать"?. Были мысли брать отчет от 9:00 + 4 часа(13:00) и 9:00 +10часов (19:00), но реализовать не получилось.  

 

DS3231 может аппаратно хранить только одно время для аларма. Поэтому пытаться делать setAlarm() на несколько разных времен бесполезно. Храните время срабатывания в переменных (лучше в массиве) и сравнивайте каждый раз с текущим после строки 118

EnergY123
Offline
Зарегистрирован: 13.02.2020

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

Спасибо

EnergY123
Offline
Зарегистрирован: 13.02.2020

Не подскажите, а вообще отсчет от первого будильника можно сделать? У меня мозгов не хватает добиться этого. Если да, то куда смотреть)

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

EnergY123 пишет:

Не подскажите, а вообще отсчет от первого будильника можно сделать?

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

EnergY123
Offline
Зарегистрирован: 13.02.2020

ЕвгенийП пишет:

EnergY123 пишет:

Не подскажите, а вообще отсчет от первого будильника можно сделать?

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

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

sadman41
Offline
Зарегистрирован: 19.10.2016

В DS3231 два time-of-day alarms. Токо что в даташит глянул.

EnergY123
Offline
Зарегистрирован: 13.02.2020

sadman41 пишет:

В DS3231 два time-of-day alarms. Токо что в даташит глянул.

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Пользуйтесь одним. Второй всё равно боком.

EnergY123
Offline
Зарегистрирован: 13.02.2020

sadman41 пишет:

Пользуйтесь одним. Второй всё равно боком.

Извините,одного мало) Спасибо

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

sadman41 пишет:

Пользуйтесь одним. Второй всё равно боком.

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

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

EnergY123 пишет:

sadman41 пишет:

Пользуйтесь одним. Второй всё равно боком.

Извините,одного мало) Спасибо

Так Вам и двух мало. Так что пользуйтесь одним.

А в чём там Вам помощь нужна? 

Заводите три времени. Сначала устанавливаете будильник на первое. Как сработает - ставите на второе, как сработает - на третье, а когда и это сработает - снова на первое и так по кругу. И все дела. В чём проблема?

sadman41
Offline
Зарегистрирован: 19.10.2016

EnergY123 пишет:

sadman41 пишет:

Пользуйтесь одним. Второй всё равно боком.

Извините,одного мало) Спасибо

И как раньше люди с одним будильником жили - ведь все троим нужно было встать в разное время суток...

sadman41
Offline
Зарегистрирован: 19.10.2016

asam пишет:

sadman41 пишет:

Пользуйтесь одним. Второй всё равно боком.

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

За смысл я не писал. Просто проверил, что в МС два аларма доступны.

b707
Offline
Зарегистрирован: 26.05.2017

хм, а не проще чисто программно? - раз в минуту сравнивать время со списком будильников - и можно завести сколько паямти хватит, вечер, утро, на разные дни недели, праздники и тд...

Тут с год назад человек писал расписание звонков для школы - то есть задавал не менее трех десятков будильников в сутки

EnergY123
Offline
Зарегистрирован: 13.02.2020

ЕвгенийП пишет:

EnergY123 пишет:

sadman41 пишет:

Пользуйтесь одним. Второй всё равно боком.

Извините,одного мало) Спасибо

Так Вам и двух мало. Так что пользуйтесь одним.

А в чём там Вам помощь нужна? 

Заводите три времени. Сначала устанавливаете будильник на первое. Как сработает - ставите на второе, как сработает - на третье, а когда и это сработает - снова на первое и так по кругу. И все дела. В чём проблема?

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

b707
Offline
Зарегистрирован: 26.05.2017

EnergY123 пишет:

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

а причем тут вообще кнопочное управление?

EnergY123
Offline
Зарегистрирован: 13.02.2020

b707 пишет:

хм, а не проще чисто программно? - раз в минуту сравнивать время со списком будильников - и можно завести сколько паямти хватит, вечер, утро, на разные дни недели, праздники и тд...

Тут с год назад человек писал расписание звонков для школы - то есть задавал не менее трех десятков будильников в сутки

А можете подсказать как реализовать? или как найти автора темы. Спасибо

sadman41
Offline
Зарегистрирован: 19.10.2016

Товарищ думает, что мы его руками заставляем переставлять время.

EnergY123
Offline
Зарегистрирован: 13.02.2020

b707 пишет:

EnergY123 пишет:

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

а причем тут вообще кнопочное управление?

Разговор ведь идет про  выставление нового времени после сработки будильника физическим способом, т.е. кнопками или другим управлением? или ошибаюсь?

EnergY123
Offline
Зарегистрирован: 13.02.2020

sadman41 пишет:

Товарищ думает, что мы его руками заставляем переставлять время.

да, такие мысли посетили меня))

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Товарищ думает, что мы его руками заставляем переставлять время.

три раза в сутки? :)

b707
Offline
Зарегистрирован: 26.05.2017

EnergY123 пишет:

Разговор ведь идет про  выставление нового времени после сработки будильника физическим способом, т.е. кнопками или другим управлением? или ошибаюсь?

нет конечно, с чего вы взяли. Все делается программно. как только будильник сработал - программа грузит в модуль RTC следующее время.

Мы вроде на сайте ардуино :) а не домработниц, протирающих часы тряпочкой :)

b707
Offline
Зарегистрирован: 26.05.2017

EnergY123 пишет:

 А можете подсказать как реализовать? или как найти автора темы. Спасибо

судя по вопросу, вы в приведенном коде ни одной буквы не понимаете? - трудно вам будет

EnergY123
Offline
Зарегистрирован: 13.02.2020

b707 пишет:

EnergY123 пишет:

Разговор ведь идет про  выставление нового времени после сработки будильника физическим способом, т.е. кнопками или другим управлением? или ошибаюсь?

нет конечно, с чего вы взяли. Все делается программно. как только будильник сработал - программа грузит в модуль RTC следующее время.

Мы вроде на сайте ардуино :) а не домработниц, протирающих часы тряпочкой :)

спасибо, расмешили))))))

правильно ли будет  сделать так?:

_d = 0;

_h = 9;

_m = 0;

_s = 0;

_d = 0;

_h = 13;

_m = 0;

_s = 0;

_d = 0;

_h = 19;

_m = 0;

_s = 0;

clock.setAlarm1(_d, _h, _m, _d, DS3231_MATCH_H_M_S); 

??? 

EnergY123
Offline
Зарегистрирован: 13.02.2020

b707 пишет:

EnergY123 пишет:

 А можете подсказать как реализовать? или как найти автора темы. Спасибо

судя по вопросу, вы в приведенном коде ни одной буквы не понимаете? - трудно вам будет

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

EnergY123
Offline
Зарегистрирован: 13.02.2020

b707 пишет:

EnergY123 пишет:

 А можете подсказать как реализовать? или как найти автора темы. Спасибо

судя по вопросу, вы в приведенном коде ни одной буквы не понимаете? - трудно вам будет

Данные пишу в setup:

 

 _d = 0;

_h = 9;

_m = 0;


_s = 0;

_d = 0;


_h = 13;


_m = 0;


_s = 0;

_d = 0;


_h = 19;


_m = 0;


_s = 0;

а луп clock.setAlarm1(_d, _h, _m, _d, DS3231_MATCH_H_M_S);  

правильно понимаю?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Зачем в лупе лупить часы постоянной установкой setAlarm1? С охренительной скоростью лупить. Часы не жалко?

b707
Offline
Зарегистрирован: 26.05.2017

EnergY123 пишет:

правильно понимаю?

не знаю. Весь код приведите.

ЗЫ нашел я ту тему про школьные звонки - вам она не подходит.

 

b707
Offline
Зарегистрирован: 26.05.2017

Да, тут что-то все совсем печально.

Кто как, а я умываю руки.  Тут слишком много обьяснять надо.

EnergY123
Offline
Зарегистрирован: 13.02.2020

b707 пишет:

Да, тут что-то все совсем печально.

Кто как, а я умываю руки.  Тут слишком много обьяснять надо.

Возможно мои знания и  "совсем печальны". Возраст не тот. Пытаюсь разобраться сам. Спасибо, что заходили, b707. Хорошего времени суток Вам.  с уважением

EnergY123
Offline
Зарегистрирован: 13.02.2020

b707 пишет:

EnergY123 пишет:

правильно понимаю?

не знаю. Весь код приведите.

ЗЫ нашел я ту тему про школьные звонки - вам она не подходит.

 

Можно ссылку, пожалуйста. может попробую сделать по себя. Благодарю

b707
Offline
Зарегистрирован: 26.05.2017

EnergY123 пишет:

Можно ссылку, пожалуйста. может попробую сделать по себя. Благодарю

вот, но только это очень далеко от вашего нынешнего кода

http://arduino.ru/forum/programmirovanie/alarmalarmrepeat-i-pamyat

nik182
Онлайн
Зарегистрирован: 04.05.2015

Добрый чой то я сегодня. Вставте после строки 128 что то вроде

    RTCAlarmTime hms;
    hms = clock.getAlarm1(void);
    switch (hms.hour)
    {
      case 9 : hms.hour = 13; break;
      case 13 : hms.hour = 19; break;
      case 19 : hms.hour = 9; break;
    }
    clock.setAlarm1(0, hms.hour, 10, 10, DS3231_MATCH_H_M_S);     

и будет Вам счастье.

 

EnergY123
Offline
Зарегистрирован: 13.02.2020

nik182 пишет:

Добрый чой то я сегодня. Вставте после строки 128 что то вроде

    RTCAlarmTime hms;
    hms = clock.getAlarm1(void);
    switch (hms.hour)
    {
      case 9 : hms.hour = 13; break;
      case 13 : hms.hour = 19; break;
      case 19 : hms.hour = 9; break;
    }
    clock.setAlarm1(0, hms.hour, 10, 10, DS3231_MATCH_H_M_S);     

и будет Вам счастье.

 

nik182, благодарю за Вашу доброту!

Ругается на "hms = clock.getAlarm1(void);" поставил переменную до setup " int hms = 0;", помогите добить, пожалуйста. Напишите номер карты (попрошу коллегу перевести Вам бонус за помощь). Очень нужно и хочется понять где недоработка моя.

sadman41
Offline
Зарегистрирован: 19.10.2016

Не int, а RTCAlarmTime.

Учитесь ходить в библиотеку:

RTCAlarmTime DS3231::getAlarm1(void) {
...
}

 

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

nik182 пишет:

Добрый чой то я сегодня. 

Пятница?

И чё вчера спеца по межпланетным квадракоптерам забанили? Он бы щас рассказал как надо написать дигиталврите 100500 и все проблемы решились бы :-(

nik182
Онлайн
Зарегистрирован: 04.05.2015

EnergY123 пишет:

Ругается на "hms = clock.getAlarm1(void);" поставил переменную до setup " int hms = 0;", помогите добить, пожалуйста. Напишите номер карты (попрошу коллегу перевести Вам бонус за помощь). Очень нужно и хочется понять где недоработка моя.

Недоработка - отсутствие знаний по синтаксису вызова процедур. Возьмите книжку по си и прочитайте, как правильно вызывать процедуры без параметров. Не надо ничего никуда ставить. Этот кусок самодостаточен. Место где его надо вставить - однократно выполняемый после срабатывания будильника кусок программы. hms это структура. Её описание есть в библиотеке . Прочитайте, как правильно инициализировать структуры.   Ну и подсказка. Если ошибку не найдёте, сходите в пример библиотеки по установке будильника. Там написано правильно, как вызывать функцию getAlarm1. 

EnergY123
Offline
Зарегистрирован: 13.02.2020

Согласен с Вами знаний маловато) Будем стараться и набирать. Постараюсь разобраться

Спасибо большое Вам.