Проблема кодирования Arduino: 2 секции не работают при объединении

Я использую Arduino Uno и пытаюсь объединить две части школьного проекта. Обе части работают нормально по отдельности, но в сочетании работает только часть 1. Часть 1: Включает в себя 1 кнопочный переключатель, 2 светодиода, один из которых горит, а другой не горит, кнопка переключается между тем, что включено или выключено. Часть 2: Сервопривод, управляемый потенциометром

Я определил, что сервопривод работает только при нажатии кнопки, чего не должно происходить, код потенциометра/сервопривода не должен зависеть от кода для светодиодов. Я определенно новичок в этом и не понимаю многого из того, что делает код, поэтому простите меня за избыточность. Буду признателен за любую оказанную помощь.

#include <Servo.h>
Servo myServo;
int const potPin = A0;
int potVal;
int angle;
int switchState;
int lastSwitchState = 0;
const int bluePin = 3;
const int yellowPin = 4;
const int button = 2;
int bluelight = LOW;
int yellowlight = HIGH;

void setup(){
  pinMode(bluePin, OUTPUT); //blue LED
  pinMode(yellowPin, OUTPUT); //yellow LED
  pinMode(button, INPUT); //switch
  myServo.attach(9);
  Serial.begin(9600);
}
void loop(){
  // PART 1 - this is the only part that seems to be working now?
  switchState = digitalRead(button);
  while (digitalRead(button)==LOW); 
  if (digitalRead(button)==LOW){ 
  bluelight=!bluelight;
    digitalWrite(bluePin, bluelight);
    digitalWrite(yellowPin, yellowlight);
  }
  else{
  if (switchState=!lastSwitchState) {
    yellowlight=!yellowlight;
    bluelight=!bluelight;
  digitalWrite(yellowPin, yellowlight);
  digitalWrite(bluePin, bluelight);
  }
  }
  // PART 2 - Only works when button is pressed? 
    potVal = analogRead(potPin);
  Serial.print("potVal: ");
  Serial.print(potVal);
  angle = map(potVal, 0, 1023, 0, 179);
  Serial.print(", angle: ");
  Serial.println(angle);
  myServo.write(angle);

  delay(250); //wait for a quarter second
  }

person user3350391    schedule 25.02.2014    source источник


Ответы (3)


Внесите поправку в оператор If else. Проблема при проверке условия. И вывод горшка (A0) взаимозависим от bluePin и yellowPin . так что по отдельности они работают нормально.

person Community    schedule 25.02.2014

ты делаешь:

while (digitalRead(button)==LOW);

этот код остановит выполнение каждого до тех пор, пока digitalRead не станет ИСТИННЫМ, поэтому код после этого оператора выполняется ТОЛЬКО после того, как кнопка станет ВЫСОКОЙ

насколько я могу понять, в то время как это необязательно, поскольку следующий ЕСЛИ уже заботится о том, что делать в случае НИЗКОГО или ВЫСОКОГО показания. Также задержка (250); похоже, это единственная часть кода, которая заблокирует ваше выполнение после удаления while, поэтому я думаю, что это ваша единственная блокирующая ошибка :)

person Lesto    schedule 25.02.2014
comment
Когда я убираю оператор while, он не работает, поэтому я не уверен, что я делаю неправильно в операторе if else. Любые предложения, что изменить, чтобы переключатель переключал, какой свет остается включенным? - person user3350391; 26.02.2014
comment
Теперь вам нужно исправить оператор if. Если кнопка на низком уровне, ничего не делайте, если на высоком, переключите состояние светодиода. Обратите внимание, что таким образом, если вы будете продолжать нажимать, светодиод кнопки будет постоянно включаться и выключаться. Также логика кнопок может быть инвертирована, зависит от жужжания - person Lesto; 26.02.2014

Это ваша ошибка:

в то время как (digitalRead (кнопка) == НИЗКИЙ);

программа застряла на этом цикле все время эта кнопка не нажата, потом при нажатии она продолжается, но входит в код который срабатывает когда эта кнопка нажата (true)

person Ivan Verges    schedule 25.02.2014