【雕爷学编程】Arduino动手做(54)---大按键微动按钮模块2

在这里插入图片描述

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验五十四:按键模块 电子积木轻触开关 大按键微动按钮 兼容arduino 树莓派

在这里插入图片描述

按键开关模块实验所需硬件器材
Arduino Uno 单片机 开发板X1
按键开关模块 X1
杜邦线 X3

在这里插入图片描述

知识点:Arduino
Arduino是一款便捷灵活、方便上手的开源电子原型平台。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。由一个欧洲开发团队于2005年冬季开发。它构建于开放原始码simple I/O介面版,并且具有使用类似Java、C语言的Processing/Wiring开发环境。主要包含两个的部分:硬件部分是可以用来做电路连接的Arduino电路板;另外一个则是Arduino IDE,你的计算机中的程序开发环境。你只要在IDE中编写程序代码,将程序上传到Arduino电路板后,程序便会告诉Arduino电路板要做些什么了。

Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。对Arduino的编程是通过 Arduino编程语言 (基于 Wiring)和Arduino开发环境(基于 Processing)来实现的。基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,它们之间进行通信 (比如 Flash, Processing, MaxMSP)来实现。

Arduino IDE基于processing IDE开发。对于初学者来说,极易掌握,同时有着足够的灵活性。Arduino语言基于wiring语言开发,是对 avr-gcc库的二次封装,不需要太多的单片机基础、编程基础,简单学习后,你也可以快速的进行开发。Arduino的硬件原理图、电路图、IDE软件及核心库文件都是开源的,在开源协议范围内里可以任意修改原始设计及相应代码。

Arduino不仅仅是全球最流行的开源硬件,也是一个优秀的硬件开发平台,更是硬件开发的趋势。Arduino简单的开发方式使得开发者更关注创意与实现,更快的完成自己的项目开发,大大节约了学习的成本,缩短了开发的周期。因为Arduino的种种优势,越来越多的专业硬件开发者已经或开始使用Arduino来开发他们的项目、产品;越来越多的软件开发者使用Arduino进入硬件、物联网等开发领域;大学课题,自动化、软件,甚至艺术专业,也纷纷开展了Arduino相关课程。

按键开关模块实验目的
1、熟悉由Arduino搭建的电子实验平台;
2、掌握按键开关应用这一常用的人机交互方法;
3、学会通过Arduino IDE串口来观察按键模块的状态;
4、理解独立按键的控制原理,能用按键开关模块来控制执行器LED灯的亮灭;
5、通过代码编程、仿真编程和图形编程三种方式互相配合,相互验证,来加深理解。

知识点:实验(experiment )
指的是科学研究的基本方法之一。根据科学研究的目的,尽可能地排除外界的影响,突出主要因素并利用一些专门的仪器设备,而人为地变革、控制或模拟研究对象,使某一些事物(或过程)发生或再现,从而去认识自然现象、自然性质、自然规律。

编程(Programming)
编程是编定程序的中文简称,就是让计算机(单片机)解决某个问题,对某个计算体系规定一定的运算方式,使计算体系按照该计算方式运行,并最终得到相应结果的过程。为了使计算机(单片机)能够理解人的意图,人类就必须将需解决的问题的思路、方法和手段通过计算机(单片机)能够理解的形式告诉计算机(单片机),使得计算机(单片机)能够根据人的指令一步一步去工作,完成某种特定的任务。这种人和计算体系之间交流的过程就是编程。编程:设计具备逻辑流动作用的一种“可控体系”。

注:编程不一定是针对计算机(单片机)程序而言的,针对具备逻辑计算力的体系,都可以算编程。

按键开关模块的几个小实验
相关实验接线的直观示意图(按键与拉电阻组成按键模块)

在这里插入图片描述
相关实验接线的电原理图

在这里插入图片描述
程序一:通过串口读取按键开关模块的按键输出值
实验参考开源代码(Arduino):

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序一:通过串口读取按键开关模块的按键输出值
  使用模块:下拉电阻按键开关模块
  实验接线:按键开关接D2
*/

const int switchPin = 2;  // 按键开关连接引脚2

void setup() {
    
    
  pinMode(switchPin, INPUT);  // 设置引脚2为输入模式
  Serial.begin(9600); // 设置串口波特率为9600
}

void loop() {
    
    
  int switchValue = 0; //定义变量并赋初值为0
  switchValue = digitalRead(switchPin);  //读取引脚2的值
  Serial.print(" Value of switch = ");  //输出到串口监视器
  Serial.println(switchValue); //将读取的按键值输出到串口监视器
  delay(100);
}

知识点:串行接口(Serial Interface)
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。

串口的出现是在1980年前后,数据传输率是115kbps~230kbps。串口出现的初期是为了实现连接计算机外设的目的,初期串口一般用来连接鼠标和外置Modem以及老式摄像头和写字板等设备。串口也可以应用于两台计算机(或设备)之间的互联及数据传输。由于串口(COM)不支持热插拔及传输速率较低,部分新主板和大部分便携电脑已开始取消该接口。串口多用于工控和测量设备以及部分通信设备中。

本系列实验中提到的串口通信一般指Arduino上面的USART通信模式,USART也是串行通信的一种,可以有硬串口,软串口两种实现方式,并且USART是一种异步串行通信。

实验串口返回情况

在这里插入图片描述
实验一用到的Arduino二个概念与解释
1.DigitalPins<数字引脚>
配置为INPUT的引脚的属性——
Arduino(Atmega)引脚默认为输入,因此在将它们用作输入时,不需要使用pinMode()将它们明确声明为输入。据说以这种方式配置的引脚处于高阻抗状态。输入引脚对要采样的电路的要求极小,相当于引脚前面有一个100兆欧的串联电阻。这意味着只需很少的电流就可以将输入引脚从一种状态转移到另一种状态,并且可以使这些引脚用于实现电容式触摸传感器,将LED读取为光电二极管或使用方案读取模拟传感器等任务。但是,这也意味着配置为pinMode(pin,INPUT)且未连接任何引脚或未连接任何其他电路的导线的引脚,将报告看似随机变化的引脚,从而从引脚上拾取电噪声,影响环境或电容耦合附近引脚的状态。

带引脚的上拉电阻配置为INPUT——
如果不存在输入,通常将输入引脚转向已知状态很有用。这可以通过在输入端增加上拉电阻(至+ 5V)或下拉电阻(接地电阻)来实现。对于上拉或下拉电阻,10K电阻是一个不错的选择。

配置为INPUT_PULLUP的引脚的属性——
Atmega芯片内置了20K上拉电阻,可通过软件进行访问。通过将pinMode()设置为INPUT_PULLUP可以访问这些内置的上拉电阻。这有效地反转了INPUT模式的行为,其中HIGH表示传感器处于关闭状态,而LOW表示传感器处于开启状态。该上拉的值取决于所使用的微控制器。在大多数基于AVR的板上,该值保证在20kΩ至50kΩ之间。

将传感器连接到配置有INPUT_PULLUP的引脚时,另一端应接地。对于简单的开关,这会导致该引脚在开关断开时读为高电平,在按下开关时读为低电平。上拉电阻提供足够的电流,以使连接到已配置为输入的引脚的LED暗淡地发光。如果项目中的LED似乎工作正常,但效果非常暗淡,则很可能正在发生这种情况。

上拉电阻由相同的寄存器(内部芯片存储单元)控制,这些寄存器控制引脚为高电平还是低电平。因此,如果某个引脚被配置为在输入为INPUT时接通上拉电阻,则该引脚如果随后通过pinMode()切换至OUTPUT,则该引脚将被配置为HIGH。这也可以在另一个方向上起作用,如果使用pinMode()切换到输入,则处于高电平状态的输出引脚将设置上拉电阻。
在Arduino 1.0.1之前,可以通过以下方式配置内部上拉:

pinMode(pin, INPUT);   // set pin to inputdigitalWrite(pin, HIGH);  // 开启上拉电阻

注意:数字引脚13比其他数字引脚更难用作数字输入,因为它具有LED和连接到其上的电阻器,该LED和电阻器已焊接到大多数板上的板上。如果启用其内部20k上拉电阻,它将挂在1.7V左右,而不是预期的5V,因为板载LED和串联电阻将电压电平拉低,这意味着它始终返回LOW。如果必须将引脚13用作数字输入,请将其pinMode()设置为INPUT并使用外部下拉电阻。

配置为OUTPUT的引脚的属性——
通过pinMode()配置为OUTPUT的引脚被称为处于低阻抗状态。这意味着它们可以为其他电路提供大量电流。Atmega引脚可以向其他设备/电路提供(提供正电流)或吸收(提供负电流)高达40 mA(毫安)的电流。例如,此电流足以点亮LED(不要忘记串联电阻)或运行许多传感器,但电流不足以运行大多数继电器,螺线管或电动机。

Arduino引脚上的短路,或尝试使用它们运行大电流设备,可能会损坏或破坏引脚上的输出晶体管,或者损坏整个Atmega芯片。通常,这会导致微控制器中的“死”引脚,但其余芯片仍将正常工作。因此,最好将输出引脚连接到具有470Ω或1k电阻的其他设备,除非特定应用需要从引脚吸收最大电流。

2.serial<通讯>
描述——用于Arduino开发板与计算机或其他设备之间的通信。所有Arduino板都有至少一个串行端口(也称为UART或USART),有的具有多个。

在Uno,Nano,Mini和Mega上,针脚0和1用于与计算机通信。将任何东西连接到这些引脚都可能干扰该通信,包括导致无法成功上传到板上。您可以使用Arduino环境的内置串行监视器与Arduino板进行通信。单击工具栏中的串行监视器按钮,然后选择与调用时使用的波特率相同的波特率begin()。

TX / RX引脚上的串行通信使用TTL逻辑电平(5V或3.3V,取决于板)。不要将这些引脚直接连接到RS232串行端口。它们的工作电压为+/- 12V,可能会损坏Arduino开发板。

要使用这些额外的串行端口与您的个人计算机进行通信,您将需要一个额外的USB到串行适配器,因为它们没有连接到Mega的USB到串行适配器。要使用它们与外部TTL串行设备进行通信,请将TX引脚连接到设备的RX引脚,将RX连接到设备的TX引脚,并将Mega的接地端连接到设备的地面。

实验结果:
未按下开关时,串口连续输出Value of switch=0,按下开关则串口连续输出Value of switch=1,实现了用串口监视按键开关模块状态的目的。

程序二:串口简单计数器(按键中断)
实验参考开源代码(Arduino):

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序二:串口简单计数器(按键中断)
  在循环中,我们不断检测按键是否为高电位
  如果为高电位(按键按下),则计数加1;
  反之,不做动作(继续自动计数)
  实验接线:按键开关接D2
*/

#define anjian 2         //定义按键脚
int count = 0;           //定义初始count值

void setup() {
    
    
  Serial.begin(9600);     //设置波特率
  pinMode(anjian, INPUT);    //设置按键脚为输入模式
}

void loop() {
    
    
  if (digitalRead(anjian) == HIGH) // 当检测到按键按下时
  {
    
    
    delay(2);
    count = count + 1;              //计数加1
  }
  Serial.println(count);              //打印出count值
  delay(500);                     //延时一段时间再次检测
}

实验串口返回情况

在这里插入图片描述
实验结果:
未按下开关时,串口简单计数器一直自动计数,串口输出整数序列;当按下开关发生中断,串口连续输出中断时的数字,松开按键则继续计数。

知识点:中断
中断是指单片机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。中断的本质是处理器对外开放的实时受控接口。有了中断,单片机不用频繁地去查询这些条件是否具备,从而专心地进行工作,但中断发生时,又可以随时作出响应。

CPU好象一个大领导,如不让下级部门有事敲门或打电话向你反映问题,你还想了解情况,过一会儿不管有事无事你就得一个部门一个部门问一问,主动权全在你手里,可累不累呀,不如开放渠道(中断允许),告诉部下有事随时向我汇报,没事我该喝茶喝茶,该看报看报,这样既减轻了负担,又不会错过紧急事务。

实验二用到的Arduino函数
If 如果<控制结构>
描述——
该if语句检查条件,如果条件为“ true”,则执行其以下语句或语句集。
句法——

if (condition) {
    
    
  //声明
}

参数——
condition:布尔表达式(即可以是true或false)。
范例程式码——
如果使用if语句,则可以省略方括号。如果这样做,下一行(由分号定义)将成为唯一的条件语句。

if (x > 120) digitalWrite(LEDpin, HIGH);
if (x > 120)
digitalWrite(LEDpin, HIGH);
if (x > 120) {
    
    digitalWrite(LEDpin, HIGH);}
if (x > 120) {
    
    
  digitalWrite(LEDpin1, HIGH);
  digitalWrite(LEDpin2, HIGH);
}

注意和警告——
括号内要评估的语句需要使用下面显示的一个或多个运算符。比较运算符:
x == y(x等于y)
x!= y(x不等于y)
x <y(x小于y)
x> y(x大于y)
x <= y(x小于或等于y)
x> = y(x大于或等于y)
当心使用单个等号(例如if (x = 10))。单个等号是赋值运算符,并设置x为10(将值10放入变量x)。而是使用if (x == 10)比较运算符double等号(例如),并测试是否 x等于10。后面的语句只有在x等于10时才是正确的,但是前面的语句将始终是正确的。
这是因为C ++对语句的评估if (x=10)如下:将10赋值给x(请记住,单个等号是(赋值运算符)),因此x现在包含10。然后,如果条件条件为’if’,则其赋值为10 TRUE,因为任何非零数字的计算结果为TRUE。因此,if (x = 10)将始终计算为TRUE,这是使用’if’语句时所不希望的结果。此外,该变量x将设置为10,这也不是所需的操作。

程序三:利用按键开关模块点动控制板载LED(开发板D13脚)
实验原理:
在Arduino Uno控制电路板上已经在13号引脚上集成了LED显示,所以只需要一个按钮模块就可以构建一个简单的电路来使LED点亮(板子上对应的L)。由于LED已经连接到板子的13引脚,只需将按钮模块连接到数字引脚2,当按钮模块识别感应按钮按下信号时,LED将亮起,否则它将关闭。

实验参考开源代码(Arduino):

/*
  【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  程序三:通过按键开关模块,点动控制板载LED灯的亮灭
  使用:上拉电阻按键开关模块
  接线:按键开关接D2
*/

const int switchPin = 2;  // 按键开关连接引脚2
const int redLedPin = 13;  // 引脚13板载LED灯

void setup() {
    
    
  pinMode(switchPin, INPUT);  // 设置引脚2为输入模式
  pinMode(redLedPin, OUTPUT);  //设置引脚13为输出模式
}

void loop() {
    
    
  int switchValue = 0; //定义变量并赋初值为0
  switchValue = digitalRead(switchPin);  //读取引脚2的值
  if (switchValue == 0) {
    
       //判断键值等于0,执行下面的程序
    digitalWrite(redLedPin, HIGH); //点亮LED
  }
  else {
    
      //判断键值不为0,将执行下面的语句
    digitalWrite(redLedPin, LOW); //熄灭LED
  }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/132235886