Помогите с алгоритмом для скетча.

droideka
Offline
Зарегистрирован: 21.11.2018

Прошу прощения за не совсем внятный заголовок.

Суть такова, есть arduino uno + модуль ethernet (ENC28J60) + твердотельное реле + моудль SDcard + RTC модуль (DS3231) + сайт, на котором пользователь вбивает время запуска.
Задача банальна: включать реле по расписанию, с этим проблем нет, когда нужно включать 2-5 раз в сутки и строго в определеное время. В таком случае можно обойтись несколькими If. Я хочу сделать возможность загружать раписание с сайта и сохранять его на SD карту.

Вопрос вот в чем:
1. В каком формате лучше выгружать в файл расписание, массив? (map)
2. Как лучше сравнивать время в цикле? (switch case)? или перебирать в цикле все элементы массива, пока не найдется совпадение по часам, а потом перебирать по минутам?
3. Можно ли при помощи датчика типа MAX471 определить есть напряжение (не более 5В и 0,5А) или нет, точность не нужна.  Или это можно сделать при помощи самого arduino?

 

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

1. txt;

2. Перебирать timestamp (unixtime);

3. Можно при помощи оптопары.

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

1. В удобном. Мы же не знаем, что именно Вы подразумеваете под словом "расписание" и какими свойствами оно обладает.

2. Опять же, мы не знаем, что такое "расписание". В общем случае количество пунктов расписания может быть разным. Если это так, switch не подходит. Используем цикл. Но не отдельно по часам, минутам, секундам и т.д., а приводим время к одним единицам (например, к секундам с начала суток или недели - смотря какое расписание) и только потом сравниваем.

droideka
Offline
Зарегистрирован: 21.11.2018

sadman41 пишет:

2. Перебирать timestamp (unixtime);

Тогда видимо время (расписание) в файл проще выгружать сразу в виду timestamp. А потом считывать строки и загонять их в массив?

droideka
Offline
Зарегистрирован: 21.11.2018

andriano пишет:

1. В удобном. Мы же не знаем, что именно Вы подразумеваете под словом "расписание" и какими свойствами оно обладает.


Вы задали очень правильный вопрос. Пока что расписание - просто указанное время, по типу чч:мм, без указания даты или дня недели. Но, видимо надо будет использовать timestamp, если делать расписание на неделю, или более.

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

droideka пишет:

sadman41 пишет:

2. Перебирать timestamp (unixtime);

Тогда видимо время (расписание) в файл проще выгружать сразу в виду timestamp. А потом считывать строки и загонять их в массив?

Видимо так. И еще: timestamp - это uint32_t, он же unsigned long. Хранение строк в памяти МК излишне. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Проблема 2038? Пофиг?

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

Эта проблема всех накроет, не то что ардуинки ))

Logik
Offline
Зарегистрирован: 05.08.2014

droideka пишет:

andriano пишет:

1. В удобном. Мы же не знаем, что именно Вы подразумеваете под словом "расписание" и какими свойствами оно обладает.


Вы задали очень правильный вопрос. Пока что расписание - просто указанное время, по типу чч:мм, без указания даты или дня недели. Но, видимо надо будет использовать timestamp, если делать расписание на неделю, или более.

Так определяйтесь чего надо.  Тогда и формат определится точней. timestamp - плохая идея, очень не удобно и избыточно. На ПК для работы с ним куча готовых функций, а здесь сочинять прийдется. Текст - вобще отстой. Только двоичный формат удобный для контроллера и достаточный для задачи.

Вобще надо определится прежде всего с необходимой точностю. Может до минут или до 5 минут, а может и десяток минут нормально. Чем ниже точность тем экономней  хранение и обработка. Избыточная точность сразу выдает идиота, оно понятно что можна заложить миллисекунды и с ними долбатся))

 Мне в одном проекте, где точность не важна особо, понравилось хранить время в виде шестиминутных интервалов. Тогда в сутках таких 240 и они в байт влазят. А вместо времени конца интервала можна его длительность в минутах (или в секундах или в других интервалах)  хранить. Как лучше - от специфики задачи все. Если предполагается много интервалов в сутках то можна хранить в виде битового графика. Каждый бит задает вкл. или выкл реле в очередной временной интервал. Много разных фокусов есть..

А зачем файл и SD если вроде должно в EEPROM влазить без проблем?

 

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

Что там сочинять-то? Всё уже украдено до нас: https://www.nongnu.org/avr-libc/user-manual/group__avr__time.html

Logik
Offline
Зарегистрирован: 05.08.2014

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

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

Ой, ну началось. Поди и memset() не достоин быть примененным в коде скетча для ардуины без тотального переписывания, да?

droideka
Offline
Зарегистрирован: 21.11.2018

Logik пишет:

Так определяйтесь чего надо.  Тогда и формат определится точней. timestamp - плохая идея, очень не удобно и избыточно. На ПК для работы с ним куча готовых функций, а здесь сочинять прийдется. Текст - вобще отстой. Только двоичный формат удобный для контроллера и достаточный для задачи.

Вобще надо определится прежде всего с необходимой точностю. Может до минут или до 5 минут, а может и десяток минут нормально. Чем ниже точность тем экономней  хранение и обработка. Избыточная точность сразу выдает идиота, оно понятно что можна заложить миллисекунды и с ними долбатся))

Мне в одном проекте, где точность не важна особо, понравилось хранить время в виде шестиминутных интервалов. Тогда в сутках таких 240 и они в байт влазят. А вместо времени конца интервала можна его длительность в минутах (или в секундах или в других интервалах)  хранить. Как лучше - от специфики задачи все. Если предполагается много интервалов в сутках то можна хранить в виде битового графика. Каждый бит задает вкл. или выкл реле в очередной временной интервал. Много разных фокусов есть..

А зачем файл и SD если вроде должно в EEPROM влазить без проблем?

Ну тогда можно более точно конкретизировать задачу: скрипт PHP раз в сутки выгружает в файл время включения и выключения реле, только часы и минуты (можно в сразу в двоичном коде). Точность нужна только до минут, секунды не важны. Arduino раз в сутки посылает запрос, загружает файл txt и и берет из него данные, (можно дополнительно сделать проверку по имени файла, чтобы лишний раз ничего не скачивать, только нужно ли это?). Такое решение позволит работать только с часами и минутами, без обработки дат. В среднем получается 20-25 временных точек, когда нужно включать реле. А SD просто было в комплекте, почему бы и не использовать его. Я же новичок, так что хочеться научиться использовать и его.

Logik
Offline
Зарегистрирован: 05.08.2014

ОК. "20-25 временных точек, когда нужно включать реле" - очевидно стокоже чтоб выключать. Принимаем 50 точек. Точность до минуты - два байта на точку. Можна полтора байта, но геморно, принимаем 2байта. Итого 100 байт на расписание. Если выбрать битовый график - 24*60/8=180 байт. Учитывая что есть SD и много места, я бы выбрал битовый график. С ним работать проще, менше нюансов с перекрытиями интервалом и их порядком - например нет ситуации когда в одной записи расписания задано что сейчас включено а в другом - выключено. А с такой "шизофренией" боротся не легко.

Logik
Offline
Зарегистрирован: 05.08.2014

sadman41 пишет:

Ой, ну началось. Поди и memset() не достоин быть примененным в коде скетча для ардуины без тотального переписывания, да?

Не ровняйте с memset() всякий высер. Вы гарантируете что тот код рабочий?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Logik пишет:

sadman41 пишет:

Ой, ну началось. Поди и memset() не достоин быть примененным в коде скетча для ардуины без тотального переписывания, да?

Не ровняйте с memset() всякий высер. Вы гарантируете что тот код рабочий?

Брат! Ты про какой код? Садман1 дал ссылку на стандартную avr-libc, ТУ САМУЮ, которая входит в состав и ардуино ИДЕ и memset() из нее же. ;))))) Прости за то, что указываю на невнимательность... со всеми бывает.  Но привычка говорить прежде, чем осознать, тебя когда-нибудь погубит. Сорри ;))))))))))

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

Может ложика тоже на "олигофрению" перекидывает форум... Других предположений у меня нет.

Logik
Offline
Зарегистрирован: 05.08.2014

wdrakula пишет:

 ТУ САМУЮ, которая входит в состав и ардуино ИДЕ

Так и давал бы ссылку в составе ИДЕ, мне че их сличать сидеть)))))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Logik пишет:

wdrakula пишет:

 ТУ САМУЮ, которая входит в состав и ардуино ИДЕ

Так и давал бы ссылку в составе ИДЕ, мне че их сличать сидеть)))))

Это ОФИЦИАЛЬНЫЙ сайт avr-libc

https://www.nongnu.org/avr-libc/

Сличать ничего не надо. По адресу сразу видно было. Просто ты пока неофит в GNUсностях ;)))) Ты ж, поди, всю жисть на "Винде" богомерзкой програмировал? ;))))) В ентих ваших "фреймворках"?  И только теперь, купив Оранж Пи и Ардуинку, пришел наконец к добрым, улыбающимся людям из Мира Опенсорса! Гы!!!!!!

Logik
Offline
Зарегистрирован: 05.08.2014

Так не сайт https://www.arduino.cc Ну не знал sadman41 что оно и в ide дал где нашел. А мне оно не интересно вообще. Не, не прав, с GNU на примере Wine давно сталкивался лет так 10 до ардуино, задачи бывают разными иногда клиент - жлоб, денег даже на железо под винду не дает (хотя речь о магазинах обуви топового сегмента была, на кассы для бонусной системы). Наплевался знатно, тормозило зачетно. "к добрым, улыбающимся людям" - бум считать что это сарказм, их улыбки абсолютно соответствуют улыбкам сотрудников кредитных отделов, ломбардов и продавцев лотореи. Но давай в полезной теме без флуда. Мой жизненый путь мы можем в другом месте обсудить. ОК?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Резкий ты, как диарея! Это сарказм был, никак задеть не хотел. Ну и про то, что тема полезная - верю, что тоже срказм. ;))))

 

droideka
Offline
Зарегистрирован: 21.11.2018

Logik пишет:

ОК. "20-25 временных точек, когда нужно включать реле" - очевидно стокоже чтоб выключать. Принимаем 50 точек. Точность до минуты - два байта на точку. Можна полтора байта, но геморно, принимаем 2байта. Итого 100 байт на расписание. Если выбрать битовый график - 24*60/8=180 байт. Учитывая что есть SD и много места, я бы выбрал битовый график. С ним работать проще, менше нюансов с перекрытиями интервалом и их порядком - например нет ситуации когда в одной записи расписания задано что сейчас включено а в другом - выключено. А с такой "шизофренией" боротся не легко.

А если исключить временные точки выключения? Включение реле не более 5-7 минут, а при отключении arduino, реле все равно будет выключаться, но при включении arduino все равно проводить проверку работы реле (включено или нет). Простите за тафтологию. И не могли бы Вы кинуть ссылками на пример работы с битовыми графиками, а то для меня это пока очень ново.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ТС! У тебя еще модуль часов 3231, на нём еще 4К ЕЕПРОМ.  Это тыщща будильников без извращениий.

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

без извращений на будильник нужен час и минута: 5 бит + 6 бит = 11 бит. До двух байт еще 5 бит лишних. Можно длительность или мелодию или день недели упаковать. Если недь недели, то еще два бита останется...

Logik
Offline
Зарегистрирован: 05.08.2014

droideka пишет:

Logik пишет:

ОК. "20-25 временных точек, когда нужно включать реле" - очевидно стокоже чтоб выключать. Принимаем 50 точек. Точность до минуты - два байта на точку. Можна полтора байта, но геморно, принимаем 2байта. Итого 100 байт на расписание. Если выбрать битовый график - 24*60/8=180 байт. Учитывая что есть SD и много места, я бы выбрал битовый график. С ним работать проще, менше нюансов с перекрытиями интервалом и их порядком - например нет ситуации когда в одной записи расписания задано что сейчас включено а в другом - выключено. А с такой "шизофренией" боротся не легко.

А если исключить временные точки выключения? Включение реле не более 5-7 минут, а при отключении arduino, реле все равно будет выключаться, но при включении arduino все равно проводить проверку работы реле (включено или нет). Простите за тафтологию. И не могли бы Вы кинуть ссылками на пример работы с битовыми графиками, а то для меня это пока очень ново.

та какая там работа, развлечение одно;)

  Пусть состояние реле храним в массиве byte R[180]; Тогда в любой момент  с RTC вытянули ЧЧ и ММ и считаем минуты от начала суток как МНС=60*ЧЧ+ММ. А состояние реле в этот момент получаем как R[МНС/8]  &  (1<<(МНС & 7)). Ну а если в файле - seek на байт R[МНС/8] прочитать байт и ему сделать &  (1<<(МНС & 7)). Вобщем каждый битик - состояние реле в течении одной минуты, а положение этого битика в массиве  R - где эта минута в сутках расположена.

По сравнению с поиском в массиве, да еще и если не сортированом - просто шара.

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

Лоджик, не мороси.

В IDE спокойно подключается эта либа. Так же как и вачдог и пр. Просто создатели IDE рассчитывают на более-менее умных людей, а не на тех, которые, газанув в лужу и пытаясь сохранить лицо, в который раз истерику устраивают. На этот раз в стиле: на сайте arduino.cc нет - значит код - говно. 

В конце-концов тебя никто не заставляет ей пользоваться. 

memset(), кстати, тоже не описан на arduino.cc . И сотни других, avr-lib'овских функций. 

 

Logik
Offline
Зарегистрирован: 05.08.2014

sadman41 пишет:

В конце-концов тебя никто не заставляет ей пользоваться. 

memset(), кстати, тоже не описан на arduino.cc . И сотни других, avr-lib'овских функций. 

 

от спасибо что разрешил не пользоватся тонами гамнища. Так дальше и буду ограничиватся возможностями gcc.

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

Ворота пишет:

Проблема 2038? Пофиг?

К тому времени появятся 64-разрядные Ардуинки.

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

andriano пишет:

Ворота пишет:

Проблема 2038? Пофиг?

К тому времени появятся 64-разрядные Ардуинки.

uint64_t в ардуинке работает ;) Только timestamp всё равно 32 бита...

Logik
Offline
Зарегистрирован: 05.08.2014

Господа. И дамы. Даффайте не зафлуживать темку. У человека оч конкретный вопрос с довольно распостраненной задачей. Великолепно побазарить и про 64-битную ардуину с проблемой 2038 года и библиотеками avr-lib дето в другой теме. И я поучаствую.

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

Ложик, базарить за avr-lib начал ты.

Я понимаю, что тебе, как Архату хочется показать, как ты битами туда-сюда мотаешь, чтобы все ахнули и пали ниц, однако применение timestamp и библиотеки time ровно так же относится к теме, как все твои посты. За исключением #19. Но своё-то не пахнет, да?

Хотя... наверное просто ты не можешь не оставить за собой последнее слово. Давай, пиши. Я отвечать не стану.

Logik
Offline
Зарегистрирован: 05.08.2014

не стану кормить троля, отвалил - это к добру.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

sadman41 пишет:
ты не можешь не оставить за собой последнее слово
Таки, не смог :(

А пук в лужу был знатный! Не знать стандартную службу времени, которой столько же лет, сколько и самому С,которая описана в стандарте языка - это нечто. Логик в своём репертуаре.

ТС, тебе именно это и надо, что SadMan говорит. Никакой библиотеки устанавливать не надо, просто напишешь #include <time.h> и всего делов, пользуйся. 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Извините, но не написано ни одной строки программы, но говна (извините) налито полными ушатами. И это в теме "программирование".

Logik
Offline
Зарегистрирован: 05.08.2014

Ниче не поделаеш, такие тут ... ээ ...  товарищи. Припрутся в тему про помогите с алгоритмом с советом "просто напишешь #include <time.h> и всего делов, пользуйся. "  Пидеры... чего с них взять... не обращайте внимание.. Но в принципе ТС получил ответ на свой вопрос, надеюсь ему полезный будет. А остальное - издержки безплатной консультации рускоязычного форума.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Logik пишет:

 #include <cс.h> 

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

Logik
Offline
Зарегистрирован: 05.08.2014

mykaida пишет:

Logik пишет:

 #include <cс.h> 

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

cс.h - это еще чего такое, я вроде не писал так ))))

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Logik пишет:

mykaida пишет:

Logik пишет:

 #include <cс.h> 

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

cс.h - это еще чего такое, я вроде не писал так ))))

СС.Н это не библиотека - это задача для захода в "Си для начинающих". Пишется через #IF перед компилятором и выдает отсутствие cс.h..

Logik
Offline
Зарегистрирован: 05.08.2014

Прям перед компилятором 8). Ага. Пятница - она такая ;) Но в любом случае не приписывайте мне эту толи библиотеку, толи проверку. Подозреваю что имеется ввиду защита от повторного включения хедера, ну да встречается в природе, а че так торкнуло?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

главное в скетче на писать строки

#include "голову"
#include "руки"

 

Logik
Offline
Зарегистрирован: 05.08.2014

Не переживай,  включать голову при написании скетча народ не спешит.

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

qwone пишет:

главное в скетче на писать строки

#include "голову"
#include "руки"

 

 

+++

droideka
Offline
Зарегистрирован: 21.11.2018

Вот к сожалению так на каждом форуме в русскоговорящем сообществе, флуда 80%, нужной информации - 5%.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

droideka пишет:

Вот к сожалению так на каждом форуме в русскоговорящем сообществе, флуда 80%, нужной информации - 5%.

Зато на иностраных выложены счета с деньгами, который всякий желающий может получить. У меня два вопроса: 1- почему вы тусуетесь здесь, 2 - почему Вам не стать тем кто будет выкладывать здесь 80% нужной информации. Может вам не нужна нужная информациия , а надо просто потролить форум.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

droideka пишет:

Вот к сожалению так на каждом форуме в русскоговорящем сообществе, флуда 80%, нужной информации - 5%.

Таки, да :)