Создание тахометра. Проблема расчета времени полуоборота с помощью датчика препятствия

Здраствуйте! Я новичок в создании схем на Ардуино, только закончил изучать Руководство по освоению Arduino 2012. Мне дали задание сделать тахометр. Я решил для реализации этого использовать датчик препятствия.


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

 // пин датчика  
#define SENSOR A1
unsigned long sg, tim; // время

void setup() {  
  // открываем последовательный порт 
  Serial.begin(9600); 
}

void loop() {
// считываем значение с датчика 
  bool signal = digitalRead(SENSOR); 
  if ( !signal ) { 
    // если сигнал ноль 
     sg=micros()-tim; // вычисление времени между двумя сигналами
    tim=micros(); // время последнего сигнала
  } else { 
    // если сигнал единица то все заново
    asm volatile("jmp 0x00");
  }  

Работает, на сигнал реагирует и даже что-то похожее на правду выводит, но asm volatile(“jmp 0x00”) будет мешать выполнению другой части кода. Я пытался воспользоваться for, но ардуино выдавало ошибку. Подскажите, пожалуйста, как сделать так чтобы при сигнале датчика запускался таймер, а при повторном сигнале он перезапускался?
Была еще идея воспользоваться лазером и оптическим датчиком, но у меня их нет.

Что эта строчка по вашему должна делать?
И да, код встлять надо как сказано в окне ввода сообщений.

1 лайк

Да, послушаем про jmp 0 - зачем он там.

Чего у него не спрашиваешь?

Эта строчка делает перезагрузку. Но мне данная команда не подходит. И да, код забыл правильно оформить. Спасибо, что указали на это

Точно, как я сам не догадался. Номерочек не подскажите?

Перезапускать таймер. Но вместе с таймером мне эта команда перезапускает то что перезапускать не нужно. Вот я и пытаюсь найти альтернативу

Сказали уже, что эта строчка просто перезапускает Ардуино, программа стартует с нуля. Вот и вопрос, накуа вы ее туда вставили?

1 лайк

ищи информацию по заветному слову - прерывание

1 лайк

Потому что я не понимал, как сделать по другому. Еще плюс программа начала работать, как нужно, то есть в порт выводилось время при отсутствии сигнала и время перезапускалось при наличии сигнала.

Может вы взялись за пока неподъёмную задачу? Может стоит подучиться для начала?

а тебе нужны ОБОРОТЫ в минуту

Да, мне нужны обороты в минуту, но я пока хочу со временем разобраться

Не сказал бы. У меня, просто, работа с таймерами в ардуино всегда проблемы и непонятки вызывает. Я вот пока со временем не разобрался, но уже подключил и настроил дисплей, ветряк, плюс формулы записал. Только со временем бы разобраться и все

А что ним (временем) разбираться? Настраиваешь таймер и прерывание. Как прерывание сработало - обрабатываешь «это дело». И всё.

Номер не знаю, но у него же ЦЕЛОЕ СООБЩЕСТВО: https://community.alexgyver.ru/ в поддержку своих и не только проектов.

А зачем мне прерывания? Мне нужно чтобы таймер обновлялся при получении сигнала. То есть в порту я хочу увидеть время полуоборота:
1
2
3
4
получили сигнал, таймер перезапустился
1
2
3
4
опять получили сигнал, таймер перезапустился и так до тех пор пока вентилятор не остановиться.

Этого я не знал. Надо будет посмотреть

Так по прерыванию это и делается. Или у вас есть иное видение? Озвучьте пожалуйста.