Точку поставил) А вот с 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 ?
На 2-ом выводе заработало).Скорость в мониторе порта показывает при замыкании на массу.
Ну что ж так тупить-то?
Еще когда я вам написал, что на 4-м пине нет прерываний - что надо было сделать? - открыть документацию и посмотреть, на каких пинах они, прерывания, есть.
А вы тыргаетесь как слепой котенок, бессистемно меняя строчки кода. Так программы не пишут.
Подключил 9-й вывод к 2-му при повороте потенциометра скорость меняется от 21 до 365 км/ч. BABOS , это просто фантастика)
Фантастика - это то, что у вас заняло 11 часов (одиннадцать, блин!) , чтобы просто поменять номер пина
Соглашусь. Туплю.
а если я найду?))
