Счетчик на светодиод

Advan
Advan аватар
Offline
Зарегистрирован: 20.09.2018

Всем здравия! Есть поступающий периодический сигнал 5В на ногу ардуино-нано нужно включать светодиод при частоте сигнала больше 5 Гц 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Можете включать - разрешаем !

Курите в сторону pulseIn()

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

Advan пишет:

нужно включать светодиод при частоте сигнала больше 5 Гц 

Ну, нужно, так включайте.

От нас-то чего надо?

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

Komandir пишет:

Курите в сторону pulseIn()

Да, проще взять готовый частотомер от dimax, но ТС ведь не сказал ничего, так что ХЗ

Pyotr
Offline
Зарегистрирован: 12.03.2014

Advan пишет:

Всем здравия! Есть поступающий периодический сигнал 5В на ногу ардуино-нано нужно включать светодиод при частоте сигнала больше 5 Гц 

А выключать когда?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Pyotr пишет:

Advan пишет:

Всем здравия! Есть поступающий периодический сигнал 5В на ногу ардуино-нано нужно включать светодиод при частоте сигнала больше 5 Гц 

А выключать когда?

когда меньше повидимому ...
С ТС 320,83= если всё по чесноку )))

volatile unsigned int int_tic = 0;
volatile unsigned long tic;

void setup() {
  TCCR1A = 0; TIMSK1 = 1 << TOIE1; //прерывание по переполнению
  pinMode (LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  pinMode (5, INPUT); // вход сигнала T1 (only для atmega328)
}

ISR (TIMER1_OVF_vect) {
  int_tic++;
}

void loop() {
  TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактировани от входа Т1
  delay(1000);
  TCCR1B = 0;
  tic = ((uint32_t)int_tic << 16) | TCNT1; //сложить что натикало
  if (tic >= 5)
  { digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
  int_tic = 0; TCNT1 = 0;
}

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

ua6em пишет:

когда меньше повидимому ...
С ТС 320,83= если всё по чесноку )))

 

Что меньше понятно... непонятно чего меньше))

320 - водка чтоль по акции?))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Pyotr пишет:

320 - водка чтоль по акции?))

там и копейки, нет, это расчет по времени затраченном на скетч )))

PS подумалось, как Скиф за доширак работает? это надо быть очень крутым программистом видимо

Upper
Offline
Зарегистрирован: 23.06.2020

А если он выставит вам счет по времени затраченному на понимание вашего скетча, то вы окажетесь в минусе. (Это шутка).

b707
Offline
Зарегистрирован: 26.05.2017

Upper пишет:

А если он выставит вам счет по времени затраченному на понимание вашего скетча, то вы окажетесь в минусе. (Это шутка).

разве кто-то ставил задачу понятности скетча? - еще и со штрафом? :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Upper пишет:

А если он выставит вам счет по времени затраченному на понимание вашего скетча, то вы окажетесь в минусе. (Это шутка).

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

Advan
Advan аватар
Offline
Зарегистрирован: 20.09.2018

Попытаюсь запустить может и получится но delay от туда нужно подстереть

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Advan пишет:

Попытаюсь запустить может и получится но delay от туда нужно подстереть

если сможешь, это тайминг, если точность не нужна можно переделать в стиле ардуино, но не нужно

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

Advan пишет:

Попытаюсь запустить может и получится но delay от туда нужно подстереть

Зачем? Он же там время замера определяет.

Upper
Offline
Зарегистрирован: 23.06.2020

ua6em пишет:

... если точность не нужна ...

С точностью в приведенном в #5 алгоритме не все хорошо. Считаются передние фронты, и полагается, что количество фронтов равно количеству полных периодов, но это не так. Приведенный алгоритм будет в среднем выдавать признак превышения начиная от 4,5 Гц (в худшем теоретическом случае от чуть больше 4 Гц).

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Upper пишет:

ua6em пишет:

... если точность не нужна ...

С точностью в приведенном в #5 алгоритме не все хорошо. Считаются передние фронты, и полагается, что количество фронтов равно количеству полных периодов, но это не так. Приведенный алгоритм будет в среднем выдавать признак превышения начиная от 4,5 Гц (в худшем теоретическом случае от чуть больше 4 Гц).

для индикатора точность в 25 процентов не важна и то это только на низких частотах, на 50 герцах уже 2.5%, а на 500 - 0,25, что вполне, тут сам мерный отрезок неточен (да и зачем все эти точности индикатору)
PS да и ему надо индицировать превышение, то-есть мгновенную частоту, а с этим там как раз норм

PPS хотим точности - шестерня+ датчик ДПКВ, темы трутся тут уже много времени

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Без delay()
PS не проверял
 

volatile unsigned int int_tic = 0;
volatile unsigned long tic;
volatile unsigned long  old_millis;

void setup() {
  TCCR1A = 0; TIMSK1 = 1 << TOIE1; //прерывание по переполнению
  pinMode (LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  pinMode (5, INPUT); // вход сигнала T1 (only для atmega328)
  old_millis = millis();
}

ISR (TIMER1_OVF_vect) {
  int_tic++;
}

void loop() {
  if (millis() - old_millis >= 1000) {
    TCCR1B = 0;
    tic = ((uint32_t)int_tic << 16) | TCNT1; //сложить что натикало
    if (tic >= 5)
    { digitalWrite(LED_BUILTIN, HIGH);
    } else {
      digitalWrite(LED_BUILTIN, LOW);
    }
    int_tic = 0; TCNT1 = 0;
    TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактировани от входа Т1
    old_millis = millis();
  }

  // USER PROGRAM
}

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ua6em а первую секунду по что обидели ?

ИМХО измеряя длительность импульса можно получать более отзывчивую систему

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

для индикатора точность в 25 процентов не важна и то это только на низких частотах, на 50 герцах уже 2.5%, а на 500 - 0,25, что вполне, тут сам мерный отрезок неточен (да и зачем все эти точности индикатору)

Ну, по-хорошему, прежде, чем приниматься за программирование, следует проанализировать задачу.

В данной задаче диапазон чисел, представляющих интерес, очень узок: от 5 Гц до 5 Гц. А говорить о какой-либо точности за пределами этого диапазона - нонсенс.

Далее: частоту можно измерить двумя способами:

1. Подсчитать количество импульсов за какой-либо интервал времени.

2. Измерить длительность периода.

При этом "какой-либо интервал" также должен быть оптимизирован под решаемую задачу. Если речь идет о цифровой индикации, этот интервал обычно берется 0.5 секунды. Если нам нужно индицировать пиковое значение - интервал существенно сокращается. Но выбор в качестве такого интервала 1 с представляется не очень удачным.

Теперь - что именно измерять? Для оценки берем допустимый интервал измерений (скажем, 0.5с, что соответствует 2 Гц) и максимальную частоту, которую позволяет измерить аппаратура (в данном случае 8 МГц - 125 нс), и берем от них среднее геометрическое, которое в данном случае составляет 4 кГц (250мкс). Если наш диапазон частот лежит ниже этого значения - целесообразнее измерять период, а если выше - количество импульсов. В приведенном случае, естественно, удобнее измерять период. Ну а дальше, исходя из конкретных потребностей (среднее или пиковое значение), мы либо должны усреднять по нескольким измерениям, либо нет.

Но, естественно, это все досужие рассуждения, т.к. цена за задачу в $5 предполагает, что полный цикл разработки (начиная с анализа и проектирования) не производится, а берется уже готовое решение, которое минимально удовлетворяет критериям задачи.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

Но, естественно, это все досужие рассуждения, т.к. цена за задачу в $5 предполагает, что полный цикл разработки (начиная с анализа и проектирования) не производится, а берется уже готовое решение, которое минимально удовлетворяет критериям задачи.

А вот тут вы правы, решение подсказал ЕвгенийП, да и я этот код использую в качестве ИНДИКАТОРНОГО уже давно )))

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Komandir пишет:

ua6em а первую секунду по что обидели ?

ИМХО измеряя длительность импульса можно получать более отзывчивую систему

а это упрощения кода ради и дальнейшего разговора для, пятница жеж )))

Advan
Advan аватар
Offline
Зарегистрирован: 20.09.2018

Где ошибка незнаю.

void setup() {

#include <TimerOne.h>

#include <Wire.h>

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);



//////////////////schetchik//////////////////

volatile unsigned int int_tic = 0;
volatile unsigned long tic;
volatile unsigned long  old_millis;

//////////////////schetchik//////////////////

void setup()
{
  { 
    TCCR1A = 0; TIMSK1 = 1 << TOIE1; //прерывание по переполнению
  pinMode (LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  pinMode (5, INPUT); // вход сигнала T1 (only для atmega328)
  old_millis = millis();
}

ISR (TIMER1_OVF_vect) {
  int_tic++ ;
}


  lcd.init();                        
  lcd.backlight();                 
  lcd.setCursor(0,0);              
  lcd.print("Sr");       
  lcd.setCursor(0,1);              
  lcd.print("Start");       

delay (1000);

    lcd.setCursor(0,0);              
  lcd.print("          ");       
  lcd.setCursor(0,1);              
  lcd.print("          ");       
  
 

  Serial.begin(9600);
  pinMode(10, OUTPUT); 


  lcd.init();                        
  lcd.backlight();                 
  lcd.setCursor(0,0);              
  lcd.print("Sr");       
  lcd.setCursor(0,1);              
  lcd.print("Start");      

delay (1000);

    lcd.setCursor(0,0);              
  lcd.print("          ");       
  lcd.setCursor(0,1);              
  lcd.print("          ");     

}

void loop()  {
  
  if (millis() - old_millis >= 1000) {
    TCCR1B = 0;
    tic = ((uint32_t)int_tic << 16) | TCNT1; //сложить что натикало
    if (tic >= 5)
    { digitalWrite(LED_BUILTIN, HIGH);
    } else {
      digitalWrite(LED_BUILTIN, LOW);
    }
    int_tic = 0; TCNT1 = 0;
    TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактировани от входа Т1
    old_millis = millis();
  }
lcd.clear();

}

 

Дим-мычъ
Offline
Зарегистрирован: 20.03.2021

Круто написано! Два сетапа!

b707
Offline
Зарегистрирован: 26.05.2017

и куча незакрытых скобок

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

да уж...дисплей то тебе зачем?  в задании был светодиод

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Хотел доброе дело сделать - отформатировать скетч, убрать все лишнее (не разбираясь в алгоритме) и понял что там еще очень дофига не хватает ))))

#include <TimerOne.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define LED_BUILTIN 13                // ЭТО УЖЕ Я (BOOM) ДОБАВИЛ, ТАК КАК В КОДЕ ИСПОЛЬЗУЕТСЯ

LiquidCrystal_I2C lcd(0x27, 16, 2);

//////////////////schetchik//////////////////

volatile unsigned int  int_tic = 0;
volatile unsigned long tic;
volatile unsigned long old_millis;

//////////////////schetchik//////////////////

void setup() {

  TCCR1A = 0; TIMSK1 = 1 << TOIE1; //прерывание по переполнению
  pinMode (LED_BUILTIN, OUTPUT);
  pinMode (5, INPUT); // вход сигнала T1 (only для atmega328)
  pinMode (10, OUTPUT);

  digitalWrite(LED_BUILTIN, LOW);

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Sr");
  lcd.setCursor(0, 1);
  lcd.print("Start");

  delay (1000);

  lcd.setCursor(0, 0);
  lcd.print("          ");
  lcd.setCursor(0, 1);
  lcd.print("          ");
}

ISR (TIMER1_OVF_vect) {
  int_tic++ ;
}

void loop()  {

  if (millis() - old_millis >= 1000) {
    TCCR1B = 0;
    tic = ((uint32_t)int_tic << 16) | TCNT1; //сложить что натикало
    if (tic >= 5) {
      digitalWrite(LED_BUILTIN, HIGH);
    } else {
      digitalWrite(LED_BUILTIN, LOW);
    }
    int_tic = 0; 
    TCNT1 = 0;
    TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактировани от входа Т1
    old_millis = millis();
  }
  lcd.clear();
}

Спи#енное - перепи#енное и хз кто и как "сращивал".... )))

Green
Offline
Зарегистрирован: 01.10.2015

За 3 года уж можно было бы и форматирование освоить, и копирование ошибок на форум... Ужос.(

Pyotr
Offline
Зарегистрирован: 12.03.2014

Надеюсь ТС понимает, что представленный выше код делает задержку более 1 сек с момента начала измерения, до момента реакции на это измерение.

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

Upper
Offline
Зарегистрирован: 23.06.2020

Pyotr пишет:

Надеюсь ТС понимает ...

По коду видно, что ТС почти не разбирается в предмете.

Advan
Advan аватар
Offline
Зарегистрирован: 20.09.2018

BOOM пишет:

Хотел доброе дело сделать - отформатировать скетч, убрать все лишнее (не разбираясь в алгоритме) и понял что там еще очень дофига не хватает ))))

#include <TimerOne.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define LED_BUILTIN 13                // ЭТО УЖЕ Я (BOOM) ДОБАВИЛ, ТАК КАК В КОДЕ ИСПОЛЬЗУЕТСЯ

LiquidCrystal_I2C lcd(0x27, 16, 2);

//////////////////schetchik//////////////////

volatile unsigned int  int_tic = 0;
volatile unsigned long tic;
volatile unsigned long old_millis;

//////////////////schetchik//////////////////

void setup() {

  TCCR1A = 0; TIMSK1 = 1 << TOIE1; //прерывание по переполнению
  pinMode (LED_BUILTIN, OUTPUT);
  pinMode (5, INPUT); // вход сигнала T1 (only для atmega328)
  pinMode (10, OUTPUT);

  digitalWrite(LED_BUILTIN, LOW);

  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Sr");
  lcd.setCursor(0, 1);
  lcd.print("Start");

  delay (1000);

  lcd.setCursor(0, 0);
  lcd.print("          ");
  lcd.setCursor(0, 1);
  lcd.print("          ");
}

ISR (TIMER1_OVF_vect) {
  int_tic++ ;
}

void loop()  {

  if (millis() - old_millis >= 1000) {
    TCCR1B = 0;
    tic = ((uint32_t)int_tic << 16) | TCNT1; //сложить что натикало
    if (tic >= 5) {
      digitalWrite(LED_BUILTIN, HIGH);
    } else {
      digitalWrite(LED_BUILTIN, LOW);
    }
    int_tic = 0; 
    TCNT1 = 0;
    TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактировани от входа Т1
    old_millis = millis();
  }
  lcd.clear();
}

Спи#енное - перепи#енное и хз кто и как "сращивал".... )))

Ардуино ИДЕ компиляторо выдает ошибку - Arduino: 1.8.13 , Плата:"Arduino Nano, ATmega168"

 
libraries\TimerOne\TimerOne.cpp.o (symbol from plugin): In function `TimerOne::isrDefaultUnused()':
 
(.text+0x0): multiple definition of `__vector_13'
 
sketch\sketch_nov13c.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here
 
collect2.exe: error: ld returned 1 exit status
 
exit status 1
 
Ошибка компиляции для платы Arduino Nano.
 
 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Advan пишет:

Ардуино ИДЕ компиляторо выдает ошибку - Arduino: 1.8.13 , Плата:"Arduino Nano, ATmega168"
libraries\TimerOne\TimerOne.cpp.o (symbol from plugin): In function `TimerOne::isrDefaultUnused()':

а это там зачем? - TimerOne, советская власть разрешила только одну жену )))

Advan
Advan аватар
Offline
Зарегистрирован: 20.09.2018

Дим-мычъ пишет:

Круто написано! Два сетапа!

Да сам удивился)

Advan
Advan аватар
Offline
Зарегистрирован: 20.09.2018

Pyotr пишет:

Надеюсь ТС понимает, что представленный выше код делает задержку более 1 сек с момента начала измерения, до момента реакции на это измерение.

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

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Advan пишет:

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

int pin = 7;

unsigned long duration;
unsigned long duration1;
unsigned long duration2;

void setup()
{
  pinMode(pin, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop()
{
  duration1 = pulseIn(pin, HIGH);
  duration2 = pulseIn(pin, LOW);
  duration = (duration1 + duration2) / 2;
  if (duration <= 200000) {
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Терзают меня смутные сомнения...)

Мне конешн пока не ведомо состояние "скучающего пенсионера")), но пусть ТС хоть что-то сам напишет. 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Pyotr пишет:

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

1. Ловим момент переднего фронта импульса и засекаем время_1 через micros()
2. Ловим передний фронт следующего импульса и засекаем время_2
3. Разность время_2 и время_1 сравниваем с 200 мс и управляем лед.
4. время_1 = время_2 и снова ловим передний фронт.

Pyotr
Offline
Зарегистрирован: 12.03.2014

Вот подсказка. Можно и по другому

word tcnt1;
void setup() {
  TCCR1B = (1 << CS10) | (1 << CS11) | (1 << CS12); //тактировани от входа Т1
  tcnt1 = TCNT1;
  while(tcnt1 == TCNT1); //ждем импульс 
  time_1 = micros();
  tcnt1 = TCNT1;
}
void loop() {
  if(tcnt1 != TCNT1){//если пришел импульс
	 ...... 
  }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Pyotr пишет:

Терзают меня смутные сомнения...)

Мне конешн пока не ведомо состояние "скучающего пенсионера")), но пусть ТС хоть что-то сам напишет. 

да я IBUS два дня пытаю, надо жеж развеяться

Advan
Advan аватар
Offline
Зарегистрирован: 20.09.2018

Желающие помочь напишите ваши имейлы и стоимость за помощь

Advan
Advan аватар
Offline
Зарегистрирован: 20.09.2018

ua6em пишет:

Advan пишет:

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

int pin = 7;

unsigned long duration;
unsigned long duration1;
unsigned long duration2;

void setup()
{
  pinMode(pin, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop()
{
  duration1 = pulseIn(pin, HIGH);
  duration2 = pulseIn(pin, LOW);
  duration = (duration1 + duration2) / 2;
  if (duration <= 200000) {
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

 

 if (duration <= 200000) {

Будет ли это тормозить или влиять на остальную часть программы  если дальше в void loop после данного счетчика будет код генерации шим сигнала?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Advan пишет:

 if (duration <= 200000) {

Будет ли это тормозить или влиять на остальную часть программы  если дальше в void loop после данного счетчика будет код генерации шим сигнала?

не знаю, я pulsein не использовал никогда

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ua6em пишет:

int pin = 7;


unsigned long duration;
unsigned long duration1;
unsigned long duration2;

void setup()
{
  pinMode(pin, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop()
{
  duration1 = pulseIn(pin, HIGH);
  duration2 = pulseIn(pin, LOW);
  duration = (duration1 + duration2) / 2;
  if (duration <= 200000) {
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}

 

Вы не учли кое чего:

pulseIn пишет:

Возвращаемое значение

Длина сигнала в микросекундах или =>  0  <=, если сигнал не получен до истечения таймаута.

Pyotr
Offline
Зарегистрирован: 12.03.2014

Advan, что это за проект? или задание?

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

Advan пишет:

Желающие помочь напишите ваши имейлы и стоимость за помощь

Неадекватное место для таких просьб. Очень многие завсегдатаи коммерческого раздела в другие никогда не заглядывают. Разместите хотелку там - скорее ответ получите.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Komandir пишет:

Возвращаемое значение

Длина сигнала в микросекундах или =>  0  <=, если сигнал не получен до истечения таймаута.

таймаут 1 секунда, холостые порядка 800 -1000 об/сек, ТС говорит о 300, думаю пойдёт

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

 порядка 800 -1000 об/сек,

Что, правда?

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

ua6em а при полном отсутствии оборотов ваш скетч что покажет на выходе ? - что их больше 5 !

Pyotr
Offline
Зарегистрирован: 12.03.2014

andriano пишет:

ua6em пишет:

 порядка 800 -1000 об/сек,

Что, правда?

Никак не меньше)) иначе поршень на орбиту Земли не выйдет))

SLKH
Offline
Зарегистрирован: 17.08.2015

Pyotr пишет:

Pyotr пишет:

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

1. Ловим момент переднего фронта импульса и засекаем время_1 через micros()
2. Ловим передний фронт следующего импульса и засекаем время_2
3. Разность время_2 и время_1 сравниваем с 200 мс и управляем лед.

Угу.

Время было <200, диод зажгли. Горит.

Цитата:
4. время_1 = время_2 и снова ловим передний фронт.
Ловим - а его нет, "что-то пошло не так". А диод продолжает нам светить частоту больше пороговой. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

ua6em пишет:

 порядка 800 -1000 об/сек,

Что, правда?

нет конечно, последствия ковида однако...как там в анекдоте было, утром проснулся - алфавит подписал, в минуту естественно, но уже не вырубишь топором исправить

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

SLKH пишет:

Ловим - а его нет, "что-то пошло не так". А диод продолжает нам светить частоту больше пороговой. 

Задача для олимпиады по сути, (0+0)/2  будет ноль однако, то есть на pulseIn(); пойдёт, но надо поправить условие )))

unsigned long duration;
unsigned long duration1;
unsigned long duration2;

void setup()
{
  pinMode(pin, INPUT);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop()
{
  duration1 = pulseIn(pin, HIGH);
  duration2 = pulseIn(pin, LOW);
  duration = (duration1 + duration2) / 2;
  if (duration1>0&&duration2 >0&& duration<= 200000) {
    digitalWrite(LED_BUILTIN, HIGH);
  } else {
    digitalWrite(LED_BUILTIN, LOW);
  }
}