Программа не проверяет вход/изменения потенциометра
У меня была проблема с моим кодом, что мой потенциометр не будет изменять значения в методе. У меня генерируется случайное число, и если это конкретное число, распечатайте инструкцию и непрерывно проверяйте изменение значений потенциометра. Если он больше половины потенциометра, он выходит из метода. В этом случае я закодировал значение для случайного числа, поэтому его легче отладить. Заранее спасибо!
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;
}
}
@Nostradamus, 👍1
Обсуждение1 ответ
Мне кажется, что ваша функция 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, который непрерывно выполняется во время ожидания внешнего события, является плохой идеей. Это приведет к тому, что ваша программа зависнет и ничего не будет делать до тех пор, пока это условие не будет выполнено.
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
Где в этом коде вы вообще читаете потенциометр?, @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