Заголовок сообщения: спидометр для велосипеда на arduino
Добавлено: Пт май 01, 2020 15:01:41
Родился
Зарегистрирован: Пт май 01, 2020 13:56:47 Сообщений: 6
Рейтинг сообщения:0
Есть ардуино нано с экраном 1602 подключенное по I2C. Подскажите пожалуйста, куда можно подключить геркон и какой код можно написать чтобы он показывал скорость?
Заголовок сообщения: Re: спидометр для велосипеда на arduino
Добавлено: Вт май 05, 2020 00:03:23
Родился
Зарегистрирован: Пт май 01, 2020 13:56:47 Сообщений: 6
Рейтинг сообщения:0
нашёл такой код, но ничего не отображается
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);
разбей задачу на 2 части - писать на экране и измерять скорость и реши их по-очереди. 1) правильно подключи дисплей, научись выводить текст и переменные (вроде в арду за это отвечают разные команды) в требуемом тебе виде тогда уже переходи к задаче №2 - к измерению скорости, когда решишь её, можно добавить №3 - автоматическое включение-выключение...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
все когдато начинали... я тоже с ардуины начинал, (из-за лсд дисплея, который был в комплекте с моей ардуиной и который сам без подсказок я запустить был не в состоянии) так, текст уже выходит, хорошо, значит всё собрано правильно. теперь изучай и выводи на дисплей переменные, как выведешь - пиши, не знаю, хватит ли точности миллис, попробуем находить скорость с помощью неё... (скорее всего повторим код написанный тобой выше, но, может и нет..., но даже если и повторим, то это будет осознанный код, а не простая копипаста).
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
_________________ ZМудрость(Опыт и выдержка) приходит с годами. Все Ваши беды и проблемы, от недостатка знаний. Умный и у дурака научится, а дураку и .. Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
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[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(); }
Пытаюсь переделать этот код под себя, но не знаю что делать с выводом на экран
это знакогенератор для 7сегментного светодиодного индикатора, а у тебя индикатор уже со встроенным знакогенератором.... готовый ардуиновский код я тебе не смогу написать - года три ардуину в руках не держал... есть одна, но она на работе, а я дома... поэтому проверить не на чем а что заставило искать новый код? у тебя ведь получалось уже выводить на свой дисплей?
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Спидометр на абдурине? И как в том ералаше — таскать за собой прицеп с батарейками... Ну или более простой вариант накачивать ноги: работать на генератор!
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Заголовок сообщения: Re: спидометр для велосипеда на arduino
Добавлено: Пт май 08, 2020 10:11:04
Родился
Зарегистрирован: Пт май 01, 2020 13:56:47 Сообщений: 6
Рейтинг сообщения:0
Ivanoff-iv, Когда я смог подключить дисплей, датчик холла стал считывать секунду(то есть ему нужна секунда чтоб увидеть магнит). Пытался найти в чем причина и решил попробовать другой переделать, но с новым кодом тоже проблемы
Вывалю свой набросок, отсюда, наверно почти лучший вариант что попалось. В общем эта фигня не работает на таких скоростях. Редкие импульсы оно показывает как 500, потом цифра вырастает раз в 5, потом ещё вдвое, сбрасывает на 0 и повторяется. Может можно посчитать какоето среднее, но чё контролер забивать такой фигнёй, ему и так работы валом.
Частоту не знаю, возможно 10гц, мои приборы такие короткие импульсы не видят. Один из вариантов поставить удвоитель частоты на логике, не знаю на сколько оно сможет работать.
Спойлер
Код:
volatile int time = 0; volatile int time_last = 0; volatile float rev=0; volatile int rpm;
Алгоритм я понял так. Берётся цифра которая выросла за всё время до импульса и она показывается, ну и заодно прибавляется к другой цифре из которой и будет опять взята эта цифра. Этот трюк работает если эти цифры получать часто чтоб экран не успевал их убирать. Этот код изначально казался сложным и примудрым, я думал реально есть какойто таймер который следит за участком времени, а оказалось тут вообще голимо.
----------
Как оказалось это работает если delay хотябы 250, а в идеале больше чем импульс. Но уже при такой на экране секунды начали не попадать. Так что такой измеритель и часы в одной коробке уже не получатся
У адуринки есть функция pulseIn(pin, value) которая "Works on pulses from 10 microseconds to 3 minutes in length." Интервал между сигналом датчика нам известен, длина окружности колеса (при давлении "по умолчанию") также. Вот на основе этих данных и строим "веломер".
В общем то прикинул и оказалось что при длине окружности малюсенького колеса 1.69м, частота получается 0.02 в секунду за 1км/ч. Это всё полнейшая фигня. Надо или магнитов добавлять, или брать с внутреннего датчика с потерями, или умножать или замерять както ещё, как вариант отдельный МК который не будет занят экраном.
Насчитывает 6, 8, 9. Если в последней строчке поставить HIGH, тогда вдвое меньше кажет. Ну можно резюк приколхозить вместо "digitalWrite(pintaho, HIGH);", но сомневаюсь что оно чтото даст.
Видимо мои старые подсчёты с ошибками, там говорится о 3 магнитах, да и окружность 1м видимо наугад. Там была вообще другая цель эстетическая, перевода в метры в минуту, поэтому о частоте и не думал.
--- С этим кодом контролер стартует не сразу, а секунды через 3
У старомеханического на оси втулки колеса стоял диск с пазами, которые шестернку крутили. Уж не помню, сколько там пазов/зубьев было... А с шерстеренки тросик шел в головку со стрелкой(текущая скорость) и барабанным счетчиком(километраж). Хоша... В принципе и один оборот тем pulseIn(pin, value) замерить можно, но потребуется и усреднение и масштабирование результата, да еще и отсечка "неполного оборота" при "пешем ходе" (или "обратном вращении). Как вариант - два датчика со смещением и областью взаимоперекрытия - как у контактов энкодера.
У механики был механизм, передающий на тросик вращение (передаточное число было около 3-4) но это совсем другая история... 74LS00, бешеная производительность... может в этом случае есть смысл слезть с ардуины? (в смысле - платку оставить, а программу сменить? ИМХО для этой задачи заглаза тини2313 хватит... при нормальной программе)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Ну уж не так, чтоб и другая... Допустим моторчик, выдающий ЭДС пропорционально скорости вращения вала. И тот же вопрос на сколько "тиков" оборот колеса поделить... Хотя ... я б таки два датчика с пластиной поставил - как у энкодера... А к оному периодомер с пересчетом...
логично. но нужно ли определять направление? я например задним ходом на велосипеде практически не езжу... а если как защиту от накручивания, то небольшой конденсатор и 2 геркона (один заряжает, другой разряжает) так и накручивать, раскачивая магнит у геркона не выйдет и от сквозных токов (которые идут, если оставить колесо магнитом у геркона), разряжающих батарею избавляемся...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 24
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения