Alarm.alarmRepeat и память

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

Здравствуйте, подскажите пожалуйста имеется код где на вторник-пятницу расписание одинаковое, можно ли эго как-то упростить, ведь если использовать на каждый день по 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);
......

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016
for (i = dowTuesday; i < dowFriday; i++) {
    for (byte k = 0; 7 < k; k++) { 
        Alarm.alarmRepeat(i,8,0,0,rele); 
    }
}

 

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

там время разное, или просто продублировать строку?

Alarm.alarmRepeat(i,8,0,0,rele);

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Не вижу разного времени в исходном фрагменте.

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

Решил не писать, думаю он не столь важен, если нужно могу написать

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Если оно не столь важно, то просто дублируйте строку, конечно же.

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

sadman41 пишет:

Если оно не столь важно, то просто дублируйте строку, конечно же.

 

Указал ваш код в void setup()

выдало ошибку: 'i' was not declared in this scope

 

вот код:

for (i = dowTuesday; i < dowFriday; i++) {
    for (byte k = 0; 7 < k; k++) { 
Alarm.alarmRepeat(i,7,55,0,rele);  // за 5 минут до ов
Alarm.alarmRepeat(i,8,0,0,rele);  // 1  начало
Alarm.alarmRepeat(i,8,45,0,rele);  // 1  конец
Alarm.alarmRepeat(i,8,55,0,rele);  // 2  начало
Alarm.alarmRepeat(i,9,40,0,rele);  // 2  конец
Alarm.alarmRepeat(i,9,50,0,rele);  // 3  начало
Alarm.alarmRepeat(i,10,35,0,rele);  // 3  конец
Alarm.alarmRepeat(i,10,45,0,rele);  // 4  начало
Alarm.alarmRepeat(i,11,30,0,rele);  // 4  конец
Alarm.alarmRepeat(i,11,45,0,rele);  // 5  начало
Alarm.alarmRepeat(i,12,30,0,rele);  // 5  конец
Alarm.alarmRepeat(i,12,35,0,rele);  // 6  начало
Alarm.alarmRepeat(i,13,20,0,rele);  // 6  конец
Alarm.alarmRepeat(i,13,40,0,rele);  // 7  начало
Alarm.alarmRepeat(i,14,25,0,rele);  // 7  конец
Alarm.alarmRepeat(i,14,30,0,rele);  // 8  начало
Alarm.alarmRepeat(i,15,15,0,rele);  // 8  конец
Alarm.alarmRepeat(i,15,25,0,rele);  // 9  начало
Alarm.alarmRepeat(i,16,10,0,rele);  // 9  конец
Alarm.alarmRepeat(i,16,15,0,rele);  // 10  начало
Alarm.alarmRepeat(i,17,0,0,rele);  // 10  конец
Alarm.alarmRepeat(i,17,10,0,rele);  // 11  начало
Alarm.alarmRepeat(i,17,55,0,rele);  // 11  конец 
    }
}

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Я указал ваш код в void setup(). Результат: 

sketch_nov09a:4: error: 'Alarm' was not declared in this scope
 
Так что пока счет 1:1.
 
kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

Я вас понял. Вот весь код:

#include <Wire.h>
#include <Time.h>
#include <TimeAlarms.h>
#include <DS1307RTC.h>

void setup()
{
  Serial.begin(9600);
  Serial.println("Загружаем настройки..."); 
   setSyncProvider(RTC.get); 
  if (timeStatus() != timeSet) 
    Serial.println("Не удалось получить время!");
  else
    Serial.println("Время успешно получено!");

//Monday
Alarm.alarmRepeat(dowMonday,7,55,0,rele);  // за 5 минут до ов
Alarm.alarmRepeat(dowMonday,8,0,0,rele);  // 1  начало
Alarm.alarmRepeat(dowMonday,8,40,0,rele);
Alarm.alarmRepeat(dowMonday,8,50,0,rele);  // 2  начало
Alarm.alarmRepeat(dowMonday,9,30,0,rele);
Alarm.alarmRepeat(dowMonday,9,40,0,rele);  // 3  начало
Alarm.alarmRepeat(dowMonday,10,20,0,rele);
Alarm.alarmRepeat(dowMonday,10,35,0,rele);  // 4  начало
Alarm.alarmRepeat(dowMonday,11,15,0,rele);
Alarm.alarmRepeat(dowMonday,11,30,0,rele);  // 5  начало
Alarm.alarmRepeat(dowMonday,12,10,0,rele);
Alarm.alarmRepeat(dowMonday,12,20,0,rele); // 6  начало
Alarm.alarmRepeat(dowMonday,13,0,0,rele);
Alarm.alarmRepeat(dowMonday,13,05,0,rele);  // кл.год
Alarm.alarmRepeat(dowMonday,13,35,0,rele);
Alarm.alarmRepeat(dowMonday,13,40,0,rele);  // 8  начало
Alarm.alarmRepeat(dowMonday,14,20,0,rele);
Alarm.alarmRepeat(dowMonday,14,30,0,rele);  // 9  начало
Alarm.alarmRepeat(dowMonday,15,10,0,rele);
Alarm.alarmRepeat(dowMonday,15,20,0,rele);  // 10  начало
Alarm.alarmRepeat(dowMonday,16,0,0,rele);
Alarm.alarmRepeat(dowMonday,16,10,0,rele);  // 11  начало
Alarm.alarmRepeat(dowMonday,16,55,0,rele);
Alarm.alarmRepeat(dowMonday,17,05,0,rele);  // 12  начало
Alarm.alarmRepeat(dowMonday,17,45,0,rele);


//Tuesday - Friday

for (i = dowTuesday; i < dowFriday; i++) {
    for (byte k = 0; 7 < k; k++) { 
Alarm.alarmRepeat(i,7,55,0,rele);  // за 5 минут до 
Alarm.alarmRepeat(i,8,0,0,rele);  // 1  начало
Alarm.alarmRepeat(i,8,45,0,rele);  // 1  конец
Alarm.alarmRepeat(i,8,55,0,rele);  // 2  начало
Alarm.alarmRepeat(i,9,40,0,rele);  // 2  конец
Alarm.alarmRepeat(i,9,50,0,rele);  // 3  начало
Alarm.alarmRepeat(i,10,35,0,rele);  // 3  конец
Alarm.alarmRepeat(i,10,45,0,rele);  // 4  начало
Alarm.alarmRepeat(i,11,30,0,rele);  // 4  конец
Alarm.alarmRepeat(i,11,45,0,rele);  // 5  начало
Alarm.alarmRepeat(i,12,30,0,rele);  // 5  конец
Alarm.alarmRepeat(i,12,35,0,rele);  // 6  начало
Alarm.alarmRepeat(i,13,20,0,rele);  // 6  конец
Alarm.alarmRepeat(i,13,40,0,rele);  // 7  начало
Alarm.alarmRepeat(i,14,25,0,rele);  // 7  конец
Alarm.alarmRepeat(i,14,30,0,rele);  // 8  начало
Alarm.alarmRepeat(i,15,15,0,rele);  // 8  конец
Alarm.alarmRepeat(i,15,25,0,rele);  // 9  начало
Alarm.alarmRepeat(i,16,10,0,rele);  // 9  конец
Alarm.alarmRepeat(i,16,15,0,rele);  // 10  начало
Alarm.alarmRepeat(i,17,0,0,rele);  // 10  конец
Alarm.alarmRepeat(i,17,10,0,rele);  // 11  начало
Alarm.alarmRepeat(i,17,55,0,rele);  // 11  конец 
    }
}




void rele(){


  Serial.println("text");    
}
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
   pinMode(12, OUTPUT);
  Serial.print("Turning pin 13 LED off at ");
  digitalClockDisplay();
  Serial.println("Завершение настройки....");
}

void  loop(){  
  digitalClockDisplay();
  Alarm.delay(1000);
}

void digitalClockDisplay()
{
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.println(); 
}

void printDigits(int digits)
{
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

 

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

kpik пишет:

Решил не писать, думаю он не столь важен, 

Блин, ребята, вы что сегодня ... одному тут ворота уже написал сегодня :)

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

kpik пишет:

Вот весь код:

Стесняюсь спросить, а для чего нужна строка №47?

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

Бездумчиво взята тут

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

Ну, тогда, наверное для чего-то нужна - он мужик грамотный. Правда, я таки не понял для чего (наверное потому, что ещё в тему не вник).

sadman41
Онлайн
Зарегистрирован: 19.10.2016

kpik пишет:
Я вас понял. Вот весь код:

Тогда вот так:

//Tuesday - Friday
  for (time_t i = dowTuesday; i <= dowFriday; i++) {
    Alarm.alarmRepeat(i, 7, 55, 0, rele); // за 5 минут до
...

    Alarm.alarmRepeat(i, 17, 55, 0, rele); // 11  конец
  }

И возьмите нормальные часы вместо 1307, а то школотроны будут разбегаться неупорядоченно.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

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

Ну, тогда, наверное для чего-то нужна - он мужик грамотный. Правда, я таки не понял для чего (наверное потому, что ещё в тему не вник).

Каюсь. Так торопился помочь, что упал, пока бежал. Вследствии этого знак в другую сторону загнулся.

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

sadman41 пишет:

И возьмите нормальные часы вместо 1307, а то школотроны будут разбегаться неупорядоченно.

 

Какие лучше? А то эти действительно бесят с их кварцем правильным

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Хотя бы DS3231

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

Спасибо!

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

sadman41 пишет:

 

Тогда вот так:

//Tuesday - Friday
  for (time_t i = dowTuesday; i <= dowFriday; i++) {
    Alarm.alarmRepeat(i, 7, 55, 0, rele); // за 5 минут до
...

    Alarm.alarmRepeat(i, 17, 55, 0, rele); // 11  конец
  }

 

Странно, но код не работает, монитор порта показывает время, но нет фразы text, в библиотеке подправлен код (строка 3):

 

#if !defined(dtNBR_ALARMS )
#if defined(__AVR__)
#define dtNBR_ALARMS 50   // max is 255
#elif defined(ESP8266)
#define dtNBR_ALARMS 20  // for esp8266 chip - max is 255
#else
#define dtNBR_ALARMS 12  // assume non-AVR has more memory
#endif
#endif

обрабатывает в вашем коде только 8 строк если больше то игнорирует.

 

17 строк при #define dtNBR_ALARMS 77   // max is 255, естественно больше 77 нельзя указать, ведь глобальные переменные уже используют 1529 байт (74%) динамической памяти, оставляя 519 байт для локальных переменных. Максимум: 2048 байт. при значении 77

нужно еще как-то вместить 6 строк

 

используется UNO R3 (CH340G) MEGA328P

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Слушайте, но не могут же карты врать. Я вот их раскинул и они мне подсказали, что в некоей абстрактной библиотеке <TimeAlarms.h> есть функция, которая принимает на входе параметр типа time_t. 

b707
Онлайн
Зарегистрирован: 26.05.2017

да уж,  "незамысловатый" код.  Нужно в неделю давать 70 звонков - создадим 70 алармов :)))) Яркий пример тупого решения задачи "в лоб". Интересно. что бы вы делали, если б звонков было не 70, а 200 ?

Почему не записать расписание в массив - займет байтов 200-300.  И каждое утро ставить алармы только на текущий день?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

b707 пишет:

да уж,  "незамысловатый" код.  Нужно в неделю давать 70 звонков - создадим 70 алармов :)))) Яркий пример тупого решения задачи "в лоб". Интересно. что бы вы делали, если б звонков было не 70, а 200 ?

Можно взять Micro Pro. Или даже сразу Mega2560. Там-то памяти ого-го - на 1023 звонка хватит.

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

sadman41 пишет:

Можно взять Micro Pro. Или даже сразу Mega2560. 

Не, на меге тяжело будет всё впихнуть, надо брать сразу "Sunway TaihuLight"

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

b707 пишет:

да уж,  "незамысловатый" код.  Нужно в неделю давать 70 звонков - создадим 70 алармов :)))) Яркий пример тупого решения задачи "в лоб". Интересно. что бы вы делали, если б звонков было не 70, а 200 ?

Почему не записать расписание в массив - займет байтов 200-300.  И каждое утро ставить алармы только на текущий день?

 

Будьте добры по подробнее.

b707
Онлайн
Зарегистрирован: 26.05.2017

kpik пишет:

Будьте добры по подробнее.

что именно изложить подробнее? Я вроде принцип описал.

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

Что тут непонятного? По такому принципу можно запихнуть в программу несколько сотен событий, а не 70, как сейчас.

b707
Онлайн
Зарегистрирован: 26.05.2017

это расписание звонков в школе или колледже, угадал?

 

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

b707 пишет:

это расписание звонков в школе или колледже, угадал?

 

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

b707
Онлайн
Зарегистрирован: 26.05.2017

kpik пишет:

Совершенно верно Шерлок, в городе 3 школы с бабушками...пара все оптимизировать, но денег не дают, вот решаю своими силами

хорошо, в выходные набросаю вам код - из чувства гражданской сознательности :) если qwone не опередит.

Расписание звонков в скетче из сообщения №8 - правильное?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Бабушки потеряют последнюю работу...

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

b707 пишет:

хорошо, в выходные набросаю вам код - из чувства гражданской сознательности :) если qwone не опередит.

Расписание звонков в скетче из сообщения №8 - правильное?

 

Правильное

b707
Онлайн
Зарегистрирован: 26.05.2017

kpik пишет:

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

бабушки, небось, проклинают вас... последнего куска хлеба лишаете...

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

sadman41 пишет:

Бабушки потеряют последнюю работу...

 

Они полы моют и "за спасибо" жмут огромную кнопку как на станках :) думаю они только в выигрыше) 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Теперя будут жать на большую кнопку "Перезагрузить устройство подачи звоков".

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

sadman41 пишет:

Теперя будут жать на большую кнопку "Перезагрузить устройство подачи звоков".

 

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

sadman41
Онлайн
Зарегистрирован: 19.10.2016

kpik пишет:

sadman41 пишет:

Теперя будут жать на большую кнопку "Перезагрузить устройство подачи звоков".

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

Мой вам совет - собрать с каждой школы по тыще и выдать b707. Тогда у вас будет и звонить и на индикаторе отображаться. Потому как, чую, вы не предусмотрели ни возможности корректировки времени, ни корректировки расписания, ни отключения звонилки. Например - день праздничный или каникула , а ваша адская машина орет сутками не останавливаясь. Или занятия на субботу перенесли, к примеру, с понедельника. Будете бегать, ардуины перепрошивать?

b707
Онлайн
Зарегистрирован: 26.05.2017

sadman41 пишет:

Мой вам совет - собрать с каждой школы по тыще и выдать b707.

не-не-не... благотворительность хороша отсуствием ответственности, а за деньги работать надо :)

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

sadman41 пишет:

Мой вам совет - собрать с каждой школы по тыще и выдать b707. Тогда у вас будет и звонить и на индикаторе отображаться. Потому как, чую, вы не предусмотрели ни возможности корректировки времени, ни корректировки расписания, ни отключения звонилки. Например - день праздничный или каникула , а ваша адская машина орет сутками не останавливаясь. Или занятия на субботу перенесли, к примеру, с понедельника. Будете бегать, ардуины перепрошивать?

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

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

b707 пишет:

не-не-не... благотворительность хороша отсуствием ответственности, а за деньги работать надо :)

 

Расписание не меняется годами, праздники дело нехитрое, кнопка "выкл" уже давно изобретена.

b707
Онлайн
Зарегистрирован: 26.05.2017

kpik пишет:

Расписание не меняется годами, праздники дело нехитрое, кнопка "выкл" уже давно изобретена.

что-то серьезно переделывать не буду, просто попробую перевести скетч из сообщения 8 на работу с массивом. Денег не надо. Мне интересно, насколько уменьшится обьем потребной памяти.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Полагаю, что объем потребной памяти, в самом дубовом решении, уменьшится до одного alarmOnce(). Отзвонил - поставил следующий аларм из массива. 

А те, кто полагает, что годами ничего не меняется и у них всё на мази, как правило, уже через месяцок начинают патчи накладывать и искать, почему у этой гадской железки села батарейка и звонки пошли начиная с 00:00 ))

 

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

sadman41 пишет:

А те, кто полагает, что годами ничего не меняется и у них всё на мази, как правило, уже через месяцок начинают патчи накладывать и искать, почему у этой гадской железки села батарейка и звонки пошли начиная с 00:00 ))

А если условием, что-то вроде если год равен = 0 то не выполнять код далее, а выполнить например другой код который сообщит о проблеме?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

kpik пишет:

А если условием, что-то вроде если год равен = 0 то не выполнять код далее, а выполнить например другой код который сообщит о проблеме?

Ну вот из учета разнообразных вариантов отказа и описания путей их купирования и состоит труд разработчика устройства. Нафигачить кучу алармов - это дело незамысловатое.

Всё это на собственном опыте познаете, когда невыспавшиеся бабушки вас будут в темном углу пластиковыми ведрами дубасить периодически ))

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

sadman41 пишет:

Всё это на собственном опыте познаете, когда невыспавшиеся бабушки вас будут в темном углу пластиковыми ведрами дубасить периодически ))

Вы все правильно написали, думаю что маленькое условие может дать по спать всем + для психованных рядом розетка -> выключи шайтан коробочку и она тебя больше не беспокоит.

 

П.С. Вот бы еще отгребсти пластиковыми, у нас они везде металлические :)

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

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 - время в пятиминутках

typedef	uint8_t time_5;

//
//	Пересчёт астрономического времени в time_5
// Возвращает время в time_t или 0, если m не делится на 5
//
time_5 realTime2Time_5(const uint8_t h, const uint8_t m) {
	return m % 5 ? 0 : ((h - 3) * 12 + m / 5);
}

//
//	Пересчёт времени в time_5 в астронимического время
// Возвращает время время в минутах и часах как беззнаковое целое
// (старший байт - часы, младший - минуты)
//
uint16_t time_52RealTime(const time_5 t) {
	const uint16_t tm = t * 5;
	return tm % 60 + ((tm / 60 + 3) << 8);
}

Теперь у нас каждый звонок - это один байт в таблице. 

Кстати, вторая из приведённых функций вообще-то не нужна, но я сделал её ради проверки корректности первой (запускал пересчёт "туда-сюда", чтобы убедиться, что нигде не лажанулся).

Если в расписании на день они (времена подачи звонков) отсортированы, то алгоритм "звонения" получается проще пареной репы: раз в минуту (по прерыванию от RTC) запускаем realTime2Time_5 и если она вернула не 0, то бинарным поиском (процедурка из 3-5 строк) ищем возращённое значение в таблице звонков. Нашли - звоним, не нашли - снова спим минуту. Вот, собственно и всё. 

Таким макаром, мы с Вами и в тиньку уместимся :))))

Кстати. я бы ещё сюда же приделал показ текущего времени на индикаторе - чтобы это были часы.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Если позволите, то можно же и второй функции найти применение. Взять из таблицы звонков байт, сделать крекс-пекс-фекс, получить часы, минуты, выставить Alarm на RTC и спать, пока та не дернется. Потом взять следующий байт, крекс-пекс-фекс... Как вы считаете?

kpik
kpik аватар
Offline
Зарегистрирован: 09.11.2017

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

Кстати. я бы ещё сюда же приделал показ текущего времени на индикаторе - чтобы это были часы.

 

Часы имеются, могу прикрутить не столь проблема 16/2 без надомности валяются в количестве Н штук.

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

sadman41 пишет:

крекс-пекс-фекс... Как вы считаете?

Можно, конечно. Я то имел в виду каждую минуту просыпаться, чтобы заодно текущее время на экране поменять (функция часов). 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

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

Можно, конечно. Я то имел в виду каждую минуту просыпаться, чтобы заодно текущее время на экране поменять (функция часов). 

Да наврядли тут, конечно, нужен какой-то sleep mode. Просто можно сэкономить копеечку progmem-а на функции поиска, раз уж пошли кромсать под тиньку. Либу выкинуть, алармы ставить прямо на RTC.

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

В любом случае, это решать b707 как и что делать - его проект. Мы можем что-то посоветовать, а решение принимать ему.

b707
Онлайн
Зарегистрирован: 26.05.2017

Евгений, я думал над подобной  "упаковкой звонков", но в итоге решил сделать попроще - по байту на часы и на минуты. Такое расписание легко задать прямо в коде, при необходимости ТС сможет его поменять, добавить новые звонки и тд. А у вашего формата, кмк, большая проблема с наглядностью кодирования исходных значений, да и "конечный пользователь", боюсь запутается.

Кроме того, не вижу смысла так уж ужимать таблицу - каждый хвонок, повторяющийся со вторника по пятницу. я планирую хранить в таблице только один раз. Таким образом, на всю неделю у нас будет всего около 40 звонков и экономия 1 байта на звонок путем существенного усложнения алгоритма не представляется мне эффективной. А если расписание еще и в PROGMEM погрузить, то вопрос о 40 байтах вообще теряет актуальность - в Уно можно загрузить тысячи событий.

Евгений, sadman41 - мне нравится ваша активность. Продолжайте :) Так, глядишь, мне вообще нничего придумывать не придется. Я как благотворительный фонд - рулю другими, сам ничего не делая :)

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

я бы вапще делал 1 таблицу с временами звонков и на каждый день массив с индексами из той таблицы. Не знаю, сыканомил бы байты, но жизнь бы существенно упростилась мне.  А свободное время пропил бы.