Şimdi Ara

Serial monitörden girilen veriye göre led yakma yardım!

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
13
Cevap
0
Favori
1.862
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • merhaba arkadaşlar
    arduino da yeniyim internette çok fazla kaynak olduğundan aradığımı bulmakta sıkıntı yaşıyorum. basit bir proje yapmak için kod kısmında sıkıntı yaşadım o yüzden size sormak istedim.
    çalışmada serial monitör benim veri girmemi istesin. eğer girmiş olduğum veri "salon" ise 3 numaralı digital pindeki ledi 5 saniye yaksın ve tüm ledler sönsün sonra tekrar veri girmemi istesin.
    mutfak yazdığımda ise 4 numaralı pine bağlı olan ledi yaksın ve tüm ledler sönsün
    aşağıdaki kodda baya bi eksik var yanlış yoldan mı yapmaya çalışıyorum acaba?
    yardımcı olanlara şimdiden teşekkürler

    char gelenveri;

    void setup()
    {
    pinMode(3, OUTPUT);
    Serial.begin(9600);
    Serial.println("oda ismi giriniz.");
    }

    void loop()
    {
    if(Serial.available() > 0)
    {
    gelenveri = Serial.read();
    Serial.print(gelenveri);
    }
    if(gelenveri=="salon");
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    delay(5000);
    else if(gelenveri=="mutfak");
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    delay(5000);
    }

    }







  • c# ile arduino led yakma diye aratın size örnek olur.
  • quote:

    Orijinalden alıntı: ONY86

    c# ile arduino led yakma diye aratın size örnek olur.
    c+ a girmeden sadece arduino kodları ile bu işi halledemez miyim?
  • zdebre Z kullanıcısına yanıt
    arduino programındaki serial monitörü kullanacaksan c# a gerek yok tabiki.gelen veri şu ise bunu yap tarzında if if else ile koşullar oluşturman yeterli
  • quote:

    Orijinalden alıntı: ONY86

    arduino programındaki serial monitörü kullanacaksan c# a gerek yok tabiki.gelen veri şu ise bunu yap tarzında if if else ile koşullar oluşturman yeterli
    hocam arduino da yeniyim
    serial monitöre gelen yazı değerini nasıl kontrol ettiricem gelen veri char mı olmalı string mi?
    if (gelenveri=="salon");
    digitalWrite(1,HIGH);
    Serial.println("salonun ışığı yanıyor")
    delay(5000);
    digitalWrite(1,LOW);

    else if (gelenveri=="mutfak");
    digitalWrite(2,HIGH);
    Serial.println("mutfak ışığı yanıyor")
    delay(5000);
    digitalWrite(2,LOW);
    komutu işe yaramıyor ben mi beceremedim.
    yani gelen veriyi bi değere atamak ve if koşuluyla işlem yaptırmayı becermedim
  • zdebre Z kullanıcısına yanıt
    serial monitörden gönderdiğin veriyi rakam olarak gönder.ben motorlu anten için bi program hazırladım ve arduinodan bildiğin yazıyı geri gönderiyor sorun olmuyordu.şu ara hastayım düzelince deneyerek cevap veririm.bir de 0 ve 1 pinlerini kullanma
  • zdebre Z kullanıcısına yanıt
    Merhabalar. Öncelikle pin tanımlamalarını doğru şekilde yaptığınızı ve seri iletişimi doğru şekilde başlattığınızı varsayarak yazıyorum(Yani 1 ve 2 numaralı pinler çıkış olarak ayarlandı ve seri iletişim başlatıldı).

    Serial monitörden okunan veriler string tipindedir. Okunana veriyi atacağınız değişken string olmalıdır.

    Yazdığınız kodlarda yanlış olan yerler var. Genel mantık doğru ama ilk olarak değişken string olacak.
    İf bloğu içindeki komutlar süslü parantezler içinde olmalı. Yani;

    if(Serial.available())
    {
    if(gelenveri == "salon")
    {
    digitalWrite(1,HIGH);
    Serial.println("salonun ışığı yanıyor");
    delay(5000);
    digitalWrite(1,LOW);
    }
    else if (gelenveri=="mutfak")
    {
    digitalWrite(2,HIGH);
    Serial.println("mutfak ışığı yanıyor");
    delay(5000);
    digitalWrite(2,LOW);
    }
    }

    kodlar bu şekilde olmalı. Başka problem gözükmüyor.Sonucu buraya yazarsan sevinirim.




  • quote:

    Orijinalden alıntı: osmanertomac

    Merhabalar. Öncelikle pin tanımlamalarını doğru şekilde yaptığınızı ve seri iletişimi doğru şekilde başlattığınızı varsayarak yazıyorum(Yani 1 ve 2 numaralı pinler çıkış olarak ayarlandı ve seri iletişim başlatıldı).

    Serial monitörden okunan veriler string tipindedir. Okunana veriyi atacağınız değişken string olmalıdır.

    Yazdığınız kodlarda yanlış olan yerler var. Genel mantık doğru ama ilk olarak değişken string olacak.
    İf bloğu içindeki komutlar süslü parantezler içinde olmalı. Yani;

    if(Serial.available())
    {
    if(gelenveri == "salon")
    {
    digitalWrite(1,HIGH);
    Serial.println("salonun ışığı yanıyor");
    delay(5000);
    digitalWrite(1,LOW);
    }
    else if (gelenveri=="mutfak")
    {
    digitalWrite(2,HIGH);
    Serial.println("mutfak ışığı yanıyor");
    delay(5000);
    digitalWrite(2,LOW);
    }
    }

    kodlar bu şekilde olmalı. Başka problem gözükmüyor.Sonucu buraya yazarsan sevinirim.
    hocam kodları düzelttim yine olmadı. sorun şurda serialden gönderdiğim komutlar ASCII koduna cevrilerek gönderiliyor.
    girilen değişken String olarak girildiğinde tek tek karakterleri değerlendirmeye alınıyor.
    yani (if(gelenveri=="salon");) bu komutla girilen değer işleme alınmıyor.
    arduino forumda bir eleman "yak" yazarak ledleri yakabilir miyim diye bişey sormuş.
    cevap olarak kısaca anlatılmış. tabi ben hala işin içinden çıkamadım.
    arduinoforumda daki cevap:

    Önce gelen verilerin alınacağı sonrada gelen dataların toplandığı bir değişken tanımlayacaksın.
    Daha sonra birde seriport kontrol biti tanımlayacaksın.
    Birde gelen bitleri sayan bir bitsayici tanımlayacaksın
    Örneğin

    char gelenbit,seriportkontrol;
    char gelenveri[veri boyutu sen belirler(bu örnekte 3 tane veri gelecek)];
    int bitsayici;

    Seri porttan okuyorsun bu yüzden seri portta veri varmı diye bakacaksın

    if( seriportkontrol = Serial.available() > 0 ) //seriportta bilgi varmı dire sorgula?
    {
    gelenbit = Serial.read(); //gelen datayı al
    gelenveri[bitsayici] = gelenbit; //gelen dataları bir değişkene biriktir
    bitsayici++;
    }
    else //seri porttan data gelme olayı bitti ise
    {
    bitsayici=0; //bitsayiciyi sıfırla
    for (int j = 0; j <= 3; j++) gelenveri[j] = 0; // buradada gelenveri adındaki değişkenin içerisini sıfırla böylece bir sonraki gelen veri bir önceki gelen verinin üzerine yazılmaz boş bir değişkene yazılmış olur (buradaki 3 değeri senin en yukarda tanımladığın veri boyutu ile aynı olmalı)<br />}

    Bu şekilde gönderdiğin datalar gelir gelenveri diye bir değişkende toplanır.Sonra sen bu verileri if ile karşılaştırıp işlem yapmak istiyorsan

    if (strcmp(gelenveri, "yak") == 0) //gelen veri "yak" ise buraya girer ve işlem yapar
    {
    //gelen veri "yak" ise birşey yap
    }

    belki sen anlarsın açıklarsın kodları :)




  • quote:

    Orijinalden alıntı: zdebre

    hocam kodları düzelttim yine olmadı. sorun şurda serialden gönderdiğim komutlar ASCII koduna cevrilerek gönderiliyor.
    girilen değişken String olarak girildiğinde tek tek karakterleri değerlendirmeye alınıyor.
    yani (if(gelenveri=="salon");) bu komutla girilen değer işleme alınmıyor.
    arduino forumda bir eleman "yak" yazarak ledleri yakabilir miyim diye bişey sormuş.
    cevap olarak kısaca anlatılmış. tabi ben hala işin içinden çıkamadım.
    arduinoforumda daki cevap:

    Önce gelen verilerin alınacağı sonrada gelen dataların toplandığı bir değişken tanımlayacaksın.
    Daha sonra birde seriport kontrol biti tanımlayacaksın.
    Birde gelen bitleri sayan bir bitsayici tanımlayacaksın
    Örneğin

    char gelenbit,seriportkontrol;
    char gelenveri[veri boyutu sen belirler(bu örnekte 3 tane veri gelecek)];
    int bitsayici;

    Seri porttan okuyorsun bu yüzden seri portta veri varmı diye bakacaksın

    if( seriportkontrol = Serial.available() > 0 ) //seriportta bilgi varmı dire sorgula?
    {
    gelenbit = Serial.read(); //gelen datayı al
    gelenveri[bitsayici] = gelenbit; //gelen dataları bir değişkene biriktir
    bitsayici++;
    }
    else //seri porttan data gelme olayı bitti ise
    {
    bitsayici=0; //bitsayiciyi sıfırla
    for (int j = 0; j <= 3; j++) gelenveri[j] = 0; // buradada gelenveri adındaki değişkenin içerisini sıfırla böylece bir sonraki gelen veri bir önceki gelen verinin üzerine yazılmaz boş bir değişkene yazılmış olur (buradaki 3 değeri senin en yukarda tanımladığın veri boyutu ile aynı olmalı)<br />}

    Bu şekilde gönderdiğin datalar gelir gelenveri diye bir değişkende toplanır.Sonra sen bu verileri if ile karşılaştırıp işlem yapmak istiyorsan

    if (strcmp(gelenveri, "yak") == 0) //gelen veri "yak" ise buraya girer ve işlem yapar
    {
    //gelen veri "yak" ise birşey yap
    }

    belki sen anlarsın açıklarsın kodları :)

    Alıntıları Göster
    Arduino ya ara verince bazı detayları unutmuşum :)
    Serial monitör e girilen veriler tek tek karakter olarak gönderiliyor(Bu hatamdan dolayı özür dilerim).
    Tek karakter verisini tutabilmek için char tipinde bir değişken tanımlamak gerekiyor. O yüzden serial monitörden gelen karakteri tutacak olan değişkenimiz char tipinde olacak.

    Kodları açıklamadan önce diziler konusundan birazcık bahsetmek gerekir. Diziler aynı veri tipindeki değişkenleri toplu olarak bir arada tutabilen ve bu toplu değişkenlerin kontrolünü kolaylaştıran yapılardır. Diyelim ki 1000 tane int tipinde değişken tanımlamamız gerekiyor. Her satırı tek tek yazmak yerine int tipinde ve 1000 elemanlık boyutta bir int dizi tanımlamak işi tek satırda çözüyor. Örneğin :

    int diziadi[1000];

    Diziler tanımlanırken aynı değişken tanımlar gibi önce dizinin tutacağı veri tipi girilir. Ardından dizinin adı ne olacaksa o yazılır ve köşeli parantez içinde dizinin tutacağı eleman sayısı yani dizi kaç elemanlı olacaksa o sayı yazılır. Dizi tanımlamanın bir kaç farklı yazım şekli vardır. Diziler konusuna bir göz gezdirmeni tavsiye ediyorum.

    Dizinin her elemanı bir indis numarasına sahiptir ve dizilerde indis numarası sıfırdan başlar. Yani dizinin ilk elemanı sıfırıncı eleman son elemanı ise dizinin tutabileceği eleman sayısının bir eksiğidir. Örneğimizde ilk eleman 0. son eleman ise 999. elemandır.


    Kodlara geçersek, ilk olarak serial monitörden girilen yazı neyse (örneğin "salon") bu veri karta tek tek karakter olarak gönderileceği için bu karakterleri alıp bir arada tutmak gerekir. Bu yüzden öncelikle char tipinde ve girilecek en uzun veri neyse onun boyutunda bir dizi tanımlamak gerekir.

    char gelenveri[girilecek veri boyutu neyse];



    Bu diziye verileri sırası ile kaydedebilmek için bir de indis numaralarını takip eden bir değişkene ihtiyacımız olacak ve bu değişkenin ilk değeri 0 olacak.

    int bitsayisi = 0;


    Birde her döngüde gelen tek karakteri tutacak char tipinde bir değişkenimiz olacak.

    char gelenbit;


    İlk blokta eğer seri iletişim var ise seri iletişim ile gönderilen tek karakteri gelenbit adındaki değişkene atıyoruz.
    Daha sonra bu tek karakteri gelenveri diye adlandırdığımız char tipindeki dizinin ilk elemanı olarak atıyoruz.Dizinin kaçıncı elemanı olacağını bitsayici isimli değişkenimizin değeri belirliyor. bitsayici ilk olarak 0 değerinde olduğu için serial monitörden gelen ilk karakter dizinin sıfırıncı elemanı olarak atanıyor. Daha sonra bitsayicinin değerini bir arttırıyoruz ki bir sonraki gelecek karakter dizinin takip eden sırasına yerleşsin.

    if(Serial.available())
    {
    gelenbit = Serial.read();
    gelenveri[bitsayici] = gelenbit;
    bitsayici++;
    }



    Bu blokta eğer seri iletişim sonlandıysa yani serial monitörden girilen tüm karakterler gönderildiyse dizinin içeriği sıfırlanıyor ve bitsayici sıfırlanıyor. Böylece bir sonraki girilecek veri için sistem hazırlanmış oluyor.

    else
    {
    bitsayici=0;
    for (int j = 0; j <= 3; j++)
    {
    gelenveri[j] = 0;
    }


    Son olarak girilen veri ne ise onu karşılaştırıp gerekli işlemleri yaptırıyoruz.
    Burada strcmp() komutu iki string ifadeyi karşılaştırıyor ve eğer ifadeler aynı ise sonucu 0 döndürüyor.
    strcmp ile gelenveri dizisinin tamamındaki veri "yak" verisine eşit olup olmadığı sorgulanıyor.

    if (strcmp(gelenveri, "yak") == 0) //gelen veri "yak" ise buraya girer ve işlem yapar
    {
    //gelen veri "yak" ise birşey yap
    }



    Diziler konusuna bakmak faydalı olacaktır. İyi çalışmalar...



    < Bu mesaj bu kişi tarafından değiştirildi osmanertomac -- 12 Mart 2019; 14:46:37 >




  • Aşağıdaki kodu denedim çalışıyor. Son hali bu :)


    char gelenveri[3]; // Buradaki uzunluk girilecek verinin uzunluğu kadar olmalı. Ben "yak" ve "bba" kullandım o yüzden 3


    void setup() {
    pinMode(12,OUTPUT);
    pinMode (13,OUTPUT);
    Serial.begin(9600);
    Serial.println("Ben hazırım.");
    Serial.println("Oda ismi giriniz");


    }

    void loop() {
    if (Serial.available()>2) //2 yerine uzunluğun bir eksiği yazılacak benim uzunluk 3 olduğu için 2 yazdım. Yoksa her karakterden sonra iletişim kesiliyor.
    {
    for(int i=0; i<3; i++)
    {
    gelenveri = Serial.read();
    }

    }


    if(strcmp(gelenveri,"yak")== 0)
    {
    digitalWrite(12,HIGH);
    digitalWrite(13,LOW);

    }


    else if (strcmp(gelenveri, "bba")==0)
    {
    digitalWrite(12,LOW);
    digitalWrite(13,HIGH);
    }

    }




  • BURADAN arduino fonksiyonlarının ne işe yaradığına bakabilirsin. Eğer vaktin varsa, internetten arduino'yu öğrenmeye bak. eğer vaktin yoksa;
    gönderdiğin kodda char gelenveri ; verine string gelenveri ; yaz. çalışır kod. ama sakın türkçe karakter ( ç,ö,ş,ü,p,ğ,İ ) girme. bu arada koddaki bir hata da 4. pinin tanımlamasını yapmamışsın. onu da unutma.
  • quote:

    Orijinalden alıntı: osmanertomac

    Aşağıdaki kodu denedim çalışıyor. Son hali bu :)


    char gelenveri[3]; // Buradaki uzunluk girilecek verinin uzunluğu kadar olmalı. Ben "yak" ve "bba" kullandım o yüzden 3


    void setup() {
    pinMode(12,OUTPUT);
    pinMode (13,OUTPUT);
    Serial.begin(9600);
    Serial.println("Ben hazırım.");
    Serial.println("Oda ismi giriniz");


    }

    void loop() {
    if (Serial.available()>2) //2 yerine uzunluğun bir eksiği yazılacak benim uzunluk 3 olduğu için 2 yazdım. Yoksa her karakterden sonra iletişim kesiliyor.
    {
    for(int i=0; i<3; i++)
    {
    gelenveri = Serial.read();
    }

    }


    if(strcmp(gelenveri,"yak")== 0)
    {
    digitalWrite(12,HIGH);
    digitalWrite(13,LOW);

    }


    else if (strcmp(gelenveri, "bba")==0)
    {
    digitalWrite(12,LOW);
    digitalWrite(13,HIGH);
    }

    }
    hocam yardımlarınız için çok teşekkürler yalnız bu kodla da olmadı. (belki de ben yapamadım)
    yabancı bir kaynaktan çalışan kodları buldum.
    ortaokulda görev yapıyorum bu çalışma öğrencilerle beraber düşündüğümüz bir projeydi.
    yardım eden herkese çok teşekkürler.
    (ledleri 0. ve 1. digital pinlere bağlayınca ledlere veri gitmiyor aynen ONY86 hocamın dediği gibi)
    çalışan kodları buraya ekleyelim ihtiyacı olan alıp bakabilir. hem siz de bir göz atmak istersiniz.
    çalışan kod:

    #define CMDBUFFER_SIZE 32

    void setup()
    {
    Serial.begin(9600);
    pinMode(2,OUTPUT);
    }

    void loop()
    {

    }
    void serialEvent()
    {
    static char cmdBuffer[CMDBUFFER_SIZE] = "";
    char c;
    while(Serial.available())
    {
    c = processCharInput(cmdBuffer, Serial.read());
    Serial.print(c);
    if (c == '\n')
    {
    Serial.println();
    //Full command received. Do your stuff here!
    if (strcmp("salon", cmdBuffer) == 0)
    {
    Serial.println("Salonun ışığı yanıyor.");
    digitalWrite(2,HIGH);
    delay(3000);
    digitalWrite(2,LOW);
    }
    cmdBuffer[0] = 0;
    }
    }
    delay(1);
    }

    char processCharInput(char* cmdBuffer, const char c)
    {
    //Store the character in the input buffer
    if (c >= 32 && c <= 126) //Ignore control characters and special ascii characters
    {
    if (strlen(cmdBuffer) < CMDBUFFER_SIZE)
    {
    strncat(cmdBuffer, &c, 1); //Add it to the buffer
    }
    else
    {
    return '\n';
    }
    }
    else if ((c == 8 || c == 127) && cmdBuffer[0] != 0) //Backspace
    {

    cmdBuffer[strlen(cmdBuffer)-1] = 0;
    }

    return c;
    }




  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.