Buton okuma (Uzun ve Kısa basma)

Başlatan Cemre., 02 Mart 2017, 23:34:02

Cemre.

Merhaba,

Hem ana döngünün akışını kesmeyecek hem de uzun ve kısa basma durumlarını algılayabilecek bir buton okuma yapısı oluşturmak istedim.

Bunun için, butona basılı mı değil mi? verisini tutan BT_User_State değişkeni, butona uzun mu basıldı kısa mı basıldı? verisini tutan iki ayrı BT_User_Flag_ShortPress ve BT_User_Flag_LongPress değişkenleri, ayrıca geçen süreyi tutacak bir BT_User_Time değişkeni tanımladım.

Tanımlamalar;
typedef enum{
	Flag_Reset,
	Flag_Set
}	Button_Flag;

typedef enum{
	Button_Released,
	Button_Pressed
}	Button_State;

Button_State	BT_User_State = Button_Released;
Button_Flag		BT_User_Flag_ShortPress = Flag_Reset;
Button_Flag		BT_User_Flag_LongPress = Flag_Reset;
uint16_t 			BT_User_Time = 0;



Her 1ms'de kesmeye giden bir de Timer mevcut.

Bunları yaptıktan sonra Timer taşma kesmesinde

if(HAL_GPIO_ReadPin(BT_User_GPIO_Port, BT_User_Pin) == GPIO_PIN_SET)
{
	BT_User_State = Button_Pressed;
	BT_User_Time++;
} 
else 
{
	if(BT_User_Time >= 750)
	{
		BT_User_Flag_LongPress = Flag_Set;
	} 
	else if (BT_User_Time >= 50) 
	{
		BT_User_Flag_ShortPress = Flag_Set;
	}
	BT_User_Time = 0;
	BT_User_State = Button_Released;
}


Kesme oluştuğu anda butona basılı ise buton durumunu Basılı olarak değiştirdim ve süreyi tutan değişkene 1 ekledim.
Kesme oluştuğu anda butona basılı değilse süreyi tutan değişkeni önce büyük değerden başlayarak kontrol ettim ve gerekli bayrakları Set ettim. Son olarak süreyi tutan değişkeni sıfırladım ve buton durumunu Bırakıldı olarak değiştirdim.

Ana döngüde ise

if(BT_User_Flag_ShortPress == Flag_Set && BT_User_State == Button_Released)
		{
			HAL_GPIO_TogglePin(LD_Blue_GPIO_Port, LD_Blue_Pin);
			BT_User_Flag_ShortPress = Flag_Reset;
		}

		if(BT_User_Flag_LongPress == Flag_Set && BT_User_State == Button_Released)
		{
			HAL_GPIO_TogglePin(LD_Red_GPIO_Port, LD_Red_Pin);
			BT_User_Flag_LongPress = Flag_Reset;
		}


Burada da, Butona kısa basıldıysa ve buton bırakıldıysa ..... yapılsın ve kısa basıldı durumunu gösteren bayrak temizlensin.
Butona uzun basıldıysa ve buton bırakıldıysa ..... yapılsın ve uzun basıldı durumunu gösteren bayrak temizlensin.
Şeklinde bir durum değerlendirmesi gerçekleştirdim.

Sizin bu yöntemin doğru ya da yanlış olduğuna dair bir fikriniz varsa, geliştirilebilecek yönlerine dair söyleyecekleriniz varsa paylaşırsanız sevinirim.

Ana döngüyü bloklayacak şekilde buton okuması yapmaktan kaçınmamız gerektiğini yeni öğrenen ve nasıl bir çözüm getireceğini bulamayan arkadaşlara yol gösterici olması amacıyla.

Herkese iyi akşamlar.

muhittin_kaplan


Mucit23

Ben bu işlemleri yapıyorum ama baya flag vs kullanmam gerekiyor.

Mesela butona basıldımı?
Ne kadar basıldı?
Basılma süresi hedef süreye ulaştımı X işini kontrol et Onay gelirse Y işini yap
Onay gelmezse hiçbir iş yapma butona hiç basılmamış gibi davran
Eğer buton hedef süreye ulaşılmadan bırakılırsa menüye git.

vs vs
geçenlerde bir projede buna benzer bir işlem yapmıştım. İyi çalışıyordu ve programın akışını durdurmadan yaptım. Ama dediğim gibi birkaç tane flag kullanmam gerekti.

tekosis

artık yeni kontrolörlerde ram sıkıntısı olmadığından bence kullanışlı ve güzel bir yöntem. bende hemen her fonksiyona ayrı flag atıyorum, fonksiyon içi tanımlamalar yapıp başka programlarda da bu alt fonksiyonları kullanıyorum. taşınabilirlik ve kolaylık sağlıyor. buton kontrolü gibi bir olay içinde işlemciyi oyalamaya gerek yok. kullanılabilir, güzel paylaşım olmuş cemre. eline sağlık.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.