void loop ()
- Войдите на сайт для отправки комментариев
Сб, 16/11/2013 - 22:07
Возможно ли в программном коде ардуино напистаь несколько void loop(1) .... void loop(2)...
Просто в проекте используется задержка в 15 секунд...
и получается так, что система не следит за другими параметрами в течении 15 секундной задержки....
Нет .
Смотря для каких целей,но в некоторых случаях используются прерывания или millis().
есть :
-4-е кнопки
-2 потенциометра
- светодиод
у меня задача, чтобы при одновременно зажатых 4х кнопках начинался отчет времени 15 секунд, если за это время значение на двух потенциометрах не станут равными +/- 10% то зажечь светодио, а если значения в данный интервал (15 сек) уровнялись, то нечего не делать.
В переменную заносишь значения millis() при нажатии кнопок (условие на все входах по HIGH)и можешь в какуюнить переменную заносить флаг что идёт выполнение замера, далее в loop делаешь if ((millis()-значение переменной в которую ты внёс)>=15000)&&твой флаг выполнения){выполняешь боевой замер и сбрасываешь флаг, опционально обнуляешь счётчик}. и опционально делаешь ветку else в которой можешь выполнять замер и в случае успеха сбрасывать флаг.
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); }Вообщем вот мой код для ардуино пока на двух кнопках и двух потенциометрах, помогите избавиться от функции делай, с миллс что то так и не смог разобраться...
Rash923, четыре кнопки можно соединить последовательно и читать значение одним пином.
http://arduino.ru/tutorials/BlinkWithoutDelay адаптируйте к своему коду, тут не так уж сложно
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); }Заметил следующий недостаток.
Я так понял миллис ведет постоянный отсчет, т.е. постоянно считает от 0 до 15 секунд в моем случае, и если к концу отсчета 15 секун все условия совпали, то светодиод включается. Нельзя сдеать так чтобы миллис начинал отсчет, только после того как совпадут все условия?
Просто на данный момент получается следующее: нажал я на четыре кнопки, вывел потенциометры в разность, по истечении 15 секун светодиод загорается, но при повторении данного алгоритма задержка становится меньше, бывает что если удачно попасть, то и сразу отрабатывает... Как с этим бороться?
http://www.arduino.ru/forum/programmirovanie/time-millis
пробовал как здесь тоже не получается
Может кто знает как обнулять Millis?
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 строчкой этого кода мы даем себе точку опоры. ;)
Может кто знает как обнулять Millis?
Присваивай значение millis своей переменной по мере необходимости. Ну и обнуляй переменную когда сочтёш нужным.
Заметил, что если использовать один и тотже алгоритм с миллис, но для разных if то миллис начинает тупить.... Интервалы приходится уменьшать...
конечный код, может кому будет интересно, все работает круто;)
//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); }вот что значит ардуину использовать. памяти куча. и можно использовать вместо функций для одинаковых кусков вставлять один и тот же код много много раз
Да уж, Тойота со своими 11000 переменных отдыхает :)
http://arduino.ru/Reference/FunctionDeclaration
может так понятнее станет о чем говорим. автор код можно сделать меньше и более читаемым
да и комментарии на транслите это зачем?
вот еще почитайте.
http://arduino.ru/Reference/Array
у вас много переменных. если так много дейсвительно надо используйте массив
Спасибо ребят!) обязательно прочту;) просто соояла задача очень быстро сделать и чтоб работало.... А я во всем этом деле новичек)) потом обязательно переделаю;)
>> Возможно ли в программном коде ардуино напистаь несколько void loop(1) .... void loop(2)...
А почему нельзя? Вполне можно. Берем файлик arduino/cores/arduino/main.cpp и делаем себе возможность исполнения произвольного кода в прозвольном порядке. Хотя проще обойтись обычным распараллеливанием внутри void loop(void)
А почему нельзя? Вполне можно. Берем файлик arduino/cores/arduino/main.cpp и делаем себе возможность исполнения произвольного кода в прозвольном порядке. Хотя проще обойтись обычным распараллеливанием внутри void loop(void)
Ну если быть предельно точным, то паралельную обработку на одном ядре сделать априори не получиться. Относительно несложно можно сделать подобие кооперативной многозадачности.
Даже подобие вашим способом сделать не получится.
успешная реализация многопоточности
http://robocraft.ru/blog/985.html
Нет .
НЕ ОБОБЩАЙТЕ!
Читайте внимательней и прекратите уже ковыряться в старье :) Следите так сказать за новыми трендами..
http://arduino.cc/en/Tutorial/MultipleBlinks
сомневаюсь,что у создавшего тему Arduino Due ...В большинстве случаев эта Arduino Due - что пушкой по воробъям )
"старье" дешевле и его хватает на большинство задач.. Иногда хватает даже attiny13 и не ставить же вместо её Arduino Due..
сомневаюсь,что у создавшего тему Arduino Due ...В большинстве случаев эта Arduino Due - что пушкой по воробъям )
"старье" дешевле и его хватает на большинство задач.. Иногда хватает даже attiny13 и не ставить же вместо её Arduino Due..
я бы вообще никуда АРДУИНО не ставил! ибо взять просто камень атмеловский и уже достаточно :)
SAM3X стоит 5 баксов.
Ну если быть предельно точным, то паралельную обработку на одном ядре сделать априори не получиться. Относительно несложно можно сделать подобие кооперативной многозадачности.
зачем изобретать велосипед, если есть готовое решение типа FreeRTOS и подобных. На старшие атмелы поставить можно. Там и таймеры свои есть и дофига всего. Но мастырить ОСРВ для 4 кнопок и потенциометра смешно :)
Rash923, алгоритм задержек надо сквозным делать, чтобы не сидеть в циклах ожидания, как вам выше подсказали
Да я уже разобрался тут во всем;) используя функцию миллис)) просто сижу состороны наблюдаю за боталиями.... Может чего умного напишут;)
Возможно ли в программном коде ардуино напистаь несколько void loop(1) .... void loop(2)...
Я делаю несколько параллельных циклов так
void setup() { cikl1(); } void loop() { // код } void cikl1 () { while(1){ // код } } ...Они не выполняются параллельно.
не хотел новую тему открывать, сегодня напишу здесь. видел несколько проектов с несколькими loop ? обьясните по русски как она работает?
не хотел новую тему открывать, сегодня напишу здесь. видел несколько проектов с несколькими loop ? обьясните по русски как она работает?
я видел баб с тремя сиськами - как это по-русски работает?
тебе лишь бы постебаться, не хочешь говорить, молчи
тебе лишь бы постебаться, не хочешь говорить, молчи
покажи, где ты видел больше одного лупа?
void setup() {} void loop() { loop1(); loop2(); loop3(); } void loop1() { // fucking shit 1 } void loop2() { // fucking shit 2 } void loop3() { // ficking shit 3 }ну так тут один loop(), остальное просто функции с похожим названием.
void setup() {} void loop() { loop1(); loop2(); loop3(); } void loop1() { // fuckin shit 1 } void loop2() { // fucking shit 2 } void loop3() { // ficking shit 3 }типо - открыл одну сиську, а там три сиськи.
В чистом AVR такого вопроса даже существовать не может. Решается прерываниями. В Ардуине таки реально сделать несколько псевдоЛУПОВ, но это костыли.
В чистом AVR такого вопроса даже существовать не может. Решается прерываниями. В Ардуине таки реально сделать несколько псевдоЛУПОВ, но это костыли.
ты случайно не внук Онкеля?
нет.
кто такой Онкель? И чем он прославился?
кто такой Онкель? И чем он прославился?
костылями и фонтанами
я так понимаю каждый лоор независим от другого. если я в один цикл залью один скетч, а в другой второй, то они будут работать независимо друг от друга?
ну так тут один loop(), остальное просто функции с похожим названием.
Котищще! Ты мне моск не размножай!
Ходит как утка, крякает, как утка и выглядит, как утка - значит утка и есть! ;)
нет. это нереально. разве что светодидами моргать.
типо - открыл одну сиську, а там три сиськи.
- Три сиськи? - Зачёт! (с)
вот наконец то пример нашел- ты угадал, про диоды. осталось научиться разбирать библиотеку
#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 Гц } }я так понимаю каждый лоор независим от другого. если я в один цикл залью один скетч, а в другой второй, то они будут работать независимо друг от друга?
точно - в одной сиське молоко, в другой пиво, в третьей водка.
нет. это нереально. разве что светодидами моргать.
Бобёр! Выдыхай уже! Посмотри в Википедии понятие "шутка".
А то я из-пацтола печатать уже не могу!
ладно, пусть будут сиськи. если вдруг появиться delay в одной сиське, то остальные сиськи будут ждать, или работать дальше
лаврова на вас не хватает.