Şimdi Ara

Bir programda bir kaç 'delay' kullanmak ? [ÇÖZÜLDÜ]

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
19
Cevap
0
Favori
1.179
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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 ?



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



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

    < Bu ileti mini sürüm kullanılarak atıldı >
  • 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.
  • jakab95 kullanıcısına yanıt
    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();
    }




  • Hocam delay kullanarak sorunlarini cozemezsin. Kesmelerle ugrasman lazim. Cunku delay dedigin sey programin akisini buyuk olcude etkiler. Ustteki arkadas zaten timer kesmesi demis.
  • Hocam sizin ilaç kesme timer ile kesme yapacaksınız

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • cevaplar için teşekkürler arkadaşlar.

    anladığım kadarıyla timer kesmesi kullanıcaz. peki nasıl yapıcaz sorun o zaten.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
  • 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.
  • 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.

    adafruit learning system
    Multi-tasking the Arduino - Part 1
    https://learn.adafruit.com/multi-tasking-the-arduino-part-1/using-millis-for-timing




  • 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.
  • @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ı.
  • delay komutu yerine #define komutu kullanarak bekleme saniyesini tanımlata bilirsin.
  • 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 >
  • Böyle şey mi olur ya kimden duydun bunu?

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • valla on numara çalışıyor.
  • 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.
  • 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.
  • 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.
  • 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.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.