Выложите код по правилам форума, иначе благодарить будет не за что.
- Неправильно выложили код.
- Забыли опубликовать схему.
#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); // становится локальной переменной ?

