Re: Бортовой компьютер мотоцикла
Нет не успеет, либо смастерить схему так что бы ардуинка выключалась с задержкой, например питание на нее завести через оптопару или транзистор и параллельно аноду и катоду повесить конденсатор микрофарат на 470 но при этом +5v (питание ардуино) должно оставаться включенным после отключения питания. Лучше сделать запись по какому то событию типа завел заглушил, или положение зажигания ступень 1 ступень 2
Re: Бортовой компьютер мотоцикла
Наверно всё таки придётся на постоянную включить ардуину.
Вчера старательно игнорировал библиотеку EEPROM2.h, пытался написать свою мини функцию для чтения больших чисел (например 12546 ) из EEPROM... получилось конечно но если записать скетч в ардуину она зависает и игнорирует последующие попытки записать, что либо. Спасает только запись скетча BLINK из стандартных примеров.
Просьба посмотреть, что не так.
PHP код:
#include <EEPROM.h>
int SERVIS[5][3] = {
5,3,SERVIS[0][0]*SERVIS[0][1], // размер массива 5 строк[0][0], 3 столбца[0][1], 15 число ячеек [0][2]
0,0,0, //1 < например 12, 00, 00 = должно получится 12000
0,0,0, //2
0,0,0, //3
0,0,0, //4
};
int _Read_Eeprom()
{
int i, ii,x;
for (int x = 0; x = SERVIS[0][2]; x++)
{
for (int i = 1; i = SERVIS[0][0] - 1; i++) // i = 1-4
{
for (int ii = 0; ii = SERVIS[0][1]; ii++) // ii = 0-3
{
SERVIS[i][ii] = EEPROM.read(x);
}
}
}
}
void setup()
{
_Read_Eeprom();
String stringVar = String(SERVIS[1][0]) + String(SERVIS[1][1] + String(SERVIS[1][2]);
int intVar=stringVar.toInt();
Serial.println(intVar)
}
void loop()
{
}
Re: Бортовой компьютер мотоцикла
А не проще побайтно считать? Типа: var=(EEPROM.read(1)<<8)|EEPROM.read(0); ну или большее количество
Re: Бортовой компьютер мотоцикла
Может и проще я не знаю ... у меня всегда проблемы были с байтами (надо отдельно с ними разбираться), не знаю чего с байтами потом делать . Уже начал читать книжку по С++, так как в общедоступной справке много чего нет.
А можно рабочий пример ?
Re: Бортовой компьютер мотоцикла
Пример с записью/чтением через терминал. Запись двухбайтной переменной от 0 до 65535.
Запись: в терминале отправляем 12345> в еепром пишется 12345
Чтение: R. Возвращает считанное значение
PHP код:
#include <EEPROM.h>
unsigned int invar=0;//переменная, которая будет записываться в еепром
String instring="";//строка входящая для порта
unsigned int eeprom_read()//чтение из еепром
{
unsigned int res=0;
res=(EEPROM.read(2)<<8)|EEPROM.read(1);//читаем оба байта и собираем значение
return res;
}
void eeprom_write(unsigned int val)//запись в еепром
{
EEPROM.write(1, (val & 0xFF)); //пишем младший байт
EEPROM.write(2, ((val & 0xFF00) >> 8));//пишем старший байт
}
void setup(void)
{
Serial.begin(9600);//порт
}
void loop(void)
{
if(Serial.available()!=0)//есть входящий байт
{
byte inchar=Serial.read();//читаем его
if(inchar=='>')//если пришел символ ">", то формируем из строки переменную и пишем ее в еепром
{
invar=instring.toInt();//строка в int
Serial.print("Val to write:");
Serial.println(invar);//для отладки выводим в порт то значение, которое получили
eeprom_write(invar);//пишем его в еепром
instring="";//обнуляем строку входящих
}
else if(inchar=='R')//пришел символ R. читаем еепром и выводим в порт
{
Serial.print("Read:");
Serial.println(eeprom_read(),DEC);//выводим в порт то, что прочитали
instring="";//обнуляем строку входящих
}
else//пришло что-то еше
{
if (isDigit(inchar))//проверяем цифра ли это
{
instring += (char)inchar; //если да, то добавляем ее в строку
}
}
}
}
Вложений: 1
Re: Бортовой компьютер мотоцикла
Немного переделал схему.
A0 - Датчик уровня топлива
А1 - Датчик температуры
А4 - Герконы (повышение и понижение скорости) кнопка меню.
А5 - К замку зажигания клемма +15
---------------------------------------------------------------------------
0RX - Вход датчика скорости, внешнее прерывание (джампер 1)
D2 - Датчик температуры DS18B20
D3 - [SCL]
D4 - Минус датчика нейтрали для синхронизации индикатора скорости
D5 - Контроль работы вентилятора охлаждения
D6 - Контроль работы топливной помпы
D7 - Вход датчика скорости, внешнее прерывание для настройки (джампер 2) \ свободен
D11,12 - Принудительное включение вентилятора охлаждения и помпы
SCL, SDA - Дисплей 0.96 128X64 OLED LCD
Вложение 18384
Re: Бортовой компьютер мотоцикла
Вчера экспериментировал с дисплеем от NOKIA 5110, написал код таймера (одной поездки) единственное не учтено это переполнение milis(). Возможно не пригодится, так ради практики.
Есть ли другой способ оперировать двух разрядными числами которые начинаются с нуля - 00 - 09 ? дисплей этого не понимает, при попытке сделать счётчик с одним нулём в разряде часов, минут и секунд "0:0:0" начинается голиматья при переходе на второй разряд числа - например секунды протикали с (0 - 60сек) ... дальше повтор и начинает меняться по счётчику не вторая цифра а первая (10,20,30 - 90, 10, 11сек) таймер правильно показывает но всё же это не дело :)
Конечно поставлю модуль реального времени и не буду заморачиваться, но всё же хотелось разобраться.
http://www.youtube.com/watch?feature...&v=XhUdxDRlDYk
PHP код:
#include <PCD8544.h>
static PCD8544 lcd;
static unsigned long timee;
byte time[6] = {1,3,2,5}; //hh:mm:ss
boolean bmin = false, bhour = false;
byte random1, random2;
String str = ":";
void setup(){lcd.begin(84, 48);pinMode(13, OUTPUT);}
void loop(){_HourTime();}
void _Random(){lcd.setCursor(random1, random2);lcd.print(" ");}
int _HourTime()
{
lcd.setCursor(0, 0);
if ((millis()-timee)>1000)
{
digitalWrite(13, HIGH);
timee = millis();
str = ":";
time[5] ++;
if (time[5] > 9){time[5] = 0; time[4] ++; _Random(); random1 = random(0, 30); random2 = random(0, 5);}// Sec
if (time[4] == 6 && time[5] == 0){time[4] = 0; time[5] = 0; bmin = true;}
if (bmin == true) {time[3]++; bmin = false;} //Min
if (time[3] == 10){time[3] = 0; time[2]++;}
if (time[2] == 6 && time[3] == 0){time[2] = 0; time[3] = 0; bhour = true;}
if (bhour == true) {time[1]++; bhour = false;}//Hour
if (time[1] == 10){time[1] = 0; time[0]++;}
if (time[0] == 2 && time[1] == 4){time[0] = 0; time[1] = 0;}
}
if ((millis()-timee)>500){str = " "; digitalWrite(13, LOW);}
lcd.setCursor(random1, random2);
lcd.print(time[0]);
lcd.print(time[1]);
lcd.print(str);
lcd.print(time[2]);
lcd.print(time[3]);
lcd.print(str);
lcd.print(time[4]);
lcd.print(time[5]);
}
Re: Бортовой компьютер мотоцикла
Индикатор включенной передачи.
Пока вместо герконов ,пока использую кнопки, они подключены к аналоговому входу через делитель напряжения.
Принцип работы : при замыкании геркона UP номер передачи прирастает от 1 до 5, при замыкании геркона DOWN убывает от 5 до 1, время удержания геркона замкнутым роли не играет. Для сигнала о нейтральной передаче используется цифровой вход (кнопки не нашёл, просто замыкаю на массу :D), поскольку нейтральная передача возможна только между первой и второй передачей, после нейтрали можно включить либо первую либо вторую скорость (герконы UP и DOWN), так же минус с датчика нейтрали нужен для синхронизации счётчика, ведь мотоцикл можно завести не только на нейтрали но и на скорости ;)
http://www.youtube.com/watch?feature...&v=RLtfptgGj3s
PHP код:
#include <PCD8544.h>
static PCD8544 lcd;
const int GEAR_ANALOG_CONTROL_PIN = 4;
const int GEAR_DIGITAL_NEITRAL_PIN = 12;
const int UP_GEAR = 300 ; // Делитель напряжения А4
const int DOWN_GEAR = 550; // Делитель напряжения А4
int GEAR_CURENT;
int gear, neital;
int u, g;
boolean flag_gearH = false, flag_gearL = false;
void setup()
{
pinMode(GEAR_DIGITAL_NEITRAL_PIN, INPUT);
digitalWrite(GEAR_DIGITAL_NEITRAL_PIN, HIGH); // включить подтягивающий резистор
lcd.begin(84, 48);
}
int _Gear_Switch(int abc, int gear1)// напряжение ацп, up или down
{
u = abc, g = gear1;
if (u > g) {flag_gearL = true;}
if (u == 0 && flag_gearL == true) {flag_gearH = true;}
if (flag_gearH == true && flag_gearL == true)
{
flag_gearH = false;
flag_gearL = false;
if (g == UP_GEAR && GEAR_CURENT < 5) GEAR_CURENT++; //Ограничиваем наивысшую передачу на 5
if (g == DOWN_GEAR && GEAR_CURENT > 1) GEAR_CURENT--;//Ограничиваем низшую передачу на 1
lcd.print(" ");
lcd.setCursor(0, 0);
lcd.print("Gear - ");
lcd.print(GEAR_CURENT);
}
}
void loop()
{
int anread = analogRead(GEAR_ANALOG_CONTROL_PIN);
if (anread > DOWN_GEAR) {_Gear_Switch(anread,DOWN_GEAR);gear = DOWN_GEAR;} // Если напряжение на делителе "равно" константе (замкнут геркон DOWN) то передаём в функцию напряжение и константу
else if (anread > UP_GEAR) {_Gear_Switch(anread,UP_GEAR);gear = UP_GEAR;} // Замкнут геркон UP
if (anread == 0 && gear == DOWN_GEAR) {_Gear_Switch(0,DOWN_GEAR);gear = 0;} // Передам в функцию ноль, геркон отключен
if (anread == 0 && gear == UP_GEAR) {_Gear_Switch(0,UP_GEAR);gear = 0;} //
if ( digitalRead(GEAR_DIGITAL_NEITRAL_PIN)== LOW ) {lcd.setCursor(0, 0); lcd.print("Neitral "); GEAR_CURENT = 1;} //Если нейтраль то номер передачи равен одному
}
Re: Бортовой компьютер мотоцикла
А что за байк, у которого помпу можно включать и отключать? Обычно вроде крыльчатка на валу и крутится постоянно.
Экранчик от Nokia на солнце слепнуть не будет?
Зачем провод от зажигания не понял. Чтобы сохранять пробег? Так его можно просто писать раз в раз в 10км или переключении на нейтраль (на нейтраль не всегда перед выключением есть возможность перейти, напр. при падении; хотя, при наличии stop engine можно только ей и обойтись).
Вместо DS1820 можно использовать LM35 - одна аналоговая нога нужна, а питания с ардуины снять.
Также хочу делать бортовик, но со следующими особенностями: полной ликвидацией приборки, на китай-arduino pro mini (размер!) и 4-х разрядным 7-сегментным LED-индикатором.
Цитата:
Вход 12В с датчика скорости. Как преобразовать в 5В?
Я собираюсь просто датчик холла или геркон свои поставить, запитав от ардуино, и магнитик на колесо. У меня тросиковый, так что без вариантов.
Код:
lcd.print(time[0]);
lcd.print(time[1]);
lcd.print(str);
lcd.print(time[2]);
lcd.print(time[3]);
lcd.print(str);
lcd.print(time[4]);
lcd.print(time[5]);
...
if (flag_gearH == true && flag_gearL == true)
Я бы написал так
Код:
char buff[256];
sprintf (buff,"%i%i:%i%i:%i%i", time[0], time[1], time[2], time[3], time[4], time[5]);
lcd.print (buff);
...
if (flag_gearH && flag_gearL)
Кстати, рекомендую забить на макетку. Для прототипирования лучше взять breadboard + набор перемычек (провода мне меньше понравились). А итоговую плату лучше потравить самому (перекись + лимонка + соль - отлично получилось с первого раза), засверлив дырки мини-дрелью из любого моторчика.
P.S. Думал задать свои вопросы, как опознать наличие 12В на проводе, но XsanderS на них уже ответил :D У меня YBR125 :D
Re: Бортовой компьютер мотоцикла
Oleg_33, по часам можно обойтись меньшим количеством переменных:
PHP код:
if ((millis()-timee)>1000)
{
timee = millis();
sec++;
if (sec>= 60)
{
mm++;
if(mm>=60)
{
hour++;
if(hour>=24)
{
hour=0;
}
mm=0;
}
sec=0;
}
sprintf(lcd_buffer,"%02i:%02i:%02i",hour,mm,sec);
lcd.print(lcd_buffer);
}
Aikon,
Цитата:
4-х разрядным 7-сегментным LED-индикатором
На солнце (прямое попадание) нечитаемо. Проверено.
Я бы смотрел на ЖК с трансфлективной матрицей. Не слепнет, на солнце отлично читается.