这几天在Arduino的实验中,为了方便完成一个键就可以进行操控,使用了按键模块,但是发现,按键模块返回的值与我想要的值不同。
先说下最终得目标:** 统计5秒内得按键次数 **
模块选择
** LCD1602 ** :在液晶屏上显示信息
** DS1302 **:电子时钟模块
问题
当我使用while(s<5)时,并不是只循环了5次而是5秒,在这5秒有无限可能,所以当我按下一次时并不是只返回按键次数,而是返回得是我从摁下到松手while了几次。这就不太好。
思路
- 只有在提示之后,才会出现摁键行为。(不按规则另算)
- 也就是说刚开始,侦听按键一开始就是处于低电平。
- 这个时候让他处于while循环状态,一旦由低电平到高点平,让他+1
- 当由高电平到低电平时不要着急+1,因为这意味着松手不在我们得统计范围之内
- 最后由于不管怎样他都会+1,所以global最后要-1.
代码
#include "LiquidCrystal_I2C.h"
#include <Wire.h>
#include <SPI.h>
#include "RFID.h"
#include <EEPROM.h>
#include <Servo.h>
#include "DS1302.h"
#include "LiquidCrystal_I2C.h"
int time1, time2;
int global = 0;
DS1302 rtc(2, 3, 4);
LiquidCrystal_I2C lcd(0x27, 16, 2);
int keypad_pin = 7 ;
void setup()
{
rtc.halt(false);
rtc.writeProtect(false);
rtc.setTime(14, 34, 50);
rtc.setDate(11, 3, 2019);
pinMode(keypad_pin, OUTPUT);
lcd.init();
lcd.backlight();
SPI.begin();
Serial.begin(9600);
}
void loop() {
time1 = rtc.getTime().sec;
int s = 0;
while (s < 5) {
Serial.println("begin");
while (( digitalRead(keypad_pin)) == HIGH) {
time2 = rtc.getTime().sec;
s = time2 - time1;
if (s > 5) {
break;
}
}
while (( digitalRead(keypad_pin)) == LOW) {
time2 = rtc.getTime().sec;
s = time2 - time1;
if (s > 5) {
break;
}
}
global++;
time2 = rtc.getTime().sec;
s = time2 - time1;
}
Serial.println(global-1);
Serial.println("----------------------");
global = 0;
time1 = rtc.getTime().sec;
// Serial.println(time1);
lcd.clear();
Serial.println(rtc.getTimeStr());
lcd.print(rtc.getTimeStr());
delay(10);
lcd.setCursor(0, 1);
lcd.print(rtc.getDateStr());
Serial.println(rtc.getDateStr());
delay(5000);
}