Подскажите как добавить действие к двухпериодный таймер

maxvalin
Offline
Зарегистрирован: 22.02.2016
// входа  
#define potPause A0   // потенциометр на 10 кОм для установки паузы двигателя.
#define potWork A1   // потенциометр на 10 кОм для установки работы движка.

#define WorkDrive 2 // Вывод к котрому подключена нагрузка
#define TIME_ON_NASOS 1000  // Время в течении, которого на выводе 1
#define TIME_OFF_NASOS 5000 // Время в течении, которого на выводе 0
boolean state_nasos = 0; // Переменная для хранения состояния вывода
unsigned long new_millis_nasos = millis(); // Переменная для хранения времени
unsigned int Work  = 0;  // переменная для потенциометра для продолжительности работы движка
unsigned int Pause = 0;  // переменная для потенциометра для продолжительности паузы движка
unsigned int WorkMillis = 0;
unsigned int PauseMillis =0;

#define ImpulsProduvka 3 // Вывод к котрому подключена нагрузка
#define TIME_ON_KLAPAN 1000 // Время в течении, которого на выводе 1
#define TIME_OFF_KLAPAN 5000 // Время в течении, которого на выводе 0
boolean state_klapan = 0; // Переменная для хранения состояния вывода
unsigned long new_millis_klapan = millis(); // Переменная для хранения времени

void setup() {
   Serial.begin(9600);
  pinMode(potPause, INPUT);
  pinMode(potWork, INPUT);
  pinMode(ImpulsProduvka, OUTPUT);
  pinMode(WorkDrive, OUTPUT);
  digitalWrite (ImpulsProduvka, HIGH); // выкл для релейного модуля
  digitalWrite (WorkDrive, HIGH);  // вкл для релейного модуля 
}

void loop(){ 
// Управление насосом:
  uint16_t Work = analogRead(potWork);  //читаю потенциометр работы двигателя
  uint16_t Pause = analogRead(potPause); //читаю потенциометр паузы двигателя
  PauseMillis = map(Pause, 0, 1023, 0, 60000);  // конвертирую показания потенциометра от 0 до 60 секунд для паузы
  WorkMillis = map(Work, 0, 1023, 0, 60000);  // конвертирую показания потенциометра от 0 до 60 секунд для работы двигателя



  if(millis() > new_millis_nasos){
    state_nasos = !state_nasos;
    digitalWrite(WorkDrive, !state_nasos);
    if(state_nasos){
      new_millis_nasos = millis() + WorkMillis;
    }
    else{
      new_millis_nasos = millis() + PauseMillis;
    }
  }
  
// Управление продувкой:
  if(millis() > new_millis_klapan && !state_nasos){  //если милисы больше чем прошлый показатель И насос выключен!
    state_klapan = !state_klapan;                    // меняю состояние клапана
    digitalWrite(ImpulsProduvka, !state_klapan);     // подаю инвертированный сигнал ОТ состояния клапана - на клапан продувки фильтра
    if(state_klapan){                                // если клапан ВЕРНО то включаю два периода времнеи
      new_millis_klapan = millis() + TIME_ON_KLAPAN;
    }
    else{
      new_millis_klapan = millis() + TIME_OFF_KLAPAN;
    }
  }
  if(state_nasos)  // принудительно выключаю продувку клапана во время работы насоса.
    {
     digitalWrite (ImpulsProduvka, HIGH);  //высокий сигнал потому что модули реле инвертированные, так она выключена
    }
 /* ЭТО для отладки:
  *  
  *  Serial.print("пауза -");
  Serial.println (PauseMillis / 1000);
  Serial.print("работа -");
  Serial.println(WorkMillis / 1000);
 */
 //////// ВЫВОД ИНФОРМАЦИИ НА OLED дисплей:
 

}

Есть вот такой вот код. Принцип понятен. Но хотел еще добавить и попутные действия на время выполнения того или иного периода. Между каких строчек влезть? 

например при паузе движка- мигание светиком. 

где то тут на форуме кстати натыкался на заготовку типа" мигалка при определенном действии" там отдельно skj сделано VOID-ом  был.

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

У меня пока нет желания переводить ваш код в мой. Так что пока почитайте это.http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov

ПС:

/**/
unsigned int mill;
//------Cl_AAA----------------------
// класс вкл-выкл
class Cl_AAA {
  protected:
    const byte pin;
    bool led;
    bool statBlink;
    unsigned long past;
    unsigned int  timeON, timeOFF;
    unsigned int *ptimeON, *ptimeOFF;
  public:
    Cl_AAA(byte pin_, unsigned int *ptimeON_, unsigned int *ptimeOFF_ )
      :     pin(pin_),      ptimeON(ptimeON_),     ptimeOFF(ptimeOFF_ ) {}
    void setup() {
      pinMode(pin, OUTPUT);
      past = mill;
      digitalWrite(pin, led = 1);
      if (*ptimeON != 0) timeON = *ptimeON;
    }
    void loop() {
      if (led && mill - past >= timeON) {
        past = mill;
        if (*ptimeOFF != 0) timeOFF = *ptimeOFF;
        digitalWrite(pin, led = 0);
      }
      if (!led && mill - past >= timeOFF) {
        past = mill;
        digitalWrite(pin, led = 1);
        if (*ptimeON != 0) timeON = *ptimeON;
      }
    }
};
//--------------------------------
class Cl_analogRead {
  protected:
    byte pin;
    unsigned int *val, maxim, minim;
    const char *name;
    unsigned int past;
  public:
    Cl_analogRead(byte pin_, unsigned int *val_, unsigned int maxim_, unsigned int minim_, char* name_):
      pin(pin_), val(val_), maxim(maxim_), minim(minim_), name(name_) {

    }
    void setup() {}
    void loop() {
      if (mill - past >= 200) {
        past = mill;
        *val = (long)map(analogRead(pin), 0, 1023, maxim, minim);
        Serial.println();
        Serial.print(name);
        Serial.print(*val);
      }
    }
};
//---Компоновка-----------------------------
unsigned int tPause = 10, tWork = 10;
Cl_analogRead  Rez1(/*пин*/A0,/*переменная*/&tPause,/*max*/60000,/*min*/0,/*величина*/"t pause=");
Cl_analogRead  Rez2(/*пин*/A1,/*переменная*/&tWork,/*max*/60000,/*min*/0,/*величина*/"t work=");
Cl_AAA   AAA(/*пин*/2,/*время вкл*/&tWork,/*время выкл*/&tPause);
//---main-----------------------------
void setup() {
  Serial.begin(9600);
  Rez1.setup();
  Rez2.setup();
  AAA.setup();
}
void loop() {
  mill = millis();
  Rez1.loop();
  Rez2.loop();
  AAA.loop();
}
/*Скетч использует 2694 байт (8%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 245 байт (11%) динамической памяти, оставляя 1803 байт для локальных переменных. Максимум: 2048 байт
*/