Тахометр таймер, помогите новичку.

Sanho
Offline
Зарегистрирован: 24.02.2016

Всем доброго дня!

  Вот, занялся ардуиной, но на все мозгов явно не хватает. Решил сделать полезный прибор для токарного станка, вроде что-то получилось, но не совсем. Тахометр работает, обороты считает, правда при остановке не обнуляется, но это не страшно. Часы тоже работают, но постоянно, а хотелось бы чтоб часы, как таймер, начинали работать при оборотах на тахометре, ну например больше 300, и останавливались меньше 300, и т.д. Таким образом можно было бы считать по времени работу двигателя станка за день. Перерыл кучу разных скетчей, в поисках примеров похожих задач, но ничего найти не могу. Подскажите, где копать? Какие функции за это отвечают. При блокировании строки //time = millis()/1000; часы останавливаются.

Вот мой скетч.

#define RPMpin 2 // датчик Холла
#include <LiquidCrystal.h>
unsigned long time;
LiquidCrystal lcd(12,11,6,5,4,3);
long microsold = 0;
int rpm = 0;
void setup() {
attachInterrupt(0, RPM, FALLING);
lcd.begin(16, 2);
}
void loop() {
delay(500);
lcd.clear();
lcd.print("RPM =");
lcd.setCursor(6,0);
lcd.print(rpm,DEC);
time = millis()/1000;
lcd.setCursor(0,1);
if (time/60/60<10);
lcd.print(time/60/60);
lcd.print(":");
if (time/60%60<10) { lcd.print ("0"); }
lcd.print((time/60)%60);
lcd.print(":");
if (time%60<10) { lcd.print ("0"); }
lcd.print(time%60);
} 
void RPM ()
{
rpm = (1000000.0/(micros() - microsold))*30;
microsold = micros();
}

 

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

ну, подключи блок питания балалайки параллельно с двигателем токарного станка.

MagicianT
Offline
Зарегистрирован: 03.10.2015

для остановки времени, то я бы добавил три глобал переменных , время_на _цикл , работа_за_ден и хранитель последнего_миллис. Первая обновляется/считается в каждом прогоне как :  

время_на _цикл = millis() - последн_миллис;
последн_миллис = millis();
 
а вторая это акумулятор накапливающий результат первой переменной ЕСЛИ тахометр крутится:
работа_за_ден =  работа_за_ден + время_на _цикл;
Вам оператор "if" знаком? Вот и поставьте if( rpm > 300) работа_за_ден =  работа_за_ден + время_на _цикл;
Sanho
Offline
Зарегистрирован: 24.02.2016

Спасибо за ответ. Да оператор "if" знаком, я при помощи его выводил на дисплей какой нибудь символ.

if (rpm >= 300) 
lcd.write(1);
Но вот включить и выключить часы пока не получается. Хранить время таймера больше дня, нет необходимости, важно чтоб он считал от включения и до выключения прибора, по оборотам. Может еще кто что-то подскажет дельное. Спасибо, буду пробовать копать в этом направлении. А то судя по первому ответу, показалось что тут одни электрики.
okta
Offline
Зарегистрирован: 10.01.2015

Вам все правильно MagicianT подсказал. Добавлю, что обороты лучше считать не каждый в отдельности, а скопом за промежуток времени. Проверить не на чем сейчас, так что сорри, если ошибся где в синтаксисе, но, думаю смысл должен быть понятен. Ваши участки про вывод на LCD не трогал:

#define RPMpin 2 // датчик Холла
#include <LiquidCrystal.h>
unsigned long time;
unsigned long dayTime=0;
unsigned long nowTime=0;
unsigned long prevTime=0;

LiquidCrystal lcd(12,11,6,5,4,3);
int rpm = 0;
volatile unsigned int count=0;
void setup() {
attachInterrupt(0, RPM, FALLING);
lcd.begin(16, 2);
}
void loop() {
delay(500);

nowTime = millis();
rpm=(count/(nowTime-prevTime))*1000;
count=0;

lcd.clear();
lcd.print("RPM =");
lcd.setCursor(6,0);
lcd.print(rpm,DEC);


if(rpm>300){
dayTime=dayTime+nowTime-prevTime;
}
prevTime=nowTime;
time=dayTime/1000;

lcd.setCursor(0,1);
if (time/60/60<10);
lcd.print(time/60/60);
lcd.print(":");
if (time/60%60<10) { lcd.print ("0"); }
lcd.print((time/60)%60);
lcd.print(":");
if (time%60<10) { lcd.print ("0"); }
lcd.print(time%60);
} 
void RPM ()
{
count++;
}

PS оптимизация за вами :)

Sanho
Offline
Зарегистрирован: 24.02.2016

Спасибо за скетч! Попробую с ним поразбираться, тоже интересно. Сейчас его залил, пока не работает, все по нолям, импульсы с датчика не видит. Вчера по совету MagicianT позанимался со своим скетчем, все заработало. Таймер теперь включается и отключается, работает в режиме накопления, все как надо, спасибо. Добавил это.

if( rpm >= 300){time = millis()/1000;}

Сейчас пробую добавить стрелки, больше меньше. То-есть чтоб показывали, увеличиваются обороты, или уменьшаются. Но пока только работают от заданного числа, до 200 горит одна, после 200 другая. Может кто подскажет, где копать?

if (rpm >= 200) 
lcd.write(1);
else
lcd.write(2);

 

MagicianT
Offline
Зарегистрирован: 03.10.2015

Чтобы узнать увеличивается или уменьшается, нужно взять первую производную. Непугаитесь, дифференцирование это очень просто, надо отнять старое от нового значения   и посмотреть знак. Старое значение надо сохранить, чтоб не затерлось, также как prevTime например.

int prev_rpm = 0;

 loop (){
....
 int differencial = rpm - prev_rpm;
 if (differencial > 0)  
    lcd.write(1);  -> nabiraet
 else                   
    lcd.write(2); -> zbavlyaet

 prev_rpm = rpm;

 

okta
Offline
Зарегистрирован: 10.01.2015

Sanho пишет:

Таймер теперь включается и отключается, работает в режиме накопления, все как надо, спасибо. Добавил это.

if( rpm >= 300){time = millis()/1000;}

Вы сейчас перевернули мое мировоззрение... как оно может работать в режиме накопления (я же правильно понимаю, что считать время нужно только когда мотор работает на оборотах >=300), если в любом случае при достижении 300 оборотов запоминается время с момента включения контроллера (всё время - вне зависимости от того работал мотор или нет)?

Sanho
Offline
Зарегистрирован: 24.02.2016

Вот спасибо за подсказку! Попробую разобраться.

Sanho
Offline
Зарегистрирован: 24.02.2016
#define RPMpin 2 // датчик Холла
#include <LiquidCrystal.h>
unsigned long time;
LiquidCrystal lcd(12,11,6,5,4,3);
long microsold = 0;
int rpm = 0;
void setup() {
attachInterrupt(0, RPM, FALLING);
lcd.begin(16, 2);
}
void loop() {
delay(500);
lcd.clear();
lcd.print("RPM =");
lcd.setCursor(6,0);
lcd.print(rpm,DEC);
if( rpm >= 300){time = millis()/1000;}
//time = millis()/1000;
lcd.setCursor(0,1);
if (time/60/60<10);
lcd.print(time/60/60);
lcd.print(":");
if (time/60%60<10) { lcd.print ("0"); }
lcd.print((time/60)%60);
lcd.print(":");
if (time%60<10) { lcd.print ("0"); }
lcd.print(time%60);
} 
void RPM ()
{
rpm = (1000000.0/(micros() - microsold))*30;
microsold = micros();
}

okta пишет:

Sanho пишет:

Таймер теперь включается и отключается, работает в режиме накопления, все как надо, спасибо. Добавил это.

if( rpm >= 300){time = millis()/1000;}

Вы сейчас перевернули мое мировоззрение... как оно может работать в режиме накопления (я же правильно понимаю, что считать время нужно только когда мотор работает на оборотах >=300), если в любом случае при достижении 300 оборотов запоминается время с момента включения контроллера (всё время - вне зависимости от того работал мотор или нет)?

Счет начинается при достижении оборотов за 300. Останавливается при меньше 300, и снова продолжается опять за 300 прибавляя время работы. Все как надо.

Sanho
Offline
Зарегистрирован: 24.02.2016

Сейчас еще раз все проверил, да,  счет то на дисплее останавливается, а время фактический идет, и при повторном запуске оно складывается. Надо думать.

okta
Offline
Зарегистрирован: 10.01.2015

Не знаю, что там у вас со счетчиком оборотов не сложилось. Ок, оставляем ваш счетчик, добавляем просто рассчет времени.

#define RPMpin 2 // датчик Холла
#include <LiquidCrystal.h>
unsigned long time;
unsigned long dayTime=0;
unsigned long newTime=0;
unsigned long prevTime=0;
LiquidCrystal lcd(12,11,6,5,4,3);
long microsold = 0;
int rpm = 0;
void setup() {
attachInterrupt(0, RPM, FALLING);
lcd.begin(16, 2);
}
void loop() {
delay(500);
lcd.clear();
lcd.print("RPM =");
lcd.setCursor(6,0);
lcd.print(rpm,DEC);
newTime=millis();
if( rpm >= 300){dayTime = dayTime+(newTime-prevTime);}
prevTime=newTime;
time=dayTime/1000;
//time = millis()/1000;
lcd.setCursor(0,1);
if (time/60/60<10);
lcd.print(time/60/60);
lcd.print(":");
if (time/60%60<10) { lcd.print ("0"); }
lcd.print((time/60)%60);
lcd.print(":");
if (time%60<10) { lcd.print ("0"); }
lcd.print(time%60);
} 
void RPM ()
{
rpm = (1000000.0/(micros() - microsold))*30;
microsold = micros();
}

 

Sanho
Offline
Зарегистрирован: 24.02.2016

Вот Ваш скетч теперь работает, и действительно как надо. большое спасибо! Счетчик останавливается полностью, Только задержку поставил 1000, а то показания тахометра сильно прыгают. Теперь попробую тщательно с этим всем разобраться, и стрелки ввести. Еше раз спасибо!

Sanho
Offline
Зарегистрирован: 24.02.2016

MagicianT Спасибо за пример, стрелки заработали. Вот только не совсем понимаю как это достигнуто. Пробую разобраться с тахометром от Okta, не совсем все понятно. Ребята, подскажите, где можно почитать про differencial, dayTime, nowTime, prevTime и т.д. А то прочитал весь раздел программирования, не нашел таких функций. А хотелось бы знать что они конкретно выполняют и за что отвечают. И вообще, в разных скетчах, много всего, чего нет в разделе. Где же это читают?

okta
Offline
Зарегистрирован: 10.01.2015

Это не функции. Это переменные, про них и почитайте - без них дальше никак.

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Повторю.

Нужно помочь самому себе. Пост:

https://ru.wikipedia.org/wiki/%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5

https://ru.wikipedia.org/wiki/%D0%AF%D0%B7%D1%8B%D0%BA_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%A1%D0%B8_%28%D0%BA%D0%BD%D0%B8%D0%B3%D0%B0%29

https://ru.wikipedia.org/wiki/%D0%9E%D1%82%D1%81%D1%82%D1%83%D0%BF_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29

http://lib.ru/CTOTOR/kernigan.txt_with-big-pictures.html

Абрам 30 лет молился богу - я работаю в поте лица, не пропускаю молитв и всегда прошу помочь мне! Ну почему боже ты не можешь дать мне например миллион долларов?

БОГ - Абрам, дай мне шанс - КУПИ ЛОТЕРЕЮ!

Ребята, прочтите книжку! (Керниган и Ритчи) Куча вопросов отпадет.....

Ну а на десерт - 4х томник Кнута "Искусство программирования"- классика жанра ;)

https://ru.wikipedia.org/wiki/%D0%98%D1%81%D0%BA%D1%83%D1%81%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F

okta
Offline
Зарегистрирован: 10.01.2015

Не всё сразу. Кто-то сразу пониманиет теорию, а комуто надо сначала "пощупать результат", а потом уже рыть теорию (так сказать имея неопровержимые доказательства, что она работает). Понятно, что если человек хочет сразу собрать звездолет, то он мимо кассы. В данном случае, простейший код, на котором можно разобрать простейшие понятия, а дальше обратиться к базовым урокам программирования. С историями возникновения и тому подобным - ознакомление будет само собой, когда в том появится потребность. Начинать с этого - просто сразу убить желание подобными вещами заниматься (ИМХО, если речь идет о хобби). Тыщу раз уже это обсуждалось.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

okta  , это очень странно
Кто-то сразу пониманиет теорию, а комуто надо сначала "пощупать результат", а потом уже рыть теорию (так сказать имея неопровержимые доказательства, что она работает).
ты не веришь Энштейнову, Герцову, Омову, Теслову и др. нашим ( не ИГИЛ ) ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

"из двух спорящих - один дурак , второй - сволочь"
спроси по буквам , спроси по резисторам.... 
....помогут :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Начинать с этого - просто сразу убить желание подобными вещами заниматься (ИМХО, если речь идет о хобби). Тыщу раз уже это обсуждалось.

и чем ты здесь лучше Клапауций 322 , 323 , 324....................................................... ХЗ  ?
...ты убиваешь желание , а он уже "мопеды" начал делать....

okta
Offline
Зарегистрирован: 10.01.2015

поток мысли надо как-то ограничить :)))))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Не всё сразу. Кто-то сразу пониманиет теорию, а комуто надо сначала "пощупать результат", а потом уже рыть теорию (так сказать имея неопровержимые доказательства, что она работает)
на такой волне как-то схватился с Лешаком ( давно не видно , лишь бы не заболел ) - обсуждать мона всё , но не УСТОИ !!!!!

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

okta пишет:

поток мысли надо как-то ограничить :)))))

ТАК И СДЕЛАЙ !
....себе
:)-

okta
Offline
Зарегистрирован: 10.01.2015

SU-27-16 пишет:

okta пишет:

поток мысли надо как-то ограничить :)))))

ТАК И СДЕЛАЙ !
....себе
:)-

нда... сколько полезного автор темы вынес из ваших мудрых изречений?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

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

okta
Offline
Зарегистрирован: 10.01.2015

Теперь понятно, почему новичкам проще найти инфо на зарубежных сайтах...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

okta пишет:

Теперь понятно, почему новичкам проще найти инфо на зарубежных сайтах...

это стандартный выход с сайта , если не умеешь спрашивать нормально....
УДАЧИ !

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

okta пишет:

.......новичкам проще........

"А Я ЗА ЧТО ЕЁ ДЕРЖАЛ !!!!!!!!!!"
...я такой же как ты ! не ори здесь... Разбудишь ЗВЕРЯ - сам и дурак....

 

okta
Offline
Зарегистрирован: 10.01.2015

SU-27-16 пишет:

okta пишет:

Теперь понятно, почему новичкам проще найти инфо на зарубежных сайтах...

это стандартный выход с сайта , если не умеешь спрашивать нормально....
УДАЧИ !

 

Нда... Не почитав тему, не посмотрев кому отвечаем (я что-то спрашивал?)... Полный неадекват...

okta
Offline
Зарегистрирован: 10.01.2015

SU-27-16 пишет:

okta пишет:

.......новичкам проще........

"А Я ЗА ЧТО ЕЁ ДЕРЖАЛ !!!!!!!!!!"
...я такой же как ты ! не ори здесь... Разбудишь ЗВЕРЯ - сам и дурак....

 

Заслуженный троль или просто пьяный бред?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

okta  ,
"Вот , занялся ардуиной, но на все мозгов явно не хватает"

Прочитавший ТЕМУ , увидевший кому прочитанное написано , 
написал ответ прочитавшему ,  которому прописанное было предназначено !

кататак :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Заслуженный троль ! и просто пьяный бред !
Спасибо !

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Спасибо !!
Клапауций 322, 323......999, 000 , 001....

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

SU-27-16 пишет:

и чем ты здесь лучше Клапауций 322 , 323 , 324....................................................... ХЗ  ?

Клапауций 000-999 - баноустойчивый ползатель форума arduino.ru

возник, вследствие конфликта с админом форума и его лени ввести верификацию новоиспечённого юзера с помощью почты или иным другим способом.

SU-27-16 пишет:

...ты убиваешь желание , а он уже "мопеды" начал делать....

класс титановый велосипед [название](c)франшиза.

пишутся не для убийства, а для комфортного убийства.

okta
Offline
Зарегистрирован: 10.01.2015

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Клапауций 322  , 
вышеизложенное и подтверждённое тобой = -Клапауций -0000
мине тоже по пояс !!!
но неприятно....
не нано !!!!!!!

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

okta пишет:

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

перечитай свои вопросы....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Клапауций 000-999 - баноустойчивый ползатель форума arduino.ru
перед кем ? от кого ? от чего ?
....устойчивый ?

okta
Offline
Зарегистрирован: 10.01.2015

Прочитайте свои посты. И оцените их для тех, кто не в курсе. Что за бред? Можно объяснить? Или тут надо фрейда привлекать и анализировать за что и кого там держали, и кто такой лешак и какие у вас были взаимоотношения...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

удачи вам ! а лешака - надо читать ! (на этом сайте )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

#35
Если у меня есть некоторое свободное время, котрое я готов потратить на 
дык , используйте его....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

пардон , ПимБой....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

N = 300

если обороты шпинделя > N - записать на SD Ton И ВРЕМЯ
если обороты шпинделя < N - записать на SD Toff И ВРЕМЯ

сняв показания с SD можно узнать левачил ЛИ токарь за смену....

можно писать в память поминутно - за 3...5 лет МК не убьёте.....

про что  вопрос-то ?

 

все вышеизложенные тексты ( коды ) не устойчивы к отключению по питанию.....
МОЯ МНЕНИЯ !

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

важно чтоб он считал от включения и до выключения прибора, по оборотам. Может еще кто что-то подскажет дельное. Спасибо, буду пробовать копать в этом направлении. А то судя по первому ответу, показалось что тут одни электрики.

ЕЩЁ из авиации некоторые приблудились....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

счётчик мото-часов чёли  ? НиХеРаСиБеЗаДача !!!!!!
Блок НХРСБ-ЗД-010.006 можно будет впихнуть за 1500р.

 

воооооооообще - мне "по пояс" !