12.09.2016, 12:19 | #1 | |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
масштабное измерение скорости V2.0
Чтобы не "мусорить" в чужой теме...
Давно блуждали мысли, "поковырять" arduino, но так как реального применения не находилось, то так на уровне мыслей все и оставалось. И тут наткнулся на тему xu56857 масштабное измерение скорости Первоначально планировалось только доработать авторский код с целью добавления возможности выбора масштаба и единиц измерения, но выслушав советы BR95009 и Qvan22, основательно "перелопатил" исходный скетч. В чем отличие от авторского - как таковые убраны задержки обработки кода, т.е. программа работает постоянно, все задержки реализованы при помощи флагов. Все пины и константы вынесены в переменные, что позволяет подключать датчики и кнопки к любому выходу с минимальными правками кода. Добавлен выбор масштаба (HO, TT, N). При необходимости можно добавить любой масштаб Добавлен выбор единиц измерения (км/ч, MPH). При необходимости можно добавить любые единицы (дюймы в сек, миллиметры в сек... Все, что душе угодно). Для сохранения выбранных настроек используется энергонезависимая память контроллера (EEPROM), что позволяет при повторном включении вернутся к последним выбранным единицам измерения и масштабу Добавлена анимация во время измерения. Вместо надписей GO LEFT/GO RIGHT - реализована бегущая строка из символов > и < движущихся в соответствующем направлении Пока все реализовано на макетке на UNO, жду нужные компоненты от наших китайских товарищей и буду реализовывать в "железе". Схема скетч Arduino код:
Последний раз редактировалось BNSF9399; 14.09.2016 в 02:12. |
|
|
3 пользователя(ей) сказали cпасибо: |
12.09.2016, 14:59 | #2 |
Местный
Регистрация: 29.06.2010
Адрес: Москва
Сообщений: 2,842
Сказал(а) 'не согласен(а)'!: 6
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 974
Поблагодарили 2,656 раз(а) в 1,572 сообщениях
:
0 за это сообщение 3 Всего Репутация: репутация неоспорима (2702)
|
|
|
2 пользователя(ей) сказали cпасибо: |
12.09.2016, 15:27 | #3 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
|
|
12.09.2016, 19:57 | #4 |
Московский модуль
Регистрация: 02.02.2015
Адрес: Москва
Сообщений: 943
Сказал(а) 'не согласен(а)'!: 9
Сказали 'не согласен'! 2 раз(а) в 2 сообщениях
Сказал(а) спасибо: 3,994
Поблагодарили 3,328 раз(а) в 639 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (3343)
|
Попробовал установить Ваш скетч - супер! Очень понравилось , что добавили время ожидания в 20 секунд на срабатывания второго датчика, я об этом думал, но руки не дошли ((, проще было нажать "резет". Вот что значит софт написанный специалистом, спасибо!
|
|
12.09.2016, 20:30 | #5 | |
Brocken-Meister
Регистрация: 27.04.2012
Адрес: !Msk
Сообщений: 8,628
Сказал(а) 'не согласен(а)'!: 7
Сказали 'не согласен'! 110 раз(а) в 87 сообщениях
Сказал(а) спасибо: 7,030
Поблагодарили 9,327 раз(а) в 3,314 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (9368)
|
Цитата:
---------- Сообщение добавлено в 22:30 ---------- Предыдущие сообщение было в 22:24 ---------- Шикарно, очень элегантно! Кстати, если будете паять на навесном монтаже, то я тут для себя открыл вот такие макетки. На ней собирается, также как на бредборде и паяется, с перемычками. Красота.
__________________
H0 - DR/DB, Ep.III, G и H0m - HSB, Н0е - DR/ÖBB/Zillertalbahn Ep.V-VI. И эночка. Московский Модуль H0-присоединяйтесь! |
|
|
12.09.2016, 21:07 | #6 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
Хорошие, но резать надо дорожки. Хотя, это удобнее чем лишние перемычки делать. Но я заказал обычные, благо не так много соединений.
ну у меня реально только при изменении значения запись идет. Можно доработать, делать запись если состояние не менялось какоето время, тем самым исключив запись "прощелкиваемых" позиций. подумаю над этим. Я такой же специалист, как и вы. Это вообще мое первое "творение" на ардуине. Так, php средненько знаю, лет 10 назад на перле немного упражнялся. Спасибо BR95009, показал красивый "финт" с millis(), иначе ябы тоже залез в цикл прерываемый вторым датчиком. |
|
Пользователь сказал cпасибо: |
12.09.2016, 21:23 | #7 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
Это время можно менять на свое усмотрение. у меня с MD LSH micro 1 см за 20 сек проезжает. Стало быть 7см - 140 сек.
Тут можно или дробную часть измерений увеличить (в моем варианте только десятые отображает), либо смириться с тем, что маленькие скорости не меряем. за получение форматированного результата отвечает функция dtostrf(sV,12,1,buffer); Где 12 - это минимальное количество символов в возврате (включая точку) и 1 количество знаков в дробной части. Почему я сделал так - все просто. при обработке мне не надо считать длину получившегося числа, чтобы прижать его вправо к единицам измерения. эта функция дополнит число ведущими пробелами до 12 знаков. итого, я печатаю с нулевой позиции число и точно знаю, что оно у меня всегда закончится в 11 позиции, а с 13 позиции я печатаю единицы измерения. Если поменять 1 на 3, то получим 3 знака после запятой в возврате. Тогда и таймаут можно побольше сделать. |
|
Пользователь сказал cпасибо: |
12.09.2016, 22:23 | #8 |
Brocken-Meister
Регистрация: 27.04.2012
Адрес: !Msk
Сообщений: 8,628
Сказал(а) 'не согласен(а)'!: 7
Сказали 'не согласен'! 110 раз(а) в 87 сообщениях
Сказал(а) спасибо: 7,030
Поблагодарили 9,327 раз(а) в 3,314 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (9368)
|
Зачем резать? Паяйте так же, как ставите на бредбоард. Все очень культурно. Правда не так компактно, но для компактных решений один хрен свою PCB нужно делать нормальну двухстороннюю.
__________________
H0 - DR/DB, Ep.III, G и H0m - HSB, Н0е - DR/ÖBB/Zillertalbahn Ep.V-VI. И эночка. Московский Модуль H0-присоединяйтесь! |
|
12.09.2016, 23:30 | #9 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
|
|
Пользователь сказал cпасибо: |
13.09.2016, 11:26 | #10 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
вынес чтение в отдельную функцию, так как оно нужно только при старте.
запись сделал перед началом отображения результатов. т.е. в процессе работы можно менять масштаб и единицы, но в EEPROM они будут записаны только после очередного замера скорости. а вернее, даже не записаны, а обновлены. Т.е. запись произойдет только в том случае, если значение в EEPROM отличается от текущего выбранного. Еще бы с округлением дробного числа разобраться. Чтото мне подсказывает, что dtostrf просто отрезает лишние знаки. В результате 0.19 км/ч будет отображаться как 0.1, а надо 0.2 round только до целого округляет. Делать финт ушами с округлением значения умноженного на 10, а затем делить на 10? красивее пока в голову ничего не лезет. |
|
Пользователь сказал cпасибо: |
13.09.2016, 12:03 | #11 | |
Brocken-Meister
Регистрация: 27.04.2012
Адрес: !Msk
Сообщений: 8,628
Сказал(а) 'не согласен(а)'!: 7
Сказали 'не согласен'! 110 раз(а) в 87 сообщениях
Сказал(а) спасибо: 7,030
Поблагодарили 9,327 раз(а) в 3,314 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (9368)
|
А зачем замерять до десятых вообще?
Мы же для настройки меряем Мах скорость, а она обычно в десятах киллометров у локомотивов (у немецких, например). По этому округелние до целых вполне себе годится. А так то: Цитата:
__________________
H0 - DR/DB, Ep.III, G и H0m - HSB, Н0е - DR/ÖBB/Zillertalbahn Ep.V-VI. И эночка. Московский Модуль H0-присоединяйтесь! |
|
|
13.09.2016, 14:38 | #12 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
в принципе - да, а вдруг минимальную захочется померять? у меня 0.188 она.
ну так оно до целого округляет. в php в round второй параметр указывает дробную часть, т.е. round(0.188, 2) вернет 0.19, round(0.188,1) - 0.2, а тут round(0.188) вернет 0. Поэтому и получается, что нужно делать round(0.188*10)/10 ? |
|
Пользователь сказал cпасибо: |
13.09.2016, 15:39 | #14 | |
Brocken-Meister
Регистрация: 27.04.2012
Адрес: !Msk
Сообщений: 8,628
Сказал(а) 'не согласен(а)'!: 7
Сказали 'не согласен'! 110 раз(а) в 87 сообщениях
Сказал(а) спасибо: 7,030
Поблагодарили 9,327 раз(а) в 3,314 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (9368)
|
Цитата:
---------- Сообщение добавлено в 17:36 ---------- Предыдущие сообщение было в 17:34 ---------- А что нам даст остаток от деления? ---------- Сообщение добавлено в 17:39 ---------- Предыдущие сообщение было в 17:36 ---------- Я решил проблему проще: int a = 7; int b = 4; Serial.print(float(a/b)); // выводит 1,75
__________________
H0 - DR/DB, Ep.III, G и H0m - HSB, Н0е - DR/ÖBB/Zillertalbahn Ep.V-VI. И эночка. Московский Модуль H0-присоединяйтесь! |
|
|
13.09.2016, 15:52 | #15 |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,866
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,667
Поблагодарили 3,281 раз(а) в 1,177 сообщениях
:
0 за это сообщение 1 Всего Репутация: репутация неоспорима (3292)
|
Даст 2 знака после запятой, без применения типов с плав.запятой.
Только надо выводить в формате "00", чтобы лидирующий 0 не терялся, если результат получится меньше 10 (меньше 0.1) Тут опять float используется, можно и без этого сделать, только на целочисленных операциях. |
|
13.09.2016, 16:07 | #16 |
Brocken-Meister
Регистрация: 27.04.2012
Адрес: !Msk
Сообщений: 8,628
Сказал(а) 'не согласен(а)'!: 7
Сказали 'не согласен'! 110 раз(а) в 87 сообщениях
Сказал(а) спасибо: 7,030
Поблагодарили 9,327 раз(а) в 3,314 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (9368)
|
Ну можно все умножить на 1000. А потом выводить по условиям.
__________________
H0 - DR/DB, Ep.III, G и H0m - HSB, Н0е - DR/ÖBB/Zillertalbahn Ep.V-VI. И эночка. Московский Модуль H0-присоединяйтесь! |
|
13.09.2016, 16:38 | #17 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
красиво, но теперь нужно посчитать, с какой позиции печатать это на экрене
коэффициенты перевода и метры в секунду с разной точностью. лишняя операция деления - меньше грузит процессор чем умножение на float? И, в очередной раз, спасибо Arduino код:
S / T даст тотже результат. |
|
2 пользователя(ей) сказали cпасибо: |
13.09.2016, 17:05 | #18 | |
Местный
Регистрация: 08.07.2015
Адрес: МО
Сообщений: 2,866
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 3 раз(а) в 2 сообщениях
Сказал(а) спасибо: 4,667
Поблагодарили 3,281 раз(а) в 1,177 сообщениях
:
0 за это сообщение 1 Всего Репутация: репутация неоспорима (3292)
|
Цитата:
|
|
|
Пользователь сказал cпасибо: |
14.09.2016, 13:45 | #19 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
Шальные руки голове покоя не дают. в процессе экспериментов выяснилось, что функция dtostrf превосходно округляет сама. также выяснилось, что при расчете скорости в м/с V = S / T при большом значении T, зачастую получаем на выходе 0. проблему решил умножением S на 1000, с последующим умножением на 0.001 результата масштабной скорости Arduino код:
Ниже два скетча. Первый без кнопки, количество знаков задается в переменной Arduino код:
схема скетч v2.10 - без кнопки Arduino код:
|
/*
scale speed meter v3.10 2016.09.14 13:14 GMT
*/
#include <LiquidCrystal.h> // Добавляем библиотеку LCD
#include <EEPROM.h> // Добавляем библиотеку работы с энергонезависимой памятью
// Добавляем библиотеку антидребезга кнопок
/* * * * * * * * * * * * * * * * * * * * * * * * * * * *
Main code by Thomas O Fredericks (tof@t-o-f.info)
Previous contributions by Eric Lowry, Jim Schimpf and Tom Harkaway
[url]https://github.com/thomasfredericks/Bounce2/archive/master.zip[/url]
* * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include <Bounce2.h>
// переменные, которые можно менять
int S = 70; //дистанция (расстояние между датчиками) в миллиметрах
int resultDelay = 5000; // время показа результата измерений в миллисекундах
int animationDelay = 50; // время задержки анимации в миллисекундах
unsigned long timeoutDelay = 160000; // время ожидания срабатывания второго датчика в миллисекундах
// флаги
unsigned long flagLeft = 0; // время срабатывания левого датчика
unsigned long flagRight = 0; // время срабатывания правого датчика
unsigned long flagShow = 0; //время окончания отображения результатов
unsigned long flagAnimation = 0; //время отображения следующего символа при анимации
// переменные для расчетов
unsigned long timeStart;//время срабатывания первого датчика
unsigned long timeStop;//время срабатывания второго датчика
long T; //интервал в милисекундах
float V; //скорость в м/с
float sV; //масштабная скорость
int selected_scale = EEPROM.read(0); // ключ массива выбранного масштаба
int selected_unit = EEPROM.read(1); // ключ массива выбранных единиц измерения
int selected_decimals = EEPROM.read(2); // ключ массива точности отображения результата
// массивы, которые можно дополнять или изменять
const String scale[][2] = {{" HO", "87"}, {" TT", "120"}, {" N", "160"}}; // массив масштабов (отображение на экране, множитель)
const String units[][2] = {{"KPH", "3.6"}, {"MPH", "2.23694"}}; // массив единиц измерения (отображение на экране, коэффициент перевода из метров в секунду)
int decimals[] = {1, 2, 3}; // массив точности отображения результата.
LiquidCrystal lcd(4, 5, 6, 7, 8, 9); // (RS, E, DB4, DB5, DB6, DB7) инициализируем дисплей
int ir_left = 2; // вход лекого датчика
int ir_right = 3; // вход правого датчика
int scalePin = 10; // вход кноки выбора масштаба
int unitsPin = 11; // вход кнопки выбора единиц измерения скорости
int decimalsPin = 12; // вход кнопки выбора точночти отображения результатов
Bounce scaleBouncer = Bounce(); // объект-обработчик антидребезга кнопки выбра масштаба
Bounce unitsBouncer = Bounce(); // объект-обработчик антидребезга кнопки выбора единиц измерения
Bounce decimalsBouncer = Bounce(); // объект-обработчик антидребезга кнопки выбора точночти отображения результата
// переменные для анимации
int r;
char c;
void setup() {
lcd.begin(16, 2);
pinMode(ir_left, INPUT);
pinMode(ir_right, INPUT);
pinMode(scalePin, INPUT);
pinMode(unitsPin, INPUT);
// параметры обработчика антидребезга
scaleBouncer.attach(scalePin);
scaleBouncer.interval(5);
unitsBouncer.attach(unitsPin);
unitsBouncer.interval(5);
decimalsBouncer.attach(decimalsPin);
decimalsBouncer.interval(5);
}
// расчет скорости
void calculateSpeed(int selected_unit, int selected_scale, int selected_decimals){
T = (timeStop - timeStart);
V = S * 1000.0 / T;
sV = V * units[selected_unit][1].toFloat() * scale[selected_scale][1].toInt() * 0.001;
char buffer[12];
String tmpStr = dtostrf(sV, 12, decimals[selected_decimals], buffer);
lcd.setCursor(0, 0);
lcd.print(tmpStr);
flagShow = millis() + resultDelay;
timeStart = 0;
timeStop = 0;
}
//рисуем бегущую строку
void animation() {
lcd.setCursor(r, 1);
lcd.print(c);
if(flagRight > 0) {
r++;
if(r > 11){
r = 1;
if(c == '>') {
c = ' ';
}
else {
c = '>';
}
}
}
else if(flagLeft > 0) {
r--;
if(r < 1){
r = 11;
if(c == '<') {
c = ' ';
}
else {
c = '<';
}
}
}
flagAnimation = millis() + animationDelay;
}
void loop() {
if(selected_scale > sizeof(scale)/sizeof(scale[0])-1) {
// если считанное значение больше, чем количество элементов в массиве масштабов - обнуляем значение
selected_scale = 0;
EEPROM.write(0, 0);
}
if(selected_unit > sizeof(units)/sizeof(units[0])-1) {
// если считанное значение больше, чем количество элементов в массиве единиц измерения скоростей - обнуляем значение
selected_unit = 0;
EEPROM.write(1, 0);
}
if(selected_decimals > sizeof(decimals)/sizeof(int)-1) {
// если считанное значение больше, чем количество элементов в массиве точночти отображения результата - обнуляем значение
selected_decimals = 0;
EEPROM.write(2, 0);
}
// если флаг отображения результатов меньше текущего времени выполняем код, в противном случае продолжаем отображать результаты измерений
if(flagShow < millis()) {
flagShow = 0;
// если сработал один датчик, но за время timeoutDelay не сработал второй - выводим TIME OUT
if(timeStart > 0 && timeStart + timeoutDelay < millis()) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" TIME OUT ");
flagShow = millis() + resultDelay;
timeStart = 0;
timeStop = 0;
flagLeft = 0;
flagRight = 0;
flagAnimation = 0;
}
// если одновременно сработали оба датчика, но не выставлены флаги начала измерения - выводим ошибку
else if(digitalRead(ir_right) == LOW && digitalRead(ir_left) == LOW && flagLeft == 0 && flagRight == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" ERROR ");
flagShow = millis() + 1000;
}
// если нет сигнала от обоих датчиков и не выставлены флаги обоих датчиков - система готова к измерениям
else if(digitalRead(ir_right) == HIGH && digitalRead(ir_left) == HIGH && flagLeft == 0 && flagRight == 0) {
// если была нажата кнопка масштаба
if(scaleBouncer.update()){
if(scaleBouncer.read() == HIGH) {
selected_scale++;
if(selected_scale > sizeof(scale)/sizeof(scale[0])-1){
selected_scale = 0;
}
}
}
// если была нажата кнопка единиц измерения
if (unitsBouncer.update()){
if(unitsBouncer.read() == HIGH) {
selected_unit++;
if(selected_unit > sizeof(units)/sizeof(units[0])-1){
selected_unit = 0;
}
}
}
// если была нажата кнопка единиц измерения
if (unitsBouncer.update()){
if(unitsBouncer.read() == HIGH) {
selected_unit++;
if(selected_unit > sizeof(units)/sizeof(units[0])-1){
selected_unit = 0;
}
}
}
// если была нажата кнопка выбора точночти отображения результата
if (decimalsBouncer.update()){
if(decimalsBouncer.read() == HIGH) {
selected_decimals++;
if(selected_decimals > sizeof(decimals)/sizeof(int)-1){
selected_decimals = 0;
}
}
}
char buffer[12];
String tmpStr = dtostrf(0.000, 12, decimals[selected_decimals], buffer);
lcd.setCursor(0, 0);
lcd.print(tmpStr);
lcd.setCursor(13, 0);
lcd.print(units[selected_unit][0]);
lcd.setCursor(13, 1);
lcd.print(scale[selected_scale][0]);
lcd.setCursor(1, 1);
lcd.print("READY ");
}
// если измерения не началось и сработал один из датчиков при этом нет флага второго датчика - начинаем замер
else if(timeStart == 0 && ((digitalRead(ir_right) == LOW && flagLeft == 0) || (digitalRead(ir_left) == LOW && flagRight == 0))) {
timeStart = millis();
if(digitalRead(ir_right) == LOW){
flagRight = millis();
c = '>';
r = 1;
}
else {
flagLeft = millis();
c = '<';
r = 11;
}
lcd.setCursor(1, 1);
lcd.print(" ");
animation();
}
// если сработал один из датчиков и выставлен флаг второго - заканчиваем измерения и производим расчет скорости
else if((digitalRead(ir_right) == LOW && flagLeft > 0) || (digitalRead(ir_left) == LOW && flagRight > 0)) {
timeStop = millis();
flagLeft = 0;
flagRight = 0;
flagAnimation = 0;
EEPROM.update(0, selected_scale);
EEPROM.update(1, selected_unit);
EEPROM.update(2, selected_decimals);
lcd.setCursor(1, 1);
lcd.print("RESULT ");
calculateSpeed(selected_unit, selected_scale, selected_decimals);
}
// если настало время рисовать новый символ при анимации
else if(flagAnimation < millis()){
animation();
}
}
}
3 пользователя(ей) сказали cпасибо: |
14.09.2016, 14:47 | #20 | |
Brocken-Meister
Регистрация: 27.04.2012
Адрес: !Msk
Сообщений: 8,628
Сказал(а) 'не согласен(а)'!: 7
Сказали 'не согласен'! 110 раз(а) в 87 сообщениях
Сказал(а) спасибо: 7,030
Поблагодарили 9,327 раз(а) в 3,314 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (9368)
|
Цитата:
---------- Сообщение добавлено в 16:47 ---------- Предыдущие сообщение было в 16:42 ---------- А что LCD такой шняжный? C кучей проводков? Я купил такой же, тока I2C шный. 4 провода: GND, Vcc, SCL, SDA. Все.
__________________
H0 - DR/DB, Ep.III, G и H0m - HSB, Н0е - DR/ÖBB/Zillertalbahn Ep.V-VI. И эночка. Московский Модуль H0-присоединяйтесь! |
|
|
14.09.2016, 17:04 | #21 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
|
|
2 пользователя(ей) сказали cпасибо: |
14.09.2016, 20:00 | #22 |
Ĩ.Ĉ.Š.ҧрѻҫҭҩ мӥҫҭҿӄѣӤ.Ҟ.Ҫ
Регистрация: 10.07.2006
Адрес: 13 верста У.Г.Ж.Д. HOe.N.Z? . . G.Oe.HO!
Сообщений: 2,435
Сказал(а) 'не согласен(а)'!: 466
Сказали 'не согласен'! 136 раз(а) в 123 сообщениях
Сказал(а) спасибо: 3,326
Поблагодарили 7,266 раз(а) в 2,870 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (7895)
|
экран то как раз одинаковый. Разница только в экономии, либо деньги, либо контакты на ардуине. Если контактов в проекте хватает, то легче припаять "лишние" 12 проводков вместо 4, чем переплачивать: дополнительная платка I2C, стоит почти как экран, а если припаяна китайцами, то как два экрана
|
|
14.09.2016, 22:04 | #23 |
Заглянувший
Регистрация: 26.01.2013
Адрес: Минск
Сообщений: 204
Сказал(а) 'не согласен(а)'!: 0
Сказали 'не согласен'! 1 раз в 1 сообщении
Сказал(а) спасибо: 458
Поблагодарили 454 раз(а) в 135 сообщениях
:
0 за это сообщение 0 Всего Репутация: - луч света в тёмном царстве (454)
|
Интересный проект! Скажите, а что вы думаете о варианте добавления такого "функционала" как измерение скорости на кругу. Все как в вашем видео на ютубе, где вы подстраиваете cv декодера, а ваш прибор будет помогать в калибровке?
Хотим посмотреть скорость на отрезке пути - используем оба датчика, хотим настроить декодер - используем один на кругу. Даже "железную" часть не надо изменять, только дописать программу... |
|
14.09.2016, 23:43 | #24 |
Brocken-Meister
Регистрация: 27.04.2012
Адрес: !Msk
Сообщений: 8,628
Сказал(а) 'не согласен(а)'!: 7
Сказали 'не согласен'! 110 раз(а) в 87 сообщениях
Сказал(а) спасибо: 7,030
Поблагодарили 9,327 раз(а) в 3,314 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (9368)
|
Ахренеть! Без платки-100 руб, с платкой - 151! Вот это экономия!
__________________
H0 - DR/DB, Ep.III, G и H0m - HSB, Н0е - DR/ÖBB/Zillertalbahn Ep.V-VI. И эночка. Московский Модуль H0-присоединяйтесь! |
|
15.09.2016, 10:54 | #25 |
Местный
Регистрация: 06.03.2014
Адрес: Москва
Сообщений: 1,741
Сказал(а) 'не согласен(а)'!: 5
Сказали 'не согласен'! 9 раз(а) в 7 сообщениях
Сказал(а) спасибо: 553
Поблагодарили 2,794 раз(а) в 755 сообщениях
:
0 за это сообщение 0 Всего Репутация: репутация неоспорима (2791)
|
а что мешает этим же спидометром на кругу мерять? если спидометра нет, мы математическим путем вычисляем скорость исходя их длины круга и времени его прохождения. а тут сразу получаем результат
я его не кругу и планирую использовать. замерил скорость - подстроил, пока локомотив проезжает круг и по "приезду" к спидометру он уже полным ходом с новыми настройками будет ехать и нам не надо будет пропускать круг. ---------- Сообщение добавлено в 10:54 ---------- Предыдущие сообщение было в 10:50 ---------- меня всегда поражали такие сравнения "да че там, 10 рублей или 15... копейки разница." а теперь зайдем с другой стороны. 150 и 100 - это на 50% дороже! При том, что эти 50 рублей ну ни как не влияют на проект в целом, так как выводов контроллера вполне хватает для подключения дисплея напрямую. а на 50 рублей можно 20 кнопок купить или лишний ИК датчик. |
|
Пользователь сказал cпасибо: |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
масштабное измерение скорости | xu56857 | Arduino | 37 | 29.12.2017 21:43 |
Тепловоз ТЭП80 - наш рекордсмен скорости (271км/ч) | Coyote | ЖД техника | 1 | 30.01.2016 00:04 |
Влияние скорости на свет | Murat | Электрика и DCC | 2 | 22.08.2010 18:09 |
Как добиться снижения скорости лока? | Sandro | общий | 20 | 22.07.2009 21:39 |
Регулирование скорости локомотива на аналоге | qwer04061995 | Электрика и DCC | 11 | 17.09.2008 09:25 |