#include "uksi_oled.h" void UKSI_Print(float Iso, uint8_t DCState, float Voltage, float Current_uA) { int second_layer = 22; // Очищаем буфер GFX_Clean_Buffer_Frame(oled_buf); // 1. Сопротивление изоляции - крупно сверху char iso_str[20]; // Для STM32 sprintf не поддерживает %f, используем dtostrf или ручное форматирование if (Iso >= 100.0f) { sprintf(iso_str, "OL MOhm"); } else if (Iso >= 1.0f) { int int_part = (int)Iso; int dec_part = (int)((Iso - int_part) * 100); sprintf(iso_str, "%d.%02d MOhm", int_part, dec_part); } else if (Iso >= 0.001f) { float kOhm = Iso * 1000.0f; int int_part = (int)kOhm; sprintf(iso_str, "%d kOhm", int_part); } else { float Ohm = Iso * 1000000.0f; int int_part = (int)Ohm; sprintf(iso_str, "%d Ohm", int_part); } // Отображаем сопротивление GFX_Output_String(oled_buf, 10, 2, iso_str, GFX_FONT_TAHOMA_15, 1, 0); // 2. Состояние DC uint8_t x = 105; // позиция импульса uint8_t y = 14; // нижний уровень uint8_t h = 8; // высота импульса uint8_t wl = 2; // длина нижнего уровня uint8_t wh = 9; // ширина верхнего уровня if (DCState) { // _| __GFX_Draw_Line(oled_buf, x, y, x + wl, y, 1); __GFX_Draw_Line(oled_buf, x + wl, y, x + wl, y - h, 1); // ─ верх __GFX_Draw_Line(oled_buf, x + wl, y - h, x + wl + wh, y - h, 1); // |_ __GFX_Draw_Line(oled_buf, x + wl + wh, y - h, x + wl + wh, y, 1); __GFX_Draw_Line(oled_buf, x + wl + wh, y, x + wl*2 + wh, y, 1); } else { // просто __ __GFX_Draw_Line(oled_buf, x, y, x + wl*2 + wh, y, 1); } // 3. Напряжение (0-2В) char volt_str[16]; int volt_int = (int)(Voltage * 1000); // милливольты sprintf(volt_str, "U: %d.%03dV", volt_int / 1000, volt_int % 1000); GFX_Output_String(oled_buf, 10, 22, volt_str, GFX_FONT_TAHOMA_8, 1, 0); // 4. Ток (уже в мкА) char curr_str[16]; int curr_int = (int)Current_uA; if (Current_uA >= 1000.0f) { sprintf(curr_str, "I: %duA", curr_int); } else if (Current_uA >= 100.0f) { int dec_part = (int)((Current_uA - curr_int) * 1); sprintf(curr_str, "I: %duA", curr_int); } else if (Current_uA >= 10.0f) { int dec_part = (int)((Current_uA - curr_int) * 10); sprintf(curr_str, "I: %d.%01duA", curr_int, dec_part); } else { int dec_part = (int)((Current_uA - curr_int) * 100); sprintf(curr_str, "I: %d.%02duA", curr_int, dec_part); } GFX_Output_String(oled_buf, 72, 22, curr_str, GFX_FONT_TAHOMA_8, 1, 0); // 6. Обновляем дисплей oled_refresh(); }