Виснет цикл while

bmvbmv071
Offline
Зарегистрирован: 18.10.2019

Всем привет!

Беда, не могу справиться. Виснет цикл. Хотел, что бы цикл работал, пока переменная Р1==1. При этом, Р1 меняет свое значение от состояния 13 пина. Изменение состояния 13 пина имитирую кнопкой (это временно, потом он будет меняться от работы датчика). Пока Р1==0, система работает, как только нажимаю кнопку и Р1==1, то начинает работать цикл while и система больше на кнопку не реагирует. При этом, если вместо Р1 в условиях циклов прописывать (digitalRead(6)==LOW), то система работает без замечаний. А надо, что бы работало от из изменения переменной Р1.

int a,b;//переменные для работы счетчика времени
int over1;//переменные для перевода секунд в минуты и часы
int t1cycle;//время работы в цикле в секундах
float h1,m1,s1;//переменные для хранения времени работы в цикле


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

 pinMode(6, INPUT);
 digitalWrite(6, HIGH);
 
 pinMode(13, OUTPUT);
 digitalWrite(13, LOW);
 }

void loop()
{
 if(digitalRead(6) == LOW)
   {digitalWrite(13, HIGH);
   }
 if(digitalRead(6) == HIGH)
  {digitalWrite(13,LOW);
  }
 volatile bool P1 = digitalRead(13);
 
  if (P1 == 1)
  { 
   a = millis()/1000;
     while (P1 == 1)
     {
      b = millis()/1000;
      t1cycle = (b - a);
      h1 = int(t1cycle/3600);
      over1 = t1cycle%3600;
      m1 = int(over1/60);
      over1 = over1%60;
      s1 = int(over1);
      
      Serial.print(s1);
     } 
   }
  
   if (P1==0)
   {
    Serial.println("m");
   }
}   
    

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Чтобы не вис, нужно чтобы условие в теле цикла менялось...

bmvbmv071
Offline
Зарегистрирован: 18.10.2019

Вот так?

Всё равно не работает.

int a,b;//переменные для работы счетчика времени
int over1;//переменные для перевода секунд в минуты и часы
int t1cycle;//время работы в цикле в секундах
float h1,m1,s1;//переменные для хранения времени работы в цикле
volatile bool P1 =0;

  void setup()
{
 Serial.begin(9600);
 pinMode(6, INPUT);
 digitalWrite(6, HIGH);
 pinMode(13, OUTPUT);
 digitalWrite(13, LOW);
 }

void loop()
{
	 if(digitalRead(6) == LOW)
   {digitalWrite(13, HIGH);
   }
 if(digitalRead(6) == HIGH)
  {digitalWrite(13,LOW);
  }
 P1=digitalRead(13);
 
if (digitalRead(13)==HIGH)
  {
   a = millis()/1000;
  
     while (P1 == 1)
    { 
     if (digitalRead(13)==LOW)
     {P1==0;}
     b = millis()/1000;
     t1cycle = (b - a);
     h1 = int(t1cycle/3600);
     over1 = t1cycle%3600;
     m1 = int(over1/60);
     over1 = over1%60;
     s1 = int(over1);
    
     Serial.print(s1);
    
     }
   }

	   if (digitalRead(13)==LOW)
  {
    Serial.println("m");
 }
}   

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Что за странные манипуляции с пином #13? Для того, чтобы digitalRead() работал, какой pinMode() должен быть?

bmvbmv071
Offline
Зарегистрирован: 18.10.2019

По замыслу, выход 13 будет менять значение от разных условий. Что бы не прописывать в каждом условии команды (а то запутаюсь) на запуск цикла While, то мне проще снимать значение с выхода 13. Причем попробовал снять данные командой digitalRead - работает, переменная Р1 меняла свое значение.

__Alexander
Offline
Зарегистрирован: 24.10.2012

Присвоение один символ =

sadman41
Онлайн
Зарегистрирован: 19.10.2016

bmvbmv071 пишет:

Что бы не прописывать в каждом условии команды (а то запутаюсь) на запуск цикла While, 

Вы уже это сделали. При каких обстоятельствах в стр. #32 выполнится условие в if()?

bmvbmv071
Offline
Зарегистрирован: 18.10.2019

Вот. Упростил. Кнопка - это временная мера, она имитирует команду на запуск и на остановку (нажал - старт, отпустил - стоп), в последствии её не будет, будет flag. При нажатии на кнопку - цикл while запускается, считает и выводит значения в порт, но больше ни на что не реагирует. А нужно, что бы при отпускании кнопки - счетчик остановился.

int a,b;//переменные для работы счетчика времени
int over1;//переменные для перевода секунд в минуты и часы
int t1cycle;//время работы в цикле в секундах
float h1,m1,s1;//переменные для хранения времени работы в цикле
volatile int flag =0;

  void setup()
{
 Serial.begin(9600);
 pinMode(6, INPUT);
 digitalWrite(6, HIGH);
 }

void loop()
{
 if(digitalRead(6) == LOW)
   {flag=1;
   }
 else
   {
   flag=0;
   }
 
 
if (flag==1)
  {
   a = millis()/1000;
  
     while (flag==1)
    { 
     b = millis()/1000;
     t1cycle = (b - a);
     h1 = int(t1cycle/3600);
     over1 = t1cycle%3600;
     m1 = int(over1/60);
     over1 = over1%60;
     s1 = int(over1);
    
     Serial.print(s1);
     }
   }

	  else
  {
    Serial.println("end");
 }
}   

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Вставь опрос своей кнопли и изменение флага ВНУТРЬ while

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

Дед,

он уже пробовал в строке №33 в #2, а сообщение #5 пропустил. Так что теперь ... "так пробовал - не работает" :)

Не могу топик найти, но пару-тройку лет назад было тут ...

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

Никогда не забуду :-)))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ну лана, пусь человек постигает infinite loop, а у меня с котом - пятница. 

bmvbmv071
Offline
Зарегистрирован: 18.10.2019

Всем спасибо, кто помогал. Буду ковырять дальше.