Arduino Seri Haberleşme: Serial Port Ve Fonksiyonları

Tüm Arduio kartlarında en az bir adet Arduino kartı ile bilgisayar veya diğer cihazlar arasında bağlantı kuran Serial Port bulunuyor. Arduino UNO’dan bir tane Serial Port bulunurken Arduino MEGA ve Arduino DUE’de daha fazla port yer alıyor. Bu konuyla ilgili başka yazılarımıza buradan ve buradan ulaşabilirsiniz.

Arduino UNO, 0’dan 13’e kadar olmak üzere toplam 14 tane dijital pine sahiptir. Bu kartta da diğer kartlarda da görebileceğimiz gibi dijital 0 (RX) ve dijital 1 (TX) pinleri Serial Port için ayrılmıştır. Arduino kartımız üzerindeki Serial Port için ayrılmış pinleri tek seferde yalnızca Serial Port için kullanabiliriz. Bu sırada bu pinler başka giriş veya çıkış işlemlerini gerçekleştiremez. Arduino’nunuzun bilgisayarla haberleşmesini sağlamak için 0 ve 1 numaralı pinlerin başla bir yere bağlı olmadığından emin olmanız gerekir.

arduino seri haberleşme

Her şeyden önce bilgisayarınız ve kartınız arasındaki bağlantıyı sağlamanız gerekir. Daha sonra  Serial Port Ekranına ulaşabilir ve bu ekranı kullanarak kartınız ile haberleşme ekranına ulaşabilirsiniz. Serial Port Ekranı için Türkçede Seri Port Ekranı ya da Serial Monitor ifadeleri de kullanılıyor. Bu ifadelerden herhangi biriyle karşılaştığınızda hepsinin aynı anlama geldiğini hatırlamanızda fayda var.

Haberleşme ekranına tanımlanmış fonksiyonlar

Arduino programlama dilinde seri haberleşme portunu kullanımı için tanımlanmış bir Serial nesnesi bulunmaktadır. Serial nesnesi işimizi kolaylaştırıcı bir çok fonksiyona sahiptir. Bunları şöyle sıralayabiliriz.

  • available ()
  • availableForWrite ()
  • begin ()
  • end ()
  • find ()
  • findUntil ()
  • flush ()
  • if ( Serial )
  • parseFloat ()
  • parseInt ()
  • peek ()
  • print ()
  • println ()
  • read ()
  • readBytes ()
  • readBytesUntil ()
  • readString ()
  • readStringUntil ()
  • serialEvent ()
  • setTimeOut ()
  • write ()

Bu fonksiyonların her biri farklı bir görev için tanımlanmıştır ve Arduino kartınızla işlem yapmanızı sağlarlar.

Seri haberleşmeyi kurmak için ilk kullanmamız gereken fonksiyon şudur:

Serial.begin()

Bu komut ile Seri ara birimi kullanmak için hazır hale getirmiş oluruz. Kullanım şekli Serial.begin(baud rate); şeklindedir. Burada gördüğünüz Baud Rate, haberleşme hızını belirtir ve birimi bps yani saniye başına bit’dir. Baud Rate;  300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, yada 115200 değerlerini alabilir. Standart olarak basit bir iletişim kurup haberleşme yapmak için 9600 bps kullanılır.

Bundan sonraki adımlarda; serial.print(), serial.write(), serial.read(), serial.available() gibi komutlarla yolunuza devam etmeniz gerekir. Bu komutların temelde nasıl çalıştığını, parantez içlerine yazılan bilgilerin ya da diğer fonksiyonlarla birlikte verilen komutların nasıl bir anlama geldiğini kavradığınızda birkaç temel bilgiyle pek çok komutu çalıştırabilir hale gelirsiniz.

Kısaca bakacak olursak:

Serial.begin(baud_rate): Serial haberleşmenin başlatılması için “setup” kısmına yazılır.

Serial.print() / Serial.println(): Serial ASCII yazılarının göndermemizi sağlar. String ve Char değişkenlerini gönderir.

Serial.Write(): Serial üzerinden byte verileri gönderir.

Serial.read(): Serialden gelen verileri okumak için kullanılır.

Serial.available():  Serial bağlantının kullanılabilir olup olmadığını kontrol eder. “if” gibi foksiyonlarla kullanılır.

52 comments

  1. SALİH YILMAZ dedi ki:

    Merhaba yangın paneli rs232 yazıcı çıkışından gelen alarm satırlarından istediğim yazıyı kullanarak P10 Led Ekran üzerine yazdırmak istiyorum.Bunun ile ilgili yardımcı olurmusunuz.

    • Ömer Koman dedi ki:

      p10 panelle ılgılı calışma yapmış olanlar var foruma gelin sorun yardım alabılırsınız.

  2. mehmet andiç dedi ki:

    hocam merhabalar. ben parmak izi okuma sensörünü arduino uno yardımıyla kodladım. seri port ekranını açınca “parmak izi okuma sensörü bulundu”,”geçerli parmağı girin” vs. bilgiler çıkıyor şimdi bu yazanları I2C lcd ekrana nasıl gönderebilirim yani bu bilgilerin orada görünmesinin nasıl sağlayabilirim ?

    • Ömer Koman dedi ki:

      i2c ekran aldıysan once ekranın orneklerını çalıştır cunku ekran adresının bulunması ayarlanması gerekır ılk seferde çalışmazsa. gerıye serıalden verıyı yollayacagına lcd ekrana yollayacaksın.

  3. mehmet andiç dedi ki:

    hocam lcd ekranın adresini buldum 0x27. şimdi örneğin Serial.print(“parmak izi kaydedildi”) yazan yazıda Serial.print kısmını silip lcd.print mi yazmam gerekiyor?

    • Ömer Koman dedi ki:

      evet olabılır ama once koordınat da gır kı yazdıgın yere hakım ol… lcd orneklerını ıncele

  4. Mustafa dedi ki:

    Hocam mrb’lar iyi günler, bir projem var iki arduino kartından oluşan vericiden diğer arduino kartı olan alıcıya lazer ile LDR arasında bir bağlantı kurup bir resim aktarımı yapmak istiyorum fakat eksiklerim var hem devre kurulumu hemde yazılım olarak, yardımcı olabilirseniz çok memnun olur her aklıma geldiğinizde dua ederim.:)

  5. Ahmet anıl arslan dedi ki:

    Hocam iyi günler önemli bir projem var da yardıma ihtiyacım var bir iletişim bilgisi alabilirmyim eğer mümkünse

    • Ömer Koman dedi ki:

      özel proje desteğimiz yok sitenin forumlarını kullanıp açık yardım isteyebilirsiniz, konuyu çalışmış tecrubesi olan varsa yardım edebilir.

  6. Dursun unal dedi ki:

    Bir sorum var önemli analog girişten giren
    0 dan 3 volta ulaştığı zamanı olcebilrmi 0 100 arası sayıya dönüştürmek istiyoruz bu zamani

    • Ömer Koman dedi ki:

      millis fonksiyonu geçen zamanı size bildirir.
      mantıgını yazayım programı siz yazın

      baslangiczaman=millis()

      adc okuma:
      adc yi oku
      3v olmadıysa adc okuma ya dön
      3v oldu ise
      bitiszamani=millis()
      ekrana yaz, bitiszamani-baslangizzamani

  7. Doğan Akdoğ dedi ki:

    Şimdi doğru yeri buldum galiba.
    Merhabalar
    Arduino Uno ile PIC haberleşmesi yapmak istiyorum.Daha önce ki haberleşme iki pic arasındaydı burda kullandığım kodlar PBP da yazdığım kodlardı.
    Verici trafı
    hserout[“DCM”,dec2 calis,dec2 dur,Tuz.byte1,Tuz.byte0,dec2 Ybas,Abas.byte1,Abas.byte0,ONDA.byte1,ONDA.byte0,dec1 Yaz,13,10]
    Alıcıda:
    hserin[“DCM”,dec2 calis,dec2 dur,Tuz.byte1,Tuz.byte0,dec2 Ybas,Abas.byte1,Abas.byte0,ONDA.byte1,ONDA.byte0,dec1 Yaz,13,10]
    Arduinoda hangi kodla göndereceğimi bulamadım yardımcı olursanız sevinirim.

    • Ömer Koman dedi ki:

      arduinoda hserin hserout komutlarına benzer bir fonksiyonu sizin yazmanız lazım.
      seriporttan veri yollama komutu Serial.write kullanılıyor.
      şuradan inceleyebillirsiniz https://www.arduino.cc/en/Serial/Write
      okuma için Serial.read kullanılıyor ama Serial.available()>0 olduğunda okumanız lazım.
      her okunan karakteri bir stringte biriktirip sonnlandırma karakteri ne seçtiyseniz o geldiğinde toptan değerlendirirsiniz.
      https://www.arduino.cc/en/Serial/Read

  8. Doğan Akdoğ dedi ki:

    Göndereceğim dataları sitring1,,2,,,8 olarak tanımladım .Sitring1+sitring2+…vs olarak string8 e attim.serial.print(string8) le gönderiyorum ama karşı taraftan dogru bilgi alamıyorum

    • Ömer Koman dedi ki:

      kablo ile mi bağlı cihazlar birbirine rx tx capraz olacak biliyorsun ve aynı hızda olacak seriportlar. en basitinden başlatın yarım sanıye arayla bir “A” karakteri yollayın karşı taraftan basitçe okumaya çalışın. arduıno çalışırken bilgisayara usb baglı olmasın dısarıdan besleyın usb ıle serial1 bırbırıne paralel baglı oldugu ıcın sorun yaşayabılırsınız.

  9. Doğan Akdoğ dedi ki:

    Kablo ile bağlı heri ki tarafta da SN75176 var RS485 olarak kullanıyorum ilk komutu alıyor çalış komutu ikinci ekran açılıyor ekrana diğer dataları yanlış yazıyor hp değeri normalde 55 olması gerkirken 90 Tuz değeri 810 olması gerkirken 3545 gibi ilgisiz sayılar çıkıyor.Beslemeyi dişardan 12V veriyorum usb kablosu takılı değil.

  10. Ömer Koman dedi ki:

    kullandıgınız kutuphanenın ornek kodları vardır once onları yapmaya calısın basitinden baslayın demek ıstıyorum boyle yenı ortamlarda direk gercek koda yazmaya baslamak ıcın erken. hatta rs485 bıle baglamadan once ıkı farklı işlemciyi rx tx ler birbirine ters olarak baglayarak arada ıletişim varmı ona bakın. arduıno tarafında devamlı basit tx yazan bir mod yazın diğerineden bunu okumaya calısın.

  11. İsmail Aktaş dedi ki:

    Selam Ömer bey.
    Yazılarınızı bir çoğunu keyifle okudum, fakat C++ literatürünün dışında ifadelerinizi fak ettim. Düzeltme gereği duydum kusura bakmayın.
    “if() gibi fonksiyonlarla kullaniniz” ifadeniz yalnış. Yazılım dillerinde “if()” kontrol yapısıdır if, if-else ve switch olarak kontrol yapısı vardır. Dilin yapısı olan bu kontrol yapısı yeniden yazılamaz ve tanımlanamaz. Halbuki fonksiyonlar yeniden yazılır ve tanımlanır.
    Saygilarla

    • Ömer Koman dedi ki:

      teşekkürler. sorunlu yazıları belirtirseniz üstüne açıklama yazarız. yazıların çoğu 5 yıldan eski hepsini hatırlamıyorum.

  12. Mehmet Muhamed dedi ki:

    Merhaba iyi günler bir sorum olucaktı seri haberleşme yapıyorum projemde ve bir sorun yaşıyorum bu sorun seri port ekranında diyelim 12 yazdık bunu 1 ayrı 2 ayrı okuyor benim istedigim 12 yazdım mı 12 okusun direk bu sorunun nasıl çözebilirim.

  13. Başak dedi ki:

    Merhaba, yazınız çok faydalı oldu teşekkürler şunu sormak istiyorum ; Projemde MQ-4 gaz sensörü kullandım serial port ekranını açtığımda aldığım değerler ne cinsinden geliyor onu tam anlayamadım 100-850 aralığında değerler elde ediyorum bu gazın ppm cinsinden değerini mi veriyor acaba? eğer değilse nasıl ppm değerine dönüştürebilirim?
    Teşekkürler

  14. faruk dedi ki:

    arduino üzerinde bme280 altimetre gibi sensörlerim var bu sensör verilerini c++ da yazdığım arayüz programında okumak istiyorum yardımcı olurmusunuz.

  15. abdil yılmaz dedi ki:

    iyi çalışmalar. Ben cizgi takip eden robota ultrasonik engel sensörü ekledim fakat kodlama bilgim yok sayılır. Yarddımcı olur musunuz?

  16. Mustafa Sivrikaya dedi ki:

    void setup()
    {
    Serial.begin(9600);
    }
    void loop()
    {
    int deger=Serial.read();
    Serial.println(deger);
    delay(500);
    }

    bu kadar basit bir kodda seri port ekranında
    örneğin 1 yazdığımda
    49
    10
    değerini döndürüyor.
    örneğin 100 yazdığımda
    49
    48
    48
    10
    değerini döndürüyor.
    bunun sebebi nedir? nasıl düzeltebilirim?
    100 yazıyorsam neden 100 olarak almıyor veya sonradan neden 10 değerini döndürüyor?
    sadece “gönder” butonuna bastıgımda da 10 değerini gönderiyor? çok saçma değil mi?

  17. Sena dedi ki:

    Merhaba;
    Arduino ile modbus tester programı kullanarak RD320-OFR modülüne giden sinyali okuyabilirmiyim. Bu modüle bağlı rs485 var.

    • Ömer Koman dedi ki:

      lojik analizer ile iletişimin hızını inceledikten sonra loglama yapabilmeniz lazım. nasıl yaparsın onu bilmem arduinoyu rs485 hattına bağlayıp arduinonun rx kısmından gelen sinyalleri hex olarak inceleyin. biraz karışık.

  18. yahya torun dedi ki:

    iyi akşamlar. tx ve rx pinlerini haberleşme değil de dijital çıkış pini olarak kullanabilir miyiz. oraya bir şey bağladığımda sürekli çalışıyor.

    • Ömer Koman dedi ki:

      program yüklemek için o pinler lazım bize arduino bootloader o pinleri okuyor ilk başlatıldığında oraya bağlı her şey en azından bir kere tetiklenmiş olur, bunu istemeyiz. teorik olarak kullanırsınız tabiki de çok uğraşırsınız.

  19. Atakan AKDOĞAN dedi ki:

    Merhabalar. C üzerinde ürettiğim random sayıyı ve kendim girdiğim sayıyı serialport_write ile arduinoya yollamak istiyorum. Fakat sorum şu ki arduinoda serial.read() fonksiyonu ile 2 farklı değeri nasıl alabilirim

    • Ömer Koman dedi ki:

      orneğin 2 sayısı şu şekilde yolladınız 123,456:

      arduino tarafında serial.available() olduğunda okduğunuz karakterleri bir string diziye ekleyin. “,” e denk geldiğinizde diğer stringe gelen karakterleri ekleyin ve en sonunda “:” karakteri geldiğinde sayıları stringten integere döndürüp ne yapamak istiyorsanız yapın.
      başka yöntemler de bulabilirsiniz aklıma ilk gelen bu oldu… kolay gelsin

  20. Barış Bilir Soylu dedi ki:

    merhaba
    arduino nano ile kullanarak robot kontrol etmek istiyorum. Kontrol için HC-05 kullanıyorum. Ayırca devremde mp3 modül kullanacağım. her ikisi için de tex rx uçalrın aihtiyacım var. bunlardan 1 tanesi donanımsal var. diğeri içinde yazılımsal yapılabiliyor. cep telefonunda veri gönderdiğim zaman mp3 modül çal dediğim zaman çalmıyor. aynı anda 2 adet tx rx kullanabilmem için ne yapabilirim.

  21. KASIM dedi ki:

    SELAM HOCAM BENİM ARDİUNOM KLON MEGA 2560;Ben serial begin(9600);ve baud hızlarını açamıyorum seri monotörde yazdıklarımı göremiyorum com 3, 4, 5 hepsini kulandım. com . aygıt yöneticisinde de sıkıntı yok. seri haberleşme yapamıyorum.Baud hızlarını hepsini denedim yinede olmadı. serial kısmında sıkıntı oluşuyor begin çalışiyor ,serial kırmızı renge dönmüyor.serial monotörü ” “işaretlerinide kullanıyorum ve ; koyuyorum yinede olmuyor. saygılar.

    • Ömer Koman dedi ki:

      program yukleyebiliyorsanız sorun çıkmaması lazım yani comm portunuz çalışıyordur. arduinoya hiçbirşey takmadan sadece power ve usb kablosu bağlı iken deneyin.

      • İrfan dedi ki:

        Hocam foruma girilmiyor.
        Kısa bir kod yazmaya çalıştım ama gerekli kütüphaneyi yükleyemedim icin çalışmadı.
        Bu konuda nereden yardım alabilirim

        • Ömer Koman dedi ki:

          serial haberleşme için kütüphane yüklemenize gerek yok siz standart serialı kullanın atmegada bir kaç tane daha serial olabilir şimdilik onları kullanmayın
          anladığım kadarı ile program yükleyebiliyorsunuz bu durumda herhangi bir serial print orneği işinize yarar onları kullanın.

  22. mehmet melikşajh çalışkan dedi ki:

    merhaba ben kablosuz haberleşme yapmaya çalışıyorum ve aldığım hatanın çözümü ile ilgili “Seri port baud hızı kaydını koda dönüştürün” denmiş bunu nasıl yapabilirim

  23. oğuzhan ışık dedi ki:

    merhaba basit bir kod yazmak istiyorum ama yardımcı olur musunuz?
    sürekli 1 şununa basıp çeksin belli sürelerde 2 ye bassın istiyorum ama ne kullanacağımı anlamadım.

  24. Yakup Erdoğan dedi ki:

    Hocam selamlar.
    Her soruya üşenmeden cevap vermişsiniz tebrik ederim.
    konunuzun altında reklam yapmak saygısızlık olurmu bilemiyorum ama 8 yaşındaki oğlumun youtube kanalında seri haberleşmeyle ilgili videoları vardı. buradan yazsam linkini ve ilgilenenler hem girip izleseler, hem de bu minik arkadaşın kanalına abone olarak ona destek olmuş olsalar hoş olmazmı 🙂
    Ayrıca sizin gibi bilgili büyüklerimizin de bu miniklere desteklerini bekleriz hocam.
    Selamlar.

    “Emre’nin Arduino dünyası” adlı kanalının ilgili bölümü aşağıdadır:
    https://www.youtube.com/playlist?list=PL6LbTZvbt9nRgKXXTtcKNjvghYhNmMoQM

  25. Gencer Çırpan dedi ki:

    Hocam saygılar, selamlar.
    Seri porttan gelen data paketleri arasından sadece istediğim karakterle başlayan data paketinin içindeki, belirlediğim aralıktaki verinin seri çıkşa bağlı ekranda yazdırmak istiyorum. Ancak gelen tüm data paketlerindeki belirlediğim aralıktaki veriler sıra ile sergileniyor. Nerede yanlış yaptığımı bir türlü bulamadım. Yardımcı olursanız sevinirim. Yazdığım kod aşağıda olduğu gibidir:
    Teşekkür ederim.

    String msg = “”; // gelen datayı burada tutuyoruz
    bool stringComplete = false; // datanın tamamen geldiğini belirten flag
    void setup() {
    // seri bağlantıları açıyoruz.
    Serial2.begin(115200); //NMAE simulator-arduino com3 seri haberleşme
    Serial.begin(9600); //arduino -PC com4 seri haberleşme
    Serial1.begin(9600); //Arduino- Nextion TTL seri haberleşme

    msg.reserve(2000); // 2000 byte lik yer açıyoruz
    }

    void serialEvent()
    {
    while (Serial2.available())
    {
    char inChar = (char)Serial2.read(); //yeni bir byte geldi 1 byte 1 karakter demektir. yani “a” mesela tek seferde
    msg += inChar; // add it to the msg:
    if (inChar == ‘\n’) // new line karakteri gelince stringComplete flag’ı kaldırılıyor ve string işleme alınıyor.
    {
    stringComplete = true; // yapılcak işlemler burada yazılabilir.
    }
    }
    }

    void loop() {

    //newLine karakteri ile birlikte yeni bir string geldiyse
    if (stringComplete)
    {
    Serial.println(msg); // gelen veriyi Arduino Serial com penceresinde izlemek için

    if (msg.substring(“”) == “$HCHDG”); // bu filtrenin gereğini yaptıramıyorum!!!!!!!!!!!
    {
    /* aşağıdaki iki print kod bloğu istenen verinin Nextion erandaki iki farklı compenent (text metin hücresi) sergilenmesi için
    * sadece $HCHDG ile başlayan NMEA datasını değil gelen tüm NMEA datalarının 0-12 (txt0.txt kompenentinde) ve 7-12’inci (txt1.txt kompenentinde) karakterleri sergileniyor. Sorun bu
    */
    Serial1.print(“txt0.txt=”);
    Serial1.print(“\””);
    Serial1.println(msg.substring(0, 12));
    Serial1.print(“\””);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff);

    Serial1.print(“txt1.txt=”);
    Serial1.print(“\””);
    Serial1.println(msg.substring(7, 12));
    Serial1.print(“\””);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff);

    }
    // String’i temizleyelim.
    msg = “”;
    stringComplete = false;
    }
    }

    • Ömer Koman dedi ki:

      substring yerine şöyle yapsanız?
      int posHeader = s.indexOf(“$HCHDG”);
      if (posHeader == 0) { // Got “$HCDG”

      geri kalan pars işlemlerini de posHeader e göre ayarlarsınız.

      • Gencer Çırpan dedi ki:

        Hocam çok teşekkür ederim.
        Sayenizde kaç gündür takıldığım bir sorunu geçtim.
        Daha çözmem ve öğrenmem gereken başka sorunlarda var ama arduinoya yeni başlayan biri olarak büyük bir sorunu aşmış oldum.
        Kullandığım kodları mümkün olduğunca anlayarak yazmaya çalışıyorum.Verdiğiniz ipucunu şu şekilde kullandım;
        int posHeader1 = msg.indexOf(“$HCHDT”);
        if (posHeader1 == 0) { // buradan sonra yazdırma işlemlerini başarı ile yaptım
        Surum şu: indexOf fonksiyonunun sonucu 1 veya 0. Biz bunu posHeader intager’ına atadık. istediğimiz değer string içerisinde mevcutsa bu fonksiyon sonucu 1 olmuyor mu? Ama biz “if (posHeader1 == 0)” ile fonksiyonun sonucu 0 ise istediğimiz çıktıyı alabiliyoruz. buradaki ters mantığı anlamadım.
        Diğer sorum seri veri okurken kullandiğim “while(!Serial2.available());” kodundaki Serial’in başındaki ünlem ne işe yarıyor. veri okumayı if ile yaptığımızda bunu yazmıyoruz. ünlemin operatörler ile kullanıldığında olumsuzluk oluşturduğunu biliyorum (örnek !== eşit değil demek) ama buradaki kullanımını açıklayabilir misiniz.
        Değerli vaktinizi ayırıp cevap yazdığınız için tekrar teşekkürler.

        Seri porttan alınan NMEA formatındaki data paketlerinin okunup içlerinden istenilen dataların nextion lcd paneldeki pencerelerde sergilenmesi ile ilgili çalışmamın kodları aşağıda olduğu gibidir.
        Amatör bir çalışma. Hatalı var. Ancak şu an çalışıyor. Yaptığım araştırmalarda kütüphane kullanılmayan, anlaşılır benzer bir örnek bulamadım. örnek olması bakımından yazıyorum.
        Seri Porttan gelen veri:
        20:11:08.167 -> $HCHDT,90.0,T*10
        20:11:08.167 -> $GPVTG,89.8,T,84.8,M,10.5,N,19.5,K*4A
        20:11:09.167 -> $GPVTG,91.6,T,86.6,M,10.5,N,19.5,K*41
        20:11:10.168 -> $HCHDT,93.4,T*17
        20:11:10.168 -> $GPVTG,93.3,T,88.3,M,10.5,N,19.5,K*4D
        20:11:11.167 -> $GPVTG,95.0,T,90.0,M,10.5,N,19.5,K*42

        //////Kullandığım kodlama////
        String msg = “”;
        void setup() {
        Serial2.begin(115200); //NMAE simulator-arduino com3 seri haberleşme
        Serial.begin(9600); //arduino -PC com4 seri haberleşme
        Serial1.begin(9600); //Arduino- Nextion TTL seri haberleşme
        msg.reserve(2000); // 2000 byte lik yer açıyoruz
        }
        void loop() {
        while(!Serial2.available()); // eri veriyi varsa

        String msg = Serial2.readStringUntil(‘\n’); // bitirme işaretine kadar gelen veriyi okuyup msg stringine atıyoruz.
        Serial.println(msg); // arduino seri ekranına gelen veriyi yazdırıyoruz

        int posHeader1 = msg.indexOf(“$HCHDT”);
        int posHeader2 = msg.indexOf(“$GPVTG”);
        if (posHeader1 == 0) {

        //Buradan sonrasında istenen verilerin Nextion ekrandaki “txtH.txt” ve “txtS.txt” kompenentlerinde sergiletiyoruz
        String msgs = msg.substring(0, 13);
        Serial1.print(“txtH.txt=”);
        Serial1.print(“\””);
        Serial1.println(msgs.substring(7, 12));
        Serial1.print(“\””);
        Serial1.write(0xff);
        Serial1.write(0xff);
        Serial1.write(0xff);
        }
        else if (posHeader2 == 0) {
        String msgg = msg.substring(0, 30);
        Serial1.print(“txtS.txt=”);
        Serial1.print(“\””);
        Serial1.println(msgg.substring(23, 27));
        Serial1.print(“\””);
        Serial1.write(0xff);
        Serial1.write(0xff);
        Serial1.write(0xff);
        }
        msg = “”; //msg değişkeninde tutulan strigleri siliyoruz
        }

        • Ömer Koman dedi ki:

          while(!Serial2.available());
          kodunuz bu noktada veri yoksa bekler durur yada orada döner demek daha doğru olur.
          biraz c++ çalışmanız lazım. ! işareti olumsuzsa veya değilse demek yukarıdaki kod serial.available olmadığında while kodunu işle demek başka da şart olmadığı için tekrar başa döner durur. herhangi bir veri gelirse rutinden kurtulur alt satıra geçer.

          Arduino sitesinden indexof komutunu inceleyin değeri 0 veya 1 olmaz 0 ise birşey bulamadığını 0 dan büyük bulduğu zaman aradığı string içindeki yerini gösterir yani 5 değeri geliyorsa string içinde 5. karakterden başladığını gösterir buna göre ayarlamanız lazım kodunuzu

  26. Aytaç Seven dedi ki:

    Ömer bey merhaba;
    iki eksende çalışan bir kartezyen kol programladım.Bu kolun amacı metal parçaları bir noktadan bir noktaya taşımak olacak.

    3 farklı elektroıknatıs denememe rağmen bir sorun yaşıyorum.
    Parçaları yakalamak konusunda sorunum yok ama bırakma noktasında sürekli aynı kararlılığı alamıyorum.Gerek röle gerekse de PWM ile yaptım ama elektromıknatıs bir şekilde manyetik üzerinde kalıyor. LOW yaptığımda elektomıknatıs üzerinde kalan akım parçanın tutunmaya devam etmesine neden oluyor.Bu sorunu nasıl çözebileceğim hakkında yardımcı olacağınızı umuyorum.

    Saygılarımla

    • Ömer Koman dedi ki:

      elektromıknatısın kutuplarını boş bıraktığınızda üstünde bir miktar ters akım oluşur onu topraklamanız lazım. biz bir projede büyük motorları durdurmakta zorlanıyorduk, frenleme yapmamız gerekti. motor kutuplarından birine diğer kutbun aynısını verince motor olduğu yerde çakılıp kalıyor o zaman. sizde hangi kutbu ayırıyorsanız kısa bir süre veya devamlı diğer kutbun aynı polaritede voltaj uygulayın o zaman olması lazım. dikkat etmeniz gereken voltaj akım kaynağını mıknatısın ürettiği ters voltaj ve akımlardan koruyacak şekilde diyotla veya uygun bir yarı iletkenle de korumanız lazım.
      bu cevabı okuduysanız ve uygulayınca buraya yazarsanız memnun olurum.

E-posta adresiniz gösterilmeyecek. Gerekli alanlar * ile işaretlidir.

*



Sosyal Ağlar