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

Точку поставил) А вот с float S пока переварить не могу.

вам наверное и не надо… глобальная позволяет обращаться к ней в любой части кода, может это и вовсе и не пригодится…

Оставить как есть?

Там имя функции должно быть, а у вас имя переменной.

 float S = ((float)pulse_count / PULSES_PER_METER * 3.6) // Как тогда написать эту строку , что бы она осталась глобальной переменной?

пока что наверное можно оставить
S = ((float)pulse_count / PULSES_PER_METER) * 3.6;

Спасибо. Попробую.

Не хочет работать.

#include <TM1637.h>

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

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

// Определяем количество импульсов на метр
#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++;
}

void setup() {
  // Инициализируем дисплей
  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();
}

void loop() {
  // Генерация звука с частотой, зависящей от потенциометра
  int hz = analogRead(POT_PIN) * 0.7; // до 700 Гц
  tone(BUZ_PIN, hz);
  
  // Проверяем, прошло ли достаточно времени для расчета скорости (1 секунда)
  unsigned long current_time = millis();
  if (current_time - last_time >= 1000) {
    // Вычисляем скорость в км/ч
    // Формула: (импульсы/сек) * (1 м/импульс) * (3600 сек/ч) * (0.001 км/м) = км/ч
    speed_kmh = ((float)pulse_count / PULSES_PER_METER) * 3.6;
    
    // Переводим скорость в целое число (умножаем на 100 для сохранения 2 знаков после запятой)
    unsigned int raw_speed = (unsigned int)(speed_kmh * 100);
    
    // Разбиваем на отдельные цифры
    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.display(0, digits[0]);
    tm1637.display(1, digits[1]);
    tm1637.point(true);  // Включаем точку для разделения целой и дробной части
    tm1637.display(2, digits[2]);
    tm1637.display(3, digits[3]);
    
    // Сбрасываем счетчик импульсов и обновляем время
    pulse_count = 0;
    last_time = current_time;
  }
}

работает ? вообще мы нарушаем первое правило программиста, работает не трожь!)))

Сейчас табло ожило, здорово!)…Горят все нули. Скорость правда не показывает.

#include <TM1637.h>

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

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

// Определяем количество импульсов на метр
#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 Гц
  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 < 0.01) {
      tm1637.display(0, 0);
      tm1637.display(1, 0);
      tm1637.point(true);
      tm1637.display(2, 0);
      tm1637.display(3, 0);
    } else {
      // Переводим скорость в целое число (умножаем на 100 для сохранения 2 знаков после запятой)
      unsigned int raw_speed = (unsigned int)(speed_kmh * 100);
      
      // Ограничиваем максимальное значение (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.display(0, digits[0]);
      tm1637.display(1, digits[1]);
      tm1637.point(true);  // Включаем точку для разделения целой и дробной части
      tm1637.display(2, digits[2]);
      tm1637.display(3, digits[3]);
    }
    
    // Обновляем время
    last_time = current_time;
  }
}

соединяйте 5 пин с землей, и размыкайте быстро)))) отображается скорость ?)))

Нули горят. )Скорость не показывает.

а если #define PULSE_PIN 5 заменить на 2 или 3 ?

1 лайк

На 2-ом выводе заработало).Скорость в мониторе порта показывает при замыкании на массу.

Ну что ж так тупить-то?
Еще когда я вам написал, что на 4-м пине нет прерываний - что надо было сделать? - открыть документацию и посмотреть, на каких пинах они, прерывания, есть.

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

Подключил 9-й вывод к 2-му при повороте потенциометра скорость меняется от 21 до 365 км/ч. BABOS , это просто фантастика)

Фантастика - это то, что у вас заняло 11 часов (одиннадцать, блин!) , чтобы просто поменять номер пина

Соглашусь. Туплю.

а если я найду?))