Сервопривод не работает со светодиодным кодом!

Я пытаюсь объединить свой сервокод и свой светодиодный код, но всякий раз, когда я добавляю свой сервокод, светодиод вообще отказывается включаться. Я новичок в 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;
  }
}

, 👍2

Обсуждение

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