time = millis();
- Войдите на сайт для отправки комментариев
Вс, 17/02/2013 - 21:46
Использую в проге функцию millis(); Задача программы при поступлении сигнала запустить через 5 сек
time =millis();
if (RCval>1470&RCval<1550&&time>5000) {avar();}
void avar()
{
digitalWrite(9,1);
digitalWrite(10,1);
delay(strobArr1[4]);
digitalWrite(9,0);
digitalWrite(10,0);
delay(strobArr1[4]);
}
Первый запуск получается а потом миллис растет и все горит постоянно при совпадении второго условия. как можно обнулить миллис если услови не соответствует if (RCval>1470&RCval<1550) {avar();}
У вас переменная time постоянно принимает новые значения. Обнулить millis() ?! Ну ну, обнуляйте.
Замените
time =millis(); if (RCval>1470&RCval<1550&&time>5000) {avar();}На это. И будет вам счастье.
if (RCval>1470&RCval<1550&&(millis()-time)>5000)
{
time=millis();
avar();
}
А еще лучше сделать так
if (RCval>1470&RCval<1550) { if((millis()-time)>5000) { time=millis(); avar(); }попробовал ничего вообще не работает avar счас пробую второй вариант
Во втором посте скобку в конце забыл поставить.
тоже 0 реакции. я поставил
Да и вообще, показывать кусок программы не есть хорошо.
unsigned long time; //пред повороты 2 и 4 белых //зад поворроты стоп.габарит 2 белых //работают тока стопы и стробы аварийка при простои 15 сек boolean lastButton = LOW; boolean currentButton = LOW; int strobPin[]={0,4,4,4,4,5,5,5,5}; int strobPin3[]={0,6,6,6,6,7,7,7,7}; int storbPin2[]={0,4,5,6,7,8,9,10,11}; int strobArr1[]={0,25,190,25,250}; int strobEnd[]={0,1,0}; int pic = 0; int pic2 = 0; int pic3 =0; int poy = 0; int pin = 0; int hig = 0; int ledLevel = 1; int switchPin = 2; int PPMin = 3; // Сигнал с пульта газ 1490-1510 нетрал //int PPMin2 = 2; // сигнал поворот int ledPin4 = 4; //синий левый int ledPin5 = 5;// синий правый int ledPin6 = 6;// белый левый int ledPin7 = 7;// белый правый int ledPin8 = 8;// красные стоп int ledPin9 = 9;// поворот лево int ledPin10 = 10;// поворот право int ledPin11 = 11;// задний ход int RCval; // длительность импульса int adj_val; // назначает что значение должно быть 0-255 void setup() { Serial.begin(9600); //serial library start pinMode(ledPin4, OUTPUT); // выходы на диоды pinMode(ledPin5, OUTPUT); pinMode(ledPin6, OUTPUT); pinMode(ledPin7, OUTPUT); pinMode(ledPin8, OUTPUT); pinMode(ledPin9, OUTPUT); pinMode(ledPin10, OUTPUT); pinMode(ledPin11, OUTPUT); pinMode(switchPin, INPUT); pinMode(PPMin, INPUT); //газ } //////////////////////// boolean debounce(boolean last) { boolean current = digitalRead(switchPin); if (last != current) { delay(5); current = digitalRead(switchPin); } return current; } void loop() // повороты мигают все остально не горит { time = millis(); RCval = pulseIn(PPMin, HIGH, 20000); //руль adj_val = map(RCval, 1080, 1880, 0, 255); // /////////////////////////// тормоз свет static bool f; if(RCval>1400 && RCval<1520) f = 0; if(RCval>100 && RCval<1400 && !f) { ++pic; f = 1; } // if(RCval>1520 && RCval<2000 && !f) // { // --pic; // f = 1; // } if( pic>1&&RCval>1400 && RCval<1520) pic=1; if( pic>0&&RCval>1520) pic=0; if(pic>1) pic=2; if(pic<-1) pic = 0; hig++; if (hig == 2) hig = 0; pin++; if (pin == 9) pin = 1; poy++; if (poy == 5) poy = 1; digitalWrite(10,0); digitalWrite(9,0); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,0); digitalWrite(7,0); //if (RCval>1470&RCval<1550) {avar();} //////////////////////////// if (RCval>1470&RCval<1550) { if((millis()-time)>5000) { time=millis(); avar(); }} //////////////////////////// if ((RCval>1530)&(ledLevel>0&ledLevel<2)) {strob();} // еду прямо if ((RCval>1530)&(ledLevel>1&ledLevel<3)) {GAZ();} //if (ledLevel>0&ledLevel<2) {strob();} //if (ledLevel>1&ledLevel<3) {GAZ();} if (pic<2&RCval<1400) {digitalWrite(8,1);} // стоп else {digitalWrite(8,0);} if (pic>1&pic<3&RCval<1430) {digitalWrite(11,1);} else {digitalWrite(11,0);} /////////////////////////////////// { currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { ledLevel = ledLevel + 1; } lastButton = currentButton; if(ledLevel > 2) ledLevel = 1; } Serial.println(time); } void strob() { digitalWrite((strobPin[pin]),(strobEnd[hig])); digitalWrite((strobPin3[pin]),(strobEnd[hig])); delay(strobArr1[poy]);} void strobAV() {if(poy>3) {(digitalWrite(9,1));(digitalWrite(10,1)); } else {(digitalWrite(9,0)); (digitalWrite(10,0));} digitalWrite((strobPin[pin]),(strobEnd[hig])); digitalWrite((strobPin3[pin]),(strobEnd[hig])); delay(strobArr1[poy]);} void GAZ() { digitalWrite(4,1); digitalWrite(5,1); digitalWrite(6,1); digitalWrite(7,1);} void GAZAV() // режим без строба горят два диода { digitalWrite(4,1); digitalWrite(5,1); digitalWrite(6,1); digitalWrite(7,1); digitalWrite(9,1); digitalWrite(10,1); delay(strobArr1[4]); digitalWrite(9,0); digitalWrite(10,0); delay(strobArr1[4]); } void avar() { digitalWrite(9,1); digitalWrite(10,1); delay(strobArr1[4]); digitalWrite(9,0); digitalWrite(10,0); delay(strobArr1[4]); }Что значит "0реакции" ? опишите конкретно что происходит.
Какой тип данных имеет переменная time ?
Вы не внимательны. Скажите какую функцию выполняет строка 75?
все убрал 75 заработала тока какая то большая пауза в мерцании. получается он выполняет avar каждые 5 сек????
мне нужно чтоб онао запустило через 5 сек и выполняло пока не поменяется значение 129 строки
>>тока какая то большая пауза в мерцании<<
Насколько большая ?
>>получается он выполняет avar каждые 5 сек????<<
Да. Плюс время на выполнение самой функции.
void avar() { while(RCval>1470&RCval<1550){ // выполнить что-то, повторив 200 раз RCval = pulseIn(PPMin, HIGH, 20000); //руль digitalWrite(9,1); digitalWrite(10,1); delay(strobArr1[4]); RCval = pulseIn(PPMin, HIGH, 20000); digitalWrite(9,0); digitalWrite(10,0); delay(strobArr1[4]); } }счас норм аварийка тока почемуто второй запус происходит через 3 секунды хотя первый через 5
>>тока почемуто второй запус происходит через 3 секунды хотя первый через 5<<
Наверное по тому что функции pulseIn и millis() вместе работают некорректно.
вы совершенно правы я в цикл засунул 2 пульсации чтоб меньше задержка была и это очень не нравилось millis
Эти функции используют один и тот же таймер.Потому и мешают друг другу.
Функции tone , millis , pulseIn, analogWrite плохо дружат друг с другом.
хотя всеравно глюк небольшой есть. а можнокак нибудь кроме милиса решить мою задачу??
просто не понимаю первый запуск все норм а потом иногда чутли не сразу врубается
а без них я не выйду с цикла. да и не могу догнать как так получается что иногда как тока попадаю в значения на запуск avar сразу врубается без 5 сек
if((millis()-time)>5000) { time=millis(); val=1; } if(val==1) { avar(); } } val=0;Попробуйте вот так . Тип данных переменной val- bool.
про тип данных не понял
В самом начале программы впишите bool val=0;
И уберите pulseIn.
если убрать пульсацию я не смогу читать данные
"Пульсацией" вы называете функцию pulseIn ?
Значит придется убрать millis(). Выбирайте.
А лучше опишите алгоритм. Какие импульсы вам нужно измерять ?
да.я читаю приемник радиоуправляемой модели. а каким еще образом можно отложить запуск на 5 сек. может delay?
>>а каким еще образом можно отложить запуск на 5 сек. может delay?<<
Можно и так. Только не сильно ли большая задержка получается ?
Какой сигнал идет с вашего приемника ?
честно говоря даже не скажу пульсация как на сервопривод
как вариаент когда я на компе обращаюсь к ком порту чтоб увидеть значения милис обнуляется можно сделать это как нибудь в программе?
Он обнуляется потому что происходит reset (перезагрузка) МК.
голова кругом что придумать
последнее что пришло написать код часов и оринтироваться по секундной стрелки
Вообще пересмотреть все алгоритмы.
Поискать библиотеку для работы с вашим приемником.
Можно сделать так .
Но точность такого таймера сильно зависит от скорости выполнения всей программы и задержек.
Вобщем таймер неточный , но работать будет.
if (RCval>1470&RCval<1550) { val++; delay(1); if(val>5000) { val=0; avar(); }}последний не подошел почемуто не пребовляет но идею понял счас попробую. я думал просто оотсчет времени по секундам но тоже не то
У вас val объявлена как bool ?
bool может иметь только два значения 1и 0.
Если да , то бъявите ее как int или long.
я нашел счас пробую. вот думаю как ее обнулить после завершения выполнения avar может else ?
обнуляется все норм но тока теперь не запускае avar
if (RCval>1400&RCval<1520) { val++; delay(1); if(val>1500) { avar(); }} else{ val=0;}лучше не будет не будет спасибо. Думаю это самое оптимальное
пол дня промудохался
if (RCval>1470&RCval<1550) { val++; delay(1); if(val>5000) { val=0; val2=1; } if(val2==1) { avar(); } } val2=0;int val=0;
bool val2=0;
При выполнении условия первого if , будет задержка в 5 секунд. Потом будет выполняться функция avar();
решение как всегда простое тока никак до него не смог додуматься и задержек не видно
if (RCval>1400&RCval<1520) { val++; delay(1); if(val>1500) { avar(); }} else{ val=0;}Функция else необязательна. Достаточно просто обнулять val где то в программе (в начале цикла).
Подучается когда поменялись данные он и обнулится в проге много всякого Г**НА поэтому пусть лучше сразу и уходит в 0. а то 1 тронеш и второе начинает тупить
Вот поэтому я и советую вам пересмотреть алгоритмы и программу в целом. Но если вас устраивает "Лишь бы работало" , то пусть будет так.
я просто не вижу что можно поменять и так вроде всего по минимуму. Просто когда начинал делать была а потом все новые и новые условия появлялись
int strobPin[]={0,4,4,4,4,5,5,5,5}; int storbPin2[]={0,4,5,6,7,8,9}; int strobArr1[]={0,25,190,25,250}; int strobEnd[]={0,1,0}; int poy = 0; int pin = 0; int hig = 0; int PPMin = 3; // Сигнал с пульта газ 1490-1510 нетрал int PPMin2 = 2; // сигнал поворот int ledPin4 = 4; //синие левый int ledPin5 = 5;// синий правый int ledPin6 = 6;// белый int ledPin7 = 7;// красные стоп int ledPin8 = 8;// поворот лево int ledPin9 = 9;// поворот право int RCval; // длительность импульса int adj_val; // назначает что значение должно быть 0-255 int RCval2; // длительность импульса int adj_val2; // назначает что значение должно быть 0-255 void setup() { Serial.begin(9600); //serial library start pinMode(ledPin4, OUTPUT); // выходы на диоды pinMode(ledPin5, OUTPUT); pinMode(ledPin6, OUTPUT); pinMode(ledPin7, OUTPUT); pinMode(ledPin8, OUTPUT); pinMode(ledPin9, OUTPUT); pinMode(PPMin, INPUT); //газ pinMode(PPMin2, INPUT); //газ } void loop() // повороты мигают все остально не горит { RCval = pulseIn(PPMin, HIGH, 20000); //руль adj_val = map(RCval, 1080, 1880, 0, 255); // RCval2 = pulseIn(PPMin2, HIGH, 20000); //руль adj_val2 = map(RCval2, 1080, 1880, 0, 255); // hig++; if (hig == 2) hig = 0; pin++; if (pin == 9) pin = 1; poy++; if (poy == 5) poy = 1; //if(pin>0) {digitalWrite(6,1);} // if(pin>0) {stpovPr();} // if (pin>0) {digitalWrite(6,1);} digitalWrite(8,0); digitalWrite(9,0); digitalWrite(4,0); digitalWrite(5,0); digitalWrite(6,1); if ((RCval<1)&(RCval2<1)) {avar();} if ((RCval>1480)&((RCval<1530)&(RCval2>1530))) {pravo();} if ((RCval>1480)&((RCval<1530)&(RCval2<1470)&(RCval2>1))) {levo();} if ((RCval>1530)&((RCval2<1530)&(RCval2>1450))) {strob();} // еду прямо if((RCval>1530)&(RCval2>1530)) {stpovPr();} // строб право if((RCval>1530)&(RCval2<1460)) {stpovLv();} // строб лево if (RCval<1470) {digitalWrite(7,1);} else {digitalWrite(7,0);} // else {digitalWrite(7,0);} // val 1 1480-1520 //val2 1480-1520 //digitalWrite(8,(strobEnd[hig])); // digitalWrite(9,(strobEnd[hig])); //delay(strobArr1[4]); // Serial.println(int (strobPin[pin])); // Serial.println(int (strobArr1[poy])); /* Serial.print ("val: "); Serial.println(RCval); Serial.print ("val2: "); Serial.println(RCval2); */ //Serial.println(poy); //delay(1000); } void strob() {digitalWrite((strobPin[pin]),(strobEnd[hig])); delay(strobArr1[poy]); } void levo() { digitalWrite(8,(strobEnd[hig])); delay(strobArr1[4]);} void pravo() { digitalWrite(9,(strobEnd[hig])); delay(strobArr1[4]);} void avar() { digitalWrite(9,1); digitalWrite(8,1); delay(strobArr1[4]); digitalWrite(9,0); digitalWrite(8,0); delay(strobArr1[4]);} void stpovLv() {if(poy>3) {(digitalWrite(8,1));} else {(digitalWrite(8,0));} digitalWrite((strobPin[pin]),(strobEnd[hig])); delay(strobArr1[poy]); // } void stpovPr() { if(poy>3) {(digitalWrite(9,1));} else {(digitalWrite(9,0));} digitalWrite((strobPin[pin]),(strobEnd[hig])); delay(strobArr1[poy]); // }