Код не работает, сервопривод даже не вращается

Я пытаюсь запустить программу, которая работает следующим образом:

LDR встроен в коробку. Сверху кладется блок. Эта коробка может вращаться сервоприводом. Предполагается, что программа заставит коробку вращаться до тех пор, пока блок не сдвинется и не оторвется от LDR.

В этот момент угол сервопривода сохраняется и используется для расчета коэффициента трения. Наконец, ответ на этот расчет печатается на жидкокристаллическом дисплее, и программа повторяется, сначала возвращая коробку в исходное состояние. Все программы работают на Arduino и Arduino Lotus. Почему сервопривод не вращается?

//сервопривод 
#include <Servo.h> 

Servo myservo; 
int previous_angle = 0; 
int angle = 0; 
    
//lightsensor
int lightsensor = 0;     
int LIGHT = 800;     
int DARK = 940; 
              
//Светодиодный экран     
#include <Adafruit_GFX.h>     
#include <Adafruit_SSD1306.h> 
    
#define OLED_RESET 4     
Adafruit_SSD1306 display(OLED_RESET); 
              
void setup() {    
  Serial.begin(9600);     
  myservo.attach(6); 
            
  pinMode(lightsensor, INPUT);               

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
    
  delay(100);                 
} 
              
void loop() { 
  int i = previous_angle;     
  int lightStatus = analogRead(lightsensor); 
    
  if (lightStatus >= DARK) {      
    delay(300); 

    while (int i = previous_angle) {
      i<=90;
      i = i+1;
      myservo.write(i);     
      delay(45); 
    };      
  } else if (lightStatus < DARK) {    
    for (int i = previous_angle; i>0;) {     
      delay(300);     
      int angle = tan(i);         
      display.clearDisplay();     
      display.setTextSize(1.5);     
      display.setTextColor(WHITE);     
      display.setCursor(0,0);     
      display.println(angle);     
      display.display();     
      delay(300);  
              
      myservo.write(0);     
      delay(45);     
    };     
  }     
}

, 👍2

Обсуждение

В будущем, пожалуйста, отформатируйте свой исходный код с помощью {} на этом сайте. Как бы то ни было, следовать вашему коду было очень трудно. Кроме того, пожалуйста, включите схему подключения вашего двигателя., @jwh20

Вопрос: Удалось ли вам заставить свой мотор работать с помощью простой программы? Часто бывает полезно начать с простого и добавлять вещи шаг за шагом., @jwh20


1 ответ


2

Для начала: этот бит представляет собой странную смесь синтаксиса for и while:

while (int i = previous_angle) {
  i <= 90; 
  i = i + 1; 
  myservo.write(i);
  delay(45); 
};  

Он будет компилироваться, но, вероятно, не будет делать то, что вы хотите. Вероятно, это должно быть:

for (int i=previous_angle; i<=90; i=i+1) {
  myservo.write(i);
  delay(45); 
}

Кроме того, previous_angle никогда не изменяется в вашем коде после инициализации; он всегда равен 0.

Это также означает, что цикл for ниже не будет делать то, что вы хотите (и этот цикл также нигде не увеличивает i):

for (int i = previous_angle; i>0;)

Их может быть больше; сначала внесите предложенные изменения и посмотрите, что произойдет.

,

Если я изменю его, то получу ошибку при проверке кода 'expected')'before';'token', @user71605

Я виню кофе underflow 8-). Ответ отредактирован., @ocrdu

Изменение на "for" действительно устраняет ошибку, я проверю, правильно ли работает код по мере необходимости., @user71605