Ви не увійшли.
Не бачу навіщо взагалі ускладнення. Зібралися змащувати цеп кожні 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() не мала би так впливати. Хоча тут спостерігається залежність і від частоти вхідних імпульсів.
я щось подібне підозрював але подивився в скількох місцях смикають за digitalWrite і вирішив що воно цікаво але не настільки щоб копати до кінця.
Ну на блимання можна і забити. А щодо всього іншого.. ніхто не знає, як воно повинно працювати, і ніхто не знає як воно насправді працює.
А ШІМ на outMotorOil завдяки ось цим незалежним одна від одної умовам:
if (millis() - TimeStart > RoadTime * 1024) {
digitalWrite(outMotorOil, HIGH);
...
if (millis() - TimeStart > RainTime * 1024) {
digitalWrite(outMotorOil, HIGH);
...
та
if (TriMin < 7000) {
...
} else {
digitalWrite(outMotorOil, LOW);
...
конкуренції кількох незалежних "мигалок":
Так, там з обробкою натискання кнопки повний бардак
Якщо ще розбираєтесь, звідки вилазить ШИМ, то це результат конкуренції кількох незалежних "мигалок":
// Мигаем с частотой 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()
Начебто всі записи в eeprom пов"язані з натисканням кнопки. Судячи по назвах змінних
Наче ж при кожному імпульсі подачі виконується EEPROM.put(10, ++ImpulseOilMotor).
Щось цей simutron якийсь дивний.
Та виглядає як творчість шкільного гуртка Ледве допер, що якщо файл прошивки оновився, весь застосунок потрібно перезапускати і відкривати проект заново. Бо він завантажує файл прошивки не кожний раз при старті симуляції, а тільки один раз. І автоматичний запуск симуляції при старті бісить. Таке, можна викидать