таймер на несколько пинов

nicolaus242
Offline
Зарегистрирован: 13.10.2017
[code]
#include <Button.h>
#include <Timer.h>

#define DOOR_INPUT_PIN 13
#define DOOR1_OUTPUT_PIN 8
#define DOOR2_OUTPUT_PIN 9
#define DOOR3_OUTPUT_PIN 10
#define DOOR4_OUTPUT_PIN 11
#define DOOR5_OUTPUT_PIN 12

#define DOORPHONE_INPUT_PIN 7
#define DOORPHONE1_OUTPUT_PIN 8
#define DOORPHONE2_OUTPUT_PIN 9
#define DOORPHONE3_OUTPUT_PIN 10
#define DOORPHONE4_OUTPUT_PIN 11
#define DOORPHONE5_OUTPUT_PIN 12

#define WORK_TIME 3000 // milliseconds
#define DELAY_WORK_TIME 9000 // milliseconds

#define DELAY_TIME_DOOR 200 // milliseconds
#define DELAY_TIME_DOORPHONE 1000 // milliseconds

#define FIRST1_PIN_OUTPUT 2 // Door button stabel led
#define FIRST2_PIN_OUTPUT 3 // Door button stabel led
#define FIRST3_PIN_OUTPUT 4 // Door button stabel led
#define FIRST4_PIN_OUTPUT 5 // Door button stabel led
#define FIRST5_PIN_OUTPUT 6 // Door button stabel led

#define SECOND1_PIN_OUTPUT 2 // Doorphone button stabel led
#define SECOND2_PIN_OUTPUT 3 // Doorphone button stabel led
#define SECOND3_PIN_OUTPUT 4 // Doorphone button stabel led
#define SECOND4_PIN_OUTPUT 5 // Doorphone button stabel led
#define SECOND5_PIN_OUTPUT 6 // Doorphone button stabel led

#define DOOR_STABLE_OUTPUT_PIN A1
#define DOORPHONE_STABLE_OUTPUT_PIN A2

Button doorButton = Button(DOOR_INPUT_PIN, PULLUP);
Button doorPhoneButton = Button(DOORPHONE_INPUT_PIN, PULLUP);

Timer workTimer;
Timer timerButtonDoor;
Timer timerButtonDoorPhone;

boolean canPressedButton = true;

/**
 * TMP 
*/
int idTimerDoor;
int idTimerDoorPhone;

boolean buttonDoorIsPressed;
boolean buttonDoorPhoneIsPressed;

char *prevActive;


void setup() {
  pinMode(DOOR1_OUTPUT_PIN, OUTPUT);
  pinMode(DOOR2_OUTPUT_PIN, OUTPUT);
  pinMode(DOOR3_OUTPUT_PIN, OUTPUT);
  pinMode(DOOR4_OUTPUT_PIN, OUTPUT);
  pinMode(DOOR5_OUTPUT_PIN, OUTPUT);
  pinMode(DOORPHONE1_OUTPUT_PIN, OUTPUT);
  pinMode(DOORPHONE2_OUTPUT_PIN, OUTPUT);
  pinMode(DOORPHONE3_OUTPUT_PIN, OUTPUT);
  pinMode(DOORPHONE4_OUTPUT_PIN, OUTPUT);
  pinMode(DOORPHONE5_OUTPUT_PIN, OUTPUT);
  pinMode(FIRST1_PIN_OUTPUT, OUTPUT);
  pinMode(FIRST2_PIN_OUTPUT, OUTPUT);
  pinMode(FIRST3_PIN_OUTPUT, OUTPUT);
  pinMode(FIRST4_PIN_OUTPUT, OUTPUT);
  pinMode(FIRST5_PIN_OUTPUT, OUTPUT);
  pinMode(SECOND1_PIN_OUTPUT, OUTPUT);
  pinMode(SECOND2_PIN_OUTPUT, OUTPUT);
  pinMode(SECOND3_PIN_OUTPUT, OUTPUT);
  pinMode(SECOND4_PIN_OUTPUT, OUTPUT);
  pinMode(SECOND5_PIN_OUTPUT, OUTPUT);
  pinMode(DOOR_STABLE_OUTPUT_PIN, OUTPUT);
  pinMode(DOORPHONE_STABLE_OUTPUT_PIN, OUTPUT);
 
  prevActive = "";
}

void loop() {
  watchButton(doorButton, DOOR_STABLE_OUTPUT_PIN, buttonDoorIsPressed);
  watchButton(doorPhoneButton, DOORPHONE_STABLE_OUTPUT_PIN, buttonDoorPhoneIsPressed);
  workTimer.update();
  timerButtonDoor.update();
  timerButtonDoorPhone.update();



  watchWorkDoor(doorButton, timerButtonDoor, canPressedButton);
  watchWorkDoorPhone(doorPhoneButton, timerButtonDoorPhone, canPressedButton);
}

void watchButton(Button & button, int outputPin, boolean & isPressed) {
  if (button.isPressed()) {
    isPressed = true;
    digitalWrite(outputPin, HIGH);
  } else {
    isPressed = false;
    digitalWrite(outputPin, LOW);
  }
}

void watchWorkDoor(Button & button, Timer & t, boolean & isCanPressedButton) {
  if (
    isCanPressedButton && 
    button.isPressed() && 
    (prevActive == "doorPhone" || prevActive == "" || !doorPhoneButton.isPressed())
  ) {
    idTimerDoor = t.oscillate(DOOR1_OUTPUT_PIN, DELAY_TIME_DOOR, LOW, WORK_TIME / DELAY_TIME_DOOR);
    digitalWrite(FIRST1_PIN_OUTPUT, HIGH);
    idTimerDoor = t.oscillate(DOOR2_OUTPUT_PIN, DELAY_TIME_DOOR, LOW, WORK_TIME / DELAY_TIME_DOOR);
    digitalWrite(FIRST2_PIN_OUTPUT, HIGH);
    idTimerDoor = t.oscillate(DOOR3_OUTPUT_PIN, DELAY_TIME_DOOR, LOW, WORK_TIME / DELAY_TIME_DOOR);
    digitalWrite(FIRST3_PIN_OUTPUT, HIGH);
    idTimerDoor = t.oscillate(DOOR4_OUTPUT_PIN, DELAY_TIME_DOOR, LOW, WORK_TIME / DELAY_TIME_DOOR);
    digitalWrite(FIRST4_PIN_OUTPUT, HIGH);
    idTimerDoor = t.oscillate(DOOR5_OUTPUT_PIN, DELAY_TIME_DOOR, LOW, WORK_TIME / DELAY_TIME_DOOR);
    digitalWrite(FIRST5_PIN_OUTPUT, HIGH);
    t.after(WORK_TIME, stopWorkDoor);
    isCanPressedButton = false;
  }
}

void watchWorkDoorPhone(Button & button, Timer & t, boolean & isCanPressedButton) {
  if (
    isCanPressedButton && 
    button.isPressed() && 
    (prevActive == "door" || prevActive == "" || !doorButton.isPressed())
  ) {
    idTimerDoorPhone = t.oscillate(DOORPHONE1_OUTPUT_PIN, DELAY_TIME_DOORPHONE, LOW, WORK_TIME / DELAY_TIME_DOORPHONE);
    digitalWrite(SECOND1_PIN_OUTPUT, HIGH);
    idTimerDoorPhone = t.oscillate(DOORPHONE2_OUTPUT_PIN, DELAY_TIME_DOORPHONE, LOW, WORK_TIME / DELAY_TIME_DOORPHONE);
    digitalWrite(SECOND2_PIN_OUTPUT, HIGH);
    idTimerDoorPhone = t.oscillate(DOORPHONE3_OUTPUT_PIN, DELAY_TIME_DOORPHONE, LOW, WORK_TIME / DELAY_TIME_DOORPHONE);
    digitalWrite(SECOND3_PIN_OUTPUT, HIGH);
    idTimerDoorPhone = t.oscillate(DOORPHONE4_OUTPUT_PIN, DELAY_TIME_DOORPHONE, LOW, WORK_TIME / DELAY_TIME_DOORPHONE);
    digitalWrite(SECOND4_PIN_OUTPUT, HIGH);
    idTimerDoorPhone = t.oscillate(DOORPHONE5_OUTPUT_PIN, DELAY_TIME_DOORPHONE, LOW, WORK_TIME / DELAY_TIME_DOORPHONE);
    digitalWrite(SECOND5_PIN_OUTPUT, HIGH);
    t.after(WORK_TIME, stopWorkPhone);
    isCanPressedButton = false;
  }
}

void stopWorkDoor () {
  timerButtonDoor.stop(idTimerDoor);
  
  prevActive = "door";

  digitalWrite(FIRST1_PIN_OUTPUT, LOW);
  digitalWrite(FIRST2_PIN_OUTPUT, LOW);
  digitalWrite(FIRST3_PIN_OUTPUT, LOW);
  digitalWrite(FIRST4_PIN_OUTPUT, LOW);
  digitalWrite(FIRST5_PIN_OUTPUT, LOW);
  digitalWrite(DOOR1_OUTPUT_PIN, LOW);
  digitalWrite(DOOR2_OUTPUT_PIN, LOW);
  digitalWrite(DOOR3_OUTPUT_PIN, LOW);
  digitalWrite(DOOR4_OUTPUT_PIN, LOW);
  digitalWrite(DOOR5_OUTPUT_PIN, LOW);
  workTimer.after(DELAY_WORK_TIME, accessCall);
}

void stopWorkPhone () {
  timerButtonDoorPhone.stop(idTimerDoorPhone);

  prevActive = "doorPhone";
  
  digitalWrite(SECOND1_PIN_OUTPUT, LOW);
  digitalWrite(SECOND2_PIN_OUTPUT, LOW);
  digitalWrite(SECOND3_PIN_OUTPUT, LOW);
  digitalWrite(SECOND4_PIN_OUTPUT, LOW);
  digitalWrite(SECOND5_PIN_OUTPUT, LOW);
  digitalWrite(DOORPHONE1_OUTPUT_PIN, LOW);
  digitalWrite(DOORPHONE2_OUTPUT_PIN, LOW);
  digitalWrite(DOORPHONE3_OUTPUT_PIN, LOW);
  digitalWrite(DOORPHONE4_OUTPUT_PIN, LOW);
  digitalWrite(DOORPHONE5_OUTPUT_PIN, LOW);
  workTimer.after(DELAY_WORK_TIME, accessCall);
}

void accessCall() {
  canPressedButton = true;
}


[/code]

подскажите пожалуйста как заставить на таймере чтоб заработало например 5 пинов   но правильно работает по времени пин 6 и 12 а остальные просто повторяются...вижу что Ошибка заключается в том, что для одно пина нужен 1 таймер, а для 5 пинов мне нужно 5 таймеров, но создаю я один таймер...

b707
Offline
Зарегистрирован: 26.05.2017

nicolaus242 пишет:

подскажите пожалуйста как заставить на таймере чтоб заработало например 5 пинов одновременно   но правильно работает по времени пин 6 и 12 а остальные просто повторяются...вижу что Ошибка заключается в том, что для одно пина нужен 1 таймер, а для 5 пинов мне нужно 5 таймеров, но создаю я один таймер...

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

Если нужно. чтобы каждый пин менялся по своему закону - таймеров надо по числу пинов.