С деньгами полный ноль и судя по всему не предвидится.
Я тебе один вещ скажу: "Не в дэнгах счастье!". ;)))
вот-вот... в их количестве!" :))))))))))))))))))))))
а вообще жаль... уже которая тема, вроде и не сложная, а ТС ну совсем или с извилинкой замерзшой или лентяи. Если внимательно читать советы, уже можно было с одних подсказок код накидать...
мне бы с как-то начать. Завис на флаге что выводит постоянно в порт.
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;
}
}
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;
}
}
ard-20, логику этого кода можете мне обьяснить? я в этом коде логики не наблюдаю вообще...
строка 29 - если фаза пропала - вычитаем из текущего времени Afaz_NO ? - зачем?
строка 33 - else по отношению к строке 29 - то есть строчка срабатывает, если фаза есть - взводим флаг a =1 и запоминаем время. Если фаза появилась - зачем ставить флаг?
Ну и в итоге условие строки 39 - срабатывает через 5 сек после ПОЯВЛЕНИЯ фазы, а не после исчезновения...
ard-20, вы просто понавертели переменных, кто угодно запутается. Я б посадил входы детекторов (ноля?) на прерывание. В прерывании некая переменная для каждой фазы сбрасывается в ноль, а в лупе она же инкременируется раз в секунду. В результате в переменной всегда имеем кол-во секунд отсутствия фазы. В результате никакой путаницы, и всего одна "переменная для хранения времени"
ard-20, вы просто понавертели переменных, кто угодно запутается. Я б посадил входы детекторов (ноля?) на прерывание. В прерывании некая переменная для каждой фазы сбрасывается в ноль, а в лупе она же инкременируется раз в секунду. В результате в переменной всегда имеем кол-во секунд отсутствия фазы. В результате никакой путаницы, и всего одна "переменная для хранения времени"
Зачем столько мусора ?
Прерывания, переход через ноль и прочее.
static uint32_t timer=millis();
if(есть сигнал фазы){timer=millis();}
if(millis()-timer>=5000){//фазы не было 5 секунд}
Херню какую-то напридумывали.
А сигнал фазы можно чем угодно смотреть:переход через 0, трансформатор тока, БП туда повесить на 5в,оптрон прикрутить и тд и тп
Зачем столько мусора ? Прерывания, переход через ноль и прочее. static uint32_t timer=millis(); if(есть сигнал фазы){timer=millis();} if(millis()-timer>=5000){//фазы не было 5 секунд} Херню какую-то напридумывали. А сигнал фазы можно чем угодно смотреть:переход через 0, трансформатор тока, БП туда повесить на 5в,оптрон прикрутить и тд и тп
а где второе условие? что у нас еще нуль - это первое, второе нуль может быть много больше чем 5 сек, его вроде как периодически выводить нужно, да и ТС нужно "попроще" прям на пальцах.... как в первом классе - печатными буквами.
Кто нибудь мне объяснит зачем переменные объявляют boola = digitalRead(5); или static uint32_t timer=millis(); ? Я понимаю когда памяти совсем в обрез, но это же микроконтроллер. У него нет операционной системы. У него крутится одна программа и экономия на спичках может привести к непоняткам особенно у новичков при выходе за область видимости? Особенно со интересно со static - в чем цимус? Можно все переменные объявить глобально. Размер программы практически не изменится.
Кто нибудь мне объяснит зачем переменные объявляют boola = digitalRead(5); или static uint32_t timer=millis(); ? Я понимаю когда памяти совсем в обрез, но это же микроконтроллер. У него нет операционной системы. У него крутится одна программа и экономия на спичках может привести к непоняткам особенно у новичков при выходе за область видимости? Можно все переменные объявить глобально. Размер программы практически не изменится.
ну, да ТС бы пока с глобальными разобраться, потом в область видимости вникать. с таким-то кодом :) на 10 строк
Судя по всему через пару дней читать уже не надо будет .
Я так и понял сразу, очередной курсовик, deadline через 2 дня. На што ты надеялся?
Удалите пожалуйста. А с курсовиком не угадали тут дело повеселее будет.
Удалите пожалуйста.
500р. :)
С деньгами полный ноль и судя по всему не предвидится.
бесплатно тока через час удалю.
###
Чё та ржу.
500р за "удалить тему" :-)
Что то новенькое.
Шёл 2020-й. Мы выживали, как могли! ;)))
С деньгами полный ноль и судя по всему не предвидится.
Я тебе один вещ скажу: "Не в дэнгах счастье!". ;)))
С деньгами полный ноль и судя по всему не предвидится.
Я тебе один вещ скажу: "Не в дэнгах счастье!". ;)))
вот-вот... в их количестве!" :))))))))))))))))))))))
а вообще жаль... уже которая тема, вроде и не сложная, а ТС ну совсем или с извилинкой замерзшой или лентяи. Если внимательно читать советы, уже можно было с одних подсказок код накидать...
###
мне бы с как-то начать. Завис на флаге что выводит постоянно в порт.
Это что, так сложно ?
if(пора выводить)поднимаем флаг
if(флаг поднят){выводим, опускаем флаг}
###
что-то вы окончательно все запутали. Где в этом коде условие, что фазы нет более 5 секунд?
не совсем так.
Правильно:
if(пора выводить) и (флаг опущен) {выводим, поднимаем флаг}
if(флаг поднят)и(появилась фаза) {опускаем флаг}
Отличия мелкие, но значимые - имхо, именно их ТС и не понимает
У меня a=0 если фаза не LOW по идее он и не выводит (в порт ничего не выходит) а вот если a=1 он постоянно выводит
ard-20 - всегда выкладывайте полный код. Тем более что у вас он просто крохотный, что его сокращать-то?
Кроме того, длинный код можно убирать под спойлер.
Выкладывайте код целиком, пока вы сами не научитесь определять, когда нужен весь скетч, а когда можно обойтись частью. Но до этого вам еще далеко.
ОК
Бред какой то.
Подход к задаче абсолютно неверный.
Следует сделать так:
if(фаза есть)сбрасываем таймер;
if(таймер досчитал до 5сек)ЗНАЧИТ ФАЗЫ НЕТ, что то делаем
Да и смысл ждать 5секунд ?
Максимум два периода.
ard-20, логику этого кода можете мне обьяснить? я в этом коде логики не наблюдаю вообще...
строка 29 - если фаза пропала - вычитаем из текущего времени Afaz_NO ? - зачем?
строка 33 - else по отношению к строке 29 - то есть строчка срабатывает, если фаза есть - взводим флаг a =1 и запоминаем время. Если фаза появилась - зачем ставить флаг?
Ну и в итоге условие строки 39 - срабатывает через 5 сек после ПОЯВЛЕНИЯ фазы, а не после исчезновения...
А может я все перепутал? - обьясните
дополню вторую строку
;if(таймер досчитал до 5сек)ЗНАЧИТ ФАЗЫ НЕТ, что то делаем и выставляем флаг, чтобы второй раз не делать
###
Вот вы щас своими сбросами "таймера" его добъёте ))
###
Скажите а нет ли библиотеки с функциями старт стоп. Если фаза пропала старт появилась стоп и время записать и вывести.
Скажите а нет ли библиотеки с функциями старт стоп. Если фаза пропала старт появилась стоп и время записать и вывести.
Есть функция pulseIn()
Скажите а нет ли библиотеки с функциями старт стоп.
Гайверу напиши, чтоб он мультик про это снял.
ard-20, вы просто понавертели переменных, кто угодно запутается. Я б посадил входы детекторов (ноля?) на прерывание. В прерывании некая переменная для каждой фазы сбрасывается в ноль, а в лупе она же инкременируется раз в секунду. В результате в переменной всегда имеем кол-во секунд отсутствия фазы. В результате никакой путаницы, и всего одна "переменная для хранения времени"
ard-20, вы просто понавертели переменных, кто угодно запутается. Я б посадил входы детекторов (ноля?) на прерывание. В прерывании некая переменная для каждой фазы сбрасывается в ноль, а в лупе она же инкременируется раз в секунду. В результате в переменной всегда имеем кол-во секунд отсутствия фазы. В результате никакой путаницы, и всего одна "переменная для хранения времени"
Спасибо. В общих чертах понял. Буду пробовать.
Буду искать примеры в инете сам точно не сделаю.
Буду искать примеры в инете сам точно не сделаю.
если фаза есть
разрешаем вывод
иначе
если вывод разрешен
выводим
запрещаем вывод
Да до этого мне точно далеко . Попробую запустить Ваш код. И попытаюсь в нем разобраться.
Строчки 7 и 8 для меня как иероглифы на китайском.
Огромное спасибо что откликнулись !
Надеюсь что все получится.
Разбираюсь - пока даже вопрос не могу сформулировать.
Разбираюсь - пока даже вопрос не могу сформулировать.
Блин горелый... вам нужно засекать переходы из 0 в 1 и из 1 в 0 и только в этот момент что-то делать. т.к. ловим 0 то:
если поймали 1в0 запускаем таймер, ставим флаг
проверяем что нет перехода 0в1 && проверяем: таймер не превысил интервал, - как только превысил, ставим флаг и что-то делаем
если поймали 0в1 и таймер не вышел - скидываем флаг, скидываем таймер.
и удалите из кода все, дли фаз В и С - сперва решите вопрос с 1 фазой
если требуется время всех "нулей" то просто заводим переменную для хранения и накопления.
и ежели так хочется, выводим время нуля каждые ХХ секунд, пока условие выполняется
...выводил ошибку фазы если обрыв более 5 сек и время обрыва. поставил флаг для вывода в порт . Выводит постоянно как только обрыв более 5 сек.
Разбираюсь - пока даже вопрос не могу сформулировать.
Блин горелый... вам нужно засекать переходы из 0 в 1 и из 1 в 0 и только в этот момент что-то делать. т.к. ловим 0 то:
если поймали 1в0 запускаем таймер, ставим флаг
проверяем что нет перехода 0в1 && проверяем: таймер не превысил интервал, - как только превысил, ставим флаг и что-то делаем
если поймали 0в1 и таймер не вышел - скидываем флаг, скидываем таймер.
и удалите из кода все, дли фаз В и С - сперва решите вопрос с 1 фазой
если требуется время всех "нулей" то просто заводим переменную для хранения и накопления.
и ежели так хочется, выводим время нуля каждые ХХ секунд, пока условие выполняется
...выводил ошибку фазы если обрыв более 5 сек и время обрыва. поставил флаг для вывода в порт . Выводит постоянно как только обрыв более 5 сек.
Ищу как ловить переходы .
Скажите а переходы с 1 на 0 надо ловить прерываниями ?
Ищу как ловить переходы .
вы не поверите - но абсолютно банально!
Если предыдущее значение пина было HIGH, а текущее стало LOW - значит произошел переход FALLING/
и не надо выдумывать какую-то хитрую логику.
Прерывания ловят переходы сами. но работают по этой же схеме.
Скажите а переходы с 1 на 0 надо ловить прерываниями ?
"надо" - неправильное слово. Кому "надо"?
Можно прерываниями, можно без. Зависит от задачи.
Те мне надо считать значения пина ранее а потом if отслеживать его изменение ?
Те мне надо считать значения пина ранее а потом if отслеживать его изменение ?
пока вам лучше 2 переменные использовать... текущую и предыдущую
такой затуп - называется порог вхождения.. перешагнете, может толк и выйдет, а нет так и мало ли других задач нужно решать.
Победите "свою логику" и начните мыслить логически....
Предыдущее состояние запомнил и если оно изменилось то запускаем таймер . А как запустить таймер?
Вот пытаюсь перешагнуть свою логику ... Сам вижу что логика хромает сильно
Зачем столько мусора ?
Прерывания, переход через ноль и прочее.
static uint32_t timer=millis();
if(есть сигнал фазы){timer=millis();}
if(millis()-timer>=5000){//фазы не было 5 секунд}
Херню какую-то напридумывали.
А сигнал фазы можно чем угодно смотреть:переход через 0, трансформатор тока, БП туда повесить на 5в,оптрон прикрутить и тд и тп
а где второе условие? что у нас еще нуль - это первое, второе нуль может быть много больше чем 5 сек, его вроде как периодически выводить нужно, да и ТС нужно "попроще" прям на пальцах.... как в первом классе - печатными буквами.
Скорее всего подготовительная группа в садике.
Кто нибудь мне объяснит зачем переменные объявляют
bool
a = digitalRead(5); или
static uint32_t timer=millis(); ? Я понимаю когда памяти совсем в обрез, но это же микроконтроллер. У него нет операционной системы. У него крутится одна программа и экономия на спичках может привести к непоняткам особенно у новичков при выходе за область видимости? Особенно со интересно со static - в чем цимус? Можно все переменные объявить глобально. Размер программы практически не изменится.Кто нибудь мне объяснит зачем переменные объявляют
bool
a = digitalRead(5); или
static uint32_t timer=millis(); ? Я понимаю когда памяти совсем в обрез, но это же микроконтроллер. У него нет операционной системы. У него крутится одна программа и экономия на спичках может привести к непоняткам особенно у новичков при выходе за область видимости? Можно все переменные объявить глобально. Размер программы практически не изменится.ну, да ТС бы пока с глобальными разобраться, потом в область видимости вникать. с таким-то кодом :) на 10 строк
UPD исправил свой пост