Программа не проверяет вход/изменения потенциометра

У меня была проблема с моим кодом, что мой потенциометр не будет изменять значения в методе. У меня генерируется случайное число, и если это конкретное число, распечатайте инструкцию и непрерывно проверяйте изменение значений потенциометра. Если он больше половины потенциометра, он выходит из метода. В этом случае я закодировал значение для случайного числа, поэтому его легче отладить. Заранее спасибо!

int potenVal = 0;

void loop(){
  buttonStateStart = digitalRead(buttonPinStart);
  buttonStateClose = digitalRead(buttonPinClose);
  **potenVal = analogRead(potenPin);**
  if(buttonStateStart == HIGH){
    entered = true;
  }
  if(entered == true){
    Serial.println("Welcome Secret Agent");
    delay(100);
    Serial.println("Enter the access code: ");
    delay(100);
    entered = false;
    exitApproach = false;
    rightCode = false;
    numLoop = 0;
    approach();
  }
  if(buttonStateClose == HIGH || randPowerOut == true){
    closeDoor = true;
  }
  if(closeDoor == true){
    delay(100);
    Serial.println("Closing Door...");
    delay(100);
    closeDoor = false;
    randPowerOut = false;
    numOfEntries++;
    leave();
  }
}

void approach(){
  while(!exitApproach){
    if(Serial.available()>0){
      code = Serial.readStringUntil('\n');
      delay(100);
      if(code.equals(spy)){
        Serial.println("Nice to see you again, Spy. Welcome!");
        wrongCode = 0;
        numOfSpy++;
        myServo.write(180);
        numOfOpenDoor++;
        rightCode = true;
        exitApproach = true;
        powerOut();
      }else if(code.equals(director)){
        Serial.println("Nice to see you again, Director. Welcome!");
        wrongCode = 0;
        numOfDirector++;
        myServo.write(180);
        numOfOpenDoor++;
        rightCode = true;
        exitApproach = true;
        powerOut();
      }else if(code.equals(analyst)){
        Serial.println("Nice to see you again, Analyst. Welcome!");
        wrongCode = 0;
        numOfAnalyst++;
        myServo.write(180);
        numOfOpenDoor++;
        rightCode = true;
        exitApproach = true;
        powerOut();
      }else{
        numLoop++;
        delay(100);
      }
      if(numLoop == 1 && rightCode == false){
        wrongCode = 1;
        numOfError++;
        Serial.println("Wrong Code. Enter again:");
      }else if(numLoop == 2 && rightCode == false){
        wrongCode = 2;
        numOfError++;
        digitalWrite(ledPin, HIGH);
        tone(speakPin,1000);
        delay(3000);
        noTone(speakPin);
        Serial.println("Goodbye");
        Serial.println(" ");
        digitalWrite(ledPin, LOW);
        exitApproach = true;
      }
    }
  }
}

void leave(){
  delay(2300);
  myServo.write(90);
  numOfCloseDoor++;
  printInfo();
  for(int x = 0; x < 50; x++) Serial.println();
}

void printInfo(){
    if(numOfEntries == 10 || numOfEntries == 20 || numOfEntries == 30 || numOfEntries == 40 || numOfEntries == 50 
    || numOfEntries == 60 || numOfEntries == 70 || numOfEntries == 80 || numOfEntries == 90 || numOfEntries == 100){
      for(int i = 0; i < 1; i++){
        Serial.println("====================================");
        Serial.print("Number of Spys: ");
        Serial.println(numOfSpy);
        Serial.print("Number of Directors: ");
        Serial.println(numOfDirector);
        Serial.print("Number of Analysts: ");
        Serial.println(numOfAnalyst);
        Serial.print("Number of Times an Error Occured: ");
        Serial.println(numOfError);
        Serial.print("Number of Times the Door Opened: ");
        Serial.println(numOfOpenDoor);
        Serial.print("Number of Times the Door Closed: ");
        Serial.println(numOfCloseDoor);
        Serial.println("====================================");
        }
    }else{
      exit;
    }
  }

void powerOut(){
  //randNumber = random(1,10);
    randNumber = 3;
    if(randNumber == 3 || randNumber == 7){
      Serial.println("============================");
      Serial.println("RANDOM POWER OUTAGE!");
      Serial.println("Door must be closed manually");
      Serial.println("============================");
      while(randNumber == 3 || randNumber == 7){
        if(potenVal >= 512){
          numOfCloseDoor++;
          randPowerOut = true;
          rightCode = true;
          exitApproach = true;
          randNumber == 0;
        }
      }
    }else{
      exit;
    }
  }

, 👍1

Обсуждение

Где в этом коде вы вообще читаете потенциометр?, @Majenko

Вы должны использовать potenVal = analogRead(аналоговый вывод потенциометра) и присвоить его potenVal до того, как potenVal получит значение потенциометра. Видишь https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/, @Michel Keijzers

У меня есть эта строка кода в разделе void loop моего кода, @Nostradamus

Если вы хотите, чтобы мы помогли вам отладить ваш код, то вам нужно поделиться соответствующими частями вашего кода. Та часть, которую вы опубликовали, никогда не устанавливает значение потенциометра, поэтому мы не можем сказать, что не так с тем, как вы его устанавливаете. Пожалуйста, отредактируйте свой вопрос, чтобы включить в него функцию цикла. (не пытайтесь размещать код в комментариях. Отсутствие форматирования делает код нечитаемым в комментариях), @Duncan C

Вы уверены, что потенциометр включен?, @Michel Keijzers

Вы только считываете аналоговое значение в " цикле ()", но функция " подход()` блокируется. Таким образом, значение не будет обновляться во время выполнения этой функции. Или в чем проблема? Я не совсем уверен, @chrisl


1 ответ


0

Мне кажется, что ваша функция powerOut() перейдет в бесконечный цикл замораживания Arduino, если randNumber == 3 || randNumber == 7 и потенциал < 512. В этом случае цикл while будет выполняться, но оператор if if(potenVal >= 512)> никогда не будет оцениваться как истинный, и поэтому randNumber никогда не изменится.

Вы, вероятно, хотите перечитать свой потенциометр внутри цикла while:

  while(randNumber == 3 || randNumber == 7){
    potenVal = analogRead(potenPin); // <-- Add this line
    if(potenVal >= 512){
      numOfCloseDoor++;
      randPowerOut = true;
      rightCode = true;
      exitApproach = true;
      randNumber == 0;
    }
  }

Таким образом, если вы повернете свой банк так, чтобы он считывал >= 512 во время выполнения цикла while, он завершится.>

Обратите внимание, что использование цикла while, который непрерывно выполняется во время ожидания внешнего события, является плохой идеей. Это приведет к тому, что ваша программа зависнет и ничего не будет делать до тех пор, пока это условие не будет выполнено.

,