Нужна помощь по тахометру на Digispark-е

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Вечер в хату, уважаемые!

Я тут первоход, еще особо не освоился, так что не грузите сильно.

Суть вопроса: заморочался сборкой счетчика на 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); // Нуу, чтобы руки не дрожали. (с) Кардан.
}              // Задержкой можно и поиграть (смотря какой датчик).
  

 

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

З.Ы. В Гугл не посылать- там все примеры на прерываниях, а у меня Digispark. На Nano делать не хочу- было уже, габариты не устроили.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

У Digispark отсутствуют прерывания ?

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Без понятия. Я не в курсе, работают ли прерывания вообще и как на этой платформе с ними работать. Нюансов много.

Да и не нужно это, раз датчик работает напрямую с контроллером.

Я и вопрос нарисовал, чтобы какие-то ответы получить, а не вопросы в ответку.

З.Ы. Пробовал прикрутить кусок кода от Arduino (тот, в котором формула)- не получилось увязать с моим, т.к. разные способы получения данных и их обработки... 

 

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

Внешнее прерывание int0 у спарка так же на ноге 2 как у ардуино, так что примеры должны подойти

evgta
Offline
Зарегистрирован: 02.09.2016

Гопнег пишет:

UP-ну темку. Человеки, ну подскажите что-нибудь дельное.

Воспользоваться pulseIn сделать несколько замеров для усреднения.

Такой вариант пойдёт? Правда он может влиять на другие действия.

Ещё вариант опрос в лупе пина и замер времени между сменами состояния пина.

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

evgta пишет:
Ещё вариант опрос в лупе пина

все таки лучше опрос по внешнему прерыванию и далее

evgta пишет:
замер времени между сменами состояния пина.

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

MaksVV пишет:
Внешнее прерывание int0 у спарка так же на ноге 2 как у ардуино, так что примеры должны подойти

У меня на ней SCL экрана.

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

evgta пишет:
Гопнег пишет:

UP-ну темку. Человеки, ну подскажите что-нибудь дельное.

Воспользоваться pulseIn сделать несколько замеров для усреднения. Такой вариант пойдёт? Правда он может влиять на другие действия. Ещё вариант опрос в лупе пина и замер времени между сменами состояния пина.

Идея опроса состония нравится больше. Как реализовать?

evgta
Offline
Зарегистрирован: 02.09.2016
Примерно так , высчитывать обороты из времени и выбирать 1 полупериод или оба я не буду, и на прерывании делается проще.

 

int dath= 2;


int xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long Tpper;
unsigned long aaa;

void setup() {
Serial.begin(9600);
pinMode(dath, INPUT);
}

void loop() {

if (digitalRead(dath)==HIGH &&xxx ==0){vr1=millis();xxx=1;}
if (digitalRead(dath)==LOW  &&xxx ==1){vr2=millis();xxx=0;}
if (xxx==1){Tpper=vr1-vr2;}  //считает верхний полупериод
if (xxx==0){Tpper=vr2-vr1;}   // считает нижний полупериод


Serial.println(Tpper);
}

 

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

evgta пишет:

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

 

int dath= 2;


int xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long Tpper;
unsigned long aaa;

void setup() {
Serial.begin(9600);
pinMode(dath, INPUT);
}

void loop() {

if (digitalRead(dath)==HIGH &&xxx ==0){vr1=millis();xxx=1;}
if (digitalRead(dath)==LOW  &&xxx ==1){vr2=millis();xxx=0;}
if (xxx==1){Tpper=vr1-vr2;}  //считает верхний полупериод
if (xxx==0){Tpper=vr2-vr1;}   // считает нижний полупериод


Serial.println(Tpper);
}

 

Благодарю, завтра проверю и отпишусь о результатах. Сегодня никак- д\р сына))

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Доброго всем.

Этот код не зашел- показывает толщину асфальта...

Есть еще идеи у кого-нибудь?

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Всем доброго.

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

Может кто-нибудь подскажет формулу рассчета (применимо к нашим реалиям)? Код сам додумаю.

b707
Онлайн
Зарегистрирован: 26.05.2017

Гопнег пишет:

Этот код не зашел- показывает толщину асфальта...

 

а вы разобрались, как им пользоваться? - он ведь не обороты в минуту (секунду) выдает

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

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

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

b707
Онлайн
Зарегистрирован: 26.05.2017

Гопнег пишет:

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

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

что значит "несимметрично"?

А пользоваться - вам же автор кода писал "выбрать один полупериод, сделать серию измерений и успреднить"

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Разнятся показания при "HIGH" и "LOW" при равной временной постоянной (хз почему).

Подскажите тогда предметно, что и как, плз.

evgta
Offline
Зарегистрирован: 02.09.2016

перевод в обороты в минуту если миллис -1000/длинну периода*60секунд

если микрос - 1000000/длинну периода*60

это если 1 оборот= 1 периоду

коррекцию делать всеравно придется

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

 

int dath= 2;



int xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
unsigned long aaa;

void setup() {
Serial.begin(9600);
pinMode(dath, INPUT);
}

void loop() {

if (digitalRead(dath)==HIGH &&xxx ==0){vr1=millis();xxx=1;}
if (digitalRead(dath)==LOW  &&xxx ==1){vr2=millis();xxx=0;}
if (xxx==1){TpperUP=vr1-vr2;}  //считает верхний полупериод
if (xxx==0){TpperDOWN=vr2-vr1;}   // считает нижний полупериод
Tpper=TpperUP+TpperDOWN;

Serial.println(Tpper);
}

 

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

evgta пишет:

перевод в обороты в минуту если миллис -1000/длинну периода*60секунд

если микрос - 1000000/длинну периода*60

это если 1 оборот= 1 периоду

коррекцию делать всеравно придется

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

 

int dath= 2;



int xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
unsigned long aaa;

void setup() {
Serial.begin(9600);
pinMode(dath, INPUT);
}

void loop() {

if (digitalRead(dath)==HIGH &&xxx ==0){vr1=millis();xxx=1;}
if (digitalRead(dath)==LOW  &&xxx ==1){vr2=millis();xxx=0;}
if (xxx==1){TpperUP=vr1-vr2;}  //считает верхний полупериод
if (xxx==0){TpperDOWN=vr2-vr1;}   // считает нижний полупериод
Tpper=TpperUP+TpperDOWN;

Serial.println(Tpper);
}

 

Как теперь прикрутить сюда формулу, возвращающую значение об/мин?

Сорри за длинную "хотелку". Просто я в программировании дальше "Бейсика" пока еще не продвинулся, сейчас помалу изучаю "С++". Но тахометр необходим уже сейчас...

evgta
Offline
Зарегистрирован: 02.09.2016

Ну какбы ИДЕ ардуино от бейсика не отличается, все различие в том что вместо Then применены чкобки { и }

obor=1000/(Tpper*кол-во импульсов за оборот)*60

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

evgta пишет:

Ну какбы ИДЕ ардуино от бейсика не отличается, все различие в том что вместо Then применены чкобки { и }

obor=1000/(Tpper*кол-во импульсов за оборот)*60

Я бы не сказал. Отличия ест, достаточно существенные. Хотя и похожего немало.

"1000" это миллисекунды?

 

evgta
Offline
Зарегистрирован: 02.09.2016

да

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Нечто получилось, считает кратно 60. Минусы- при запуске выдает заоблачное значение и после остановки вала индицирует последние зафиксированные обороты. Нужен допилинг.

evgta
Offline
Зарегистрирован: 02.09.2016

obor каким типом данных объявлен? сколько импульсов на оборот? ибо формула легко упрощается

и лучше микрос использовать а не миллис

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Unsigned long. 1 имп/обор.

Как сменить кратность с 60 на 5?

evgta
Offline
Зарегистрирован: 02.09.2016

obor=60000/Tpper

и применить микрос вместо миллис 

будет obor=60000000/Tpper

 

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

Гопнег пишет:
после остановки вала индицирует последние зафиксированные обороты. 

может так 

int dath= 2;



int xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
unsigned long aaa;

int a, b = 0;

void setup() {
Serial.begin(9600);
pinMode(dath, INPUT);
}

void loop() {

if (digitalRead(dath)==HIGH &&xxx ==0){vr1=millis();xxx=1; a++;b=0;}
if (digitalRead(dath)==LOW  &&xxx ==1){vr2=millis();xxx=0; b++;a=0;}
if (xxx==1){TpperUP=vr1-vr2;}  //считает верхний полупериод
if (xxx==0){TpperDOWN=vr2-vr1;}   // считает нижний полупериод
Tpper=TpperUP+TpperDOWN;
if (a>20) a = 20; if (b>20) b=20; 
if (a>=10||b>=10) Tpper=0;
Serial.println(Tpper);
}

 

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

Гопнег пишет:

Как сменить кратность с 60 на 5?

сделать 12 импульсов на оборот

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

MaksVV пишет:

Гопнег пишет:

Как сменить кратность с 60 на 5?

сделать 12 импульсов на оборот

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

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

Гопнег пишет:
Тогда, имхо, показания будут завышаться.

дак и делить на 12

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

MaksVV пишет:

Гопнег пишет:
Тогда, имхо, показания будут завышаться.

дак и делить на 12

Смысл?

b707
Онлайн
Зарегистрирован: 26.05.2017

Гопнег пишет:

Нечто получилось, считает кратно 60.

код выложите того "нечто", что получилось. Там не должно быть никакой "кратности" - ни на 60, ни на 5...

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

b707 пишет:

Гопнег пишет:

Нечто получилось, считает кратно 60.

код выложите того "нечто", что получилось. Там не должно быть никакой "кратности" - ни на 60, ни на 5...

Вот что пока получилось. Обкатывал на ардуинке, чтобы можно было мониторить порт.

#include <OLED_I2C.h>
OLED myOLED(SDA, SCL, 8);
extern uint8_t MegaNumbers[];


int dath= 12;
int xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
unsigned long aaa;

void setup() {
Serial.begin(9600);
pinMode(dath, INPUT_PULLUP);
myOLED.begin();
  myOLED.setFont(MegaNumbers);
  myOLED.clrScr();


}
void loop() {
if (digitalRead(dath)==HIGH &&xxx ==0){vr1=millis();xxx=1;}
if (digitalRead(dath)==LOW  &&xxx ==1){vr2=millis();xxx=0;}
if (xxx==1){TpperUP=vr1-vr2;}  //считает верхний полупериод
if (xxx==0){TpperDOWN=vr2-vr1;}   // считает нижний полупериод
Tpper=TpperUP+TpperDOWN/2; // Пробовал и так...

aaa=1000/(Tpper)*60; // И так тоже...
    myOLED.printNumI((aaa), LEFT, 25);
    myOLED.update();
    //delay(100);
    myOLED.clrScr();

//Serial.println(aaa);
//delay(100);



}

 

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

Гопнег пишет:

MaksVV пишет:

Гопнег пишет:
Тогда, имхо, показания будут завышаться.

дак и делить на 12

Смысл?

Вот Евгений ответил во втором посте. 

evgta
Offline
Зарегистрирован: 02.09.2016

Ну так aaa=60000/Tpper что показывает?

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

будете в итоге измерять 1/12 оборота в секунду. И чтоб получить обороты в мин нужно будет не на 60 умножать , а на 5. Что и будет минимальной ценой деления. 

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Заменил данные в этой строке, умножил сумму полупериодов на 2 и вуаля! Обороты кажет точно.

Вопросы: как заставить считать только время замыкания (когда 0 на 12 ноге)? Имеется в виду время между последними замыканиями, размыкания игнорить. И как нулить показания, если сигнала нет?

#include <OLED_I2C.h>
OLED myOLED(SDA, SCL, 8);
extern uint8_t MegaNumbers[];


int dath= 12;
int xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
unsigned long aaa;

void setup() {
Serial.begin(9600);
pinMode(dath, INPUT_PULLUP);
myOLED.begin();
  myOLED.setFont(MegaNumbers);
  myOLED.clrScr();


}
void loop() {
if (digitalRead(dath)==HIGH &&xxx ==0){vr1=millis();xxx=1;}
if (digitalRead(dath)==LOW  &&xxx ==1){vr2=millis();xxx=0;}
if (xxx==1){TpperUP=vr1-vr2;}  //считает верхний полупериод
if (xxx==0){TpperDOWN=vr2-vr1;}   // считает нижний полупериод
Tpper=TpperUP+TpperDOWN*2; // Пробовал и так...

aaa=60000/Tpper; // И так тоже...
    myOLED.printNumI((aaa), LEFT, 25);
    myOLED.update();
    //delay(100);
    myOLED.clrScr();

//Serial.println(aaa);
//delay(100);



}

 

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

MaksVV пишет:

будете в итоге измерять 1/12 оборота в секунду. И чтоб получить обороты в мин нужно будет не на 60 умножать , а на 5. Что и будет минимальной ценой деления. 

С поправкой это теперь не требуется, цена деления стала 1.

evgta
Offline
Зарегистрирован: 02.09.2016

Только лучше не умножать на 2, а 30000/Tpper
По поводу запоминания оборотов
В строке 25 и 26 сдлать bbb=millis()
Между 31 и 32
ссс=миллис-bbb
Если ссс больше предельного (сам придумай сколько) тогда ааа равно нулю.
Как-то так.

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

evgta пишет:
Только лучше не умножать на 2, а 30000/Tpper По поводу запоминания оборотов В строке 25 и 26 сдлать bbb=millis() Между 31 и 32 ссс=миллис-bbb Если ссс больше предельного (сам придумай сколько) тогда ааа равно нулю. Как-то так.

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

MaksVV
Онлайн
Зарегистрирован: 06.08.2015

вы же вроде только нижний полупериод на 2 умножили, так попробуйте

#include <OLED_I2C.h>
OLED myOLED(SDA, SCL, 8);
extern uint8_t MegaNumbers[];


int dath= 12;
int xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
unsigned long aaa;
unsigned long bbb;

void setup() {
Serial.begin(9600);
pinMode(dath, INPUT_PULLUP);
myOLED.begin();
  myOLED.setFont(MegaNumbers);
  myOLED.clrScr();


}
void loop() {
if (digitalRead(dath)==HIGH &&xxx ==0){vr1=millis();xxx=1; bbb=vr1;}
if (digitalRead(dath)==LOW  &&xxx ==1){vr2=millis();xxx=0; bbb=vr2;}
if (xxx==1){TpperUP=vr1-vr2;}  //считает верхний полупериод
if (xxx==0){TpperDOWN=vr2-vr1;}   // считает нижний полупериод
Tpper=(TpperUP+TpperDOWN)*2; // Пробовал и так...

aaa=30000/Tpper; // И так тоже...
if (millis() - bbb>200) aaa = 0;

    myOLED.printNumI((aaa), LEFT, 25);
    myOLED.update();
    //delay(100);
    myOLED.clrScr();

//Serial.println(aaa);
//delay(100);



}

 

evgta
Offline
Зарегистрирован: 02.09.2016

Так где скетч?

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

MaksVV пишет:

вы же вроде только нижний полупериод на 2 умножили, так попробуйте

#include <OLED_I2C.h>
OLED myOLED(SDA, SCL, 8);
extern uint8_t MegaNumbers[];


int dath= 12;
int xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
unsigned long aaa;
unsigned long bbb;

void setup() {
Serial.begin(9600);
pinMode(dath, INPUT_PULLUP);
myOLED.begin();
  myOLED.setFont(MegaNumbers);
  myOLED.clrScr();


}
void loop() {
if (digitalRead(dath)==HIGH &&xxx ==0){vr1=millis();xxx=1; bbb=vr1;}
if (digitalRead(dath)==LOW  &&xxx ==1){vr2=millis();xxx=0; bbb=vr2;}
if (xxx==1){TpperUP=vr1-vr2;}  //считает верхний полупериод
if (xxx==0){TpperDOWN=vr2-vr1;}   // считает нижний полупериод
Tpper=(TpperUP+TpperDOWN)*2; // Пробовал и так...

aaa=30000/Tpper; // И так тоже...
if (millis() - bbb>200) aaa = 0;

    myOLED.printNumI((aaa), LEFT, 25);
    myOLED.update();
    //delay(100);
    myOLED.clrScr();

//Serial.println(aaa);
//delay(100);



}

 

Упс... Точно. Сейчас исправлю.

evgta
Offline
Зарегистрирован: 02.09.2016

В 30 строке убрать умножить на 2
В 33 строке скобки поставить {aaa=0;}

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017
#include <OLED_I2C.h>
OLED myOLED(SDA, SCL, 8);
extern uint8_t MegaNumbers[];


int dath= 12;
int xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
int aaa = 0;
unsigned long bbb;
unsigned long ccc;

void setup() {
Serial.begin(9600);
pinMode(dath, INPUT_PULLUP);
myOLED.begin();
  myOLED.setFont(MegaNumbers);
  myOLED.clrScr();


}
void loop() {
if (digitalRead(dath)==HIGH &&xxx ==0){vr1=millis();xxx=1;}
if (digitalRead(dath)==LOW  &&xxx ==1){vr2=millis();xxx=0;}
bbb = millis();
if (xxx==1){TpperUP=vr1-vr2;}  //считает верхний полупериод
if (xxx==0){TpperDOWN=vr2-vr1;}   // считает нижний полупериод
Tpper=(TpperUP+TpperDOWN)*2; // Пробовал и так...
//ccc = millis - bbb;

aaa=60000/Tpper;
if (millis() - bbb>200) aaa = 0;

    myOLED.clrScr();
    myOLED.printNumI((aaa), LEFT, 25);
    myOLED.update();
    myOLED.clrScr();
    
//Serial.println(aaa);
//delay(100);



}

 

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

Так вроде работает. Точность увеличивается со временем.

evgta
Offline
Зарегистрирован: 02.09.2016

Вы правила умножения то вспомните класс третий наверное, какие скобки, их в любом порядке перемножать можно.

evgta
Offline
Зарегистрирован: 02.09.2016

Гопнег пишет:

Так вроде работает. Точность увеличивается со временем.


А теперь когда-то уже писал выше надо миллис заменит на микрос и вместо 30000 поставить 30000000

И в 36 строке не 200 а 200000

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017
#include <OLED_I2C.h>
OLED myOLED(SDA, SCL, 8);
extern uint8_t MegaNumbers[];


int dath= 12;
int xxx=0;
unsigned long vr1;
unsigned long vr2;
unsigned long TpperUP;
unsigned long TpperDOWN;
unsigned long Tpper;
int aaa = 0;
unsigned long bbb;
unsigned long ccc;

void setup() {
Serial.begin(9600);
pinMode(dath, INPUT_PULLUP);
myOLED.begin();
  myOLED.setFont(MegaNumbers);
  myOLED.clrScr();


}
void loop() {
if (digitalRead(dath)==HIGH &&xxx ==0){vr1=micros();xxx=1;}
if (digitalRead(dath)==LOW  &&xxx ==1){vr2=micros();xxx=0;}
bbb = micros();
if (xxx==1){TpperUP=vr1-vr2;}  //считает верхний полупериод
if (xxx==0){TpperDOWN=vr2-vr1;}   // считает нижний полупериод
Tpper=(TpperUP+TpperDOWN)*2; // Пробовал и так...
//ccc = millis - bbb;

aaa=60000000/Tpper;
if (micros() - bbb>200000) aaa = 0;

    myOLED.clrScr();
    myOLED.printNumI((aaa), LEFT, 25);
    myOLED.update();
    myOLED.clrScr();
    
Serial.println(aaa);
//delay(100);



}

 

Гопнег
Гопнег аватар
Offline
Зарегистрирован: 24.11.2017

При старте выдает 1972. К чему бы это?)) Далее работает более-менее, но при пропадании импульсов не обнуляется- держит последнее значение.

evgta
Offline
Зарегистрирован: 02.09.2016

Писал же в строке 36 исправить надо.