Оператор Switch или IF

forfrends
Offline
Зарегистрирован: 24.02.2015

Добрый день! Можно ли для оператора Switch использовать диапазан значений? То есть вместо

witch (var) {
   	 case 1:
              ....
      	break;
    	case 2:
              ....
     	 break;
              ....
              ....
  }

Написать:

witch (var) {
   	 case 1 - 2:
              ....
      	break;

              ....
              ....
  }

А то не сильно хочется писать так:

if (i > 40)   {...; }
if (i <= 40 && i > 30){...; }
if (i <= 30 && i > 20) {...; }
if (i <= 20 && i > 10) {...; }
if (i <= 10)  {...; }

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

http://stackoverflow.com/questions/12911691/switch-multiple-values-in-one-case

case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
   MessageBox.Show("You are only " + age + " years old\n You must be kidding right.\nPlease fill in your *real* age.");
break;

case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
   MessageBox.Show("You are only " + age + " years old\n That's too young!");
   break;

 

forfrends
Offline
Зарегистрирован: 24.02.2015

Печалька :(

У меня диапазан значений примерно 150. Похоже case здесь не поможет. Буду использовать If.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Можно еще, например, сделать константный массив граничных значений (часто достаточно хранить одну границу) и отдельную функцию, которая в цикле пробежится по массиву граничных значений и найдет нужный период. Впрочем можно пойти дальше, сделать структуру в которой одна из границ (какая - зависит от задачи) и ссылка на функцию-обрботчик. Дальше массив структур и тоже самое, отдельная функция, которая пробежится по массиву структур и вызовет соответствующий функцию обработчик. Короче, зависит от задачи, как обычно. Для одних задач мои варианты - как из пушки по воробьям, для других - простой способ сделать расширяемые/изменяемые диапазоны срабатывания.

Еще, нет особого смысла сравнивать обе границы, часто достаточно проверять одну границу и пользоваться конструкцией:

if(...) {} else if(...) {} else if(...) {} else {};

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

К примеру, возять твой вариант:

if (i > 40)   {...; }
if (i <= 40 && i > 30){...; }
if (i <= 30 && i > 20) {...; }
if (i <= 20 && i > 10) {...; }
if (i <= 10)  {...; }

И переписать его в такой:

if (i > 40)   {...; }
else if (i > 30){...; }
else if (i > 20) {...; }
else if (i > 10) {...; }
else  {...; }

Проще, может быть чуть-чуть сложнее для понимания, но если понятен смысл, то даже проще читаемый код.

 

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Попробуйте так:

    switch ( value ) {
       case 0:
            break;
       case 1 ... 9:
            break;
       case 11 ... 24:
            break;
       case 25 ... 49:
            break;
       case 50 ... 100:
            break;         
        default:
            break;
    }

 

forfrends
Offline
Зарегистрирован: 24.02.2015

Спасибо, использовал If...elseIf . Для case слишком много значений пролисывать надо.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Т.е. как?

if (i > 40)   {...; }
else if (i <= 40 && i > 30){...; }
else if (i <= 30 && i > 20) {...; }
else if (i <= 20 && i > 10) {...; }
else if (i <= 10)  {...; }

или

switch ( value ) 
{
   case 0 ... 10: { break; }
   case 11 ... 20: { break; }
   case 21 ... 30: { break; }
   case 31 ... 40: { break; }
   default: { break; }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

forfrends пишет:

Спасибо, использовал If...elseIf . Для case слишком много значений пролисывать надо.

А чем Вам не понравился вариант, предложенный Uni? Мне казалось, что это как раз то, о чём Вы просили.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

На самом деле такое использование называется gnu extension, т.е. это расширение c++, используемое в avr-g++ компиляторе. Программа будет не переносимой, если пользоваться такими расширениями. Их можно использовать, только нужно знать какие ограничения от этого могут быть.
Есть ряд таких расширений, кторые с одной стороны удобны, но с другой, к удобству быстро привыкаешь, что не всегда хорошо.

Вот, например:

typedef struct _POINT
{
  int x;
  int y;
} POINT;

void loop() {

  POINT CurrentPosition;

  //...

  CurrentPosition = ( POINT ) { .x = 0, .y = 0 };

}

В других компиляторах такое присвоение сделать нельзя, только при инициализации.

П.С. Да, кстати, эти расширения зависят от версии компилятора и, возможно, от выбранного стандарта языка (точно не помню).

forfrends
Offline
Зарегистрирован: 24.02.2015

Столько тонкостей я еще не знаю! uni, ЕвгенийП я наверное неправильно понял пример. Я подумал что вместо:

case 0 ... 10: { break; }

нужно писать:

case 0 1 2 3 4 5 6 7 8 9 10: { break; }

Тогда уж точно легче:

if (i > 40)   {...; }
else if (i > 30){...; }
else if (i > 20) {...; }
else if (i > 10) {...; }
else  {...; }

 

Но если можно case 0 ... 10: { break; } то это сделает код проще и читабельней (как на мой взгляд).
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так, можно же. Другое дело, что, как Вам правильно коллега сказал, это расширение языка и в стандарте такого нет. Т.е. далеко не все компиляторы это поддерживают. Но, до тех пор, пока Вы живёте на gc/gcc - нет проблем. Т.е. проблем нет ни с Arduino-IDE, ни c AVR-студией.

Вот Вам готовый к запуску пример. Запустите, посмотрите. Вы вводите число, а он говорит в каокй диапазон оно попало.

void setup() {
	Serial.begin(115200);
	Serial.setTimeout(0x7fffffff);
}

void loop() {
	Serial.println("Enter a number:");
	int value = Serial.parseInt();
	Serial.flush();
	switch (value ) {
	   case 0 ... 10: { 
	   	Serial.println("0 ... 10");
	   	break; 
	   }
	   case 11 ... 20: { 
	   	Serial.println("11 ... 20");
	   	break; 
	   }
	   case 21 ... 30: {
	   	Serial.println("21 ... 30");
	   	break; 
	   }
	   case 31 ... 40: {
	   	Serial.println("31 ... 40");
	   	break; 
	   }
	   default: {
	   	Serial.println("Ni hrena");
	   	break; 
	   }
	}
}

 

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

Здорово!

Привык в Паскале к таким конструкциям, и здесь без них тяжело. Но, оказывается, они тоже есть, правда, набивать на целую точку больше.

Кстати, сразу вопрос: в других операторах, например, в if пользоваться диапазоном можно? Ну, например, есть ли аналог паскалевского?

if a in [1,3..7,10,12] then

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, блин, Вы уж хотите тип "множество" сюда засунуть :) Так напишите класс ручками.

А вообще, если интересуют расширения языка в GNU'сных компиляторах, то имеются полные списки для С и для С++ надо? Могу поискать.

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

Да мне бы пока с классическими С/С++ разобраться, а то пишу на некотором подмножестве конструкций, которые есть практически во всех языках.

Ну ладно, со множеством я, конечно, погорячился, а диапазон где-нибудь кроме case используется?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
a5021
Offline
Зарегистрирован: 07.07.2013

uni пишет:
На самом деле такое использование называется gnu extension, т.е. это расширение c++, используемое в avr-g++ компиляторе.

Похоже, что не только avr-gcc. GCC-ARM такое расширение принимает так же без вопросов.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Не все xxx-gcc компиляторы понимают расширения. Зависит от конкретной версии, т.е. когда вводилась поддержка того или иного расширения. Я, к примеру, пользуюсь 4.2.1 (специальный компилятор для работы с платой под uClinux), где не могу использовать присвоение структуре, как показывал выше. Потому что сборка устаревшая, а новой не собрано.

arduino328
Offline
Зарегистрирован: 01.09.2016

ЕвгенийП пишет:

А вообще, если интересуют расширения языка в GNU'сных компиляторах, то имеются полные списки для С и для С++ надо? Могу поискать.

Было бы интересно на расширения Си посмотреть.

А то скучно: ЕвгенийП давно обещанный 3-й этюд про память не публикует :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

arduino328 пишет:

Было бы интересно на расширения Си посмотреть.

https://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html#C-Extensions

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Нафиг нужны эти расширения. Конечно, если сидишь в своём склепе и никуда не выходишь, может и нормально, но, не дай Бог, если придется переносить.. Уж не на столько они хороши, что бы на них западать. Разумеется, ИМХО, кому надо, тот юзает, не отговариваю.

 

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Ага, некоторыми вы пользуетесь и даже не замечаете этого, как например объявление массива с изменяемым размером (variable length arrray). Недавно здесь товарищ просил помощи в работе с json и он там объявил буфер именно используя это gcc extension и кроме меня этого никто не заметил:

 char buf [JsonString.length()];

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

uni пишет:

некоторыми вы пользуетесь и даже не замечаете этого

kisoft пользуется таким объявлением массивов? Боюсь, Вы его с кем-то путаете :)

uni пишет:

кроме меня этого никто не заметил:

Да, ладно Вам, такие вещи невозможно не заметить - они глаз режут любому старому С'онисту.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Уверяю Вас, он заметил. 

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Ну хорошо, если так. Дополнительная ссылка: Extensions to the C++ Language

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

ЕвгенийП, спасибо, всё в точку. :) Я слишком стар, чтобы не замечать новомодных фишек :) Как можно не заметить на улице зеленого жирафа в шлеме? ;)

uni, если я буду постоянно нудить, что так неправильно (впрочем, ничего особенного в таком массиве нет), то у меня не хватит времени на удовольствия и меня закидают гнилыми помидорами любители гоп-стопа, а их стало очень немало, а смысл с ними спорить? Я не вижу. Да тут и без меня хватает кому заметить ;) Зачем людям портить кайф? :)

Массив с динамической длиной уже всплывал ранее в форуме. Кстати, тогда я о нем и узнал (о таком расширении), но пользоваться - упаси Бог, не было нужды. К тому же я слишком консервативен в привычках, хотя новое я тоже иногда приветствую.

А самое главное, что я до сих пор прусь от программирования, потому оно для меня не только работа, но и хобби тоже :)

 

Joiner
Offline
Зарегистрирован: 04.09.2014

Прочитал на сайте ардуина.ру/программирование про оператор Switch. Там написаны такие слова:

"Ключевое слово break является командой выхода из оператора case и обычно используется в конце каждого case. Без оператора break оператор switch будет продолжать вычислять  следующие выражения, пока не достигнет break или конец оператора switch.  "

Вроде бы и с break и без него должно нормально работать. Попробовал

[code]
int var=0;
void setup()
{
  Serial.begin(9600);
}

void loop() 
{
      Serial.print ("Var = ");
      Serial.println (var);
  switch (var) {
    case 1:
      Serial.println ("Sovpalo 1");
      break;
    case 2:
      Serial.println ("Sovpalo 2");
      break;
    case 3:
      Serial.println ("Sovpalo 3");
      break;
    default: 
    Serial.println ("Nichego ne sovpalo");      
  }
    Serial.println ("");
    delay(2000);
    var++;
    if (var==4) {var=0;}
}
[/code]

Все нормально работает.

Закомментировал все break , т.е убрал из скетча. Вроде бы судя по описанию должно нормально работать

 

[code]
int var=0;
void setup()
{
  Serial.begin(9600);
}

void loop() 
{
      Serial.print ("Var = ");
      Serial.println (var);
  switch (var) {
    case 1:
      Serial.println ("Sovpalo 1");
      //break;
    case 2:
      Serial.println ("Sovpalo 2");
      //break;
    case 3:
      Serial.println ("Sovpalo 3");
      //break;
    default: 
    Serial.println ("Nichego ne sovpalo");      
  }
    Serial.println ("");
    delay(2000);
    var++;
    if (var==4) {var=0;}
}
[/code]

но работает неправильно! Или я что-то не так понял?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015
while(описание не понято) {
  перечитать еще раз
}

 

arduino328
Offline
Зарегистрирован: 01.09.2016

Joiner пишет:

но работает неправильно! Или я что-то не так понял?

Надо внутри case фигурные скобки поставить.

Joiner
Offline
Зарегистрирован: 04.09.2014

arduino328 пишет:

Joiner пишет:

но работает неправильно! Или я что-то не так понял?

Надо внутри case фигурные скобки поставить.

Поставил скобки, пробовал 2 варианта. Работает неправильно. Скобки ни чего не меняют.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А неправильно - это как?

Если совпало с первым, так все "совпалы" печатаются? Так оно так и должно работать. перечитайте описание. Или как-то по-другому? 

Joiner
Offline
Зарегистрирован: 04.09.2014

ЕвгенийП пишет:

А неправильно - это как?

Если совпало с первым, так все "совпалы" печатаются? Так оно так и должно работать. перечитайте описание. Или как-то по-другому? 

Все равно не понимаю. Если что-то совпало, то печатаются все дальнейшие "совпалы". Но почему-то до совпадения ни чего не печатается. Почему после одного совпадения все начинает как бы совпадать? А ведь как написано в описании - "оператор switch будет продолжать вычисление....". Так почему он продолжает вычисления и у него вдруг все начинает совпадать (а на самом деле ни чего не совпадает)?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Он будет продолжать вычисления, но не проверки. Если сказать проще, то он выполняет проверки до первого true, а с этого места начинает выполнять все подряд операции без проверок либо до конца switch, либ до первого break, что вперёд случится.

Joiner
Offline
Зарегистрирован: 04.09.2014

ЕвгенийП пишет:

Он будет продолжать вычисления, но не проверки. Если сказать проще, то он выполняет проверки до первого true, а с этого места начинает выполнять все подряд операции без проверок либо до конца switch, либ до первого break, что вперёд случится.

Понятно....А я думал что "switch будет вычислять" означает что будет проверяться условие, а оказывается это означает, что дальше он будет выполнять все что дальше написано.

Спасибо. Понял что без break конструкция просто бессмысленная.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Joiner пишет:

без break конструкция просто бессмысленная.

Ну, я бы не стал так категорично. Всякие ситуации бывают. Например, в случае 1 что-то сделать, а в случае 2 сделать тоже самое, но предварительно подготовиться. Вот и ставишь case 2 выше, в ней размещаешь подготовку без break, а после неё ставишь case 1.  Просто специфику работы надо знать и пользоваться.

Joiner
Offline
Зарегистрирован: 04.09.2014

Ну да...надо просто знать как работает, и использовать это в своих целях :)

Теперь буду знать.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

У нас бывает достаточно часто такая конструкция (на больших компах), когда break специально убирается, чтобы упростить код. В таких случаях я не удаляю break, а комментарю строку и пишу, что break не нужен, чтобы потом не удивляться отсутствию break, поскольку отсутствие его воспринимается визуально как ошибка.

 

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

Joiner пишет:

Понятно....А я думал что "switch будет вычислять" означает что будет проверяться условие, а оказывается это означает, что дальше он будет выполнять все что дальше написано.

Не нужно путать, кто что вычисляет.

Представьте, у нас есть N веток, а нам нужно выполнить единственную K-ю, причем K > 1 и K < N.

Оператор switch вычисляет адрес, на который нам нужно перейти и передает управление на начало K-го блока. Собственно, на этом его функции заканчиваются - дальше идет обычный последовательный код, и если мы хотим, чтобы ветки с K+1 до N были пропущены, мы должны явно это указать. Собственно break как раз и осуществляет переход с той строки, на которой он находится, на строку следующую за концом оператора switch (т.е. за закрывающей скобкой).

Т.е. нам нужно пропустить два фрагмента кода: первый с 1-го по К-й, а второй с К+1-го по N-й. Первый фрагмент пропускается благодаря оператору switch, а второй - break.

rx9chy
Offline
Зарегистрирован: 12.02.2019

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

Задача: - бесконечно долгая работа case 1, до выбора другого case 2, но в тоже время остальному коду не мешал работать.

- в case будет задержка реле 2 мин вкл, 5 выкл (бесконечный цикл), а в другом case другие временные интервалы. так же не знаю на чем реализовать.

#define GREEN1 D1         //реле 1
#define RED1 D2         //реле 2
#define BLYNK_PRINT Serial        //Библиотека BLYNK
#include <ESP8266WiFi.h>          //Библиотека ESP
#include <BlynkSimpleEsp8266.h>   //Библиотека BLYNK

char auth[] = ""
char ssid[] = "";                            
char pass[] = "";                      

void setup() {
  Serial.begin(9600);
  Blynk.begin(auth, ssid, pass);
  pinMode(GREEN1, OUTPUT);
  pinMode(RED1, OUTPUT);
  }

  BLYNK_WRITE(V2){  
  switch(param.asInt()){
    case 1: //Item 1
      digitalWrite(GREEN1, HIGH);
      Serial.println("green_case1");
      break;
    case 2: //Item 2
      digitalWrite(RED1, HIGH);
      Serial.println("red_case2");
      break;
    }}
  
void loop(){
  Blynk.run();
  }

Управление циркуляционным насосом делаю с разными периодами работы.

Спасибо.

sadman41
Offline
Зарегистрирован: 19.10.2016

Бесконечно крутится только loop()

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

Ну так зачем вы свой switch запихнули внутрь процедуры блинк?
Заведите переменную номер режима для кейса и внутри блинк делайте только установку этой переменной, а весь код вынесите в основную программу

rx9chy
Offline
Зарегистрирован: 12.02.2019

Отличная идея. В программировании не селен, но сейчас испытаем. Спасибо!

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

rx9chy пишет:

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

Похоже цифровой автомат прошел мимо вашего понимания. Вот делайте так как в скетче меню показано

/**/
//---кнопки-----------------------------
typedef void (*pDo)();
class Cl_btn {
  protected:
    byte pin;
    bool state;
    unsigned long past;
    void set(bool s) { 
      state = s;
      past = millis();
      if (s == true) Do();
    }
  public:
    Cl_btn(byte p): pin(p) {}
    pDo Do = [] {};
    void init() {
      pinMode(pin, INPUT_PULLUP);
      set(false);
    }
    void run() {
      if (millis() - past >= 100)
        switch (state) {
          case false:
            if (!digitalRead(pin))set(true);
            break;
          case true:
            if (digitalRead(pin))set(false);
            if (millis() - past >= 300)set(false);
            break;
        }
    }
};
Cl_btn    BtnS(/*пин*/2);  //кнопка селект
Cl_btn    BtnU(/*пин*/3);  //кнопка верх
//--------------- меню---------------------------------------------
template <typename T> inline Print & operator << (Print &s, T n) {
  s.print(n);
  return s;
}
const byte page0 = 0;
const byte page1 = 10;
const byte page2 = 20;
const byte page3 = 30;
byte page;         //<--- вот про эту переменую состояния.
unsigned long past;
void goPage(byte p) { //<--- вот про эту переключающую функцию
  past = millis();
  page = p;
  switch (page) {
    case page0:
      Serial << "\npage0";
      BtnS.Do = [] {goPage(page1);};
      BtnU.Do = [] {};
      break;
    case page1:
      BtnS.Do = [] {goPage(page2);};
      BtnU.Do = [] {};
      Serial << "\npage1";
      break;
    case page2:
      BtnS.Do = [] {goPage(page3);};
      BtnU.Do = [] {};
      Serial << "\npage2";
      break;
    case page3:
      BtnS.Do = [] {goPage(page0);};
      BtnU.Do = [] {};
      Serial << "\npage3";
      break;
  }
}
void menu_init() {
  Serial.begin(9600);
  goPage(page0);
}
void menu_run() {}
void setup() {
  BtnS.init();
  BtnU.init();
  menu_init();
}

void loop() {
  BtnS.run();
  BtnU.run();
  menu_run();
}

 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

rx9chy пишет:

В программировании не селен ...

И даже не мышьяк.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну где-то так.

/**/
//---кнопки-----------------------------
typedef void (*pDo)();
class Cl_btn {
  protected:
    byte pin;
    bool state;
    unsigned long past;
    void set(bool s) {
      state = s;
      past = millis();
      if (s == true) Do();
    }
  public:
    Cl_btn(byte p): pin(p) {}
    pDo Do = [] {};
    void init() {
      pinMode(pin, INPUT_PULLUP);
      set(false);
    }
    void run() {
      if (millis() - past >= 100)
        switch (state) {
          case false:
            if (!digitalRead(pin))set(true);
            break;
          case true:
            if (digitalRead(pin))set(false);
            if (millis() - past >= 300)set(false);
            break;
        }
    }
};
Cl_btn    BtnS(/*пин*/2);  //кнопка селект
Cl_btn    BtnU(/*пин*/3);  //кнопка верх
//----------------------------------------------------------
class Cl_led {
  protected:
    static const byte led_OFF = 0;
    static const byte Blink_OFF = 1;
    static const byte Blink_ON = 2;
    byte pin;
    byte state;
    unsigned long past, time;
    void set(byte s) {
      state = s;
      past = millis();
      switch (state) {
        case led_OFF:
        case Blink_OFF:
          digitalWrite(pin, LOW);
          break;
        case Blink_ON:
          digitalWrite(pin, HIGH);
          break;
      }
    }
  public:
    Cl_led(byte p): pin(p) {}
    void init() {
      pinMode(pin, OUTPUT);
      set(led_OFF);
    }

    void OFF() {
      set(led_OFF);
    }
    void blink(unsigned long t) {
      if (t == 0) set(led_OFF);
      else {
        time = t;
        set(Blink_ON);
      }
    }
    void run() {
      switch (state) {
        case Blink_OFF:
          if (millis() - past >= time)set(Blink_ON);
          break;
        case Blink_ON:
          if (millis() - past >= time)set(Blink_OFF);
          break;
      }
    }
};
Cl_led led(/*пин*/13);
//--------------- меню---------------------------------------------
template <typename T> inline Print & operator << (Print &s, T n) {
  s.print(n);
  return s;
}
const byte page0 = 0;
const byte page1 = 10;
const byte page2 = 20;
const byte page3 = 30;
byte page;         //<--- вот про эту переменую состояния.
unsigned long past;
void goPage(byte p) { //<--- вот про эту переключающую функцию
  past = millis();
  page = p;
  switch (page) {
    case page0:
      BtnS.Do = [] {goPage(page1);};
      BtnU.Do = [] {led.OFF();};
      Serial << "\nno blink";
      break;
    case page1:
      BtnS.Do = [] {goPage(page2);};
      BtnU.Do = [] {led.blink(200);};
      Serial << "\nblink(200)";
      break;
    case page2:
      BtnS.Do = [] {goPage(page3);};
      BtnU.Do = [] {led.blink(500);};
      Serial << "\nblink(500)";
      break;
    case page3:
      BtnS.Do = [] {goPage(page0);};
      BtnU.Do = [] {led.blink(1000);};
      Serial << "\nblink(1000)";
      break;
  }
}
void menu_init() {
  Serial.begin(9600);
  goPage(page0);
}
void menu_run() {}
void setup() {
  BtnS.init();
  BtnU.init();
  led.init();
  menu_init();
}

void loop() {
  BtnS.run();
  BtnU.run();
  led.run();
  menu_run();
}

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Пух, ну хватит людей пугать, он Blink от Blynk пока не отличает, а ты его автоматами грузишь.

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

xDriver пишет:

Пух, ну хватит людей пугать, он Blink от Blynk пока не отличает, а ты его автоматами грузишь.

вот, вот, тут уже пару лет на форуме, а до автоматов ПУХа еще не добрался )))

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ua6em пишет:

xDriver пишет:

Пух, ну хватит людей пугать, он Blink от Blynk пока не отличает, а ты его автоматами грузишь.

вот, вот, тут уже пару лет на форуме, а до автоматов ПУХа еще не добрался )))

занимайся лучше катушкой :)))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

xDriver пишет:

Пух, ну хватит людей пугать, он Blink от Blynk пока не отличает, а ты его автоматами грузишь.

Во-во. Поэтому я помалкиваю о графической библиотеке моего имени. Тяжеловато будет народу.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

qwone пишет:

xDriver пишет:

Пух, ну хватит людей пугать, он Blink от Blynk пока не отличает, а ты его автоматами грузишь.

Во-во. Поэтому я помалкиваю о графической библиотеке моего имени. Тяжеловато будет народу.

вот это поворот !

я надеюсь это будет мега-графический-класс-на автоматах?

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

xDriver пишет:

ua6em пишет:

xDriver пишет:

Пух, ну хватит людей пугать, он Blink от Blynk пока не отличает, а ты его автоматами грузишь.

вот, вот, тут уже пару лет на форуме, а до автоматов ПУХа еще не добрался )))

занимайся лучше катушкой :)))

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

Еще раз внимательно посмотрел, а ведь красиво написано и, чего его вы тут гнобили, зависть?  )))