智能衣架-个人笔记(不公开)

9 阅读3分钟

reset button 可以执行按钮

#define BUTTON_PIN 13      // 按钮接的 GPIO
#define RELAY_PIN  25      // 继电器控制引脚

bool lastButtonState = HIGH;
bool pressed = false;
unsigned long pressStartTime = 0;
const unsigned long pressDuration = 100;  // 按住100ms就松开

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);   // 使用内部上拉
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, HIGH);       // 初始断开(高电平)

  Serial.begin(115200);
  Serial.println("System Ready.");
}

void loop() {
  int buttonState = digitalRead(BUTTON_PIN);

  if (!pressed && buttonState == LOW && lastButtonState == HIGH) {
    // 按钮刚被按下
    Serial.println("Button Pressed: Triggering Relay");
    digitalWrite(RELAY_PIN, LOW);        // 启动继电器(啪)
    pressStartTime = millis();
    pressed = true;
  }

  // 到时间后松开继电器,避免长期连接
  if (pressed && millis() - pressStartTime > pressDuration) {
    digitalWrite(RELAY_PIN, HIGH);       // 断开继电器(松开)
    Serial.println("Relay released.");
    pressed = false;
  }

  lastButtonState = buttonState;
}

代码直接控制继电器(测试完毕 可运行✅)

#define RELAY_PIN 25  // 继电器连接 D25

void setup() {
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, HIGH); // 默认关闭

  delay(1000);                   // 等1秒
  digitalWrite(RELAY_PIN, LOW);  // 啪一声
  delay(1000);                   // 保持1秒
  digitalWrite(RELAY_PIN, HIGH); // 松开
}

void loop() {
  // 不做任何事
}

测试按钮(测试完毕 可运行✅)

#define BUTTON_PIN 13  // 你接在 D13 的按钮

void setup() {
  pinMode(BUTTON_PIN, INPUT_PULLUP);
  Serial.begin(115200);
  Serial.println("🟢 Button test started...");
}

void loop() {
  if (digitalRead(BUTTON_PIN) == LOW) {
    Serial.println("🔴 Button Pressed!");
    delay(300); // 防止刷屏
  } else {
    Serial.println("⚪️ Button Released");
    delay(300);
  }
}

按钮控制继电器(测试完毕 可运行✅)

// 定义引脚
const int buttonPin = 13;  // 按钮1引脚
const int relayPin = 33;   // 继电器引脚

// 定义变量
unsigned long lastButtonPress = 0;  // 上次按下按钮的时间
unsigned long debounceTime = 100;   // 按钮去抖动时间,100ms
unsigned long relayDuration = 200;  // 继电器输出持续时间,200ms
bool relayState = false;            // 继电器状态

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);  // 设置按钮引脚为输入,并启用内部上拉电阻
  pinMode(relayPin, OUTPUT);         // 设置继电器引脚为输出
  digitalWrite(relayPin, LOW);       // 初始化继电器状态为关闭
}

void loop() {
  int buttonState = digitalRead(buttonPin);  // 读取按钮状态

  // 检查按钮是否被按下(低电平)
  if (buttonState == LOW) {
    unsigned long currentTime = millis();  // 获取当前时间
    
    // 检查按钮是否按下并且超过了去抖动时间
    if (currentTime - lastButtonPress > debounceTime) {
      // 更新最后按下按钮的时间
      lastButtonPress = currentTime;
      
      // 激活继电器
      digitalWrite(relayPin, HIGH);
      relayState = true;
      
      // 设置一个定时器,200ms后关闭继电器
      delay(relayDuration);
      digitalWrite(relayPin, LOW);
      relayState = false;
    }
  }
}

四个按钮延迟版本(测试完毕 可运行✅)

// 引脚定义
const int relayPin = 33;    // 继电器控制引脚

const int btnA = 25;  // 模式A - 2秒
const int btnB = 26;  // 模式B - 4秒
const int btnC = 27;  // 模式C - 6秒
const int btnD = 14;  // 模式D - 8秒

// 防抖参数
unsigned long debounceTime = 100;
unsigned long lastPressA = 0;
unsigned long lastPressB = 0;
unsigned long lastPressC = 0;
unsigned long lastPressD = 0;

void setup() {
  // 初始化按钮引脚
  pinMode(btnA, INPUT_PULLUP);
  pinMode(btnB, INPUT_PULLUP);
  pinMode(btnC, INPUT_PULLUP);
  pinMode(btnD, INPUT_PULLUP);

  // 初始化继电器引脚
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, LOW);  // 默认关闭继电器
}

void loop() {
  unsigned long currentTime = millis();

  // 按钮A(2秒)
  if (digitalRead(btnA) == LOW && currentTime - lastPressA > debounceTime) {
    lastPressA = currentTime;
    digitalWrite(relayPin, HIGH);
    delay(2000);
    digitalWrite(relayPin, LOW);
  }

  // 按钮B(4秒)
  if (digitalRead(btnB) == LOW && currentTime - lastPressB > debounceTime) {
    lastPressB = currentTime;
    digitalWrite(relayPin, HIGH);
    delay(4000);
    digitalWrite(relayPin, LOW);
  }

  // 按钮C(6秒)
  if (digitalRead(btnC) == LOW && currentTime - lastPressC > debounceTime) {
    lastPressC = currentTime;
    digitalWrite(relayPin, HIGH);
    delay(6000);
    digitalWrite(relayPin, LOW);
  }

  // 按钮D(8秒)
  if (digitalRead(btnD) == LOW && currentTime - lastPressD > debounceTime) {
    lastPressD = currentTime;
    digitalWrite(relayPin, HIGH);
    delay(8000);
    digitalWrite(relayPin, LOW);
  }
}