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];
bool Button_State = HIGH;
bool Last_Button_State = HIGH;
unsigned long Last_Debounce_Time = 0;
byte Count = 0;
unsigned long Start_Time = 0;
unsigned long Stop_Buffer_Time = 0;
bool Start_Flag = false;
float Enter_Before_Value[5];
bool Enter_Value_Flag[5];
unsigned long Enter_Value_Time[5];
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){
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) {
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;
}
bool value_To_Bool(float Value, float Thresholds) {
if(Value >= Thresholds) {
return 1;
}else{
return 0;
}
}
bool value_Enter(float Value, float Thresholds, unsigned long Debounce_Delay,int Number){
if(Enter_Before_Value[Number] ==0){
Enter_Before_Value[Number] = Value;
}
if(Value>Thresholds && Enter_Before_Value[Number] <Thresholds){
Enter_Value_Flag[Number] = 1;
Enter_Value_Time[Number] = millis();
}
if(Enter_Value_Flag[Number]){
if(millis()-Enter_Value_Time[Number] >Debounce_Delay){
if(Value>Thresholds){
Enter_Before_Value[Number] = Value;
Enter_Value_Flag[Number]=0;
return 1;
}
}
}
Enter_Before_Value[Number] = Value;
return 0;
}
};
ChantionSwitch cc,cc2;
void setup() {
Serial.begin(9600);
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
int Sensor_Value = analogRead(A0);
bool state = cc.value_Enter(Sensor_Value,500,100,0);
if(state){
Serial.print("\t进入");
}
// Serial.println(" ");
}