Электронная линейка(счетчик метража)

Freeman199
Offline
Зарегистрирован: 12.11.2015

Здравствуйте ув. форумчане.

Загорелся идеей создать счетчик метража на ардуине Uno.

Установить на имеющееся пластиковое колесо диаметром 32см. геркоон+магнит соотв-но, и залить на дуню что-то типа калькулятора что-бы она в уме: 0.32+0.32+0.32 и.т.д Ну а на дисплей (Lcd display shield) высвечивало уже готовые метры

Купил дуню Uno, lcd-keypad-shield,геркон,магнит, и ...не знаю что дальше делать.

Не могу в сетях найти что-то подходящее-хотя думал,что найду сразу Ь) или плохо(неумело) искал.вобщем задолбался.

Подскажите кто, что нажимать-писать? может вместо геркона что-то типа тахогена поставить?

И еще: Можно ли мой 16х2 Дисплей Сделать 16х1?

т.е. Выводить   (пример)   надпись  ''84м'' не на нижнюю или верхнюю строчку,а (растянуть) ее по высоте??

Заранее искренне благодарю.

 

Araris
Онлайн
Зарегистрирован: 09.11.2012

1. Это называется курвиметр.

2. Геркон с точки зрения Ардуино - это контакт, такой же, как простая кнопка. Ищите про подключение кнопки, считывание её состояния. Дальше Вам останется лишь при каждом замыкании контакта прибавлять к счетчику длину окружности колеса (не диаметр !).

3. Растянуть надпись по высоте - возможно, погуглите "arduino 1602 big font".

Radjah
Offline
Зарегистрирован: 06.08.2014

Можно сделать больше меток и считать точнее.

Freeman199
Offline
Зарегистрирован: 12.11.2015

Спасибо!

Вот нашел,и подшаманил такой скетч:

/*
 A set of custom made large numbers for a 16x2 LCD using the 
 LiquidCrystal librabry. Works with displays compatible with the 
 Hitachi HD44780 driver. 

 The Cuicuit:
 LCD RS pin to D12
 LCD Enable pin to D11
 LCD D4 pin to D5
 LCD D5 pin to D4
 LCD D6 pin to D3
 LCD D7 pin to D2
 LCD Vee tied to a pot to control brightness
 LCD Vss and R/W tied to ground
 LCD Vcc to +5V

 Ronivaldo Sampaio (ronivaldo@gmail.com) for 3 lines
 2013/05/15 -> change for character with only 3 lines
 Original Made by Michael Pilcher
 2/9/2010

 character created using:
 http://mikeyancey.com/hamcalc/lcd_characters.php
 */

// include the library
#include <LiquidCrystal.h>

// initialize the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

// the 8 arrays that form each segment of the custom numbers
byte bar1[8] = 
{
        B11100,
        B11110,
        B11110,
        B11110,
        B11110,
        B11110,
        B11110,
        B11100
};
byte bar2[8] =
{
        B00111,
        B01111,
        B01111,
        B01111,
        B01111,
        B01111,
        B01111,
        B00111
};
byte bar3[8] =
{
        B11111,
        B11111,
        B00000,
        B00000,
        B00000,
        B00000,
        B11111,
        B11111
};
byte bar4[8] =
{
        B11110,
        B11100,
        B00000,
        B00000,
        B00000,
        B00000,
        B11000,
        B11100
};
byte bar5[8] =
{
        B01111,
        B00111,
        B00000,
        B00000,
        B00000,
        B00000,
        B00011,
        B00111
};
byte bar6[8] =
{
        B00000,
        B00000,
        B00000,
        B00000,
        B00000,
        B00000,
        B11111,
        B11111
};
byte bar7[8] =
{
        B00000,
        B00000,
        B00000,
        B00000,
        B00000,
        B00000,
        B00111,
        B01111
};
byte bar8[8] =
{
        B11111,
        B11111,
        B00000,
        B00000,
        B00000,
        B00000,
        B00000,
        B00000
};



void setup()
{
  // assignes each segment a write number
  lcd.createChar(1,bar1);
  lcd.createChar(2,bar2);
  lcd.createChar(3,bar3);
  lcd.createChar(4,bar4);
  lcd.createChar(5,bar5);
  lcd.createChar(6,bar6);
  lcd.createChar(7,bar7);
  lcd.createChar(8,bar8);
  
  // sets the LCD's rows and colums:
  lcd.begin(16, 2);

}

void custom0(int col)
{ // uses segments to build the number 0
  lcd.setCursor(col, 0); 
  lcd.write(2);  
  lcd.write(8); 
  lcd.write(1);
  lcd.setCursor(col, 1); 
  lcd.write(2);  
  lcd.write(6);  
  lcd.write(1);
}

void custom1(int col)
{
  lcd.setCursor(col,0);
  lcd.write(32);
  lcd.write(32);
  lcd.write(1);
  lcd.setCursor(col,1);
  lcd.write(32);
  lcd.write(32);
  lcd.write(1);
}

void custom2(int col)
{
  lcd.setCursor(col,0);
  lcd.write(5);
  lcd.write(3);
  lcd.write(1);
  lcd.setCursor(col, 1);
  lcd.write(2);
  lcd.write(6);
  lcd.write(6);
}

void custom3(int col)
{
  lcd.setCursor(col,0);
  lcd.write(5);
  lcd.write(3);
  lcd.write(1);
  lcd.setCursor(col, 1);
  lcd.write(7);
  lcd.write(6);
  lcd.write(1); 
}

void custom4(int col)
{
  lcd.setCursor(col,0);
  lcd.write(2);
  lcd.write(6);
  lcd.write(1);
  lcd.setCursor(col, 1);
  lcd.write(32);
  lcd.write(32);
  lcd.write(1);
}

void custom5(int col)
{
  lcd.setCursor(col,0);
  lcd.write(2);
  lcd.write(3);
  lcd.write(4);
  lcd.setCursor(col, 1);
  lcd.write(7);
  lcd.write(6);
  lcd.write(1);
}

void custom6(int col)
{
  lcd.setCursor(col,0);
  lcd.write(2);
  lcd.write(3);
  lcd.write(4);
  lcd.setCursor(col, 1);
  lcd.write(2);
  lcd.write(6);
  lcd.write(1);
}

void custom7(int col)
{
  lcd.setCursor(col,0);
  lcd.write(2);
  lcd.write(8);
  lcd.write(1);
  lcd.setCursor(col, 1);
  lcd.write(32);
  lcd.write(32);
  lcd.write(1);
}

void custom8(int col)
{
  lcd.setCursor(col, 0); 
  lcd.write(2);  
  lcd.write(3); 
  lcd.write(1);
  lcd.setCursor(col, 1); 
  lcd.write(2);  
  lcd.write(6);  
  lcd.write(1);
}

void custom9(int col)
{
  lcd.setCursor(col, 0); 
  lcd.write(2);  
  lcd.write(3); 
  lcd.write(1);
  lcd.setCursor(col, 1); 
  lcd.write(7);  
  lcd.write(6);  
  lcd.write(1);
}

void printNumber(int value, int col) {
  if (value == 0) {
    custom0(col);
  } if (value == 1) {
    custom1(col);
  } if (value == 2) {
    custom2(col);
  } if (value == 3) {
    custom3(col);
  } if (value == 4) {
    custom4(col);
  } if (value == 5) {
    custom5(col);
  } if (value == 6) {
    custom6(col);
  } if (value == 7) {
    custom7(col);
  } if (value == 8) {
    custom8(col);
  } if (value == 9) {
    custom9(col);
  }      
}  

void printRPM(int rpm) {
  int m , c, d, u, number;
  number = rpm;
  if (number > 999) {
    m = (number - (number % 1000)) / 1000;
    number = number % 1000;
  } else {
    m = 0;
  }  
  
  if (number > 99) {
    c = (number - (number % 100)) / 100;
    number = number % 100;
  } else {
    c = 0;
  }  

  if (number > 9) {
    d = (number - (number % 10)) / 10;
    number = number % 10;
  } else {
    d = 0;
  }  
  
  u = number;
  
  lcd.setCursor(0, 0);
  lcd.print("METP: ");
  printNumber(m, 4);
  printNumber(c, 7);
  printNumber(d, 10);
  printNumber(u, 13);
    
}  

void loop()
{
  printRPM(millis() % 10000);
  delay(200);
}

 

Как в него вбить метры?
Freeman199
Offline
Зарегистрирован: 12.11.2015

и подкинуть контакты?

Я читал,что нужен триггер шмидта. Или можно так и вывессти

Araris
Онлайн
Зарегистрирован: 09.11.2012

Araris пишет:

2. Геркон с точки зрения Ардуино - это контакт, такой же, как простая кнопка. Ищите про подключение кнопки, считывание её состояния. Дальше Вам останется лишь при каждом замыкании контакта прибавлять к счетчику длину окружности колеса (не диаметр !).

Вы слишком рано перешли к третьему пункту )))

Freeman199
Offline
Зарегистрирован: 12.11.2015

Программу то я найду, вшивать ее непосредственно в код который я выложил?

Извиняюсь,просто у меня пыт пррграммирования 3 дня))

Araris
Онлайн
Зарегистрирован: 09.11.2012

Freeman199 пишет:

Программу то я найду, вшивать ее непосредственно в код который я выложил?

Можно и этот код взять за основу.

Freeman199 пишет:

Извиняюсь,просто у меня опыт программирования 3 дня))

Это заметно, Вы пытаетесь писать стихи, не зная правил стихосложения. Не спешите, отложите экран в сторону, поиграйте с кнопками(=герконами), с подсчетом импульсов. Вам ведь не только обороты колеса считать придется, потом выплывут вопросы, как обнулять счетчик, как паузить счетчик и затем продолжать счет, и т. д. и т. п.

Freeman199
Offline
Зарегистрирован: 12.11.2015

А  вы не могли бы мне подправить код?

Разбиратся просто нету времени,а счетчик очень очень надо сейчас.

Сбросы-паузы добью позже-как только разбирусь с правилами кода.

Freeman199
Offline
Зарегистрирован: 12.11.2015

Вот вроде кнопка.

#include <EEPROM.h>

int i;
volatile int stop1 = HIGH;

boolean in = HIGH;
void setup()
{
   pinMode(2, INPUT);  //кнопка
   //attachInterrupt(0, blink, CHANGE); //прерывание

   Serial.begin(9600);

    i = EEPROM.read(0);
    Serial.println(i); 
}

void loop()
{
  if (digitalRead(2)==LOW){in = HIGH}
  if (digitalRead(2)==in){
  //digitalWrite(2, stop1); 
  if (digitalRead(2)==HIGH){  //нажатие кнопки
  EEPROM.write(0, i+1);
  i = EEPROM.read(0); 
 in != digitalRead(2); 
  }
  //detachInterrupt(0);
  }
}

/*void blink()
{
  stop1 =! stop1;
}*/

 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Чай, кофе?
Есть простая тема, Ищу исполнителя, там помогут.

Собачкин
Offline
Зарегистрирован: 26.10.2015

Лучше использовать оптический энкодер, с ним можно будет повысить точность измерений и в дальнейшем увеличить ремонтопригоднсть, сам не раз сталкивплся с залипанием герконов. В сети куча примеров по работе с энкодерами ;-)

Alexander
Offline
Зарегистрирован: 25.04.2010
Freeman199
Offline
Зарегистрирован: 12.11.2015

Я и заплатить  не-против.

5$

Freeman199
Offline
Зарегистрирован: 12.11.2015
Как в нее добавить код копки?