Тахометр на ADUINO UNO

RLY
Offline
Зарегистрирован: 09.06.2016

Доброго времени суток уважаемые форумчане. Начну с того что в данной теме я новичок. Проблема следующая, собрал тахометр по приведенной схеме... работает... но нужно как то изменить скетч чтобы на дисплее показания оборотов увеличивались по 1 об. например (100,101,102,103...), а в данном скетче это происходит скачкообразно через 60 об. например (60,120,180...), как это сделать? Надеюсь на ваш совет и помощь.

volatile unsigned int int_tic=0; 
volatile unsigned long tic; 
#include <LiquidCrystal.h> 
LiquidCrystal lcd(8, 9, 3, 4, 6, 7);

void setup() {
lcd.begin(16, 2);
TCCR1A=0; TIMSK1 = 1<<TOIE1; //прерывание по переполнению
}
ISR (TIMER1_OVF_vect){ int_tic++; }

void loop() {

pinMode (5,INPUT); // вход сигнала T1 (only для atmega328)
TCCR1B = (1<<CS10)|(1<<CS11)|(1<<CS12);//тактировани от входа Т1
delay(500);
TCCR1B=0;
tic= ((uint32_t)int_tic<<16) | TCNT1; //сложить что натикало
int_tic=0; TCNT1 = 0; 
lcd.setCursor(0, 0);
lcd.print("RpS= ");
lcd.print(tic);
lcd.print("      ");
int RpM = tic*60;
lcd.setCursor(0, 1);
lcd.print("RpM= ");
lcd.print(RpM);
lcd.print("      ");
}

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, он же измеряет и выводит у Вас обороты в секунду, которые меняются как хотят (можно и на 1 - как получится). А обороты в минуту, он не измеряет, аполучает просто умножением оборотов в секунду на 60. Поэтому обороты в минуту хдесь просто не могут ментяь иначе, как через 60. Понимаете? Так что с этим скетчем Вы никак не поменяете. Если интересует точное измерение именно оборотов в минуту - нужно полностью переписывать скетч.

RLY
Offline
Зарегистрирован: 09.06.2016

Понял, спасибо за пояснение. В сети нашел другой скетч на видео (на видео измеряют скорость 7ми лопастного куллера) обороты измеряются через 1 об. все как надо, но он на моей схеме почемуто не работает, на дисплее высвечиваются прямоугольники вместо цифр. Возможно ли данный скетч как то подкорректировать под мою схему? Если возможно то что нужно исправить?

#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 5, 9, 10, 11, 12);

volatile float time = 0;
volatile float time_last = 0;
volatile int rpm_array[5] = {0,0,0,0,0};

void setup()
{
  //Digital Pin 2 Set As An Interrupt
 attachInterrupt(0, fan_interrupt, FALLING);

  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Current RPM:");
}

void loop()
{
  int rpm = 0;
  
  while(1){    

     //Slow Down The LCD Display Updates
  delay(400);
  
  //Clear The Bottom Row
  lcd.setCursor(0, 1);
  lcd.print("                ");   
  
  //Update The Rpm Count
  lcd.setCursor(0, 1);
  lcd.print(rpm);   

  ////lcd.setCursor(4, 1);
  ////lcd.print(time);   

  //Update The RPM
  if(time > 0)
  {
    //5 Sample Moving Average To Smooth Out The Data
      rpm_array[0] = rpm_array[1];
      rpm_array[1] = rpm_array[2];
      rpm_array[2] = rpm_array[3];
      rpm_array[3] = rpm_array[4];
      rpm_array[4] = 60*(1000000/(time*7));    
    //Last 5 Average RPM Counts Eqauls....
      rpm = (rpm_array[0] + rpm_array[1] + rpm_array[2] + rpm_array[3] + rpm_array[4]) / 5;
  }
 
 }
}

void fan_interrupt()
{
   time = (micros() - time_last); 
   time_last = micros();
}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Так вы сравните вторую строчку последнего скетча и четвертую строчку первого скетча. Это по экрану.

Плюс 10 строка последнего скетча там про пин 2...

RLY
Offline
Зарегистрирован: 09.06.2016

Исправил пины второго скетча на пины первого скетча (8, 9, 3, 4, 6, 7), и перенес белый провод с фоторезистора с 5 пина на 2 пин. Заработало, но както странно при запуске на дисплее 0 об. подношу оптопару к эл. двигателю на вал которого приклеяна бумажка показания меняются с 0 на определенные обороты, отвожу оптопару в сторону показания на дисплее возвращаются не на 0, а уходят в минус аж до нескольких тысяч. Что я не так сделал? 

RLY
Offline
Зарегистрирован: 09.06.2016

Немного поэксперементировав получил следующие данные. При включении на дисплее высвечивается 0 об. подношу оптопару к эл. двигателю показания меняются с 0 об. на определенное значение (217 об.), отвожу оптопару в сторону показания меняются не на 0 об. а теперь уходят в плюс на несколько тычяч, повторно подношу оптопару к эл. двигателю показания на дисплее меняются с этих нескольких тысяч до 217 об. далее при отводе оптопары процесс повторяется. При нажатии кнопки сброс на ардуинке, на дисплее высвечивается 0 об. при поднесении оптопары к эл. двигателю наблюдается выше описаное явление. Пару раз было так что при отводе оптопары от эл. двигателя показания на дисплее не увеличивались а "зависали" на 217 об. Жду вашей помощи, уж больно необходим мне этот тахометр. 

Frolv
Offline
Зарегистрирован: 31.08.2015

Добрый день. Добились успеха?