Круговое переключение режимов
- Войдите на сайт для отправки комментариев
Втр, 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ый. Почему?
#define MODE_AMOUNT 11 #include "IRLremote.h" CHashIR IRLremote; #if IR_RCT != 0 void remoteTick(){ if (IRLremote.available()) { auto data = IRLremote.read(); IRdata = data.command; ir_flag = true; } if (ir_flag) { switch (IRdata) { // режимы далее, а именно кнопки и приписанные к ним режимытак а почему вправо нормально по кругу крутит? я не знаток, но мне кажется не пройдет ваша команда
а вот так не проще? зачем нужен select-case. если единственное, что он делает - приравнивает свою переменную другой. так и приравнивайте сразу. без всякого sekect
case BUTT_LEFT: if(settings_mode){ if(--mode>MODE_AMOUNT-1)mode=0; } this_mode = mode; break; case BUTT_RIGHT: if(settings_mode){ if(++mode>MODE_AMOUNT-1)mode=0; } this_mode = mode; break; }этот код полностью аналогичен вашему из заглавного сообщения - только в 5 раз короче.
И еще вопрос:
пришлось обозначить количество режимов 11 (видно ниже), потому что такая вот особенность получается:
если сделать AMOUNT 10 как и положено, как и фактическое количество режимов, то, дойдя до 9 режима кнопкой вправо, далее происходит пропуск 10го и переход к 1му! А если сделать 11, то, дойдя до 9, далее 10, далее "пустое нажатие" (обязательно), и затем 1ый. Почему?
как "почему?" - вы этот код не писали сами, а где-то стырили?
Вы строке 5 сравниваете не с MODE_AMOUNT . а с MODE_AMOUNT-1 - поэтому
спасибо, сейчас проверю
а вот так не проще?
case BUTT_LEFT: if(settings_mode){ if(--mode>MODE_AMOUNT-1)mode=0; } this_mode = mode; break; case BUTT_RIGHT: if(settings_mode){ if(++mode>MODE_AMOUNT-1)mode=0; } this_mode = mode; break; }кстати, в коротком коде и ошибка сразу видна - в условиях строки 5 и 11 ты в одном случае увеличиваешь режим, в другом уменьшаешь, а сравниваешь оба раза почему-то с верхним пределом... нелогично же.
Понял свою ошибку или обьяснить?
а вот так не проще?
case BUTT_LEFT: if(settings_mode){ if(--mode>MODE_AMOUNT-1)mode=0; } this_mode = mode; break; case BUTT_RIGHT: if(settings_mode){ if(++mode>MODE_AMOUNT-1)mode=0; } this_mode = mode; break; }кстати, в коротком коде и ошибка сразу видна - в условиях строки 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 начинается описание как правильно делать светофор. очень подробно описано. Вам надо вот это понимать, а таблицу запрограммировать - как два пальца на самом деле.
#include <GyverTimer.h> #include <IRLremote.h> #include <IRL_Decode.h> #include <IRL_Hash.h> #include <IRL_Keycodes.h> #include <IRL_Nec.h> #include <IRL_NecAPI.h> #include <IRL_Panasonic.h> #include <IRL_Platform.h> #include <IRL_Protocol.h> #include <IRL_Receive.h> #include <IRL_Time.h> #define IR_RCT 1 #define IR_PIN 2 #define MODE 0 #define MAIN_LOOP 5 #if IR_RCT == 1 #define BUTT_UP 0xE51CA6AD #define BUTT_DOWN 0xD22353AD #define BUTT_LEFT 0x517068AD #define BUTT_RIGHT 0xAC2A56AD #define BUTT_OK 0x1B92DDAD #define BUTT_1 0x68E456AD #define BUTT_2 0xF08A26AD #define BUTT_3 0x151CD6AD #define BUTT_4 0x18319BAD #define BUTT_5 0xF39EEBAD #define BUTT_6 0x4AABDFAD #define BUTT_7 0xE25410AD #define BUTT_8 0x297C76AD #define BUTT_9 0x14CE54AD #define BUTT_0 0xC089F6AD #define BUTT_STAR 0xAF3F1BAD #define BUTT_HASH 0x38379AD #endif int sek = 0; #define MODE_AMOUNT 10 CHashIR IRLremote; uint32_t IRdata; const int r1 = 12; const int y1 = 11; const int g1 = 10; const int r2 = 9; const int y2 = 8; const int g2 = 7; const int c = 6; int time1 = 1000; int ledState = LOW; unsigned long myTimer1; unsigned long main_timer; const long interval = 1000; long previousMillis = 0; boolean settings_mode, city, default_city = true, ONstate = true; volatile boolean ir_flag; int8_t this_mode = MODE; int8_t mode = 0; void setup() { Serial.begin(9600); IRLremote.begin(IR_PIN); pinMode(r1, OUTPUT); pinMode(y1, OUTPUT); pinMode(g1, OUTPUT); pinMode(r2, OUTPUT); pinMode(y2, OUTPUT); pinMode(g2, OUTPUT); pinMode(c, OUTPUT); } void loop() { #if IR_RCT != 0 remoteTick(); #endif mainLoop(); } void mainLoop() { if (city) { digitalWrite (c, HIGH); } if (!city) { digitalWrite (c, LOW); } if (this_mode == 12) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, LOW); digitalWrite (13, LOW); } if (ONstate) { if (default_city){ unsigned long currentMillis = millis(); if (currentMillis - main_timer >= interval) { main_timer = currentMillis; digitalWrite(13, !digitalRead(13)); if (digitalRead(13) == HIGH) { sek++; //*********************************************************// if (sek == 1) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, HIGH); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } //****************************************************// if (sek == 25) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 26) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, HIGH); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 27) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 28) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, HIGH); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 29) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 30) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, HIGH); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 31) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } //***********************************************************// if (sek == 32) { digitalWrite (r1, LOW); digitalWrite (y1, HIGH); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 35) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 38) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, HIGH); digitalWrite (g2, LOW); } if (sek == 40) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, HIGH); } //************************************************************// if (sek == 65) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 66) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, HIGH); } if (sek == 67) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 68) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, HIGH); } if (sek == 69) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 70) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, HIGH); } if (sek == 71) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } //*************************************************************// if (sek == 72) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, HIGH); digitalWrite (g2, LOW); } if (sek == 75) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 77) { digitalWrite (r1, HIGH); digitalWrite (y1, HIGH); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 80) { sek = 0; //обнуляем значение таймера } } } } if (this_mode == 1) { this_mode != 11; digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, HIGH); } if (this_mode == 2) { this_mode != 11; if (millis() - myTimer1 >= time1) { myTimer1 = millis(); if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, HIGH); digitalWrite(g2, ledState); } } if (this_mode == 3) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, HIGH); digitalWrite (g2, LOW); } if (this_mode == 4) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (this_mode == 5) { digitalWrite (r1, HIGH); digitalWrite (y1, HIGH); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (this_mode == 6) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, HIGH); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (this_mode == 7) { if (millis() - myTimer1 >= time1) { myTimer1 = millis(); if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, HIGH); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); digitalWrite(g1, ledState); } } if (this_mode == 8) { digitalWrite (r1, LOW); digitalWrite (y1, HIGH); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (this_mode == 9) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (this_mode == 10) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, HIGH); digitalWrite (g2, LOW); } if (this_mode == 11) { this_mode != 1; this_mode != 2; this_mode != 3; this_mode != 4; this_mode != 5; this_mode != 6; this_mode != 7; this_mode != 8; this_mode != 9; this_mode != 10; this_mode != 12; digitalWrite(r1, LOW); digitalWrite(g1, LOW); digitalWrite(r2, LOW); digitalWrite(g2, LOW); if (millis() - myTimer1 >= time1) { myTimer1 = millis(); if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(y1, ledState); digitalWrite(y2, ledState); } } } } #if IR_RCT != 0 void remoteTick() { if (IRLremote.available()) { auto data = IRLremote.read(); IRdata = data.command; ir_flag = true; } if (ir_flag) { switch (IRdata) { case BUTT_1: if (settings_mode) { this_mode = 1; } else { default_city; } break; case BUTT_2: if (settings_mode) { this_mode = 2; } break; case BUTT_3: if (settings_mode) { this_mode = 3; } else { city = !city; } break; case BUTT_4: if (settings_mode) { this_mode = 4; } break; case BUTT_5: if (settings_mode) { this_mode = 5; } break; case BUTT_6: if (settings_mode) { this_mode = 6; } break; case BUTT_7: if (settings_mode) { this_mode = 7; } break; case BUTT_8: if (settings_mode) { this_mode = 8; } break; case BUTT_9: if (settings_mode) { this_mode = 9; } break; case BUTT_0: if (settings_mode) { this_mode = 10; } else if (!settings_mode) { this_mode = 12; } break; case BUTT_STAR: ONstate = !ONstate; break; case BUTT_HASH: if (!settings_mode) { this_mode = 11; } break; case BUTT_OK: settings_mode = !settings_mode; digitalWrite(r1, HIGH); delay (200); digitalWrite(r1, LOW); digitalWrite(y1, HIGH); delay (200); digitalWrite(y1, LOW); digitalWrite(g1, HIGH); delay (200); digitalWrite(g1, LOW); digitalWrite(r2, HIGH); delay (200); digitalWrite(r2, LOW); digitalWrite(y2, HIGH); delay (200); digitalWrite(y2, LOW); digitalWrite(g2, HIGH); delay(200); digitalWrite(g2, LOW); break; case BUTT_UP: case BUTT_DOWN: case BUTT_LEFT: if (settings_mode) { if (--mode < 0)mode = MODE_AMOUNT; } this_mode = mode; break; case BUTT_RIGHT: if (settings_mode) { if (++mode > MODE_AMOUNT)mode = 0; } this_mode = mode; break; break; } ir_flag = false; } } #endifПопробовал просто таймер типо вариант на 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 строк. Сделайте из своего кода такие примеры - их и будем обсуждать.
#define MODE 0 #define MAIN_LOOP 5 int sek = 0; #define MODE_AMOUNT 10 int time1 = 1000; unsigned long main_timer; long previousMillis = 0; boolean settings_mode, city, default_city = true, ONstate = true; volatile boolean ir_flag; int8_t this_mode = MODE; int8_t mode = 0; void setup() { } void loop() { #if IR_RCT != 0 remoteTick(); #endif mainLoop(); } void mainLoop() { if (this_mode == 12) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, LOW); digitalWrite (13, LOW); } if (ONstate) { if (default_city){ unsigned long currentMillis = millis(); if (currentMillis - main_timer >= interval) { main_timer = currentMillis; digitalWrite(13, !digitalRead(13)); if (digitalRead(13) == HIGH) { sek++; //*********************************************************// if (sek == 1) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, HIGH); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } //****************************************************// if (sek == 25) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 30) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, HIGH); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 31) { digitalWrite (r1, LOW); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } //***********************************************************// if (sek == 32) { digitalWrite (r1, LOW); digitalWrite (y1, HIGH); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } **************тут другие команды по секундам********** if (sek == 77) { digitalWrite (r1, HIGH); digitalWrite (y1, HIGH); digitalWrite (g1, LOW); digitalWrite (r2, HIGH); digitalWrite (y2, LOW); digitalWrite (g2, LOW); } if (sek == 80) { sek = 0; //обнуляем значение таймера } } } } if (this_mode == 1) { this_mode != 11; digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, HIGH); } if (this_mode == 2) { this_mode != 11; if (millis() - myTimer1 >= time1) { myTimer1 = millis(); if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, LOW); digitalWrite (g2, HIGH); digitalWrite(g2, ledState); } } if (this_mode == 3) { digitalWrite (r1, HIGH); digitalWrite (y1, LOW); digitalWrite (g1, LOW); digitalWrite (r2, LOW); digitalWrite (y2, HIGH); digitalWrite (g2, LOW); } if (this_mode == 11) { this_mode != 1; this_mode != 2; this_mode != 3; this_mode != 4; this_mode != 5; this_mode != 6; this_mode != 7; this_mode != 8; this_mode != 9; this_mode != 10; this_mode != 12; digitalWrite(r1, LOW); digitalWrite(g1, LOW); digitalWrite(r2, LOW); digitalWrite(g2, LOW); if (millis() - myTimer1 >= time1) { myTimer1 = millis(); if (ledState == LOW) { ledState = HIGH; } else { ledState = LOW; } digitalWrite(y1, ledState); digitalWrite(y2, ledState); } } } } #if IR_RCT != 0 void remoteTick() { if (IRLremote.available()) { auto data = IRLremote.read(); IRdata = data.command; ir_flag = true; } if (ir_flag) { switch (IRdata) { case BUTT_1: if (settings_mode) { this_mode = 1; } break; case BUTT_2: if (settings_mode) { this_mode = 2; } break; case BUTT_3: if (settings_mode) { this_mode = 3; } else { city = !city; } break; ************ и др команды***************** case BUTT_0: if (settings_mode) { this_mode = 10; } else if (!settings_mode) { this_mode = 12; } break; case BUTT_STAR: ONstate = !ONstate; break; case BUTT_HASH: if (!settings_mode) { this_mode = 11; } break; case BUTT_OK: settings_mode = !settings_mode; break; } ir_flag = false; } } #endifда, с ним, или я так думаю, что с ним
я писал и так, как вы прочитали, типо
if (oldmillis - millis () > 25000) {
digitalWrite (r1, HIGH);
......
digitalWrite (g2, LOW);
далее тем же способом по секундам варианты, а точнее, наверное, сказать фазы или шаги типо "красный - - : - - зеленый" "красный - - : - желтый -" "красный - - : красный - -" "красный желтый - : красный - -" "- - зеленый : красный - -". Но они не идут, все стоит на первой указанной позиции
простите, но я не понимаю? то мало кода, то много
Скажите, что конкретно вам показать? Только default_city и объявление переменных?
Видимо я вас неправильно понял
Я прочитал вашу фразу
"Попробовал просто таймер типо вариант на 25 секунде if Millis - current mills > 25000 - ничего вообще не получается"
и понял ее так, что у вас проблемы с применением миллис.
Алекс, чему равно значение переменной interval и как она описана7
и вот еще любопытно - что вы этими строчками пытаетесь сказать????
this_mode != 1; this_mode != 2; this_mode != 3; this_mode != 4; this_mode != 5; this_mode != 6; this_mode != 7; this_mode != 8; this_mode != 9; this_mode != 10; this_mode != 12;Алекс, чему равно значение переменной interval и как она описана7
и вот еще любопытно - что вы этими строчками пытаетесь сказать????
this_mode != 1; this_mode != 2; this_mode != 3; this_mode != 4; this_mode != 5; this_mode != 6; this_mode != 7; this_mode != 8; this_mode != 9; this_mode != 10; this_mode != 12;Авторитетно убеждает компилятор, что this_mode ну точно никак не равна, и не может быть равна, потому что - так надо :)
Алекс, чему равно значение переменной interval и как она описана7
и вот еще любопытно - что вы этими строчками пытаетесь сказать????
this_mode != 1; this_mode != 2; this_mode != 3; this_mode != 4; this_mode != 5; this_mode != 6; this_mode != 7; this_mode != 8; this_mode != 9; this_mode != 10; this_mode != 12;вообще там
if (millis() - previousMillis > 500)
но я уже от запутанности и интервал приписывал, который относится к другим командам, где, вы можете видеть, спокойно себе мигают зеленый сигнал или же "аварийный" режим
интервал такой
const long interval = 1000; то есть секунда
что касается вашего любопытства о восклицательных зыс модах - опять же, я уже что последнее в голову приходило, пытался их так отключить при работе стандартного режима - не получилось
смешно:) только так и есть и не авторитетно))))
а вот вы бы помогли может? пожалуйста
что не так?
у меня на самом деле вариантов много, чего я сам понаписал - всех и не упомнить
показал этот, потому что он работает сам по себе, если его "не трогать"
Алекс, чему равно значение переменной interval и как она описана7
и вот еще любопытно - что вы этими строчками пытаетесь сказать????
this_mode != 1; this_mode != 2; this_mode != 3; this_mode != 4; this_mode != 5; this_mode != 6; this_mode != 7; this_mode != 8; this_mode != 9; this_mode != 10; this_mode != 12;Авторитетно убеждает компилятор, что this_mode ну точно никак не равна, и не может быть равна, потому что - так надо :)
что касается вашего любопытства о восклицательных зыс модах - опять же, я уже что последнее в голову приходило, пытался их так отключить при работе стандартного режима - не получилось
Знаешь почему не получилось? Потому что отсутствует знание основ.Лучшим вариантом для решения этой небольшой проблемы - будет начать чтение основ С++. Но, как показывает опыт, неофиты почему-то очень негативно относятся к таким советам.
а вот вы бы помогли может? пожалуйста
что не так?
Строчка this_mode != 11; - это просто сравнение, причём - в никуда. Если ты хотел как-то изменить значение переменной, то оператор сравнения "!=" тут не подходит. Нужен оператор присваивания, проще говоря "=". Поскольку у тебя переменная this_mode принимает ограниченное кол-во известных режимов, то лучшим вариантом сбросить её так, чтобы она заведомо не соответствовала никакому из режимов - введение специального значения, заведомо неравного никакому из режимов. На примере:
показал этот, потому что он работает сам по себе, если его "не трогать"
Алекс, это строчки - бредятина. Если число равно 11, и так понятно. что оно не равно одному, двум, трем...
Что касается кода - напищите четко и подробно, что именно в нем неверно работает.