ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Engineer200
Рядовой
Сообщения: 53
Зарегистрирован: 19 дек 2025, 06:16
Имя: Александр
Благодарил (а): 18 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Engineer200 »

Добрый вечер!
А можно сделать, чтоб библиотеку тоже в блок засасывало вместе с кодом, чтоб не таскать её отдельно?
Люблю делать то, что потом само работает.
Engineer200
Рядовой
Сообщения: 53
Зарегистрирован: 19 дек 2025, 06:16
Имя: Александр
Благодарил (а): 18 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Engineer200 »

Мне ИванИваныч из китая сваял библиотеку для MC14489 и код для проверки. Я бы хотел его в блок загнать...
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Люблю делать то, что потом само работает.
Аватара пользователя
Phazz
Полковник
Сообщения: 3516
Зарегистрирован: 17 окт 2016, 15:38
Откуда: Сургут
Имя: Анатолий
Благодарил (а): 381 раз
Поблагодарили: 262 раза

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Phazz »

Engineer200 писал(а): 06 мар 2026, 17:38 Добрый вечер!
А можно сделать, чтоб библиотеку тоже в блок засасывало вместе с кодом, чтоб не таскать её отдельно?
Нужно подумать, как это реализовать. Но быстро не обещаю
cfitymrf
Сержант
Сообщения: 111
Зарегистрирован: 06 сен 2021, 07:45
Имя: иван
Благодарил (а): 9 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение cfitymrf »

так иван иваныч пусть блок и сделает
Engineer200
Рядовой
Сообщения: 53
Зарегистрирован: 19 дек 2025, 06:16
Имя: Александр
Благодарил (а): 18 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Engineer200 »

cfitymrf писал(а): 06 мар 2026, 18:06 так иван иваныч пусть блок и сделает
этот ИванИваныч может только языком работать, хоть и языком Си. А в цифру он не может... Всё пытается языком объяснить, хорошо, что на русском... Но, не рентабельно. С Курсором общаться мне одноязыкость мешает. :( Одна надежда на живые головы.
Люблю делать то, что потом само работает.
Аватара пользователя
Phazz
Полковник
Сообщения: 3516
Зарегистрирован: 17 окт 2016, 15:38
Откуда: Сургут
Имя: Анатолий
Благодарил (а): 381 раз
Поблагодарили: 262 раза

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Phazz »

добавить библиотеку руками достаточно простая задача
Engineer200
Рядовой
Сообщения: 53
Зарегистрирован: 19 дек 2025, 06:16
Имя: Александр
Благодарил (а): 18 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Engineer200 »

Phazz писал(а): 06 мар 2026, 18:25 добавить библиотеку руками достаточно простая задача
Вам хорошо, а я руками не делал этого ни разу...
Люблю делать то, что потом само работает.
Аватара пользователя
montirovka
Подполковник
Сообщения: 1320
Зарегистрирован: 15 фев 2021, 16:16
Откуда: Геленджик
Имя: Сергей
Благодарил (а): 161 раз
Поблагодарили: 519 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение montirovka »

Вставить то не проблема. А блока то нет. В скетче нет переменной для вывода. Поэтому утилита и не делает блок.
Engineer200
Рядовой
Сообщения: 53
Зарегистрирован: 19 дек 2025, 06:16
Имя: Александр
Благодарил (а): 18 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Engineer200 »

montirovka писал(а): 06 мар 2026, 19:02 Вставить то не проблема. А блока то нет. В скетче нет переменной для вывода. Поэтому утилита и не делает блок.
Вставить левый светофор? Чтоб было хоть что-то?
Люблю делать то, что потом само работает.
Аватара пользователя
montirovka
Подполковник
Сообщения: 1320
Зарегистрирован: 15 фев 2021, 16:16
Откуда: Геленджик
Имя: Сергей
Благодарил (а): 161 раз
Поблагодарили: 519 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение montirovka »

Попробовал с Алисой переделать код.
Показать
#include <Arduino.h>
#include "MC14489B_display.h"

// Пины для Pro Mini (физические номера)
const int PIN_DATA_IN = 15; // A1 (аналоговый пин как цифровой)
const int PIN_CLOCK = 5; // D5
const int PIN_ENABLE = 17; // A3 (аналоговый пин как цифровой)

// Объект дисплея
MC14489BDisplay display(PIN_DATA_IN, PIN_CLOCK, PIN_ENABLE);

// Входная строка (динамическая)
String inputStr = "";

// Буфер для вывода на дисплей (5 символов + '\0')
char displayBuffer[6] = "";

void setup() {
// Инициализация Serial (требуется внешний USB-адаптер)
Serial.begin(115200);
Serial.println(F("Starting..."));

// Инициализация дисплея
display.begin();

// Тест 1: Простая строка
inputStr = "12345";
Serial.print(F("Input: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(5000);

// Тест 2: Буквы
inputStr = "ABCDE";
Serial.print(F("Input: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(5000);

// Тест 3: Смешанный текст
inputStr = "A1B2C";
Serial.print(F("Input: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(5000);

// Тест 4: Длинная строка (обрезка)
inputStr = "HelloWorld";
Serial.print(F("Input (long): "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5); // Останутся первые 5 символов
display.displayString(displayBuffer);
delay(5000);

// Тест 5: Пустая строка
inputStr = "";
Serial.print(F("Input (empty): "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer); // Будет пусто
delay(3000);

// Тест 6: Выключение дисплея
Serial.println(F("Выключение дисплея"));
display.off();
delay(3000);

// Тест 7: Включение и вывод
Serial.println(F("Включение дисплея"));
display.on();
inputStr = "DONE";
Serial.print(F("Input: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(3000);
}

void loop() {
// Пример 1: Динамическое формирование строки
static int counter = 0;
inputStr = "Cnt" + String(counter % 100); // "Cnt0", "Cnt1", ...
Serial.print(F("Динамическая строка: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
counter++;
delay(1500);

// Пример 2: Форматирование с числами
int temp = 25 + (counter % 10) - 5; // 20..30
inputStr = "T" + String(temp) + "C"; // "T25C", "T26C", ...
Serial.print(F("Температура: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(2000);

// Пример 3: Конкатенация с условиями
if (counter % 2 == 0) {
inputStr = "EVEN";
} else {
inputStr = "ODD";
}
Serial.print(F("Чётность: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(1800);
}

// Вспомогательная функция: обрезать строку до maxLen и скопировать в буфер
void limitAndCopy(const String& str, char* buffer, int maxLen) {
int len = str.length();
if (len <= maxLen) {
str.toCharArray(buffer, len + 1); // +1 для '\0'
} else {
str.substring(0, maxLen).toCharArray(buffer, maxLen + 1);
}
// Убедиться, что буфер завершён нулём
buffer[maxLen] = '\0';
}
FLprog не загружает файл пользовательского блока. Я указываю что inputstr - вход.
Engineer200
Рядовой
Сообщения: 53
Зарегистрирован: 19 дек 2025, 06:16
Имя: Александр
Благодарил (а): 18 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Engineer200 »

montirovka писал(а): 06 мар 2026, 19:47 Попробовал с Алисой переделать код.
Показать
#include <Arduino.h>
#include "MC14489B_display.h"

// Пины для Pro Mini (физические номера)
const int PIN_DATA_IN = 15; // A1 (аналоговый пин как цифровой)
const int PIN_CLOCK = 5; // D5
const int PIN_ENABLE = 17; // A3 (аналоговый пин как цифровой)

// Объект дисплея
MC14489BDisplay display(PIN_DATA_IN, PIN_CLOCK, PIN_ENABLE);

// Входная строка (динамическая)
String inputStr = "";

// Буфер для вывода на дисплей (5 символов + '\0')
char displayBuffer[6] = "";

void setup() {
// Инициализация Serial (требуется внешний USB-адаптер)
Serial.begin(115200);
Serial.println(F("Starting..."));

// Инициализация дисплея
display.begin();

// Тест 1: Простая строка
inputStr = "12345";
Serial.print(F("Input: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(5000);

// Тест 2: Буквы
inputStr = "ABCDE";
Serial.print(F("Input: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(5000);

// Тест 3: Смешанный текст
inputStr = "A1B2C";
Serial.print(F("Input: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(5000);

// Тест 4: Длинная строка (обрезка)
inputStr = "HelloWorld";
Serial.print(F("Input (long): "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5); // Останутся первые 5 символов
display.displayString(displayBuffer);
delay(5000);

// Тест 5: Пустая строка
inputStr = "";
Serial.print(F("Input (empty): "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer); // Будет пусто
delay(3000);

// Тест 6: Выключение дисплея
Serial.println(F("Выключение дисплея"));
display.off();
delay(3000);

// Тест 7: Включение и вывод
Serial.println(F("Включение дисплея"));
display.on();
inputStr = "DONE";
Serial.print(F("Input: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(3000);
}

void loop() {
// Пример 1: Динамическое формирование строки
static int counter = 0;
inputStr = "Cnt" + String(counter % 100); // "Cnt0", "Cnt1", ...
Serial.print(F("Динамическая строка: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
counter++;
delay(1500);

// Пример 2: Форматирование с числами
int temp = 25 + (counter % 10) - 5; // 20..30
inputStr = "T" + String(temp) + "C"; // "T25C", "T26C", ...
Serial.print(F("Температура: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(2000);

// Пример 3: Конкатенация с условиями
if (counter % 2 == 0) {
inputStr = "EVEN";
} else {
inputStr = "ODD";
}
Serial.print(F("Чётность: "));
Serial.println(inputStr);
limitAndCopy(inputStr, displayBuffer, 5);
display.displayString(displayBuffer);
delay(1800);
}

// Вспомогательная функция: обрезать строку до maxLen и скопировать в буфер
void limitAndCopy(const String& str, char* buffer, int maxLen) {
int len = str.length();
if (len <= maxLen) {
str.toCharArray(buffer, len + 1); // +1 для '\0'
} else {
str.substring(0, maxLen).toCharArray(buffer, maxLen + 1);
}
// Убедиться, что буфер завершён нулём
buffer[maxLen] = '\0';
}
FLprog не загружает файл пользовательского блока. Я указываю что inputstr - вход.
Локальный ино2уби взял скетч, попарсил и выдал блок. FLProg принял блок, дал возможность поредактировать. Компилировать не стал - там сыромясина. Выход не обозначен, проблем не было.
Вы онлайном пользовались?
Люблю делать то, что потом само работает.
Engineer200
Рядовой
Сообщения: 53
Зарегистрирован: 19 дек 2025, 06:16
Имя: Александр
Благодарил (а): 18 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Engineer200 »

Есть над чем работать... Спокойной ночи!
Люблю делать то, что потом само работает.
Аватара пользователя
montirovka
Подполковник
Сообщения: 1320
Зарегистрирован: 15 фев 2021, 16:16
Откуда: Геленджик
Имя: Сергей
Благодарил (а): 161 раз
Поблагодарили: 519 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение montirovka »

Онлайн. Почему выход? Вход string на который подается информация для передачи дисплею.
Engineer200
Рядовой
Сообщения: 53
Зарегистрирован: 19 дек 2025, 06:16
Имя: Александр
Благодарил (а): 18 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Engineer200 »

montirovka писал(а): 06 мар 2026, 20:08 Онлайн. Почему выход? Вход string на который подается информация для передачи дисплею.
А, извините, у меня в голове затёрлась ваша фраза "В скетче нет переменной для вывода." Этот вопрос снят.
Люблю делать то, что потом само работает.
Engineer200
Рядовой
Сообщения: 53
Зарегистрирован: 19 дек 2025, 06:16
Имя: Александр
Благодарил (а): 18 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Engineer200 »

Доброе утро!
ino2ubi v1.72
Комментарий //in не делает вход
Комментарий //out не делает выход :(
Комментарий //par делает параметр :) при парсинге
При редактировании переменных даются только только две роли global и parameter.
Входы и выходы нет возможности установить. :(
Что я делаю не так?
Показать
/********************************************************************
* MC14489B Display Hardware Block Simulation for UBI
* Управление дисплеем через входные сигналы блока
********************************************************************/

#include "MC14489B_display.h"

// ==================== ПИНЫ ВХОДОВ БЛОКА ====================
// Цифровые входы для управления
#define PIN_STRING_SELECT 2 //in Выбор строки (0-3)
#define PIN_DP_MASK_SELECT 3 //in Выбор маски точек (0-3)
#define PIN_SPECIAL_MODE 4 //in Специальный режим
#define PIN_CLEAR 5 //in Очистка дисплея
#define PIN_POWER 6 //in Вкл/Выкл питание
#define PIN_BRIGHTNESS 7 //in Яркость (0-1, можно ШИМ)
#define PIN_UPDATE 8 //in Обновить дисплей
#define PIN_RUNNING_TEXT 9 //in Режим бегущей строки

// Аналоговые входы (для потенциометров)
#define PIN_ANALOG_CHAR1 A0 // Выбор символа для 1 разряда
#define PIN_ANALOG_CHAR2 A1 // Выбор символа для 2 разряда
#define PIN_ANALOG_CHAR3 A2 // Выбор символа для 3 разряда
#define PIN_ANALOG_CHAR4 A3 // Выбор символа для 4 разряда
#define PIN_ANALOG_CHAR5 A4 // Выбор символа для 5 разряда

// ==================== ПИНЫ ВЫХОДОВ БЛОКА ====================
#define PIN_READY 10 //out Готовность блока

// ==================== ПИНЫ ПОДКЛЮЧЕНИЯ ДИСПЛЕЯ ====================
#define DATA_PIN 11 //par
#define CLOCK_PIN 12 //par
#define ENABLE_PIN 13 //par

// ==================== КОНСТАНТЫ ====================
// Таблица предустановленных строк
const char* PRESET_STRINGS[] = {
"12345",
"HELLO",
"ABCDE",
"88888"
};

// Таблица масок десятичных точек
const uint8_t PRESET_DP_MASKS[] = {
0b00000, // без точек
0b10000, // только левая
0b00100, // только центральная
0b11111 // все точки
};

// Таблица символов для аналогового выбора
const uint8_t CHAR_TABLE[] = {
CHAR_0, CHAR_1, CHAR_2, CHAR_3, CHAR_4,
CHAR_5, CHAR_6, CHAR_7, CHAR_8, CHAR_9,
CHAR_A, CHAR_b, CHAR_C, CHAR_d, CHAR_E, CHAR_F
};

// ==================== ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ ====================
static MC14489BDisplay display(DATA_PIN, CLOCK_PIN, ENABLE_PIN);

// Состояние входов
static struct {
int stringSelect;
int dpMaskSelect;
int specialMode;
int clear;
int power;
int brightness;
int update;
int runningText;
int analogChars[5];
} inputs = {0};

// Предыдущее состояние для детектирования изменений
static struct {
int stringSelect;
int dpMaskSelect;
int specialMode;
int clear;
int power;
int update;
int runningText;
} prevInputs = {0};

// Состояние бегущей строки
static int runningTextIndex = 0;
static unsigned long lastRunningTextTime = 0;

// Текущие символы на дисплее
static uint8_t currentChars[5] = {CHAR_0, CHAR_0, CHAR_0, CHAR_0, CHAR_0};

// Флаги состояния
static int displayOn = 1;
static int needUpdate = 0;

// ==================== ПРОТОТИПЫ ФУНКЦИЙ ====================
void readInputs(void);
void processInputs(void);
void handleStringSelect(int value);
void handleDpMaskSelect(int value);
void handleSpecialMode(int value);
void handleClear(int value);
void handlePower(int value);
void handleBrightness(int value);
void handleUpdate(int value);
void handleRunningText(int value);
void handleAnalogChars(void);
void updateDisplay(void);

/********************************************************************
* setup() - Инициализация
********************************************************************/
void setup(void) {
// Настройка входов
pinMode(PIN_STRING_SELECT, INPUT_PULLUP);
pinMode(PIN_DP_MASK_SELECT, INPUT_PULLUP);
pinMode(PIN_SPECIAL_MODE, INPUT_PULLUP);
pinMode(PIN_CLEAR, INPUT_PULLUP);
pinMode(PIN_POWER, INPUT_PULLUP);
pinMode(PIN_BRIGHTNESS, INPUT_PULLUP);
pinMode(PIN_UPDATE, INPUT_PULLUP);
pinMode(PIN_RUNNING_TEXT, INPUT_PULLUP);

// Настройка выходов
pinMode(PIN_READY, OUTPUT);
digitalWrite(PIN_READY, HIGH);

// Инициализация дисплея
display.begin();
display.displayString("READY");

// Чтение начального состояния входов
readInputs();
prevInputs.stringSelect = inputs.stringSelect;
prevInputs.dpMaskSelect = inputs.dpMaskSelect;
prevInputs.specialMode = inputs.specialMode;
prevInputs.power = inputs.power;

Serial.begin(9600);
Serial.println("MC14489B Hardware Block Ready");
}

/********************************************************************
* loop() - Главный цикл обработки
********************************************************************/
void loop(void) {
// Читаем все входы
readInputs();

// Обрабатываем изменения
processInputs();

// Обработка бегущей строки (если активна)
if (inputs.runningText == LOW) {
handleRunningTextAnimation();
}

// Обновление дисплея если нужно
if (needUpdate) {
updateDisplay();
needUpdate = 0;
}

smallDelay();
}

/********************************************************************
* readInputs() - Чтение всех входов блока
********************************************************************/
void readInputs(void) {
// Чтение цифровых входов (LOW = активен, т.к. INPUT_PULLUP)
inputs.stringSelect = digitalRead(PIN_STRING_SELECT);
inputs.dpMaskSelect = digitalRead(PIN_DP_MASK_SELECT);
inputs.specialMode = digitalRead(PIN_SPECIAL_MODE);
inputs.clear = digitalRead(PIN_CLEAR);
inputs.power = digitalRead(PIN_POWER);
inputs.brightness = digitalRead(PIN_BRIGHTNESS);
inputs.update = digitalRead(PIN_UPDATE);
inputs.runningText = digitalRead(PIN_RUNNING_TEXT);

// Чтение аналоговых входов (0-1023 -> 0-15 для выбора символов)
inputs.analogChars[0] = analogRead(PIN_ANALOG_CHAR1) / 64; // 0-15
inputs.analogChars[1] = analogRead(PIN_ANALOG_CHAR2) / 64;
inputs.analogChars[2] = analogRead(PIN_ANALOG_CHAR3) / 64;
inputs.analogChars[3] = analogRead(PIN_ANALOG_CHAR4) / 64;
inputs.analogChars[4] = analogRead(PIN_ANALOG_CHAR5) / 64;
}

/********************************************************************
* processInputs() - Обработка изменений входов
********************************************************************/
void processInputs(void) {
// Обработка выбора строки (фронт)
if (inputs.stringSelect != prevInputs.stringSelect) {
handleStringSelect(inputs.stringSelect);
prevInputs.stringSelect = inputs.stringSelect;
}

// Обработка выбора маски точек
if (inputs.dpMaskSelect != prevInputs.dpMaskSelect) {
handleDpMaskSelect(inputs.dpMaskSelect);
prevInputs.dpMaskSelect = inputs.dpMaskSelect;
}

// Обработка специального режима
if (inputs.specialMode != prevInputs.specialMode) {
handleSpecialMode(inputs.specialMode);
prevInputs.specialMode = inputs.specialMode;
}

// Обработка очистки (по нажатию)
if (inputs.clear == LOW && prevInputs.clear == HIGH) {
handleClear(inputs.clear);
}
prevInputs.clear = inputs.clear;

// Обработка питания (по изменению)
if (inputs.power != prevInputs.power) {
handlePower(inputs.power);
prevInputs.power = inputs.power;
}

// Обработка яркости (постоянно)
handleBrightness(inputs.brightness);

// Обработка принудительного обновления
if (inputs.update == LOW && prevInputs.update == HIGH) {
handleUpdate(inputs.update);
}
prevInputs.update = inputs.update;

// Обработка режима бегущей строки
if (inputs.runningText != prevInputs.runningText) {
handleRunningText(inputs.runningText);
prevInputs.runningText = inputs.runningText;
}

// Обработка аналоговых входов (всегда)
handleAnalogChars();
}

/********************************************************************
* handleStringSelect() - Выбор предустановленной строки
********************************************************************/
void handleStringSelect(int value) {
if (value == LOW) { // Нажата кнопка
static int stringIndex = 0;
stringIndex = (stringIndex + 1) % 4; // Циклический выбор

Serial.print("Selecting preset string: ");
Serial.println(PRESET_STRINGS[stringIndex]);

display.displayString(PRESET_STRINGS[stringIndex]);

// Сохраняем текущие символы
for (int i = 0; i < 5; i++) {
currentChars = display.charToCode(PRESET_STRINGS[stringIndex]);
}
}
}

/********************************************************************
* handleDpMaskSelect() - Выбор маски десятичных точек
********************************************************************/
void handleDpMaskSelect(int value) {
if (value == LOW) { // Нажата кнопка
static int maskIndex = 0;
maskIndex = (maskIndex + 1) % 4;

Serial.print("Setting DP mask: ");
Serial.println(PRESET_DP_MASKS[maskIndex], BIN);

display.setDP(PRESET_DP_MASKS[maskIndex]);
}
}

/********************************************************************
* handleSpecialMode() - Специальный режим
********************************************************************/
void handleSpecialMode(int value) {
if (value == LOW) {
Serial.println("Special mode: Alphabet");
// Показываем алфавит
display.setChars(CHAR_A, CHAR_b, CHAR_C, CHAR_d, CHAR_E);

currentChars[0] = CHAR_A;
currentChars[1] = CHAR_b;
currentChars[2] = CHAR_C;
currentChars[3] = CHAR_d;
currentChars[4] = CHAR_E;
} else {
Serial.println("Special mode off");
// Возврат к предыдущему состоянию или цифрам
display.displayString("12345");

for (int i = 0; i < 5; i++) {
currentChars = CHAR_1 + i;
}
}
}

/********************************************************************
* handleClear() - Очистка дисплея
********************************************************************/
void handleClear(int value) {
if (value == LOW) {
Serial.println("Clear display");
display.clear();
for (int i = 0; i < 5; i++) {
currentChars = CHAR_0;
}
}
}

/********************************************************************
* handlePower() - Вкл/Выкл питание
********************************************************************/
void handlePower(int value) {
if (value == LOW) {
Serial.println("Power OFF");
display.off();
displayOn = 0;
} else {
Serial.println("Power ON");
display.on();
displayOn = 1;
needUpdate = 1; // Обновить дисплей при включении
}
}

/********************************************************************
* handleBrightness() - Управление яркостью
********************************************************************/
void handleBrightness(int value) {
static int lastBrightness = HIGH;

if (value != lastBrightness) {
if (value == LOW) {
Serial.println("Brightness: Low");
// В MC14489B яркость регулируется через BR бит
// Здесь можно реализовать через конфигурацию
} else {
Serial.println("Brightness: High");
}
lastBrightness = value;
}
}

/********************************************************************
* handleUpdate() - Принудительное обновление
********************************************************************/
void handleUpdate(int value) {
if (value == LOW) {
Serial.println("Manual update");
display.update();
}
}

/********************************************************************
* handleRunningText() - Вкл/Выкл режим бегущей строки
********************************************************************/
void handleRunningText(int value) {
if (value == LOW) {
Serial.println("Running text mode ON");
runningTextIndex = 0;
lastRunningTextTime = millis();
} else {
Serial.println("Running text mode OFF");
}
}

/********************************************************************
* handleRunningTextAnimation() - Анимация бегущей строки
********************************************************************/
void handleRunningTextAnimation(void) {
if (millis() - lastRunningTextTime > 300) {
lastRunningTextTime = millis();

const char* patterns[] = {"12345", "23451", "34512", "45123", "51234"};
display.displayString(patterns[runningTextIndex % 5]);
runningTextIndex++;
}
}

/********************************************************************
* handleAnalogChars() - Вывод символов с аналоговых входов
********************************************************************/
void handleAnalogChars(void) {
static int lastChars[5] = {-1, -1, -1, -1, -1};
int changed = 0;

// Проверяем изменения
for (int i = 0; i < 5; i++) {
if (inputs.analogChars != lastChars) {
changed = 1;
lastChars = inputs.analogChars;
}
}

if (changed) {
// Устанавливаем символы с аналоговых входов
display.setChars(
CHAR_TABLE[inputs.analogChars[0] % 16],
CHAR_TABLE[inputs.analogChars[1] % 16],
CHAR_TABLE[inputs.analogChars[2] % 16],
CHAR_TABLE[inputs.analogChars[3] % 16],
CHAR_TABLE[inputs.analogChars[4] % 16]
);

// Логирование
Serial.print("Analog chars: ");
for (int i = 0; i < 5; i++) {
Serial.print(inputs.analogChars);
Serial.print(" ");
}
Serial.println();
}
}

/********************************************************************
* updateDisplay() - Обновление дисплея
********************************************************************/
void updateDisplay(void) {
display.setChars(
currentChars[0],
currentChars[1],
currentChars[2],
currentChars[3],
currentChars[4]
);
}

/********************************************************************
* smallDelay() - Небольшая задержка для стабильности
********************************************************************/
void smallDelay(void) {
for (volatile int i = 0; i < 100; i++);
}

/********************************************************************
* UBI Task (для RTOS)
********************************************************************/
#ifdef UBI_TASK
UBI_TASK(displayMonitor, 50) { // 20 Гц
// Мониторинг состояния блока
if (!displayOn) {
digitalWrite(PIN_READY, LOW);
} else {
digitalWrite(PIN_READY, HIGH);
}
}
#endif

/********************************************************************
* END OF FILE
********************************************************************/
Описание входов блока:
Пин Назначение Описание
2 STRING_SELECT Кнопка - циклический выбор предустановленных строк
3 DP_MASK_SELECT Кнопка - выбор маски десятичных точек
4 SPECIAL_MODE Переключатель - включение специального режима
5 CLEAR Кнопка - очистка дисплея
6 POWER Переключатель - вкл/выкл питание дисплея
7 BRIGHTNESS Переключатель - яркость (HIGH/LOW)
8 UPDATE Кнопка - принудительное обновление
9 RUNNING_TEXT Переключатель - режим бегущей строки
A0-A4 ANALOG_CHAR1-5 Потенциометры - выбор символов (0-15)
Особенности реализации:
Событийно-ориентированная - функции вызываются только при изменении входов

Антидребезг - детектирование фронтов сигналов

Аналоговое управление - потенциометры для выбора символов

Состояние сохраняется - между вызовами функций

Готов для аппаратной реализации - структура повторяет логику будущего блока

Этот код готов для конвертации через ino2ubi и симулирует поведение аппаратного блока с дискретными входами!


Дипсик сказал, что он адаптировал код именно для ino2ubi.
Люблю делать то, что потом само работает.
Аватара пользователя
Phazz
Полковник
Сообщения: 3516
Зарегистрирован: 17 окт 2016, 15:38
Откуда: Сургут
Имя: Анатолий
Благодарил (а): 381 раз
Поблагодарили: 262 раза

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Phazz »

после //in не должно быть текста
Engineer200
Рядовой
Сообщения: 53
Зарегистрирован: 19 дек 2025, 06:16
Имя: Александр
Благодарил (а): 18 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Engineer200 »

Phazz писал(а): 07 мар 2026, 09:08 после //in не должно быть текста
В онлайне я завёл следующий скетч:
#define PIN_STRING_SELECT 2 //in
#define PIN_STRING_SELECT 3 //par
ino2ubi Сделал блок без входа.
При редактировании переменных даются только только две роли global и parameter.
Как организовать вход?
Люблю делать то, что потом само работает.
Engineer200
Рядовой
Сообщения: 53
Зарегистрирован: 19 дек 2025, 06:16
Имя: Александр
Благодарил (а): 18 раз
Поблагодарили: 5 раз

Re: ino2ubi - утилита автоматического преобразования кода в пользовательский блок

Сообщение Engineer200 »

Я выяснил, что я плохо знаю синтаксис того, на чём пишется скетч.
Пока вопрос о входах снимается.
Извините.
Люблю делать то, что потом само работает.
Ответить

Вернуться в «Электронщикам - Непрограммистам»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость