for döngüsü ile 0 dan 180e gelmesi ve beklemesi
  • aşağıdaki gibi kod iile yapıyorum fakat sürekli 0 dan 180 e yavaş yavaş gidiyor fakat tekrar sıfıra dönüyor. Benim istediğim 0 dan 180 e gittikten sonra 180 de kalması. nasıl yapabilirim acaba
    for (int pos = 0; pos <= 0; pos += 1) { <br /> // in steps of 1 degree
    myservo.write(pos);
    delay(100);
    }
  • Kodun hiçbir yerinde "180" yazmıyorken nasıl 180'e kadar gidiyor ki?
  • yanlış yazmışım. gittiğini farzedelim. pos <= 180 yapalım :D
  • 1-Sen her pos+ da 100 ms delay vermişşsin buda 180*100=18.000 ms yani 18 sn yapar geçıkme burdan olabilir.
    2- loop un içine yazdıgın her fonksıyon bitince loop tekrar çalısır arduınonun mantıgı budur loop ile. sen 180 de kac sn durmasını istiyorsun yada 180 e gelince başka bisey mı yapmasını istiyorsun onu soyle.
    ornek kod söyle olabilirdi:


    for (int pos = 0; pos <= 180; pos += 1)<br /> {
    myservo.write(pos);
    delay(1); // biz yine bir ms gecikme verelim
    }
    sunu_yap(); // 180 e ulasınca bu fonksıyon calısır. bunun içine ister sonsuza kadar beklet
    // yaz ister 180 den geriye dondur.
  • Normal de bi fonksiyonun var saat 9 15 ile saat 9 16 arasında servo motoru yavaşça yukarı 180 e çıkarıl tekrardan 9 16 'dan sonra ki koşula tekrar yavaşça 0 a gelmesi. Sizinde dediğiniz gibi sunuyap() şeklinde bi fonk oluşturmuştum fakat 180 e yavaş yavaş geliyor sonra 0 i yavaş yavaş yaptığımda hata veriyor .
  • Teşekkür ederim cevap verdiğiniz için
  • kodları yollarsanız yada nasıl bir hata aldıgınıza dair detay verirseniz yardımcı olmaya çalışayım.
  • DateTime now = RTC.now();
    if(yemlememenu == 1){
    if(now.hour() == yemleme1 && now.minute() == yemlemedk1 && now.second() >= 10 && now.second() <= 10+yemlemesaniye){<br /> for(int pos = yemleme0; pos <= yemleme180; yemleme0++){<br /> myservo.write(pos);
    }
    }
    else {
    for(int pos = yemleme180; pos >= yemleme0; yemleme180++){
    myservo.write(pos);
    }
    }
    }
  • Kodlar bunlar hocam. şu dk ve saatde pozisyon 0 dan 180 e yavaş yavaş çıkıyor sorun yok. ama motor 180 de iken 5 -6 saniye 180 de kalması gerekiyor. ama loop da veya oluşturduğum void servo , loop un içinde olduğu için 5 saniye 180 de kalması gerekirken doğal olarak 180 den sıfır a geliyor sonra tekrar 180 ne döngü oluyor. ben ilk koşulda yani saati geldiğinde 180 e gelecek. kullandığım kod ile 5 10 saniye 180 de kalacak sonra süre işlem tamamlanınca 0 a yavaş yavaş dönecek. ama öyle olmuyor. maalesef
  • İşine yarayacak bir kütüphane yazıyorum. Yetiştirebilirsem bu akşam koyarım.
  • teşekkür ederim yardımınız için. bekliyorum
  • #amenofis yazabildiniz mi acaba kütüphane
  • Foruma yeni konu açtım, indirip denersen memnun olurum. Test etmiş olursun hem.

    Arduino sketchbook altında libraries diye bir klasör var. Oraya yeni klasör açıp mkgorev.h ve mkgorev.cpp dosyalarını içine atarsın.

    Kodun en tepesine
    #include <mkgorev.h>
    ekleyerek kullanabilirsin.

    İstediğin işlemi yeni görev olarak ekle. loop olmadığı için tekrar başa dönmez. O işlem çalışırken loop içinde başka şeyler yapabilirsin. Arduinoyu da 18 saniye bloklamamış olursun.
  • teşekkür ederim hemen denemeye koyuluyorum . emeğinize sağlık
  • gerekli kodları girdiğimde hata alıyorum. Error Compiling for board Arduino Uno…

    Yaptigim tanimlama ise;

    GOREV(servomikro, 20);
    GOREV(lcdmikro, 20);

    void setup
    mk_hazirla(0);
    mk_gorev_ekle(servomikro, sizeof(servomikro), otoyemleme, ONCELIK_NORMAL);
    mk_gorev_ekle(lcdmikro, sizeof(lcdmikro), lcd_manuel_ekran, ONCELIK_NORMAL);


    void lcd_manuel_ekran(){
    while(1) {
    lcdsaat(); // baslangic menusune eklenecek
    //serialsaat(); // baslangic menusune eklenecek sonradan // eklenecek silinecek
    termometre(); // baslangic menusune eklenecek
    lcd.setCursor(0,1);
    lcd.print("Honey V1 ");
    if(elektrik_sayaci < 10){
    lcd.setCursor(9,1);
    lcd.print("E.K.");
    lcd.setCursor(13,1);
    lcd.print(elektrik_sayaci);
    lcd.setCursor(14,1);
    lcd.print(" ");
    }else if (elektrik_sayaci >= 10 && elektrik_sayaci <= 99){<br /> lcd.setCursor(9,1);
    lcd.print("E.K.");
    lcd.setCursor(13,1);
    lcd.print(elektrik_sayaci);
    lcd.setCursor(15,1);
    lcd.print(" ");
    }else if(elektrik_sayaci >= 100 && elektrik_sayaci <= 999){<br /> lcd.setCursor(9,1);
    lcd.print("E.K.");
    lcd.setCursor(13,1);
    lcd.print(elektrik_sayaci);
    }


    }
    mk_duraklat(1000);
    }

    void otoyemleme(){
    DateTime now = RTC.now();
    if(yemlememenu == 1){
    if(now.hour() == yemleme1 && now.minute() == yemlemedk1 && now.second() >= 10 && now.second() <= 10+yemlemesaniye){<br /> while(1) {
    for(int pos = yemleme0; pos <= yemleme180; yemleme0++){<br /> myservo.write(pos);
    }
    mk_duraklat(100);
    }
    }
    else {
    while(1) {
    for(int pos = yemleme180; pos >= yemleme0; yemleme180++){
    myservo.write(pos);
    }
    mk_duraklat(100);
    }
    }
    }
  • oto yemleme ve lcd manual ekran fonksiyonlarını setup'ın üzerine koyarak dene. Olmazsa ne hata verdiğini tam olarak yaz.

    Kütüphaneyi göremiyor da olabilir. Sketch->include library tıkla, eklediğin klasörü sec.
  • seçerek de denedim yine olmadı. setup ın üstüne de ekledim.
  • File->Preferences->show verbose output during compilation seç. Derledikten sonra altta mesajlar çıkar, hepsini buraya kopyala. Bakalım neymiş.

    Ayrıca klasörde sadece .h ve .cpp dosyaları olacak. .txt falan olmayacak.
  • C:\Users\H0NEYH~1\AppData\Local\Temp\ccWHFWiL.ltrans2.ltrans.o: In function `__vector_14':

    C:\Users\H0neyHunter\Documents\Arduino\libraries\mikrogorev/mkgorev.cpp:62: undefined reference to `_x'

    collect2.exe: error: ld returned 1 exit status

    "OneWire.h" için birden fazla library bulundu
    Kullanılıyor: C:\Users\H0neyHunter\Documents\Arduino\libraries\OneWire
    Kullanılmıyor: C:\Users\H0neyHunter\Documents\Arduino\libraries\OneWire-2.3.4
    mikrogorev klasöründeki kütüphane kullanılıyor: C:\Users\H0neyHunter\Documents\Arduino\libraries\mikrogorev (legacy)
    Şu dizinde 2.0 sürümündeki EEPROM kütüphanesi kullanılıyor: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\EEPROM
    Arduino-LiquidCrystal-I2C-library-master klasöründeki kütüphane kullanılıyor: C:\Users\H0neyHunter\Documents\Arduino\libraries\Arduino-LiquidCrystal-I2C-library-master (legacy)
    Şu dizinde 1.0 sürümündeki Wire kütüphanesi kullanılıyor: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire
    RTC klasöründeki kütüphane kullanılıyor: C:\Users\H0neyHunter\Documents\Arduino\libraries\RTC (legacy)
    Şu dizinde 2.3.3 sürümündeki OneWire kütüphanesi kullanılıyor: C:\Users\H0neyHunter\Documents\Arduino\libraries\OneWire
    Şu dizinde 3.8.0 sürümündeki DallasTemperature kütüphanesi kullanılıyor: C:\Users\H0neyHunter\Documents\Arduino\libraries\DallasTemperature
    Şu dizinde 1.1.2 sürümündeki Servo kütüphanesi kullanılıyor: C:\Program Files (x86)\Arduino\libraries\Servo
    exit status 1
    Error compiling for board Arduino/Genuino Uno.
  • C:\Users\H0neyHunter\Documents\Arduino\libraries\mikrogorev/mkgorev.cpp:62: undefined reference to `_x'

    collect2.exe: error: ld returned 1 exit status
  • Mk görev haricinde birde C:\Users\H0NEYH~1\AppData\Local\Temp\ccWHFWiL.ltrans2.ltrans.o: In function `__vector_14': hatalı bu nedir acaba
  • İnline assembly kullanırken windows ve linux arasında fark varmış sanırım. Ben de yeni öğrendim. Eve gideyim çözeriz sıkıntı yok.
  • Tamam teşekkür ederim
  • Kütüphanenin kullanımın ds18b20 sıcaklık sensöründe delay yerine de kullanabiliriz dimi. Ve not olarak yazdığınız GOREV(servo ,20 ) değerini anlayamadım . 20 değeri byte değerimi her görevde farklı byet mi kullanacağız yoksa eeprom gibi işlemci yerinde ki bi bölgemi
  • Arduino 1.8.7 sürümünü windowsa kurdum ve kodu hiç değiştirmeden denedim, hatasız derlendi. Senin kullandığın eski sürüm olabilir. Öyleyse güncellemeni tavsiye ederim. Yine de küçük bir değişiklik yaptım. Sadece .cpp dosyasını değiştirip deneyebilirsin.

    https://bitbucket.org/amenofis01/mikro-gorev/get/9886b1ef2bd7.zip

    Evet kullanabilirsin. Arduino'nun delay fonksiyonu da kullanılabilir ama görevi bloklar. 1 saniyelik delay, 16 milyon cpu çevriminin boşa gitmesi demek. O yüzden mümkün olduğunca delay kullanma. Tabi önce kütüphaneyi çalıştırabilmemiz lazım :)

    Oradaki 20 değeri byte cinsinden stack (RAM) kullanımı. lcd.print büyükçe bir fonksiyona benziyor. O yüzden lcd_manuel_ekran() için biraz daha fazla bellek ayırsak fena olmaz. 40 olabilir mesela.

    Aslında bellek büyüklüğünü sabit olarak ta yapabilirdim ama ne kadar kullanılacağı önceden bilinmediği için mecburen büyük bir rakam seçmek zorunda kalacaktım. Üstelik en hafif görevlerde bile o bellek harcanacaktı. Topu topu 2 kb ram'i bu şekilde harcamanın iyi olmayacağını düşündüm.
  • en sonunda yüklemeyi başardım sayenizde fakat bu seferde değişik bir hata var.

    3 tane video ekledim. 1 tanesi projemde ki hatanın görünümü için 2 tanesi bilgisayardan.

    ekran kayıt da kodları ekliyorum. ve lcd de hata alıyorum. donuyor. sonra 2. ekran video da kodları siliyorum düzeliyor.

    1.

    2.


    telefondan çekilen video ile de 1. yükleme ve sonucu 2.yükleme yani kodları silme ve sonucu (Şu an upload ediyor telefonda çektiğim videoyu biraz yüksek mb)



  • Mobilde videolar görünmüyor maalesef. Kodu bir yere yapıştırıp paylaşsan da olur. ideone.com var mesela.

    Öncelikle bellek alanını olabildiğince büyük seçerek dene. Maksimum 255 olabilir.

    2 görevin aynı anda kullandığı ortak bir değişken, fonksiyon ya da herhangi bir nesne var mı?

    Ekleme: Tamam gördüm. Yukarıda yazdığıma ek olarak şunu dene. loop() içine yazdıklarını sil ve onları ayrı bir görev olarak çalıştır, loop boş kalsın. Bellek boyutu da büyük olsun. Ne yazıkki birebir aynı donanımla denemedikten sonra uzaktan yardım kısıtlı oluyor.
  • ama loop u bos nasıl bırakabilirim ki. sürekli kontrol edileek çalışacak işlemlerim var
  • hemen deniyorum boyutu yükseltiyorum
  • denetim 255 de denedim. ard açılmadı 40 da video daki gibi oluyor. 60 70 90 gibi yaptım . onlarda da karakterler de sorun çıktı yani tam anlamıyla olmadı. ilgilenip cevap verdiğiniz içinde teşekkür ederim
  • Yükseltince karakterlerde herhangi bir değişim olduysa sorun hafıza sorunudur. Uno'nun hafızası uygulamanıza yetmiyor gibi görünüyor.
  • Muhtemelen evet . Biraz önce sizin fikrinizden aklıma gelerek internette araştırma yaptım. Nondelay diye bi kütüphane buldum. Bakalım ne olcak .
    Non block delay virtual delay kütüphanesi. Sizce hafıza yi fazla yorarmı mantığını nasıl yapmışlar acaba .

    https://github.com/avandalen/VirtualDelay
  • İhtiyacını görüyorsa kullan. Fazla bir numarası yok onun, hafizada yer kaplamaz ama zaten kullanmış olduğun kütüphaneler neredeyse sonuna kadar doldurmuş hafızayı. Görevin boyutunu arttırınca arduinonun açılmaması bunun kanıtı. malloc() kullandıysan sil onu, başka bir çözüm bul. malloc hafızayı delik deşik eder. Kütüphane kullanmanın kötü yanı arka planda hafızayı nasıl kullandığını bilmiyorsun. Örneğin String, hafızayı parça parça ediyor.
  • Evet string kullanıyorum mecbur olarak saat aralığında ve eşleşmesinde iyi oluoyr
  • Malloc kullanmıyorum. Arkaplan hafızasının durumunu nasıl kontrol edebilirim acaba . Parçacığını nasıl öğrenebilirim
  • Onu öğrenmenin bir yolu yok. Hafızanın verimli olarak kullanılması için kullanıcı belleği kendisi tahsis etmeli. Bu iş kütüphaneye kalırsa soru işaretleri oluşur.

    https://learn.adafruit.com/memories-of-an-arduino/optimizing-sram

    Bu, bellek hakkında bir yazı dizisinin bir sayfası. Altta bir resim göreceksin. Orada static olarak belirtilen bölge ram'in başlangıç tarafı, sabit olarak ayrılmış bölgedir. Bizim GOREV() makrosu da static olarak tahsis eder. Veriler arka arkaya dizildiğinden dolayı arada boşluk olmaz. Kütüphaneyi kullanan kişi kaç byte kullandığını tam olarak bilir.

    En sondaki stack, ram'in sonunda çalışır. Bunun sebebi static bölge ile çakışma ihtimalini en aza indirmek içindir. Static bölge baştan sona doğru büyür, stack ise sondan başa doğru. Eğer ikisi ortada çakışırsa program çöker.

    Burada en sıkıntılı olan ortadaki heap bölgesi. malloc(), static ve stack bölgesini bozmamak için ram'in ortasından bellek tahsisi yapmaya çalışır. Mesela kütüphaneye 100 byte lazım diyelim. Baktığı bölgede 80 byte müsait varsa orayı atlayıp başka bölgeyi kontrol eder. O şekilde devam ederek kullanılmayan küçük parçalar bırakır. Delikler çoğaldıkça malloc'un uygun bir bölge bulması da zorlaşır. En sonunda stack bölgesine iyice yaklaşır, Ya stack verisinin üzerine yazıp programı çökertir ya da stack büyüyerek kütüphanenin verisini bozar.

    Daha fazlası için yukarıdaki yazı dizisini okuyabilirsin.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.