Круговое переключение режимов
- Войдите на сайт для отправки комментариев
Втр, 20/11/2018 - 13:57
Здравствуйте! Подскажите, пожалуйста, почему не выходит прокручивать влево режимы по кругу? Вправо проблем нет.
При нажатии вправо происходит переход от 1 к 10 и заново, в т.ч. из любого положения, например от 6 режима.
При нажатии влево переход также происходит из любого режима назад, кроме 1го - здесь упирается "в стену".
Друг с другом дружат кнопки.
Вот код
case BUTT_LEFT: if(settings_mode){ if(--mode>MODE_AMOUNT-1)mode=0; } switch (mode){ case 1: this_mode = 1; break; case 2: this_mode = 2; break; case 3: this_mode = 3; break; case 4: this_mode = 4; break; case 5: this_mode = 5; break; case 6: this_mode = 6; break; case 7: this_mode = 7; break; case 8: this_mode = 8; break; case 9: this_mode = 9; break; case 10: this_mode=10; break; } break; case BUTT_RIGHT: if(settings_mode){ if(++mode>MODE_AMOUNT-1)mode=0; } switch (mode){ case 1: this_mode = 1; break; case 2: this_mode = 2; break; case 3: this_mode = 3; break; case 4: this_mode = 4; break; case 5: this_mode = 5; break; case 6: this_mode = 6; break; case 7: this_mode = 7; break; case 8: this_mode = 8; break; case 9: this_mode = 9; break; case 10: this_mode=10; break; }
что можно понять по этому агрыску кода?
но, вангую, мошт так?
05 if
(--mode<0)mode=10;
Забыл добавить начало
И еще вопрос:
пришлось обозначить количество режимов 11 (видно ниже), потому что такая вот особенность получается:
если сделать AMOUNT 10 как и положено, как и фактическое количество режимов, то, дойдя до 9 режима кнопкой вправо, далее происходит пропуск 10го и переход к 1му! А если сделать 11, то, дойдя до 9, далее 10, далее "пустое нажатие" (обязательно), и затем 1ый. Почему?
так а почему вправо нормально по кругу крутит? я не знаток, но мне кажется не пройдет ваша команда
а вот так не проще? зачем нужен select-case. если единственное, что он делает - приравнивает свою переменную другой. так и приравнивайте сразу. без всякого sekect
этот код полностью аналогичен вашему из заглавного сообщения - только в 5 раз короче.
И еще вопрос:
пришлось обозначить количество режимов 11 (видно ниже), потому что такая вот особенность получается:
если сделать AMOUNT 10 как и положено, как и фактическое количество режимов, то, дойдя до 9 режима кнопкой вправо, далее происходит пропуск 10го и переход к 1му! А если сделать 11, то, дойдя до 9, далее 10, далее "пустое нажатие" (обязательно), и затем 1ый. Почему?
как "почему?" - вы этот код не писали сами, а где-то стырили?
Вы строке 5 сравниваете не с MODE_AMOUNT . а с MODE_AMOUNT-1 - поэтому
спасибо, сейчас проверю
а вот так не проще?
кстати, в коротком коде и ошибка сразу видна - в условиях строки 5 и 11 ты в одном случае увеличиваешь режим, в другом уменьшаешь, а сравниваешь оба раза почему-то с верхним пределом... нелогично же.
Понял свою ошибку или обьяснить?
а вот так не проще?
кстати, в коротком коде и ошибка сразу видна - в условиях строки 5 и 11 ты в одном случае увеличиваешь режим, в другом уменьшаешь, а сравниваешь оба раза почему-то с верхним пределом... нелогично же.
Понял свою ошибку или обьяснить?
я честно долго сам сидел и думал
да, код не мой, но и не спер, а взял за основу у АлексаГайвера из программы для светодиодной ленты, потому что там про ИК пульт было, я по ходу все изучал и фактически проверял
это я к тому, что у меня были мысли, что как - то по-другому можно поставить пределы... но.. листать то листают... не понимаю ошибку:(
это я к тому, что у меня были мысли, что как - то по-другому можно поставить пределы... но.. листать то листают... не понимаю ошибку:(
ну вот смотри - если ты листаешь вверх, то когда ты доходишь до последнего режима , скажем 10 - следующим тебе нужно перейти на mode=0 - правильно? значит нужно сравнивать с максимальным количество режимов
А если ты перебираешь вниз, то нужно отслеживать уже не максимальный режим, а минимальный - то есть проверять. не ушел ли счетчик ниже нуля. И в этом случае перескакивать на верхний режим:
только проверь, как у тебя переменная mode описана - должна быть знаковой
присоединяюсь, Гайвер - блоггер, а не программист, ему главное блог наполнить контентом, а на качество пофиг
if(--mode < 0) mode=MODE_AMOUNT;
Значить, правильно я ванговал в #1
это я к тому, что у меня были мысли, что как - то по-другому можно поставить пределы... но.. листать то листают... не понимаю ошибку:(
ну вот смотри - если ты листаешь вверх, то когда ты доходишь до последнего режима , скажем 10 - следующим тебе нужно перейти на mode=0 - правильно? значит нужно сравнивать с максимальным количество режимов
А если ты перебираешь вниз, то нужно отслеживать уже не максимальный режим, а минимальный - то есть проверять. не ушел ли счетчик ниже нуля. И в этом случае перескакивать на верхний режим:
только проверь, как у тебя переменная mode описана - должна быть знаковой
Понял! ну, вертится в голове, представляю, не совсем только уложилось;)
по поводу mode
имеются следующие записи
А может вы тогда подскажете, где проводить самостоятельное обучение? на чем? только в вуз не шлите, пожалуйста, уже не до этого
по поводу mode
вот не помню, в ардуино byte знаковый или нет? - Кот?:)
проще не думать, а исправить на
Естественно, byte беззнаковый, такшто, исправить надо.
Варианты:
А может вы тогда подскажете, где проводить самостоятельное обучение? на чем? только в вуз не шлите, пожалуйста, уже не до этого
Ну, не по Гиверу же! Он приходил сюда со своими библиотеками. Ему потихоньку начали показвать ошибки в них тыц, тыц, тыц, он быстренько слился и перестал отвечать. Если бы не перестал, я показал бы ему ещё с десяток - практически ни одной библиотеки без грубых ошибок у него нет.
Хорошо, что я свои сюда не таскаю, а то бы тоже огреб ))
А может вы тогда подскажете, где проводить самостоятельное обучение? на чем? только в вуз не шлите, пожалуйста, уже не до этого
Ну, не по Гиверу же! Он приходил сюда со своими библиотеками. Ему потихоньку начали показвать ошибки в них тыц, тыц, тыц, он быстренько слился и перестал отвечать. Если бы не перестал, я показал бы ему ещё с десяток - практически ни одной библиотеки без грубых ошибок у него нет.
ого.....
а что почитать посоветуете?
я там нашел ваши темы интересные по ссылкам вашим же - закрепил эти вкладки
а вот в профиль зайти, чтоб посмотреть, чего еще вы интересного написали, не получается - ники и аватары здесь чего-то не кликабельны - как к вам в профиль зайти, например?
по поводу mode
вот не помню, в ардуино byte знаковый или нет? - Кот?:)
проще не думать, а исправить на
спасибо!
пойду переделывать, точнее уже переделываю, но там с каждым шагом (еще много задач) все больше закапываюсь;)
а вы, с коллегами, еще можете подсказать насчет millis и работы вот этих времен? если коротко: на определенные кнопки с того же пульта поставлены режимы 1) стандартный ход работы светофоров по секундам, по millis 2) аварийный режим - так вот из аварийного режима выйти получается, когда в другие режимы кнопками заходишь, а из основного нет! то есть, конечно, режимы запускаются другие, но они конфликтуют со стандартным, так как стандартный продолжает на фоне (слегка помигивая диодами) работать
Хорошо, что я свои сюда не таскаю, а то бы тоже огреб ))
И я. :-) Хотя, я был бы только рад профессиональному мнению. Мошт, чему научился бы.
А может вы тогда подскажете, где проводить самостоятельное обучение? на чем? только в вуз не шлите, пожалуйста, уже не до этого
Ну, не по Гиверу же! Он приходил сюда со своими библиотеками. Ему потихоньку начали показвать ошибки в них тыц, тыц, тыц, он быстренько слился и перестал отвечать. Если бы не перестал, я показал бы ему ещё с десяток - практически ни одной библиотеки без грубых ошибок у него нет.
Зато у Вас, своего ёбтуб канала нет, а у него есть, а теперь уже и птенцы из гнизда вылезать начали.))))
Зато у Вас, своего ёбтуб канала нет, а у него есть, а теперь уже и птенцы из гнизда вылезать начали.))))
таки не токмо канал, а ещё и сайт с громким названием "AlexGyver Technologies"
Так шо нам до этого человека расти и расти!
а что почитать посоветуете?
Даже не знаю. Мне трудно оценивать,т.к. сам я был начинающим программистом почти 40 лет назад.
Например, я не видел явных глупостей в книге Дж. Блума, правда в оригинале. Потому что в русском переводе откуда-то появились опечатки в текстах программ. Неужели они их вручную набирали?
А в многочисленных "курсах" в сети столько безграмотности и идиотизма. То они "return loop();" напишут, то миллис начинают насиловать ... ужас.
Вот, кстати, пример отборного бреда от Вашего "учителя" -https://alexgyver.ru/arduino/lesson4_script.pdf
От наблюдательности зависит. Я вот узрел интересное: "BUTT_LEFT" и "BUTT_RIGHT". Это при том, что BUTT по английски означает, как бы так помягче выразиться, "БУЛКИ", в общем. Левая булка и правая.
Вот, кстати, пример отборного бреда от Вашего "учителя" -https://alexgyver.ru/arduino/lesson4_script.pdf
А мне за тридцатидвухсекундный делей понравилось. А вот чем микрос, только знаковый инт заслужил, не понял, наверно свежей травы как раз подвезли.)))
А мне за тридцатидвухсекундный делей понравилось. А вот чем микрос, только знаковый инт заслужил, не понял, наверно свежей травы как раз подвезли.)))
Так у него в библиотеках эти функции так и используются.
Так у него в библиотеках эти функции так и используются.
А почему, нет? Пипл хавает, наверно и на кнопочку "Поддержать" жмет иногда. Там ведь как в Думе, главное, брехать уверенно и без задержки.((((
А мне за тридцатидвухсекундный делей понравилось. А вот чем микрос, только знаковый инт заслужил, не понял, наверно свежей травы как раз подвезли.)))
Так у него в библиотеках эти функции так и используются.
Евгений! Я понял, что нужно смотреть в другую сторону...
Сейчас вы можете подсказать как быть с функцией стандартного отсчёта, если можно так выразиться?
Мне нужно сделать стандартный режим работы светофоров с тем, чтобы переходить в другие режимы (ручной, аварийный). Не получается. А именно стандартный режим работает как бы изподтишка. Лучше всего получалось, когда приписывал переменную, например sek = 0, а затем, заводя таймер стандартный, и, приписывая работу sek ко включённому pin 13, пишутся функции типо if sek=25 то красный +, зелёный -.
Попробовал просто таймер типо вариант на 25 секунде if Millis - current mills > 25000 - ничего вообще не получается, просто первое положение горит и все
Куда смотреть? Чем руководствоваться?
По миллисам, почитайте Лешака, мне с его изложением, сразу дошло.
И да, не пытайтесь все в одном лупе сделать, лучше разбивайте на маленькие функции и вызывайте их по мере надобности. Намного легче. ИМХО.
Попробовал просто таймер типо вариант на 25 секунде if Millis - current mills > 25000 - ничего вообще не получается, просто первое положение горит и все Куда смотреть? Чем руководствоваться?
программирование на словах не обьясняют. Выкладывайте код, что у вас не получилось с задержкой в 25 сек - укажем на ошибки.
Ну, почитайте Блума.
А вообще, если нужен светофор, Вам бы не ардуину осваивать а автоматное (или табличное) программирование.
Хотите пример, как профессионально делается светофор любой сложности? Причём сложность программы постоянна - не растёт вместе со сложностью светофора? Держите, там со стр. 8 начинается описание как правильно делать светофор. очень подробно описано. Вам надо вот это понимать, а таблицу запрограммировать - как два пальца на самом деле.
Попробовал просто таймер типо вариант на 25 секунде if Millis - current mills > 25000 - ничего вообще не получается, просто первое положение горит и все Куда смотреть? Чем руководствоваться?
программирование на словах не обьясняют. Выкладывайте код, что у вас не получилось с задержкой в 25 сек - укажем на ошибки.
пояснения:
это я собрал как бы первоначальный код, при котором в стандарте, если не задавать на кнопку, код идет
идет сам, если ему не мешать
пробовал всякое, сам и не сам
это код не мой, но втиснул под себя
логику почти понимаю
пожалуйста, помогите приписать в систему, чтобы нормально работал, стыковался с другими режимами и обнулялся счетчик
счетчик обнулять у меня получилось, только я много-много раз все переделывал , и запутался уже, не написал сейчас
стыковать - не получается
были варианты с простым if (millis () - currentMillis > 25000) что то наподобие - не получается вообще запустить
ОБЕЩАЮ ВСЕ ПРОЧИТАТЬ И КАК МОЖНО БОЛЬШЕ ИЗУЧИТЬ, мне это интересно стало, как взялся, но надо закончить проект, раз взялся под сроки
Ну, почитайте Блума.
А вообще, если нужен светофор, Вам бы не ардуину осваивать а автоматное (или табличное) программирование.
Хотите пример, как профессионально делается светофор любой сложности? Причём сложность программы постоянна - не растёт вместе со сложностью светофора? Держите, там со стр. 8 начинается описание как правильно делать светофор. очень подробно описано. Вам надо вот это понимать, а таблицу запрограммировать - как два пальца на самом деле.
почитаю всё обязательно, спасибо
сейчас только надо последнее действие доделать
макет готов
режимы сделаны
только вот основной не стыкуется
если можете, подсобите с постановкой - сообщение ниже
сроки жмут, понимаю, что много на себя взял, но мне это оказалось интересно, буду изучать
я понимаю (если хоть это есть верно), что нужно "остановить таймер", при том, что время не останавливается, ну то есть как то перейти на другой режим
или белеберду написал;)
главное, что меня удивляет, если посмотрите ниже в коде, то там очень прекркасно вписываются мигающие зеленые и "аварийный" режим - они переключаются в раз - неужели дело в интервалах?
если честно, сильно запутался, и уже не первый день, и, поверьте, прежде чем спросить, я много пробовал сам, а сейчас показал что-то около начального варианта, который при всем при том работает ну... лучше всего
Попробовал просто таймер типо вариант на 25 секунде if Millis - current mills > 25000 - ничего вообще не получается, просто первое положение горит и все Куда смотреть? Чем руководствоваться?
программирование на словах не обьясняют. Выкладывайте код, что у вас не получилось с задержкой в 25 сек - укажем на ошибки.
я показал код
участок, который интересует - это участок, который в этот раз я назвал "default_city"
перепробовал многое... из того, что на ум пришло и того, что узнал
помогите, пожалуйста, просто вставить стандартный режим в систему, чтобы он нормально переключался с другими режимами
Ну, почитайте Блума.
А вообще, если нужен светофор, Вам бы не ардуину осваивать а автоматное (или табличное) программирование.
Хотите пример, как профессионально делается светофор любой сложности? Причём сложность программы постоянна - не растёт вместе со сложностью светофора? Держите, там со стр. 8 начинается описание как правильно делать светофор. очень подробно описано. Вам надо вот это понимать, а таблицу запрограммировать - как два пальца на самом деле.
кстати, обратите внимание, Евгений - сделал, как вы рекомендовали - получилось! листает назад по кругу!=)
но вот особенность осталась: когда доходишь до крайней точки что вправо, что влево, следующее нажатие будет "пустое" и только потом режим (с 10 - 1 или с 1 - 10, соответственно).
Ну, почитайте Блума.
А вообще, если нужен светофор, Вам бы не ардуину осваивать а автоматное (или табличное) программирование.
Хотите пример, как профессионально делается светофор любой сложности? Причём сложность программы постоянна - не растёт вместе со сложностью светофора? Держите, там со стр. 8 начинается описание как правильно делать светофор. очень подробно описано. Вам надо вот это понимать, а таблицу запрограммировать - как два пальца на самом деле.
и еще, как же все-таки зайти к вам в профиль, чтобы найти все ваши темы и почерпнуть полезную информацию, как например "Великолепие переполнение millis()"?
не забудьте только, пожалуйста, про другие вопросы=)
очень хочу научиться, изучаю всё, что могу и нахожу, только вот приоритет пока в результате, а затем для себя;)
я показал код
участок, который интересует - это участок, который в этот раз я назвал "default_city"
Артур, извините, но в этой "простыне" я копаться не стану. Изучать правила работы с миллис надо на простеньких примерах в 10-15 строк. Сделайте из своего кода такие примеры - их и будем обсуждать.
я показал код
участок, который интересует - это участок, который в этот раз я назвал "default_city"
Артур, извините, но в этой "простыне" я копаться не стану. Изучать правила работы с миллис надо на простеньких примерах в 10-15 строк. Сделайте из своего кода такие примеры - их и будем обсуждать.
простите, но я не понимаю? то мало кода, то много
я показал весь код. За исключением пары команд, здесь приведено всё, что отонсится "друг к другу". Это как я вижу. Всё дело в том, что если посмотреть на коды, где есть millis другие (если так удобнее), то из других команд видно то, о чем я говорю. Они "выключаются" другими командами (нажатием соответствующей кнопки на пульте). А режим default_city нет!
Скажите, что конкретно вам показать? Только default_city и объявление переменных?
простите, но я не понимаю? то мало кода, то много
Скажите, что конкретно вам показать? Только default_city и объявление переменных?
Видимо я вас неправильно понял
Я прочитал вашу фразу
"Попробовал просто таймер типо вариант на 25 секунде if Millis - current mills > 25000 - ничего вообще не получается"
и понял ее так, что у вас проблемы с применением миллис.
Вот, постарался максимально сократить
интересует штука deafult_city
здесь же режим rhis_mode == 12 не отключает режим default_city
как и другие режимы просто "накладываются" (как и описывал)
я пробовал делать default_city без объявления отдельной функции, т.е как режим типо this_mode == 13, например
пробовал по умолчанию, как здесь
пробовал вызов по кнопке
пробовал выводить за main loop, пробовал в нем, даже (не смейтесь и не злитесь) в void setup
результаты от проб такие: или не запускается, или запускается и не реагирует, или работает отдельно от всего, или работает одновременно со всем остальным, или выключается и больше не включается, а может что и еще - много чего было...
я показал код
участок, который интересует - это участок, который в этот раз я назвал "default_city"
Артур, извините, но в этой "простыне" я копаться не стану. Изучать правила работы с миллис надо на простеньких примерах в 10-15 строк. Сделайте из своего кода такие примеры - их и будем обсуждать.
да, с ним, или я так думаю, что с ним
я писал и так, как вы прочитали, типо
if (oldmillis - millis () > 25000) {
digitalWrite (r1, HIGH);
......
digitalWrite (g2, LOW);
далее тем же способом по секундам варианты, а точнее, наверное, сказать фазы или шаги типо "красный - - : - - зеленый" "красный - - : - желтый -" "красный - - : красный - -" "красный желтый - : красный - -" "- - зеленый : красный - -". Но они не идут, все стоит на первой указанной позиции
простите, но я не понимаю? то мало кода, то много
Скажите, что конкретно вам показать? Только default_city и объявление переменных?
Видимо я вас неправильно понял
Я прочитал вашу фразу
"Попробовал просто таймер типо вариант на 25 секунде if Millis - current mills > 25000 - ничего вообще не получается"
и понял ее так, что у вас проблемы с применением миллис.
Алекс, чему равно значение переменной interval и как она описана7
и вот еще любопытно - что вы этими строчками пытаетесь сказать????
Алекс, чему равно значение переменной interval и как она описана7
и вот еще любопытно - что вы этими строчками пытаетесь сказать????
Авторитетно убеждает компилятор, что this_mode ну точно никак не равна, и не может быть равна, потому что - так надо :)
Алекс, чему равно значение переменной interval и как она описана7
и вот еще любопытно - что вы этими строчками пытаетесь сказать????
вообще там
if (millis() - previousMillis > 500)
но я уже от запутанности и интервал приписывал, который относится к другим командам, где, вы можете видеть, спокойно себе мигают зеленый сигнал или же "аварийный" режим
интервал такой
const long interval = 1000; то есть секунда
что касается вашего любопытства о восклицательных зыс модах - опять же, я уже что последнее в голову приходило, пытался их так отключить при работе стандартного режима - не получилось
смешно:) только так и есть и не авторитетно))))
а вот вы бы помогли может? пожалуйста
что не так?
у меня на самом деле вариантов много, чего я сам понаписал - всех и не упомнить
показал этот, потому что он работает сам по себе, если его "не трогать"
Алекс, чему равно значение переменной interval и как она описана7
и вот еще любопытно - что вы этими строчками пытаетесь сказать????
Авторитетно убеждает компилятор, что this_mode ну точно никак не равна, и не может быть равна, потому что - так надо :)
что касается вашего любопытства о восклицательных зыс модах - опять же, я уже что последнее в голову приходило, пытался их так отключить при работе стандартного режима - не получилось
Знаешь почему не получилось? Потому что отсутствует знание основ.Лучшим вариантом для решения этой небольшой проблемы - будет начать чтение основ С++. Но, как показывает опыт, неофиты почему-то очень негативно относятся к таким советам.
а вот вы бы помогли может? пожалуйста
что не так?
Строчка this_mode != 11; - это просто сравнение, причём - в никуда. Если ты хотел как-то изменить значение переменной, то оператор сравнения "!=" тут не подходит. Нужен оператор присваивания, проще говоря "=". Поскольку у тебя переменная this_mode принимает ограниченное кол-во известных режимов, то лучшим вариантом сбросить её так, чтобы она заведомо не соответствовала никакому из режимов - введение специального значения, заведомо неравного никакому из режимов. На примере:
показал этот, потому что он работает сам по себе, если его "не трогать"
Алекс, это строчки - бредятина. Если число равно 11, и так понятно. что оно не равно одному, двум, трем...
Что касается кода - напищите четко и подробно, что именно в нем неверно работает.