avatar_Hattuşa

ARDIUNO ve buton kullanımı sorunu

Başlatan Hattuşa, 02 Haziran 2018, 17:15:13

Hattuşa

slm arkadaşlar;
ardiuno mini ile ilgili bir projemde buton kullanımında, butona 2 işlevsellik kazandırmak istiyorum ama beceremedim. amacım butona uzun basıldığında bir işlem yapmak, kısa basıldığında ise başka bir işlem yapmaktı ama olmadı. basic dilinde olsaydı.

sayac =0
if buton =0 then
while buton =0
inc sayac
wend
if sayac >500 then
'birinci islem
else
'2 islem
endif


yazar kurtulurdum. ama C de bunu yapamadım. while döngüsünü kullandım fayda etmedi.

bu işin doğrusu nasıl olmalı??


  Say =0;
while (digitalRead(SecPin)==LOW){
   if (say>500) //birinci islem
   else
   {
    //ikinci islem
}
}


furkan41

#1

if(Say>=500) // burayı >= ifadesi ile yap.


birde sen say değişkenini arttırmıyorsunki ? nasıl koşulu sağlayacak ?  hep şartın değilini sağlayacak program if şartından önce şöyle yapsan olabilir.


say++;   // say değişkenini 1 arttır.
delay_ms(1);  1 milisaniye bekle     500 den büyük olduğunda koşulu sağlayacak ise 500ms lik bekleme demektir buda.
if(say>=500)   // say değişkeni 500 den büyükse veya eşit ise
{
1.koşul;    //koşulu sağla
}
else 2.koşul;     // değil ise 2. koşulu sağla.

[\code]


Hattuşa

#2
usta;

if buton =0 then
while buton =0
inc say
wend


basicte while koşulu buton =0 olduğu sürece while-wend arasında sayar durur. yani buton =0 olduğu sürece wend ile tekrar while kısmına döner.C dilinde ben buton =0 olduğu sürece while -wend arasında kalmasını istiyorum.
sizin yazdığınız şekli ile işlem ilerleyecek program tekrar başa dönüp bu noktaya geldiğinde sayacı 1 artıracak. ben o şekilde değilde

basicte olduğu gibi;


basla:
//yapılacak işlemler
if buton =0 then goto basla


olmasını istiyorum. malum C de goto yok, kafa basmadı

furkan41

Değerli abim Basic'te nasıl bilmiyorum normalda while bir döngüdüri icinden cıkmadıkcada başka bir işlem yapmaz döner durur sen 1ms lik durdurma ile değişken arrtırıp koşuldaki zamanı sağlayabilirsin basic dilindede inc say diyorsun inc komut mu artık bilmiyorum sayma işlemini o komut yaptırıyor olabilir mikroC de böyle bir komut duymadım daha doğrusu C de de görmedim. dediğim şekilde yaparsan butondan elini cekmediğin sürece istediğin zamanlamada istediğin işi yaptırısın. ben böyle düşündüm bir dene istersen. belki denediğinde fikrin değişir.

Hattuşa

Furkan usta;
basic te inc =1 artır demek, yani inc say dediğimde say =say +1 demektir. dediğini şimdi deniyorum. istediğim sizin anlattığınız şekilde olmalı, kusura bakma, sonradan görme C ci olduğumuz için eski alışkanlıkları bırakamıyoruz.

furkan41

Bak diğer böyle yap sen. bunu yapıştır gitsin.

int sayac=1;
while(digitalRead(secpin)) {sayac++;delay(1);}
if(sayac>200){
//uzun tıklama
}
else
{
//kısa tıklama
}

Hattuşa

Alıntı yapılan: furkan41 - 02 Haziran 2018, 23:03:24
Bak diğer böyle yap sen. bunu yapıştır gitsin.

int sayac=1;
while(digitalRead(secpin)) {sayac++;delay(1);}
if(sayac>200){
//uzun tıklama
}
else
{
//kısa tıklama
}


tşk ler bu oldu

Hattuşa

tekrar slm lar;


http://lezzetlirobottarifleri.com/video/lcd-keypad-shield-arduino-ile-nasil-kullanilir


yukarıdaki linkteki lcd ve keypad kitten temin ettim.çinden getirttiğim AD9833 DDS entegresini ardiuno mini ile çalıştırmayı düşündüm. herşey normal, menuler vs vs yalnız yukarıdaki koda göre çıkarmak istediğim frekans değerini 0-255 arasından yukarıya çıkartamadım. şöyleki;

sağ butonuna atadığım katsayı değeri değişimi 1,10,100,1000,10000 şeklinde
yani kullanıcı atıyorum 50khz sinyal çıkartmak istedi. bunun değeri 50 000 olmalı hızlı bir şekilde bu değere ulaşması için

freq =freq +katsayi  //burada katsayi değeri 10000 dolayısı ile 5 kez basınca bu frekansı çıkarmş olacak.

gel gör ki yukarı ve aşağı butonları ile ben asla 0-255 üzerine çıkamıyorum. freq tanımlamam  unsigned long tipi, katsayi tanımlamam unsigned long  tipi  ACABA nerde hata yapıyorum. fikri olan varmı?

furkan41

Kod'u buraya aktarma gibi durumun var aktar öyle bakalım birde katsayı değerlerini bir ARRAY mı yapın orayı pek anlamadım acıkcası sorun burdan dolayı doğmuş olabilir. gibime geliyor ama yinede kod'u buraya yüklersen dikkatlice bir kontrol edebiliriz birde O LCD sheild üstündeki butonlar analog pin üzerinden oknuyordu yanlış hatırlamıyor isem . ondan da kaynaklanan bir sıkıntı olabilir.

mehmet

Hocam; milis() fonksiyonu var. Onu da rahatlıkla
kullanabilirsiniz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr

Hattuşa

Alıntı yapılan: furkan41 - 06 Haziran 2018, 16:39:47
Kod'u buraya aktarma gibi durumun var aktar öyle bakalım birde katsayı değerlerini bir ARRAY mı yapın orayı pek anlamadım acıkcası sorun burdan dolayı doğmuş olabilir. gibime geliyor ama yinede kod'u buraya yüklersen dikkatlice bir kontrol edebiliriz birde O LCD sheild üstündeki butonlar analog pin üzerinden oknuyordu yanlış hatırlamıyor isem . ondan da kaynaklanan bir sıkıntı olabilir.

ekte isis simülasyon şeması, ardiuno kodu vs hepsi var.
yapmak istediğim frekans değerlerini long türünde değiştirebileyim. bu hali 0-255 arası değişiyor oysa ben 1-1000000 arası değiştirebilmeliyim

furkan41

Şimdi algoritmayı inceledim Anlamakta biraz zorlandım fakat senin sorun cok bariz ortada sen değerleri epproma yazdırmışsın displayyaz fonksiyonunda eepromdan okuduğun değeri ekrana yazdırmışsın.

ve sen eppromun sadece bir bölümüne yazdırmışsın bunu bir hücreye yani bir hücrede  0-255 değer alabilir yani senin sorunun sadece ekrana mesaj verme sıkıntısı eğerki sen modüle göndereceğin frekans bilgisini direk gönderiyorsan (eeproma sokmadan) modülden istenen frekansı alırsın ama ekranda yanlış yazar. eğerki modüle gidecek frekans bilgisinide epproma yazdırdığın değerden okuyup gönderiyorsan  oda sıkıntı oda 0-255 arası cıkacak.

Senin yeni bir fonksiyon kurman gerekiyor for döngüsü ile tek tek eeproma yazdırıp okurken de yine for döngüsü ile tek tek okuyup float gibi yüksek değer tutan bir değişkende bunları geri toplaman lazım.

tabi eepromada tek tek bunu kaydedemezsin onun icin for döngüsündede iyi bir algortima kurman lazım.  eeprom cok gerekli değil ise eğer kaldır derim. cünkü sana baya sıkıntı cıkarır uğraştırır.

furkan41

#12
Ki eepromu kullanman da gerekiyor cünkü tüm sinyaller arasında geçiş yaparken diğerlerinin hafızada tutulmasını istiyorsun yani dediğim gibi eeproma yazma ve okuma kısmında bir fonksiyon kurman gerekiyor birde   LCD ekranda SINUS.KARE.TESTERE yazıları tam cıkmıyor onuda SIGNAL yazısındaki sutun konumlandırma numarasını 1 yüksek tuttuğun icin galiba onuda 1 düşür.

Hattuşa

usta eprooma yazdırmam lazım. ileride belirlenen frekansı çıkarabilmem için, sizin için sakıncası yoksa ardiunoda long ve float değişkenlerinin eprooma yazdırılması ve okunması ile ilgili basit bir örnek verebilirmisiniz?

furkan41

#14
@pro-TR tam da senin sıkıntın icin yazılmış bir yazı gibi görünüyor :))

http://lezzetlirobottarifleri.com/lrtsosyal/konu-dahili-eeprom-a-float-long-int-veri-tiplerinin-kaydedilmesi.html


Powered by EzPortal