Программа в несколько этапов.

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

/*Все это условно ,Есть емкость ,по нажатию кнопки наполняемая водой 
в течении времени Т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);//выключился клапан выпускной
    }
} 

Не могу понять как это можно сделать без делай. Расписать каждую функцию отдельно.

 Но как  задать каждой свое время исполнения????Никак не могу подружиться с миллисами. Моск плавится.Толкните в нужную сторону .

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

Так с этого и  начинал

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

 

один из вариантов . Не судите строго .... совсем строго. Были и другие , но...

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

без кнопки

 

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

После многих попыток сваял вот этот код.Работает как и хотел. Можно ли все это сделать как-то попроще?

/*Есть емкость ,по нажатию кнопки наполняемая водой 
в течении времени 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;
}

}
}

 

tsostik
Offline
Зарегистрирован: 28.02.2013

Схематично можно так (хотя это по сути то же самое):

/*Есть емкость ,по нажатию кнопки наполняемая водой 
в течении времени 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;
    }
}

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

Может быть, пока это и излишне, но при расширении очень пригодится.

leshak
Offline
Зарегистрирован: 29.09.2011

tsostik пишет:

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

Вообщем-то то что вы "организовали" - это уже стейт-машина. Самая настоящая. Стейт-машина - она в голове, а не коде. Как только вы начали рассуждать в терминах "текущие состояние", "условие перехода в состояние..." - вы уже работаете со стейт машиной. Она может быть в виде UML диаграмы на бумаге, реализована if-вами, switch, таблицей обработчиков - это уже второстепенно. Главное - вы применили абстракцию которая позволяют упростить модель задачи. Раздробить ее на унифицированные кусочки. Так что с идеологией - у вас уже все хорошо.