Взываю к богам программирования для критики своих первых шагов
- Войдите на сайт для отправки комментариев
Добрый день. Для начала хочу выразить благодарность создателям сайта, он очень помог мне в освоении совершенно неизвестной мне стихии (ардуино).
Так как на форуме неизвестно, с кем имеешь дело, я вкратце расскажу о себе, чтобы было понятно, с кем имеете дело) Меня зовут Николай, мне 25 лет и я из Казахстана. Работаю программистом встроенного языка 1с предприятия, до этого немного увлекался VB6. в раннем возврасте сильно увлекался радиолюбительством (учился по советским книгам, термин из СССР). С ардуино знаком всего пару месяцев, и сразу понял что она объединяет мои увлечения - программирование и радиолюбительство (блин, как же это сейчас называется то??).
Я приобрел ардуино уно, сейчас из китая мне идет мега 2650 с дисплеем. Поставил себе цель создать бортовой компьютер для своего авто взамен стандартного "лампового":
Проект большой, серьезный, и изучить мне предстоит многое - буду интересоваться у гугла от того, как лучше хранить переменные до того, чем залить все контакты ардуино в конце, чтобы не окислялись и не было дребезга.
Сейчас, пока еще нет меги, на уно планирую писать скетч и проверять через порт на компе. И так, сегодня я наклепал код, который выводит количество оборотов двигателя на компьютер (с переодичностью секунда).
Теперь непосредственно вопрос - что в коде неоптимально, нерационально, есть ли варианты лучше, надежнее, правильнее? (код работает, обороты показывает). Но учитывая то, что бортовой компьютер будет еще кучу данных считывать, каждый кирпичик должен быть без сучка и задоринки. А учитывая то, что я новичок, их будет много)))
Прощу прощения за то, что не вставил код в теги. Редактирование своих же сообщений я почему то тоже не нашел...
Хочу добавить так же, что мне не нравится то, как хранится время в переменной tim. Сначала ардуино "падал" через пару минут работы, как оказалось, переполнялось допустимое значение переменной. Пришлось перевести ее в long. Но мне кажется это не решение проблемы, т.к. в переменной значение не должно накапливатся в векторной величине, а обнулятся переодически. Но как сделать это, не вызывая лишний раз операторы, я пока не придумал
int ignition = 0; // переменная вспышек катушки зажигания unsigned long tim = 0; // так она будет "обнуляться" автоматически int x, oldX = HIGH; // помещается состояние напряжения с катушки void setup() { pinMode(7, INPUT); Serial.begin(9600); // открываем последовательное соединение } void loop() { //////////////////////////// Контроль времени, шаг - секунда if (millis() - tim >= 1000) { Serial.println( ignition * 60 ); // вывод насчитанных данных в порт (обороты двигателя умножить на 60) tim = millis(); // если больше чем секунда тогда обновление переменной ignition = 0; //сброс счетчика оборотов } //////////////////////////// Считывание с катушки зажигания x = digitalRead(7); if (x != oldX && x == LOW) { ignition++; } oldX = x; }но а так - всё окей, смело продолжайте
Прощу прощения за то, что не вставил код в теги. Редактирование своих же сообщений я почему то тоже не нашел...
Стартовое сообщение не редактируется, остальные свободно.
Хочу добавить так же, что мне не нравится то, как хранится время в переменной tim. Сначала ардуино "падал" через пару минут работы, как оказалось, переполнялось допустимое значение переменной.
Нет. При правильной работе переполнение tim - нормальное явление. Даже лучше вернуть на int, будете получать переполнение чаще и убеждатся что пишете правильно. Обнулять нельзя ни в коем случае.Для инта рассмотрим (unsigned int tim; unsigned int _millis=millis();)
tim _millis _millis-tim
fffe fffe 0000
fffe ffff 0001
fffe 0 0002
fffe 1 0003
Можете виндосовский калькулятор в hex переключить и пересчитать
Посмотрите строки 13 и 16. Вернет ли millis() одинаковое значение? Всегда? Зачем Вам эти варианты?
ПС. Могу порекомендовать использовать обобщенный подход для формирования временных интервалов (на форуме много раз обсуждался в вариантах: класс, массив и т.д.), т.к. их у Вас будет очень много. Но пока не буду. Просто учитывая что Вы начинающий. Всему свое время, разбиратся в чужем и путаном можна только понимая зачем оно нужно лично Вам. А это понимание возникнет по ходу работы, при осознании проблемы.
Про сигнал с катушки зажигания - все там сложней. Почитайте форум, и про катушку найдете много и про формирование временных интервалов.