Нужна помощь по тахометру на Digispark-е
- Войдите на сайт для отправки комментариев
Пт, 24/11/2017 - 19:30
Вечер в хату, уважаемые!
Я тут первоход, еще особо не освоился, так что не грузите сильно.
Суть вопроса: заморочался сборкой счетчика на Digispark-e c герконовым датчиком, вывод данных- OLED- дисплей, подключенный по I2C. Собрал, после длительного "интима" завел и N-ное время им работал.
Сейчас, по мере накопления рабочих моментов, все чаще возникает нужда в том, чтобы счетчик (помимо прямых обязанностей) мог прицепом и обороты измерять.
Втыкал в код уже 3 дня, но так и не смог написать формулу подсчета и скрестить ее с исходником.
Собснно, вопрос: мож кто подскажет, куда копать?
Исходник:
#include <DigisparkOLED.h> // Подключил библиотеку OLED- дисплея #include <Wire.h> // Подключил pinout- библиотеку const int sens = 1; // Задал имя и номер пина входа (в константе) int sens_hit = 0; // Переменная для хранения числового значения подсчета int sens_last = 1; // переменная для хранения последней цифры void setup() { pinMode(sens, INPUT); // задал пин сенсора как вход oled.begin(); // Работаю с дисплеем oled.clear(); oled.setCursor(30, 2); oled.setFont(FONT8X16); oled.print(("Gopneg")); oled.setCursor(30, 4); oled.print(("Counter")); delay(3000); oled.clear(); oled.setCursor(25, 0); oled.print((" HITS: ")); oled.setCursor(60, 2); oled.print(("0")); } void loop() { if ((digitalRead(sens)==HIGH)&&(sens_last==0)) // Считаем... { sens_hit = sens_hit + 1; oled.setCursor(60, 2); oled.print((sens_hit)); // Вывод результата } sens_last = digitalRead(sens); delay(50); // Нуу, чтобы руки не дрожали. (с) Кардан. } // Задержкой можно и поиграть (смотря какой датчик).
З.Ы. В Гугл не посылать- там все примеры на прерываниях, а у меня Digispark. На Nano делать не хочу- было уже, габариты не устроили.
У Digispark отсутствуют прерывания ?
Без понятия. Я не в курсе, работают ли прерывания вообще и как на этой платформе с ними работать. Нюансов много.
Да и не нужно это, раз датчик работает напрямую с контроллером.
Я и вопрос нарисовал, чтобы какие-то ответы получить, а не вопросы в ответку.
З.Ы. Пробовал прикрутить кусок кода от Arduino (тот, в котором формула)- не получилось увязать с моим, т.к. разные способы получения данных и их обработки...
Внешнее прерывание int0 у спарка так же на ноге 2 как у ардуино, так что примеры должны подойти
UP-ну темку. Человеки, ну подскажите что-нибудь дельное.
Воспользоваться pulseIn сделать несколько замеров для усреднения.
Такой вариант пойдёт? Правда он может влиять на другие действия.
Ещё вариант опрос в лупе пина и замер времени между сменами состояния пина.
все таки лучше опрос по внешнему прерыванию и далее
У меня на ней SCL экрана.
UP-ну темку. Человеки, ну подскажите что-нибудь дельное.
Идея опроса состония нравится больше. Как реализовать?
Благодарю, завтра проверю и отпишусь о результатах. Сегодня никак- д\р сына))
Доброго всем.
Этот код не зашел- показывает толщину асфальта...
Есть еще идеи у кого-нибудь?
Всем доброго.
Все еще в поисках кода. Пробовал подставлять некие формулы для подсчета импульсов, но их не с чем увязать, т.к. все они для работы под прерываниями.
Может кто-нибудь подскажет формулу рассчета (применимо к нашим реалиям)? Код сам додумаю.
Этот код не зашел- показывает толщину асфальта...
а вы разобрались, как им пользоваться? - он ведь не обороты в минуту (секунду) выдает
Он считает время между импульсами. Но проблема в том, что считает несимметрично и при дальнейших рассчетах это запутывает...
Вы можете подсказать. как использовать этот код для достижения конечного результата?
Он считает время между импульсами. Но проблема в том, что считает несимметрично и при дальнейших рассчетах это запутывает...
Вы можете подсказать. как использовать этот код для достижения конечного результата?
что значит "несимметрично"?
А пользоваться - вам же автор кода писал "выбрать один полупериод, сделать серию измерений и успреднить"
Разнятся показания при "HIGH" и "LOW" при равной временной постоянной (хз почему).
Подскажите тогда предметно, что и как, плз.
перевод в обороты в минуту если миллис -1000/длинну периода*60секунд
если микрос - 1000000/длинну периода*60
это если 1 оборот= 1 периоду
коррекцию делать всеравно придется
незабываем что в коде не должно быть делей или длительных циклов, и возможно во время подсчета надо будет прерывать работу с дисплеем
перевод в обороты в минуту если миллис -1000/длинну периода*60секунд
если микрос - 1000000/длинну периода*60
это если 1 оборот= 1 периоду
коррекцию делать всеравно придется
незабываем что в коде не должно быть делей или длительных циклов, и возможно во время подсчета надо будет прерывать работу с дисплеем
Как теперь прикрутить сюда формулу, возвращающую значение об/мин?
Сорри за длинную "хотелку". Просто я в программировании дальше "Бейсика" пока еще не продвинулся, сейчас помалу изучаю "С++". Но тахометр необходим уже сейчас...
Ну какбы ИДЕ ардуино от бейсика не отличается, все различие в том что вместо Then применены чкобки { и }
obor=1000/(Tpper*кол-во импульсов за оборот)*60
Ну какбы ИДЕ ардуино от бейсика не отличается, все различие в том что вместо Then применены чкобки { и }
obor=1000/(Tpper*кол-во импульсов за оборот)*60
Я бы не сказал. Отличия ест, достаточно существенные. Хотя и похожего немало.
"1000" это миллисекунды?
да
Нечто получилось, считает кратно 60. Минусы- при запуске выдает заоблачное значение и после остановки вала индицирует последние зафиксированные обороты. Нужен допилинг.
obor каким типом данных объявлен? сколько импульсов на оборот? ибо формула легко упрощается
и лучше микрос использовать а не миллис
Unsigned long. 1 имп/обор.
Как сменить кратность с 60 на 5?
obor=60000/Tpper
и применить микрос вместо миллис
будет obor=60000000/Tpper
может так
Как сменить кратность с 60 на 5?
сделать 12 импульсов на оборот
Как сменить кратность с 60 на 5?
сделать 12 импульсов на оборот
Тогда, имхо, показания будут завышаться. И я не так выразился- нменить надо дискретность ака частоту выборки.
дак и делить на 12
дак и делить на 12
Смысл?
Нечто получилось, считает кратно 60.
код выложите того "нечто", что получилось. Там не должно быть никакой "кратности" - ни на 60, ни на 5...
Нечто получилось, считает кратно 60.
код выложите того "нечто", что получилось. Там не должно быть никакой "кратности" - ни на 60, ни на 5...
Вот что пока получилось. Обкатывал на ардуинке, чтобы можно было мониторить порт.
дак и делить на 12
Смысл?
Вот Евгений ответил во втором посте.
Ну так aaa=60000/Tpper что показывает?
будете в итоге измерять 1/12 оборота в секунду. И чтоб получить обороты в мин нужно будет не на 60 умножать , а на 5. Что и будет минимальной ценой деления.
Заменил данные в этой строке, умножил сумму полупериодов на 2 и вуаля! Обороты кажет точно.
Вопросы: как заставить считать только время замыкания (когда 0 на 12 ноге)? Имеется в виду время между последними замыканиями, размыкания игнорить. И как нулить показания, если сигнала нет?
будете в итоге измерять 1/12 оборота в секунду. И чтоб получить обороты в мин нужно будет не на 60 умножать , а на 5. Что и будет минимальной ценой деления.
С поправкой это теперь не требуется, цена деления стала 1.
Только лучше не умножать на 2, а 30000/Tpper
По поводу запоминания оборотов
В строке 25 и 26 сдлать bbb=millis()
Между 31 и 32
ссс=миллис-bbb
Если ссс больше предельного (сам придумай сколько) тогда ааа равно нулю.
Как-то так.
Не, так муть получается. После первого импульса прога начинает жить своей жизнью.
вы же вроде только нижний полупериод на 2 умножили, так попробуйте
Так где скетч?
вы же вроде только нижний полупериод на 2 умножили, так попробуйте
Упс... Точно. Сейчас исправлю.
В 30 строке убрать умножить на 2
В 33 строке скобки поставить {aaa=0;}
Так вроде работает. Точность увеличивается со временем.
Вы правила умножения то вспомните класс третий наверное, какие скобки, их в любом порядке перемножать можно.
Так вроде работает. Точность увеличивается со временем.
А теперь когда-то уже писал выше надо миллис заменит на микрос и вместо 30000 поставить 30000000
И в 36 строке не 200 а 200000
При старте выдает 1972. К чему бы это?)) Далее работает более-менее, но при пропадании импульсов не обнуляется- держит последнее значение.
Писал же в строке 36 исправить надо.