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

Gokrtl

Gökhan Kartal (TeknoDay)
Staff member
Katılım
27 Şubat 2019
Mesajlar
12,204
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:

Kod:
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:

Kod:
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.

Kod:
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:

Kod:
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.

Kod:
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.
 

Forum istatistikleri

Konular
7,723
Mesajlar
128,520
Üyeler
3,118
Son üye
konce

Son kaynaklar

Son profil mesajları

Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
az bilgili çok meraklı
Back
Top