Как выполнить 5 функций по очереди через 1 секунду с помощью millis()

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

Nayn пишет:

С одной стороны согласен, но надо же думать и о дальнейшем использовании устройства, апгрейдить, добавлять что то новое, добовлять добавлять расширять. А не сделал его по расчетам и точка на этом. Это называется конечным продуктом без улучшений.

Nayn, это Ваш последний проект в жизни?

Определитесь с ресурсами и доведите этот проект до конца.

Есть пословица: "Первый блин - комом".

У Вас выбор между:

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

2. Препираться на форуме в поисках недостижимого совершенства (никакой проект при этом сделан не будет).

 

Я вообще не понимаю, зачем Вы сейчас пишете на форум.

Мне кажется, для Вас наиболее полезным было бы внимательно перечитать все, что было написано в этой теме, найти и осмыслить полезные советы и наводящие вопросы ("посему 4 байта на строку?" так и остался без ответа), а их было немало. Обдумать, что можно сделать и попробовать это сделать на Ардуине. А огрызаться на форуме - дело абсолютно бесполезное.

Так что совет: ближайшие 2-3 дня на форум не пишите, а внимательно читайте уже написанное и пытайтесь воплотить это на Ардуине.

 

b707
Offline
Зарегистрирован: 26.05.2017

Вот что бывает, когда ленивого халявщика, пришедшего за кодом - не посылают сразу...

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

andriano пишет:

Определитесь с ресурсами и доведите этот проект до конца.

Есть пословица: "Первый блин - комом".

У Вас выбор между:

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

2. Препираться на форуме в поисках недостижимого совершенства (никакой проект при этом сделан не будет).

1. Изначально делал проект на Атмега328, добавлял функциональность, не хватило памяти. Открылся вопрос либо использовать внешнюю память или Атмега2560. (Не важно как написан код, оптимизация дело последнее, всегда так было и будет. Первый блин комом)

2. Это вообще лишнее. Чисто людям хотелось себя возвысить и пообщаться с новичком. От сюда оффтоп.

P.S> Ответ очевиден. К моему проекту на Atmega328 не достаточно вместить количество мелодий, которые хочу добавить. Тема закрыта. 

Пойду 2-3 дня потрачу на проект, который смогу улучшить. А писать на форуме буду по возможности...

Nayn
Nayn аватар
Offline
Зарегистрирован: 22.01.2019

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

А те кто посылает и обзывается. Идите к черту, он вас поймет и примет как родную душу!
Бестолковые людишки...
И тут начинается смех - хахахахаха. :)

Цитата: Кому то хлеб, кому то грязь, каждый поделит между собой...

До встречи!

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Ппц ТС, у тебя с чайником проблемы ?
Тебе уже описали способ как впихнуть "твое невпихуемое".
Ты бы хоть почитал, о том, что такое PROGMEM.
Посмотрел , что такое массив, узнал как значения в функции передавать.
Примеры поискал.

Конкретно это помогло бы сократить размер кода в несколько раз. А если разбирать каждую мелодию отдельно(а там встречается куча подобных отрезков), то вообще ужать можно чуть не в ноль.

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Ппц ТС, у тебя с чайником проблемы ?

Несомненно :)

Кактус - пусть варится в своем соку. Он с такими "знаниями" много не напишет, небось завтра же придет на форум снова код клянчить... вот тогда и повеселимся :)))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ua6em пишет:

так поделись, сам то я за четыре года только светодиодиком помаргать могу

Нате, мне не жалко.
Претензии а-ля "не работаит","не понимаю" не принимаются, писалось для себя.

https://github.com/kakmyc-github/kakmyc_btn

b707
Offline
Зарегистрирован: 26.05.2017

Седня какой-то день особоый. что ли?

На Амперке человек требует прошивку для Уно под кварц 1 ГГц. Что за ардуины слабые делают, одному нубу памяти не хвататет. другому - скорости :)))

 

А вот он и сюда пришел

http://arduino.ru/forum/obshchii/nuzhna-proshivka-dlya-mk-arduino-nestandartnaya-zagruzchik

Kakmyc
Offline
Зарегистрирован: 15.01.2018

b707 пишет:

Седня какой-то день особоый. что ли?

На Амперке человек требует прошивку для Уно под кварц 1 ГГц. Что за ардуины слабые делают, одному нубу памяти не хвататет. другому - скорости :)))

 

А вот он и сюда пришел

http://arduino.ru/forum/obshchii/nuzhna-proshivka-dlya-mk-arduino-nestandartnaya-zagruzchik

Это все ретроградный Меркурий :-)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
b707 пишет:

Седня какой-то день особоый. что ли?

На Амперке человек требует прошивку для Уно под кварц 1 ГГц. Что за ардуины слабые делают, одному нубу памяти не хвататет. другому - скорости :)))

 

А вот он и сюда пришел

http://arduino.ru/forum/obshchii/nuzhna-proshivka-dlya-mk-arduino-nestandartnaya-zagruzchik

Это все ретроградный Меркурий :-)

Нет, есть посильнее )))
Беллатрикс Звезда второй величины, имеет природу Меркурия и Марса. Связана с Марсом, Плутоном и Ураном. Звезда войны, насилия, жестокости, хаоса, крушения, превращения всего в пыль. Она стремится стереть всё в порошок, разрушить. Сильно выраженная Беллатрикс в гороскопе даёт человека, который не может сидеть на месте, которого вечно тянет ругаться, скандалить, просто делать всё, что угодно, всем назло. С Луной - рождаются буйно помешанные. С Венерой - опасность изнасилований (справедливо и для мужчин). У Гитлера она была в соединении с Лилит, и это во многом определило его преступные наклонности.
Название звезды - "Амазонка" - указывает на ее марсианскую природу. Кроме того, она проводит влияние меркурианского характера. Отсюда характерные черты которые она проецирует: быстрое принятие решений, смелая и энергичная реализация планов и замыслов, воинственный дух, стратегический талант, организаторские способности, проницательность, но дает также и этаких бесшабашных воинственных смельчаков.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Kakmyc пишет:
ua6em пишет:

так поделись, сам то я за четыре года только светодиодиком помаргать могу

Нате, мне не жалко. Претензии а-ля "не работаит","не понимаю" не принимаются, писалось для себя. https://github.com/kakmyc-github/kakmyc_btn

поставил на квоновской 9050/369 на на твоей 8902 /367, длину долгого нажатия уменьшил до 1200, но даже это еще многовато

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Kakmyc пишет:
ua6em пишет:

так поделись, сам то я за четыре года только светодиодиком помаргать могу

Нате, мне не жалко. Претензии а-ля "не работаит","не понимаю" не принимаются, писалось для себя. https://github.com/kakmyc-github/kakmyc_btn

Претензий нет. Есть замечания :

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

Предложения по оптимизации:

 Можно махом урезать осетра на 6 байта на кнопку если хранить time stamps в uint16_t

Kakmyc
Offline
Зарегистрирован: 15.01.2018

asam пишет:

Претензий нет. Есть замечания :

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

Предложения по оптимизации:

 Можно махом урезать осетра на 6 байта на кнопку если хранить time stamps в uint16_t

1. Защита от дребезга есть см. стр#21 в *.срр

2. Мне до сих пор подходило.
В конце концов, никто не запрещает параллельно использовать стандартный digitalRead()
3. Не считаю, что тайматы нужно дергать извне.
Можно и внутри библиотеки поправить если приспичило.
4. Код писал давно,как уже было сказано, через 3 месяца знакомства с дуриной.
Даже не задумывался тогда(да и сейчас) о том,что вполне можно миллисы писать в таких местах в uint16_t. Спасибо, это по делу было

ЗЫ: поправил по замечаниям

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Kakmyc пишет:

 1. Защита от дребезга есть см. стр#21 в *.срр м

По нажатию есть, а по отпусканию? В результае при подстчете многократных нажатий могут происходить сбои. 

вот я нажимал по 5 раз подряд с одинаковой скоростью (ну кнопка реально плохая, я ее специально для тестов использую)

10:21:14.091 -> btn2=5
10:21:16.193 -> btn2=2
10:21:16.969 -> btn2=3
 
В результае вторая серия из 5 нажатий получилась как 2 + 3
asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Kakmyc пишет:
Даже не задумывался тогда(да и сейчас) о том,что вполне можно миллисы писать в таких местах в uint16_t. Спасибо, это по делу было ЗЫ: поправил по замечаниям

Пожалуйста. Только если для time stamps использовать uint16_t то надо в начале kakmyc_btn::read() добавить

uint16_t currentTime = millis() & 0xFFFF;

 И дальше его везде использовать вместо millis

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Больше кнопок хороших и разных
я один файлик добавил, чтобы пример из IDE открывался
  library.properties

name=kakmyc Button
version=1.0.0
author=kakmyc, kakmyc, <kakmycmail@gmail.com>
maintainer=kakmyc, kakmyc, <kakmycmail@gmail.com>
sentence=Button
paragraph=This library allows you to work with various buttons.
category=Other
url=https://github.com/kakmyc-github/kakmyc_btn
architectures=avr

 

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

asam пишет:

Kakmyc пишет:
Даже не задумывался тогда(да и сейчас) о том,что вполне можно миллисы писать в таких местах в uint16_t. Спасибо, это по делу было ЗЫ: поправил по замечаниям

Пожалуйста. Только если для time stamps использовать uint16_t то надо в начале kakmyc_btn::read() добавить

uint16_t currentTime = millis() & 0xFFFF;

 И дальше его везде использовать вместо millis

В "& 0xFFFF"; нет надобности. Мало того, компилятор его "с оптимизирует", что легко по размеру кода отследить.

А uint16_t currentTime = millis(); вполне годно. Даже uint8_t годно для коротких интервалов, но надо помнить что компилятор приводит к int при вычитании, потому if(byte(t-OldTime)<PERIOD)

 
Kakmyc
Offline
Зарегистрирован: 15.01.2018

Не uint8_t не вариант.
Там longpress 1,5сек

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

Для 1,5 сек конечно. Но правда есть такой подход. На uint8_t  делаем короткий интервал, например 100мс. А все остальные уже через него меряем. Тогда 1,5сек - это 15 "тиков" по 100мс. И тоже на одном байте. Удобно если много интервалов нужно. При этом снижается точность, но longpress с точностью 1мс и не нужен.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Logik пишет:

Для 1,5 сек конечно. Но правда есть такой подход. На uint8_t  делаем короткий интервал, например 100мс. А все остальные уже через него меряем. Тогда 1,5сек - это 15 "тиков" по 100мс. И тоже на одном байте. Удобно если много интервалов нужно.

А смысл ?
Если ещё байт нужен для подсчёта тиков .

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

Смысл в удобстве для нескольких интервалов. Пусть переменную N установили по событию в 0. И каждые 100мс инкрементим. Потом проверяем, при N==10 выполняем функцию 1, при N==20 выполняем функцию 2 и т.д. .... при N==50 выполняем функцию 5 и снова устанавливаем в 0. Так по кругу.  Это то что топикстартер хотел. 

Аналогично для кнопки, на одной переменной и время для дребезга и для longpress  получаем. А если шототипа if(N&3==0)... то и для событий раз в 400мс по удержанию кнопки сделаем.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Logik пишет:

В "& 0xFFFF"; нет надобности. Мало того, компилятор его "с оптимизирует", что легко по размеру кода отследить.

Что uint16_t currentTime = millis() & 0xFFFF;

что uint16_t currentTime = millis();

Компилиются в один и тот же код. Но в первом случае сразу наглядно видно что используется только половина от millis()

Цитата:
А uint16_t currentTime = millis(); вполне годно. 

Я польщен.

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

asam пишет:

Logik пишет:

В "& 0xFFFF"; нет надобности. Мало того, компилятор его "с оптимизирует", что легко по размеру кода отследить.

Что uint16_t currentTime = millis() & 0xFFFF;

что uint16_t currentTime = millis();

Компилиются в один и тот же код. Но в первом случае сразу наглядно видно что используется только половина от millis()

Цитата:
А uint16_t currentTime = millis(); вполне годно. 

 

Я польщен.

 

Не стоит благодарности.

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

Logik пишет:

Для 1,5 сек конечно. Но правда есть такой подход. На uint8_t  делаем короткий интервал, например 100мс. А все остальные уже через него меряем. Тогда 1,5сек - это 15 "тиков" по 100мс. И тоже на одном байте. Удобно если много интервалов нужно. При этом снижается точность, но longpress с точностью 1мс и не нужен.

лучше примерно так:

uint8_t currentTime = millis() >> 5;

 

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

Да. Годно, если степени двойки устроят. Но я как то для времени в районе секунды больше степени десятки привык. 1,024сек ну совсем не нравится. Наверно влияние RTC. А на самом деле  - ну что плохого если longpress 1,536сек вместо 1,5сек. Пофиг в общем.  

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

Logik пишет:

Да. Годно, если степени двойки устроят. Но я как то для времени в районе секунды больше степени десятки привык. 1,024сек ну совсем не нравится. Наверно влияние RTC. А на самом деле  - ну что плохого если longpress 1,536сек вместо 1,5сек. Пофиг в общем.  

Целочисленное деление - самая тяжелая операция, хуже плавающей точки. Поэтому, если полторы секунды просто не влезают в байт, лучше просто подобрать масштабный множитель (степень двойки), чтобы влезало.

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

Задумчиво просмотрел сообщения... andriano, где деления? Причем они тут?

На всяк случай собрал из кусков подобие кода



uint8_t  t;
static uint8_t OldTime;
static uint8_t N;
#define PERIOD 100

t=millis();

if(byte(t-OldTime)>PERIOD)
{
  OldTime += PERIOD; //здесь через каждые 100 миллисекунд в среднем
  
  N++;
  switch(N)
{
   case 10: //здесь через секунду
   case 20: //здесь через 2 секунды
.....
   case 50: N=0;//здесь через 5 секунд и по кругу
}
 digitalWrite(13, N & 4); //здесь мигаем светодиодом
}

 

Green
Offline
Зарегистрирован: 01.10.2015

То byte, то uint8_t. То заглавными, то строчными... То с отступами, то без... Одни хацкеры.))

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

Green пишет:

То byte, то uint8_t. То заглавными, то строчными... То с отступами, то без... Одни хацкеры.))

Ой кашмар, кашмар... Кроме отступов ты видать ничего и не понял.. 

Green
Offline
Зарегистрирован: 01.10.2015

"Да как же мне тя понять, барин!" Если ты спецом всё шифруешь.)

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

Green пишет:

"Да как же мне тя понять, барин!" Если ты спецом всё шифруешь.)

Криптограмма говоришь. )))) Пиши исчо! Раздел ты выбрал верно, песочница именно для тех кому код шифровкой выглядит.

sergei 22
Offline
Зарегистрирован: 22.10.2020

еще как будут , у нас в группе через день обсасываются некоторые проблеммы (одни и те же) и прилетает вопрос помогите не могу найти , даже ленту не листают

sergei 22
Offline
Зарегистрирован: 22.10.2020

Ну раз тебе 35 лет, тогда заслужил вполне оправданно. Повесь на стену 

Такие специалисты по выдачи сертификатов, говорит о том что они сами такие, это же их профессия! :)))

не сцы прорвемся мне 46 ток зарегестрировался так мне уже не только за вопрос натыкали , так еще и всех дохлых собак на меня повесили

b707
Offline
Зарегистрирован: 26.05.2017

sergei 22 пишет:

не сцы прорвемся мне 46 ток зарегестрировался так мне уже не только за вопрос натыкали , так еще и всех дохлых собак на меня повесили

и еще натыкают. потому что не доходит - раньше писали не в тот раздел, теперь спамите в чужую ветку.

Если есть вопросы - создайте новое сообщение и задавайте их там. Если нужен код, а знаний нет - тогда в платный раздел

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

sergei 22 пишет:

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

так кто же Сергея Звягинцева не пнет )))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Green пишет:

То byte, то uint8_t. То заглавными, то строчными... То с отступами, то без... Одни хацкеры.))

И не говори. При всем при том, ни одного unsigned char'a.

sergei 22
Offline
Зарегистрирован: 22.10.2020

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

sergei 22
Offline
Зарегистрирован: 22.10.2020

А кто это такой?