Всем привет, есть задний фонарь на велосипед, хотел по бокам добавить еще по 3 светодиода желтых для того, чтобы использовать их как поворотники. Идея вот в чем: нажимаю на кнопку "left" - мигают 3 левых светодиода, следовательно "right" - 3 правых. Сделал сначала с функцией delay, но потом понял, что светодиод не возможно будет выключить, так как ардуино как бы "отдыхает" во время delay. Попытался создать скетч по незнакомому, но очень желанному millis(). Получилось что-то, но работает всё странно: нажимаю кнопку, светодиоды могут либо загореться все вместе и просто стоять так, либо могут мигать (как и нужно). С выключением всё сложнее, выключается в какие-то определенные промежутки, так понял заданными мной с помощью millis. Надеюсь на вашу помощь. Спасибо.
Код (C++): boolean button_state_left = 0; boolean button_state_right = 0; int button_left = 7; int button_right = 8; int val = 0; unsigned long time_m1; unsigned long time_m2 = 0; int = 200; void left_signal() { Serial.println("Turn Left"); if (millis() - time_m1 > interval) { time_m1 = millis(); if (val == LOW) val = HIGH; else val = LOW; digitalWrite(9, val); digitalWrite(2, val); digitalWrite(3, val); } } void right_signal() { Serial.println("Turn Right"); if (millis() - time_m2 > interval) { time_m2 = millis(); if (val == LOW) val = HIGH; else val = LOW; digitalWrite(4, val); digitalWrite(5, val); digitalWrite(6, val); } } void turn_off() { digitalWrite(9, LOW); digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); Serial.println("STOP BLINKING"); } void setup() { // put your setup code here, to run once: pinMode(9, OUTPUT); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, INPUT); pinMode(8, INPUT); Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: if (digitalRead(button_left) == HIGH) { button_state_left = !button_state_left; delay(40); }; if (digitalRead(button_right) == HIGH) { button_state_right = !button_state_right; delay(40); }; if (button_state_right == HIGH) { right_signal(); } if (button_state_left == HIGH) { left_signal(); }; } }
Спасибо за ответ. Я ориентировался как раз на него, когда делал этот скетч. Прикол в том, что там скетч просто по морганию, а у меня моргание по нажатию, что немного усложняет его. Проблема как раз-таки во времени нажатия, как-будто ардуино уже занята в этот момент морганием и не может считывать с кнопки. P.S. Моргают светодиоды на ура, просто выключаются с трудом.
заводите переменную state = 0; и по нажатию кнопки меняете её на state = 1; и наоборот. в состоянии 0 светик выключен, 1 - мигает )))
Да вроде так и сделал, но не выходит. =/ В коде есть переменные button_state_left и button_state_right, каждый отвечает за левый и правый сигнал соответсвтвенно. Проблема возникает тогда, когда доходит дело до выключения. Да и включение тоже странное: то мигает, то просто горит. Вообщем, бред какой-то.
1. научитесь работать с кнопками с учётом дребезга 2. сделайте сначала для одного канала. когда всё будет гуд наращивайте свои хотелки
Поворотники - не лучшая идея для велосипедов. Жесты более заметны для водителей и их в любом случае надо использовать. Можете конечно сделать себе перчатки со светодиодом. Когда показываешь жест (или без автоматизации, та же кнопка), светодиод включается и видно руку хорошо водителю. (Только как это все компактно сделать, надо подумать). У меня впрочем тоже велосипеды имеются, в свободное время займусь этой идеей, хотя у меня столько проектов сейчас) Если сделаю, поделюсь.
Спасибо, вообще планировал комбинировать и то, и то. То есть синхронизировать и руки и фонари сзади. Да, днём будет их видно не очень, но в темное время суток самое то.