Прошу помощи.

Сергей С.В.
Offline
Зарегистрирован: 02.01.2016

Здравствуйте. Помогите начинающему программисту.

Есть вот такой кусок кода

void loop()
{

/* Переход меню №2 */   
   if(digitalRead(vvod) == HIGH && drebezg_vvod == 0)
   {
     millis_vvod = millis();
     drebezg_vvod = 1;
   }
   if(digitalRead(vvod) == HIGH && millis() - millis_vvod >= 10 && button_vvod == 0)
   {
     button_vvod = 1;
     millis_vvod = 0;
   }
   if(digitalRead(vvod) == HIGH && button_vvod == 1 && stop_vvod == 0)
   {
     vremya_vvod = millis();
     stop_vvod = 1;
   }
   if(digitalRead(vvod) == HIGH && millis() - vremya_vvod >= 5000 && stop_vvod == 1)
   {
     drebezg_vvod = 0;
     button_vvod = 0;
     stop_vvod = 0;
     menu_2();
   }
   /* Конец переход в меню №2 */


/* Обнуление переменных кнопки "НАЗАД" */
   if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 1 && button_kn_nazad == 1)
  {
    millis_kn_nazad = millis();
    drebezg_kn_nazad = 0;
  }
  if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 0 && button_kn_nazad == 1 &&millis() - millis_kn_nazad >= 10)
  {
    millis_kn_nazad = 0;
    button_kn_nazad = 0;
  }
   /* Конец обнуления переменных кнопки "НАЗАД" */

}

void menu_2()
{
  menu_2:

 /* Переход в меню "КАЛИБРОВКИ" */
  if(digitalRead(vvod) == HIGH && lcd_blink == 4 && drebezg_vvod == 0)
  {
    millis_vvod = millis();
    drebezg_vvod = 1;
  }
  if(digitalRead(vvod) == HIGH && lcd_blink == 4 && drebezg_vvod == 1 && millis() - millis_vvod >= 10)
  {
    drebezg_vvod = 0;
    millis_vvod = 0;
    lcd_ = 0;
    kalibrovki();
  }
  /* Конец перехода в меню "КАЛИБРОВКИ" */

/* Переход в "МЕНЮ №1" */
  if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 0 && button_kn_nazad == 0)
  {
    millis_kn_nazad = millis();
    drebezg_kn_nazad = 1;
  }
  if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 1 && button_kn_nazad == 0 && millis() - millis_kn_nazad >= 10)
  {
    millis_kn_nazad = 0;
    button_kn_nazad = 1;
  }
  if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 1 && button_kn_nazad == 1)
  {
    lcd_ = 0;
    return;
  }
  if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 1 && button_kn_nazad == 1)
  {
    millis_kn_nazad = millis();
    drebezg_kn_nazad = 0;
  }
  if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 0 && button_kn_nazad == 1 &&millis() - millis_kn_nazad >= 10)
  {
    millis_kn_nazad = 0;
    button_kn_nazad = 0;
  }
  /* Конец перехода в "МЕНЮ №1" */

goto menu_2;
}
/* Конец Меню №2 */


void kalibrovki()
{
  kalibrovki:

/* Переход в "МЕНЮ №2" */
  if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 0 && button_kn_nazad == 0)
  {
    millis_kn_nazad = millis();
    drebezg_kn_nazad = 1;
  }
  if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 1 && button_kn_nazad == 0 && millis() - millis_kn_nazad >= 10)
  {
    millis_kn_nazad = 0;
    button_kn_nazad = 1;
  }
  if(digitalRead(kn_nazad) == HIGH && drebezg_kn_nazad == 1 && button_kn_nazad == 1)
  {
    lcd_ = 0;
    return menu_2();
  }
  if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 1 && button_kn_nazad == 1)
  {
    millis_kn_nazad = millis();
    drebezg_kn_nazad = 0;
  }
  if(digitalRead(kn_nazad) == LOW && drebezg_kn_nazad == 0 && button_kn_nazad == 1 &&millis() - millis_kn_nazad >= 50)
  {
    millis_kn_nazad = 0;
    button_kn_nazad = 0;
  }
  /* Конец перехода в "МЕНЮ №2" */
  goto kalibrovki;
}

Проблемы у меня возникли с возвратом из МЕНЮ КАЛИБРОВКИ (void kalibrovki() ) в МЕНЮ №2 (menu_2). Меня выкидывает в начало программы ( void loop() ), и что мне делать я незнаю.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Сергей С.В. пишет:

Меня выкидывает в начало программы ( void loop() ), и что мне делать я незнаю.

ничего не делать - так и должно быть.

Сергей С.В.
Offline
Зарегистрирован: 02.01.2016

Да... Но как-бы хочется возвращаться в предедущее меню а не вначало. Ведь для того чтоб перейти из меню №1 в меню №2 мне приходится держать кнопку ВВОД 5 сек.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Сергей С.В. пишет:

Ведь для того чтоб перейти из меню №1 в меню №2 мне приходится держать кнопку ВВОД 5 сек.

а, кто обещал, что будет легко? - держи кнопку.

Сергей С.В.
Offline
Зарегистрирован: 02.01.2016

Клапауций 112, я знаю что Вы на этом форуме ДИНОЗАВР. Неужели нет решения моей проблемы?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Сергей С.В. пишет:

Клапауций 112, я знаю что Вы на этом форуме ДИНОЗАВР. Неужели нет решения моей проблемы?

нет - ты обречён попадать в главный цикл всегда.

Сергей С.В.
Offline
Зарегистрирован: 02.01.2016

Пипец. Жаль.

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

А почему не сделать так. И вроде и главный цикл не покидаешь, и туда куда надо заходишь, а куда не надо не появляешься :))

enum Menu_t {UNO = 1, DUE, TRE, QUATTRO};
Menu_t Men_stat = UNO;
void Menu1() {
  Serial.println();
  Serial.print("UNO");
}
void Menu2() {
  Serial.println();
  Serial.print("DUE");
}
void Menu3() {
  Serial.println();
  Serial.print("TRE");
}
void Menu4() {
  Serial.println();
  Serial.print("QUATTRO");
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  delay (1000);
  if (Men_stat == UNO) {
    Menu1();
  }
  if (Men_stat == DUE) {
    Menu2();
  }
  if (Men_stat == TRE) {
    Menu3();
  }
  if (Men_stat == QUATTRO) {
    Menu4();
  }
}

 

Сергей С.В.
Offline
Зарегистрирован: 02.01.2016

qwone пишет:

А почему не сделать так. И вроде и главный цикл не покидаешь, и туда куда надо заходишь, а куда не надо не появляешься :))

enum Menu_t {UNO = 1, DUE, TRE, QUATTRO};
Menu_t Men_stat = UNO;
void Menu1() {
  Serial.println();
  Serial.print("UNO");
}
void Menu2() {
  Serial.println();
  Serial.print("DUE");
}
void Menu3() {
  Serial.println();
  Serial.print("TRE");
}
void Menu4() {
  Serial.println();
  Serial.print("QUATTRO");
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  delay (1000);
  if (Men_stat == UNO) {
    Menu1();
  }
  if (Men_stat == DUE) {
    Menu2();
  }
  if (Men_stat == TRE) {
    Menu3();
  }
  if (Men_stat == QUATTRO) {
    Menu4();
  }
}

 

 

Попробую поколдую. Но как я заметил у меня обнуляются переменные, которые должны обнуляться при отпускании кнопки НАЗАД. Получается я попадаю сначала в меню№2, а затем в меню№1.

Сергей С.В.
Offline
Зарегистрирован: 02.01.2016

qwone пишет:

А почему не сделать так. И вроде и главный цикл не покидаешь, и туда куда надо заходишь, а куда не надо не появляешься :))

enum Menu_t {UNO = 1, DUE, TRE, QUATTRO};
Menu_t Men_stat = UNO;
void Menu1() {
  Serial.println();
  Serial.print("UNO");
}
void Menu2() {
  Serial.println();
  Serial.print("DUE");
}
void Menu3() {
  Serial.println();
  Serial.print("TRE");
}
void Menu4() {
  Serial.println();
  Serial.print("QUATTRO");
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  delay (1000);
  if (Men_stat == UNO) {
    Menu1();
  }
  if (Men_stat == DUE) {
    Menu2();
  }
  if (Men_stat == TRE) {
    Menu3();
  }
  if (Men_stat == QUATTRO) {
    Menu4();
  }
}

 

Всё равно выкидывает в начало кода. Хоть бери и ставь для каждого меню свою кнопку.

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

Сергей С.В. пишет:

Неужели нет решения моей проблемы?

Есть. Изучить язык на котором Вы пытаетеьс писать.

Например, в строке 45 у Вас написано "void menu_2()", а в строке 115 написано "return menu_2();". Вы понимаете что это означает? Если понимаете, что, что по-Вашему? А если не понимаете, то нафига писали?

Вы вваливаетесь в бесконечный рекурсию и рано или поздно всё кончается плохо.

И выбрасывает Вас вовсе в начало loop, Вас выбрасывает в setup (вернее, в перезагрузку). Поставьте там какую-нибудь печать в Сериал и убедитесь.

Сергей С.В.
Offline
Зарегистрирован: 02.01.2016

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

Сергей С.В. пишет:

Неужели нет решения моей проблемы?

Есть. Изучить язык на котором Вы пытаетеьс писать.

Например, в строке 45 у Вас написано "void menu_2()", а в строке 115 написано "return menu_2();". Вы понимаете что это означает? Если понимаете, что, что по-Вашему? А если не понимаете, то нафига писали?

Вы вваливаетесь в бесконечный рекурсию и рано или поздно всё кончается плохо.

И выбрасывает Вас вовсе в начало loop, Вас выбрасывает в setup (вернее, в перезагрузку). Поставьте там какую-нибудь печать в Сериал и убедитесь.

 

Я в самом начале писал. 

Сергей С.В. пишет:
Здравствуйте. Помогите начинающему программисту.
А Вывместо того чтоб помочь, занимаетесь нравоучением.

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

Сергей С.В. пишет:
А Вывместо того чтоб помочь, занимаетесь нравоучением.

Ни фига себе!

Я Вам сказал в какой строке у Вас ошибка (прямо номер назвал) и в чём она состоит, сказал к чему это приводит ("программа вваливается в бесконечную рекурсию"), посоветовал почитать про язык и Вы считаете. что я Вам не помогаю?

Стесняюсь спросить, а какой именно помощи Вы тогда ждёте, если указание на строку с ошибкой для Вас не помощь? Чего Вы ждёте? Как Вам можно помочь?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

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

Как Вам можно помочь?

его можно сбросить в пропасть с голодными тиграми. ¯\_(ツ)_/¯

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

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

Я Вам сказал в какой строке у Вас ошибка (прямо номер назвал) и в чём она состоит, сказал к чему это приводит ("программа вваливается в бесконечную рекурсию"), посоветовал почитать про язык

И чо? Благодарности ждал? А хто будет минет делать готовый код писать?

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

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

В военных училищах, которые лейтенантиков выпускают, и тех - сразу в войска, есть поговорка: "Куда солдата ни целуй - у него везде жопа!". О том, что якобы"доброе" отношение к солдатне - никогда не будет оценено адекватно.

Вот и с новичками тоже самое....

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

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

Тут у меня действительно недоработка.

Ну, хорошо, хоть признал, а то некоторые как упрутся рогом.

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

Какое доброе отношение к новичкам. Вы что забыли "методику". Новичка сначало надо утопить. А вот те кто всплывут с тем и работать. Программирование и схемотехника это нервные дисциплины. И те кто не выдерживают наброс говен, с этой отрасли не смогут работать , даже если это хобби.

Сергей С.В.
Offline
Зарегистрирован: 02.01.2016

Уважаемый ЕвгенийП, я конечно извиняюсь за свои слова и благодарен вам за то что Вы указали на мои ошибки, но дело в том что у меня, тупо, нет времени читать о языке и ждал что мне не только укажут на мои ошибки и объяснят почему неправельно, а и покажут как правильно ну и повозможности объяснят что при этом происходит. Ну или указали где можно почи тать о языке.

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

Почитать о языке, пожалуйста:

1. Совсем для чайников

2. Для нормального освоения - 1

3. Для нормального освоения - 2

Сергей С.В. пишет:
а и покажут как правильно ну и повозможности объяснят что при этом происходит

Т.е. сделают за Вас и объяснят почему сделано так, а не иначе. Нет проблем, но только Вы братились не в томт раздел форума. Делают правильно и объясняют в другом разделе. Запостите свой запрос там и сразу укажите, что нужно сделать и подробно объяснить. Вам предложат вполне бюджетную цену и сделают. Здесь, в этом разделе, показывают ошибки, объясняют смысл ошибок, но за человека не пишут - здесь помогают тому, кто пишет сам и у кого есть время учиться свмому. У Вас ведь такого времени нет, как я понял

Сергей С.В. пишет:
у меня, тупо, нет времени читать о языке

Собственно, понятно, что у Вас нет времени решить СВОЮ проблему. Непонятно только почему Вы считаете, что у кого-то другого есть время решать ВАШУ проблему.

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

 

Сергей С.В.
Offline
Зарегистрирован: 02.01.2016

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

Почитать о языке, пожалуйста:

1. Совсем для чайников

2. Для нормального освоения - 1

3. Для нормального освоения - 2

 

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