таймер на несколько пинов
- Войдите на сайт для отправки комментариев
Пт, 13/10/2017 - 15:23
[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 таймеров, но создаю я один таймер...
подскажите пожалуйста как заставить на таймере чтоб заработало например 5 пинов одновременно но правильно работает по времени пин 6 и 12 а остальные просто повторяются...вижу что Ошибка заключается в том, что для одно пина нужен 1 таймер, а для 5 пинов мне нужно 5 таймеров, но создаю я один таймер...
постарайтесь точнее описать логику. Я не понимаю в чем разница между "таймерами, работающими одновременно" и "просто повторящимися".
Если нужно. чтобы каждый пин менялся по своему закону - таймеров надо по числу пинов.