Помогите с алгоритмом для скетча.
- Войдите на сайт для отправки комментариев
Прошу прощения за не совсем внятный заголовок.
Суть такова, есть arduino uno + модуль ethernet (ENC28J60) + твердотельное реле + моудль SDcard + RTC модуль (DS3231) + сайт, на котором пользователь вбивает время запуска.
Задача банальна: включать реле по расписанию, с этим проблем нет, когда нужно включать 2-5 раз в сутки и строго в определеное время. В таком случае можно обойтись несколькими If. Я хочу сделать возможность загружать раписание с сайта и сохранять его на SD карту.
Вопрос вот в чем:
1. В каком формате лучше выгружать в файл расписание, массив? (map)
2. Как лучше сравнивать время в цикле? (switch case)? или перебирать в цикле все элементы массива, пока не найдется совпадение по часам, а потом перебирать по минутам?
3. Можно ли при помощи датчика типа MAX471 определить есть напряжение (не более 5В и 0,5А) или нет, точность не нужна. Или это можно сделать при помощи самого arduino?
1. txt;
2. Перебирать timestamp (unixtime);
3. Можно при помощи оптопары.
1. В удобном. Мы же не знаем, что именно Вы подразумеваете под словом "расписание" и какими свойствами оно обладает.
2. Опять же, мы не знаем, что такое "расписание". В общем случае количество пунктов расписания может быть разным. Если это так, switch не подходит. Используем цикл. Но не отдельно по часам, минутам, секундам и т.д., а приводим время к одним единицам (например, к секундам с начала суток или недели - смотря какое расписание) и только потом сравниваем.
2. Перебирать timestamp (unixtime);
Тогда видимо время (расписание) в файл проще выгружать сразу в виду timestamp. А потом считывать строки и загонять их в массив?
1. В удобном. Мы же не знаем, что именно Вы подразумеваете под словом "расписание" и какими свойствами оно обладает.
Вы задали очень правильный вопрос. Пока что расписание - просто указанное время, по типу чч:мм, без указания даты или дня недели. Но, видимо надо будет использовать timestamp, если делать расписание на неделю, или более.
2. Перебирать timestamp (unixtime);
Тогда видимо время (расписание) в файл проще выгружать сразу в виду timestamp. А потом считывать строки и загонять их в массив?
Видимо так. И еще: timestamp - это uint32_t, он же unsigned long. Хранение строк в памяти МК излишне.
Проблема 2038? Пофиг?
Эта проблема всех накроет, не то что ардуинки ))
1. В удобном. Мы же не знаем, что именно Вы подразумеваете под словом "расписание" и какими свойствами оно обладает.
Вы задали очень правильный вопрос. Пока что расписание - просто указанное время, по типу чч:мм, без указания даты или дня недели. Но, видимо надо будет использовать timestamp, если делать расписание на неделю, или более.
Так определяйтесь чего надо. Тогда и формат определится точней. timestamp - плохая идея, очень не удобно и избыточно. На ПК для работы с ним куча готовых функций, а здесь сочинять прийдется. Текст - вобще отстой. Только двоичный формат удобный для контроллера и достаточный для задачи.
Вобще надо определится прежде всего с необходимой точностю. Может до минут или до 5 минут, а может и десяток минут нормально. Чем ниже точность тем экономней хранение и обработка. Избыточная точность сразу выдает идиота, оно понятно что можна заложить миллисекунды и с ними долбатся))
Мне в одном проекте, где точность не важна особо, понравилось хранить время в виде шестиминутных интервалов. Тогда в сутках таких 240 и они в байт влазят. А вместо времени конца интервала можна его длительность в минутах (или в секундах или в других интервалах) хранить. Как лучше - от специфики задачи все. Если предполагается много интервалов в сутках то можна хранить в виде битового графика. Каждый бит задает вкл. или выкл реле в очередной временной интервал. Много разных фокусов есть..
А зачем файл и SD если вроде должно в EEPROM влазить без проблем?
Что там сочинять-то? Всё уже украдено до нас: https://www.nongnu.org/avr-libc/user-manual/group__avr__time.html
Сочинять, для того чтоб не включать в проект черти чей мусор неизвестного качества и нехилого размера.
Ой, ну началось. Поди и memset() не достоин быть примененным в коде скетча для ардуины без тотального переписывания, да?
Так определяйтесь чего надо. Тогда и формат определится точней. timestamp - плохая идея, очень не удобно и избыточно. На ПК для работы с ним куча готовых функций, а здесь сочинять прийдется. Текст - вобще отстой. Только двоичный формат удобный для контроллера и достаточный для задачи.
Вобще надо определится прежде всего с необходимой точностю. Может до минут или до 5 минут, а может и десяток минут нормально. Чем ниже точность тем экономней хранение и обработка. Избыточная точность сразу выдает идиота, оно понятно что можна заложить миллисекунды и с ними долбатся))
Мне в одном проекте, где точность не важна особо, понравилось хранить время в виде шестиминутных интервалов. Тогда в сутках таких 240 и они в байт влазят. А вместо времени конца интервала можна его длительность в минутах (или в секундах или в других интервалах) хранить. Как лучше - от специфики задачи все. Если предполагается много интервалов в сутках то можна хранить в виде битового графика. Каждый бит задает вкл. или выкл реле в очередной временной интервал. Много разных фокусов есть..
А зачем файл и SD если вроде должно в EEPROM влазить без проблем?
Ну тогда можно более точно конкретизировать задачу: скрипт PHP раз в сутки выгружает в файл время включения и выключения реле, только часы и минуты (можно в сразу в двоичном коде). Точность нужна только до минут, секунды не важны. Arduino раз в сутки посылает запрос, загружает файл txt и и берет из него данные, (можно дополнительно сделать проверку по имени файла, чтобы лишний раз ничего не скачивать, только нужно ли это?). Такое решение позволит работать только с часами и минутами, без обработки дат. В среднем получается 20-25 временных точек, когда нужно включать реле. А SD просто было в комплекте, почему бы и не использовать его. Я же новичок, так что хочеться научиться использовать и его.
ОК. "20-25 временных точек, когда нужно включать реле" - очевидно стокоже чтоб выключать. Принимаем 50 точек. Точность до минуты - два байта на точку. Можна полтора байта, но геморно, принимаем 2байта. Итого 100 байт на расписание. Если выбрать битовый график - 24*60/8=180 байт. Учитывая что есть SD и много места, я бы выбрал битовый график. С ним работать проще, менше нюансов с перекрытиями интервалом и их порядком - например нет ситуации когда в одной записи расписания задано что сейчас включено а в другом - выключено. А с такой "шизофренией" боротся не легко.
Ой, ну началось. Поди и memset() не достоин быть примененным в коде скетча для ардуины без тотального переписывания, да?
Не ровняйте с memset() всякий высер. Вы гарантируете что тот код рабочий?
Ой, ну началось. Поди и memset() не достоин быть примененным в коде скетча для ардуины без тотального переписывания, да?
Не ровняйте с memset() всякий высер. Вы гарантируете что тот код рабочий?
Брат! Ты про какой код? Садман1 дал ссылку на стандартную avr-libc, ТУ САМУЮ, которая входит в состав и ардуино ИДЕ и memset() из нее же. ;))))) Прости за то, что указываю на невнимательность... со всеми бывает. Но привычка говорить прежде, чем осознать, тебя когда-нибудь погубит. Сорри ;))))))))))
Может ложика тоже на "олигофрению" перекидывает форум... Других предположений у меня нет.
ТУ САМУЮ, которая входит в состав и ардуино ИДЕ
Так и давал бы ссылку в составе ИДЕ, мне че их сличать сидеть)))))
ТУ САМУЮ, которая входит в состав и ардуино ИДЕ
Так и давал бы ссылку в составе ИДЕ, мне че их сличать сидеть)))))
Это ОФИЦИАЛЬНЫЙ сайт avr-libc
https://www.nongnu.org/avr-libc/
Сличать ничего не надо. По адресу сразу видно было. Просто ты пока неофит в GNUсностях ;)))) Ты ж, поди, всю жисть на "Винде" богомерзкой програмировал? ;))))) В ентих ваших "фреймворках"? И только теперь, купив Оранж Пи и Ардуинку, пришел наконец к добрым, улыбающимся людям из Мира Опенсорса! Гы!!!!!!
Так не сайт https://www.arduino.cc Ну не знал sadman41 что оно и в ide дал где нашел. А мне оно не интересно вообще. Не, не прав, с GNU на примере Wine давно сталкивался лет так 10 до ардуино, задачи бывают разными иногда клиент - жлоб, денег даже на железо под винду не дает (хотя речь о магазинах обуви топового сегмента была, на кассы для бонусной системы). Наплевался знатно, тормозило зачетно. "к добрым, улыбающимся людям" - бум считать что это сарказм, их улыбки абсолютно соответствуют улыбкам сотрудников кредитных отделов, ломбардов и продавцев лотореи. Но давай в полезной теме без флуда. Мой жизненый путь мы можем в другом месте обсудить. ОК?
Резкий ты, как диарея! Это сарказм был, никак задеть не хотел. Ну и про то, что тема полезная - верю, что тоже срказм. ;))))
ОК. "20-25 временных точек, когда нужно включать реле" - очевидно стокоже чтоб выключать. Принимаем 50 точек. Точность до минуты - два байта на точку. Можна полтора байта, но геморно, принимаем 2байта. Итого 100 байт на расписание. Если выбрать битовый график - 24*60/8=180 байт. Учитывая что есть SD и много места, я бы выбрал битовый график. С ним работать проще, менше нюансов с перекрытиями интервалом и их порядком - например нет ситуации когда в одной записи расписания задано что сейчас включено а в другом - выключено. А с такой "шизофренией" боротся не легко.
А если исключить временные точки выключения? Включение реле не более 5-7 минут, а при отключении arduino, реле все равно будет выключаться, но при включении arduino все равно проводить проверку работы реле (включено или нет). Простите за тафтологию. И не могли бы Вы кинуть ссылками на пример работы с битовыми графиками, а то для меня это пока очень ново.
ТС! У тебя еще модуль часов 3231, на нём еще 4К ЕЕПРОМ. Это тыщща будильников без извращениий.
Извращения - это хорошо, они програмистский скилл поднимают... но если нет трудностей, для "героического" преодоления, то что делать?
без извращений на будильник нужен час и минута: 5 бит + 6 бит = 11 бит. До двух байт еще 5 бит лишних. Можно длительность или мелодию или день недели упаковать. Если недь недели, то еще два бита останется...
ОК. "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 - где эта минута в сутках расположена.
По сравнению с поиском в массиве, да еще и если не сортированом - просто шара.
Лоджик, не мороси.
В IDE спокойно подключается эта либа. Так же как и вачдог и пр. Просто создатели IDE рассчитывают на более-менее умных людей, а не на тех, которые, газанув в лужу и пытаясь сохранить лицо, в который раз истерику устраивают. На этот раз в стиле: на сайте arduino.cc нет - значит код - говно.
В конце-концов тебя никто не заставляет ей пользоваться.
memset(), кстати, тоже не описан на arduino.cc . И сотни других, avr-lib'овских функций.
В конце-концов тебя никто не заставляет ей пользоваться.
memset(), кстати, тоже не описан на arduino.cc . И сотни других, avr-lib'овских функций.
от спасибо что разрешил не пользоватся тонами гамнища. Так дальше и буду ограничиватся возможностями gcc.
Проблема 2038? Пофиг?
Проблема 2038? Пофиг?
uint64_t в ардуинке работает ;) Только timestamp всё равно 32 бита...
Господа. И дамы. Даффайте не зафлуживать темку. У человека оч конкретный вопрос с довольно распостраненной задачей. Великолепно побазарить и про 64-битную ардуину с проблемой 2038 года и библиотеками avr-lib дето в другой теме. И я поучаствую.
Ложик, базарить за avr-lib начал ты.
Я понимаю, что тебе, как Архату хочется показать, как ты битами туда-сюда мотаешь, чтобы все ахнули и пали ниц, однако применение timestamp и библиотеки time ровно так же относится к теме, как все твои посты. За исключением #19. Но своё-то не пахнет, да?
Хотя... наверное просто ты не можешь не оставить за собой последнее слово. Давай, пиши. Я отвечать не стану.
не стану кормить троля, отвалил - это к добру.
А пук в лужу был знатный! Не знать стандартную службу времени, которой столько же лет, сколько и самому С,которая описана в стандарте языка - это нечто. Логик в своём репертуаре.
ТС, тебе именно это и надо, что SadMan говорит. Никакой библиотеки устанавливать не надо, просто напишешь #include <time.h> и всего делов, пользуйся.
Извините, но не написано ни одной строки программы, но говна (извините) налито полными ушатами. И это в теме "программирование".
Ниче не поделаеш, такие тут ... ээ ... товарищи. Припрутся в тему про помогите с алгоритмом с советом "просто напишешь #include <time.h> и всего делов, пользуйся. " Пидеры... чего с них взять... не обращайте внимание.. Но в принципе ТС получил ответ на свой вопрос, надеюсь ему полезный будет. А остальное - издержки безплатной консультации рускоязычного форума.
#include <cс.h>
Никогда не задумывался о включении этой библиотеки. Ардуино просто полетел! Мне показалось, что он преодолел скорость света, но к сожалению это просто была скорость кварца...
#include <cс.h>
Никогда не задумывался о включении этой библиотеки. Ардуино просто полетел! Мне показалось, что он преодолел скорость света, но к сожалению это просто была скорость кварца...
cс.h - это еще чего такое, я вроде не писал так ))))
#include <cс.h>
Никогда не задумывался о включении этой библиотеки. Ардуино просто полетел! Мне показалось, что он преодолел скорость света, но к сожалению это просто была скорость кварца...
cс.h - это еще чего такое, я вроде не писал так ))))
СС.Н это не библиотека - это задача для захода в "Си для начинающих". Пишется через #IF перед компилятором и выдает отсутствие cс.h..
Прям перед компилятором 8). Ага. Пятница - она такая ;) Но в любом случае не приписывайте мне эту толи библиотеку, толи проверку. Подозреваю что имеется ввиду защита от повторного включения хедера, ну да встречается в природе, а че так торкнуло?
главное в скетче на писать строки
Не переживай, включать голову при написании скетча народ не спешит.
главное в скетче на писать строки
+++
Вот к сожалению так на каждом форуме в русскоговорящем сообществе, флуда 80%, нужной информации - 5%.
Вот к сожалению так на каждом форуме в русскоговорящем сообществе, флуда 80%, нужной информации - 5%.
Вот к сожалению так на каждом форуме в русскоговорящем сообществе, флуда 80%, нужной информации - 5%.
Таки, да :)