модуль и будильник
- Войдите на сайт для отправки комментариев
Чт, 13/02/2020 - 20:58
Здравствуйте!
Прошу вашей помощи. Сделал Часы с плеером. Добавил будильник. НО:
Нужен тройной будильник. Нужно оповещение утром (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; }
А зачем две библиотеки часов в строка 7 и 8?
Скорей всего забыл убрать. изначально планировал другую работу выполнить. Что-то не обращал внимания)))
По аналогии (clock.setAlarm2(0, 13, 10, 10, DS3231_MATCH_H_M_S)) ставил остальные два будильника, но без результата. Может кто подсказать куда "капать"?. Были мысли брать отчет от 9:00 + 4 часа(13:00) и 9:00 +10часов (19:00), но реализовать не получилось.
DS3231 может аппаратно хранить только одно время для аларма. Поэтому пытаться делать setAlarm() на несколько разных времен бесполезно. Храните время срабатывания в переменных (лучше в массиве) и сравнивайте каждый раз с текущим после строки 118
о-как, вреде можно делать два будильника. По крайней мере так заявляет польский автор библиотеки...поего примеру у меня не вышло(.
Спасибо
Не подскажите, а вообще отсчет от первого будильника можно сделать? У меня мозгов не хватает добиться этого. Если да, то куда смотреть)
Не подскажите, а вообще отсчет от первого будильника можно сделать?
Я завтра посмотрю насчёт двух, я что-то плохо помню, кажется можно, но Вам по любому надо три, так ведь? Поэтому, я бы посоветовал делать не "отсчёт после первого", а просто помнить время каждого из будильников и после срабатывания одного, заводить на время следующего без всяких отсчётов.
Не подскажите, а вообще отсчет от первого будильника можно сделать?
Я завтра посмотрю насчёт двух, я что-то плохо помню, кажется можно, но Вам по любому надо три, так ведь? Поэтому, я бы посоветовал делать не "отсчёт после первого", а просто помнить время каждого из будильников и после срабатывания одного, заводить на время следующего без всяких отсчётов.
Вы имеете ввиду, что без ручного выставления времени, а занесением алгоритма выставлять будильники? Если так, то буду очень благодарен если поможете с этой частью. Огромное человеческое спасибо
В DS3231 два time-of-day alarms. Токо что в даташит глянул.
В DS3231 два time-of-day alarms. Токо что в даташит глянул.
Пользуйтесь одним. Второй всё равно боком.
Пользуйтесь одним. Второй всё равно боком.
Пользуйтесь одним. Второй всё равно боком.
Аларм в RTC имеет смысл если девайс уходи в сон, что бы его по будильнику разбудить. В данном случае луп все время крутится и использовать аппаратный аларм особого смысла нет.
Пользуйтесь одним. Второй всё равно боком.
Так Вам и двух мало. Так что пользуйтесь одним.
А в чём там Вам помощь нужна?
Заводите три времени. Сначала устанавливаете будильник на первое. Как сработает - ставите на второе, как сработает - на третье, а когда и это сработает - снова на первое и так по кругу. И все дела. В чём проблема?
Пользуйтесь одним. Второй всё равно боком.
И как раньше люди с одним будильником жили - ведь все троим нужно было встать в разное время суток...
Пользуйтесь одним. Второй всё равно боком.
Аларм в RTC имеет смысл если девайс уходи в сон, что бы его по будильнику разбудить. В данном случае луп все время крутится и использовать аппаратный аларм особого смысла нет.
За смысл я не писал. Просто проверил, что в МС два аларма доступны.
хм, а не проще чисто программно? - раз в минуту сравнивать время со списком будильников - и можно завести сколько паямти хватит, вечер, утро, на разные дни недели, праздники и тд...
Тут с год назад человек писал расписание звонков для школы - то есть задавал не менее трех десятков будильников в сутки
Пользуйтесь одним. Второй всё равно боком.
Так Вам и двух мало. Так что пользуйтесь одним.
А в чём там Вам помощь нужна?
Заводите три времени. Сначала устанавливаете будильник на первое. Как сработает - ставите на второе, как сработает - на третье, а когда и это сработает - снова на первое и так по кругу. И все дела. В чём проблема?
Евгений, хотел сделать без кнопочного управления. поэтому и спрашиваю совета
а причем тут вообще кнопочное управление?
хм, а не проще чисто программно? - раз в минуту сравнивать время со списком будильников - и можно завести сколько паямти хватит, вечер, утро, на разные дни недели, праздники и тд...
Тут с год назад человек писал расписание звонков для школы - то есть задавал не менее трех десятков будильников в сутки
Товарищ думает, что мы его руками заставляем переставлять время.
Евгений, хотел сделать без кнопочного управления. поэтому и спрашиваю совета
а причем тут вообще кнопочное управление?
Товарищ думает, что мы его руками заставляем переставлять время.
Товарищ думает, что мы его руками заставляем переставлять время.
три раза в сутки? :)
Разговор ведь идет про выставление нового времени после сработки будильника физическим способом, т.е. кнопками или другим управлением? или ошибаюсь?
нет конечно, с чего вы взяли. Все делается программно. как только будильник сработал - программа грузит в модуль RTC следующее время.
Мы вроде на сайте ардуино :) а не домработниц, протирающих часы тряпочкой :)
А можете подсказать как реализовать? или как найти автора темы. Спасибо
судя по вопросу, вы в приведенном коде ни одной буквы не понимаете? - трудно вам будет
Разговор ведь идет про выставление нового времени после сработки будильника физическим способом, т.е. кнопками или другим управлением? или ошибаюсь?
нет конечно, с чего вы взяли. Все делается программно. как только будильник сработал - программа грузит в модуль 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);
???
А можете подсказать как реализовать? или как найти автора темы. Спасибо
судя по вопросу, вы в приведенном коде ни одной буквы не понимаете? - трудно вам будет
А можете подсказать как реализовать? или как найти автора темы. Спасибо
судя по вопросу, вы в приведенном коде ни одной буквы не понимаете? - трудно вам будет
_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);
правильно понимаю?
Зачем в лупе лупить часы постоянной установкой setAlarm1? С охренительной скоростью лупить. Часы не жалко?
правильно понимаю?
не знаю. Весь код приведите.
ЗЫ нашел я ту тему про школьные звонки - вам она не подходит.
Да, тут что-то все совсем печально.
Кто как, а я умываю руки. Тут слишком много обьяснять надо.
Да, тут что-то все совсем печально.
Кто как, а я умываю руки. Тут слишком много обьяснять надо.
правильно понимаю?
не знаю. Весь код приведите.
ЗЫ нашел я ту тему про школьные звонки - вам она не подходит.
Можно ссылку, пожалуйста. может попробую сделать по себя. Благодарю
вот, но только это очень далеко от вашего нынешнего кода
http://arduino.ru/forum/programmirovanie/alarmalarmrepeat-i-pamyat
Добрый чой то я сегодня. Вставте после строки 128 что то вроде
и будет Вам счастье.
Добрый чой то я сегодня. Вставте после строки 128 что то вроде
и будет Вам счастье.
Ругается на "hms = clock.getAlarm1(void);" поставил переменную до setup " int hms = 0;", помогите добить, пожалуйста. Напишите номер карты (попрошу коллегу перевести Вам бонус за помощь). Очень нужно и хочется понять где недоработка моя.
Не int, а RTCAlarmTime.
Учитесь ходить в библиотеку:
Добрый чой то я сегодня.
Пятница?
И чё вчера спеца по межпланетным квадракоптерам забанили? Он бы щас рассказал как надо написать дигиталврите 100500 и все проблемы решились бы :-(
Ругается на "hms = clock.getAlarm1(void);" поставил переменную до setup " int hms = 0;", помогите добить, пожалуйста. Напишите номер карты (попрошу коллегу перевести Вам бонус за помощь). Очень нужно и хочется понять где недоработка моя.
Недоработка - отсутствие знаний по синтаксису вызова процедур. Возьмите книжку по си и прочитайте, как правильно вызывать процедуры без параметров. Не надо ничего никуда ставить. Этот кусок самодостаточен. Место где его надо вставить - однократно выполняемый после срабатывания будильника кусок программы. hms это структура. Её описание есть в библиотеке . Прочитайте, как правильно инициализировать структуры. Ну и подсказка. Если ошибку не найдёте, сходите в пример библиотеки по установке будильника. Там написано правильно, как вызывать функцию getAlarm1.
Согласен с Вами знаний маловато) Будем стараться и набирать. Постараюсь разобраться
Спасибо большое Вам.