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

Обсуждаем электронику на колесах. Нужен увлажнитель воздуха для Камаза? Вам сюда.
Ответить
Родился
Сообщения: 6
Зарегистрирован: Пт май 01, 2020 13:56:47

Сообщение Timur86 »

Есть ардуино нано с экраном 1602 подключенное по I2C. Подскажите пожалуйста, куда можно подключить геркон и какой код можно написать чтобы он показывал скорость?
Реклама
Собутыльник Кота
Сообщения: 2804
Зарегистрирован: Вс фев 02, 2020 09:12:37

Сообщение 1en2 »

какой сможешь, такой и пиши... :)
Реклама
Родился
Сообщения: 6
Зарегистрирован: Пт май 01, 2020 13:56:47

Сообщение Timur86 »

нашёл такой код, но ничего не отображается

int val;
long last=0;
int stat=LOW;
int stat2;
int contar=0;
int displayrpm;
int sens=75; // this value indicates the limit reading between dark and light,
// it has to be tested as it may change acording on the
// distance the leds are placed.
int nPalas=1; // the number of blades of the propeller
int milisegundos=500; // the time it takes each reading
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
void setup()
{
Serial.begin(9600);

lcd.begin(16,2);
}
void loop()
{
val=analogRead(0);
if(val<sens)
stat=LOW;
else
stat=HIGH;
digitalWrite(13,stat); //as iR light is invisible for us, the led on pin 13
//indicate the state of the circuit.
if(stat2!=stat){ //counts when the state change, thats from (dark to light) or
//from (light to dark), remmember that IR light is invisible for us.
contar++;
stat2=stat;
}
if(millis()-last>=milisegundos){
double rps=((double)contar/nPalas)/2.0*1000.0/milisegundos;
double rpm=((double)contar/nPalas)/2.0*60000.0/(milisegundos);
displayrpm=rpm;
Serial.print((contar/2.0));Serial.print(" RPS ");Serial.print(rps);
Serial.print(" RPM");Serial.print(rpm);Serial.print(" VAL ");Serial.println(val);
contar=0;
last=millis();
Serial.print(" MPH ");
Serial.print(rpm*0.0080622311);

LCDPrint ();
}
}
void LCDPrint ()
{
lcd.clear ();
lcd.setCursor (0,0);
lcd.print("MPH");
lcd.setCursor (0,1);
lcd.print(displayrpm*0.0080622311 );
lcd.setCursor (8,0);
lcd.print("RPM");
lcd.setCursor (8,1);
lcd.print(displayrpm);
return;
}
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

разбей задачу на 2 части - писать на экране и измерять скорость и реши их по-очереди.
1) правильно подключи дисплей, научись выводить текст и переменные (вроде в арду за это отвечают разные команды) в требуемом тебе виде
тогда уже переходи к задаче №2 - к измерению скорости, когда решишь её, можно добавить №3 - автоматическое включение-выключение...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 6
Зарегистрирован: Пт май 01, 2020 13:56:47

Сообщение Timur86 »

Ivanoff-iv,
Подключить, то я подключил и надписи выводил. А тут не знаю почему. Я то ардуино начал неделю назад заниматься
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

все когдато начинали... я тоже с ардуины начинал, (из-за лсд дисплея, который был в комплекте с моей ардуиной и который сам без подсказок я запустить был не в состоянии)
так, текст уже выходит, хорошо, значит всё собрано правильно.
теперь изучай и выводи на дисплей переменные, как выведешь - пиши, не знаю, хватит ли точности миллис, попробуем находить скорость с помощью неё... (скорее всего повторим код написанный тобой выше, но, может и нет..., но даже если и повторим, то это будет осознанный код, а не простая копипаста).
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Родился
Сообщения: 6
Зарегистрирован: Пт май 01, 2020 13:56:47

Сообщение Timur86 »

Помогите с кодом пожалуйста. 2 недели пытаюсь найти, уже ардуино с экраном сжег по случайности, не хочу еще один набор сжечь
Друг Кота
Аватара пользователя
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Сообщение musor »

ка можно сжечь
ардуино с экраном сжег по случайности
непонятно в 230 засунул?
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Родился
Сообщения: 6
Зарегистрирован: Пт май 01, 2020 13:56:47

Сообщение Timur86 »

musor,
Магнит случайно уронил на плату экрана, испортился не только экран. Проверял на новом экране

Добавлено after 18 minutes 1 second:
/*
Created 2016
by AlexGyver
AlexGyver Home Labs Inc.
*/


//-----------дисплей-----------
#include <LiquidCrystal_I2C.h> // подключаем библиотеку для QAPASS 1602
LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей
//--------дисплей-------

float w_length=2.050; //длина окружности колеса в метрах

void setup() {
Serial.begin(9600); //открыть порт
attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
pinMode(3, OUTPUT); //3 пин как выход
digitalWrite(3, HIGH); //подать 5 вольт на 3 пин

//для дисплея цифры----------
LED_0F[0] = 0xC0; //0
LED_0F[1] = 0xF9; //1
LED_0F[2] = 0xA4; //2
LED_0F[3] = 0xB0; //3
LED_0F[4] = 0x99; //4
LED_0F[5] = 0x92; //5
LED_0F[6] = 0x82; //6
LED_0F[7] = 0xF8; //7
LED_0F[8] = 0x80; //8
LED_0F[9] = 0x90; //9

LED_0F[10] = 0b01000000; //.0
LED_0F[11] = 0b01111001; //.1
LED_0F[12] = 0b00100100; //.2
LED_0F[13] = 0b00110000; //.3
LED_0F[14] = 0b00011001; //.4
LED_0F[15] = 0b00010010; //.5
LED_0F[16] = 0b00000010; //.6
LED_0F[17] = 0b01111000; //.7
LED_0F[18] = 0b00000000; //.8
LED_0F[19] = 0b00010000; //.9
Timer1.initialize(1500); // set a timer of length 1500
Timer1.attachInterrupt(timerIsr); // attach the service routine here
//--------------
}

void sens() {
if (millis()-lastturn > 80) { //защита от случайных измерений (основано на том, что велосипед не будет ехать быстрее 120 кмч)
SPEED=w_length/((float)(millis()-lastturn)/1000)*3.6; //расчет скорости, км/ч
lastturn=millis(); //запомнить время последнего оборота
DIST=DIST+w_length/1000; //прибавляем длину колеса к дистанции при каждом обороте оного
}
}

void loop() {
int cel_sp=floor(SPEED);
int sot_sp=(((float)cel_sp/1000)-floor((float)cel_sp/1000))*10;
int des_sp=(((float)cel_sp/100)-floor((float)cel_sp/100))*10;
int ed_sp=(((float)cel_sp/10)-floor((float)cel_sp/10))*10;
int dr_sp=(float)(SPEED-floor(SPEED))*10;

if (flag==0) {
//disp.set(LED_0F[sot_sp],3); //вывод сотен скорости (для велосипеда не нужно =)
disp.set(LED_0F[des_sp],2); //вывод десятков скорости
disp.set(LED_0F[ed_sp+10],1); //вывод единиц скорости, с точкой
disp.set(LED_0F[dr_sp],0); //вывод после точки
}

int cel_di=floor(DIST); //целые
int sot_di=(((float)cel_di/1000)-floor((float)cel_di/1000))*10; //сотни
int des_di=(((float)cel_di/100)-floor((float)cel_di/100))*10; //десятки
int ed_di=floor(((float)((float)cel_di/10)-floor((float)cel_di/10))*10); //единицы (с точкой)
int dr_di=(float)(DIST-floor(DIST))*10; //десятые части



if ((millis()-lastturn)>2000){ //если сигнала нет больше 2 секунды
SPEED=0; //считаем что SPEED 0
}

void timerIsr() //нужно для дисплея
{
disp.timerIsr();
}

Пытаюсь переделать этот код под себя, но не знаю что делать с выводом на экран
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

это знакогенератор для 7сегментного светодиодного индикатора, а у тебя индикатор уже со встроенным знакогенератором....
готовый ардуиновский код я тебе не смогу написать - года три ардуину в руках не держал... есть одна, но она на работе, а я дома... поэтому проверить не на чем
а что заставило искать новый код? у тебя ведь получалось уже выводить на свой дисплей?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Спидометр на абдурине? И как в том ералаше — таскать за собой прицеп с батарейками... Ну или более простой вариант накачивать ноги: работать на генератор!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Родился
Сообщения: 6
Зарегистрирован: Пт май 01, 2020 13:56:47

Сообщение Timur86 »

Ivanoff-iv,
Когда я смог подключить дисплей, датчик холла стал считывать секунду(то есть ему нужна секунда чтоб увидеть магнит). Пытался найти в чем причина и решил попробовать другой переделать, но с новым кодом тоже проблемы
Друг Кота
Сообщения: 7722
Зарегистрирован: Вс июл 24, 2011 11:38:09

Сообщение 74LS00 »

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

В общем думаю прилепить чтото такое или такое.

Частоту не знаю, возможно 10гц, мои приборы такие короткие импульсы не видят.
Один из вариантов поставить удвоитель частоты на логике, не знаю на сколько оно сможет работать.
Спойлер

Код: Выделить всё

volatile int time = 0;
volatile int time_last = 0; 
volatile float rev=0;
volatile int rpm;

//сетуп
setitr();
digitalWrite(2, HIGH);
//

void taho() {
  rev++;
}

void setitr(){
  attachInterrupt(0,taho,FALLING); //digitalPinToInterrupt(2)
}


//цикл
detachInterrupt(0);   

time = ( millis() - time_last);
rpm=(rev/time)*60000; 
time_last = millis();
rev=0;

setitr();

//
Алгоритм я понял так.
Берётся цифра которая выросла за всё время до импульса и она показывается, ну и заодно прибавляется к другой цифре из которой и будет опять взята эта цифра. Этот трюк работает если эти цифры получать часто чтоб экран не успевал их убирать.
Этот код изначально казался сложным и примудрым, я думал реально есть какойто таймер который следит за участком времени, а оказалось тут вообще голимо.

------------

Как оказалось это работает если delay хотябы 250, а в идеале больше чем импульс. Но уже при такой на экране секунды начали не попадать. Так что такой измеритель и часы в одной коробке уже не получатся
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15702
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

У адуринки есть функция
pulseIn(pin, value)
которая
"Works on pulses from 10 microseconds to 3 minutes in length."
Интервал между сигналом датчика нам известен, длина окружности колеса (при давлении "по умолчанию") также.
Вот на основе этих данных и строим "веломер".
8)
Друг Кота
Сообщения: 7722
Зарегистрирован: Вс июл 24, 2011 11:38:09

Сообщение 74LS00 »

В общем то прикинул и оказалось что при длине окружности малюсенького колеса 1.69м, частота получается 0.02 в секунду за 1км/ч.
Это всё полнейшая фигня. Надо или магнитов добавлять, или брать с внутреннего датчика с потерями, или умножать или замерять както ещё, как вариант отдельный МК который не будет занят экраном.

pulseIn()

Код: Выделить всё

const int pintaho = 2;
unsigned long duration;
 
void setup()
{  
  pinMode(pintaho, INPUT);
  digitalWrite(pintaho, HIGH);
}
 
void loop()
{
  duration = pulseIn(pintaho , LOW);
}
Насчитывает 6, 8, 9. Если в последней строчке поставить HIGH, тогда вдвое меньше кажет. Ну можно резюк приколхозить вместо "digitalWrite(pintaho, HIGH);", но сомневаюсь что оно чтото даст.

Видимо мои старые подсчёты с ошибками, там говорится о 3 магнитах, да и окружность 1м видимо наугад. Там была вообще другая цель эстетическая, перевода в метры в минуту, поэтому о частоте и не думал.

---
С этим кодом контролер стартует не сразу, а секунды через 3
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15702
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

У старомеханического на оси втулки колеса стоял диск с пазами, которые шестернку крутили.
Уж не помню, сколько там пазов/зубьев было... А с шерстеренки тросик шел в головку со стрелкой(текущая скорость) и барабанным счетчиком(километраж).
Хоша... В принципе и один оборот тем pulseIn(pin, value) замерить можно, но потребуется и усреднение и масштабирование результата, да еще и отсечка "неполного оборота" при "пешем ходе" (или "обратном вращении).
Как вариант - два датчика со смещением и областью взаимоперекрытия - как у контактов энкодера.
8)
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

У механики был механизм, передающий на тросик вращение (передаточное число было около 3-4) но это совсем другая история...
74LS00, бешеная производительность... :facepalm: может в этом случае есть смысл слезть с ардуины? :dont_know:
(в смысле - платку оставить, а программу сменить? ИМХО для этой задачи заглаза тини2313 хватит... при нормальной программе)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Друг Кота
Аватара пользователя
Сообщения: 15702
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ну уж не так, чтоб и другая...
Допустим моторчик, выдающий ЭДС пропорционально скорости вращения вала.
И тот же вопрос на сколько "тиков" оборот колеса поделить...
Хотя ... я б таки два датчика с пластиной поставил - как у энкодера...
А к оному периодомер с пересчетом...
:roll:
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

логично. но нужно ли определять направление? я например задним ходом на велосипеде практически не езжу...
а если как защиту от накручивания, то небольшой конденсатор и 2 геркона (один заряжает, другой разряжает) так и накручивать, раскачивая магнит у геркона не выйдет и от сквозных токов (которые идут, если оставить колесо магнитом у геркона), разряжающих батарею избавляемся...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Друг Кота
Аватара пользователя
Сообщения: 15702
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Герконы конечно можно (надежное народное средство)...
Однако есть и поинтереснее:
A3141-2-3-4.pdf
(735.22 КБ) 355 скачиваний
AH3503.pdf
(205.21 КБ) 296 скачиваний
что тот,что другой сейчас у торговцев абдуринкой продаются...
:roll:
Ответить

Вернуться в «АвтоМотоВело»