Время работы по включению и выключению

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

ard-20 пишет:

Судя по всему через пару дней читать уже не надо будет . 

Я так и понял сразу, очередной курсовик, deadline через 2 дня.  На што ты надеялся? 

ard-20
Offline
Зарегистрирован: 05.10.2020

Удалите пожалуйста. А с курсовиком не угадали тут дело повеселее будет.

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

ard-20 пишет:

Удалите пожалуйста. 

500р. :) 

ard-20
Offline
Зарегистрирован: 05.10.2020

С деньгами полный ноль и судя по всему не предвидится. 

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

бесплатно тока через час удалю. 

ard-20
Offline
Зарегистрирован: 05.10.2020

###

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Чё та ржу.
500р за "удалить тему" :-)
Что то новенькое.

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

Kakmyc пишет:
Чё та ржу. 500р за "удалить тему" :-) Что то новенькое.

Шёл  2020-й. Мы выживали, как могли! ;)))

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

ard-20 пишет:

С деньгами полный ноль и судя по всему не предвидится. 

Я тебе один вещ скажу: "Не в дэнгах счастье!". ;)))

Гриша
Offline
Зарегистрирован: 27.04.2014

wdrakula пишет:

ard-20 пишет:

С деньгами полный ноль и судя по всему не предвидится. 

Я тебе один вещ скажу: "Не в дэнгах счастье!". ;)))

вот-вот...  в их количестве!"  :)))))))))))))))))))))) 

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

ard-20
Offline
Зарегистрирован: 05.10.2020

###

ard-20
Offline
Зарегистрирован: 05.10.2020

мне бы с как-то начать. Завис на флаге что выводит постоянно в порт.


unsigned long Afaz_OK = 0; // Переменная для хранения времени
unsigned long Afaz_NO = 0; // Переменная для хранения времени
unsigned long Atime_faz_OK = 0; // Переменная для хранения времени
unsigned long Atime_faz_NO = 0; // Переменная для хранения времени

unsigned long Bfaz_OK = 0; // Переменная для хранения времени
unsigned long Bfaz_NO = 0; // Переменная для хранения времени
unsigned long Btime_faz_OK = 0; // Переменная для хранения времени
unsigned long Btime_faz_NO = 0; // Переменная для хранения времени

unsigned long Cfaz_OK = 0; // Переменная для хранения времени
unsigned long Cfaz_NO = 0; // Переменная для хранения времени
unsigned long Ctime_faz_OK = 0; // Переменная для хранения времени
unsigned long Ctime_faz_NO = 0; // Переменная для хранения времени

int a,b;
void setup() {
  pinMode(5, INPUT); // Настраиваем вывод на вход
  pinMode(6,INPUT);
  pinMode(7,INPUT);
  Serial.begin(9600);
 
}

void loop() {
 
   unsigned long Global_tik = millis();
 

  if ( digitalRead (5) == LOW) { 
    Atime_faz_NO = Global_tik - Afaz_NO; 
     delay(5);    
  }
 else 
 {
    Afaz_NO = Global_tik;  
    a=1;
 }  

 
 


  if ( a==1 ) {
    Serial.print("A");
    Serial.println(  Atime_faz_NO / 1000); 
  //  Serial.println(time_faz_OK / 1000);
    a=0;  
 }

 }

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Это что, так сложно ?
if(пора выводить)поднимаем флаг

if(флаг поднят){выводим, опускаем флаг}

ard-20
Offline
Зарегистрирован: 05.10.2020

###

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

что-то вы окончательно все запутали. Где в этом коде условие, что фазы нет более 5 секунд?

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

Kakmyc пишет:
Это что, так сложно ? if(пора выводить)поднимаем флаг if(флаг поднят){выводим, опускаем флаг}

не совсем так.

Правильно:

if(пора выводить) и (флаг опущен) {выводим, поднимаем флаг}

if(флаг поднят)и(появилась фаза) {опускаем флаг}

Отличия мелкие, но значимые - имхо, именно их ТС и не понимает

 

ard-20
Offline
Зарегистрирован: 05.10.2020

 У меня a=0 если фаза не LOW по идее он и не выводит (в порт ничего не выходит) а вот если a=1 он постоянно выводит

 else 
 {
    Afaz_NO = Global_tik;  
    a=1; 
 }  
 
  if ( Atime_faz_NO > 5000 && a==1 ) {
    Serial.print("A");
    Serial.println(  Atime_faz_NO / 1000); 
  //  Serial.println(time_faz_OK / 1000);
    a=0;  
 }
 
A7
A7
A7
A7
A7
A7
A7
A7
A7
A7
A7
A7
 это задержка 7 сек с нано
b707
Offline
Зарегистрирован: 26.05.2017

ard-20 - всегда выкладывайте полный код. Тем более что у вас он просто крохотный, что его сокращать-то?

Кроме того, длинный код можно убирать под спойлер.

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

 

 

ard-20
Offline
Зарегистрирован: 05.10.2020

ОК


unsigned long Afaz_OK = 0; // Переменная для хранения времени
unsigned long Afaz_NO = 0; // Переменная для хранения времени
unsigned long Atime_faz_OK = 0; // Переменная для хранения времени
unsigned long Atime_faz_NO = 0; // Переменная для хранения времени

unsigned long Bfaz_OK = 0; // Переменная для хранения времени
unsigned long Bfaz_NO = 0; // Переменная для хранения времени
unsigned long Btime_faz_OK = 0; // Переменная для хранения времени
unsigned long Btime_faz_NO = 0; // Переменная для хранения времени

unsigned long Cfaz_OK = 0; // Переменная для хранения времени
unsigned long Cfaz_NO = 0; // Переменная для хранения времени
unsigned long Ctime_faz_OK = 0; // Переменная для хранения времени
unsigned long Ctime_faz_NO = 0; // Переменная для хранения времени

int a,b;
void setup() {
  pinMode(5, INPUT); // Настраиваем вывод на вход
  pinMode(6,INPUT);
  pinMode(7,INPUT);
  Serial.begin(9600);
 
}

void loop() {
 
   unsigned long Global_tik = millis();

  if ( digitalRead (5) == LOW) { 
    Atime_faz_NO = Global_tik - Afaz_NO; 
    
  }
 else 
 {
    Afaz_NO = Global_tik;  
    a=1; 
 }  
 
  if ( Atime_faz_NO > 5000 && a==1 ) {
    Serial.print("A");
    Serial.println(  Atime_faz_NO / 1000); 
  //  Serial.println(time_faz_OK / 1000);
    a=0;  
 }

 }

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Бред какой то.
Подход к задаче абсолютно неверный.

Следует сделать так:

if(фаза есть)сбрасываем таймер;
if(таймер досчитал до 5сек)ЗНАЧИТ ФАЗЫ НЕТ, что то делаем

Да и смысл ждать 5секунд ?
Максимум два периода.

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

ard-20, логику этого кода можете мне обьяснить? я в этом коде логики не наблюдаю вообще...

строка 29 - если фаза пропала - вычитаем из текущего времени Afaz_NO ? - зачем?

строка 33 - else по отношению к строке 29 - то есть строчка срабатывает, если фаза есть - взводим флаг a =1 и запоминаем время. Если фаза появилась - зачем ставить флаг?

Ну и в итоге условие строки 39 - срабатывает через 5 сек после ПОЯВЛЕНИЯ фазы, а не после исчезновения...

 

А может я все перепутал? - обьясните

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

Kakmyc пишет:
if(фаза есть)сбрасываем таймер;if(таймер досчитал до 5сек)ЗНАЧИТ ФАЗЫ НЕТ, что то делаем .

дополню вторую строку

;if(таймер досчитал до 5сек)ЗНАЧИТ ФАЗЫ НЕТ, что то делаем и выставляем флаг, чтобы второй раз не делать

ard-20
Offline
Зарегистрирован: 05.10.2020

###

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

Вот вы щас своими сбросами "таймера" его добъёте ))

ard-20
Offline
Зарегистрирован: 05.10.2020

###

ard-20
Offline
Зарегистрирован: 05.10.2020

Скажите а нет ли библиотеки с функциями старт стоп. Если фаза пропала старт появилась стоп и время записать и вывести.

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ard-20 пишет:

Скажите а нет ли библиотеки с функциями старт стоп. Если фаза пропала старт появилась стоп и время записать и вывести.

 

Есть функция pulseIn()

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

ard-20 пишет:

Скажите а нет ли библиотеки с функциями старт стоп. 

Гайверу напиши, чтоб он мультик про это снял. 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ard-20, вы просто понавертели переменных, кто угодно запутается. Я б посадил входы детекторов (ноля?) на прерывание. В прерывании некая переменная для каждой фазы сбрасывается в ноль, а в лупе она же инкременируется раз в секунду.  В результате в переменной всегда имеем кол-во секунд  отсутствия фазы.  В результате никакой путаницы, и всего одна "переменная для хранения времени"

ard-20
Offline
Зарегистрирован: 05.10.2020

dimax пишет:

ard-20, вы просто понавертели переменных, кто угодно запутается. Я б посадил входы детекторов (ноля?) на прерывание. В прерывании некая переменная для каждой фазы сбрасывается в ноль, а в лупе она же инкременируется раз в секунду.  В результате в переменной всегда имеем кол-во секунд  отсутствия фазы.  В результате никакой путаницы, и всего одна "переменная для хранения времени"

 

Спасибо. В общих чертах понял. Буду пробовать. 

ard-20
Offline
Зарегистрирован: 05.10.2020

Буду искать примеры в инете сам точно не сделаю.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ard-20 пишет:

Буду искать примеры в инете сам точно не сделаю.

volatile uint8_t fuseA_fail,fuseB_fail,fuseC_fail;
void setup() {
pinMode(5, INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600);
PCIFR=PCIFR; PCICR=(1<<PCIE2); 
PCMSK2=(1<<PCINT23)|(1<<PCINT22)|(1<<PCINT21); // пины 5.6.7 на прерывание
}  

void loop(){
static uint32_t prevmillis=millis();
if (millis() - prevmillis  > 1000ul) { 
Serial.print("A Fail="); Serial.print(fuseA_fail); Serial.print(" Sec");
Serial.print("  B Fail="); Serial.print(fuseB_fail); Serial.print(" Sec");
Serial.print("  C Fail="); Serial.print(fuseC_fail); Serial.print(" Sec");
Serial.println();

fuseA_fail++;
fuseB_fail++;
fuseC_fail++;
prevmillis=millis();
}

}

ISR (PCINT2_vect){
uint8_t port = PIND;
if (bitRead(port,7)) {fuseA_fail=0;} 
if (bitRead(port,6)) {fuseB_fail=0;} 
if (bitRead(port,5)) {fuseC_fail=0; }
}

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

если фаза есть

    разрешаем вывод

иначе

    если вывод разрешен

        выводим

        запрещаем вывод

 

ard-20
Offline
Зарегистрирован: 05.10.2020

Да до этого мне точно далеко . Попробую запустить Ваш код. И попытаюсь в нем разобраться.

Строчки 7 и 8 для меня как иероглифы на китайском. 

Огромное спасибо что откликнулись !

Надеюсь что все получится. 

 

ard-20
Offline
Зарегистрирован: 05.10.2020

Разбираюсь - пока даже вопрос не могу сформулировать.

Гриша
Offline
Зарегистрирован: 27.04.2014

ard-20 пишет:

Разбираюсь - пока даже вопрос не могу сформулировать.

Блин горелый... вам нужно засекать переходы из 0 в 1 и из 1 в 0 и только в этот момент что-то делать. т.к. ловим 0 то:

если поймали 1в0 запускаем таймер, ставим флаг 

проверяем что нет перехода 0в1 && проверяем:  таймер  не превысил интервал, - как только превысил, ставим флаг и что-то делаем

если поймали 0в1 и таймер не вышел - скидываем флаг, скидываем таймер.

 и удалите из кода все, дли фаз В и С - сперва решите вопрос с 1 фазой

если требуется время всех "нулей" то просто заводим переменную для хранения и накопления. 

и ежели так хочется, выводим время нуля каждые ХХ секунд, пока условие выполняется

ard-20 пишет:

...выводил ошибку фазы если обрыв более 5 сек и время обрыва. поставил флаг для вывода в порт . Выводит постоянно как только обрыв более 5 сек.

ard-20
Offline
Зарегистрирован: 05.10.2020

Гриша пишет:

ard-20 пишет:

Разбираюсь - пока даже вопрос не могу сформулировать.

Блин горелый... вам нужно засекать переходы из 0 в 1 и из 1 в 0 и только в этот момент что-то делать. т.к. ловим 0 то:

если поймали 1в0 запускаем таймер, ставим флаг 

проверяем что нет перехода 0в1 && проверяем:  таймер  не превысил интервал, - как только превысил, ставим флаг и что-то делаем

если поймали 0в1 и таймер не вышел - скидываем флаг, скидываем таймер.

 и удалите из кода все, дли фаз В и С - сперва решите вопрос с 1 фазой

если требуется время всех "нулей" то просто заводим переменную для хранения и накопления. 

и ежели так хочется, выводим время нуля каждые ХХ секунд, пока условие выполняется

ard-20 пишет:

...выводил ошибку фазы если обрыв более 5 сек и время обрыва. поставил флаг для вывода в порт . Выводит постоянно как только обрыв более 5 сек.

Ищу как ловить переходы .

ard-20
Offline
Зарегистрирован: 05.10.2020

Скажите а переходы с 1 на 0 надо ловить прерываниями ?

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

ard-20 пишет:

Ищу как ловить переходы .

вы не поверите - но абсолютно банально!

Если предыдущее значение пина было HIGH, а текущее стало LOW - значит произошел переход FALLING/

и не надо выдумывать какую-то хитрую логику.

Прерывания ловят переходы сами. но работают по этой же схеме.

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

ard-20 пишет:

Скажите а переходы с 1 на 0 надо ловить прерываниями ?

"надо" - неправильное слово. Кому "надо"?

Можно прерываниями, можно без. Зависит от задачи.

ard-20
Offline
Зарегистрирован: 05.10.2020

Те мне надо считать значения пина ранее а потом if отслеживать его изменение ?

Гриша
Offline
Зарегистрирован: 27.04.2014

ard-20 пишет:

Те мне надо считать значения пина ранее а потом if отслеживать его изменение ?

пока вам лучше 2 переменные использовать... текущую и предыдущую

Гриша
Offline
Зарегистрирован: 27.04.2014

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

Победите "свою логику" и начните мыслить логически....

ard-20
Offline
Зарегистрирован: 05.10.2020

Предыдущее состояние запомнил и если оно изменилось то запускаем таймер . А как запустить таймер?

 bool a = digitalRead(5);
   if (a == LOW){
                                 //запускаем таймер
  }

 

ard-20
Offline
Зарегистрирован: 05.10.2020

Вот пытаюсь перешагнуть свою логику ...  Сам вижу что логика хромает сильно

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Зачем столько мусора ?
Прерывания, переход через ноль и прочее.

static uint32_t timer=millis();
if(есть сигнал фазы){timer=millis();}
if(millis()-timer>=5000){//фазы не было 5 секунд}

Херню какую-то напридумывали.
А сигнал фазы можно чем угодно смотреть:переход через 0, трансформатор тока, БП туда повесить на 5в,оптрон прикрутить и тд и тп

Гриша
Offline
Зарегистрирован: 27.04.2014

Kakmyc пишет:
Зачем столько мусора ? Прерывания, переход через ноль и прочее. static uint32_t timer=millis(); if(есть сигнал фазы){timer=millis();} if(millis()-timer>=5000){//фазы не было 5 секунд} Херню какую-то напридумывали. А сигнал фазы можно чем угодно смотреть:переход через 0, трансформатор тока, БП туда повесить на 5в,оптрон прикрутить и тд и тп

а где второе условие? что у нас еще нуль - это первое, второе нуль может быть много больше чем 5 сек, его вроде как периодически выводить нужно, да и ТС нужно "попроще" прям на пальцах.... как в первом классе - печатными буквами.   

ard-20
Offline
Зарегистрирован: 05.10.2020

Скорее всего подготовительная группа в садике.

nik182
Offline
Зарегистрирован: 04.05.2015

Кто нибудь мне объяснит зачем переменные объявляют bool a = digitalRead(5); или static uint32_t timer=millis(); ? Я понимаю когда памяти совсем в обрез, но это же микроконтроллер. У него нет операционной системы. У него крутится одна программа и экономия на спичках может привести к непоняткам особенно у новичков при выходе за область видимости? Особенно со интересно со static - в чем цимус? Можно все переменные объявить глобально. Размер программы практически не изменится. 

Гриша
Offline
Зарегистрирован: 27.04.2014

nik182 пишет:

Кто нибудь мне объяснит зачем переменные объявляют bool a = digitalRead(5); или static uint32_t timer=millis(); ? Я понимаю когда памяти совсем в обрез, но это же микроконтроллер. У него нет операционной системы. У него крутится одна программа и экономия на спичках может привести к непоняткам особенно у новичков при выходе за область видимости? Можно все переменные объявить глобально. Размер программы практически не изменится. 

ну, да ТС бы пока с глобальными разобраться, потом в область видимости вникать. с таким-то кодом :) на 10 строк

UPD исправил свой пост