STM32 – Integer to Char

Jika sebuah nilai 145125005 diletakkan di variabel uint32_t freq=145125005, maka nilai ini perlu dikonversi ke tipe Char dan bernilai ASCII saat dikirim ke LCD atau OLED. Yach agar bisa dibaca. Konversi ini biasanya dilakukan oleh fungsi yang terdapat pada library standar bahasa C. Atau buat sendiri secara manual. Tulisan ini membahas yang manual :). Menggunakan pembagian integer dan modulo.

Penggunaan library standar dengan fungsi printf & sprintf misalnya, butuh resource flash & memory lumayan besar. Makanya sebisa mungkin dihindari. Mikrokontroler bukan PC dengan resource melimpah. Parameter cross kompilasi dengan opsi : -nostdlib biasanya terpasang default.

Fungsi yang dibuat seperti di atas. Range aman penampakan 1000000 sampai 999999999. Untuk mempermudah pembacaan digunakan titik setiap ribuan. Jika soal titik diabaikan, nilai dari 0-999999999 bisa muncul dengan aman.

Saat praktek lapangan, jika diaplikasikan di DDS dengan chip Si5351, maksimal frekuensi adalah 200MHz atau 200000000Hz. Jika bermain di Amatir Radio HF, maka nilai 1Mhz sampai 30MHz.

Modulo dan pembagian integer. Bisa cek di calculator modulo online / Integer Division hasilnya sebagai pembanding.

Modulo: 8 % 2 = 0. Nilai 8 di bagi 2 –> 4 sisanya nol. Nilai sisanya yang ditulis. contoh lain 9 % 2= 1. Nilai 9 dibagi 2 –>4 sisanya 1. Contoh di bawah ini menarik :).

  • 12345 % 100000 = 12345
  • 12345 % 10000 = 2345
  • 12345 % 1000 = 345
  • 12345 % 100 = 45
  • 12345 % 10 = 5

Contoh pembagian nilai integer : 75/10 = 7. Sisa 5 diabaikan. Contoh lain :

  • 12345 / 10000 = 1
  • 2345 / 1000 = 2
  • 345 / 100 = 3
  • 45 / 10 = 4
  • 5 / 1 = 5

Dari perhitungan modulo dan pembagian integer, bisa disadap tiap digit dari nilai Integer yang diberikan dan memecahnya menjadi bagian-bagian char.

277. char g[11] adalah tipe array dengan 11 tempat penampungan dimulai dari g[0] sampai g[10]. Nilai ini dapat dimodifikasi sesuai keinginan seberapa banyak digit angka yang ingin diolah. Dengan 11 digit, maka angka yang bisa diolah 9 digit plus 2 titik pemisah ribuan.

Sebagai contoh ingin menampilkan data integer sebuah frekuensi 144.567.895Hz dimana data ini berada di variabel uint32_t f=144567895.

Implementasi perhitungan kelihatan panjang (karena deretan angka nol yang panjang), tapi perhitungannya sederhana : dihajar modulo dulu, kemudian dibagi secara integer.

278. g[0]= ((f % 1000000000) / 100000000);

  • Jika sebuah variabel uint32_t f bernilai 144567895, maka hasil yang diperoleh pada g[0] adalah 1.
  • Karena 144567895  % 1000000000 =144567895 kemudian nilai ini dibagi 100000000 hasilnya 1.
  • Kalau ditulis rinci ((144567895 % 1000000000) / 100000000)–> (144567895 / 100000000)=1.

279. g[1]= ((f % 100000000) / 10000000);

  • Keajaiban mulai terjadi :). Nilai 144567895 % 100000000 = 44567895. Nilai 44567895 / 10000000 = 4.
  • Kalau ditulis rinci ((144567895 % 100000000) / 10000000)–> (44567895  / 10000000)=4.

280. g[2]= ((f % 10000000) / 1000000);

  • Nilai 144567895 % 10000000 = 4567895. Nilai 4567895 / 1000000 = 4.
  • Kalau ditulis rinci ((144567895 % 10000000) / 1000000)–>(4567895 / 1000000)=4.

282. g[4]= ((f % 1000000) / 100000);

  • Nilai 144567895 % 1000000 = 567895. Nilai 567895 / 100000 =5.
  • Kalau ditulis rinci ((144567895 % 1000000) / 100000)–>(567895 / 100000)=5.

283. g[5]= ((f % 100000) / 10000);

  • Nilai 144567895 % 100000 = 67895. Jika nilai 67895 / 10000 =6.
  • Kalau ditulis rinci ((144567895 % 100000) / 10000)–>(67895 / 10000)=6.

Begitu seterusnya…

Untuk mendeteksi jumlah digit digunakan loop di atas. Prinsipnya sama dengan pembagian integer. Setiap loop nilai count akan bertambah. Misal nilai f=144567895. Setiap dibagi 10, maka nilai akan berubah jadi 14456789, 1445678, 144567, seterusnya sampai nilai 1/ 10 =0 dan proses berhenti. Sudah didapatkan nilai count digit nilai f. Angka satu digit berapapun jika dibagi 10 akan bernilai 0.

Bagian akhir ini untuk mengirim karakter. Kasus saya menggunakan OLED SSD1306. Nilai 48 adalah akal-akalan agar nilai yang dihasilkan sebelumnya jika ditambah 48 menjadi nilai decimal char ASCII. Semisal nilai char ASCII 7, maka nilai 7 ditambah 48 jadi 55. Lihat tabel ASCII.

Pada baris 281 dan 285, nilai -2 jika ditambah 48 menjadi 46 yang merupakan titik.

Kode di atas valid untuk nilai 1000.000-999.999.999. Nilai di bawah 1000.000 misalnya, angka titik akan muncul di awal angka. Silahkan modifikasi agar sesuai kebutuhan.

Ok, semoga berguna!

2 tanggapan untuk “STM32 – Integer to Char

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout /  Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout /  Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout /  Ubah )

Connecting to %s