LCD ikinci satırda kayan yazı yazma
  • Diyelim ki ilk satır sabit iken LCD'nin ikinci satırında kayan yazı istiyorsunuz.

    Bu şekilde yapabilirsiniz :

    void sagdanYaz(int satir, char metin[])
    {
    const char bosluk[16] = " ";
    char ekran[16];
    char * yazilacak;

    yazilacak = malloc(sizeof(char) * (sizeof(metin) + 17));

    memset(yazilacak, '\0', sizeof(char) * (sizeof(metin) + 17));
    memset(ekran, '\0', sizeof(ekran));

    for (int i = 0; i < 16; ++i)
    {
    yazilacak[i] = bosluk[i];
    }

    for (int j = 0; j < sizeof(metin) + 17; ++j)
    {
    yazilacak[16+j] = metin[j];
    }


    for (int i = 0; i < sizeof(metin) + 17; ++i)
    {

    lcd.setCursor(0, satir);
    strncpy(ekran, yazilacak + i, 16 );
    lcd.print(ekran);
    delay(350);
    }
    }

    Programın içinde çağırmak için ise sagdanYaz(1, "Sogutucu calisiyor") şeklinde kullanabilirsiniz.

    Programı ben yazdım. Eğer kod içinde gözünüze çarpan olası hatalar varsa bildirebilirsiniz.
  • Bu programda bazı hatalar var. Bunlardan bir tanesi yazılacak için ayrılan belleğin geri verilmemesi. Bu da bir süre sonra Arduino'yu kilitliyordu.

    Ben de çözüm olarak Arduino'nun String kütüphanesini kullanmaya karar verdim.

    https://bit.ly/2HtCvhU
  • Ben olsam kayan yazı kullanmazdım.
    Seebebine gelince delay(350); var ya uzun bir metin çok fazla gecikme yaşatır buton ve benzeri okumalarda sorun yaşanır.
    ben kodlarımda mecbur olmadıkça delay hemen hemen hiç kullanmam.

    uzun metinleri de şu şekilde hallediyorum önceden belirli 16 karakterlik metinleri her 2sn de bir sırayla yazdırarak

    int gorunumde = 0;
    unsigned long oncekiZaman = 0;

    void loop() {
    int toplam = 6;
    String kelimeler[toplam] = { F("bir"), F("iki"), F("uc"), F("dort"), F("bes"), F(" ") };//ekran karakter sayısı kadar boşluk
    lcdUzunmetin(1, toplam, kelimeler);
    }

    void lcdUzunmetin(int satir, int toplam, String text[]) {
    if (millis() >= oncekiZaman && gorunumde <= toplam) {<br /> lcd.setCursor(0, satir);
    lcd.print(F(" ")); //ekran karakter sayisı kadar bosluk
    lcd.setCursor(0, satir);
    lcd.print(text[gorunumde]);
    gorunumde++;
    if (gorunumde == toplam) gorunumde = 0;
    oncekiZaman = millis() + 1000;
    }
    }

    EDIT: ekran karakter sayısı kadar boşluk olan yerlerde boşluk var forum desteklemiyor yokmuş gibi davranıyor
  • Arduinoda malloc free kullanılmaz, felç edersiniz belleği. Global alanda statik olarak ayırın. String değil char[] kullanın.

    O fonksiyon içindeki "sizeof(metin)" çalışmaz, strlen() kullanacaksınız.

Howdy, Stranger!

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

Login with Facebook

Tagged

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