Цикл не даёт принять решение, а всё делает сам

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Добрый день. Такой вопрос:

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

Если нажмёт - выполняется сценарий Награды.

Если нет - проиграл.

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

void Hungry()
{
  display.drawImage (eat, 25 , 64, IMG_ROM);
  tone(sound, 500, 200);
  delay(200);
  tone(sound, 1000, 200);
  delay(400);
  uint32_t X;
  X = millis();
  do
  {
    digitalWrite(bluePinLED, HIGH);
    display.setFont(SmallFontRus);
    display.print("Хочу есть!!!", 20, OLED_L);
     if (digitalRead(bluePinLED)==HIGH)
    {
      Eat();  //Launch void win
      break;  // escape
    } else
    {
      Death();
    }
    
  } while (millis() - X <= 30000);
}

 

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

Мне бы такой цикл, чтобы сам за меня все делал.

На первую строку в своем цикле посмотрите.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Блин, иногда так вопросы задают, что хочется попросить поделиться куревом :-)

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

sadman41 пишет:

Мне бы такой цикл, чтобы сам за меня все делал.

На первую строку в своем цикле посмотрите.


Я тоже люблю шутки,но особенно тогда,когда я их понимаю.

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

kasper007
Offline
Зарегистрирован: 23.05.2016

Более конкретно: посмотри на строчку 12 и задайся вопросом для чего она и на как она влияет на строку 15

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

the_matrix пишет:
Я тоже люблю шутки,но особенно тогда,когда я их понимаю. Не очень понял,на что надо обратить внимание. Подскажите, пожалуйста, более конкретно.

блин, мужик, ты в 12 строке сам принудительно выставляешь пин в HIGH. а в 15 строке его читаешь. И что ты думаешь там будет?????

 

И еще - если процесс должен ждать 3 секунды. то почему в последней строке интервал 30000 ?

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

kasper007 пишет:
Более конкретно: посмотри на строчку 12 и задайся вопросом для чего она и на как она влияет на строку 15

О, спасибо! Слепой совсем. Имена переменных отличаются только приставкой LED, всё уже сливается.
Про 30000 - тоже 0 лишний,увидел уже. Спасибо.

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

Вот так всегда - поможет человек, а благодарят бога.

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

sadman41 пишет:

Вот так всегда - поможет человек, а благодарят бога.


Я потому и отредактировал! Сам я атеист,но от языковых клише не уберег себя. :-)

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018
void Hungry()
{
  display.drawImage (eat, 25 , 64, IMG_ROM);
  display.update();
  tone(sound, 500, 200);
  delay(200);
  tone(sound, 1000, 200);
  delay(400);
  uint32_t X;
  X = millis();
  do
  {
    digitalWrite(bluePinLED, HIGH);
    display.setFont(SmallFontRus);
    display.print("Хочу есть!!!", 20, OLED_L);
    display.update();
    delay(500);
    if (digitalRead(bluePin)==HIGH) // if button pushed
    {
      Eat();  //Launch void win
      break;  // escape
    } else
    {
      Death();  //Launch void flub
    }
    
  } while (millis() - X <= 3000);
}

Внёс изменения, но он теперь срабатывает не тогда,когда в этом промежутке кнопку нажали, а если в момент,когда надпись на экране - кнопка была зажата.

Что надо убрать/добавить?

Заранее спасибо.

ven-til
Offline
Зарегистрирован: 13.02.2018

Так смерть вызывается внутри do если кнопка не нажата.

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

ven-til пишет:

Так смерть вызывается внутри do если кнопка не нажата.


Так если кнопку не нажали,то смерть и должна наступить.

ven-til
Offline
Зарегистрирован: 13.02.2018

the_matrix пишет:

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

Ну да? А 3 секунды подождать, не?

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Это уже какая-то полемика.
Условие ясно - в течение 3 секунд нажать или не нажать кнопку.
Если нажал - получил награду, ждём следующего раза вызова цикла.
Если не нажал - умер.
Вопрос в том,что сейчас, при данных настройках, кнопка должна быть зажата все это время,как начался цикл и до момента проверки,а это несколько не то,что нужно.

ven-til
Offline
Зарегистрирован: 13.02.2018

the_matrix пишет:
Это уже какая-то полемика. Условие ясно - в течение 3 секунд нажать или не нажать кнопку. Если нажал - получил награду, ждём следующего раза вызова цикла. Если не нажал - умер. Вопрос в том,что сейчас, при данных настройках, кнопка должна быть зажата все это время,как начался цикл и до момента проверки,а это несколько не то,что нужно.

Да, и я написал - смерть вызывается внутри цикла do, то есть в течении 3 секунд пока работает цикл и кнопка не нажата у вас срабатывает смерть. А на самом деле смерть должна срабатывать не внутри цикла, а после, при условии, что кнопка не была нажата.

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018
boolean buttonblueWasUp = true;

void Hungry()
{
  display.drawImage (eat, 25 , 64, IMG_ROM);
  display.update();
  tone(sound, 500, 200);
  delay(200);
  tone(sound, 1000, 200);
  delay(400);
  uint32_t X;
  X = millis();
  do
  {
    digitalWrite(bluePinLED, HIGH);
    display.setFont(SmallFontRus);
    display.print("Хочу есть!!!", 20, OLED_L);
    display.update();
    delay(500);
    boolean buttonblueIsUp = digitalRead(bluePin);
    if (buttonblueWasUp && !buttonblueIsUp)
                    {
                      delay(10);
                      buttonblueIsUp = digitalRead(bluePin); 
                      if (!buttonblueIsUp)
                      {
                        Eat();
                        break;
                      } else
                      {
                        Death();
                      }
                     }                  
  }while (millis() - X <= 3000);
}

Вот добавил проверку нажатия, но теперь,как в самом начале, условие автоматом прогоняется как ВЫПОЛНЕННОЕ.

ven-til
Offline
Зарегистрирован: 13.02.2018

Это треш какой-то.

1. Надо в прошлом варианте убрать смерть из цикла do

2. После цикла do проверять была ли нажата кнопка и если нет то Death();

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

ven-til пишет:

Это треш какой-то.

1. Надо в прошлом варианте убрать смерть из цикла do

2. После цикла do проверять была ли нажата кнопка и если нет то Death();

Да,я прочитал ваше сообщение уже после того,как моё отправилось. Щас буду переделывать. Спасибо.

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

а, нафиг цикл вообще? О_О

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018

Клапауций 555 пишет:

а, нафиг цикл вообще? О_О

Смысл такой:

На дисплее человек.

Есть кнопка.

В какой-то момент(рандомно) на экран подается картинка,что человек хочет есть.

У нас есть 3 секунды,чтобы принять решение - накормить или нет.

Результат - или продолжаем дальше или смерть.

Кроме как циклом я не придумал, в каком виде это реализовать.

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018
void Hungry()
{
  display.drawImage (eat, 25 , 64, IMG_ROM);
  display.update();
  tone(sound, 500, 200);
  delay(200);
  tone(sound, 1000, 200);
  delay(400);
  uint32_t X;
  X = millis();
  boolean buttonblueIsUp = digitalRead(bluePin);
  do
  {
    digitalWrite(bluePinLED, HIGH);
    display.setFont(SmallFontRus);
    display.print("Хочу есть!!!", 20, OLED_L);
    display.update();
    if (digitalRead(bluePin)==HIGH)
    {
      Eat();
      break;
    }
  }while (millis() - X <= 3000);
  if (buttonblueWasUp && !buttonblueIsUp)
  {
   delay(10);
   buttonblueIsUp = digitalRead(bluePin); 
   if (buttonblueIsUp != HIGH)
   {
    Death();
   }
  }              
}

Так, про отработку кнопки за 3 секунды - заработало. Теперь не работает Смерть ))

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

the_matrix пишет:

На дисплее человек.

Есть кнопка.

В какой-то момент(рандомно) на экран подается картинка,что человек хочет есть.

У нас есть 3 секунды,чтобы принять решение - накормить или нет.

Результат - или продолжаем дальше или смерть.

if (есть_3_секунды == 1) можно_кормить = 1; else можно_кормить = 0;

 

the_matrix
the_matrix аватар
Offline
Зарегистрирован: 06.03.2018
void Hungry()
{
  display.drawImage (eat, 25 , 64, IMG_ROM);
  display.update();
  tone(sound, 500, 200);
  delay(200);
  tone(sound, 1000, 200);
  delay(400);
  uint32_t X;
  X = millis();
  boolean buttonblueIsUp = digitalRead(bluePin);
  do
  {
    digitalWrite(bluePinLED, HIGH);
    display.setFont(SmallFontRus);
    display.print("Хочу есть!!!", 20, OLED_L);
    display.update();
    if (digitalRead(bluePin) == HIGH)
    {
      buttonblueIsUp = true;
      Eat();
      break;
    }
  } while (millis() - X <= 3000);
    if (!buttonblueIsUp)
  {
      Death();
  }
}

Вот в таком варианте всё заработало!

upd. Код почистил.

ven-til
Offline
Зарегистрирован: 13.02.2018

buttonblueWasUp можно убрать

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

sadman41 пишет:

Вот так всегда - поможет человек, а благодарят бога.

Это как раз нормально. Он жеж не сволими руками помогает, а исключительно людскими, тутошними. Вот кто надоумил автора зайти в тему? То-то! :)

-"Господи! Я такой праведный, я всегда соблюдаю все обеты и моления, но я так беден, что иногда мне даже нечего поесть, а ты так ни разу мне и не помог. Что я делаю не так?"

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

Как-то так, не помню ужо. :)