Даже не один цикл 4, а цикл для вывода номера измерения, цикл для вывода энергии и цикл для вывода скорости.
Большое спасибо. Теперь приложу все усилия что бы самому дописать скетч. вроде все уже разжевали). не думал что собрать скетч в кучу, окажется сложнее чем саму схему спаять. Кстати по моему разобрался почему были помехи и ложные срабатывания на прерываниях. посмотел через камеру а оказалось что излучающие диоды мерцают немного(после импульсного стабилизатора) возможно эти мерцания и сводили с ума Дуню. Хотя почему тогда, когда пользовался обычной командой digitalRead этих помехи не влияли на измерения. Ладно х с ним главное что работает. У меня знакомые планеристы интересуются можно ли сделать авиагоризонт (показометр крена и тангажа) и сколько он может стоить. Возможно займусь этим, как скетч закончу для хрона.(а это наверное не одну неделю займет) Кстати вопрос не про Ардуино, но если кто в курсе посоветуйте какое жало паяльника T12 удобнее для навесного монтажа? параллельно собираю себе на ардуино паяльник)
всем доброго здравия. временная затычка вышла с воодом данных веса пульки. Сорри уже баиньки пора и некогда скеч комментировать( завтра постараюсь это сделать. но суть в следующем. от длинного нажатия на кнопку Mode_button переходим в режим ввода веса пульки. при этом следующие короткие нажатия Mode_button переключаются между разрядами индикатора куда вводятся данные им присвоил имена abcd. будет использоваться 3 разряда b- граммы, c- 10 доля грамма d- сотая. так вот когда начинаешь вводить кнопками Step_up_button и Step_down_button. начинают изменятся данные во всех разрядах в данном случае в d и c. аналогов задчи которую я решаю в интернете не встречал, поэтому приходитс самому додумывать как поразрядно ввести данные в МК. можно конечно просто сделать что при нажатии на кнопку будет добавлятся по 1 мг веса, но если пулька будет весить 3 грамма то это очень неудобно будет. Завтра если не решу сам постараюсь подробнее закомментировать скетч. если кто сегодня поймет в чем цимес буду премного благодарен. так как с утра переварю и смогу дальше продолжить. Код (C++): #include "TM1637.h" // Подключаем библиотеку #define CLK 12 // К этому пину подключаем CLK #define DIO 13 // К этому пину подключаем DIO TM1637 disp(CLK,DIO); #define Mode_button 11// блок кнопок кнопка выбора режимов static byte CountMode = 0; // счетчик нажатий кнопки #define Step_up_button 10 // шаг вверх byte CountStep_up =0; #define Step_down_button 9// шаг вниз byte CountStep_down =0; bool Test_cycle = 0; bool IN_cycle = 1; bool OUT_cycle = 1; bool Speed_cycle = 1; bool Energy_cycle = 1; bool Meas_num_cycle = 1; bool display_cycle = 1; int a = 0; int b = 0; int c = 0; int d = 0; void setup() { // Устанавливаем яркость от 0 до 7 disp.set(3); disp.init(D4056A); } void loop() // Повторяем в бесконечном цикле { int8_t NumTab[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; bool prevflagMB = 0; bool flagMB = 0; disp.display(0,NumTab[17]); disp.display(1,NumTab[17]); disp.display(2,NumTab[17]); //16 минус - 17 пустое место disp.display(3,NumTab[17]); static unsigned long previousMillis77 =0; if (digitalRead(Mode_button ==1)&&millis() - previousMillis77 > 25) { previousMillis77 = millis(); prevflagMB = 1;} if (digitalRead(Mode_button ==0)&&millis() - previousMillis77 > 25 && prevflagMB == 1 ) { previousMillis77 = millis(); flagMB = 1; if (flagMB == 1 && prevflagMB == 1) { CountMode++; if(CountMode == 3)CountMode =0; flagMB = 0; } prevflagMB = 0; } bool long_press =0; if (digitalRead(Mode_button ==1)&&millis() - previousMillis77 > 2000) { previousMillis77 = millis(); prevflagMB = 1; } if (digitalRead(Mode_button ==0)&&millis() - previousMillis77 > 25 && prevflagMB == 1 ) { bool long_press =1; previousMillis77 = millis(); prevflagMB = 0; if (long_press ==1) { bool Energy_cycle = 0; long_press =0; } } while (Energy_cycle == 0); { static bool FDown =0; static bool FUp =0; static byte CountDigit =0; if (digitalRead(Mode_button ==1)) { delay(20); FDown =1; } if (digitalRead(Mode_button ==0) && FDown ==1) { delay(20); FUp =1; if (FDown ==1 && FUp ==1) { CountDigit++; if (CountDigit == 2) CountDigit=0; FDown =0; FUp =0; } } if (CountDigit ==0) {disp.display(3,NumTab[d]); if (digitalRead(Step_up_button ==1)) { delay(20); FDown =1; } if (digitalRead(Step_up_button ==0) && FDown ==1) { delay(20); FUp =1; if (FDown ==1 && FUp ==1) { d=d+1; if (d ==10) d=0; FDown =0; FUp =0; } } if (digitalRead(Step_down_button ==1)) { delay(20); FDown =1; } if (digitalRead(Step_down_button ==0) && FDown ==1) { delay(20); FUp =1; if (FDown ==1 && FUp ==1) { d=d-1; if (d == -1) d=9; FDown =0; FUp =0; } } } if (CountDigit ==1) { disp.display(2,NumTab[c]); if (digitalRead(Step_up_button ==1)) { delay(20); FDown =1; } if (digitalRead(Step_up_button ==0) && FDown ==1) { delay(20); FUp =1; if (FDown ==1 && FUp ==1) { c=c+1; if (c ==10) c=0; FDown =0; FUp =0; } } if (digitalRead(Step_down_button ==1)) { delay(20); FDown =1; } if (digitalRead(Step_down_button ==0) && FDown ==1) { delay(20); FUp =1; if (FDown ==1 && FUp ==1) { c=c-1; if (c == -1) c=9; FDown =0; FUp =0; } } } } //выход из цикла пока не дописал , пока не до выхода // ввод написан на delay потому что общий код программы хроногафа просто огромен и я уже путаться начал( }
Не очевидный код. Код (C++): if (digitalRead(Mode_button ==1) digitalRead возвращает LOW или HIGH, а не true или false. Mode_button ==1 получается 0. Это точно то что нужно? Может так надо? Код (C++): if (digitalRead(Mode_button) ==HIGH) Ну и по остальным кнопкам то же самое.
уже час ночи, но услышал оповещение и решил ответить. Не помню на каком форуме это подхватил, но один человек писал что так ускоряется написание кода. что 0 это то же самое что и false и LOW , 1 == HIGH или true я и для себя на этом принципе программки пишу. все стабильно работает, компилятор не матерится. Но исправлюсь обязательно. Спасибо за направление. если бы еще помогли почему одновременно изменяются пременные d и c) все всем спокойной ночи, отключаю телефон)
Сейчас вместо кнопок на пинах 9,10,11 скетч читает пин 0. И что он там читает не известно. Поэтому нет смысла искать ошибку там где её возможно нет.
0 и false это одно и то же. На счёт LOW == 0 - недокументированная фича. HIGH == 1 это тоже недокументированная фича. Не 0, это true, но true это 1. И в общем сравнение номера пина с HIGH или LOW быстрее наводит на мысль об ошибке, чем сравнение с 1 или 0.
вечер добрый. Разобрался с вводом данных по разрядам. получилось просто и легко. теперь новая проблема не могу выйти из цикли( Теоретически хотел внутри цикла ввода веса кнопкой Mode_button переключать вводимые разряды.(это получается хорошо) а выходить из цикла долгим нажатием более 2 сек(на эту же кнопку) при этом при выходе, собирается вес пульки из введенных разрядов. внизу скетча нерабочие закооментированные варианты. Ни один не работает((( ни тот что слизал из интернета, ни тот что сам изобрел. оба варианта непонятно что делают, но в результате у дуни съезжает крыша и помогает только ресет. пока вышел из положения, одновременным нажатием Step_up_button и Step_down_button кнопок. При этом одновременное нажатие остваляет введенные данные нетронутыми. так как одна кнопка прибавляет, другая сразу отнимает, в результате введеное число остается тем же. Кот длинный . Если кто сможет помочь смотрите только нижнюю часть, попытки выхода из цикла Код (C++): #include "TM1637.h" // Подключаем библиотеку #define CLK 12 // К этому пину подключаем CLK #define DIO 13 // К этому пину подключаем DIO TM1637 disp(CLK,DIO); #define Mode_button 11// кнопока кнопка выбора режимов #define Step_up_button 10 // шаг вверх #define Step_down_button 9// шаг вниз int CountDigit =0; bool Flag_MB1 =0; bool Flag_MBc =0; //bool Flag_MB =0; //bool Flag_MB_long =0;//флаг нажатия кнопки выбора режима bool Flag_S_up =0; bool Flag_S_down =0; bool long_press =0; byte CountMode = 0; // счетчик нажатий кнопки byte CountStep_down =0; unsigned long prevMillis =0; byte CountStep_up =0; bool Test_cycle = 0; bool IN_cycle = 1; bool OUT_cycle = 1; bool Speed_cycle = 1; bool Energy_cycle = 1; bool Meas_num_cycle = 1; bool display_cycle = 1; int bullets_weight; int a = 0; int b = 0; int c = 0; int d = 0; bool button_state = true; bool button_long_state = false; uint32_t ms_button = 0; void setup() { // Устанавливаем яркость от 0 до 7 disp.set(3); disp.init(D4056A); Serial.begin(9600); pinMode(Mode_button, INPUT); pinMode(Step_up_button, INPUT); pinMode(Step_up_button, INPUT); } void loop() { while (Energy_cycle == 0); { int8_t NumTab[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,}; if (digitalRead(Mode_button) ==HIGH && Flag_MBc ==0 )//&& long_press ==1 { CountDigit++; Flag_MBc =1; if(CountDigit >3) { CountDigit=1; } } if (digitalRead(Mode_button) ==LOW && Flag_MBc ==1)//&& long_press ==1 { Flag_MBc =0; } Serial.println("CountDigit"); Serial.println(CountDigit); if (CountDigit ==1) {disp.display(3,NumTab[d]); if (digitalRead(Step_up_button) ==HIGH&& Flag_S_up ==0 ) { d=d+1; if (d ==10) { d=0; } Flag_S_up =1;} if (digitalRead(Step_up_button) ==LOW && Flag_S_up == 1 ) { Flag_S_up =0;} if (digitalRead(Step_down_button) ==HIGH&&Flag_S_down ==0 ) { d=d-1; if (d ==-1) { d=9; } Flag_S_down =1;} if (digitalRead(Step_down_button) ==LOW && Flag_S_down ==1 ) { Flag_S_down =0;} Serial.println("d"); Serial.println(d); } if (CountDigit ==2) { disp.display(2,NumTab[c]); if (digitalRead(Step_up_button) ==HIGH&& Flag_S_up ==0 ) { c=c+1; if (c ==10) { c=0; } Flag_S_up =1;} if (digitalRead(Step_up_button) ==LOW && Flag_S_up == 1 ) { Flag_S_up =0;} if (digitalRead(Step_down_button) ==HIGH&&Flag_S_down ==0 ) { c=c-1; if (c ==-1) { c=9; } Flag_S_down =1;} if (digitalRead(Step_down_button) ==LOW && Flag_S_down ==1 ) { Flag_S_down =0;} Serial.println("c"); Serial.println(c); } if (CountDigit ==3) { disp.display(1,NumTab[b]); if (digitalRead(Step_up_button) ==HIGH&& Flag_S_up ==0 ) { b=b+1; if (b ==10) { b=0; } Flag_S_up =1;} if (digitalRead(Step_up_button) ==LOW && Flag_S_up == 1 ) { Flag_S_up =0;} if (digitalRead(Step_down_button) ==HIGH&&Flag_S_down ==0 ) { b=b-1; if (b ==-1) { b=9; } Flag_S_down =1;} if (digitalRead(Step_down_button) ==LOW && Flag_S_down ==1 ) { Flag_S_down =0;} Serial.println("b"); Serial.println(b); } if (digitalRead(Step_down_button) ==HIGH && digitalRead(Step_up_button) ==HIGH && Flag_MB1 ==0 )//&& long_press ==1 { Flag_MB1 =1; } if (digitalRead(Step_down_button) ==LOW &&digitalRead(Step_up_button) ==LOW&& Flag_MB1 ==1)//&& long_press ==1 { Flag_MB1 =0; bullets_weight = b*100+c*10+d; Serial.println(bullets_weight); delay(2000); } /*uint32_t ms = millis(); //варианд длинногонажатия из интернета bool pin_state = digitalRead(Mode_button); if( pin_state == HIGH && button_state && ( ms - ms_button ) > 50 ){ button_state = false; button_long_state = false; ms_button = ms; } // Фиксируем длинное нажатие кнопки if( pin_state == HIGH && !button_long_state && ( ms - ms_button ) > 2000 ){ button_long_state = true; Serial.println("Long press key"); } // Фиксируем отпускание кнопки if( pin_state == LOW &&! button_state && ( ms - ms_button ) > 50 ){ button_state = true; ms_button = ms; if( !button_long_state )Serial.println("Press key"); } // мой вариант обоработки длинного нажаития /* if (digitalRead(Mode_button) ==HIGH && Flag_MB1 ==0 && millis() - prevMillis > 2000 ) { Flag_MB1 =1; long_press =1; prevMillis = millis(); //bool Energy_cycle = 0; } if (digitalRead(Mode_button) ==LOW && Flag_MB1==1 ) {Energy_cycle=1; Flag_MB1 =0; } if (long_press ==1) { bullets_weight = b*100+c*10+d; Serial.println(bullets_weight); delay(2000); }*/ } } про антидребезг не напоминать)
Кнопка с удержанием должна срабатывать когда её отпускают. Когда такую кнопку нажимают можно подать сигнал, что кнопка нажата. Например моргнуть индикатором. А дальше неизвестно что нужно делать, пока порог удержания не превышен или кнопка не отпущена.
Ок спасибо, об этом не подумал. попробую переделать. а вобще все мои попытки вешают ардуино и она не рагирует больше ни на какие нажатия после длинного нажатия)
Комментируйте коД. Пишите что должно произойти на каждом шаге выполнения. Иногда программист думает ожидает одно, а код пишет про другое.
постараюсь. все делается урывками, пока никто не видит что дите балуется херней. поэтому тороплюсь не успеваю комментировать. но буду меняться
Лучше даже сначала коментарии набросать и под них уже кодить. Разделите код на функции. Цикл loop уже необозримым стал.
Смотрю у вас три куска почти идентичного кода. Вместо отдельных переменных b, c, d объявите массив. uint8_t d[3]; Используйте CountDigit-1 в качестве индекса d[CountDigit-1] Тогда три ветки if (CountDigit==1 if (CountDigit==2 if (CountDigit==3 Можно будет объединить в одну.
спасибо за помощь. решил этот ребус. получилось на пол сотни строк меньше) Код (C++): #include "TM1637.h" // Подключаем библиотеку #define CLK 12 // К этому пину подключаем CLK #define DIO 13 // К этому пину подключаем DIO TM1637 disp(CLK,DIO); #define Mode_button 11// кнопока кнопка выбора режимов #define Step_up_button 10 // шаг вверх #define Step_down_button 9// шаг вниз int CountDigit =0; bool Flag_MB1 =0; bool Flag_MBc =0; //bool Flag_MB =0; //bool Flag_MB_long =0;//флаг нажатия кнопки выбора режима bool Flag_S_up =0; bool Flag_S_down =0; bool long_press =0; byte CountMode = 0; // счетчик нажатий кнопки byte CountStep_down =0; unsigned long StartMillis =0; unsigned long StopMillis =0; byte CountStep_up =0; bool Test_cycle = 0; bool IN_cycle = 1; bool OUT_cycle = 1; bool Speed_cycle = 1; bool Energy_cycle = 1; bool Meas_num_cycle = 1; bool display_cycle = 1; int bullets_weight; bool button_state = true; bool button_long_state = false; uint32_t ms_button = 0; int DG =0; int8_t Digit[3] ; void setup() { // Устанавливаем яркость от 0 до 7 disp.set(3); disp.init(D4056A); Serial.begin(9600); pinMode(Mode_button, INPUT); pinMode(Step_up_button, INPUT); pinMode(Step_up_button, INPUT); } void loop() { // while (Energy_cycle == 1); // { int8_t NumTab[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,}; // disp.display(0,NumTab[17]); disp.display(1,NumTab[Digit[2]]); disp.display(2,NumTab[Digit[1]]); //16 минус - 17 пустое место disp.display(3,NumTab[Digit[0]]); bool NazgatieBM =0; if (digitalRead(Mode_button) ==HIGH && Flag_MBc ==0 )//если кнопка воборов режима нажата { StartMillis=millis();//засекаем время нажатия Flag_MBc = 1; } if (digitalRead(Mode_button) ==LOW && Flag_MBc ==1)//если кнопка выбора режима отжата { StopMillis = millis();//засекаем время отжатия NazgatieBM =1; //флаг что было нажатие Flag_MBc =0; } Serial.println("StartMillis"); Serial.println(StartMillis); Serial.println("StopMillis"); Serial.println(StopMillis); //если врямя клика больше 20мс и меньше 2000 //то это короткое нажатие выбра разряда индикатора для ввода данных if (StopMillis - StartMillis >20 && StopMillis - StartMillis <2000 && NazgatieBM ==1) {StartMillis = 0; StopMillis = 0; CountDigit++; Serial.println("KOROTCOE NAZGATIE"); NazgatieBM =0; // if(CountDigit >3) { CountDigit=1; } } Serial.println("CountDigit"); Serial.println(CountDigit); ; // если зафиксировано длинное нажатие if (StopMillis - StartMillis >2000 && NazgatieBM ==1) { StartMillis = 0; StopMillis = 0; long_press = 1; // флаг длинного нажатия NazgatieBM =0; Serial.println("DLINNOE NAZGATIE"); } if (long_press ==1) // если есть флаг длинного нажатия { bullets_weight = (Digit[2]*100)+(Digit[1]*10)+Digit[0]; // рассчитываем вес пульки когда убираешь скобки получается фигня Serial.println(bullets_weight); // выводим на монитор(это только для отладки) long_press =0; Energy_cycle = 0; //выходим из цикла delay(2000); } if (CountDigit >0) //если счетчик разрядов больше 0( по другом не смог придумать как завести фунцию { if (digitalRead(Step_up_button) ==HIGH&& Flag_S_up ==0 ) дальше уже вводим данные используя элемет массива как переменную) { Digit[CountDigit-1]=Digit[CountDigit-1]+1; Serial.println("hren"); Flag_S_up =1; if (Digit[CountDigit-1] ==10) { Digit[CountDigit-1]=0; } } if (digitalRead(Step_up_button) ==LOW && Flag_S_up == 1 ) { Flag_S_up =0;} if (digitalRead(Step_down_button) ==HIGH&&Flag_S_down ==0 ) { Digit[CountDigit-1]=Digit[CountDigit-1]-1; Flag_S_down =1; if (Digit[CountDigit-1] ==-1) { Digit[CountDigit-1]=9; } } if (digitalRead(Step_down_button) ==LOW && Flag_S_down ==1 ) { Flag_S_down =0;} } Serial.println("DG"); //Digit[2] Serial.println(DG); Serial.println("d"); Serial.println(d); Serial.println("c"); Serial.println(c); Serial.println("b"); Serial.println(b); //} */ } едиственно теперь не представляю как сделать помигивание вводимого рязряда. Хотя наверное и так хорошо. учитываю простоту ввода сразу 2 кнопками + и-, хотя хватило бы даже 1). Буду пилить дальше! если настроение позволить может и помигивание реализую. кстати теперь когда какое либо действие происходит после отжатия кнопки, все стало работь как я и хотел. ище раз спасибо за правильное направление
попалась страничка с картинками. https://www.drive2.ru/b/457450989176230857/ стало немного понятнее как циклы работают. не совсем согласен как изображены continue и break. но в целом наглядно. кстати как кошернее выходить из цикла while по условию или по break в цикле?
Хоть по goto.))) Если программа становится короче, понятнее, то почему бы не использовать continue, break или goto? Хотя можно и без них обойтись.
Советик. Чтобы не писать многократно громоздкие выражения воспользуйтесь ссылочным типом Код (C++): uint8_t & d = Digit[CountDigit-1]; Теперь переменная d и Digit[CountDigit-1] это синонимы. Меняя d вы фактически меняете Digit[CountDigit-1].
Спасибо большое! сейчас еще веселее набросок покажу) обхохочетесь. Суть в следущем есть 4 светодиода. 2 группы по 2. синий и желтый - показывают напряжение на входной группе датчиков. если оно идеальное - между 2.2 и 2.3 вольта, то горят оба. если меньше идеального то горит синий, если больше идеального,но в рамках допустимого горит желтый. если напряжение выходит за допустимые пределы начинают мигать если низкое мигает синий если высокое мигает желтый. такая же история с выходными датчиками. мне это нужно для того что бы при включении игрушки произошло тестирование датчиков. если все хорошо, диоды мигнут 3 раза и выход из режима тестрирования. если нет то цикл "зацикливается") пока не напряжение на датчиках не придет в порядок. сам скетч измерения как не странно рабочий. но гигантский. вопрос есть ли способы ужать его? Заранее благодарен Вася. Даже загрузка ругается на длину. размещаю только часть. дальше в case просто перебираются все возмодные варианты, индикации напряжения. можно было сделать отдельно вход и выход индикацию но по ряду причин мне удобнее когда все 4 светодиода управляются одним режимом case Код (C++): #define Led_IN_yellow 17 // вход блок индикаторных светодидов #define Led_IN_blue 16 #define Led_OUT_yellow 18 // выход #define Led_OUT_blue 19 #define pinIN 2 // входные пины датчкиов #define pinOUT 3 // пин выходных датчков #define pin_TestIN A0 #define pin_TestOUT A1 bool InPort_stat = 0; // флаг срабатывания входа bool OutPort_stat = 0; // флаг срабатывания выхода bool flagIN = 0; bool flagOUT = 0; bool Test_cycle = 0; bool IN_cycle = 0; bool OUT_cycle = 0; bool Speed_cycle = 0; bool Energy_cycle = 0; bool Meas_num_cycle = 0; bool display_cycle = 0; uint32_t IN_ms, IN_ms1 = 0; bool IN_led_stat = true; uint32_t OUT_ms, OUT_ms1 = 0; bool OUT_led_stat = true; void setup() { pinMode (Led_IN_yellow , OUTPUT); pinMode (Led_IN_blue , OUTPUT); pinMode (Led_OUT_yellow , OUTPUT); pinMode (Led_OUT_blue , OUTPUT); pinMode (pin_TestIN , INPUT); pinMode (pin_TestOUT , INPUT); uint32_t IN_ms, IN_ms1 = 0; bool IN_led_stat = true; uint32_t OUT_ms, OUT_ms1 = 0; bool OUT_led_stat = true; Serial.begin(9600); } void loop() { while (Test_cycle == 0) //pin_TestIN pin_TestOUT //digitalWrite (Led_IN_blue, 1); //digitalWrite (Led_IN_yellow, 1); {int ModeTest; int TestIN = analogRead(pin_TestIN); //Led_IN_yellow Led_IN_blue Led_OUT_yellow Led_OUT_blue int TestOUT = analogRead(pin_TestOUT); //если входное меньше 2 if (TestIN < 409 && TestOUT > 409 && TestOUT < 450) ModeTest = 1; if (TestIN < 409 && TestOUT > 450 && TestOUT < 471) ModeTest = 2; if (TestIN < 409 && TestOUT > 471 && TestOUT < 512) ModeTest = 3; if (TestIN < 409 && TestOUT > 512) ModeTest = 4; if (TestIN < 409 && TestOUT < 409) ModeTest = 5; // если входное в пределах 2 и 2.2 if (TestIN > 409 && TestIN < 450 && TestOUT < 409) ModeTest = 6; if (TestIN > 409 && TestIN < 450 && TestOUT > 512) ModeTest = 7; if (TestIN > 409 && TestIN < 450 && TestOUT > 409 && TestOUT < 450) ModeTest = 8; if (TestIN > 409 && TestIN < 450 && TestOUT > 450 && TestOUT < 471) ModeTest = 9; if (TestIN > 409 && TestIN < 450 && TestOUT > 471 && TestOUT < 512) ModeTest = 10; // если входное в пределах 2.2 и 2.3 if (TestIN > 450 && TestIN < 471 && TestOUT < 409) ModeTest = 11; if (TestIN > 450 && TestIN < 471 && TestOUT > 512) ModeTest = 12; if (TestIN > 450 && TestIN < 471 && TestOUT > 409 && TestOUT < 450) ModeTest = 13; if (TestIN > 450 && TestIN < 471 && TestOUT > 450 && TestOUT < 471) ModeTest = 14; if (TestIN > 450 && TestIN < 471 && TestOUT > 471 && TestOUT < 512) ModeTest = 15; // если входное в пределах 2.3 и 2.5 if (TestIN > 471 && TestIN < 512 && TestOUT < 409) ModeTest = 16; if (TestIN > 471 && TestIN < 512 && TestOUT > 512) ModeTest = 17; if (TestIN > 471 && TestIN < 512 && TestOUT > 409 && TestOUT < 450) ModeTest = 18; if (TestIN > 471 && TestIN < 512 && TestOUT > 450 && TestOUT < 471) ModeTest = 19; if (TestIN > 471 && TestIN < 512 && TestOUT > 471 && TestOUT < 512) ModeTest = 20; //если входное больше 5ModeTest =1; if (TestIN > 512 && TestOUT < 409) ModeTest = 21; if (TestIN > 512 && TestOUT > 512) ModeTest = 22; if (TestIN > 512 && TestOUT > 409 && TestOUT < 450) ModeTest = 23; if (TestIN > 512 && TestOUT > 450 && TestOUT < 471) ModeTest = 24; if (TestIN > 512 && TestOUT > 471 && TestOUT < 512) ModeTest = 25; switch (ModeTest) { case 1: static unsigned long previousMillis7 = 0; if (millis() - previousMillis7 > 300) { previousMillis7 = millis(); digitalWrite(Led_IN_blue, !digitalRead(Led_IN_blue)); } digitalWrite (Led_OUT_blue, 1); digitalWrite (Led_IN_yellow, 0); digitalWrite (Led_OUT_yellow, 0); break; case 2: static unsigned long previousMillis6 = 0; if (millis() - previousMillis6 > 300) { previousMillis6 = millis(); digitalWrite(Led_IN_blue, !digitalRead(Led_IN_blue)); } digitalWrite (Led_IN_yellow, 0); digitalWrite (Led_OUT_blue, 1); digitalWrite (Led_OUT_yellow, 1); break; case 3: static unsigned long previousMillis5 = 0; if (millis() - previousMillis5 > 300) { previousMillis5 = millis(); digitalWrite(Led_IN_blue, !digitalRead(Led_IN_blue)); } digitalWrite (Led_IN_yellow, 0); digitalWrite (Led_OUT_yellow, 1); digitalWrite (Led_OUT_blue, 0); break; case 4: static unsigned long previousMillis4 = 0; if (millis() - previousMillis4 > 300) { previousMillis4 = millis(); digitalWrite(Led_IN_blue, !digitalRead(Led_IN_blue)); } static unsigned long previousMillis3 = 0; if (millis() - previousMillis3 > 300) { previousMillis3 = millis(); digitalWrite(Led_OUT_yellow, !digitalRead(Led_OUT_yellow)); } digitalWrite (Led_IN_yellow, 0); digitalWrite (Led_OUT_blue, 0); break; case 5: static unsigned long previousMillis2 = 0; if (millis() - previousMillis2 > 300) { previousMillis2 = millis(); digitalWrite(Led_IN_blue, !digitalRead(Led_IN_blue)); } static unsigned long previousMillis1 = 0; if (millis() - previousMillis1 > 300) { previousMillis1 = millis(); digitalWrite(Led_OUT_blue, !digitalRead(Led_OUT_blue)); } digitalWrite (Led_IN_yellow, 0); digitalWrite (Led_OUT_yellow, 0); break; case 6: digitalWrite (Led_IN_blue, 1); digitalWrite (Led_IN_yellow, 0); static unsigned long previousMillis8 = 0; if (millis() - previousMillis1 > 300) { previousMillis8 = millis(); digitalWrite(Led_OUT_blue, !digitalRead(Led_OUT_blue)); } digitalWrite (Led_OUT_yellow, 0); break; unsignedlong previousMillis1 почему на каждый вариант мигания своя переменная то самому странноб компилятор не дал возможности обойтись одной общей переменной. пришлось так выкручиваться
Зачем мильён раз проверять одно и то же. Используйте вложенные if, используйте else if В условиях явно ошибка из-за двойной проверки порога само пороговое значение выпало.