Float değişkeninin ilk basamağını iki basamaklı yapmak.

Gokrtl

Gökhan Kartal (TeknoDay)
Staff member
Katılım
27 Şubat 2019
Mesajlar
11,210
Resimde görüleceği gibi v ve a göstergelerinin arasında boşluk kalıyor. Rakamı kaydırarak burayı doldurabiliyorum ama rakam 1.00v iken normal, 30.00v iken harflerin üzerine taşıyor.
O yüzden bu değişkene öyle birşey yapmam lazım ki 1.00v olunca 01.00v göstersin.
Zaten enkoder ile set ederken de orada sıfırın görünmesi şart.

Bu konuda ne yapabilirim?

20220320_192915.jpg


 
Son düzenleme:
bi 10R'da olsa direnç bağla istersen uzun ömürlü olsun ben 3.3volta 100R direnç koyduğum için benimki bu kadar karanlık oldu galiba
Pot var arada. O da direnç sayılır. Ayrıca ben harici besliyorum. Arduinodan yeteri kadar akım çekemez diye.
 
Bu tip formatlama işleri C de sprintf ile yapılır normalde. Şimdi baktım arduino'da da var, ama float sayılar ile işlem yapamıyor.

Ama şunu yapabilirsin: float sayının tam kısmını ve ondalık kısmını ayrı ayrı int olarak alırsın ve bunu sprintf ile formatlarsın:

sprintf test:
static char buffer[100];
static float value = 12.842;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int ival = value * 100;

  sprintf(buffer, "%02d.%02d\n", ival / 100, ival % 100);
  Serial.write(buffer);

  while (1)
  {
    ;
  }
}
 
String ile ilgli Arduino Language Referance ına baktığımda, string double (integer v.s.) birleşimleri çok çok basitleştirilmiş.

// string dispStr ve double value şeklinde tanımladığını varsayarsak

if(value < 10.0)
dispStr = '0' + value;
else
dispStr = value;

u8g2.drawStr(x,y,dispStr); //u8g2.print(value); yerine kullandık.

bir dener misin? Olmazsa tabi ki olması gereken Timur' un önerdiği gibi.
 
Bu tip formatlama işleri C de sprintf ile yapılır normalde. Şimdi baktım arduino'da da var, ama float sayılar ile işlem yapamıyor.

Ama şunu yapabilirsin: float sayının tam kısmını ve ondalık kısmını ayrı ayrı int olarak alırsın ve bunu sprintf ile formatlarsın:

sprintf test:
static char buffer[100];
static float value = 12.842;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int ival = value * 100;

  sprintf(buffer, "%02d.%02d\n", ival / 100, ival % 100);
  Serial.write(buffer);

  while (1)
  {
    ;
  }
}
Bu kodları kullanmaya kalkınca ekrana görüntü gelmiyor hiç.
Bide @umk abinin kodları deneyeyim.
 
String ile ilgli Arduino Language Referance ına baktığımda, string double (integer v.s.) birleşimleri çok çok basitleştirilmiş.

// string dispStr ve double value şeklinde tanımladığını varsayarsak

if(value < 10.0)
dispStr = '0' + value;
else
dispStr = value;

u8g2.drawStr(x,y,dispStr); //u8g2.print(value); yerine kullandık.

bir dener misin? Olmazsa tabi ki olması gereken Timur' un önerdiği gibi.

Evet bu şekilde de oluyor. Ama iki kat fazla yer kaplıyor.

string test:
String str;
static float value = 18.842;

void setup() {
  Serial.begin(9600);
}

void loop() {
  str = (value < 10.0) ? "0" : "";
  str += String(value);

  Serial.write(str.c_str());

  while (1)
  {
    ;
  }
}
 
Bu tip formatlama işleri C de sprintf ile yapılır normalde. Şimdi baktım arduino'da da var, ama float sayılar ile işlem yapamıyor.

Ama şunu yapabilirsin: float sayının tam kısmını ve ondalık kısmını ayrı ayrı int olarak alırsın ve bunu sprintf ile formatlarsın:

sprintf test:
static char buffer[100];
static float value = 12.842;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int ival = value * 100;

  sprintf(buffer, "%02d.%02d\n", ival / 100, ival % 100);
  Serial.write(buffer);

  while (1)
  {
    ;
  }
}
Abi bu "buffer" en son float dönüyor. İnteger dönmesi lazım ekrana yazdırabilmem için.
 
Nasıl integer yav? Display'e string yazılır. buffer'da da string var.
 
Sana ekrana string yazan fonksiyon lazım. Yoksa float bir değişkeni, başında ilave 0 olarak şekilde yapılandıramazsın. float değişkeni string'e çevirip, string üzerinde 0 ilave ediyoruz.

Bir de benim koyduğun sonsuz döngüyü de eklemişsin. Program o noktadan ileri geçemez :)
 
Bir de senin kullandığın kütüphanenin sayfasına gidip reference manual'a bakıyorum, orada senin kullandığın drawPrnt fonksiyonu yok. Sen o zaman bu kütüphanenin birisi tarafından özelleştirilmiş şeklini kullanıyorsun. O fonksiyonun ne yaptığı da belli değil, bir yerde dokümantasyonunu bulamadım.

 
Bir de senin kullandığın kütüphanenin sayfasına gidip reference manual'a bakıyorum, orada senin kullandığın drawPrnt fonksiyonu yok. Sen o zaman bu kütüphanenin birisi tarafından özelleştirilmiş şeklini kullanıyorsun. O fonksiyonun ne yaptığı da belli değil, bir yerde dokümantasyonunu bulamadım.


drawPrint benim yazdığım fonkisyonun adi abi karışmış biraz olaylar.

C:
void drawPrnt(int font1, int font2, int drw1, int drw2, int drwstc1, int drwstc2, int drwstc3, int drw3, float prnt, int sec ) {
  if (sec == 1) {
    u8g2.setFont(font1);
    u8g2.drawStr(drw1, drw2, drw3);
    u8g2.setFont(font2);
    u8g2.setCursor(drwstc1, drwstc2);
    u8g2.print(prnt);
  } else if (sec == 2) {
    u8g2.setFont(font1);
    u8g2.drawStr(drw1, drw2, drw3);
    u8g2.setFont(font2);
    u8g2.drawStr(drwstc1, drwstc2, drwstc3);
  }
}

Bir de benim koyduğun sonsuz döngüyü de eklemişsin. Program o noktadan ileri geçemez :)
Bende diyorum ekrana neden görüntü gelmiyor :katil2:
 
Wiki sayfasında drawPrnt diye bir fonksiyon yok.
 
Hallettim ama vaktim kalmadı resim koyacak. İşe gidiyorum. Yarın eklerim.
 
@umk abi senin kodları ekleyince 68.00 gibi bir rakam çıktı. Muhtelen onuda elime yüzüme bulaştırdım :)
 
Son düzenleme:
Haydaa..:) Elimde kütüphaneler olmadığı için ben de deneyememiştim. Kolay bi yolu yok gibi o zaman.
 

Çevrimiçi personel

Forum istatistikleri

Konular
5,790
Mesajlar
99,029
Üyeler
2,464
Son üye
s4met

Son kaynaklar

Son profil mesajları

cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Dr. Bülent Başaran,
Elektrik ve Elektronik Mühendisi
Yonga Tasarım Özdevinimcisi
Üç güzel "çocuk" babası
Ortahisar/Ürgüp/Konya/Ankara/Pittsburgh/San Francisco/Atlanta/Alaçatı/Taşucu...

Back
Top