Программа в несколько этапов.
- Войдите на сайт для отправки комментариев
Вс, 14/04/2013 - 20:49
/*Все это условно ,Есть емкость ,по нажатию кнопки наполняемая водой
в течении времени Т1=2000.После этого включается
нагреватель на время Т2=500.А потом на время Т3=5000
включается клапан выпуска.
*/
const int ledPin1 = 10; // клапан наполнения
const int ledPin2 = 11; // нагреватель
const int ledPin3 = 12;// выпускной клапан
const int buttonPin = 3; // кнопка старт
int buttonState = 0; // variable for reading the pushbutton status
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(buttonPin, INPUT); // initialize the pushbutton pin as an input:
}
void loop(){
buttonState = digitalRead(buttonPin);//нажали старт
if (buttonState == HIGH) {
digitalWrite(ledPin1, HIGH); //включился клапан наполнения на 2000 млск
delay(2000);
digitalWrite(ledPin1, LOW); //выключился клапан наполнения
digitalWrite(ledPin2, HIGH);//вкл нагреватель на 500 млск
delay(500);
digitalWrite(ledPin2, LOW);// выкл нагреватель
digitalWrite(ledPin3, HIGH); //включился клапан выпускной на 5000 млск
delay(5000);
digitalWrite(ledPin3, LOW);//выключился клапан выпускной
}
}
Не могу понять как это можно сделать без делай. Расписать каждую функцию отдельно.
Но как задать каждой свое время исполнения????Никак не могу подружиться с миллисами. Моск плавится.Толкните в нужную сторону .
http://arduino.ru/tutorials/BlinkWithoutDelay
Так с этого и начинал
/* Blink without Delay 2005 by David A. Mellis modified 8 Feb 2010 by Paul Stoffregen */ const int ledPin1 = 10;// номер выхода, подключенного к светодиоду const int ledPin2 = 11; const int ledPin3 = 12; // Variables will change long previousMillis = 0; // храним время последнего переключения светодиода long interval1 = 2000; // интервал между включение/выключением светодиода (1 секунда) long interval2 = 500; long interval3 = 5000; void setup() { // задаем режим выхода для порта, подключенного к светодиоду pinMode(ledPin1, OUTPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); } void loop() { // здесь будет код, который будет работать постоянно // и который не должен останавливаться на время между переключениями свето unsigned long currentMillis = millis(); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > interval1) { // сохраняем время последнего переключения // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin1, HIGH); } digitalWrite(ledPin1, LOW); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > interval2) { // сохраняем время последнего переключения // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin2, HIGH); } digitalWrite(ledPin2, LOW); //проверяем не прошел ли нужный интервал, если прошел то if(currentMillis - previousMillis > interval3) { // сохраняем время последнего переключения previousMillis = currentMillis; // устанавливаем состояния выхода, чтобы включить или выключить светодиод digitalWrite(ledPin3, HIGH); } digitalWrite(ledPin3, LOW); }один из вариантов . Не судите строго .... совсем строго. Были и другие , но...
без кнопки
После многих попыток сваял вот этот код.Работает как и хотел. Можно ли все это сделать как-то попроще?
/*Есть емкость ,по нажатию кнопки наполняемая водой в течении времени intervalA=2000.После этого включается нагреватель на время intervalB=500.А потом на время intervalC=5000 включается клапан выпуска. */ int ledA=12; //клапан наполнения int ledB=11;//нагреватель int ledC=10;//клапан выпуска int startBut=4; //кнопка старт int stopBut=3; //кнопка останов int flagA=0; int flagB=0; int flagC=0; int valuestartBut=LOW;// variable for reading the pushbutton status int valuestopBut=LOW; unsigned long timeA; unsigned long timeB; unsigned long timeC; long intervalA = 2000; long intervalB = 500; long intervalC = 5000; void setup() { pinMode(ledA, OUTPUT); pinMode(ledB, OUTPUT); pinMode(ledC, OUTPUT); pinMode(startBut, INPUT); pinMode(stopBut, INPUT); } void loop() { valuestartBut=digitalRead(startBut); if (valuestartBut==HIGH) { timeA = millis(); flagA=1; } if(flagA==1) { digitalWrite(ledA,HIGH);//включился клапан наполнения на 2000 млск if (millis() - timeA >=intervalA) { digitalWrite(ledA,LOW);//выключился клапан наполнения flagA=0; flagB=1; timeB = millis(); } else { digitalWrite(ledA,LOW); } } if(flagB==1) { digitalWrite(ledB,HIGH);//вкл нагреватель на 500 млск if (millis() - timeB >=intervalB) { digitalWrite(ledB,LOW);// выкл нагреватель flagB=0; flagC=1; timeC = millis(); } else { digitalWrite(ledB,LOW); } } if(flagC==1) { digitalWrite(ledC,HIGH);//включился клапан выпускной на 5000 млск if (millis() - timeC >=intervalC) { digitalWrite(ledC,LOW);//выключился клапан выпускной flagC=0; } else { digitalWrite(ledC,LOW); } valuestopBut=digitalRead(stopBut); if (valuestopBut==HIGH) { flagA=0; flagB=0; flagC=0; } } }Схематично можно так (хотя это по сути то же самое):
/*Есть емкость ,по нажатию кнопки наполняемая водой в течении времени intervalA=2000.После этого включается нагреватель на время intervalB=500.А потом на время intervalC=5000 включается клапан выпуска. */ int ledA=12; //клапан наполнения int ledB=11;//нагреватель int ledC=10;//клапан выпуска int startBut=4; //кнопка старт int stopBut=3; //кнопка останов enum st_enum {ST_IDLE, ST_A, ST_B, ST_C} state; unsigned long lastTime; unsigned long intervalA = 2000 unsigned long intervalB = 500; unsigned long intervalC = 5000; void setup() { pinMode(ledA, OUTPUT); pinMode(ledB, OUTPUT); pinMode(ledC, OUTPUT); pinMode(startBut, INPUT); pinMode(stopBut, INPUT); } void loop() { if( digitalRead(startBut) == HIGH ) { state = ST_A; lastTime = millis(); } if( digitalRead(stopBut) == HIGH ) { state = ST_IDLE; } switch(state) { case ST_A: digitalWrite(ledA, HIGH); //включился клапан наполнения if( millis() - lastTime > interval[A] ) { state = ST_B; digitalWrite(ledA, LOW); //выключился клапан наполнения lastTime = millis; } break; case ST_B: digitalWrite(ledB, HIGH); //включился нагреватель if( millis() - lastTime > interval[B] ) { state = ST_C; digitalWrite(ledB, LOW); //выключился нагреватель lastTime = millis(); } break; case ST_C: digitalWrite(ledC, HIGH); //включился выпускной клапан if( millis() - lastTime > interval[C] ) { state = ST_IDLE; digitalWrite(ledC, LOW); //выключился выпускной клапан lastTime = millis(); } break; default: break; } }Но идеологически правильнее организовать стейт-машину тут.
Может быть, пока это и излишне, но при расширении очень пригодится.
Но идеологически правильнее организовать стейт-машину тут.
Вообщем-то то что вы "организовали" - это уже стейт-машина. Самая настоящая. Стейт-машина - она в голове, а не коде. Как только вы начали рассуждать в терминах "текущие состояние", "условие перехода в состояние..." - вы уже работаете со стейт машиной. Она может быть в виде UML диаграмы на бумаге, реализована if-вами, switch, таблицей обработчиков - это уже второстепенно. Главное - вы применили абстракцию которая позволяют упростить модель задачи. Раздробить ее на унифицированные кусочки. Так что с идеологией - у вас уже все хорошо.