Курвиметр

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

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

Есть колесо,длинна по ободу 320 мм хочу с помощью Arduino+геркон считывать его обороты,и выыодить на дисплей 16х2. С помощью кода (см.ниже) установил нужное мне отображение,а вот чтобы он правильно подсчитал кол-во оборотов,и выводил их на дисплей в виде целых метров-не могу допетрать что ,да как.

В дальнейшем,точности ради поставлю пару герконов,или цифровой энкодер,или уф лампочка+Уф диод.

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("mega: ");
  lcd.setCursor(0, 1);
  lcd.print("metr)");
  printNumber(m, 4);
  printNumber(c, 7);
  printNumber(d, 10);
  printNumber(u, 13);
    
}  

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

 

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

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

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

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

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

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

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

В приведенном выше коде имеется только нужное мне отображение. Я хочу что бы дуня считала в уме кол-во оборотов,и проосто выводила это, ну а кнопки фунциклировали типа  сброс,и пауза, и общий метраж от старта. т.е. первый счетчик основной,второй(общий)

будет отображать общую сумму при нажатии и удержании кнопки,сброс его будет осуществлятся при нажатии и удержании+ресет.

Можете предложить свои варианты.

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

За труды готов заплатить гонорар 5$

 

pcb
Offline
Зарегистрирован: 02.04.2015

Freeman199 пишет:

За труды готов заплатить гонорар 5$

Вы ошиблись форумом, или суммой, на ваш вкус.

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

10$

Я не прошу написать новый код, я поршу исправитьть имеющиеся.

Можно обойтись и без ресетов общих если вам долго возится.

maksim
Offline
Зарегистрирован: 12.02.2012

Сходите в автосервис и предложите за 5или 10$ поменять только одно поршневое кольцо, обосновывая эту сумму тем, что вы не просите перебирать весь двигатель, а просите поменять только одно поршневое кольцо. Жесты, имоции и слова мотриста можете описать здесь.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Править чужой код - гораздо сложнее, чем писать свой...

bwn
Offline
Зарегистрирован: 25.08.2014

Freeman199 пишет:

10$

Я не прошу написать новый код, я поршу исправитьть имеющиеся.

Можно обойтись и без ресетов общих если вам долго возится.

Не делайте людям смешно такими цифрами. И есть у вас несколько путей: первый самый чудесный - кому то интересна ваша проблема и он все отладит за вас (это из фантастики), второй простой - согласиться на гонорар исполнителя, третий сложный, но самыя толковый - вернуться в свою первую тему и попытаться начать заново.
Осмыслить код, начать что то изменять и с советами сообщества написать самому совершенно бесплатно, дополнительный бонус  - в следующий приступ программирования все будет намного проще.

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

Извиняюсь конечно что сумма столь мала,но на более я расчитывать не могу.

И не смогу так быстро освоить код.Ардуино у меня неделя,опыта програмирования, 0 счетчик нужен уже сейчас

Будьте добры, просто LCD 16x2 С кнопками, просто любые цыфры,при нажатии кнопки(я ее заменю герконом и магнитом) просто подсчет 0.32+0.32, и вывод суммы на экран.

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

Именно так сейчас и работаю

bwn
Offline
Зарегистрирован: 25.08.2014

Ну тады забесплатно, по пожеланиям 8 поста: 1 - выкинуть ваш код в помойку.
2. - читаем здесь , шестой пример в первом сообщении. "Одно действие при нажатии"
3. - в инициации добавляем float dist = 0;
4. - где включают светик добавляем:

dist = dist + 0.32;
lcd.setCursor (0,0);
lcd.print ("      ");
lcd.setCursor (0,0);
lcd.print (dist , 3);
lcd.print ("  metr");
Из вашего кода нужна 27 и 30 строка в инициации и в секцию setup - 137 строку.
5 баксов можете перечислить на развитие форума.

Freeman199
Offline
Зарегистрирован: 12.11.2015
// include the library
#include <LiquidCrystal.h>

// initialize the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// include the library
#include <LiquidCrystal.h>
int flag=0; 

void setup() 
{ 
 
 lcd.begin(16, 2);
dist = dist + 0.32;
lcd.setCursor (0,0);
lcd.print ("      ");
lcd.setCursor (0,0);
lcd.print (dist , 3);
lcd.print ("  metr");
{ 
   pinMode(13, OUTPUT);      
           
      
        
} 

void loop() 

{ 
        
     if(digitalRead(14)==HIGH&&flag==0)//print dist    
     // и перемення flag равна 0 , то ... 
     { 
           
       digitalWrite(13,!digitalRead(13)); 
       flag=1; 
       dist = dist + 0.32;
lcd.setCursor (0,0);
lcd.print ("      ");
lcd.setCursor (0,0);
lcd.print (dist , 3);
lcd.print ("  metr");
        
     } 
        
      if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
           
        flag=0;//обнуляем переменную flag 
     } 
} 
 int
   float dist = 0; 

 

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

Чего void Его не видит?

exit status 1
expected initializer before 'lcd'
 
Freeman199
Offline
Зарегистрирован: 12.11.2015

Извиняюсь,недавно переболел.

Тяжело усваивается информация

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

Я не разу не писал код

bwn
Offline
Зарегистрирован: 25.08.2014
// include the library
#include <LiquidCrystal.h>

// initialize the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// include the library
#include <LiquidCrystal.h>
int flag=0;
float dist = 0;

void setup() 
{ 
 
 lcd.begin(16, 2);
   pinMode(13, OUTPUT);      
           
      
        
} 

void loop() 

{ 
        
     if(digitalRead(14)==HIGH&&flag==0)//print dist    
     // и перемення flag равна 0 , то ... 
     { 
           
       digitalWrite(13,!digitalRead(13)); 
       flag=1; 
       dist = dist + 0.32;
lcd.setCursor (0,0);
lcd.print ("      ");
lcd.setCursor (0,0);
lcd.print (dist , 3);
lcd.print ("  metr");
        
     } 
        
      if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
           
        flag=0;//обнуляем переменную flag 
     } 
} 

 

Freeman199
Offline
Зарегистрирован: 12.11.2015
#include <LiquidCrystal.h>
// initialize the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
int flag=0; 
 
void setup()  
   // sets the LCD's rows and colums:
  lcd.begin(16, 2);
 
}
       
    pinMode(13, OUTPUT);         
      
        
 
void loop() 
 
        
     if(digitalRead(14)==HIGH&&flag==0)//если кнопка нажата    
     // и перемення flag равна 0 , то ... 
     { 
           
       digitalWrite(13,!digitalRead(13)); 
       flag=1;
       dist = dist + 0.32;
lcd.setCursor (0,0);
lcd.print ("      ");
lcd.setCursor (0,0);
lcd.print (dist , 3);
lcd.print ("  metr"); 
        //это нужно для того что бы с каждым нажатием кнопки 
        //происходило только одно действие 
        // плюс защита от "дребезга"  100% 
        
     } 
        
      if(digitalRead(14)==LOW&&flag==1)//если кнопка НЕ нажата 
     //и переменная flag равна - 1 ,то ... 
     { 
           
        flag=0;//обнуляем переменную flag 
     } 
Это что за палочки такие? //   Они на код не влияют,или они не нужны?
Или после них что-то писать нужно?
bwn
Offline
Зарегистрирован: 25.08.2014

комментарии, на код не влияют

вы залить пробовали?

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

CCCCПППППАААААССССИИИИИИИБББААААААА!!!!!!!!!!!!!!!!!!!!!!

Kolchugin
Offline
Зарегистрирован: 15.12.2013

bwn, у автора темы дальше возникнет проблема с подключением геркона к пину А0.
У него шилд о 5 кнопках на этом выводе висит.

bwn
Offline
Зарегистрирован: 25.08.2014

Kolchugin пишет:

bwn, у автора темы дальше возникнет проблема с подключением геркона к пину А0.
У него шилд о 5 кнопках на этом выводе висит.

Адын кнопка в топку, на ее место геркон.
А в целом, полная хе*ня получается, но ТС сам напросился.

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

Пардоньте, програмный ресет не докинете?

 

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

Чего х**ня?

Все работает))

Kolchugin
Offline
Зарегистрирован: 15.12.2013

bwn, по мне, вполне рабочая программа!
Freeman199, добавьте в ваш проект сервомашинку и ей на кнопку ресет нажимайте. Программно - это очень трудно сделать.

bwn
Offline
Зарегистрирован: 25.08.2014

Freeman199 пишет:

Пардоньте, програмный ресет не докинете?

Дай бабка воды напиться, а то так жрать хочется, что переночевать негде.))))
Программный ресет распаян на плате дуины в виде отдельной кнопки и тоже работает. Каким образом будет обнуляться dist, данному коду абсолютно фиолетово. То, что вы просили в 8 посте выполнено полностью.
Если вы считаете, что бутерброд из двух шилдов с наружными соплями, это кошерное устройство, могу только порадоваться за вас.
Но еще раз предлагаю потратить немного времени и научится это делать самому.

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

Нет-нет,что вы, просто я подумал что если постоянно сбрасывать таким путем(каждые 1.5-2 мин)то она долго не проживет.

 

pcb
Offline
Зарегистрирован: 02.04.2015

Потом ноют, что заказчики хотят всего и вся, и подешевле.

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

Хорошо, во сколько лценивается работа с выдержкой всех указанных выше требований от исполнителя?

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

ПОрстто код который я просил выше для опытного программиста,ну не раз плюнуть,но сложностей там ведь нету,(ну если исключить отображения большимми цыфрами).

 

bwn
Offline
Зарегистрирован: 25.08.2014

pcb пишет:

Потом ноют, что заказчики хотят всего и вся, и подешевле.

Если вы считаете, что полученный результат имеет хоть какую то коммерческую ценность, я не завидую вашим заказчикам. На мой мой взгляд, это обычный глумеж, с целью дать понять ТС, что время потраченное на возгласы "хелп ми", можно было потратить на чтение тем на форуме и получить тот же результат.
Писать самого, я его все таки заставил. Чтобы сделать из этого что то нормальное, пускай решает сам - платить или не платить. ИМХО.

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

О, да, для опытного специалиста фигня, сделать из тазика мерседес.
Написать новый код чаще всего проще написать с нуля, нежели исправлять чужой код.
Меня удивляют люди, которые просят других сделать что то за них, оперируя тем, что они не умеют, но им НАДО.
Невольно вспоминается байка про то, что спец за работу берёт копейки, плюс за опыт в порядки больше сумму. Потому исправить одну строку стоит рубль, а опыт - M долларов.

bwn
Offline
Зарегистрирован: 25.08.2014

Freeman199 пишет:

Хорошо, во сколько лценивается работа с выдержкой всех указанных выше требований от исполнителя?

Понимаете, в данном случае оценивается ваша лень, а это весьма дорогое удовольствие. Никто не будет из чистого альтруизма заморачиваться на 100 предложенных рублей, а значит, либо учитесь сами, либо играете по правилам исполнителя. Как то так.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Freeman199 пишет:

ПОрстто код который я просил выше для опытного программиста,ну не раз плюнуть,но сложностей там ведь нету,(ну если исключить отображения большимми цыфрами).

А чем вы руководствуетесь, оценивая сложность проекта?

pcb
Offline
Зарегистрирован: 02.04.2015

Freeman199 пишет:

Хорошо, во сколько оценивается работа с выдержкой всех указанных выше требований от исполнителя?

Посыл был не вам, а исполнителю, который "занахаляву" поломал рынок.

Зачем за что то платить, если сделают "бесплатно"?

Freeman199 пишет:

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

Опытному хирургу, сделать коронарное шунтирование, ну не раз плюнуть, но и сложностей там нету ;)

bwn пишет:

я не завидую вашим заказчикам.

Думаете им плохо? У меня заказчиков ещё на полтора года вперёд. Плюсом несколько проектов от администрации города+пару совместных проектов с несколькими универами. И я знаю о чем говорю.

BWN, приглашаю весной к себе, показать, как нужно выкопать по периметру землю под опалубку для фундамента. Приходить со своей лопатой, техникой. )))