Alarm.alarmRepeat и память
- Войдите на сайт для отправки комментариев
Чт, 09/11/2017 - 14:53
Здравствуйте, подскажите пожалуйста имеется код где на вторник-пятницу расписание одинаковое, можно ли эго как-то упростить, ведь если использовать на каждый день по 25 будильников (Alarm.alarmRepeat) то память заканчивается.
п.с. на данный момент код имеет такой вид
// понедельник отдельное расписание Alarm.alarmRepeat(dowMonday,8,0,0,rele); Alarm.alarmRepeat(dowMonday,8,0,0,rele); Alarm.alarmRepeat(dowMonday,8,0,0,rele); Alarm.alarmRepeat(dowMonday,8,0,0,rele); Alarm.alarmRepeat(dowMonday,8,0,0,rele); Alarm.alarmRepeat(dowMonday,8,0,0,rele); Alarm.alarmRepeat(dowMonday,8,0,0,rele); Alarm.alarmRepeat(dowMonday,8,0,0,rele); Alarm.alarmRepeat(dowMonday,8,0,0,rele); ....... // вторник и пятница одинаковые расписания Alarm.alarmRepeat(dowTuesday,8,0,0,rele); Alarm.alarmRepeat(dowTuesday,8,0,0,rele); Alarm.alarmRepeat(dowTuesday,8,0,0,rele); Alarm.alarmRepeat(dowTuesday,8,0,0,rele); Alarm.alarmRepeat(dowTuesday,8,0,0,rele); Alarm.alarmRepeat(dowTuesday,8,0,0,rele); Alarm.alarmRepeat(dowTuesday,8,0,0,rele); ...... Alarm.alarmRepeat(dowWednesday,8,0,0,rele); Alarm.alarmRepeat(dowWednesday,8,0,0,rele); Alarm.alarmRepeat(dowWednesday,8,0,0,rele); Alarm.alarmRepeat(dowWednesday,8,0,0,rele); Alarm.alarmRepeat(dowWednesday,8,0,0,rele); Alarm.alarmRepeat(dowWednesday,8,0,0,rele); Alarm.alarmRepeat(dowWednesday,8,0,0,rele); ...... Alarm.alarmRepeat(dowThursday,8,0,0,rele); Alarm.alarmRepeat(dowThursday,8,0,0,rele); Alarm.alarmRepeat(dowThursday,8,0,0,rele); Alarm.alarmRepeat(dowThursday,8,0,0,rele); Alarm.alarmRepeat(dowThursday,8,0,0,rele); Alarm.alarmRepeat(dowThursday,8,0,0,rele); Alarm.alarmRepeat(dowThursday,8,0,0,rele); ...... Alarm.alarmRepeat(dowFriday,8,0,0,rele); Alarm.alarmRepeat(dowFriday,8,0,0,rele); Alarm.alarmRepeat(dowFriday,8,0,0,rele); Alarm.alarmRepeat(dowFriday,8,0,0,rele); Alarm.alarmRepeat(dowFriday,8,0,0,rele); Alarm.alarmRepeat(dowFriday,8,0,0,rele); Alarm.alarmRepeat(dowFriday,8,0,0,rele); ......
там время разное, или просто продублировать строку?
Не вижу разного времени в исходном фрагменте.
Решил не писать, думаю он не столь важен, если нужно могу написать
Если оно не столь важно, то просто дублируйте строку, конечно же.
Если оно не столь важно, то просто дублируйте строку, конечно же.
Указал ваш код в void setup()
выдало ошибку: 'i' was not declared in this scope
вот код:
Я указал ваш код в void setup(). Результат:
Я вас понял. Вот весь код:
Решил не писать, думаю он не столь важен,
Блин, ребята, вы что сегодня ... одному тут ворота уже написал сегодня :)
Вот весь код:
Стесняюсь спросить, а для чего нужна строка №47?
Бездумчиво взята тут
Ну, тогда, наверное для чего-то нужна - он мужик грамотный. Правда, я таки не понял для чего (наверное потому, что ещё в тему не вник).
Тогда вот так:
И возьмите нормальные часы вместо 1307, а то школотроны будут разбегаться неупорядоченно.
Ну, тогда, наверное для чего-то нужна - он мужик грамотный. Правда, я таки не понял для чего (наверное потому, что ещё в тему не вник).
Каюсь. Так торопился помочь, что упал, пока бежал. Вследствии этого знак в другую сторону загнулся.
И возьмите нормальные часы вместо 1307, а то школотроны будут разбегаться неупорядоченно.
Какие лучше? А то эти действительно бесят с их кварцем правильным
Хотя бы DS3231
Спасибо!
Тогда вот так:
Странно, но код не работает, монитор порта показывает время, но нет фразы text, в библиотеке подправлен код (строка 3):
обрабатывает в вашем коде только 8 строк если больше то игнорирует.
17 строк при #define dtNBR_ALARMS 77 // max is 255, естественно больше 77 нельзя указать, ведь глобальные переменные уже используют 1529 байт (74%) динамической памяти, оставляя 519 байт для локальных переменных. Максимум: 2048 байт. при значении 77
нужно еще как-то вместить 6 строк
используется UNO R3 (CH340G) MEGA328P
Слушайте, но не могут же карты врать. Я вот их раскинул и они мне подсказали, что в некоей абстрактной библиотеке <TimeAlarms.h> есть функция, которая принимает на входе параметр типа time_t.
да уж, "незамысловатый" код. Нужно в неделю давать 70 звонков - создадим 70 алармов :)))) Яркий пример тупого решения задачи "в лоб". Интересно. что бы вы делали, если б звонков было не 70, а 200 ?
Почему не записать расписание в массив - займет байтов 200-300. И каждое утро ставить алармы только на текущий день?
да уж, "незамысловатый" код. Нужно в неделю давать 70 звонков - создадим 70 алармов :)))) Яркий пример тупого решения задачи "в лоб". Интересно. что бы вы делали, если б звонков было не 70, а 200 ?
Можно взять Micro Pro. Или даже сразу Mega2560. Там-то памяти ого-го - на 1023 звонка хватит.
Можно взять Micro Pro. Или даже сразу Mega2560.
Не, на меге тяжело будет всё впихнуть, надо брать сразу "Sunway TaihuLight"
да уж, "незамысловатый" код. Нужно в неделю давать 70 звонков - создадим 70 алармов :)))) Яркий пример тупого решения задачи "в лоб". Интересно. что бы вы делали, если б звонков было не 70, а 200 ?
Почему не записать расписание в массив - займет байтов 200-300. И каждое утро ставить алармы только на текущий день?
Будьте добры по подробнее.
Будьте добры по подробнее.
что именно изложить подробнее? Я вроде принцип описал.
Создаете таблицу звонков в памяти. Например, в виде массива. Каждое ктро, часов в шесть, программа просматривает таблицу и все звонки, относящиеся к этому дню, ставит в виде Алармов.
Что тут непонятного? По такому принципу можно запихнуть в программу несколько сотен событий, а не 70, как сейчас.
это расписание звонков в школе или колледже, угадал?
это расписание звонков в школе или колледже, угадал?
Совершенно верно, в городе 3 школы с бабушками...пара все оптимизировать, но денег не дают, вот решаю своими силами
Совершенно верно Шерлок, в городе 3 школы с бабушками...пара все оптимизировать, но денег не дают, вот решаю своими силами
хорошо, в выходные набросаю вам код - из чувства гражданской сознательности :) если qwone не опередит.
Расписание звонков в скетче из сообщения №8 - правильное?
Бабушки потеряют последнюю работу...
хорошо, в выходные набросаю вам код - из чувства гражданской сознательности :) если qwone не опередит.
Расписание звонков в скетче из сообщения №8 - правильное?
Правильное
Совершенно верно, в городе 3 школы с бабушками...пара все оптимизировать, но денег не дают, вот решаю своими силами
бабушки, небось, проклинают вас... последнего куска хлеба лишаете...
Бабушки потеряют последнюю работу...
Они полы моют и "за спасибо" жмут огромную кнопку как на станках :) думаю они только в выигрыше)
Теперя будут жать на большую кнопку "Перезагрузить устройство подачи звоков".
Теперя будут жать на большую кнопку "Перезагрузить устройство подачи звоков".
Предполагается что при правильном подходе и с вашей помощью эта вероятность снизится к нулю.
Теперя будут жать на большую кнопку "Перезагрузить устройство подачи звоков".
Предполагается что при правильном подходе и с вашей помощью эта вероятность снизится к нулю.
Мой вам совет - собрать с каждой школы по тыще и выдать b707. Тогда у вас будет и звонить и на индикаторе отображаться. Потому как, чую, вы не предусмотрели ни возможности корректировки времени, ни корректировки расписания, ни отключения звонилки. Например - день праздничный или каникула , а ваша адская машина орет сутками не останавливаясь. Или занятия на субботу перенесли, к примеру, с понедельника. Будете бегать, ардуины перепрошивать?
Мой вам совет - собрать с каждой школы по тыще и выдать b707.
не-не-не... благотворительность хороша отсуствием ответственности, а за деньги работать надо :)
Мой вам совет - собрать с каждой школы по тыще и выдать b707. Тогда у вас будет и звонить и на индикаторе отображаться. Потому как, чую, вы не предусмотрели ни возможности корректировки времени, ни корректировки расписания, ни отключения звонилки. Например - день праздничный или каникула , а ваша адская машина орет сутками не останавливаясь. Или занятия на субботу перенесли, к примеру, с понедельника. Будете бегать, ардуины перепрошивать?
Денег нет, а вот вернуться к истокам и тыкать кнопку раз в году не проблема. Ведь Ардуинка будет вспомогающей, а не заменой кнопки.
не-не-не... благотворительность хороша отсуствием ответственности, а за деньги работать надо :)
Расписание не меняется годами, праздники дело нехитрое, кнопка "выкл" уже давно изобретена.
Расписание не меняется годами, праздники дело нехитрое, кнопка "выкл" уже давно изобретена.
что-то серьезно переделывать не буду, просто попробую перевести скетч из сообщения 8 на работу с массивом. Денег не надо. Мне интересно, насколько уменьшится обьем потребной памяти.
Полагаю, что объем потребной памяти, в самом дубовом решении, уменьшится до одного alarmOnce(). Отзвонил - поставил следующий аларм из массива.
А те, кто полагает, что годами ничего не меняется и у них всё на мази, как правило, уже через месяцок начинают патчи накладывать и искать, почему у этой гадской железки села батарейка и звонки пошли начиная с 00:00 ))
А те, кто полагает, что годами ничего не меняется и у них всё на мази, как правило, уже через месяцок начинают патчи накладывать и искать, почему у этой гадской железки села батарейка и звонки пошли начиная с 00:00 ))
А если условием, что-то вроде если год равен = 0 то не выполнять код далее, а выполнить например другой код который сообщит о проблеме?
А если условием, что-то вроде если год равен = 0 то не выполнять код далее, а выполнить например другой код который сообщит о проблеме?
Ну вот из учета разнообразных вариантов отказа и описания путей их купирования и состоит труд разработчика устройства. Нафигачить кучу алармов - это дело незамысловатое.
Всё это на собственном опыте познаете, когда невыспавшиеся бабушки вас будут в темном углу пластиковыми ведрами дубасить периодически ))
Всё это на собственном опыте познаете, когда невыспавшиеся бабушки вас будут в темном углу пластиковыми ведрами дубасить периодически ))
Вы все правильно написали, думаю что маленькое условие может дать по спать всем + для психованных рядом розетка -> выключи шайтан коробочку и она тебя больше не беспокоит.
П.С. Вот бы еще отгребсти пластиковыми, у нас они везде металлические :)
b707,
раз уж Вы решили заняться благотворительностью, позвольте и мне свои пять копеек внести (может на нерукотвоном памятнике Вам, гденить в уголке и упоминанию обо мне место найдётся :))).
Память можно сэкономить радикально, если уместить время звонка в 1 байт. Это сделать легко, если учесть специфику задачи:
1. звонки подаются только в период с 6:00 до 20:00 (ну, ладно, пусть даже с 3:00 до 22:00 - не суть).
2. Время подачи любого звонка кратно 5 минутам (а что, не так? Вы же не собираетесь звонить в 10:57?)
В период с 3:00 до 22:00 умещается 19 часов, т.е. 228 пятиминуток. Всё помещается в байт.
0 соответствует 3:00, 1 - 3:05, 2 - 3:30 ... 227 - 21:55, 228 - 22:00
Ну, собственно, всё. Пересчёт реального времение в наши пятиминутки и обратно тривиален (обозначим через тип time_5 - время в пятиминутках
Теперь у нас каждый звонок - это один байт в таблице.
Кстати, вторая из приведённых функций вообще-то не нужна, но я сделал её ради проверки корректности первой (запускал пересчёт "туда-сюда", чтобы убедиться, что нигде не лажанулся).
Если в расписании на день они (времена подачи звонков) отсортированы, то алгоритм "звонения" получается проще пареной репы: раз в минуту (по прерыванию от RTC) запускаем realTime2Time_5 и если она вернула не 0, то бинарным поиском (процедурка из 3-5 строк) ищем возращённое значение в таблице звонков. Нашли - звоним, не нашли - снова спим минуту. Вот, собственно и всё.
Таким макаром, мы с Вами и в тиньку уместимся :))))
Кстати. я бы ещё сюда же приделал показ текущего времени на индикаторе - чтобы это были часы.
Если позволите, то можно же и второй функции найти применение. Взять из таблицы звонков байт, сделать крекс-пекс-фекс, получить часы, минуты, выставить Alarm на RTC и спать, пока та не дернется. Потом взять следующий байт, крекс-пекс-фекс... Как вы считаете?
Кстати. я бы ещё сюда же приделал показ текущего времени на индикаторе - чтобы это были часы.
Часы имеются, могу прикрутить не столь проблема 16/2 без надомности валяются в количестве Н штук.
крекс-пекс-фекс... Как вы считаете?
Можно, конечно. Я то имел в виду каждую минуту просыпаться, чтобы заодно текущее время на экране поменять (функция часов).
Можно, конечно. Я то имел в виду каждую минуту просыпаться, чтобы заодно текущее время на экране поменять (функция часов).
Да наврядли тут, конечно, нужен какой-то sleep mode. Просто можно сэкономить копеечку progmem-а на функции поиска, раз уж пошли кромсать под тиньку. Либу выкинуть, алармы ставить прямо на RTC.
В любом случае, это решать b707 как и что делать - его проект. Мы можем что-то посоветовать, а решение принимать ему.
Евгений, я думал над подобной "упаковкой звонков", но в итоге решил сделать попроще - по байту на часы и на минуты. Такое расписание легко задать прямо в коде, при необходимости ТС сможет его поменять, добавить новые звонки и тд. А у вашего формата, кмк, большая проблема с наглядностью кодирования исходных значений, да и "конечный пользователь", боюсь запутается.
Кроме того, не вижу смысла так уж ужимать таблицу - каждый хвонок, повторяющийся со вторника по пятницу. я планирую хранить в таблице только один раз. Таким образом, на всю неделю у нас будет всего около 40 звонков и экономия 1 байта на звонок путем существенного усложнения алгоритма не представляется мне эффективной. А если расписание еще и в PROGMEM погрузить, то вопрос о 40 байтах вообще теряет актуальность - в Уно можно загрузить тысячи событий.
Евгений, sadman41 - мне нравится ваша активность. Продолжайте :) Так, глядишь, мне вообще нничего придумывать не придется. Я как благотворительный фонд - рулю другими, сам ничего не делая :)
я бы вапще делал 1 таблицу с временами звонков и на каждый день массив с индексами из той таблицы. Не знаю, сыканомил бы байты, но жизнь бы существенно упростилась мне. А свободное время пропил бы.