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

мне не надо, автору ветки найди :slight_smile:

да не злись))
есть же

/**
 * Обработчик прерываний группы PCINT2 в которую входят
*  Port D pins 0 - 7.
 */
ISR(PCINT2_vect) {

}

разве я злюсь? даже смайл вставил.

Конечно, можно сделать и на PCINT. Но это точно не для ТС.

Индикатор только не те цифры показывает. В мониторе ,примерно, 365 км/ч, а на фото с индикатором набор цифр.

«The Show Must Go On»

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

Спасибо Всем за помощь. Отдельное спасибо BABOS.

не уверен, но может это то что нужно

#include <TM1637.h>

#define CLK 2
#define DIO 3
#define BUZ_PIN 9
#define POT_PIN A0
#define PULSE_PIN 5

// Настройте это значение по реальному датчику!
// Пример: если датчик дает 1 импульс на 10 см, то PULSES_PER_METER = 10
#define PULSES_PER_METER 10.0

// Фильтр от дребезга (минимальный интервал между импульсами в микросекундах)
#define DEBOUNCE_TIME 1000  // 1 мс

TM1637 tm1637(CLK, DIO);

// Для антидребезга
volatile unsigned long last_interrupt_time = 0;
volatile unsigned long pulse_count = 0;

void countPulse() {
  unsigned long current_time = micros();
  
  // Фильтр от дребезга и помех
  if (current_time - last_interrupt_time > DEBOUNCE_TIME) {
    pulse_count++;
    last_interrupt_time = current_time;
    digitalWrite(13, !digitalRead(13));  // Мигаем для отладки
  }
}

void setup() {
  Serial.begin(9600);
  Serial.println("=== ВЕЛОСПИДОМЕТР с защитой от помех ===");
  
  pinMode(13, OUTPUT);
  digitalWrite(13, LOW);
  
  tm1637.init();
  tm1637.set(6);
  
  // Отключаем зуммер на время инициализации
  noTone(BUZ_PIN);
  
  pinMode(PULSE_PIN, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(PULSE_PIN), countPulse, FALLING); // Попробуйте FALLING
  
  // Показываем "0.00" на дисплее
  tm1637.display(0, 0);
  tm1637.display(1, 0);
  tm1637.point(true);
  tm1637.display(2, 0);
  tm1637.display(3, 0);
  
  Serial.println("Готов к работе. Вращайте колесо для теста.");
}

void loop() {
  static unsigned long last_calc = 0;
  static unsigned long last_display = 0;
  
  // 1. ГЕНЕРАЦИЯ ТОНА (ВКЛЮЧИТЬ ТОЛЬКО ПОСЛЕ ТЕСТА!)
  // ЗАКОММЕНТИРУЙТЕ эту строку для теста без помех:
  // int hz = analogRead(POT_PIN);
  // tone(BUZ_PIN, hz);
  
  // 2. РАСЧЕТ СКОРОСТИ КАЖДУЮ СЕКУНДУ
  if (millis() - last_calc >= 1000) {
    last_calc = millis();
    
    // Безопасное чтение счетчика
    noInterrupts();
    unsigned long pulses = pulse_count;
    pulse_count = 0;
    interrupts();
    
    // Расчет скорости
    float speed_kmh = ((float)pulses / PULSES_PER_METER) * 3.6;
    
    // Отладка
    Serial.print("Импульсы/сек: ");
    Serial.print(pulses);
    Serial.print(" | Скорость: ");
    Serial.print(speed_kmh);
    Serial.println(" км/ч");
    
    // 3. ОТОБРАЖЕНИЕ НА ДИСПЛЕЕ КАЖДЫЕ 200 мс
    // (чтобы дисплей не мерцал)
    last_display = millis();
    
    // Преобразуем скорость для дисплея
    unsigned int display_value;
    
    if (speed_kmh < 0.1) {
      // Показываем 0.00
      display_value = 0;
    } else if (speed_kmh < 100.0) {
      // Показываем XX.XX (два знака после запятой)
      display_value = (unsigned int)(speed_kmh * 100);
    } else {
      // Показываем XXX.X (один знак после запятой)
      display_value = (unsigned int)(speed_kmh * 10);
    }
    
    // Разбиваем на цифры
    int digit0, digit1, digit2, digit3;
    
    if (speed_kmh < 100.0) {
      // Формат XX.XX
      digit0 = display_value / 1000;          // Десятки км/ч
      digit1 = (display_value / 100) % 10;    // Единицы км/ч
      digit2 = (display_value / 10) % 10;     // Десятые
      digit3 = display_value % 10;            // Сотые
    } else {
      // Формат XXX.X
      digit0 = display_value / 1000;          // Сотни км/ч
      digit1 = (display_value / 100) % 10;    // Десятки км/ч
      digit2 = (display_value / 10) % 10;     // Единицы км/ч
      digit3 = display_value % 10;            // Десятые
    }
    
    // Отображаем
    tm1637.display(0, digit0);
    tm1637.display(1, digit1);
    tm1637.point(true);
    tm1637.display(2, digit2);
    tm1637.display(3, digit3);
  }
  
  // 4. ПЕРИОДИЧЕСКОЕ ОБНОВЛЕНИЕ ДИСПЛЕЯ
  if (millis() - last_display > 200) {
    last_display = millis();
    // Можно добавить мигание точки при низкой скорости
    if (pulse_count == 0) {
      static bool point_state = true;
      point_state = !point_state;
      tm1637.point(point_state);
    }
  }
}

пины там снова замените))

Генерация импульсов с 9-го вывода пропала. Но если замыкать на массу то скорость монитор порта показывает.) Попробую совместить кусок скетча индикации со своим.

не надо!!!
попробуйте лучше вывести на индикатор число, например 10.00
просто в setup.

так она же отключена )))

Здравствуйте. Не получалось написать отзыв. Скетч , выложенный BABOS в 53 посту, рабочий. Отображается скорость на 7-ми сегментном индикаторе так же как на мониторе порта. Все работает. Спасибо за подсказки BABOS и всем откликнувшимся.

#include <TM1637.h>

// Определяем пины для подключения дисплея TM1637
#define CLK 4
#define DIO 3
#define BUZ_PIN 9     // Генерация частоты
#define POT_PIN A0    // Вход потенциометра настройки частоты

// Определяем пин для подключения датчика импульсов
#define PULSE_PIN 2

// Определяем количество импульсов на метр
#define PULSES_PER_METER 6.0

// Создаем объект дисплея TM1637
TM1637 tm1637(CLK, DIO);

// Переменные для подсчета импульсов и времени
volatile int pulse_count = 0;
unsigned long last_time = 0;

// Переменная для хранения скорости
float speed_kmh = 0;

void countPulse() {
  pulse_count++;
  digitalWrite(13, !digitalRead(13)); // Мигаем светодиодом при каждом импульсе (для отладки)
}

void setup() {
  // Инициализируем Serial для отладки
  Serial.begin(9600);
  Serial.println("Спидометр запущен");
  
  // Светодиод на плате для отладки
  pinMode(13, OUTPUT);
  
  // Инициализируем дисплей
  tm1637.init();
  tm1637.set(6); // Устанавливаем яркость дисплея (0-7)
  
  // Настраиваем пин датчика как вход
  pinMode(PULSE_PIN, INPUT_PULLUP); // Используем внутренний подтягивающий резистор
  
  // Настраиваем пин для зуммера
  pinMode(BUZ_PIN, OUTPUT);
  
  // Подключаем прерывание для подсчета импульсов
  attachInterrupt(digitalPinToInterrupt(PULSE_PIN), countPulse, RISING);
  
  last_time = millis();
  
  // Выводим начальные нули на дисплей
  tm1637.display(0, 0);
  tm1637.display(1, 0);
  tm1637.point(true);  // Включаем точку для разделения целой и дробной части
  tm1637.display(2, 0);
  tm1637.display(3, 0);
}

void loop() {
  // Генерация звука с частотой, зависящей от потенциометра
  int hz = analogRead(POT_PIN) * 0.7; // до 700 Гц
  // Частота в крайнем положении резистора 33 Гц , поэтому отключаем генерацию импульсов, если частота =<33Гц 
 
  if (  hz <= 33){
    noTone (BUZ_PIN);
  } else {tone(BUZ_PIN, hz);
  }
  
  // Проверяем, прошло ли достаточно времени для расчета скорости (1 секунда)
  unsigned long current_time = millis();
  if (current_time - last_time >= 1000) {
    // Отключаем прерывания на время чтения переменной
    noInterrupts();
    int pulses = pulse_count;
    pulse_count = 0;
    interrupts();
    
    // Вычисляем скорость в км/ч
    // Формула: (импульсы/сек) * (1 м/импульс) * (3600 сек/ч) * (0.001 км/м) = км/ч
    speed_kmh = ((float)pulses / PULSES_PER_METER) * 3.6;
    
    // Отладка в Serial Monitor
    Serial.print("Импульсы за секунду: ");
    Serial.print(pulses);
    Serial.print("  Скорость (км/ч): ");
    Serial.println(speed_kmh);
    
    // Если скорость очень маленькая, показываем 00.00
    if (speed_kmh < 20) {
      tm1637.point(false);
      tm1637.display(0, 0);
      tm1637.point(false);
      tm1637.display(1, 0);
      tm1637.point(false);
      tm1637.display(2, 0);
      tm1637.point(false);
      tm1637.display(3, 0);
    } else {
      // Переводим скорость в целое число (умножаем на 100 для сохранения 2 знаков после запятой)
      unsigned int raw_speed = (unsigned int)(speed_kmh * 1);
      
      // Ограничиваем максимальное значение (99.99 км/ч)
      if (raw_speed > 9999) {
        raw_speed = 9999;
      }
      
      // Разбиваем на отдельные цифры
      int8_t digits[] = {0, 0, 0, 0};
      digits[0] = raw_speed / 1000;        // тысячи (десятки км/ч)
      digits[1] = (raw_speed / 100) % 10;  // сотни (единицы км/ч)
      digits[2] = (raw_speed / 10) % 10;   // десятки (десятые км/ч)
      digits[3] = raw_speed % 10;          // единицы (сотые км/ч)
      
      // Отображаем скорость на дисплее
      tm1637.point(false);
      tm1637.display(0, digits[0]);
      tm1637.point(false);
      tm1637.display(1, digits[1]);
      tm1637.point(false);  // Включаем точку для разделения целой и дробной части
      tm1637.display(2, digits[2]);
      tm1637.point(false);
      tm1637.display(3, digits[3]);
    }
    
    // Обновляем время
    last_time = current_time;
  }
}

Нет смысла его благодарить, это не его заслуга.

Человек проявил отзывчивость.

Ну так поблагодари за отзывчивость ))

а вы так и вняли совету подумать своим умом… Таких тут не любят.

ты сам, случаем, не Бабос переодетый?

бабками!))) принимаю не меньше 25к!

не надо завидовать, я ИИ контролировал! он делал под моим чутким руководством!)))

согласно вашей логике вы тогда это переодетый duin4ik ?))) из темы нужен графический интерфейс на делфи