//230227-0301 長押しできた ダブルクリックで0に戻すのをやってみたい
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define button 2
#define set_time 1500 //長押し判定時間
//おまけ 動作可視化のためにLEDをつけた
#define GLED 7 //短押しモード
#define RLED 8 //長押しモード
#define BLED 3 //短押しで点灯、長押しで消灯
#define PLED 5 //ボタン動作
#define YLED 4 //押された瞬間だけ
#define WLED 6 //離した瞬間だけ
boolean current_button_state = HIGH; //現在ボタン状態(=digitalRead)
boolean previous_button_state = HIGH; //直前ボタン状態
boolean press_state = false; //押された判定
boolean press_mode = 0; //短押し=0 長押し=1
boolean ones = false; //"一度だけ"の判定
int short_press_count = 0; //短押し回数
int long_press_count = 0; //長押し回数
unsigned long press_start = 0; //押され開始
unsigned long press_end = 0; //押され終了
unsigned long press_time = 0; //押された時間
//設定ここまで
//関数
//ボタン検出
void get_button_press(){
current_button_state = digitalRead(button);
//押された瞬間
if(current_button_state == LOW && previous_button_state == HIGH){
press_start = millis();
press_state = true;
//やりたい処理
//おまけ
digitalWrite(YLED,HIGH);
}
//離された瞬間
if(current_button_state == HIGH && previous_button_state == LOW){
//処理終了
press_state=false;
ones = false;
//やりたい処理
//おまけ LCDに短押し回数を表示
digitalWrite(WLED,HIGH);
lcd.setCursor(12, 0);
lcd.print(short_press_count);
}
}
//短押し?長押し?
void get_press_mode(){
//押されていたら
if(press_state==true){
press_time = millis() - press_start; //押し時間測定
//短押し(&一度だけ実行でない)
if(press_time < set_time && ones == false){ //一度だけOFFなら
//やりたい処理開始
press_mode = 0; //short
short_press_count++;
ones = true; //一度だけON(=ここの処理終了)
//おまけ
digitalWrite(BLED,HIGH);
}
//長押し(&一度だけ実行なら)
else if(press_time > set_time && ones == true){ //一度だけONなら
//処理開始
press_mode = 1; //long
press_start = 0;
press_time = 0;
long_press_count++;
short_press_count--;
ones = false; //一度だけOFF(=ここの処理終了)
//おまけ
digitalWrite(BLED,LOW);
lcd.setCursor(12, 1);
lcd.print(long_press_count);
}
}
}
//1ループでリセットするもの
void loop_reset(){
previous_button_state = current_button_state;
//分岐でONになったやつ1ループだけでOFFにしたいときここでOFFにする
digitalWrite(YLED,LOW);
digitalWrite(WLED,LOW);
}
//おまけ 押され方でLEDの色を変える
void change_LED_color(){
switch(press_mode){
case 0:
digitalWrite(RLED,HIGH);
digitalWrite(GLED,LOW);
break;
case 1:
digitalWrite(RLED,LOW);
digitalWrite(GLED,HIGH);
break;
}
}
//セットアップ
void setup() {
Serial.begin(9600);
pinMode(button, INPUT_PULLUP);
pinMode(GLED,OUTPUT);
pinMode(RLED,OUTPUT);
pinMode(BLED,OUTPUT);
pinMode(YLED,OUTPUT);
pinMode(PLED,OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear();
}
//メイン
void loop() {
get_button_press();
get_press_mode();
change_LED_color();
loop_reset();
//おまけ
lcd.setCursor(0, 0);
lcd.print("short press");
lcd.setCursor(0, 1);
lcd.print("long press");
//ボタン状態を表現
if(current_button_state==LOW){
digitalWrite(PLED,HIGH);
}else{
digitalWrite(PLED,LOW);
}
//動作確認
Serial.print(" Pstate:");
Serial.print(press_state);
Serial.print(" shortpress:");
Serial.print(short_press_count);
Serial.print(" longpress:");
Serial.print(long_press_count);
Serial.print(" milis:");
Serial.print(millis());
Serial.print(" start:");
Serial.print(press_start);
Serial.print(" prs_time:");
Serial.print(press_time);
Serial.print(" press_mode:");
Serial.print(press_mode);
Serial.println("");
}