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

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

  1. Неправильно выложили код.
  2. Забыли опубликовать схему.
#include <TM1637.h>

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

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

// Определяем количество импульсов на метр
#define PULSES_PER_METER 6.0
float S = 0;
// Создаем объект дисплея TM1637
TM1637 tm1637(CLK, DIO);

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


void setup() {
  // Инициализируем дисплей
 {
  tm1637.init();
  tm1637.set( 6 );
  } // Устанавливаем яркость дисплея (0-7)

  // Настраиваем пин датчика как вход
  pinMode(PULSE_PIN, INPUT_PULLUP); // Используем внутренний подтягивающий резистор

  // Подключаем прерывание для подсчета импульсов
  attachInterrupt(digitalPinToInterrupt(PULSE_PIN), pulse_count, RISING);
}

void loop() {
  // Получаем текущее время
  unsigned long current_time = millis();

 {
  
    int hz = analogRead(POT_PIN)* 0.7; // до 700 Гц
    tone(BUZ_PIN, hz);
  
  
   }
  

  // Проверяем, прошло ли достаточно времени для расчета скорости (например, 1 секунда)
  if (current_time - last_time >= 1000) {
    // Вычисляем скорость в метрах в секунду
    float S = ((float)pulse_count / PULSES_PER_METER * 3,6); //Вычисляем скорость в км/ч

  
unsigned int RAWtemp = S*100;    // переводим в целое число
int8_t Digits[] = {0x00,0x00,0x00,0x00};  // буфер для цифр LED-индикатора
Digits[0] = (byte)(RAWtemp / 1000) % 10; // раскидываем 4-значное число на цифры
Digits[1] = (byte)(RAWtemp / 100) % 10;
Digits[2] = (byte)(RAWtemp / 10) % 10;
Digits[3] = (byte)(RAWtemp) % 10;
tm1637.display(Digits); 
  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]);
  delay(500);
} // Отображаем скорость на дисплее
     // Выводим скорость, умноженную на 100 (для отображения десятых и сотых долей)

    // Сбрасываем счетчик импульсов и обновляем время
    pulse_count = 0;
    last_time = current_time;
  }


// Функция прерывания для подсчета импульсов
void countPulse() {
  pulse_count++;
}

Как писал выше: импульсы с 9-го вывода ардуино идут на 4-й. С помощью потенциометра меняется частота. Стрелка спидометра(ваз 2115) отклоняется. Но вот отображения скорости нет на 7-ми сегментном индикаторе. Не пойму подсчет импульсов неправильно сделан или вывод на индикацию. Подскажите, что не так .

Саму схему добавлю.

Как обработчик прерывания называется у Вас?

На Уно на 4м пине нет прерываний

К тому же обработчик неверно вызывает?

1 лайк

лично у меня называется attachInterrupt

я бы сказал вообще не вызывает

Короче, в одной строчке куча ошибок

Исправил на 5-й. Не работает.

attachInterrupt

Направьте в нужном направлении.

void countPulse() {
  pulse_count++;
}

А это тогда что?

Об этом не подумал. Ее совсем убрать? Спасибо. Полный венегрет у меня. Вот эта строка правильно написана? attachInterrupt(digitalPinToInterrupt(PULSE_PIN), pulse_count, RISING);

#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
float S = 0;
// Создаем объект дисплея TM1637
TM1637 tm1637(CLK, DIO);

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

void countPulse() {
  pulse_count++;
}


void setup() {
  // Инициализируем дисплей
 {
  tm1637.init();
  tm1637.set( 6 );
  } // Устанавливаем яркость дисплея (0-7)

  // Настраиваем пин датчика как вход
  pinMode(PULSE_PIN, INPUT_PULLUP); // Используем внутренний подтягивающий резистор

  // Подключаем прерывание для подсчета импульсов
  attachInterrupt(digitalPinToInterrupt(PULSE_PIN), countPulse, RISING);
}

void loop() {
  // Получаем текущее время
  unsigned long current_time = millis();

 {
  
    int hz = analogRead(POT_PIN)* 0.7; // до 700 Гц
    tone(BUZ_PIN, hz);
  
  
   }
  

  // Проверяем, прошло ли достаточно времени для расчета скорости (например, 1 секунда)
  if (current_time - last_time >= 1000) {
    // Вычисляем скорость в метрах в секунду
    float S = ((float)pulse_count / PULSES_PER_METER * 3,6); //Вычисляем скорость в км/ч

  
unsigned int RAWtemp = S*100;    // переводим в целое число
int8_t Digits[] = {0x00,0x00,0x00,0x00};  // буфер для цифр LED-индикатора
Digits[0] = (byte)(RAWtemp / 1000) % 10; // раскидываем 4-значное число на цифры
Digits[1] = (byte)(RAWtemp / 100) % 10;
Digits[2] = (byte)(RAWtemp / 10) % 10;
Digits[3] = (byte)(RAWtemp) % 10;
tm1637.display(Digits); 
  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]);
  delay(500);
} // Отображаем скорость на дисплее
     // Выводим скорость, умноженную на 100 (для отображения десятых и сотых долей)

    // Сбрасываем счетчик импульсов и обновляем время
    pulse_count = 0;
    last_time = current_time;
  }

Это счетчик импульсов.

Подправил. Но не работает. Посмотрите, может еще косяк найдете.

22,23,24 строки-счетчик импульсов.

3,6 там точка должна быть ?)) а не запятая...
float S  глобальная переменная перестает работать после float S = ((float)pulse_count / PULSES_PER_METER * 3.6); // становится локальной переменной ?