const int buttonPin = 2;
// 定义变量用于防抖
unsigned long debounceDelay = 50;
// 计数器变量
int buttonCount = 0;
class ChantionSwitch {
private:
bool Enter_Flag = false;
bool Enter_Flag2 = false;
bool Enter_Flag3 = false;
bool Out_Flag = false;
bool Out_Flag2 = false;
bool Out_Flag3 = false;
bool In_Flag = false;
bool In_Flag2 = false;
bool In_Flag3 = false;
int Enter_Counts;
bool Enter_Parity;
int Out_Counts;
bool Out_Parity;
bool Before_State; //之前状态
unsigned long Duration;
bool Duration_State;
bool Time_Over_Flag[10];
bool Last_Time_Over_Flag[10];
public:
bool just_Enter(bool Input_State){
if (Input_State == HIGH ) {
if(Enter_Flag == false){
Enter_Flag = true;
return 1;
}
}else{
Enter_Flag = false;
}
return 0;
}
bool just_Out(bool Input_State) {
if (Input_State == LOW) {
if (Out_Flag == false && In_Flag==true) {
Out_Flag = true;
In_Flag = false;
return 1;
}
} else {
Out_Flag = false;
In_Flag = true;
}
return 0;
}
int get_Enter_Counts(bool Input_State){
if (Input_State == HIGH ) {
if(Enter_Flag2 == false){
Enter_Flag2 = true;
Enter_Counts++;
}
}else{
Enter_Flag2 = false;
}
return Enter_Counts;
}
bool get_Enter_Parity(bool Input_State){
if (Input_State == HIGH ) {
if(Enter_Flag3 == false){
Enter_Flag3 = true;
Enter_Parity =!Enter_Parity;
}
}else{
Enter_Flag3 = false;
}
return Enter_Parity;
}
int get_Out_Counts(bool Input_State){
if (Input_State == LOW ) {
if(Out_Flag2 == false&& In_Flag2==true){
Out_Flag2 = true;
In_Flag2 = false;
Out_Counts++;
}
}else{
Out_Flag2 = false;
In_Flag2 = true;
}
return Out_Counts;
}
bool get_Out_Parity(bool Input_State){
if (Input_State == LOW ) {
if(Out_Flag3 == false&& In_Flag3==true){
Out_Flag3 = true;
Out_Parity =!Out_Parity;
In_Flag3 = false;
}
}else{
Out_Flag3 = false;
In_Flag3 = true;
}
return Out_Parity;
}
unsigned long get_Duration(bool Input_State){
if (Input_State != Duration_State) {
Duration_State= !Duration_State;
Duration = millis();
}
return (Duration_State == 1) ? (millis() - Duration) : 0;
}
bool last_To_Time(bool Input_State,long Target_Time, int Number){
unsigned long Current_Time = get_Duration(Input_State);
if(Current_Time>Target_Time){
Time_Over_Flag[Number] = 1;
}else{
Time_Over_Flag[Number] = 0;
}
if(Time_Over_Flag[Number]==1 && Last_Time_Over_Flag[Number]==0){
Last_Time_Over_Flag[Number] = Time_Over_Flag[Number];
return 1;
}
Last_Time_Over_Flag[Number] = Time_Over_Flag[Number];
return 0;
}
int frequency_In_Time(bool Input_State,unsigned long Range_Time){
static byte Count = 0;
static unsigned long Start_Time = 0;
static unsigned long Stop_Buffer_Time = 0;
static bool Start_Flag = false;
if((Input_State == LOW) && (Before_State == HIGH))
{
if(Start_Flag == false) //按钮周期第一次开启
{
Count = 1; //当前按钮次数1
Start_Flag = true; //设置周期开启
Start_Time = millis(); //记录周期开启时间
}
else if((millis()-Start_Time) < Range_Time)
Count++;
}
if((Input_State == HIGH) && (Before_State == LOW)){
Stop_Buffer_Time = millis();
}
Before_State = Input_State;
// 如果周期已经开启,并且过了周期的等待时间
if(((millis()-Start_Time) > Range_Time) && Start_Flag)
{
if(millis()-Stop_Buffer_Time>400){
Start_Flag = false;
return Count;
}
}
return 0;
}
bool Debounce(bool Input_State, unsigned long Debounce_Delay) {
static bool Button_State = HIGH;
static bool Last_Button_State = HIGH;
static unsigned long Last_Debounce_Time = 0;
bool Reading = Input_State;
if (Reading != Last_Button_State) {
Last_Debounce_Time = millis();
}
if ((millis() - Last_Debounce_Time) > Debounce_Delay) {
if (Reading != Button_State) {
Button_State = Reading;
}
}
Last_Button_State = Reading;
return !Button_State;
}
};
ChantionSwitch cc;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
int debouncedState = cc.Debounce(digitalRead(buttonPin), debounceDelay);
Serial.print("当前状态:");
Serial.print(debouncedState);
Serial.print("\t进入触发次数:");
Serial.print(cc.get_Enter_Counts(debouncedState));
Serial.print("\t开关:");
Serial.print(cc.get_Enter_Parity(debouncedState));
Serial.print("\t触发持续时间:");
Serial.print(cc.get_Duration(debouncedState));
int times = cc.frequency_In_Time(debouncedState,500);
if(times){
Serial.print("\t短期触发次数:");
Serial.print(times);
}
if(cc.just_Enter(debouncedState)){
Serial.print("\t进入");
}
if(cc.just_Out(debouncedState)){
Serial.print("\t跳出");
}
if(cc.last_To_Time(debouncedState,1000,0)){
Serial.print("\t时间到1000");
}
if(cc.last_To_Time(debouncedState,3000,2)){
Serial.print("\t时间到3000");
}
Serial.println(" ");
}