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) { 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.