Files
UKSI_TEST/Core/UKSI/uksi_oled.c
2025-12-30 09:35:49 +03:00

85 lines
3.0 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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();
}