там нет ДХ , два провода = питалово , кулер с ДХ - три проводка !
Ага, конечно нет, там наверное коллектор с щетками стоит...
который на верхнем пробовал снимать и тыкать как разными концами куда угодно - не помогает не работает. даташит конечно же не могу найти потому что нет гравировки на микрухе ( по дорогам вроде как посмотрел что куда идет, все ровно не получилось его подключить
не боевой , пока вывод в Сериал , кот индикатор куда-то утащил ( раньше за 328 в DIP надо было глаз да глаз ).....
на входе с другой ардуины отрицательные импулься - LOW=10 , HIGH=156 mS ( пероид 166 mS >>>>> 45 km/h )
340 mS >>>>> 22 km/h
Из темы "Я бы сделал по другому". Собственно уже сделал.
У меня код получился такой:
/*
* Велосипедный спидометр с выводом на семисегментный индикатор
* BlockDuino / Block7Seg / CleCloLED / CleCloReed
* May 2015, Vasyl Yudin
*/
#include <PrintTo7Seg.h>
const float radius = .34;// радиус колеса в метрах ВАШЕГО велосипеда
const float magnets = 1;
const int timeout = 1000; // (миллисекунд) масимальное время ожидания
const float circumference = TWO_PI*radius; // расстояние одного оборота колеса
const float RPMtoKMH = circumference * 0.06 / magnets; // коэф перевода (об/мин) в (км/ч)
const int debounce = 100; // защита от дребезга контактов
const int sensorPin = A5; // порт для датчика
const int ledPin = 10; // порт для светодиода
long timer = 0; // для замера времи одного оборота (в миллисекундах)
long measuredTimer = 100000; // время одного оборота (в миллисекундах)
float rpm = 0.0; // оборотов в минуту
long counter = 0; // счетчик оборотов
boolean state = LOW;
boolean prevState = LOW;
byte numOfDigits = 4; // количество цифр в семисегментром дисплее
// digitPins - LSB to MSB
byte digPins[] = {3, 7, 8, A0 }; // порта подключенные к общим выводам цифр
// segmentPins - Dp, A to G
byte ledPins[] = {6, 4, 9, A2, A3, 2, 5, A1}; // порта подключенные к сегментам
PrintTo7Seg Seg7(numOfDigits, digPins, ledPins); // по умолчанию общий катод
//PrintTo7Seg Seg7(digPins, ledPins, COMMON_ANODE); // для дисплея с общим анодом
void setup() {
pinMode(sensorPin, INPUT);
pinMode(ledPin, OUTPUT);
// TIMER - выставляем таймер с частотой прерывания в 1 кГц
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 1999;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11);
TIMSK1 |= (1 << OCIE1A);
sei();
// END
//Serial.begin(9600);
// Seg7.print("test"); // тест дисплея при запуске
// delay(250);
}
ISR(TIMER1_COMPA_vect) {//Interrupt at freq of 1kHz to measure sensor
prevState = state;
state = digitalRead(sensorPin);// считываем датчик
if (state == HIGH && prevState == LOW && timer > debounce){//если датчик сработал
// rpm = digitalLowPass(rpm, 60000.0 /timer, 0.75);
measuredTimer = timer; //фиксируем результат замера
timer = 0; //обнуляем счетчик времени
counter++; //увеличиваем счетчик оборотов на единицу
}
timer++;
if (timer > timeout){//если импульсов долго нет, значит стоим
measuredTimer = measuredTimer + 100;
}
digitalWrite(ledPin, state); // зажигаем/гасим светодиод по датчику
}
void loop(){
//print mph once a second
showSpeed (); // рассчитываем и выводим скорость
delay(100); // каждые 0.1 секунду
}
void showSpeed(void){
Seg7.clear(); // очищаем дисплей
rpm = digitalLowPass(rpm, 60000.0 /measuredTimer, 0.75);
// рассчитываем обороты в секунду и сглаживаем низкочастотным фильтром
// (чем больше коэф (к единице) тем плавнее значения)
Seg7.print(rpm * RPMtoKMH, 1); // выводим скорость в км/ч с точностью до одного знака после запятой
// Serial.println(rpm);
}
/*
void showDist(void){
Seg7.clear(); // очищаем дисплей
Seg7.print(counter * circumference / magnets); // віводим пройденное расстояние от включения
}
*/
//Digital low pass filter - цифровой низкочастотный фильтр, коэф фильтра до единицы (чем ближе к единице тем выше фильтрация)
float digitalLowPass(float last_smoothed, float new_value, float filterVal)
{
return (new_value * (1 - filterVal)) + (last_smoothed * filterVal);
}
Датчик считывается в прерываниях с частотой в 1 кГц, т.е. 1000 раз в секунду. Программно отсекается дребезг контактов. Встроенный низкочастотный фильтр, для сглаживания показаний скорости. Плавный уход в ноль, при остановке.
Немогу разобратся как подключать, выложите схему плиз
BlockThor пишет:
Из темы "Я бы сделал по другому". Собственно уже сделал.
У меня код получился такой:
/*
* Велосипедный спидометр с выводом на семисегментный индикатор
* BlockDuino / Block7Seg / CleCloLED / CleCloReed
* May 2015, Vasyl Yudin
*/
#include <PrintTo7Seg.h>
const float radius = .34;// радиус колеса в метрах ВАШЕГО велосипеда
const float magnets = 1;
const int timeout = 1000; // (миллисекунд) масимальное время ожидания
const float circumference = TWO_PI*radius; // расстояние одного оборота колеса
const float RPMtoKMH = circumference * 0.06 / magnets; // коэф перевода (об/мин) в (км/ч)
const int debounce = 100; // защита от дребезга контактов
const int sensorPin = A5; // порт для датчика
const int ledPin = 10; // порт для светодиода
long timer = 0; // для замера времи одного оборота (в миллисекундах)
long measuredTimer = 100000; // время одного оборота (в миллисекундах)
float rpm = 0.0; // оборотов в минуту
long counter = 0; // счетчик оборотов
boolean state = LOW;
boolean prevState = LOW;
byte numOfDigits = 4; // количество цифр в семисегментром дисплее
// digitPins - LSB to MSB
byte digPins[] = {3, 7, 8, A0 }; // порта подключенные к общим выводам цифр
// segmentPins - Dp, A to G
byte ledPins[] = {6, 4, 9, A2, A3, 2, 5, A1}; // порта подключенные к сегментам
PrintTo7Seg Seg7(numOfDigits, digPins, ledPins); // по умолчанию общий катод
//PrintTo7Seg Seg7(digPins, ledPins, COMMON_ANODE); // для дисплея с общим анодом
void setup() {
pinMode(sensorPin, INPUT);
pinMode(ledPin, OUTPUT);
// TIMER - выставляем таймер с частотой прерывания в 1 кГц
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 1999;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS11);
TIMSK1 |= (1 << OCIE1A);
sei();
// END
//Serial.begin(9600);
// Seg7.print("test"); // тест дисплея при запуске
// delay(250);
}
ISR(TIMER1_COMPA_vect) {//Interrupt at freq of 1kHz to measure sensor
prevState = state;
state = digitalRead(sensorPin);// считываем датчик
if (state == HIGH && prevState == LOW && timer > debounce){//если датчик сработал
// rpm = digitalLowPass(rpm, 60000.0 /timer, 0.75);
measuredTimer = timer; //фиксируем результат замера
timer = 0; //обнуляем счетчик времени
counter++; //увеличиваем счетчик оборотов на единицу
}
timer++;
if (timer > timeout){//если импульсов долго нет, значит стоим
measuredTimer = measuredTimer + 100;
}
digitalWrite(ledPin, state); // зажигаем/гасим светодиод по датчику
}
void loop(){
//print mph once a second
showSpeed (); // рассчитываем и выводим скорость
delay(100); // каждые 0.1 секунду
}
void showSpeed(void){
Seg7.clear(); // очищаем дисплей
rpm = digitalLowPass(rpm, 60000.0 /measuredTimer, 0.75);
// рассчитываем обороты в секунду и сглаживаем низкочастотным фильтром
// (чем больше коэф (к единице) тем плавнее значения)
Seg7.print(rpm * RPMtoKMH, 1); // выводим скорость в км/ч с точностью до одного знака после запятой
// Serial.println(rpm);
}
/*
void showDist(void){
Seg7.clear(); // очищаем дисплей
Seg7.print(counter * circumference / magnets); // віводим пройденное расстояние от включения
}
*/
//Digital low pass filter - цифровой низкочастотный фильтр, коэф фильтра до единицы (чем ближе к единице тем выше фильтрация)
float digitalLowPass(float last_smoothed, float new_value, float filterVal)
{
return (new_value * (1 - filterVal)) + (last_smoothed * filterVal);
}
Датчик считывается в прерываниях с частотой в 1 кГц, т.е. 1000 раз в секунду. Программно отсекается дребезг контактов. Встроенный низкочастотный фильтр, для сглаживания показаний скорости. Плавный уход в ноль, при остановке.
jeka_tm , извини за вопрос , влез неправомерно конечно....
это знакогенератор ? башка от t не варит почти :(
да знакогенератор. давно как то писал. так его и оставил и тут вклинил
спасибо ! норм код ! :)
можно на сдвигах переписать, а выводы в массиве прописывать. но разницы не будет особо. чуть быстрее, но тоже самое
там нет ДХ , два провода = питалово , кулер с ДХ - три проводка !
Ага, конечно нет, там наверное коллектор с щетками стоит...
там нет ДХ , два провода = питалово , кулер с ДХ - три проводка !
Ага, конечно нет, там наверное коллектор с щетками стоит...
который на верхнем пробовал снимать и тыкать как разными концами куда угодно - не помогает не работает. даташит конечно же не могу найти потому что нет гравировки на микрухе ( по дорогам вроде как посмотрел что куда идет, все ровно не получилось его подключить
не боевой , пока вывод в Сериал , кот индикатор куда-то утащил ( раньше за 328 в DIP надо было глаз да глаз ).....
на входе с другой ардуины отрицательные импулься - LOW=10 , HIGH=156 mS ( пероид 166 mS >>>>> 45 km/h )
340 mS >>>>> 22 km/h
в ветке if( speedVelo > 9.9 ) .... else - косяк :(
за датчик Холла работает ардуина мини
основной код на ардуине уно ( без индикатора )
Из темы "Я бы сделал по другому". Собственно уже сделал.
У меня код получился такой:
Датчик считывается в прерываниях с частотой в 1 кГц, т.е. 1000 раз в секунду. Программно отсекается дребезг контактов. Встроенный низкочастотный фильтр, для сглаживания показаний скорости. Плавный уход в ноль, при остановке.
На велик не ставил, но есть работающий прототип: http://blockduino.blogspot.com/2015/06/bike-speedometer-7segment-display.html
зы Библиотеку можно взять тут: https://codebender.cc/personallibrary/PrintTo7Seg
Немогу разобратся как подключать, выложите схему плиз
Из темы "Я бы сделал по другому". Собственно уже сделал.
У меня код получился такой:
Датчик считывается в прерываниях с частотой в 1 кГц, т.е. 1000 раз в секунду. Программно отсекается дребезг контактов. Встроенный низкочастотный фильтр, для сглаживания показаний скорости. Плавный уход в ноль, при остановке.
На велик не ставил, но есть работающий прототип: http://blockduino.blogspot.com/2015/06/bike-speedometer-7segment-display.html
зы Библиотеку можно взять тут: https://codebender.cc/personallibrary/PrintTo7Seg