Велосипедный спидометр с ЖК дисплеем 16х4 и библиотекой - Arduino
- Войдите на сайт для отправки комментариев
Чт, 30/03/2017 - 09:08
Здравствуйте, доброго вечера, нашел хорошую статью про цифровой спидометра Велосипедный спидометр с ЖК дисплеем 16х4 и библиотекой, у меня получился так а не как на том сайте как можно исправить?

Библиотекой воспользовались?
bigCrystal.home(); //левый верхний угол bigCrystal.print(rpm * RPMtoKMH, 1); // выводим скорость в км/ч с точностью до одного знака после запятой bigCrystal.print(" "); // и расстояние bigCrystal.setCursor(3, 2); //устанавливаем курсор на 4 позицию, 3 строка (все считаем начиная с 0) bigCrystal.print(counter * circumference / 1000 / magnets, 2); // віводим пройденное расстояние от включения lcd.setCursor(13,0); // 14 позиция, 1 строка для надписи КмЧ lcd.print("KmH"); lcd.setCursor(0,3); // 1 позиция , 4 строка для надписи TTL lcd.print("TTL");Добавил комментарии по позиционированию вывода, надеюсь помогут (т.к. свой код Вы не показали, то номера строк от примера по Вашей ссылке)
да библиотека есть
Вот мой код
/* * Велосипедный спидометр с выводом на LCD дисплей * BlockDuino / LCD 16x4 / CleCloLED / CleCloReed * June 2015, Vasyl Yudin * The lib BigCrystal was modified to use func Print(); */ #include <BigCrystal.h> #include <LiquidCrystal.h> LiquidCrystal lcd(7, 8, 9, 10, 11, 12); BigCrystal bigCrystal(&lcd); // данные пользователя - вводятся индивидуально int khm; const int sensorPin = 5; // порт для датчика const int ledPin = 6; // порт для светодиода const float radius = .34; // радиус колеса в метрах ВАШЕГО велосипеда const float magnets = 1; // количество магнитов для датчика на колесе const int timeout = 1000; // (миллисекунд) масимальное время ожидания const int debounce = 10; // защита от дребезга контактов const float circumference = TWO_PI*radius; // расстояние одного оборота колеса const float RPMtoKMH = circumference * 0.06 / magnets; // коэф перевода (об/мин) в (км/ч) long timer = 0; // для замера времи одного оборота (в миллисекундах) long measuredTimer = 100000; // время одного оборота (в миллисекундах) float rpm = 0.0; // оборотов в минуту long counter = 0; // счетчик оборотов boolean state = LOW; boolean prevState = LOW; void setup() { pinMode(sensorPin, INPUT); pinMode(ledPin, OUTPUT); lcd.begin(16, 4); // TIMER - выставляем таймер с частотой прерывания в 1 кГц cli(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 1999; TCCR1B |= (1 << WGM12); TCCR1B |= (1 << CS11); TIMSK1 |= (1 << OCIE1A); sei(); // END } ISR(TIMER1_COMPA_vect) {//Функция прерывания с частотой в 1кГц для считывания датчика prevState = state; state = digitalRead(sensorPin);// считываем датчик if (state == HIGH && prevState == LOW && timer > debounce){//если датчик сработал measuredTimer = timer; //фиксируем результат замера timer = 0; //обнуляем счетчик времени counter++; //увеличиваем счетчик оборотов на единицу } timer++; if (timer > timeout){// если импульсов долго нет, значит стоим measuredTimer = measuredTimer + 100; } digitalWrite(ledPin, state); // зажигаем/гасим светодиод по датчику } void loop(){ // рассчитываем обороты в секунду и сглаживаем низкочастотным фильтром // (чем больше коэф (к единице) тем плавнее значения) rpm = digitalLowPass(rpm, 60000.0 /measuredTimer, 0.75); khm = rpm * RPMtoKMH; bigCrystal.home(); bigCrystal.print(khm, 1); // выводим скорость в км/ч с точностью до одного знака после запятой bigCrystal.print(" "); // и расстояние bigCrystal.setCursor(3, 2); bigCrystal.print(counter * circumference / 1000 / magnets, 2); // віводим пройденное расстояние от включения lcd.setCursor(13,0); lcd.print("KmH"); lcd.setCursor(0,3); lcd.print("TTL"); delay(250); // каждые 1/4 секунды } //Digital low pass filter - цифровой низкочастотный фильтр, коэф фильтра до единицы (чем ближе к единице тем выше фильтрация) float digitalLowPass(float last_smoothed, float new_value, float filterVal) { return (new_value * (1 - filterVal)) + (last_smoothed * filterVal); }Позмции нормально я так поставил, я про шрифт можно ли цифры по больше отображать на 2 строку
Попробуйте использовать bigCristal.printBig(str, row,col)
Попробуйте использовать bigCristal.printBig(str, row,col)
У меня переменная integer и оно каждый раз меняется зависимости от скорости
bigCrystal.print - наследует lcd.print. Для печати большим шрифтом необходимо использовать printBig
//Digital low pass filter - цифровой низкочастотный фильтр, коэф фильтра до единицы (чем ближе к единице тем выше фильтрация) 84 float digitalLowPass(float last_smoothed, float new_value, float filterVal) 85 { 86 return (new_value * (1 - filterVal)) + (last_smoothed * filterVal); 87 }//Digital low pass filter - цифровой низкочастотный фильтр, коэф фильтра до единицы (чем ближе к единице тем выше фильтрация) 84 float digitalLowPass(float last_smoothed, float new_value, float filterVal) 85 { 86 return (new_value * (1 - filterVal)) + (last_smoothed * filterVal); 87 }А1 не может работать в качестве аналогвого выхода, следовательно, Ваше желание неосуществимо.