Arama butonu
Bu konudaki kullanıcılar: 1 misafir, 1 mobil kullanıcı
18
Cevap
1194
Tıklama
0
Öne Çıkarma
Bir programda bir kaç 'delay' kullanmak ? [ÇÖZÜLDÜ]
Y
9 yıl
Yarbay
Konu Sahibi

selam arkadaşlar.

Aynı programda bir kaç delay kullanmam gerekiyor ama her delay programın çalışmasını etkileyeceğinden bunu nasıl yapabilirim ?

mesafe sensörü için ayrı bir delay, bunların lcd de yazdırılması ayrı bir delay bunların dışınca program bu şekilde çalışırken lcd de 5 farklı sembolü 500ms arayla ekrana yazdırmak gibi ?

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil





< Bu mesaj bu kişi tarafından değiştirildi yucelnet -- 2 Mart 2016; 8:21:28 >

J
9 yıl
Yüzbaşı

Hocam konuyu biraz daha acarsaniz, nasil bir sey yapacaginizi, ona gore yardimci olmaya calisirim



< Bu ileti mini sürüm kullanılarak atıldı >

M
9 yıl
Yüzbaşı

quote:

Orijinalden alıntı: yucelnet

selam arkadaşlar.

Aynı programda bir kaç delay kullanmam gerekiyor ama her delay programın çalışmasını etkileyeceğinden bunu nasıl yapabilirim ?

mesafe sensörü için ayrı bir delay, bunların lcd de yazdırılması ayrı bir delay bunların dışınca program bu şekilde çalışırken lcd de 5 farklı sembolü 500ms arayla ekrana yazdırmak gibi ?

Mikro işlemci olarak ne kullanıyorsun ?

Misal Timer kullanarak bu problemi aşabilirsin.


Bu mesaja 1 cevap geldi.
Y
9 yıl
Yarbay
Konu Sahibi

ultrasonic sensör ile mesafeyi ölçüp lcd ye yazdırıyorum. loop döngüsü 150 ms + 1ms de sensör 151ms.
Ayrıyettn lcd de ayrıyetten "-\,|,/" simgelerini 100 ms arayla lcdnin bir karakterlik yerinde arka arkaya göstererek sanki çizgi dönüyormuş efekti vermek istiyorum.
Ama 4 karakter için 100ms * 4 = 400ms olur. Bunu kodun sonuna eklesem program kafayı yer gibime geliyo. Yani toplamda 551ms olcak ve program sapıtcak.

 
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);

const int trigger_pin = 10;
const int echo_pin = 11;

int sure;
float mesafe;
float c;
float h;
float sesh;

void setup()
{
lcd.init();
lcd.backlight();
pinMode(trigger_pin, OUTPUT);
pinMode(echo_pin, INPUT);

Serial.begin(9600);
}
void loop()
{
delay(150);
c = analogRead(A0);
c = c * ((5.0*1000/1023)/10);
sesh = (0.6*c)+331.5;
h = (sesh*100)/1000000;
h = 1/h;

digitalWrite(trigger_pin, HIGH);
delay(1);
digitalWrite(trigger_pin, LOW);
sure= pulseIn(echo_pin, HIGH);
mesafe = (sure/2) /h;

lcd.clear();
Serial.println(mesafe);
Serial.println(c);
Serial.println(h);
lcd.print(mesafe);
lcd.print(" cm");
lcd.setCursor(9, 0);
lcd.print(c);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print(sesh);
lcd.print(" m/sn ");
lcd.blink();
}




Bu mesajda bahsedilenler: @jakab95
S
9 yıl
Yarbay

Hocam delay kullanarak sorunlarini cozemezsin. Kesmelerle ugrasman lazim. Cunku delay dedigin sey programin akisini buyuk olcude etkiler. Ustteki arkadas zaten timer kesmesi demis.




Bu mesajda bahsedilenler: @yucelnet
G
9 yıl
Yarbay

Hocam sizin ilaç kesme timer ile kesme yapacaksınız



< Bu ileti mobil sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
Y
9 yıl
Yarbay
Konu Sahibi

cevaplar için teşekkürler arkadaşlar.

anladığım kadarıyla timer kesmesi kullanıcaz. peki nasıl yapıcaz sorun o zaten.


Bu mesaja 1 cevap geldi.
Y
9 yıl
Yarbay
Konu Sahibi

arkadaşlar kodu yukarki mesajda paylaştım.
nasıl değişiklik yapmam lazım yardımcı olur musunuz ?

timer interrupt araştırdım ama karışık bir konu.


Bu mesaja 2 cevap geldi.

Bu mesajda bahsedilenler: @Spyxxx , @jakab95 , @mrkabaca , @Gktupc
B
9 yıl
Yüzbaşı

delay kullanmak o süre boyunca programı bloke eder. Senin işine yaramaz. Sen bunun yerine millis() fonksiyonunu kullanabilirsin. Sistemi bloke etmeden zaman bazlı işlemler yapabilirsin. Aşağıda bir örnek var. Bu sayede bir nebze multitasking yapabiliyorsun.

https://learn.adafruit.com/multi-tasking-the-arduino-part-1/using-millis-for-timing



G
9 yıl
Yarbay

quote:

Orijinalden alıntı: yucelnet

arkadaşlar kodu yukarki mesajda paylaştım.
nasıl değişiklik yapmam lazım yardımcı olur musunuz ?

timer interrupt araştırdım ama karışık bir konu.

Aynı anda yapılması gereken işlemler için kesme şarttır. Önce kesmeleri öğrenmeni tavsiye ederim. Ama gördüğüm kadarıyla arduinonun kesme konusunda desteği biraz zayıf. C ile kodlaman gerebilir.



Y
9 yıl
Yarbay
Konu Sahibi

@burakc
millis fonksiyonuna baktım. millis programı durdurmadan yapmak istediklerimizi yaptırıyormuş. Sürekli sayıyor. 54 gün de bir de sıfırlanıyormuş.
Ama ben nasıl uyarlıcam kodumu o fonksiyona göre onu bilemedim.

qelektro_gadget
çoğu arkadaş timer den bahsettti ama araştırdım çok karışık pek bişey anlamadım açıkçası.




Bu mesajda bahsedilenler: @burakc , @elektro_gadget
O
9 yıl
Er

delay komutu yerine #define komutu kullanarak bekleme saniyesini tanımlata bilirsin.


Bu mesaja 1 cevap geldi.
Y
9 yıl
Yarbay
Konu Sahibi

eğer farklı zaman aralıklarında farklı işler yaptırmak isityorsak;
"modulo" kullanmalıyız. yani modüler aritmetik.
https://www.arduino.cc/en/Reference/modulo

int sayac;
delay(1);
sayac=sayac+1
if (sayac % 100==0) {digitalWrite(6,HIGH);} //sayac değerinin mod 100 e göre kalanının 0 vermesi dijital 6 pinini aktif yap.
if (sayac % 200==0) {digitalWrite(7,HIGH);} //sayac değerinin mod 200 e göre kalanının 0 vermesi dijital 7 pinini aktif yap.
if (sayac % 1000==0) {sayac=0;} // sayac her 1000ms de bir başa dönsün.





< Bu mesaj bu kişi tarafından değiştirildi yucelnet -- 2 Mart 2016; 10:02:16 >

G
9 yıl
Yarbay

Böyle şey mi olur ya kimden duydun bunu?



< Bu ileti mobil sürüm kullanılarak atıldı >

Y
9 yıl
Yarbay
Konu Sahibi

valla on numara çalışıyor.


Bu mesaja 1 cevap geldi.
G
9 yıl
Yarbay

Yaptığın şey şu.

while(1) {
delay(100);
digitalWrite(6,HIGH);
delay(100);
digitalWrite(7,HIGH);
delay(800);
}

Yani işlemcinin gücünün milyonda birini kullanıp gerisini delay kullanarak boşa harcıyorsun. Ne yaptığını bil diye söyledim tabi kafana göre takıl yine.


Bu mesaja 1 cevap geldi.
Y
9 yıl
Yarbay
Konu Sahibi

quote:

Orijinalden alıntı: elektro_gadget

Yaptığın şey şu.

while(1) {
delay(100);
digitalWrite(6,HIGH);
delay(100);
digitalWrite(7,HIGH);
delay(800);
}

Yani işlemcinin gücünün milyonda birini kullanıp gerisini delay kullanarak boşa harcıyorsun. Ne yaptığını bil diye söyledim tabi kafana göre takıl yine.

benim yapmaya çalıştığım şey şu;

1ms ultrasonic mesafe sensörü için gerekli.
150ms karakter lcd nin clear olması için gerekli.

ayrıyetten; "150 ms de bir "-\|/" karakterlerini sırayla ekranda göstermek istiyorum.


Bu mesaja 1 cevap geldi.
Y
9 yıl
Yarbay
Konu Sahibi

her gelen bir taş atıp gidiyor.

Kafam allak bullak oldu.
aynı mesajı yeniden yazıyorum;
benim yapmaya çalıştığım şey şu;

1ms ultrasonic mesafe sensörü için gerekli.
150ms karakter lcd nin clear olması için gerekli.

ayrıyetten; "150 ms de bir "-\|/" karakterlerini sırayla ekranda göstermek istiyorum.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @elektro_gadget
G
9 yıl
Yarbay

Yapman gereken söylendi. Bu yemek tarifi değil ki iki satırda anlatalım. Araştıracaksın interrupt nedir, timer nedir, arduinoda nasıl kullanılır vs. Ondan sonra programı dizayn edeceksin, parçaları birleştireceksin. Bunlar anlatmakla olmaz tecrübe ister. Hiç kullandığın denetleyicinin datasheet'ine baktın mı? Orada bütün ayrıntılar yazıyor. Üstüne orta seviye C bilgisi ile hiçbir sorun kalmaması lazım.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.