#include #include "ADC_Temp.h" // Функция для сохранения таблицы в файл void save_table_to_file(const char* filename, const adc_temp_lookup* table, const char* table_name) { FILE* file = fopen(filename, "w"); if (file == NULL) { printf("Ошибка: не удалось создать файл %s\n", filename); return; } fprintf(file, "=== Таблица быстрого поиска: %s ===\n", table_name); fprintf(file, "Всего записей: %d\n", TABLE_SIZE_LOOKUP); fprintf(file, "%-8s %-12s %-15s\n", "ADC", "Temp (°C)", "Resistance (Ω)"); fprintf(file, "----------------------------------------\n"); for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) { fprintf(file, "%-8u %-12.1f %-15.2f\n", table[i].adc_value, table[i].temp_c / 10.0f, table[i].resistance_ohm); } fclose(file); printf("Таблица '%s' сохранена в файл: %s\n", table_name, filename); } // Функция для сохранения таблицы в CSV формате void save_table_to_csv(const char* filename, const adc_temp_lookup* table, const char* table_name) { FILE* file = fopen(filename, "w"); if (file == NULL) { printf("Ошибка: не удалось создать файл %s\n", filename); return; } fprintf(file, "# Таблица быстрого поиска: %s\n", table_name); fprintf(file, "ADC,Temperature_C,Resistance_Ohm\n"); for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) { fprintf(file, "%u,%.1f,%.2f\n", table[i].adc_value, table[i].temp_c / 10.0f, table[i].resistance_ohm); } fclose(file); printf("Таблица '%s' сохранена в CSV файл: %s\n", table_name, filename); } // Функция для сохранения таблицы в виде C-массива void save_table_to_c_array(const char* filename, const adc_temp_lookup* table, const char* table_name) { FILE* file = fopen(filename, "w"); if (file == NULL) { printf("Ошибка: не удалось создать файл %s\n", filename); return; } fprintf(file, "// Таблица быстрого поиска: %s\n", table_name); fprintf(file, "// Всего записей: %d\n", TABLE_SIZE_LOOKUP); fprintf(file, "// Формат: {ADC, Temp_TenthsC, Resistance_Ohm}\n\n"); fprintf(file, "const adc_temp_lookup %s_lookup_table[%d] = {\n", table_name, TABLE_SIZE_LOOKUP); for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) { if (i == TABLE_SIZE_LOOKUP - 1) { fprintf(file, " {%u, %d, %.2f}\n", table[i].adc_value, table[i].temp_c, table[i].resistance_ohm); } else { fprintf(file, " {%u, %d, %.2f},\n", table[i].adc_value, table[i].temp_c, table[i].resistance_ohm); } } fprintf(file, "};\n"); fclose(file); printf("Таблица '%s' сохранена в C-массив: %s\n", table_name, filename); } // Функция для сохранения таблицы в виде компактного C-массива (как в примере) void save_table_to_c_array_compact(const char* filename, const adc_temp_lookup* table, const char* array_name) { FILE* file = fopen(filename, "w"); if (file == NULL) { printf("Ошибка: не удалось создать файл %s\n", filename); return; } fprintf(file, "// Таблица быстрого поиска\n"); fprintf(file, "const adc_temp_lookup %s[] = {\n", array_name); for (int i = 0; i < TABLE_SIZE_LOOKUP; i++) { if (i % 4 == 0 && i > 0) { fprintf(file, "\n"); } if (i == TABLE_SIZE_LOOKUP - 1) { fprintf(file, " {%u, %d, %.2f}", table[i].adc_value, table[i].temp_c, table[i].resistance_ohm); } else { fprintf(file, " {%u, %d, %.2f},", table[i].adc_value, table[i].temp_c, table[i].resistance_ohm); } if ((i + 1) % 4 != 0 && i != TABLE_SIZE_LOOKUP - 1) { fprintf(file, " "); } } fprintf(file, "\n};\n"); fclose(file); printf("Таблица '%s' сохранена в компактный C-массив: %s\n", array_name, filename); } // Функция для сохранения всех таблиц void save_all_tables(void) { const fast_lookup_tables_t* tables = get_fast_tables(); // Сохраняем в текстовом формате save_table_to_file("duct_table.txt", tables->duct, "DUCT"); save_table_to_file("incar_table.txt", tables->incar, "INCAR"); save_table_to_file("ambient_table.txt", tables->ambient, "AMBIENT"); // Сохраняем в CSV формате (удобно для Excel) save_table_to_csv("duct_table.csv", tables->duct, "DUCT"); save_table_to_csv("incar_table.csv", tables->incar, "INCAR"); save_table_to_csv("ambient_table.csv", tables->ambient, "AMBIENT"); // Сохраняем в виде C-массивов save_table_to_c_array("duct_table_array.c", tables->duct, "DUCT"); save_table_to_c_array("incar_table_array.c", tables->incar, "INCAR"); save_table_to_c_array("ambient_table_array.c", tables->ambient, "AMBIENT"); // Сохраняем в виде компактных C-массивов save_table_to_c_array_compact("duct_table_compact.c", tables->duct, "duct_lookup"); save_table_to_c_array_compact("incar_table_compact.c", tables->incar, "incar_lookup"); save_table_to_c_array_compact("ambient_table_compact.c", tables->ambient, "ambient_lookup"); } int main() { // Инициализируем все три таблицы с разными значениями R1 init_all_tables(20000.0f, // R1 для DUCT (KST45) 20000.0f, // R1 для INCAR 20000.0f, // R1 для AMBIENT (NTC 10k) ALG_STEINHART); uint16_t adc_value = 2000; printf("\n=== Работа с тремя датчиками одновременно ===\n"); // Получаем температуру для DUCT (KST45) int16_t temp_duct = get_temperature_log_fast_for_table(adc_value, TABLE_DUCT); printf("DUCT (KST45): ADC=%u, Temp=%.2f °C\n", adc_value, temp_duct / 10.0f); // Получаем температуру для INCAR int16_t temp_incar = get_temperature_log_fast_for_table(adc_value, TABLE_INCAR); printf("INCAR: ADC=%u, Temp=%.2f °C\n", adc_value, temp_incar / 10.0f); // Получаем температуру для AMBIENT (NTC 10k) int16_t temp_ambient = get_temperature_log_fast_for_table(adc_value, TABLE_AMBIENT); printf("AMBIENT (NTC 10k): ADC=%u, Temp=%.2f °C\n", adc_value, temp_ambient / 10.0f); // Сохраняем таблицы в файлы printf("\n=== Сохранение таблиц в файлы ===\n"); save_all_tables(); // Пример обратного преобразования (температура -> сопротивление) printf("\n=== Обратное преобразование ===\n"); int16_t temp_test = 250; // 25.0 °C float resistance_duct = get_resistance_log_fast_for_table(temp_test, TABLE_DUCT); float resistance_incar = get_resistance_log_fast_for_table(temp_test, TABLE_INCAR); float resistance_ambient = get_resistance_log_fast_for_table(temp_test, TABLE_AMBIENT); printf("При %.1f °C:\n", temp_test / 10.0f); printf(" DUCT сопротивление: %.2f Ω\n", resistance_duct); printf(" INCAR сопротивление: %.2f Ω\n", resistance_incar); printf(" AMBIENT сопротивление: %.2f Ω\n", resistance_ambient); return 0; }