新人求教LED 和 Motor 随意运作的问题

你好,这是我第一次接触arduino。我希望有人告诉我为什么我的LED和Motor无法正常运作。我将万分感激!欢迎任何形式的帮助!也告诉我可以参考哪些教程或者视频。
我试图用两个button和capacitive touch sensor有效控制led和motor。以及用rotary encoder来改变led亮度。

我预期的效果:

  1. 当我按下按钮或者旋转encoder后,led和motor能马上做出改变。
  2. 只按住button1时,led可以保持关闭。
  3. 当顺时针旋转encoder, led变暗。 反之亦然。

现在我的code的效果:

  1. led和motor随意工作着。比如有时候我按下按钮,他们依然按照原来的状态运作着,没有任何该改变。或者有时要等个10秒左右才有反应。(我猜可能是if()太长了?但没道理啊按理说它其实不是很长)motor现在转的很随机。有时候我从头到尾啥都没干,它也会自己变速度和方向。
  2. 按住button1的时候,有时led会不停闪烁,有时候led就一直亮着没有改变。
  3. encoder 不完全在工作。有时候一往左就关,一往右就亮。有时候啥也没发生。

这是我的代码:

//Include the Arduino Stepper.h library
#include <Stepper.h>

//Include the encoder library
#include <Encoder.h>
Encoder myEnc(6, 5);   //define encoder pin; (OutA, OutB)


//define the pin
const int buttonPin = 2;        //button 1
const int ledPin = 3;           //12V led
const int touchPin = 4;         //capacitive touch sensor
const int wakePin = 12;         //button 2
const int stepsPerRevolution = 2048;   
Stepper myStepper = Stepper(stepsPerRevolution, 8, 10, 9, 11);     //stepper motor


//variables will change
int buttonState = 0;
int touchState = 0;
int wakeState = 0;
long int oldPosition = -999;  //encoder old position
long int newPosition;   //encoder new position
int positionDifference = 0;
int ledBrightness = 0;


//setup
void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(touchPin, INPUT);
  pinMode(wakePin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
  Serial.begin(12500);
} //end of setup()


//loop
void loop() {
  //read the state of the parts
  buttonState = digitalRead(buttonPin);
  touchState = digitalRead(touchPin);
  wakeState = digitalRead(wakePin);


  //use encoder to change the brightness
  newPosition = myEnc.read();
  if (newPosition != oldPosition) {
    positionDifference = newPosition - oldPosition;
    oldPosition = newPosition;
  } //end of if newposition

  ledBrightness = ledBrightness + positionDifference;
  ledBrightness = constrain(ledBrightness, 0, 30);     // maximum led brightness
  analogWrite(ledPin, ledBrightness);



  //use two buttons and sensor to control the motor and led
  if (buttonState == LOW) {

    if (touchState == HIGH) {                                           //Serial.println("counterclockwise_superfast_OpenLight_ButtonPressed");
      myStepper.setSpeed(15);  //set the speed to 15 rpm
      myStepper.step(stepsPerRevolution);  //counterclockwise
    } else {
      if (wakeState == LOW) {                                         //Serial.println("clockwise_slow_Wakeup_ButtonPressedWakePressed");
        myStepper.setSpeed(5);  //set the speed to 5 rpm
        myStepper.step(-stepsPerRevolution);  //clockwise
      } else {                                                        //Serial.println("stopEverything");      button pressed, sensor untouched, wake unpressed
        digitalWrite(ledPin, LOW);  //led LOW
      }//end of wakeState LOW
    } //end of touchState HIGH

  } else {

    if (touchState == HIGH) {                                           //Serial.println("clockwise_fast_CloseLight_ButtonUnpressed");
      myStepper.setSpeed(10);  //set the speed to 10 rpm
      myStepper.step(stepsPerRevolution); //clockwise
    } else {                                                            //Serial.println("counterclockwise_superslow_WhenSleep_ButtonUnpressed");
      myStepper.setSpeed(2);
      myStepper.step(-stepsPerRevolution);
    } //end of touchState HIGH

  } //end of buttonState LOW

} //end of loop()

这是我的手绘线路图:

嘗試將每個組件放在一個小草圖中以產生您期望的輸出,尤其是旋轉編碼器,以驗證它是否具有離散步驟,或者它是否“嘈雜”。 祝你好運,享受你的發現。

谢谢。

我之前用过Serial.println测试过整个if (),当我控制按钮和感应器时,println的结果是正确的。但当我连接上led和motor后,一切似乎很随机。

之前我单独测试旋转编码器的时候,它是可以运作的。它的Serial.println是对的:positionDifference顺时针时+1,逆时针时-1。但是当我连上led后,led并不能改变亮度。

刚刚我又试了一下,只运行led和旋转编码器,用的是
Serial.println(positionDifference);,它会从999开始变化。
Serial.printlnledBrightness);一直是50。

请问您知道是为什么吗, 非常感激。

也许使用外部电源为 LED 和电机供电。 它们的总功耗是否会降低 ARDUINO 的板载功耗,导致逻辑电平随机失效?

The forum will not let me post in Chinese, so I am writing this in English to make the forum post the Chinese answer. Sometimes we have to outsmart computers and the code written for them.

1 Like

听起来很有道理!所以您有任何什么建议吗?谢谢。

该电源通常与无焊面包板套件一起提供...

...但是您的电源(电源变压器)应该提供足够的电流来为您展示的所有东西供电。

好的我会看看。谢谢。

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.