Кто нибудь мне объяснит зачем переменные объявляют boola = digitalRead(5); или static uint32_t timer=millis(); ? Я понимаю когда памяти совсем в обрез, но это же микроконтроллер. У него нет операционной системы. У него крутится одна программа и экономия на спичках может привести к непоняткам особенно у новичков при выходе за область видимости? Особенно со интересно со static - в чем цимус? Можно все переменные объявить глобально. Размер программы практически не изменится.
Ну глобальные переменные они нехорошие и злые, листай потом ищи где они.
А static uint32_t , где используется , там и объявляется и извне его крутить никто не будет
Зачем столько мусора ? Прерывания, переход через ноль и прочее. static uint32_t timer=millis(); if(есть сигнал фазы){timer=millis();} if(millis()-timer>=5000){//фазы не было 5 секунд} Херню какую-то напридумывали. А сигнал фазы можно чем угодно смотреть:переход через 0, трансформатор тока, БП туда повесить на 5в,оптрон прикрутить и тд и тп
попробовал так. Как только millis()-timer>=5000 он начинает выводить постоянно ERR ERR ERR
volatile uint32_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 на прерывание
unsigned long timer = 0; // Переменная для хранения времени
Serial.begin(9600);
}
void loop(){
static uint32_t timer=millis();
if(digitalRead(5) == HIGH)
{timer = millis();}
if(millis()-timer>=5000)
{Serial.println("ERR");}
}
ну, да вам бы пока с глобальными разобраться, потом в область видимости вникать. с таким-то кодом :) на 10 строк
Ну а по делу? В коде на 10 строк тоже можно нарваться на область видимости. Было уже на форуме. Даже тема как то так называлась - почему иногда не срабатывает условие?
ну, да вам бы пока с глобальными разобраться, потом в область видимости вникать. с таким-то кодом :) на 10 строк
Ну а по делу? В коде на 10 строк тоже можно нарваться на область видимости. Было уже на форуме. Даже тема как то так называлась - почему иногда не срабатывает условие?
я уже исправил, мое высказывание не к вам относится, полагаю у вас в таком простом коде с выбором переменных проблем нет?
Каждый выбирает тип переменных под задачу, и если хочет в дальнейшем использовать куски кода или как-то его модифицировать, старается завернуть все переменные в функции. если переменные глобальные - редактирование больших кодов значительно усложняется - и всего делов.
Зачем столько мусора ? Прерывания, переход через ноль и прочее. static uint32_t timer=millis(); if(есть сигнал фазы){timer=millis();} if(millis()-timer>=5000){//фазы не было 5 секунд} Херню какую-то напридумывали. А сигнал фазы можно чем угодно смотреть:переход через 0, трансформатор тока, БП туда повесить на 5в,оптрон прикрутить и тд и тп
попробовал так. Как только millis()-timer>=5000 он начинает выводить постоянно ERR ERR ERR
volatile uint32_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 на прерывание
unsigned long timer = 0; // Переменная для хранения времени
Serial.begin(9600);
}
void loop(){
static uint32_t timer=millis();
if(digitalRead(5) == HIGH)
{timer = millis();}
if(millis()-timer>=5000)
{Serial.println("ERR");}
}
Если ШИМ с частотой ниже 0,19Гц подавать на вход. То с интервалом >5 секунд разве что
ерунду пишете.
Если фаза пропала и не появилась, код из 112 подождет пять секунд и начнет печатать ERR с частотой оборота ЛУП. И будет печатать до тех, пока фаза не появится опять.
Как это происходит - могу построчно обьяснить. Но думаю вы сами догадаетесь
Если ШИМ с частотой ниже 0,19Гц подавать на вход. То с интервалом >5 секунд разве что
ерунду пишете.
Если фаза пропала и не появилась, код из 112 подождет пять секунд и начнет печатать ERR с частотой оборота ЛУП. И будет печатать до тех, пока фаза не появится опять.
Как это происходит - могу построчно обьяснить. Но думаю вы сами догадаетесь
1) как только у нас произошло событие мы запомнили время начала события
2) проверяем что событие длится дольше чем.... что-то делаем и выводим в порт. обнулять событие будем?
3) выводим в порт время с начала события, а дальше варианты а) каждые Х сек пока событие не закончится б) даже если событие закончилось выводим сколько длилось и когда началось... в) вариантов масса - как хотите так и творите.
1) как только у нас произошло событие мы запомнили время начала события
2) проверяем что событие длится дольше чем.... что-то делаем и выводим в порт. обнулять событие будем?
3) выводим в порт время с начала события, а дальше варианты а) каждые Х сек пока событие не закончится б) даже если событие закончилось выводим сколько длилось и когда началось... в) вариантов масса - как хотите так и творите.
Если соединить фазы с входами D5 D6 D7 резисторами 3 мегома ( у меня цепочки из 3 1 мегомных SMD1206) то для реакции на отключение сети можно использовать что то типа
int tf0, tf1, tf2;
void setup() {
Serial.begin(115200);
if (pulseIn(5, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
Serial.print("A Fail");
return;
};
}
void loop()
{
if (pulseIn(5, HIGH, 1000000L) == 0) { // если нет напряжения на фазе A 1сек пишет ошибку и пытается начать сначала.
Serial.print("A Fail");
return;
} else delayMicroseconds(2400); if (bitRead(PIND, 5)) { // сдвиг на середину фазы А
tf0--;
if (tf0 < 1) tf0++;
} else {
tf0++; if (tf0 > 50) { // 50 периодов сети - 1 секунда - если нет напряжения на фазе A 1 секунду пишет ошибку и пытается начать сначала.
Serial.print("A Fail");
return;
};
};
delayMicroseconds(7600); if (bitRead(PIND, 6)) { // сдвиг на середину фазы В
tf1--;
if (tf1 < 1) tf1++;
} else {
tf1++; if (tf1 > 50) { // 50 периодов сети - 1 секунда - если нет напряжения на фазе B 1 секунду пишет ошибку и пытается начать сначала.
Serial.print("B Fail");
return;
};
};
delayMicroseconds(7600); if (bitRead(PIND, 7)) { // сдвиг на середину фазы С
tf2--;
if (tf2 < 1) tf2++;
} else {
tf2++; if (tf2 > 50) { // 50 периодов сети - 1 секунда - если нет напряжения на фазе C 1 секунду пишет ошибку и пытается начать сначала.
Serial.print("C Fail");
return;
};
};
}
Это только идея. В железе не проверял. Пропускает отключения напряжения меньше 1 секунды. Фазы обязательно А-5 В-6 С-7 Если наоборот, то можно использовать как реле обратного порядка чередования фаз, уменьшив время реакции до пары - тройки периодов. Может в два раза увеличить интервал из за особенностей работы pulseIn.
int a,b,c;
unsigned long time_A;
unsigned long timer1 =0;
unsigned long timer2 =0;
unsigned long timer3 =0;
void setup() {
pinMode(5, INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600);
/*
if (pulseIn(5, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
Serial.print("A Fail");
return;
}
if (pulseIn(6, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
Serial.print("A Fail");
return;
}
if (pulseIn(7, HIGH, 5000000L) == 0) { // если нет напряжения на фазе 5 секунд пишет ошибку и пытается начать сначала.
Serial.print("A Fail");
return;
}*/
}
void loop(){
while (digitalRead(5) ==HIGH)
{timer2 = millis();
a=1;}
while (digitalRead(5) ==LOW)
{timer1 = millis();
b=1;}
if (a==1 && b==1 ){
timer3 = (timer2 - timer1)/1000;
Serial.println(timer1/1000);
Serial.println(timer2/1000);
Serial.println(timer3);
a=0;
b=0;
}
}
ard-20, опять вы плодите переменные, и называете их совершенно безликими именами. Это прямой путь к путанице. А чем кстати не угодил вариант, что я вам в #83 написал? Он уже работает. Разве что нет сигнализации 5-секундного простоя.
Вам dimax уже написал, почему так получается. Если бы вы вместо timer1 дали имя faza_ON а вместо timer2 - faza_OFF. было бы очевидно, что надо вычитать timer1 - timer2. а не наоборот, как у вас
А с вашими "слепыми" именами переменных надо постоянно держать в голове. что есть что. А у вас внимательности не хватает.
Он сложный для меня и без Вашей помощи я в нем не разберусь . Мне еще надо посчитать и вывести сколько не было фазы в пределах до 5 сек . например фазы а не было 2 сек.
Ну так мой пример и выводит раз в секунду состояние, сразу видно сколько не было и какой фазы. "Сигналочку" на 5 секунд нетрудно дописать.
Схему подключения к сети можно увидеть? От неё зависит алгоритм программы. Что делает Ваша последняя реализация я вообще не понимаю. Как по мне она всегда должна выдавать число меньше 11.
Схема простая с НАНО 5 6 7 пин (подаю 0 или 1) вот этим скетчем с задержками а на МЕГА 2560 принимаю 5 6 7 пином и считываю
пытаюсь вывести ERR если фазы не было 5 сек и надо вывести сколько времени вообще не было фазы.
С нано подаю
boolean state_A = 0; // Переменная для хранения состояния вывода
boolean state_B = 0; // Переменная для хранения состояния вывода
boolean state_C = 0; // Переменная для хранения состояния вывода
unsigned long new_millis_A = millis(); // Переменная для хранения времени
unsigned long new_millis_B = millis(); // Переменная для хранения времени
unsigned long new_millis_C = millis(); // Переменная для хранения времени
#define TIME_ON_A 1000 // Время в течении, которого на выводе 1
#define TIME_OFF_A 3000 // Время в течении, которого на выводе 0
#define TIME_ON_B 1000 // Время в течении, которого на выводе 1
#define TIME_OFF_B 2000 // Время в течении, которого на выводе 0
#define TIME_ON_C 2000 // Время в течении, которого на выводе 1
#define TIME_OFF_C 3000 // Время в течении, которого на выводе 0
void setup() {
pinMode(5,OUTPUT); // Настраиваем вывод на выход
pinMode(6,OUTPUT); // Настраиваем вывод на выход
pinMode(7,OUTPUT); // Настраиваем вывод на выход
Serial.begin(9600);
}
void loop(){
// Управление фазой А:
if(millis() > new_millis_A){
state_A = !state_A;
digitalWrite(5, state_A);
if(state_A){
new_millis_A = millis() + TIME_ON_A;
}
else{
new_millis_A = millis() + TIME_OFF_A;
}
}
// Управление фазой В:
if(millis() > new_millis_B){
state_B = !state_B;
digitalWrite(6, state_B);
if(state_B){
new_millis_B = millis() + TIME_ON_B;
}
else{
new_millis_B = millis() + TIME_OFF_B;
}
}
// Управление фазой C:
if(millis() > new_millis_C){
state_C = !state_C;
digitalWrite(7, state_C);
if(state_C){
new_millis_C = millis() + TIME_ON_C;
}
else{
new_millis_C = millis() + TIME_OFF_C;
}
}
}
Кто нибудь мне объяснит зачем переменные объявляют
bool
a = digitalRead(5); или
static uint32_t timer=millis(); ? Я понимаю когда памяти совсем в обрез, но это же микроконтроллер. У него нет операционной системы. У него крутится одна программа и экономия на спичках может привести к непоняткам особенно у новичков при выходе за область видимости? Особенно со интересно со static - в чем цимус? Можно все переменные объявить глобально. Размер программы практически не изменится.Ну глобальные переменные они нехорошие и злые, листай потом ищи где они.
А static uint32_t , где используется , там и объявляется и извне его крутить никто не будет
попробовал так. Как только millis()-timer>=5000 он начинает выводить постоянно ERR ERR ERR
##
ну, да вам бы пока с глобальными разобраться, потом в область видимости вникать. с таким-то кодом :) на 10 строк
Ну а по делу? В коде на 10 строк тоже можно нарваться на область видимости. Было уже на форуме. Даже тема как то так называлась - почему иногда не срабатывает условие?
пост 104 правильно и будет так делать пока строка 17 выполняется... при каждом проходе будет это делать вы ведь его не ограничили, ничем
ну, да вам бы пока с глобальными разобраться, потом в область видимости вникать. с таким-то кодом :) на 10 строк
Ну а по делу? В коде на 10 строк тоже можно нарваться на область видимости. Было уже на форуме. Даже тема как то так называлась - почему иногда не срабатывает условие?
я уже исправил, мое высказывание не к вам относится, полагаю у вас в таком простом коде с выбором переменных проблем нет?
Каждый выбирает тип переменных под задачу, и если хочет в дальнейшем использовать куски кода или как-то его модифицировать, старается завернуть все переменные в функции. если переменные глобальные - редактирование больших кодов значительно усложняется - и всего делов.
к примеру
использовать глобально - ну я даже не знаю
###
к примеру
использовать глобально - ну я даже не знаю
Сейчас пробую
попробовал так. Как только millis()-timer>=5000 он начинает выводить постоянно ERR ERR ERR
А что мешает добавить флаг ?
static boolean flag=0;
if(digitalRead(5)==HIGH){timer=millis();}else flag=1;
if(millis()-timer>=5000&&flag==1){Serial.println("ERROR");flag=0;}
добавил флаг
А что мешает добавить флаг ?
static boolean flag=0;
if(digitalRead(5)==HIGH){timer=millis();}else flag=1;
if(millis()-timer>=5000&&flag==1){Serial.println("ERROR");flag=0;}
в итоге то же
а так
то же
то же
я там выше поправил, пробуйте еще
получается весь void loop пока (millis()-timer>=5000) сериал порт печатает циклически и флаг постоянно в 1 становится
Это тролль походу
получается весь void loop пока (millis()-timer>=5000) сериал порт печатает циклически и флаг постоянно в 1 становится
получается. Ну что, новый код из сообщения 113 работает?
я или ТС? :)
я или ТС? :)
ТС.
Не может код из #112
Такое выводить
легко.
обьяснить как?
так работает
А как теперь после всех изменений вывести время когда нет сигнала?
легко.
обьяснить как?
Если ШИМ с частотой ниже 0,19Гц подавать на вход.
То с интервалом >5 секунд разве что
Хотя нет.
Накосячил .
else не нужен.
Надо ;
if(digitalRead(5)==HIGH){timer=millis();a=1;}
так работает
И это все??? а где цветы и овации?:))
а вы этого в заказе не указывали
ерунду пишете.
Если фаза пропала и не появилась, код из 112 подождет пять секунд и начнет печатать ERR с частотой оборота ЛУП. И будет печатать до тех, пока фаза не появится опять.
Как это происходит - могу построчно обьяснить. Но думаю вы сами догадаетесь
ерунду пишете.
Если фаза пропала и не появилась, код из 112 подождет пять секунд и начнет печатать ERR с частотой оборота ЛУП. И будет печатать до тех, пока фаза не появится опять.
Как это происходит - могу построчно обьяснить. Но думаю вы сами догадаетесь
Уже.
Смотрите выше
del
Спасибо всем кто помогал. Бурные аплодисменты и овации.
Пытаюсь делать дальше.
del
Вот блин одни чудеса. Как же это решить. Я запутался в край.
Вот блин одни чудеса. Как же это решить. Я запутался в край.
Что опять не так? Вроде решили уже. Аж два варианта...
Теперь работает
ard-20 - любую программисткую задачку можно решить бесчисленным набором вариантов
Тут как только милис набегут больше timer выдаст ошибку . Но как посчитать сколько не было фазы используя эти данные?
Даю отсутствие сигнала 7 сек а выводит 5 почему?
1) как только у нас произошло событие мы запомнили время начала события
2) проверяем что событие длится дольше чем.... что-то делаем и выводим в порт. обнулять событие будем?
3) выводим в порт время с начала события, а дальше варианты а) каждые Х сек пока событие не закончится б) даже если событие закончилось выводим сколько длилось и когда началось... в) вариантов масса - как хотите так и творите.
1) как только у нас произошло событие мы запомнили время начала события
2) проверяем что событие длится дольше чем.... что-то делаем и выводим в порт. обнулять событие будем?
3) выводим в порт время с начала события, а дальше варианты а) каждые Х сек пока событие не закончится б) даже если событие закончилось выводим сколько длилось и когда началось... в) вариантов масса - как хотите так и творите.
Думаю одну часть кода за ТС написали, на этом стоит останвиться
timer начало события
милис конец события LOW
time_A = millis()-timer;время LOW / Задаю 7 а выводит 5
timer начало события
милис конец события LOW
time_A = millis()-timer;время LOW / Задаю 7 а выводит 5
а покажи, в каком месте ты вычисляешь это время?
вот {time_A = millis()-timer; b=1;}
20 строка
сделал по аналогии теперь время выводит от 0 до 7 в ком порт длинной линейкой
Если соединить фазы с входами D5 D6 D7 резисторами 3 мегома ( у меня цепочки из 3 1 мегомных SMD1206) то для реакции на отключение сети можно использовать что то типа
Это только идея. В железе не проверял. Пропускает отключения напряжения меньше 1 секунды. Фазы обязательно А-5 В-6 С-7 Если наоборот, то можно использовать как реле обратного порядка чередования фаз, уменьшив время реакции до пары - тройки периодов. Может в два раза увеличить интервал из за особенностей работы pulseIn.
Подскажите вычитаю
timer3 = (timer2 - timer1)/1000;
ard-20, опять вы плодите переменные, и называете их совершенно безликими именами. Это прямой путь к путанице. А чем кстати не угодил вариант, что я вам в #83 написал? Он уже работает. Разве что нет сигнализации 5-секундного простоя.
Он сложный для меня и без Вашей помощи я в нем не разберусь
Мне еще надо посчитать и вывести сколько не было фазы в пределах до 5 сек
например фазы а не было 2 сек.
Подскажите вычитаю
timer3 = (timer2 - timer1)/1000;
Вам dimax уже написал, почему так получается. Если бы вы вместо timer1 дали имя faza_ON а вместо timer2 - faza_OFF. было бы очевидно, что надо вычитать timer1 - timer2. а не наоборот, как у вас
А с вашими "слепыми" именами переменных надо постоянно держать в голове. что есть что. А у вас внимательности не хватает.
Он сложный для меня и без Вашей помощи я в нем не разберусь . Мне еще надо посчитать и вывести сколько не было фазы в пределах до 5 сек . например фазы а не было 2 сек.
Ну так мой пример и выводит раз в секунду состояние, сразу видно сколько не было и какой фазы. "Сигналочку" на 5 секунд нетрудно дописать.
Схему подключения к сети можно увидеть? От неё зависит алгоритм программы. Что делает Ваша последняя реализация я вообще не понимаю. Как по мне она всегда должна выдавать число меньше 11.
Схема простая с НАНО 5 6 7 пин (подаю 0 или 1) вот этим скетчем с задержками а на МЕГА 2560 принимаю 5 6 7 пином и считываю
пытаюсь вывести ERR если фазы не было 5 сек и надо вывести сколько времени вообще не было фазы.
С нано подаю