arduino uno主控板 / Nano 主控板,读取按键开关的返回值?

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验五十四:按键模块 电子积木轻触开关 大按键微动按钮 兼容arduino 树莓派程序十二:按键次数的计数器(每隔5次点亮LED灯1次)实验说明:当每次按下或松开按键开关,都会打印相应的字符串,来显示当前的按键状态,并自动累计计数。而与此同时,Arduino UNO上的LED,也会在你每按六次按键点亮一次。实验参考开源代码(Arduino):/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十二:按键次数的计数器(每隔6次点亮LED灯1次)
使用:上拉电阻按键开关模块
接线:按键开关接D2
*/
// 定义按键的针脚号为2的整型常量
const int
buttonPin = 2;
// 定义LED输入针脚号为13号针脚
// 注:此处我们使用的LED灯是Arduino UNO电路板自带
// 此灯对应的针脚号默认为13,此数值不得随意更改
// 所以这里定义的数值13是为了和默认值相对应
const int ledPin = 13;
// 定义用来记录按键次数的整型变量
int buttonPushCounter = 0;
// 记录当前按键的状态
int buttonState = 0;
// 记录按键之前的状态
int lastButtonState = 0;
// 对Arduino电路板或相关状态进行初始化方法
void setup() {
// 设置按键的针脚为输入状态
pinMode(buttonPin, INPUT);
// 设置电路板上LED灯的针脚状态为输出状态
pinMode(ledPin, OUTPUT);
// 开启串行通信,并设置其频率为9600
// 如果没有特别要求,此数值一般都为9600
Serial.begin(9600);
}
// 系统调用,无限循环方法
void loop() {
// 读取按键的输入状态
buttonState = digitalRead(buttonPin);
// 判断当前的按键状态是否和之前有所变化
if (buttonState != lastButtonState) {
// 判断当前按键是否为按下状态,
// 如果为按下状态,则记录按键次数的变量加一。
if (buttonState == HIGH) {
// 将记录按键次数的变量加一
buttonPushCounter++;
// 向串口调试终端打印字符串“on”
// 表示当前按键状态为按下接通状态
// 输出完成之后自动换行
Serial.println("on");
// 向串口调试终端打印字符串
// “number of button pushes: ”,此处没有换行
Serial.print("number of button pushes:
");
// 接着上一行尾部,打印记录按键次数变量的数值
Serial.println(buttonPushCounter);
} else {
// 向串口调试终端打印字符串“off”
// 表示当前按键状态为松开状态,也即断开状态
Serial.println("off");
}
// 为了避免信号互相干扰
// 此处将每次按键的变化时间间隔延迟50毫秒
delay(50);
}
// 将每次loop结束时最新的按键状态进行更新
lastButtonState = buttonState;
// 每点击6次,更新一次LED灯状态
// 这里的百分号是求余数的意思
// 每次除以六,余数等于零说明按键点击的
// 次数是六的整数倍,即此时更新LED灯
if (buttonPushCounter % 6 == 0) {
// 点亮板载LED灯
digitalWrite(ledPin, HIGH);
} else {
// 熄灭板载LED灯
digitalWrite(ledPin, LOW);
}
}
实验串口返回情况程序十三:按键自锁控制LED(使用中断函数)实验说明:采用一个按钮控制,当按下按钮并松手时,led灯亮;当再次按下按钮并松手时,led灯灭。这里使用中断函数(attachInterrupt),使代码更简洁易懂。实验参考开源代码(Arduino):/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十三:按键自锁控制LED(简洁易懂的中断函数)
使用:上拉电阻按键开关模块
接线:按键开关接D2
*/
#define led 13
#define button 0
int state = LOW;
void setup() {
// 将你的设置代码放在此处,即可运行一次
pinMode(led, OUTPUT);
attachInterrupt(button, use, RISING);// 设置中断参数
}
void loop() {
// 把你的主要代码在这里,反复运行
digitalWrite(led, state);
}
void use() {
state = !state;
}
实验七用到的attachInterrupt()函数1.描述——attachInterrupt()函数是用于为Arduino开发板设置和执行ISR(中断服务程序)用的。ISR(中断服务程序)顾名思义就是中断Arduino当前正在处理的事情而优先去执行中断服务程序。当中断服务程序完成以后,再回来继续执行刚才执行的事情。中断服务程序对监测Arduino输入有很大的用处。我们可以使用attachInterrupt()函数,利用Arduino的引脚触发中断程序。2.注意——在ISR(中断服务程序)函数中,delay()函数是不工作的,而且millis()函数返回值也不再增长。在ISR(中断服务程序)运行期间Arduino开发板接收到的串口数据也可能丢失。另外ISR函数里所使用的变量应声明为volatile类型。3.使用中断——中断很适合执行那些需要不断检查的工作,比如检查一个引脚上连接的按键开关是否被按下。中断更适用于很快就会消失的信号检查,比如某一个引脚用于检测脉冲信号,这个脉冲信号的持续时间可能十分短暂。如果不使用中断,那么假如Arduino开发板正在执行其它任务时,突然这个脉冲信号来了,还不等Arduino开发板完成正在执行的工作,这个脉冲信号可能就已经消失了。而使用中断,就可以确保这个转瞬即逝的脉冲信号可以很好的被Arduino开发板检测到并执行相应任务。4.关于ISR(中断服务程序)——对于Arduino开发板来说,ISR(中断服务程序)是一种特殊的函数。它的特殊意味着它具有其它类型函数所不具备的限制和特点。ISR函数不能有任何参数。ISR也没有任何返回值。通常ISR需要越短小精悍越好!另外如果您的代码中有多个ISR函数,那么每次Arduino只能运行一个ISR函数,其它ISR函数只有在当前的ISR函数执行结束以后,才能按照其优先级别顺序执行。millis()函数的运行依赖Arduino开发板的中断功能,因此ISR函数中的millis()函数是无法正常运行的。micros() 也是类似的情况,它只能在初始的1-2毫秒中可以运行,但是过了这1-2毫秒后就开始出现问题了。 delayMicroseconds() 不需要任何计数器就可以运行,所以delayMicroseconds() 运行是不会受到影响的。一般情况下,ISR函数与主程序之间传递数据是依靠全局变量来实现的。为了确保全局变量在ISR函数中可以正常的工作,应该将可能被ISR函数中使用的全局变量声明为volatile类型。5.语法——(attachInterrupt):attachInterrupt(interrupt,function,mode)
6.参数——interrupt:中断源(在Arduino中,中断源可选值为0或1,一般分别对应2号和3号引脚)function:需要中断的函数名mode:LOW(低电平触发)、CHANGE(变化时触发)、RISING(低电平变为高电平触发)、FALLING(高电平变为低电平触发)注意:在interrupt处要写成0或1,不能写成2或3。7.中断模式(mode)有以下几种形式——LOW: 当引脚为低电平时触发中断服务程序CHANGE: 当引脚电平发生变化时触发中断服务程序RISING: 当引脚电平由低电平变为高电平时触发中断服务程序FALLING: 当引脚电平由高电平变为低电平时触发中断服务程序8.返回值——无9.范例程式码——const byte ledPin = 13;
//用2号引脚作为中断触发引脚
const byte interruptPin = 2;
volatile byte state = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
//将中断触发引脚(2号引脚)设置为INPUT_PULLUP(输入上拉)模式
pinMode(interruptPin, INPUT_PULLUP);
//设置中断触发程序
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}
void loop() {
digitalWrite(ledPin, state);
}
//中断服务程序
void blink() {
state = !state;
}
10.注意——在中断服务程序中,不能使用delay()函数和millis()函数。因为他们无法在中断服务程序中正常工作。delayMicroseconds()可以在中断服务程序中正常工作。中断服务程序应尽量保持简单短小。否则可能会影响Arduino工作。中断服务程序中涉及的变量应声明为volatile类型。中断服务程序不能返回任何数值。所以应尽量在中断服务程序中使用全局变量。程序十四:按键自锁控制LED(奇偶数效验)实验说明:采用一个按键自锁控制LED亮灭,当按下按钮并松手时,led灯亮;当再次按下按钮并松手时,led灯灭。这里使用奇偶数效验的方法,经测试发现很稳定。实验参考开源代码(Arduino):/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十四:按键自锁控制LED(奇偶数效验)
使用:上拉电阻按键开关模块
接线:按键开关接D2
*/
int kaiguan = 2; //连接开关到D2脚
int LED = 13; //连接LED到板载D13脚
int onoff = 0; //设定一个变量用于记录开关被按下了偶数还是奇数次,按一次,为奇数次,=1;两下就是偶数次,=0
void setup() {
pinMode(kaiguan, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
if (digitalRead(kaiguan) == LOW) {
delay(10);
if (digitalRead(kaiguan) == HIGH) {
if (onoff == 0)
onoff = 1;
else onoff = 0; //记录开关被按下的次数部分
}
}
if (onoff == 0)
digitalWrite(LED, HIGH);
else digitalWrite(LED, LOW); //根据到底按了多少下确定到底是点亮LED还是熄灭
}
奇偶校验(Parity Check)是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。程序十五:延时一秒按键点动控制LED(延时开关)实验说明:程序引入延时功能,按下按键开关需要持续一秒钟(延时时间可以调整)以上,方可点亮LED灯;松手时,LED灯灭。没有自锁,点动开关。实验参考开源代码(Arduino):/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十五:延时一秒按键点动控制LED(延时开关)
使用:上拉电阻按键开关模块
接线:按键开关接D2
*/
void setup() {
pinMode(13, OUTPUT);//设置D13脚为输出(板载LED)
pinMode(2, INPUT);//设置D2脚为输入端口
}
void loop() {
boolean val = true;
unsigned long showtime = millis();
while(true){
unsigned long nowtime = millis();
if (digitalRead(2)) {
showtime = nowtime + 1000;// 按键按下一秒,才能点亮LED
}
if (nowtime <
showtime) {
digitalWrite(13,LOW);
} else {
digitalWrite(13,HIGH);
}
val = !val;
delay(100);
}
}
实验九使用的millis()函数<时间>描述:返回自Arduino开发板开始运行当前程序以来经过的毫秒数。大约50天后,该数字将溢出(返回零)。句法time = millis()
参量:没有返回:自程序启动以来经过的毫秒数。资料类型:unsigned long。范例程式码该示例代码在Arduino板上开始运行代码本身以来经过的毫秒数在串行端口上打印。unsigned long myTime;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("Time: ");
myTime = millis();
Serial.println(myTime); //prints time since program started
delay(1000);
// wait a second so as not to send massive amounts of data
}
注意和警告请注意,millis()的返回值为类型unsigned long,如果程序员尝试使用较小的数据类型(例如)进行算术运算,则可能会发生逻辑错误int。偶数签名long可能会遇到错误,因为其最大值是其未签名副本的最大值的一半。按键开关模块的实验场景图}

我要回帖

更多关于 arduino uno主控板 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信