таймер на несколько пинов
- Войдите на сайт для отправки комментариев
Пт, 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 таймеров, но создаю я один таймер...
постарайтесь точнее описать логику. Я не понимаю в чем разница между "таймерами, работающими одновременно" и "просто повторящимися".
Если нужно. чтобы каждый пин менялся по своему закону - таймеров надо по числу пинов.