мне не надо, автору ветки найди ![]()
да не злись))
есть же
/**
* Обработчик прерываний группы PCINT2 в которую входят
* Port D pins 0 - 7.
*/
ISR(PCINT2_vect) {
}
разве я злюсь? даже смайл вставил.
Конечно, можно сделать и на PCINT. Но это точно не для ТС.
«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 ?))) из темы нужен графический интерфейс на делфи

