Обсуждаем электронику на колесах. Нужен увлажнитель воздуха для Камаза? Вам сюда.
Ответить

Re: спидометр для велосипеда на arduino

Пт фев 05, 2021 06:01:50

Сейчас не буду пробовать код, нет желания лопатить камень, да и он с придурью, а новые на почте забирать надо.
Но посмотрел и не увидел что там измеряет. Фактически это бесконечное сложение за период цикла, которое начинается при новом. При загрузке другими задачами, длительность цикла как мне кажется изменится и число будет другим. Ну или хз.
В том коде что я оставил, тоже есть такая зависимость.
Но исходя из неё, и их того что не могу замерить 0, то остаётся вариант или разбиратся с тахометром на тиньке, или заказывать не очень дешёвую микру ПЧН. Написал продавцу LM231 SMD, может быть он продаст немножно, или придётся брать чтото в DIP.

Изначально думал делать аналог, но пока не наблюдаю схем. В случае с цифрой, наверно будет проще сделать отдельный МК для замера, а потом както выводить это в аналог, и вот с этим сложнее.

Re: спидометр для велосипеда на arduino

Пт фев 05, 2021 17:53:31

Фактически это бесконечное сложение за период цикла,

да сложение, но дальше надо вычислять...
какой диаметр колеса, за сколько будем сек вычислять и тд.

к примеру один оборот колеса равен 1 метр, выводим показания за одну секунду...

// Если время контроллера millis, больше переменной на 1000, то запускаем условие if
if (millis() - currentTime > 1000)

// выводим на экран результат
clicks=одно замыкание геркона / на секунду

// Устанавливаем курсор на вторую строку и нулевой символ.
lcd.setCursor(0, 1);

// Выводим на экран количество нажатий кнопки с момента запуска ардуины
lcd.print(clicks); // скорость метров/секунду


ну да надо и привести это все в километры/час.

Re: спидометр для велосипеда на arduino

Пт фев 05, 2021 22:06:26

Вот тут и встрял, не знаю что лучше, в даташите схем нет, попалась только китайская.

Это все про subj ? Нахрена это все ? Куда то урулили вообще... Если вариант с геркономи и магнитом тупняком не нравится - кто мешает поставить несколько магнитов ? Заводские современные с герконом, народ юзает и вроде сильно не ругает.

Re: спидометр для велосипеда на arduino

Сб фев 06, 2021 09:23:38

вот, иностранный дядька все сделал :shock:

а тут иностранного дядьку перевел наш дядька https://cxem.net/arduino/arduino60.php :tea:

и тут о том-же говорили :sleep:

ну и я чета там тыкнул :solder:

Спойлер//bike speedometer
//by Amanda Ghassaei 2012
//<a href="<a href="<a href="http://www.instructables.com/id/Arduino-Bike-Speedometer/" rel="nofollow">http://www.instructables.com/id/Arduino-Bike-Speedometer/</a>" rel="nofollow"><a href="http://www.instructables.com/id/Arduino-Bike-Speedometer/" rel="nofollow">http://www.instructables.com/id/Arduino-Bike-Speedometer/</a></a>" rel="nofollow"><a href="<a href="http://www.instructables.com/id/Arduino-Bike-Speedometer/" rel="nofollow">http://www.instructables.com/id/Arduino-Bike-Speedometer/</a>" rel="nofollow"><a href="http://www.instructables.com/id/Arduino-Bike-Speedometer/" rel="nofollow">http://www.instructables.com/id/Arduino-Bike-Speedometer/</a></a></a>

/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
*/

//outputs speed of bicycle to LCD

//calculations
//tire radius ~ 13.5 inches
//circumference = pi*2*r =~85 inches
//max speed of 35mph =~ 616inches/second
//max rps =~7.25

#include <EEPROM.h> //библиотека для работы со внутренней памятью ардуино
#define reed A0//pin connected to read switch
#include <LiquidCrystal.h>//установил обычный дисплей
LiquidCrystal lcd(12, 11, 5, 4, 3, 6);
//storage variables

int reedVal;
int odo;//количество оборотов колеса
long timer = 0;// time between one full rotation (in ms)
float mph = 0.00;
float circumference;
boolean backlight;
char vivod;

int maxReedCounter = 100;//min time (in ms) of one rotation (for debouncing)
int reedCounter;


void setup(){
odo=0;
odo=(float)EEPROM.read(0)/10.0; // пройденное расстояние при запуске системы

reedCounter = maxReedCounter;
circumference = 2095; //здесь явно задал окружность
pinMode(1,OUTPUT);//tx
pinMode(2,OUTPUT);//backlight switch
pinMode(reed, INPUT);
lcd.begin(16, 2);

Serial.write(12);//clear



// TIMER SETUP- the timer interrupt allows preceise timed measurements of the reed switch
//for mor info about configuration of arduino timers see <a href="<a href="<a href="http://arduino.cc/playground/Code/Timer1" rel="nofollow">http://arduino.cc/playground/Code/Timer1</a>" rel="nofollow"><a href="http://arduino.cc/playground/Code/Timer1" rel="nofollow">http://arduino.cc/playground/Code/Timer1</a></a>" title="<a href="<a href="http://arduino.cc/playground/Code/Timer1" rel="nofollow">http://arduino.cc/playground/Code/Timer1</a>" rel="nofollow"><a href="http://arduino.cc/playground/Code/Timer1" rel="nofollow">http://arduino.cc/playground/Code/Timer1</a></a>" rel="nofollow"><a href="<a href="http://arduino.cc/playground/Code/Timer1" rel="nofollow">http://arduino.cc/playground/Code/Timer1</a>" rel="nofollow"><a href="http://arduino.cc/playground/Code/Timer1" rel="nofollow">http://arduino.cc/playground/Code/Timer1</a></a></a>
cli();//stop interrupts

//set timer1 interrupt at 1kHz
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;
// set timer count for 1khz increments
OCR1A = 1999;// = (1/1000) / ((1/(16*10^6))*8) - 1
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS11 bit for 8 prescaler
TCCR1B |= (1 << CS11);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);

sei();//allow interrupts
//END TIMER SETUP

}



ISR(TIMER1_COMPA_vect) {//Interrupt at freq of 1kHz to measure reed switch
reedVal = digitalRead(reed);//get val of A0

if (reedVal){//if reed switch is closed
if (reedCounter == 0){//min time between pulses has passed
mph = (3.6*float(circumference))/float(timer); //расчет скорости, км/ч
odo++;
timer = 0;//reset timer
reedCounter = maxReedCounter;//reset reedCounter
}
else{
if (reedCounter > 0){//don't let reedCounter go negative
reedCounter -= 1;//decrement reedCounter
}
}
}
else{//if reed switch is open
if (reedCounter > 0){//don't let reedCounter go negative
reedCounter -= 1;//decrement reedCounter
}
}
if (timer > 2000){
mph = 0;//if no new pulses from reed switch- tire is still, set mph to 0
EEPROM.write(0,(float)odo*10.0); //записываем odo во EEPROM память.
}
else{
timer += 1;//increment timer
}
}

void displayMPH(){
lcd.clear();//clear
lcd.print("Speed ");
lcd.setCursor(6, 0);
lcd.print(mph);
lcd.setCursor(0, 1);
lcd.print(String(byte(odo*circumference/1000000))+"km "+int(odo*(int(circumference)%1000000))/1000+"m"); //здесь одометр, отдельно км и м, вычислить именно метры элегантней способа не нашел
lcd.setCursor(11, 1);
lcd.print(odo);//вывод оборотов колеса для отладки
}

void loop(){
//print mph once a second
displayMPH();
delay(1000);
}

Re: спидометр для велосипеда на arduino

Сб фев 06, 2021 13:53:25

Побазарил с продавцом, он просит почти 10 баксов, ладно куплю диповые за 5.

Повторял я этого дядьку, оно не работает, там надо delay большой ставить чтоб работало, и все эти ардуиновские коды на этом завязаны.
Вот тот последний самый продвинутый и писал, не помню где ссылки, может на хабре, а может и не постил их. Оно работает хоть и зависимо от загружености, но 0 оно не видит, оно просто останавливается.

Ладно в долгий ящик её

Re: спидометр для велосипеда на arduino

Сб фев 06, 2021 14:39:36

а вот у этого дядьки все работает

а код можно поправить под LCD 1602

Re: спидометр для велосипеда на arduino

Сб фев 06, 2021 21:53:08

Оригинальное решение!
8)
Однако серва со стрелкой жреть энергии многовато (для велика)...
:roll:
Ответить