time = millis();

Protez1999
Offline
Зарегистрирован: 08.07.2012

Использую в проге функцию  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();}

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

У вас переменная time постоянно принимает новые значения. Обнулить millis() ?! Ну ну, обнуляйте.

Замените 

time =millis();

if (RCval>1470&RCval<1550&&time>5000) {avar();}

На это.  И будет вам счастье.

if (RCval>1470&RCval<1550&&(millis()-time)>5000)

{

time=millis();

avar();

}

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

А еще лучше сделать так

 

if (RCval>1470&RCval<1550)

{

if((millis()-time)>5000)
{

time=millis();

avar();

}

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

попробовал ничего вообще не работает avar счас пробую второй вариант

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Во втором посте скобку в конце забыл поставить.

Protez1999
Offline
Зарегистрирован: 08.07.2012

тоже 0 реакции. я поставил

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Да и вообще, показывать кусок программы не есть хорошо.

Protez1999
Offline
Зарегистрирован: 08.07.2012
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]);
 
  }

   
   

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Что значит "0реакции" ? опишите конкретно что происходит.

Какой тип данных имеет переменная time ?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Вы не внимательны.  Скажите какую функцию выполняет строка 75?

Protez1999
Offline
Зарегистрирован: 08.07.2012

все убрал 75 заработала тока какая то большая пауза в мерцании. получается он выполняет avar каждые 5 сек????

Protez1999
Offline
Зарегистрирован: 08.07.2012

мне нужно чтоб онао запустило через 5 сек и выполняло пока не поменяется значение 129 строки

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 >>тока какая то большая пауза в мерцании<<

Насколько большая ?

>>получается он выполняет avar каждые 5 сек????<<

Да. Плюс время на выполнение самой функции.

Protez1999
Offline
Зарегистрирован: 08.07.2012
  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

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>тока почемуто второй запус происходит через 3 секунды хотя первый через 5<<

Наверное по тому что функции pulseIn и millis() вместе работают некорректно.

Protez1999
Offline
Зарегистрирован: 08.07.2012

вы совершенно правы я в цикл засунул 2 пульсации чтоб меньше задержка была и это очень не нравилось millis

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Эти функции используют один и тот же таймер.Потому и мешают друг другу.

Функции tone , millis , pulseIn, analogWrite  плохо дружат друг с другом.

Protez1999
Offline
Зарегистрирован: 08.07.2012

хотя всеравно глюк небольшой есть. а можнокак нибудь кроме милиса решить мою задачу??

просто не понимаю первый запуск все норм а потом иногда чутли не сразу врубается

а без них я не выйду с цикла. да и не могу догнать как так получается что иногда как тока попадаю в значения на запуск avar сразу врубается без 5 сек

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011







if((millis()-time)>5000)
	{
	 
	time=millis();
             val=1;
	 }
if(val==1)
{
	avar();
}

	}

  val=0;

Попробуйте вот так . Тип данных переменной val- bool.

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

про тип данных не понял

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

В самом начале программы впишите bool val=0;

И уберите pulseIn.

Protez1999
Offline
Зарегистрирован: 08.07.2012

если убрать пульсацию я не смогу читать данные

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

"Пульсацией" вы называете функцию pulseIn ?

Значит придется убрать millis(). Выбирайте.

А лучше опишите алгоритм. Какие импульсы вам нужно измерять ?

Protez1999
Offline
Зарегистрирован: 08.07.2012

да.я читаю приемник радиоуправляемой модели. а каким еще образом можно отложить запуск на 5 сек. может delay?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

>>а каким еще образом можно отложить запуск на 5 сек. может delay?<<

Можно и так. Только не сильно ли большая задержка получается ?

 

Какой сигнал идет с вашего приемника ?

Protez1999
Offline
Зарегистрирован: 08.07.2012

честно говоря даже не скажу пульсация как на сервопривод

Protez1999
Offline
Зарегистрирован: 08.07.2012

как вариаент когда я на компе обращаюсь к ком порту чтоб увидеть значения милис обнуляется можно сделать это как нибудь в программе?

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Он обнуляется потому что происходит reset (перезагрузка) МК.

Protez1999
Offline
Зарегистрирован: 08.07.2012

голова кругом что придумать

Protez1999
Offline
Зарегистрирован: 08.07.2012

последнее что пришло написать код часов и оринтироваться по секундной стрелки

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Вообще пересмотреть все алгоритмы.

Поискать библиотеку для работы с вашим приемником.

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Можно сделать так . 

Но точность такого таймера сильно зависит от скорости выполнения всей программы и задержек.

Вобщем таймер неточный , но работать будет.

 









if (RCval>1470&RCval<1550)
 {
	
	val++;
             delay(1);
	if(val>5000)
	{
	 
	val=0;
	 
	avar();
	}}

 

 

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

последний не подошел почемуто не пребовляет но идею понял счас попробую. я думал просто оотсчет времени по секундам но тоже не то

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

У вас val объявлена как bool ?

bool может иметь только два значения 1и 0.

Если да , то бъявите ее как int или long.

Protez1999
Offline
Зарегистрирован: 08.07.2012

я нашел счас пробую. вот думаю как ее обнулить после завершения выполнения avar может else  ?

Protez1999
Offline
Зарегистрирован: 08.07.2012

обнуляется все норм но тока теперь не запускае avar

Protez1999
Offline
Зарегистрирован: 08.07.2012
if (RCval>1400&RCval<1520)
 {  val++;	
	
             delay(1);
	if(val>1500)
	{
	avar();
	}}
else{ val=0;}

лучше не будет  не будет спасибо. Думаю это самое оптимальное

Protez1999
Offline
Зарегистрирован: 08.07.2012

пол дня промудохался

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011




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();

Protez1999
Offline
Зарегистрирован: 08.07.2012

решение как всегда простое тока никак до него не смог додуматься и задержек не видно



if (RCval>1400&RCval<1520)
 {  val++;	
	
             delay(1);
	if(val>1500)
	{
	avar();
	}}
else{ val=0;}

 

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Функция else необязательна. Достаточно просто обнулять val где то в программе (в начале цикла).

Protez1999
Offline
Зарегистрирован: 08.07.2012

Подучается когда поменялись данные он и обнулится в проге много всякого Г**НА поэтому пусть лучше сразу и уходит в 0. а то 1 тронеш и второе начинает тупить

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

Вот поэтому я и советую вам пересмотреть алгоритмы и программу в целом. Но если вас устраивает "Лишь бы работало" , то пусть будет так.

Protez1999
Offline
Зарегистрирован: 08.07.2012

я просто не вижу что можно поменять и так вроде всего по минимуму. Просто когда начинал делать была а потом все новые и новые условия появлялись

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]);
    
    //
       }