Взываю к богам программирования для критики своих первых шагов

acces969
Offline
Зарегистрирован: 22.01.2017

Добрый день. Для начала хочу выразить благодарность создателям сайта, он очень помог мне в освоении совершенно неизвестной мне стихии (ардуино).

Так как на форуме неизвестно, с кем имеешь дело, я вкратце расскажу о себе, чтобы было понятно, с кем имеете дело) Меня зовут Николай, мне 25 лет и я из Казахстана. Работаю программистом встроенного языка 1с предприятия, до этого немного увлекался VB6. в раннем возврасте сильно увлекался радиолюбительством (учился по советским книгам, термин из СССР). С ардуино знаком всего пару месяцев, и сразу понял что она объединяет мои увлечения - программирование и радиолюбительство (блин, как же это сейчас называется то??).

Я приобрел ардуино уно, сейчас из китая мне идет мега 2650 с дисплеем. Поставил себе цель создать бортовой компьютер для своего авто взамен стандартного "лампового":

Проект большой, серьезный, и изучить мне предстоит многое - буду интересоваться у гугла от того, как лучше хранить переменные до того, чем залить все контакты ардуино в конце, чтобы не окислялись и не было дребезга.

Сейчас, пока еще нет меги, на уно планирую писать скетч и проверять через порт на компе. И так, сегодня я наклепал код, который выводит количество оборотов двигателя на компьютер (с переодичностью секунда). 

Теперь непосредственно вопрос - что в коде неоптимально, нерационально, есть ли варианты лучше, надежнее, правильнее? (код работает, обороты показывает). Но учитывая то, что бортовой компьютер будет еще кучу данных считывать, каждый кирпичик должен быть без сучка и задоринки. А учитывая то, что я новичок, их будет много)))

int ignition = 0; // переменная вспышек катушки зажигания
int long tim = 0;
int x = HIGH;     // помещается состояние напряжения с катушки
int oldX = HIGH;  // хранится предыдущее состояние напряжения с катушки
 
void setup() {
  pinMode(7, INPUT);
  Serial.begin(9600);      // открываем последовательное соединение
}
 
void loop() { delay(1);
 
  //////////////////////////// Контроль времени, шаг - секунда
  if (millis() - tim >= 1000) 
  {
  Serial.println( ignition  * 60 );  // вывод насчитанных данных в порт (обороты двигателя умножить на 60)
  tim = millis(); // если больше чем секунда тогда обновление переменной
 
  ignition = 0; //сброс счетчика оборотов 
 
  }
  ////////////////////////////
 
  //////////////////////////// Считывание с катушки зажигания
  x = digitalRead(7);
  if (x != oldX && x == LOW)
      {
      ignition = ignition + 1;
      }   
  oldX = x;
  ////////////////////////////
  
}
 
acces969
Offline
Зарегистрирован: 22.01.2017

Прощу прощения за то, что не вставил код в теги. Редактирование своих же сообщений я почему то тоже не нашел... 

Хочу добавить так же, что мне не нравится то, как хранится время в переменной tim. Сначала ардуино "падал" через пару минут работы, как оказалось, переполнялось допустимое значение переменной. Пришлось перевести ее в long. Но мне кажется это не решение проблемы, т.к. в переменной значение не должно накапливатся в векторной величине, а обнулятся переодически. Но как сделать это, не вызывая лишний раз операторы, я пока не придумал

negavoid
Offline
Зарегистрирован: 09.07.2016
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;
  
}

но а так - всё окей, смело продолжайте

Logik
Offline
Зарегистрирован: 05.08.2014

acces969 пишет:

Прощу прощения за то, что не вставил код в теги. Редактирование своих же сообщений я почему то тоже не нашел... 

Стартовое сообщение не редактируется, остальные свободно.

acces969 пишет:

Хочу добавить так же, что мне не нравится то, как хранится время в переменной 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() одинаковое значение? Всегда? Зачем Вам эти варианты?

ПС. Могу порекомендовать использовать обобщенный подход для формирования временных интервалов (на форуме много раз обсуждался в вариантах: класс, массив и т.д.), т.к. их у Вас будет очень много. Но пока не буду. Просто учитывая что Вы начинающий. Всему свое время, разбиратся в чужем и путаном можна только понимая зачем оно нужно лично Вам. А это понимание возникнет по ходу работы, при осознании проблемы.

 

Logik
Offline
Зарегистрирован: 05.08.2014

Про сигнал с катушки зажигания - все там сложней. Почитайте форум, и про катушку найдете много и про формирование временных интервалов.