Сервопривод не работает со светодиодным кодом!
Я пытаюсь объединить свой сервокод и свой светодиодный код, но всякий раз, когда я добавляю свой сервокод, светодиод вообще отказывается включаться. Я новичок в arduino извините, если это не имеет никакого смысла!
Servo myservo;
const int pushbutton_PIN = 2;
const int POT_PIN = A0;
const int LED_PIN = 3;
int pos = 0;
int buttonState = 0;
int lastbuttonState = 0;
int analogValue = 0;
int lightState = false;
int brightness = 0;
void setup() {
myservo.attach(9);
pinMode(pushbutton_PIN, INPUT);
pinMode(POT_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
Serial.begin(9600);
}
void loop(){
light();
servo();
}
void servo(){
for (pos = 0; pos <= 180; pos += 1) {
// in steps of 1 degree
myservo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 1) {
myservo.write(pos);
delay(15);
}
}
void light() {
buttonState = digitalRead(pushbutton_PIN);
if (buttonState != lastbuttonState) {
if (buttonState == HIGH) {
delay(300);
lightState = true;
light_on();
}
}
lastbuttonState = buttonState;
}
void light_on() {
while (lightState == true) {
analogValue = analogRead(POT_PIN);
brightness = map(analogValue, 0, 1023, 0, 255);
analogWrite(LED_PIN, brightness);
buttonState = digitalRead(pushbutton_PIN);
if (buttonState != lastbuttonState) {
if (buttonState == HIGH) {
lightState = false;
delay(300);
analogWrite(LED_PIN, LOW);
loop();
}
}
lastbuttonState = buttonState;
}
}
@lilnutss, 👍2
Обсуждение0
Смотрите также:
- Несколько условий оператора if
- Светодиоды: разница между общим анодом и общим катодом
- Как заставить сервопривод вращаться на угол больше 180°
- Остановить мигание светодиодов
- Интеграция 2 кнопок для включения и выключения светодиода.
- Управление цифровой адресной светодиодной лентой RGB 12 В с помощью Arduino
- Код Arduino для управления 4 светодиодами с 4 кнопок
- Подключение Arduino к сервоприводу с внешним источником питания
Я думаю, что ваша проблема заключается в блокировочном коде. В то время как ваш сервокод запускается, индикатор никак не обрабатывается. Чтобы сделать это несколько раз одновременно (например, управление сервоприводом, проверка кнопки и управление светодиодом, на самом деле вам нужно делать это последовательно и очень быстро, в основном делая что-то только тогда, когда пришло время это сделать, иначе перейдем к следующему пункту. Никаких вызовов с задержкой (это просто напряженное ожидание). Пожалуйста, ознакомьтесь с учебниками о "millis ()" и примере "BlinkWithoutDelay", который поставляется с интегрированной средой разработки Arduino. Это очень важный принцип кодирования для микроконтроллеров., @chrisl
Распространенная проблема с ШИМ и сервоприводом, когда он не работает, заключается в том, что используемый ШИМ-вывод находится на том же таймере, что и библиотека сервоприводов. Но обычно он использует Timer1, а вывод 3 находится на таймере 2, поэтому в этом случае это может не возникнуть, @KIIV
Каждый вызов вашей функции servo() занимает более 5 секунд (_5,4 с, только для вызовов функции delay ()!_), во время которого больше ничего - тестирование кнопки, f/ex - не выполняется. Присоединяюсь к предложению @chrisl просмотреть пример `BlinkWithoutDelay". Также найдите в Arduino StackExchange"неблокирующий"., @JRobert
В дополнение к комментарию Криса на форуме arduino в разделе "Руководство по проекту" есть действительно хорошая заметка, посвященная именно этой проблеме для новичков. Я думаю, это называется: делать несколько вещей одновременно, @Zhelyazko Grudov
есть ли какая - либо причина, по которой вы перемещаете сервопривод небольшими шагами?, @jsotola
@christl Я изучил то, что вы предложили, и, думаю, я понял это, так что спасибо вам! Однако если я уберу свои задержки для серво, я боюсь, что мой серво будет двигаться слишком быстро для того, что мне нужно. Есть ли способ замедлить мой серво без каких-либо задержек звонков?, @lilnutss
Точно так, как я написал: с помощью "millis()` и принципа в примере "BlinkWithoutDelay". Это требует реструктуризации вашего кода., @chrisl