Arduino - Keypad 键盘

Arduino - Keypad

Arduino - Keypad

The keypad is widely used in many devices such as door lock, ATM, calculator…
键盘广泛应用于门锁、ATM、计算器等多种设备中。

In this tutorial, we will learn:
在本教程中,我们将学习:

  • How to use keypad 3x4 and keypad 4x4 with Arduino.
    如何将键盘 3x4 和键盘 4x4 与 Arduino 一起使用。
  • How to read value from keypad 3x4 and keypad 4x4 with Arduino.
    如何使用 Arduino 从键盘 3x4 和键盘 4x4 读取值。
  • How to verify the password inputted from keypad
    如何验证从键盘输入的密码

About Keypad 关于键盘

Keypad

The keypad is a set of buttons arranged in rows and columns (called matrix). Each button is called key
键盘是一组按行和列排列的按钮(称为矩阵)。每个按钮都称为键

Keypad has various types. Two popular types for DIY projects are keypad 3x4 (12 keys) and keypad 4x4 (16 keys).
键盘有多种类型。DIY 项目的两种流行类型是键盘 3x4(12 键)和键盘 4x4(16 键)。

Pinout 引脚排列

Keypad pins are divided into two groups: row and column.
键盘引脚分为两组:行和列。

Keypad 3x4 has 7 pins: 4 row-pins (R1, R2, R3, R4) and 3 column-pin (C1, C2, C3).
键盘 3x4 有 7 个引脚:4 个排引脚(R1、R2、R3、R4)和 3 列引脚(C1、C2、C3)。

Keypad 4x4 has 8 pins: 4 row-pins (R1, R2, R3, R4) and 4 column-pin (C1, C2, C3, C4).
键盘 4x4 有 8 个引脚:4 个排引脚(R1、R2、R3、R4)和 4 列引脚(C1、C2、C3、C4)。

Keypad Pinout

How It Works 它是如何工作的

This section is the in-depth knowledge. DON’T worry if you don’t understand. Ignore this section if it overloads you, and come back in another day. Keep reading the next sections.
本节是深入的知识。如果您不明白,请不要担心。如果它使您超负荷,请忽略此部分,并在另一天再回来。继续阅读下一节。

The process of detecting the key pressing is called scanning keypad.
检测按键的过程称为扫描键盘。

It is called “scanning” because it checks one key by one key.
它被称为“扫描”,因为它逐个键检查一个键。

Row-pins are connected to Arduino’s output pins
Row-pin连接到Arduino的输出引脚

Column pins are connected to Arduino’s input pins (INPUT_PULLUP, in this state, the value of the input pin is HIGH if the key is not pressed).
列引脚连接到Arduino的输入引脚(INPUT_PULLUP,在此状态下,如果未按下该键,则输入引脚的值为HIGH)。

For each row: 对于每一行:

  • Sets all row-pins is HIGH.
    将所有行引脚设置为高电平。
  • Sets only the current row-pin to LOW.
    仅将当前行引脚设置为低电平。
  • Reads the state of each column.
    读取每列的状态。
    • If a column-pin is HIGH ⇒ key at (row, column) is NOT pressed.
      如果列引脚为高电平,则不按下 (行、列) 处⇒键。
    • If a column-pin is LOW ⇒ key at (row, column) is pressed.
      如果列引脚为低电平,则按下 (行、列) 处⇒键。
  • Repeats the above process for the next row-pins.
    对下一个行引脚重复上述过程。

※ NOTE THAT: ※ 注意事项:

The above is one of the methods to scan keypad. We can invert all HIGH to LOW and all LOW to HIGH to scan keypad.
以上是扫描键盘的方法之一。我们可以将所有高电平反转为低电平,将所有低电平反转为高电平以扫描键盘。

Why does keypad is arranged and connected as a matrix? This makes the scanning process complicated. Why do not use each key as an independent button, then the state of the key is simply determined by reading the state of a button?
为什么键盘是以矩阵的形式排列和连接的?这使得扫描过程变得复杂。为什么不把每个键都当成一个独立的按钮,那么键的状态就是通过读取一个按钮的状态来确定的呢?

⇒ As we know, an independent button requires one Arduino’s pin and GND. Let’s take keypad 4x4 as an example. If we each key as an independent button, it requires 16 Arduino pin for 16 keys plus GND pin. If we arranged a connected key in matrix form, we just need to use 8 Arduino’s pin, so we can save Arduino’s pin. In short, the answer is: to save the Arduino pins.
⇒ 众所周知,一个独立的按钮需要一个Arduino的引脚和GND。让我们以键盘 4x4 为例。如果我们每个按键作为一个独立的按钮,它需要 16 个 Arduino 引脚用于 16 个按键加上 GND 引脚。如果我们以矩阵形式排列一个连接的密钥,我们只需要使用 8 个 Arduino 的引脚,这样我们就可以保存 Arduino 的引脚。简而言之,答案是:保存Arduino引脚。

Wiring Diagram 接线图

Arduino Keypad Wiring Diagram

This image is created using Fritzing. Click to enlarge image
此图像是使用 Fritzing 创建的。点击放大图片

How To Program For Keypad 如何为键盘编程

Thanks to Keypad library, using keypad with Arduino is a piece of cake, no matter whether you understand how the keypad works or not.
多亏了键盘库,无论您是否了解键盘的工作原理,使用带有 Arduino 的键盘都是小菜一碟。

Arduino Code Arduino代码

Keypad 3x4 键盘 3x4

#include <Keypad.h>const int ROW_NUM = 4; //four rows
const int COLUMN_NUM = 3; //three columnschar keys[ROW_NUM][COLUMN_NUM] = {{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}
};byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {5, 4, 3}; //connect to the column pinouts of the keypadKeypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );void setup(){Serial.begin(9600);
}void loop(){char key = keypad.getKey();if (key){Serial.println(key);}
}

Keypad 4x4 键盘 4x4

#include <Keypad.h>const int ROW_NUM = 4; //four rows
const int COLUMN_NUM = 4; //four columnschar keys[ROW_NUM][COLUMN_NUM] = {{'1','2','3', 'A'},{'4','5','6', 'B'},{'7','8','9', 'C'},{'*','0','#', 'D'}
};byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {5, 4, 3, 2}; //connect to the column pinouts of the keypadKeypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );void setup(){Serial.begin(9600);
}void loop(){char key = keypad.getKey();if (key){Serial.println(key);}
}

Quick Steps 快速步骤

  • Navigate to the Libraries icon on the left bar of the Arduino IDE.
    导航到 Arduino IDE 左侧栏上的 Libraries 图标。
  • Search “keypad”, then find the keypad library by Mark Stanley, Alexander Brevig
    搜索“键盘”,然后找到 Mark Stanley、Alexander Brevig 的键盘库
  • Click Install button to install keypad library.
    单击“安装”按钮安装键盘库。

Arduino keypad library

  • Copy the above code and open with Arduino IDE
    复制上面的代码并使用Arduino IDE打开
  • Click Upload button on Arduino IDE to upload code to Arduino
    单击Arduino IDE上的“上传”按钮,将代码上传到Arduino
  • Open Serial Monitor 开放式串行监视器
  • Press some keys on keypad
    按键盘上的一些键
  • See the result in Serial Monitor
    在串行监视器中查看结果

Keypad and Password 键盘和密码

A popular application of keypad is the password input. In this application, we specify two special keys:
键盘的一个流行应用是密码输入。在此应用程序中,我们指定了两个特殊键:

  • A key to start/re-start the password input. For example, key ""
    用于启动/重新启动密码输入的密钥。例如,键“
  • A key to terminate the password input. For example, key “#”
    用于终止密码输入的键。例如,键“#”

The password will be a string that contains the remaining keys, except for two selected special keys.
密码将是一个字符串,其中包含其余密钥,但两个选定的特殊密钥除外。

When a key is pressed.
按下某个键时。

  • If the key is NOT neither "" nor “#”, append the key to the user’s input password string.
    如果密钥既不是“
    ”也不是“#”,则将密钥追加到用户的输入密码字符串中。
  • If the key is “#”, compare the user’s input password string with the password to determine the input password is correct or not, and then clear the user’s input password string
    如果密钥为“#”,则将用户的输入密码字符串与密码进行比较,以确定输入密码是否正确,然后清除用户的输入密码字符串
  • If the key is "", clear the user’s input password string
    如果密钥为“
    ”,请清除用户的输入密码字符串

Keypad - Password Code 键盘 - 密码代码

/** Created by ArduinoGetStarted.com** This example code is in the public domain** Tutorial page: https://arduinogetstarted.com/tutorials/arduino-keypad*/#include <Keypad.h>const int ROW_NUM = 4; //four rows
const int COLUMN_NUM = 3; //three columnschar keys[ROW_NUM][COLUMN_NUM] = {{'1','2','3'},{'4','5','6'},{'7','8','9'},{'*','0','#'}
};byte pin_rows[ROW_NUM] = {9, 8, 7, 6}; //connect to the row pinouts of the keypad
byte pin_column[COLUMN_NUM] = {5, 4, 3}; //connect to the column pinouts of the keypadKeypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );const String password = "1234"; // change your password here
String input_password;void setup(){Serial.begin(9600);input_password.reserve(32); // maximum input characters is 33, change if needed
}void loop(){char key = keypad.getKey();if (key){Serial.println(key);if(key == '*') {input_password = ""; // clear input password} else if(key == '#') {if(password == input_password) {Serial.println("password is correct");// DO YOUR WORK HERE} else {Serial.println("password is incorrect, try again");}input_password = ""; // clear input password} else {input_password += key; // append new character to input password string}}
}
  • Run above code 运行上述代码
  • Open Serial Monitor 开放式串行监视器
  • Press “123456” keys and press “#”
    按“123456”键,按“#”
  • Press “1234” keys and press “#”
    按“1234”键,按“#”
  • See the result on Serial Monitor
    在串行监视器上查看结果

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 频道,为我们制作视频提供动力。

Additional Knowledge 其他知识

  • How to use the multiple passwords for keypad
    如何使用键盘的多个密码
  • How to input a multiple digits number using the keypad
    如何使用键盘输入多位数字

Challenge Yourself 挑战自我

  • Display the pressed key of the keypad on LCD. Hint: Refer to Arduino - LCD
    在 LCD 上显示键盘的按键。提示:请参阅Arduino - LCD
  • Make a door lock with password protection using the keypad.
    使用键盘制作带有密码保护的门锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/362943.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高性价比蓝牙耳机有哪些?2024超高性价比蓝牙耳机推荐

在2024移动互联网高速发展的时代&#xff0c;蓝牙耳机已成为我们生活中不可或缺的一部分。走在街头&#xff0c;低头看手机&#xff0c;滑动屏幕选歌&#xff0c;耳边传来清晰的旋律&#xff0c;这一幕已经成为现代生活的标配。但面对市场上琳琅满目的蓝牙耳机品牌和型号&#…

LabVIEW在光学与光子学实验室中的应用

光学与光子学实验室致力于光学和光子学前沿领域的研究&#xff0c;涉及超快光学、非线性光学、光纤通信、光子晶体等多个方向。实验室需要高精度的实验控制和数据采集系统&#xff0c;以进行复杂的光学实验&#xff0c;并对实验数据进行实时处理和分析。 项目需求 实时控制与监…

spring和springboot的关系是什么?

大家好&#xff0c;我是网创有方的站长&#xff0c;今天给大家分享下spring和springboot的关系是什么&#xff1f; Spring和Spring Boot之间的关系可以归纳为以下几个方面&#xff1a; 技术基础和核心特性&#xff1a; Spring&#xff1a;是一个广泛应用的开源Java框架&#…

码农:如何快速融入团队

问题&#xff1a; 码农如何快速融入团队&#xff1f; 记住一个标准&#xff1a;能干事、能抗事。 总结一个字&#xff1a; 靠谱。 适用范围&#xff1a;新手码农、老司机码农、测试、DBA、运维、产品经理、项目经理、架构师、技术专家、。。。。适用于任何行业的打工者。 下面要…

C++20中的Feature Test Mocros

C20定义了一组预处理器宏&#xff0c;用于测试各种语言和库的feature。 Feature Test Mocros(特性测试宏)是C20中引入的一种强大机制&#xff0c;用于应对兼容性问题。Feature Test Mocros作为预处理器指令(preprocessor directives)出现&#xff0c;它使你能够在编译过程中仔细…

江科大笔记—FLASH闪存

FLASH闪存 程序现象&#xff1a; 1、读写内部FLASH 这个代码的目的&#xff0c;就是利用内部flash程序存储器的剩余空间&#xff0c;来存储一些掉电不丢失的参数。所以这里的程序是按下K1变换一下测试数据&#xff0c;然后存储到内部FLASH&#xff0c;按下K2把所有参数清0&…

成熟ICT测试系统与LabVIEW定制开发的比较

ICT&#xff08;In-Circuit Test&#xff09;测试系统是电子制造行业中用于电路板&#xff08;PCB&#xff09;组件检测的重要工具。市场上有许多成熟的ICT测试系统&#xff0c;如Keysight、Teradyne、SPEA等公司提供的商用解决方案。此外&#xff0c;LabVIEW作为一种强大的图形…

python练习题2

python期考复习题 目录 1. 判断n**2的值每一位互不相同​编辑 2. 密码 3. 图书版号 4. 情感分类矩阵 5. 计算数对个数 1. 判断n**2的值每一位互不相同 def isdiff(n):sstr(n)for i in range(len(s)):for j in range(len(s)):if i!j:if s[i]s[j]:return Falsereturn Truel…

Windows和Linux C++判断磁盘空间是否充足

基本是由百度Ai写代码生成的&#xff0c;记录一下。实现此功能需要调用系统的API函数。 对于Windows&#xff0c;可调用函数GetDiskFreeSpaceEx&#xff0c;使用该函数需要包含头文件windows.h。该函数的原型&#xff1a; 它的四个参数&#xff1a; lpDirectoryName&#xff0…

Spring项目报错解读与全部报错详解

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我…

RIP动态路由配置

1、搭建网络 搭建拓扑、规划IP地址、划分网段、设置端口 2、配置交换机&#xff0c;路由器 三层交换机配置 Switch>enable Switch#conf t Enter configuration commands, one per line. End with CNTL/Z. Switch(config)#hostname S3560S3560(config)#vlan 10 S3560(con…

UE5基本操作(二)

文章目录 前言相机的移动速度修改默认地图使用初学者内容包文件夹结构 总结 前言 在我们的上一篇文章中&#xff0c;我们已经介绍了一些Unreal Engine 5&#xff08;UE5&#xff09;的基本操作。UE5是一款强大的游戏开发引擎&#xff0c;它提供了许多工具和功能&#xff0c;使…

CORE Mobility Errorr的调试

在运行CORE tutorial 3中的mobility示例时&#xff0c;出现如下错误&#xff1a; 当看到这个问题的时候&#xff0c;并没有仔细去分析日志和现象&#xff0c;在core-daemon的进程打印界面只看了一下最后的出错堆栈&#xff1a; 2024-06-27 10:43:48,614 - ERROR - _server:_ca…

CentOS安装Docker教程(包含踩坑的经验)

目录 一.基础安装 ▐ 安装Docker 二.启动Docker服务 三.配置Docker镜像加速 一.基础安装 在安装Docker之前可能需要先做以下准备 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-…

排序算法。

快速排序&#xff1a;QuickSort 选标准值&#xff0c;将比标准值小的放在其左侧&#xff0c;将比标准值大的放在其右侧&#xff0c;左右两部分分别重复以上操作 1.挖坑填补法 拆东墙补西墙 先把第一个数拿出来用temp储存 然后从最后面遍历 找到比temp小的放到第一个位置 然后…

代码随想录第36天|动态规划

62. 不同路径 补充: 对二维数组的操作 dp[j][i] 表示到 j,i 有多少种路径递推公式: dp[j][i] dp[j - 1][i] dp[j][i - 1]初始化: dp[0][i] 和 dp[j][0] 都只有1种情况遍历顺序: 由于dp[j][i] 由 上和左的元素推导, 所以采用从左到右、从上到下的遍历顺序 class Solution {…

【PL理论深化】(9) Ocaml 语言:自定义类型 | 异常处理 | 模块

&#x1f4ac; 写在前面&#xff1a;本章我们将继续介绍 OCaml 的基本特性&#xff0c;自定义类型、异常处理和模块。掌握了这些内容后&#xff0c;编写基本程序应该不会有太大困难。接下来的两节将学习函数式编程中常用的两种编程风格 —— 递归函数和高阶函数。 目录 0x00 …

python CSSE7030

1 Introduction In this assignment, you will implement a (heavily) simplified version of the video game ”Into The Breach”. In this game players defend a set of civilian buildings from giant monsters. In order to achieve this goal, the player commands a s…

基于51单片机的银行排队呼叫系统设计

一.硬件方案 本系统是以排队抽号顺序为核心&#xff0c;客户利用客户端抽号&#xff0c;工作人员利用叫号端叫号&#xff1b;通过显示器及时显示当前所叫号数&#xff0c;客户及时了解排队信息&#xff0c;通过合理的程序结构来执行排队抽号。电路主要由51单片机最小系统LCD12…

unity使用XR插件开发SteamVR项目,异常问题解决方法

一、unity使用XR插件开发SteamVR项目&#xff0c;运行后相机高度异常问题解决方法如下操作 &#xff08;一&#xff09;、开发环境 1、Unity 2021.3.15f 2、XR Interaction Toolkit Version 2.5.2 &#xff08;com.unity.xr.interaction.toolkit&#xff09; 3、OpenXR Pl…