Ви не увійшли.
Неспортивно
Обідно що глюк з логічними рівнями зламався сам по собі
У мене склалося враження, що відтворюваність залежить від того, чи почистили кеш фреймворку після зміни борди в IDE або встановлення іншого BSP. В лінухах він в ~/.cache/arduino/. У IDE ще є свій RAM-кеш в /tmp/arduino-ide2-<sketch_id>/, який зберігається при перезапуску IDE. Але він щось пустий.
Намагався повторити ситуацію - наче IDE при зміні борди перезбирає ядро заново, тільки вже при повторних білдах бере з кеша:
Compiling core...
Using previously compiled file: .../.cache/arduino/sketches/88E89C526180E920CC9AC97AD811FBB4/core/pins_arduino.c.o
Using precompiled core: .../.cache/arduino/cores/digistump_avr_digispark-tiny_3c94b2ea733e4d576f0033e398c581c3/core.a
а надійніше переписати як state machine.
Потрібно його або переписувати з 0
Якщо мета - отримати працюючу програму, то написати з нуля - це найпростіший варіант
Особисто мені, наприклад, було би цікавіше докопатись до причини: в якому саме рядку digitalWrite() скидає стан піна в 0 через неправильно побудовану умову. А для цього потрібно досягти детермінованої відтворюваності в емуляторі при перезбірці прошивки.
Неактивний
хм. В platformio хоч є кнопка для очистки кешу. а в Arduino ide я її не побачив
Ще один недолік у програмі: постійний перезапис однієї і тієї ж комірки в EEPROM. Даташит обіцяє 100'000 циклів перезапису. При записі раз на 3 секунди менше ніж за 100 мотогодин ресурс вичерпається.
Неактивний
Не так все погано. Начебто всі записи в eeprom пов"язані з натисканням кнопки. Судячи по назвах змінних
Щось цей simutron якийсь дивний.
Лінії малюються якось мимо пінів, підключитись куди хочеться не виходить..
Неактивний
Начебто всі записи в eeprom пов"язані з натисканням кнопки. Судячи по назвах змінних
Наче ж при кожному імпульсі подачі виконується EEPROM.put(10, ++ImpulseOilMotor).
Щось цей simutron якийсь дивний.
Та виглядає як творчість шкільного гуртка Ледве допер, що якщо файл прошивки оновився, весь застосунок потрібно перезапускати і відкривати проект заново. Бо він завантажує файл прошивки не кожний раз при старті симуляції, а тільки один раз. І автоматичний запуск симуляції при старті бісить. Таке, можна викидать
Остання редакція dimich (2025-06-13 20:48:54)
Неактивний
Якщо ще розбираєтесь, звідки вилазить ШИМ, то це результат конкуренції кількох незалежних "мигалок":
// Мигаем с частотой 2 и более Гц
if ((timeAfterStartVeryLong % 500) < 250)
digitalWrite(LEDMode, HIGH);
else
digitalWrite(LEDMode, LOW);
// Мигаем с частотой 1 Гц пока не отпустят кнопку
if ((timeAfterStartVeryLong % 1000) < 500)
digitalWrite(LEDMode, HIGH);
else
digitalWrite(LEDMode, LOW);
// мигаем светодиодом с частотой 3 Гц
if ((TriMin % 500) < 250)
digitalWrite(LEDMode, HIGH);
else
digitalWrite(LEDMode, LOW);
і є ще одна в DisplayOilMode()
Неактивний
А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам:
if (millis() - TimeStart > RoadTime * 1024) {
digitalWrite(outMotorOil, HIGH);
...
if (millis() - TimeStart > RainTime * 1024) {
digitalWrite(outMotorOil, HIGH);
...
та
if (TriMin < 7000) {
...
} else {
digitalWrite(outMotorOil, LOW);
...
Неактивний
я щось подібне підозрював але подивився в скількох місцях смикають за digitalWrite і вирішив що воно цікаво але не настільки щоб копати до кінця.
Ну на блимання можна і забити. А щодо всього іншого.. ніхто не знає, як воно повинно працювати, і ніхто не знає як воно насправді працює.
А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам
Є таке. Тільки чому така залежність від версії core, різниця в реалізації millis() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.
Неактивний
Honey пише:А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам
Є таке. Тільки чому така залежність від версії core, різниця в реалізації millis() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.
Може це не від core залежить, а від даних в EEPROM? Спробуйте помістити в кінець setup:
ImpulseOilMotor = maxImpulseOilMotor+1;
Неактивний
Може це не від core залежить, а від даних в EEPROM? Спробуйте помістити в кінець setup:
ImpulseOilMotor = maxImpulseOilMotor+1;
І то правда. Шʼєм програматором - в еепромці або FF'ки, або старий контент, в залежності від фʼюзів та опцій програматора. З першим імпульсом FF'ки стають нулями. Шʼєм бутлоадером - micronucleus еепромку не чіпає, а якийсь інший може й стирає. В різних емуляторах також стан еепромки може зберігатись, а може й ні.
Я би очікував більш регулярного паттерну глітчів при суто логічних помилках в коді. Але ж код там такий, що пробуєш його читати - одразу виникає бажання переписати все нафіг. І тоді не вчитуєшся, наївно сподіваючись, що автор знав, що писав
Остання редакція dimich (2025-06-14 03:08:42)
Неактивний
Що дивно, прообразу цього коду в інтернетах знайти не вдалось. Чи то він запозичений з давно мертвого форуму...
Короче, на місці автора я б його переробив. Запланував би більш зрозумілу індикацію, через 2/3 кольоровий LED. Можливо подумав би про рівень масла. Написав детальне ТЗ. А з нормальним ТЗ написати нормальний код просто
Ще один недолік у програмі: постійний перезапис однієї і тієї ж комірки в EEPROM. Даташит обіцяє 100'000 циклів перезапису. При записі раз на 3 секунди менше ніж за 100 мотогодин ресурс вичерпається.
Думаю набагато раніше. Хоча б раз сюди зайти і все. NeedResetCounterOil ніде більше не змінюється
if (NeedResetCounterOil == HIGH) {
// Сбрасываем счетчик импульсов в ЕЕПРОМ
ImpulseOilMotor = 0;
EEPROM.put(10, ImpulseOilMotor);
}
Неактивний
Хоча б раз сюди зайти і все. NeedResetCounterOil ніде більше не змінюється
EEPROM.put(10, ImpulseOilMotor);
EEPROMClass::put() ідемпотентна: EEPROM.h:66. Комірка записується тільки якщо нове значення не дорівнює прочитаному. Просто буде постійно читати. Але це теж баг, вважаю.
Остання редакція dimich (2025-06-14 14:11:42)
Неактивний
dimich пише:Ще один недолік у програмі: постійний перезапис однієї і тієї ж комірки в EEPROM. Даташит обіцяє 100'000 циклів перезапису. При записі раз на 3 секунди менше ніж за 100 мотогодин ресурс вичерпається.
Думаю набагато раніше. Хоча б раз сюди зайти і все. NeedResetCounterOil ніде більше не змінюється
if (NeedResetCounterOil == HIGH) { // Сбрасываем счетчик импульсов в ЕЕПРОМ ImpulseOilMotor = 0; EEPROM.put(10, ImpulseOilMotor); }
Такий час, в три секунди, поставив щоб перевіряти алгоритм.
В реальності - десь один імпульс на 5-7 хвилин їзди. В режимі дощу - в двічі частіше.
Неактивний
grep NeedResetCounterOil src/DigiSpark_Oiler_Moto.ino
bool NeedResetCounterOil = LOW;
NeedResetCounterOil = HIGH; // Ставим флаг сброса счетчика импульсов в ЕЕПРОМ
if (NeedResetCounterOil == HIGH) {
Ну, цей прапорець у вас справді ніколи не скидається.
Неактивний
В реальності - десь один імпульс на 5-7 хвилин їзди. В режимі дощу - в двічі частіше.
Тоді розрахунковий ресурс виходить біля 10'000 мотогодин, тобто трохи більше року. А у вас нема ніякої перевірки цілісності даних та індикації помилки. Помилку можна буде розпізнати тільки коли система почне працювати неправильно.
Крім того, дані можуть записатись некоректно і в будь-який момент при вимкненні живлення під час запису.
Неактивний
Не бачу навіщо взагалі ускладнення. Зібралися змащувати цеп кожні n км? Рахуємо імпульси з датчика, змащуємо. В режимі дощу змащуємо кожні n/2 км, хоча ви що, реально ганяєте весь день під дощем?. Швидкість можна і не міряти, все одно це без правильної математичної моделі ніочом. Чим простіше тим надійніше.
Датчик швидкості, його вхід, то для того, щоб коли мот стоїть, не подавалося мастило. Там немає ніякої залежності подачі, від швидкості. Просто як тригер.
Разом з ШІ написав заново код, який працює, з новими алгоритмами, на старій платі. Додав пару ,,плюшок'' яких не вистачало. Контроль датчика швидкості залишив.
Неактивний
От бачите, задача має рішення а ви вже зібрались гроші з кишені виймати
Я перед тим як написати на форумі, дістав вже ШІ.
Він теж мені розповідав, що живлення просідає, то перевантаження, то ще щось.
А я розумів, що проблема програмна. І якщо вже ШІ не розуміє програмну помилку, то треба живих людей діставати, якими керує цікавість, з'ясувати проблему.
От і вирішили, що глюк таки програмний, а не залізний.
Так, ШІ допоміг, я уважно і точно написав технічне завдання, і з другої спроби, код було написано.
Ще раз дякую всім учасникам.
Неактивний
А попередня версія теж АІ generated?