Велосипедный спидометр с ЖК дисплеем 16х4 и библиотекой - Arduino

loker95
Offline
Зарегистрирован: 11.02.2017

Здравствуйте, доброго вечера, нашел хорошую статью про цифровой спидометра Велосипедный спидометр с ЖК дисплеем 16х4 и библиотекой, у меня получился так а не как на том сайте как можно исправить?

nevkon
Offline
Зарегистрирован: 20.01.2015

Библиотекой воспользовались?

T.Rook
Offline
Зарегистрирован: 05.03.2016
  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");

Добавил комментарии по позиционированию вывода, надеюсь помогут (т.к. свой код Вы не показали, то номера строк от примера по Вашей ссылке)

 

loker95
Offline
Зарегистрирован: 11.02.2017

да библиотека есть 

#include <BigCrystal.h>
#include <LiquidCrystal.h>

 

loker95
Offline
Зарегистрирован: 11.02.2017

Вот мой код 

/*
 *  Велосипедный спидометр с выводом на 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);
}

 

loker95
Offline
Зарегистрирован: 11.02.2017

Позмции нормально я так поставил, я про шрифт можно ли цифры по больше отображать на 2 строку

T.Rook
Offline
Зарегистрирован: 05.03.2016

Попробуйте использовать bigCristal.printBig(str, row,col)

loker95
Offline
Зарегистрирован: 11.02.2017

T.Rook пишет:

Попробуйте использовать bigCristal.printBig(str, row,col)

У меня переменная integer и оно каждый раз меняется зависимости от скорости

T.Rook
Offline
Зарегистрирован: 05.03.2016

bigCrystal.print - наследует  lcd.print. Для печати большим шрифтом необходимо использовать printBig

Тед
Offline
Зарегистрирован: 06.11.2017
Кто-нибудь знает, как использовать этот кусок?
Мне нужен такой вход фильтра A0, выход A1.
//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
}

 

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Тед пишет:

Кто-нибудь знает, как использовать этот кусок?
Мне нужен такой вход фильтра A0, выход A1.
//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 не может работать в качестве аналогвого выхода, следовательно, Ваше желание неосуществимо.