Ви не увійшли.
Ні. Те що я скидав сюди, що й створило тему, то написане товаришем, живою людиною, років чотири тому. Лежав той проект довго, поки не дійшли і до нього руки.
А попередня версія теж АІ generated?
Я перед тим як написати на форумі, дістав вже ШІ.
Він теж мені розповідав, що живлення просідає, то перевантаження, то ще щось.
А я розумів, що проблема програмна. І якщо вже ШІ не розуміє програмну помилку, то треба живих людей діставати, якими керує цікавість, з'ясувати проблему.
От і вирішили, що глюк таки програмний, а не залізний.
Так, ШІ допоміг, я уважно і точно написав технічне завдання, і з другої спроби, код було написано.
Ще раз дякую всім учасникам.
От бачите, задача має рішення а ви вже зібрались гроші з кишені виймати
Датчик швидкості, його вхід, то для того, щоб коли мот стоїть, не подавалося мастило. Там немає ніякої залежності подачі, від швидкості. Просто як тригер.
Разом з ШІ написав заново код, який працює, з новими алгоритмами, на старій платі. Додав пару ,,плюшок'' яких не вистачало. Контроль датчика швидкості залишив.
Не бачу навіщо взагалі ускладнення. Зібралися змащувати цеп кожні n км? Рахуємо імпульси з датчика, змащуємо. В режимі дощу змащуємо кожні n/2 км, хоча ви що, реально ганяєте весь день під дощем?. Швидкість можна і не міряти, все одно це без правильної математичної моделі ніочом. Чим простіше тим надійніше.
В реальності - десь один імпульс на 5-7 хвилин їзди. В режимі дощу - в двічі частіше.
Тоді розрахунковий ресурс виходить біля 10'000 мотогодин, тобто трохи більше року. А у вас нема ніякої перевірки цілісності даних та індикації помилки. Помилку можна буде розпізнати тільки коли система почне працювати неправильно.
Крім того, дані можуть записатись некоректно і в будь-який момент при вимкненні живлення під час запису.
grep NeedResetCounterOil src/DigiSpark_Oiler_Moto.ino
bool NeedResetCounterOil = LOW;
NeedResetCounterOil = HIGH; // Ставим флаг сброса счетчика импульсов в ЕЕПРОМ
if (NeedResetCounterOil == HIGH) {
Ну, цей прапорець у вас справді ніколи не скидається.
dimich пише:Ще один недолік у програмі: постійний перезапис однієї і тієї ж комірки в EEPROM. Даташит обіцяє 100'000 циклів перезапису. При записі раз на 3 секунди менше ніж за 100 мотогодин ресурс вичерпається.
Думаю набагато раніше. Хоча б раз сюди зайти і все. NeedResetCounterOil ніде більше не змінюється
if (NeedResetCounterOil == HIGH) { // Сбрасываем счетчик импульсов в ЕЕПРОМ ImpulseOilMotor = 0; EEPROM.put(10, ImpulseOilMotor); }
Такий час, в три секунди, поставив щоб перевіряти алгоритм.
В реальності - десь один імпульс на 5-7 хвилин їзди. В режимі дощу - в двічі частіше.
Хоча б раз сюди зайти і все. NeedResetCounterOil ніде більше не змінюється
EEPROM.put(10, ImpulseOilMotor);
EEPROMClass::put() ідемпотентна: EEPROM.h:66. Комірка записується тільки якщо нове значення не дорівнює прочитаному. Просто буде постійно читати. Але це теж баг, вважаю.
Ще один недолік у програмі: постійний перезапис однієї і тієї ж комірки в EEPROM. Даташит обіцяє 100'000 циклів перезапису. При записі раз на 3 секунди менше ніж за 100 мотогодин ресурс вичерпається.
Думаю набагато раніше. Хоча б раз сюди зайти і все. NeedResetCounterOil ніде більше не змінюється
if (NeedResetCounterOil == HIGH) {
// Сбрасываем счетчик импульсов в ЕЕПРОМ
ImpulseOilMotor = 0;
EEPROM.put(10, ImpulseOilMotor);
}
Що дивно, прообразу цього коду в інтернетах знайти не вдалось. Чи то він запозичений з давно мертвого форуму...
Короче, на місці автора я б його переробив. Запланував би більш зрозумілу індикацію, через 2/3 кольоровий LED. Можливо подумав би про рівень масла. Написав детальне ТЗ. А з нормальним ТЗ написати нормальний код просто
Може це не від core залежить, а від даних в EEPROM? Спробуйте помістити в кінець setup:
ImpulseOilMotor = maxImpulseOilMotor+1;
І то правда. Шʼєм програматором - в еепромці або FF'ки, або старий контент, в залежності від фʼюзів та опцій програматора. З першим імпульсом FF'ки стають нулями. Шʼєм бутлоадером - micronucleus еепромку не чіпає, а якийсь інший може й стирає. В різних емуляторах також стан еепромки може зберігатись, а може й ні.
Я би очікував більш регулярного паттерну глітчів при суто логічних помилках в коді. Але ж код там такий, що пробуєш його читати - одразу виникає бажання переписати все нафіг. І тоді не вчитуєшся, наївно сподіваючись, що автор знав, що писав
Honey пише:А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам
Є таке. Тільки чому така залежність від версії core, різниця в реалізації millis() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.
Може це не від core залежить, а від даних в EEPROM? Спробуйте помістити в кінець setup:
ImpulseOilMotor = maxImpulseOilMotor+1;
А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам
Є таке. Тільки чому така залежність від версії core, різниця в реалізації millis() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.