void loop ()

Rash923
Offline
Зарегистрирован: 17.12.2011

Возможно ли  в программном коде ардуино напистаь несколько void loop(1) .... void loop(2)...

Просто в проекте используется задержка в 15 секунд... 

и получается так, что система не следит за другими параметрами в течении 15 секундной задержки....

MaksMS
Offline
Зарегистрирован: 11.03.2013

Нет .

Смотря для каких целей,но в некоторых случаях используются прерывания или millis().

Rash923
Offline
Зарегистрирован: 17.12.2011

есть :

-4-е кнопки

-2 потенциометра

- светодиод

у меня задача, чтобы при одновременно зажатых 4х кнопках начинался отчет времени 15 секунд, если за это время  значение на двух потенциометрах не станут равными +/- 10% то зажечь светодио, а если значения в данный интервал (15 сек) уровнялись, то нечего не делать. 

Zizilk
Offline
Зарегистрирован: 30.05.2013

В переменную заносишь значения millis() при нажатии кнопок (условие на все входах по HIGH)и можешь в какуюнить переменную заносить флаг что идёт выполнение замера, далее в loop делаешь if ((millis()-значение переменной в которую ты внёс)>=15000)&&твой флаг выполнения){выполняешь боевой замер и сбрасываешь флаг, опционально обнуляешь счётчик}. и опционально делаешь ветку else в которой можешь выполнять замер и в случае успеха сбрасывать флаг.

Rash923
Offline
Зарегистрирован: 17.12.2011
const int MNA1 = 52;     // Knopka stop MNA1
const int MNA1ON = 34;   // Indekacija MNA1 ON
const int MNA1OFF = 35;  // Indekacija MNA1 OFF

const int MNA2 = 53;     // Knopka stop MNA2
const int MNA2ON = 36;   // Indekacija MNA2 ON
const int MNA2OFF = 37;  // Indekacija MNA2 OFF

const int STOPMN = 42;   // Indekacija STOP Nefteprovod

int buttonState1 = 0;
int buttonState2 = 0;

int TZ1 = 14;
int TZ2 = 15;

unsigned long time;


void setup() 
{
   Serial.begin(9600);
   
   pinMode(MNA1ON, OUTPUT);
   pinMode(MNA1OFF, OUTPUT);    
   pinMode(MNA1, INPUT); 

   pinMode(MNA2ON, OUTPUT);
   pinMode(MNA2OFF, OUTPUT);    
   pinMode(MNA2, INPUT);
   pinMode(STOPMN, OUTPUT);
}

void loop(){
  
   buttonState1 = digitalRead(MNA1); //schitivanie znachenija knopki STOP MNA1
   buttonState2 = digitalRead(MNA2); //schitivanie znachenija knopki STOP MNA2
   
    //otslegivanie sostojanija MNA1
   if (buttonState1 == LOW) 
  {     
    digitalWrite(MNA1ON, HIGH);
    digitalWrite(MNA1OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA1ON, LOW);
    digitalWrite(MNA1OFF, HIGH);
  }
  //otslegivanie sostojanija MNA2
   if (buttonState2 == LOW) 
  {     
    digitalWrite(MNA2ON, HIGH);
    digitalWrite(MNA2OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA2ON, LOW);
    digitalWrite(MNA2OFF, HIGH);
  }
  
  int valTZ1 = analogRead(TZ1);
  int valTZ2 = analogRead(TZ2);
  
 //uslovija otrabotki zashiti
  if (buttonState1 == HIGH && buttonState2 == HIGH && (valTZ1 - valTZ2 > 200 || valTZ2 - valTZ1 > 200))
  {
    delay(15000);
    digitalWrite(STOPMN, HIGH);
  }
  else if (buttonState1 == LOW || buttonState2 == LOW || valTZ1 - valTZ2 < 200 || valTZ2 - valTZ1 <200)
  {
    digitalWrite(STOPMN, LOW);
  }
  
  Serial.println(analogRead(TZ1));
  Serial.println(analogRead(TZ2));
  delay(1000);
  
}

Вообщем вот мой код для ардуино пока на двух кнопках и двух потенциометрах, помогите избавиться от функции делай, с миллс что то так и не смог разобраться...

toc
Offline
Зарегистрирован: 09.02.2013

Rash923, четыре кнопки можно соединить последовательно и читать значение одним пином.

vvadim
Offline
Зарегистрирован: 23.05.2012

http://arduino.ru/tutorials/BlinkWithoutDelay адаптируйте к своему коду, тут не так уж сложно

Rash923
Offline
Зарегистрирован: 17.12.2011
const int MNA1 = 52;     // Knopka stop MNA1
const int MNA1ON = 34;   // Indekacija MNA1 ON
const int MNA1OFF = 35;  // Indekacija MNA1 OFF

const int MNA2 = 53;     // Knopka stop MNA2
const int MNA2ON = 36;   // Indekacija MNA2 ON
const int MNA2OFF = 37;  // Indekacija MNA2 OFF

const int MNA3 = 50;     // Knopka stop MNA3
const int MNA3ON = 38;   // Indekacija MNA3 ON
const int MNA3OFF = 39;  // Indekacija MNA3 OFF

const int MNA4 = 51;     // Knopka stop MNA4
const int MNA4ON = 40;   // Indekacija MNA4 ON
const int MNA4OFF = 41;  // Indekacija MNA4 OFF

const int STOPMN = 42;   // Indekacija STOP Nefteprovod
const int STOPNPS = 49; // Ostanovka vseh MNA odnoi knopkoi

int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
int buttonState5 = 0;

int TZ1 = 14;              //davlenie do tranzitnogo klapana
int TZ2 = 15;              //davlenie posle tranzintogo klapana

long previousMillis = 0;// храним время последнего переключения светодиода
long interval = 15000;           // интервал между включение/выключением светодиода (15 сек)



void setup() 
{
   Serial.begin(9600);
   //prisvoenie vihodam na Arduino ih znacheneie
   pinMode(MNA1ON, OUTPUT);
   pinMode(MNA1OFF, OUTPUT);    
   pinMode(MNA1, INPUT); 

   pinMode(MNA2ON, OUTPUT);
   pinMode(MNA2OFF, OUTPUT);    
   pinMode(MNA2, INPUT);
   pinMode(STOPMN, OUTPUT);
   
   pinMode(MNA3ON, OUTPUT);
   pinMode(MNA3OFF, OUTPUT);    
   pinMode(MNA3, INPUT);
   
   pinMode(MNA4ON, OUTPUT);
   pinMode(MNA4OFF, OUTPUT);    
   pinMode(MNA4, INPUT);

   pinMode(STOPNPS, INPUT);
}

void loop(){
  
   buttonState1 = digitalRead(MNA1); //schitivanie znachenija knopki STOP MNA1
   buttonState2 = digitalRead(MNA2); //schitivanie znachenija knopki STOP MNA2
   buttonState3 = digitalRead(MNA3); //schitivanie znachenija knopki STOP MNA3
   buttonState4 = digitalRead(MNA4); //schitivanie znachenija knopki STOP MNA4
   buttonState5 = digitalRead(STOPNPS); //schitivanie znachenija knopki STOP NPS
   
    //otslegivanie sostojanija MNA1
   if (buttonState1 == LOW) 
  {     
    digitalWrite(MNA1ON, HIGH);
    digitalWrite(MNA1OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA1ON, LOW);
    digitalWrite(MNA1OFF, HIGH);
  }
  //otslegivanie sostojanija MNA2
   if (buttonState2 == LOW) 
  {     
    digitalWrite(MNA2ON, HIGH);
    digitalWrite(MNA2OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA2ON, LOW);
    digitalWrite(MNA2OFF, HIGH);
  }
  
  //otslegivanie sostojanija MNA3
   if (buttonState3 == LOW) 
  {     
    digitalWrite(MNA3ON, HIGH);
    digitalWrite(MNA3OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA3ON, LOW);
    digitalWrite(MNA3OFF, HIGH);
  }
  
  //otslegivanie sostojanija MNA4
   if (buttonState4 == LOW) 
  {     
    digitalWrite(MNA4ON, HIGH);
    digitalWrite(MNA4OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA4ON, LOW);
    digitalWrite(MNA4OFF, HIGH);
  }
  
    //otslegivanie sostojanija STOPNPS
   if (buttonState5 == HIGH) 
  {     
    digitalWrite(MNA1ON, LOW);
    digitalWrite(MNA1OFF, HIGH);  
    digitalWrite(MNA2ON, LOW);
    digitalWrite(MNA2OFF, HIGH);
    digitalWrite(MNA3ON, LOW);
    digitalWrite(MNA3OFF, HIGH);
    digitalWrite(MNA4ON, LOW);
    digitalWrite(MNA4OFF, HIGH);
  } 
  else 
  {
    
  }
  
  int valTZ1 = analogRead(TZ1);
  int valTZ2 = analogRead(TZ2);
  
 unsigned long currentMillis = millis();
 
 //uslovija otrabotki zashiti
  if ((buttonState1 == HIGH && buttonState2 == HIGH && buttonState3 == HIGH && buttonState4 == HIGH && (valTZ1 - valTZ2 > 200 || valTZ2 - valTZ1 > 200)) || (buttonState5 == HIGH && (valTZ1 - valTZ2 > 200 || valTZ2 - valTZ1 > 200)))
  {
    if(currentMillis - previousMillis > interval)
    {
    previousMillis = currentMillis;
    digitalWrite(STOPMN, HIGH);
    }
   }
  else if (valTZ1 - valTZ2 < 200 || valTZ2 - valTZ1 <200)
  {
    digitalWrite(STOPMN, LOW);
  }
  
  //Serial.println(analogRead(TZ1));
  //Serial.println(analogRead(TZ2));
  //delay(1000);
  
}

 

 
Переделал.... Все заработало!! Спасибо большое!!
Rash923
Offline
Зарегистрирован: 17.12.2011

Заметил следующий недостаток.

Я так понял миллис ведет постоянный отсчет, т.е. постоянно считает от 0 до 15 секунд в моем случае, и если к концу отсчета 15 секун все условия совпали, то светодиод включается. Нельзя сдеать так чтобы миллис начинал отсчет, только после того как совпадут все условия?

Просто на данный момент получается следующее: нажал я на четыре кнопки, вывел потенциометры в разность, по истечении 15 секун светодиод загорается, но при повторении данного алгоритма  задержка становится меньше, бывает что если удачно попасть, то и сразу отрабатывает... Как с этим бороться?

Rash923
Offline
Зарегистрирован: 17.12.2011

http://www.arduino.ru/forum/programmirovanie/time-millis

пробовал как здесь тоже не получается

Может кто знает как обнулять Millis?

Rash923
Offline
Зарегистрирован: 17.12.2011
const int MNA1 = 52;     // Knopka stop MNA1
const int MNA1ON = 34;   // Indekacija MNA1 ON
const int MNA1OFF = 35;  // Indekacija MNA1 OFF

const int MNA2 = 53;     // Knopka stop MNA2
const int MNA2ON = 36;   // Indekacija MNA2 ON
const int MNA2OFF = 37;  // Indekacija MNA2 OFF

const int MNA3 = 50;     // Knopka stop MNA3
const int MNA3ON = 38;   // Indekacija MNA3 ON
const int MNA3OFF = 39;  // Indekacija MNA3 OFF

const int MNA4 = 51;     // Knopka stop MNA4
const int MNA4ON = 40;   // Indekacija MNA4 ON
const int MNA4OFF = 41;  // Indekacija MNA4 OFF

const int STOPMN = 42;   // Indekacija STOP Nefteprovod
const int STOPNPS = 49; // Ostanovka vseh MNA odnoi knopkoi

int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
int buttonState5 = 0;

int TZ1 = 14;              //davlenie do tranzitnogo klapana
int TZ2 = 15;              //davlenie posle tranzintogo klapana

unsigned long time;
long interval = 15000;           // задержка времени для выполнения команды (15 сек)



void setup() 
{
   Serial.begin(9600);
   //prisvoenie vihodam na Arduino ih znacheneie
   pinMode(MNA1ON, OUTPUT);
   pinMode(MNA1OFF, OUTPUT);    
   pinMode(MNA1, INPUT); 

   pinMode(MNA2ON, OUTPUT);
   pinMode(MNA2OFF, OUTPUT);    
   pinMode(MNA2, INPUT);
   pinMode(STOPMN, OUTPUT);
   
   pinMode(MNA3ON, OUTPUT);
   pinMode(MNA3OFF, OUTPUT);    
   pinMode(MNA3, INPUT);
   
   pinMode(MNA4ON, OUTPUT);
   pinMode(MNA4OFF, OUTPUT);    
   pinMode(MNA4, INPUT);

   pinMode(STOPNPS, INPUT);
}

void loop(){
  
   buttonState1 = digitalRead(MNA1); //schitivanie znachenija knopki STOP MNA1
   buttonState2 = digitalRead(MNA2); //schitivanie znachenija knopki STOP MNA2
   buttonState3 = digitalRead(MNA3); //schitivanie znachenija knopki STOP MNA3
   buttonState4 = digitalRead(MNA4); //schitivanie znachenija knopki STOP MNA4
   buttonState5 = digitalRead(STOPNPS); //schitivanie znachenija knopki STOP NPS
   
    //otslegivanie sostojanija MNA1
   if (buttonState1 == LOW) 
  {     
    digitalWrite(MNA1ON, HIGH);
    digitalWrite(MNA1OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA1ON, LOW);
    digitalWrite(MNA1OFF, HIGH);
  }
  //otslegivanie sostojanija MNA2
   if (buttonState2 == LOW) 
  {     
    digitalWrite(MNA2ON, HIGH);
    digitalWrite(MNA2OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA2ON, LOW);
    digitalWrite(MNA2OFF, HIGH);
  }
  
  //otslegivanie sostojanija MNA3
   if (buttonState3 == LOW) 
  {     
    digitalWrite(MNA3ON, HIGH);
    digitalWrite(MNA3OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA3ON, LOW);
    digitalWrite(MNA3OFF, HIGH);
  }
  
  //otslegivanie sostojanija MNA4
   if (buttonState4 == LOW) 
  {     
    digitalWrite(MNA4ON, HIGH);
    digitalWrite(MNA4OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA4ON, LOW);
    digitalWrite(MNA4OFF, HIGH);
  }
  
    //otslegivanie sostojanija STOPNPS
   if (buttonState5 == HIGH) 
  {     
    digitalWrite(MNA1ON, LOW);
    digitalWrite(MNA1OFF, HIGH);  
    digitalWrite(MNA2ON, LOW);
    digitalWrite(MNA2OFF, HIGH);
    digitalWrite(MNA3ON, LOW);
    digitalWrite(MNA3OFF, HIGH);
    digitalWrite(MNA4ON, LOW);
    digitalWrite(MNA4OFF, HIGH);
  } 
  else 
  {
    
  }
  
  int valTZ1 = analogRead(TZ1);
  int valTZ2 = analogRead(TZ2);
  
 //uslovija otrabotki zashiti
  if ((buttonState1 == HIGH && buttonState2 == HIGH && buttonState3 == HIGH && buttonState4 == HIGH && (valTZ1 - valTZ2 > 200 || valTZ2 - valTZ1 > 200)) || (buttonState5 == HIGH && (valTZ1 - valTZ2 > 200 || valTZ2 - valTZ1 > 200)))
  {
    if((millis() - time) > interval)
    {
    digitalWrite(STOPMN, HIGH);
    }
   }
  else if (valTZ1 - valTZ2 < 200 || valTZ2 - valTZ1 <200)
  {
    digitalWrite(STOPMN, LOW);
  }
  time = millis();
  //Serial.println(analogRead(TZ1));
  //Serial.println(analogRead(TZ2));
  //delay(1000);
  
}

вообщем вот с таким кодом работает все гуд!!

Суть в том что в конце цикла мы присваиваем  Time  значении millis на момент окончания цикла, таким образом в следующем цикле можно выставить условие отработки  если разница текущего значения millis и millis  из предидущего цикла равно 15сек, то выполнить действие. т.е. 145 строчкой этого кода мы даем себе точку опоры. ;)

GreenDer
Offline
Зарегистрирован: 06.09.2013

Rash923 пишет:

 

Может кто знает как обнулять Millis?

Присваивай значение millis своей переменной по мере необходимости. Ну и обнуляй переменную когда сочтёш нужным.

Rash923
Offline
Зарегистрирован: 17.12.2011

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

Rash923
Offline
Зарегистрирован: 17.12.2011

конечный код, может кому будет интересно, все работает круто;)

 

//zadvigka №1
int dav0 = 0; //davlenie do zadvigki
int dav1 = 1; //davlenie posle zadvigki
int ledp1 = 44; //indekacija otrabotki pervogo poroga (TU->STOP; TU->OPEN)
int ledp2 = 45; //indekacija otrabotki vtorogo poroga (TU->STOP; TU->OPEN; TU->STOP NEFTEPROVOD)

//zadvigka №2
int dav2 = 2;
int dav3 = 3;
int ledp3 = 22;
int ledp4 = 23;

//zadvigka №3
int dav4 = 4;
int dav5 = 5;
int ledp5 = 24;
int ledp6 = 25;

//zadvigka №4
int dav6 = 6;
int dav7 = 7;
int ledp7 = 26;
int ledp8 = 27;

//zadvigka №5
int dav8 = 8;
int dav9 = 9;
int ledp9 = 32;
int ledp10 = 33;

//zadvigka №6
int dav10 = 10;
int dav11 = 11;
int ledp11 = 30;
int ledp12 = 31;

//zadvigka №7
int dav12 = 12;
int dav13 = 13;
int ledp13 = 28;
int ledp14 = 29;

//prisvoenie predidushemu znacheniu davlenija, znachenie deistvuushego
int lastdav0 = dav0; 
int lastdav1 = dav1;
int lastdav2 = dav2;
int lastdav3 = dav3;
int lastdav4 = dav4;
int lastdav5 = dav5;
int lastdav6 = dav6;
int lastdav7 = dav7;
int lastdav8 = dav8;
int lastdav9 = dav9;
int lastdav10 = dav10;
int lastdav11 = dav11;
int lastdav12 = dav12;
int lastdav13 = dav13;

int porog1 = 20;   //ustavka pervogo poroga dlja lneinoi zashiti (skorost' izmenenija)
int porog2 = 50;  //ustavka vtorogo poroga dlja lneinoi zashiti  (skorost' izmenenija)

const int MNA1 = 52;     // Knopka stop MNA1
const int MNA1ON = 34;   // Indekacija MNA1 ON
const int MNA1OFF = 35;  // Indekacija MNA1 OFF

const int MNA2 = 53;
const int MNA2ON = 36;
const int MNA2OFF = 37;

const int MNA3 = 50;
const int MNA3ON = 38;
const int MNA3OFF = 39;

const int MNA4 = 51;
const int MNA4ON = 40;
const int MNA4OFF = 41;

const int STOPMN = 42;   // Indekacija STOP Nefteprovod
const int STOPNPS = 49;  // Knopka STOP NPS

int buttonState1 = 0;    //deklaraciaja
int buttonState2 = 0;
int buttonState3 = 0;
int buttonState4 = 0;
int buttonState5 = 0;

int TZ1 = 14;            //davlenie do tranzitnogo klapana
int TZ2 = 15;            //davlenie posle tranzintogo klapana


long interval2 = 15000;  //ustavka vremeni na otkritie tranzitnogo klapana
long interval = 1000;    //vremja prohogdenija komandi na lineinoi chasti

long time = 0;   //deklaracija
long time1 = 0;
long time2 = 0;
long time3 = 0;
long time4 = 0;
long time5 = 0;
long time6 = 0;
long time7 = 0;

void setup()
{
  Serial.begin(9600);
  pinMode (ledp1, OUTPUT); //prisvoenie diskretnim vihodam, znachenie vihod
  pinMode (ledp2, OUTPUT);
  pinMode (ledp3, OUTPUT);
  pinMode (ledp4, OUTPUT);
  pinMode (ledp5, OUTPUT);
  pinMode (ledp6, OUTPUT);
  pinMode (ledp7, OUTPUT);
  pinMode (ledp8, OUTPUT);
  pinMode (ledp9, OUTPUT);
  pinMode (ledp10, OUTPUT);
  pinMode (ledp11, OUTPUT);
  pinMode (ledp12, OUTPUT);
  pinMode (ledp13, OUTPUT);
  pinMode (ledp14, OUTPUT);
 
   pinMode(MNA1ON, OUTPUT);
   pinMode(MNA1OFF, OUTPUT);    
   pinMode(MNA1, INPUT); 

   pinMode(MNA2ON, OUTPUT);
   pinMode(MNA2OFF, OUTPUT);    
   pinMode(MNA2, INPUT);
   
   pinMode(MNA3ON, OUTPUT);
   pinMode(MNA3OFF, OUTPUT);    
   pinMode(MNA3, INPUT);
   
   pinMode(MNA4ON, OUTPUT);
   pinMode(MNA4OFF, OUTPUT);    
   pinMode(MNA4, INPUT);
   
   pinMode(STOPMN, OUTPUT);
   pinMode(STOPNPS, INPUT);
}

void loop()
{
  
///////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////Lineinaja zashita//////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
    
//algoritm dlja zadvigki №1
int dav0val = analogRead(dav0); //schitivanie davlenija do zadvigki
int dav1val = analogRead(dav1); // schitivanie davlenija posle zadvigki
//uslovie otrabotki pervogo poroga
if ((dav0val - lastdav0 > porog1 && dav0val - lastdav0 < porog2) && (lastdav1 - dav1val > porog1 && lastdav1 - dav1val  < porog2))
{
  digitalWrite(ledp1, HIGH); //indekacija otrabotki pervogo poroga
  digitalWrite(ledp2, LOW);  //indekacija otrabotki vtorogo poroga
}
//vremja prohogdenija komandi dlja pervogo poroga
if((millis() - time1) > interval)
{
 //uslovie snjatija flaga pervogo poroga
 if((dav0val - lastdav0 < porog1) || (lastdav1 - dav1val < porog1) );
{
digitalWrite(ledp1, LOW); 
digitalWrite(ledp2, LOW); 
}
}
//uslovie otrabotki vtorogo poroga
if ((dav0val - lastdav0 > porog2) && (lastdav1 - dav1val > porog2))
{
  digitalWrite(ledp1, LOW);
  digitalWrite(ledp2, HIGH);
}
//vremja prohogdenija komandi dlja vtorogo poroga
if((millis() - time1) > interval)
{
 //uslovie snjatija flaga vtorogo poroga
 if((dav0val - lastdav0 < porog1) || (lastdav1 - dav1val < porog1));
{
digitalWrite(ledp1, LOW);
digitalWrite(ledp2, LOW);
  lastdav0 = dav0val; //prisvoenie predidushemu znacheniu, deistvuushee znachenie davlenija
  lastdav1 = dav1val;
  time1=millis();
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//algoritm dlja zadvigki №2
int dav2val = analogRead(dav2);
int dav3val = analogRead(dav3);

if ((dav2val - lastdav2 > porog1 && dav2val - lastdav2 < porog2) && (lastdav3 - dav3val > porog1 && lastdav3 - dav3val  < porog2))
{
  digitalWrite(ledp3, HIGH);
  digitalWrite(ledp4, LOW);
}
if((millis() - time2) > interval)
{
 if((dav2val - lastdav2 < porog1) || (lastdav3 - dav3val < porog1) );
{
digitalWrite(ledp3, LOW);
digitalWrite(ledp4, LOW);
}
}
if ((dav2val - lastdav2 > porog2) && (lastdav3 - dav3val > porog2))
{
  digitalWrite(ledp3, LOW);
  digitalWrite(ledp4, HIGH);
}
if((millis() - time2) > interval)
{
 if((dav2val - lastdav2 < porog1) || (lastdav3 - dav3val < porog1));
{
digitalWrite(ledp3, LOW);
digitalWrite(ledp4, LOW);
  lastdav2 = dav2val;
  lastdav3 = dav3val;
  time2=millis();
}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//algoritm dlja zadvigki №3
int dav4val = analogRead(dav4);
int dav5val = analogRead(dav5);

if ((dav4val - lastdav4 > porog1 && dav4val - lastdav4 < porog2) && (lastdav5 - dav5val > porog1 && lastdav5 - dav5val  < porog2))
{
  digitalWrite(ledp5, HIGH);
  digitalWrite(ledp6, LOW);
}
if((millis() - time3) > interval)
{
 if((dav4val - lastdav4 < porog1) || (lastdav5 - dav5val < porog1) );
{
digitalWrite(ledp5, LOW);
digitalWrite(ledp6, LOW);
}
}
if ((dav4val - lastdav4 > porog2) && (lastdav5 - dav5val > porog2))
{
  digitalWrite(ledp5, LOW);
  digitalWrite(ledp6, HIGH);
}
if((millis() - time3) > interval)
{
 if((dav4val - lastdav4 < porog1) || (lastdav5 - dav5val < porog1));
{
digitalWrite(ledp5, LOW);
digitalWrite(ledp6, LOW);
  lastdav4 = dav4val;
  lastdav5 = dav5val;
  time3=millis();
}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//algoritm dlja zadvigki №4
int dav6val = analogRead(dav6);
int dav7val = analogRead(dav7);

if ((dav6val - lastdav6 > porog1 && dav6val - lastdav6 < porog2) && (lastdav7 - dav7val > porog1 && lastdav7 - dav7val  < porog2))
{
  digitalWrite(ledp7, HIGH);
  digitalWrite(ledp8, LOW);
}
if((millis() - time4) > interval)
{
 if((dav6val - lastdav6 < porog1) || (lastdav7 - dav7val < porog1) );
{
digitalWrite(ledp7, LOW);
digitalWrite(ledp8, LOW);
}
}
if ((dav6val - lastdav6 > porog2) && (lastdav7 - dav7val > porog2))
{
  digitalWrite(ledp7, LOW);
  digitalWrite(ledp8, HIGH);
}
if((millis() - time4) > interval)
{
 if((dav6val - lastdav6 < porog1) || (lastdav7 - dav7val < porog1));
{
digitalWrite(ledp7, LOW);
digitalWrite(ledp8, LOW);
  lastdav6 = dav6val;
  lastdav7 = dav7val;
  time4=millis();
}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//algoritm dlja zadvigki №5
int dav8val = analogRead(dav8);
int dav9val = analogRead(dav9);

if ((dav8val - lastdav8 > porog1 && dav8val - lastdav8 < porog2) && (lastdav9 - dav9val > porog1 && lastdav9 - dav9val  < porog2))
{
  digitalWrite(ledp9, HIGH);
  digitalWrite(ledp10, LOW);
}
if((millis() - time5) > interval)
{
 if((dav8val - lastdav8 < porog1) || (lastdav9 - dav9val < porog1) );
{
digitalWrite(ledp9, LOW);
digitalWrite(ledp10, LOW);
}
}
if ((dav8val - lastdav8 > porog2) && (lastdav9 - dav9val > porog2))
{
  digitalWrite(ledp9, LOW);
  digitalWrite(ledp10, HIGH);
}
if((millis() - time5) > interval)
{
 if((dav8val - lastdav8 < porog1) || (lastdav9 - dav9val < porog1));
{
digitalWrite(ledp9, LOW);
digitalWrite(ledp10, LOW);
  lastdav8 = dav8val;
  lastdav9 = dav9val;
  time5=millis();
}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//algoritm dlja zadvigki №6
int dav10val = analogRead(dav10);
int dav11val = analogRead(dav11);

if ((dav10val - lastdav10 > porog1 && dav10val - lastdav10 < porog2) && (lastdav11 - dav11val > porog1 && lastdav11 - dav11val  < porog2))
{
  digitalWrite(ledp11, HIGH);
  digitalWrite(ledp12, LOW);
}
if((millis() - time6) > interval)
{
 if((dav10val - lastdav10 < porog1) || (lastdav11 - dav11val < porog1) );
{
digitalWrite(ledp11, LOW);
digitalWrite(ledp12, LOW);
}
}
if ((dav10val - lastdav10 > porog2) && (lastdav11 - dav11val > porog2))
{
  digitalWrite(ledp11, LOW);
  digitalWrite(ledp12, HIGH);
}
if((millis() - time6) > interval)
{
 if((dav10val - lastdav10 < porog1) || (lastdav11 - dav11val < porog1));
{
digitalWrite(ledp11, LOW);
digitalWrite(ledp12, LOW);
  lastdav10 = dav10val;
  lastdav11 = dav11val;
  time6=millis();
}
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//algoritm dlja zadvigki №7
int dav12val = analogRead(dav12);
int dav13val = analogRead(dav13);

if ((dav12val - lastdav12 > porog1 && dav12val - lastdav12 < porog2) && (lastdav13 - dav13val > porog1 && lastdav13 - dav13val  < porog2))
{
  digitalWrite(ledp13, HIGH);
  digitalWrite(ledp14, LOW);
}
if((millis() - time7) > interval)
{
 if((dav12val - lastdav12 < porog1) || (lastdav13 - dav13val < porog1) );
{
digitalWrite(ledp13, LOW);
digitalWrite(ledp14, LOW);
}
}
if ((dav12val - lastdav12 > porog2) && (lastdav13 - dav13val > porog2))
{
  digitalWrite(ledp13, LOW);
  digitalWrite(ledp14, HIGH);
}
if((millis() - time7) > interval)
{
 if((dav12val - lastdav12 < porog1) || (lastdav13 - dav13val < porog1));
{
digitalWrite(ledp13, LOW);
digitalWrite(ledp14, LOW);
  lastdav12 = dav12val;
  lastdav13 = dav13val;
  time7=millis();
}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////Stancionnaja zashita/////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////

   buttonState1 = digitalRead(MNA1); //schitivanie znachenija knopki STOP MNA1
   buttonState2 = digitalRead(MNA2); 
   buttonState3 = digitalRead(MNA3); 
   buttonState4 = digitalRead(MNA4); 
   buttonState5 = digitalRead(STOPNPS); //schitivanie znachenija knopki STOP MNA2   
    
    //otslegivanie sostojanija MNA1
   if (buttonState1 == LOW) 
  {     
    digitalWrite(MNA1ON, HIGH);
    digitalWrite(MNA1OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA1ON, LOW);
    digitalWrite(MNA1OFF, HIGH);
  }
  
  //otslegivanie sostojanija MNA2
   if (buttonState2 == LOW) 
  {     
    digitalWrite(MNA2ON, HIGH);
    digitalWrite(MNA2OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA2ON, LOW);
    digitalWrite(MNA2OFF, HIGH);
  }
  
  //otslegivanie sostojanija MNA3
   if (buttonState3 == LOW) 
  {     
    digitalWrite(MNA3ON, HIGH);
    digitalWrite(MNA3OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA3ON, LOW);
    digitalWrite(MNA3OFF, HIGH);
  }
  
  //otslegivanie sostojanija MNA4
   if (buttonState4 == LOW) 
  {     
    digitalWrite(MNA4ON, HIGH);
    digitalWrite(MNA4OFF, LOW);  
  } 
  else 
  {
    digitalWrite(MNA4ON, LOW);
    digitalWrite(MNA4OFF, HIGH);
  }
  
  //otslegivanie sostojanija STOPNPS
  if (buttonState5 == HIGH) 
  {     
    digitalWrite(MNA1ON, LOW);
    digitalWrite(MNA1OFF, HIGH);  
    digitalWrite(MNA2ON, LOW);
    digitalWrite(MNA2OFF, HIGH);
    digitalWrite(MNA3ON, LOW);
    digitalWrite(MNA3OFF, HIGH);
    digitalWrite(MNA4ON, LOW);
    digitalWrite(MNA4OFF, HIGH);
  } 
  else 
  {
  }
      
  int valTZ1 = analogRead(TZ1);
  int valTZ2 = analogRead(TZ2);
   
 //uslovija otrabotki zashiti
  if ((buttonState1 == HIGH && buttonState2 == HIGH && buttonState3 == HIGH && buttonState4 == HIGH) || buttonState5 == HIGH)
  {
    if((millis() - time) > interval2)
      {
        if(valTZ1 - valTZ2 > 100)
        {
       digitalWrite(STOPMN, HIGH);
        }
      }
   }
     
   else if ((valTZ1 - valTZ2 < 100) || buttonState1 == HIGH || buttonState2 == HIGH || buttonState3 == HIGH || buttonState4 == HIGH || buttonState5 == HIGH)
  {
    digitalWrite(STOPMN, LOW);
    time=millis();
  }

//Serial.println(analogRead(dav1));
//Serial.println(analogRead(dav2));
//delay(1000);
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Да уж, Тойота со своими 11000 переменных отдыхает :)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

http://arduino.ru/Reference/FunctionDeclaration

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

да и комментарии на транслите это зачем?

вот еще почитайте. 

http://arduino.ru/Reference/Array

у вас много переменных. если так много дейсвительно надо используйте массив

Rash923
Offline
Зарегистрирован: 17.12.2011

Спасибо ребят!) обязательно прочту;) просто соояла задача очень быстро сделать и чтоб работало.... А я во всем этом деле новичек)) потом обязательно переделаю;)

leon_mz
Offline
Зарегистрирован: 06.12.2013

>> Возможно ли  в программном коде ардуино напистаь несколько void loop(1) .... void loop(2)...

А почему нельзя? Вполне можно. Берем файлик arduino/cores/arduino/main.cpp и делаем себе возможность исполнения произвольного кода в прозвольном порядке. Хотя проще обойтись обычным распараллеливанием внутри void loop(void)

maksim
Offline
Зарегистрирован: 12.02.2012

leon_mz пишет:

А почему нельзя? Вполне можно. Берем файлик arduino/cores/arduino/main.cpp и делаем себе возможность исполнения произвольного кода в прозвольном порядке. Хотя проще обойтись обычным распараллеливанием внутри void loop(void)

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

leon_mz
Offline
Зарегистрирован: 06.12.2013

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

maksim
Offline
Зарегистрирован: 12.02.2012

Даже подобие вашим способом сделать не получится.

com
Offline
Зарегистрирован: 06.09.2013

успешная реализация многопоточности

http://robocraft.ru/blog/985.html

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

MaksMS пишет:

Нет .

НЕ ОБОБЩАЙТЕ!

Читайте внимательней и прекратите уже ковыряться в старье :) Следите так сказать за новыми трендами..

http://arduino.cc/en/Tutorial/MultipleBlinks

MaksMS
Offline
Зарегистрирован: 11.03.2013

сомневаюсь,что у создавшего тему Arduino Due ...В большинстве случаев эта Arduino Due - что пушкой по воробъям )

"старье" дешевле и его хватает на большинство задач.. Иногда хватает даже attiny13 и не ставить же вместо её  Arduino Due..

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

MaksMS пишет:

сомневаюсь,что у создавшего тему Arduino Due ...В большинстве случаев эта Arduino Due - что пушкой по воробъям )

"старье" дешевле и его хватает на большинство задач.. Иногда хватает даже attiny13 и не ставить же вместо её  Arduino Due..

я бы вообще никуда АРДУИНО не ставил! ибо взять просто камень атмеловский и уже достаточно :)

SAM3X стоит 5 баксов.

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

leon_mz пишет:

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

зачем изобретать велосипед, если есть готовое решение типа FreeRTOS  и подобных. На старшие атмелы поставить можно. Там и таймеры свои есть и дофига всего. Но мастырить ОСРВ для 4 кнопок и потенциометра смешно :)

Rash923, алгоритм задержек надо сквозным делать, чтобы не сидеть в циклах ожидания, как вам выше подсказали

Rash923
Offline
Зарегистрирован: 17.12.2011

Да я уже разобрался тут во всем;) используя функцию миллис)) просто сижу состороны наблюдаю за боталиями.... Может чего умного напишут;)

mishgan
Offline
Зарегистрирован: 25.04.2014

Rash923 пишет:

Возможно ли  в программном коде ардуино напистаь несколько void loop(1) .... void loop(2)...

Я делаю несколько параллельных циклов так

void setup() 
{
cikl1();
}
 
 
void loop() 
{
// код 
}

void cikl1 () {
   while(1){
  // код 
  }
}

...

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Они не выполняются параллельно.

satelit 2
Offline
Зарегистрирован: 04.12.2016

не хотел новую тему открывать, сегодня напишу здесь. видел несколько проектов с несколькими loop ? обьясните по русски как она работает?

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

satelit 2 пишет:

не хотел новую тему открывать, сегодня напишу здесь. видел несколько проектов с несколькими loop ? обьясните по русски как она работает?

я видел баб с тремя сиськами - как это по-русски работает?

satelit 2
Offline
Зарегистрирован: 04.12.2016

тебе лишь бы постебаться, не хочешь говорить, молчи

 

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

satelit 2 пишет:

тебе лишь бы постебаться, не хочешь говорить, молчи

покажи, где ты видел больше одного лупа?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016
void setup() {}

void loop()
{
loop1();
loop2();
loop3();
}

void loop1() {
// fucking shit 1
}

void loop2() {
// fucking shit 2
}

void loop3() {
// ficking shit 3
}

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

ну так тут один loop(), остальное просто функции с похожим названием.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

wdrakula пишет:

void setup() {}

void loop()
{
loop1();
loop2();
loop3();
}

void loop1() {
// fuckin shit 1
}

void loop2() {
// fucking shit 2
}

void loop3() {
// ficking shit 3
}

 

типо - открыл одну сиську, а там три сиськи.

GreenDer
Offline
Зарегистрирован: 06.09.2013

В чистом AVR такого вопроса даже существовать не может. Решается прерываниями. В Ардуине таки реально сделать несколько  псевдоЛУПОВ, но это костыли.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

GreenDer пишет:

В чистом AVR такого вопроса даже существовать не может. Решается прерываниями. В Ардуине таки реально сделать несколько  псевдоЛУПОВ, но это костыли.

ты случайно не внук Онкеля?

GreenDer
Offline
Зарегистрирован: 06.09.2013

нет.

GreenDer
Offline
Зарегистрирован: 06.09.2013

кто такой Онкель? И чем он прославился?

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

GreenDer пишет:

кто такой Онкель? И чем он прославился?

костылями и фонтанами

satelit 2
Offline
Зарегистрирован: 04.12.2016

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

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

Tomasina пишет:

ну так тут один loop(), остальное просто функции с похожим названием.

Котищще! Ты мне моск не размножай!

Ходит как утка, крякает, как утка и выглядит, как утка - значит утка и есть! ;)

GreenDer
Offline
Зарегистрирован: 06.09.2013

нет. это нереально. разве что светодидами моргать.

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

Клапауций 823 пишет:

типо - открыл одну сиську, а там три сиськи.

 - Три сиськи? - Зачёт! (с)

satelit 2
Offline
Зарегистрирован: 04.12.2016

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

#include <Thread.h>  // подключение библиотеки ArduinoThread
const int soundPin = 3;  // переменная с номером пина пьезоэлемента
const int ledPin = 13;  // переменная с номером пина светодиода

Thread ledThread = Thread(); // создаём поток управления светодиодом
Thread soundThread = Thread(); // создаём поток управления сиреной

void setup() {
    pinMode(soundPin, OUTPUT); // объявляем пин 3 как выход.
    pinMode(ledPin, OUTPUT);   // объявляем пин 13 как выход.

    ledThread.onRun(ledBlink);  // назначаем потоку задачу
    ledThread.setInterval(1000); // задаём интервал срабатывания, мсек
    
    soundThread.onRun(sound);     // назначаем потоку задачу
    soundThread.setInterval(20); // задаём интервал срабатывания, мсек
}

void loop() {
    // Проверим, пришло ли время переключиться светодиоду:
    if (ledThread.shouldRun())
        ledThread.run(); // запускаем поток
    
    // Проверим, пришло ли время сменить тональность сирены:
    if (soundThread.shouldRun())
        soundThread.run(); // запускаем поток
}

// Поток светодиода:
void ledBlink() { 
    static bool ledStatus = false;    // состояние светодиода Вкл/Выкл
    ledStatus = !ledStatus;           // инвертируем состояние
    digitalWrite(ledPin, ledStatus);  // включаем/выключаем светодиод
}

 // Поток сирены:
void sound() { 
    static int ton = 100;  // тональность звука, Гц
    tone(soundPin, ton);  // включаем сирену на "ton" Гц
    if (ton <= 500) {  // до частоты 500 Гц 
        ton += 100;  // увеличиваем тональность сирены
    }
    else {  // по достижении 500 Гц
        ton = 100;  // сбрасываем тональность до 100 Гц
    }
}

 

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

satelit 2 пишет:

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

точно - в одной сиське молоко, в другой пиво, в третьей водка.

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

GreenDer пишет:

нет. это нереально. разве что светодидами моргать.

Бобёр! Выдыхай уже! Посмотри в Википедии понятие "шутка".

А то я из-пацтола печатать уже не могу!

satelit 2
Offline
Зарегистрирован: 04.12.2016

ладно, пусть будут сиськи. если вдруг появиться delay в одной сиське, то остальные сиськи будут ждать, или работать дальше

GreenDer
Offline
Зарегистрирован: 06.09.2013

лаврова на вас не хватает.