Arduino - 按钮控制电磁锁
In this tutorial, we are going to learn how to use Arduino and button to control the electromagnetic lock. When the button is pressed, Arduino deactivates the electromagnetic lock to unlock the door for a certain time (e.g. 10 seconds). After that, it Arduino activates the electromagnetic lock to lock the door.
在本教程中,我们将学习如何使用Arduino和按钮来控制电磁锁。按下按钮时,Arduino会停用电磁锁以解锁门一段时间(例如10秒)。之后,它Arduino激活电磁锁以锁定门。
We will learn by two steps from easy to difficult:
我们将通过从易到难的两步学习:
- The electromagnetic lock is controlled by Arduino and a button without debouncing (easy).
电磁锁由Arduino和一个按钮控制,无需去抖动(简单)。 - The electromagnetic lock is controlled by Arduino and a button with debouncing (difficult).
电磁锁由Arduino和带去抖动(困难)的按钮控制。
Hardware Required 所需硬件
About Button and Electromagnetic Lock 关于按钮和电磁锁
If you do not know about electromagnetic lock and button (pinout, how it works, how to program …), learn about them in the following tutorials:
如果您不了解电磁锁和按钮(引脚排列、工作原理、如何编程等),请在以下教程中了解它们:
Wiring Diagram 接线图
This image is created using Fritzing. Click to enlarge image
此图像是使用 Fritzing 创建的。点击放大图片
Arduino Code - Button Controls Electromagnetic Lock Without Debouncing Arduino Code - 按钮控制电磁锁定,无需去抖动
/*
* Created by ArduinoGetStarted.com
*
* This example code is in the public domain
*
* Tutorial page: https://arduinogetstarted.com/tutorials/arduino-button-controls-electromagnetic-lock
*/
// constants won't change
const int BUTTON_PIN = 7; // Arduino pin connected to button's pin
const int RELAY_PIN = 3; // Arduino pin connected to relay's pin
// variables will change:
int lastButtonState; // the previous state of button
int currentButtonState; // the current state of button
void setup() {
Serial.begin(9600); // initialize serial
pinMode(BUTTON_PIN, INPUT_PULLUP); // set arduino pin to input pull-up mode
pinMode(RELAY_PIN, OUTPUT); // set arduino pin to output mode
digitalWrite(RELAY_PIN, HIGH); // lock the door
currentButtonState = digitalRead(BUTTON_PIN);
}
void loop() {
lastButtonState = currentButtonState; // save the last state
currentButtonState = digitalRead(BUTTON_PIN); // read new state
if(lastButtonState == HIGH && currentButtonState == LOW) {
Serial.println("The button is pressed");
digitalWrite(RELAY_PIN, LOW); // unlock the door in 10 seconds
delay(10000); // 10 seconds
digitalWrite(RELAY_PIN, HIGH); // lock the door again
}
}
Code Explanation 代码说明
Read the line-by-line explanation in comment lines of code!
阅读代码注释行中的逐行说明!
※ NOTE THAT: ※ 注意事项:
In practice, the above code does not work correctly sometimes. To make it always work correctly, we need to debounce for the button. Debouncing for the button is not easy for beginners. Fortunately, thanks to the ezButton library, We can do it easily.
在实践中,上述代码有时无法正常工作。为了使其始终正常工作,我们需要对按钮进行去抖动。对于初学者来说,按钮的去弹跳并不容易。幸运的是,多亏了ezButton库,我们可以轻松做到这一点。
Arduino Code - Button Controls Electromagnetic Lock With Debouncing Arduino 代码 - 按钮控制带去抖动的电磁锁定
Why do we need debouncing? ⇒ see Arduino - Button Debounce tutorial
为什么我们需要去抖动?⇒请参阅 Arduino - Button Debounce 教程
/*
* Created by ArduinoGetStarted.com
*
* This example code is in the public domain
*
* Tutorial page: https://arduinogetstarted.com/tutorials/arduino-button-controls-electromagnetic-lock
*/
#include <ezButton.h>
// constants won't change
const int BUTTON_PIN = 7; // Arduino pin connected to button's pin
const int RELAY_PIN = 3; // Arduino pin connected to relay's pin
ezButton button(BUTTON_PIN); // create ezButton object that attach to pin 7;
void setup() {
Serial.begin(9600); // initialize serial
pinMode(RELAY_PIN, OUTPUT); // set arduino pin to output mode
button.setDebounceTime(50); // set debounce time to 50 milliseconds
digitalWrite(RELAY_PIN, HIGH); // lock the door
}
void loop() {
button.loop(); // MUST call the loop() function first
if(button.isPressed()) {
Serial.println("The button is pressed");
digitalWrite(RELAY_PIN, LOW); // unlock the door in 10 seconds
delay(10000); // 10 seconds
digitalWrite(RELAY_PIN, HIGH); // lock the door again
}
}
※ NOTE THAT: ※ 注意事项:
In the above code, we used the delay function. Therefore, we do not need to debouncing for button. However, We still provide the code with debouncing just in case you want to do more tasks without using delay function. See How to use millis() instead of delay()
在上面的代码中,我们使用了延迟函数。因此,我们不需要为按钮去抖动。但是,我们仍然提供具有去抖动功能的代码,以防万一您想在不使用延迟功能的情况下执行更多任务。请参阅如何使用 millis()
而不是 delay()
Video Tutorial 视频教程
We are considering to make the video tutorials. If you think the video tutorials are essential, please subscribe to our YouTube channel to give us motivation for making the videos.
我们正在考虑制作视频教程。如果您认为视频教程是必不可少的,请订阅我们的 YouTube 频道,为我们制作视频提供动力。