-
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-индикатором
На солнце (прямое попадание) нечитаемо. Проверено.
Я бы смотрел на ЖК с трансфлективной матрицей. Не слепнет, на солнце отлично читается.
-
Re: Бортовой компьютер мотоцикла
Я так думаю Олег не соберается использовать LCD от Nokia, это его перед новым годом разиграли и прислали не тот дисплей :) он ждет другой а этот использовал для тестов.
LED индикатор, будет засвечивать на солнце, и слишком много выводов требует для подключения, а если с драйвером то те же ресурсы что и с LCD да и на мой взгляд LCD посалиднее будет, слава богу они доступные в цене.
Я бы взял LCD 3,2 или если не много места 2,2 цветную
Слишком частая запись EPROM быстро убьет его, у него ограниченое число записей, хоть это и 100.000 циклов но всеже при частой записи они могут неожиданно закончиться.
Насчет датчика скорости, тут ничего не могу посоветовать, тут геркон с магнитом в помощь, но я думаю это не плохое решение.
"LM35" Я болше склоняюсь к дигитальному датчику и помех меньше, а стало бы и замеры точнее и тот же аналоговый вход можно настроить как дигитальный, если дифицит дигитальных выходов.
-
Re: Бортовой компьютер мотоцикла
На LED хочу делать, чтобы избежать рамки вокруг, т.е. все элементы будут "в глубину" за дисплеем и итоговый маленький размер.
Для управления max7219 есть, т.е. три цифровых пина надо.
С ослеплением думаю заклеить можно будет черной пленкой, как например на цифровых вольтметрах делают.
С записью в память проблем возникнуть не должно: в сезон проезжается ~20 000Км, т.е. запись раз в 10км - это 2000 раз за сезон.
Запись по нейтрали допустим в 4 раза чаще, т.е. 8 000 раз за сезон.
Итого 10 000 за сезон, т.е. 100 000 на 10 сезонов хватит, т.е. мотоцикл раньше сдохнет :D
Более того можно каждый сезон в свои ячейки писать.
-
Re: Бортовой компьютер мотоцикла
Для ответов на ваши вопросы посмотрите последнюю схему, на ней всё видно, что и для чего.
Например дисплей OLED должен встать на место часов, правый дисплей,место не ахти правда ;)
Вложение 18387
Мотоцикл - Honda Varadero XL1000V
НА мотоцикле стоит помпа электромагнитная (соленоид толкает поршень ... )
В EEPROM я лично думаю не стоит бездумно лепить данные - чем реже тем лучше.
Насчёт герконов, даже не знаю ... на мотоцикле же есть датчик скорости, внешнее прерывание + TimerOne всё просто получится, не вижу смысла мудрить.
Плата может и макетка ... как я по вашему сделаю печатную плату если не знаю окончательную схему! а breadboard с торчащими проводами и элементами в разные стороны мне не интересен тк на мотоцикле будет происходить окончательная обкатка, с breadboard`a всё вывалится нафик :D
-
Re: Бортовой компьютер мотоцикла
PHP код:
// В чем разница в записях ?
#define A 5;
pinMode (А, OUTPUT);
//
int a = 5;
pinMode (a, OUTPUT);
-
Re: Бортовой компьютер мотоцикла
Цитата:
Сообщение от
Oleg_33
PHP код:
// В чем разница в записях ?
#define A 5;
pinMode (А, OUTPUT);
//
int a = 5;
pinMode (a, OUTPUT);
Все зависит от того какая цель преследуется. В данном контексте никакой разницы, за исключением того что int использует 2 байта памяти. Просто погугли на предмет того что есть int и что есть #define
зы: я там ссылочки подставил, глянь и я думаю проясниться.
-
Re: Бортовой компьютер мотоцикла
Цель одна сэкономить ресурсы, что бы меньше тормозила... Я так понимаю int лучше заменить #define, тк глобальных переменных у меня будет много
-
Re: Бортовой компьютер мотоцикла
Цитата:
Сообщение от
Oleg_33
Цель одна сэкономить ресурсы, что бы меньше тормозила... Я так понимаю int лучше заменить #define, тк глобальных переменных у меня будет много
В твоем случае лучше объявлять пины с использованием #define. Int я бы использовал в том случае если нужно было бы в ходе процесса менять номер пина, либо присвоение номера пина из вне, либо по какому либо алгоритму в процессе выполнения кода.
Допустим прописал одну переменную
PHP код:
int sensor;
Void setup()
{
pinMode (2, OUTPUT);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
}
Void loop()
{
sensor =. // принимаем значение по UART либо сдругова источника, присваиваем переменной значение от 2-5
DigitalWrite (sensor, HIGH); // в зависимости от значения переменной "sensor" будет выбран соответствующий пин.
}
Ну это так, попростенькому.
-
Re: Бортовой компьютер мотоцикла
Menu Demo (пока только две страницы меню из 7)
http://youtu.be/RTn5k_MhUoQ
Скоро очень скоро приедет другой дисплей, а пока отрабатываю навыки на этом дисплее. Можно как нибудь упростить вывод строк для моего случая ?
PHP код:
#include <PCD8544.h>
static PCD8544 lcd;
#define M_SERVIS 1
#define M_OPTION_FAN 2
#define M_FAN 3
#define M_SPEED
#define M_FUEL_POMP 5
#define M_TIME 6
#define M_ERROR1 7
#define M_RROR2 8
int servis_Limit[4] = {12000, 6000, 3000, 1000};
// переменные включения выключения вентилятора
int ERROR_COOLING_TEMP = 105;
int SET_RUN_FAN = 100;
int IF_OUT_TEMP_MORE_30 = 95;
int FAN_OFF = 80;
int s = 0, s2; // menu
static unsigned long time;
int NEXT_MENU, NUMBER_WINDOWS_MENU = 1;
static const byte simbol[] = { B11111111, B01111110, B00111100, B00011000, B00011000 };
void setup(){
lcd.begin(84, 48);
pinMode(12, INPUT);
Serial.begin(9600);
lcd.createChar(9, simbol);
}
void loop(){
_Button(12);
}
int _Button(int iii){
if (digitalRead(iii) == LOW) { // нажата кнопка
time = millis();
do
{
} while ( digitalRead(iii) < 1); // ждём когда кннопка отпустится
if ((millis()-time)>500){
if (_DispleyAddMenu(NUMBER_WINDOWS_MENU +1 ,s2) && NEXT_MENU == 0);
else NUMBER_WINDOWS_MENU + 1;
s2++;
if (s2 > 5) s2 = 0;
}
}
}
int _DispleyAddMenu(int fun, int str){ // номер функции, строка функции
char buff[300];
lcd.setCursor(0, 0);
switch (fun)
{
case M_SERVIS:
// 5 максимальное колличество строк,
sprintf (buff,"%6s %s-%7i%s%s-%7i%s%s-%7i%s%s-%5i%s%s",
"Servis", // название пункта меню
" TO2", servis_Limit[0], "Km",
" TO3", servis_Limit[1], "Km",
" Oil", servis_Limit[2], "Km",
" Chain", servis_Limit[3], "Km", // 4 строки меню
" GO menu?"); //возврат в основно меню
lcd.print (buff);
lcd.setCursor(0, str+1); // переключаем символ > на новою строку
lcd.write(9); // символ >
Serial.println(str);
if (str > 5-1){ // Если достигнут конец строк , выходим из цикла, записываем в переменную номер окна меню
NUMBER_WINDOWS_MENU = M_SERVIS;
NEXT_MENU = 1;
return 0;
}
break;
case M_OPTION_FAN:
// 5 максимальное колличество строк
sprintf (buff,"%s %s-%6i%s%s-%5i%s%s-%4i%s%s-%5i%s%s",
"Fan",
" Error", ERROR_COOLING_TEMP, "C",
" SetRun", SET_RUN_FAN, "C",
" Temp>30", IF_OUT_TEMP_MORE_30, "C",
" FanOff", FAN_OFF, "C",
" GO menu?"); //возврат в основно меню
lcd.print (buff);
if (str > 5 - 1){ // Если достигнут конец строк , выходим из цикла, записываем в переменную номер окна меню
NUMBER_WINDOWS_MENU = M_OPTION_FAN;
return 0;
}
lcd.setCursor(0, str+1); // переключаем символ > на новою строку
lcd.write(9); // символ >
break;
}
}
-
Re: Бортовой компьютер мотоцикла
Цитата:
Displey, servis, Go menu
Жесть какая. Display, Service, *стрелка налево*back - я бы так делал.
А если на русском хочется, то дисплей обычно можно руссифицировать, подкрутив либу.
-
Re: Бортовой компьютер мотоцикла
Во первых на английском слова короче получаются, если бы я хотел русский алфавит наверное он был бы таким.
Управление меню, осуществляется одной! кнопкой. Одной штатной кнопкой на панели приборов, герметичной ;)
-
Re: Бортовой компьютер мотоцикла
Код позже посмотрю, сейчас времени маловато, если есть один свободный аналоговый вход, а он должен быть, можно сделать одну сенсорную кнопку. Кусочек тексталита 2х2см и реагировать будет примерно на расстоянии 3,5 мм след. Можно посадить под обшивку на такую глубину
-
Re: Бортовой компьютер мотоцикла
В кожанной мотоциклетной перчатке сенсорную кнопку нажать не реально ... нажать то получится, только она не сработает.
-
Re: Бортовой компьютер мотоцикла
Цитата:
Сообщение от
Oleg_33
В кожанной мотоциклетной перчатке сенсорную кнопку нажать не реально ... нажать то получится, только она не сработает.
это смотря как настроить чувствительность, если сделать срабатывание на расстоянии 5мм то этого хвати что бы ее спрятать и компенсировать толщену перчатки
-
Вложений: 1
Re: Бортовой компьютер мотоцикла
Делал как то на attiny13 - http://www.youtube.com/watch?v=JjADVYuXjTY (в описании ссылки на код и схему на два порта правда).
Сделать, чтобы реагировала на быстрое касание и игнорировала помехи у меня не получилось. Испытывал при толщине покрытия в пару миллиметров (и достаточно большой площади площади порядка 3-4см), потом совсем плохо.
Пришел к выводу, что если требования делать скрытую кнопку нет, то лучше поставить обычную кнопку с аппаратной стабилизацией. И код проще, и тактильный отклик есть.
Схему включения вот такую планирую использовать (из The Unofficial Arduino Basic Connection)
Вложение 18392
Для конвертации питания 12В в 5В хочу закупить вот step-down преобразователь.
Цитата:
На солнце (прямое попадание) нечитаемо. Проверено.
Я бы смотрел на ЖК с трансфлективной матрицей. Не слепнет, на солнце отлично читается.
Фигово, но попробую поверх что-нибудь налепить. В случае чего вот OLED 0.96' дисплей есть, но рамка у него огромная :(
-
Re: Бортовой компьютер мотоцикла
-
Re: Бортовой компьютер мотоцикла
тут намедни экспериментировал с записью в EEPROM небольших чисел 4 - 5 знаков, больше 5 чисел мне не понадобится.
точность получилось +-1, тк float f возвращает всего два знака после точки, как сделать больше ?
Получилось вот так:
PHP код:
#include <EEPROM.h>
int SERVIS = 1254;
void setup() {
Serial.begin(9600);
float f = SERVIS_OIL / 255.0; // 1030 / 255 = 4.039... - 4 * 255
int i = f ;// 4 = округлённое значение от деления
int g = (f - i) * 255;
// i - количество целых ячеек по 255, g - не целая ячейка.
for (int i = 0; g < i ; i++); {EEPROM.write(i, 255)};
EEPROM.write(i+1, g);
}
void loop() {
}
-
Re: Бортовой компьютер мотоцикла
На AVR не рекомендуют пользоваться нецелочисленной математикой. Если либу открыть, то там видно, что только int можно писать по сути. Надо float - храни как два int, до и после запятой.
В данной задаче этой надобности нет - какая разница заменишь масло через 3789Км или 4000Км?
Если тахометр подключать, то можно мото-часы еще считать (формулу расчета с потолка придется брать) или можно статистику собирать "сколько по времени, по оборотам и на какой передаче ехал".
Chip, реклама двигатель торговли! :D
-
Re: Бортовой компьютер мотоцикла
Везде в память пишется INT, Вы простите о чем ?
EEPROM.write(i+1, g) - переменная g объявлена INT!
-
Re: Бортовой компьютер мотоцикла
Aikon,+1
От float лучше уйти. Если необходимо, умножь на тысячу и храни в нескольких int.
В еепром пишется байт. Независимо от того, что объявлено, в библиотеке аргумент uint8_t, то есть 8-битное число. Больше 255 не запишешь.
-
Re: Бортовой компьютер мотоцикла
Если все int делать-то так вроде получается, не проверял ещё пока.
Код:
( (1040 / 255) * 1000000 ) = 4078431
( 4078431 / 1000000 ) = 4 (количество целых ячеек по 255, ячейки от 0 до 3)
4078431 - (4 * 1000000) = 78431
78431 * 255 / 1000000 = 19+1 (ячейка 4 в ней значение 20)
-
Re: Бортовой компьютер мотоцикла
Сегодня убил пол дня на освоение OLED дисплея, проблема заключалась в обновлении дисплея... если при обновлении каждый раз делать reset функцией из библиотеки - то он начинал противно мигать.
Спустя некоторые время, присмотрелся к стандартному примеру, оказалось на пример, что бы после цифры 1 написать 2, перед выводом 2, "печатаем" на дисплее 1 в черном цвете.
Вот-то, что успел сделать, это самый главный "дисплей" при включении он будет всегда первым.
с лева на право - индикатор включенной передачи, температура за бортом, уровень топлива.
Пока коряво ... прогресс бар не правильно обновляется на уменьшение, под температурой будет снежинка при минусе ;) ...
http://youtu.be/smmmO8h7gsM
PHP код:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(4); //OLED_RESET
#define LINE 20 // отступ линии от левого края
#define W_PRBAR 15 // ширина элемента прогресс бара
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,};
int temp[3];
void setup(){
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay(); // Очистить буфер.
display.setTextColor(WHITE); // Цвет текста.
_display_add_fuel(70);
display.display();
}
void loop() {
_display_add_temp(random(-40, 45));
_display_add_gear(random(0, 5));
_display_add_fuel(random(0, 70));
delay(2000);
}
int _display_add_fuel(int a){ //,display.height()display.width()
if (a < temp[0]){
for (int f=0; f< a; f+=5) {
display.drawBitmap(display.width() - W_PRBAR, f , logo16_glcd_bmp, W_PRBAR, 4, BLACK);
display.display();
}
}
for (int f=0; f< a; f+=5) {
display.drawBitmap(display.width() - W_PRBAR, display.height() - f , logo16_glcd_bmp, W_PRBAR, 4, WHITE);
}
display.drawLine(display.width() - LINE, display.height(),display.width() - LINE , 0, WHITE); // линия
display.display();
temp[0] = a;
}
int _display_add_temp(int b){
display.setTextSize(2);
display.setTextColor(BLACK);
display.setCursor(50,0);
display.println(temp[1]);
display.display();
display.setTextColor(WHITE);
display.setCursor(50,0);
display.println(b);
temp[1] = b;
display.display();
}
int _display_add_gear(int c){
display.setTextSize(8);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println(temp[2]);
display.display();
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println(c);
temp[2] = c;
display.display();
}
-
Re: Бортовой компьютер мотоцикла
С дисплеем разобрался никаких миганий, для обновления не надо ничего зарисовывать черным шрифтом, я случайно поставил функции не в той последовательности. Всю голову сломал с выводом меню, в таблицу не умещаются дисплей мелкий ... получилась примерно следующее.
http://youtu.be/qSfM5BxvRUM
-
Re: Бортовой компьютер мотоцикла
Вчера прицепил RTC модуль реального времени на базе DS1307, собственно пытался уже давно но ничего не получалось ... вначале была проблема связи модуля с ардуиной, дата и время были премерно следующие "2165/165/165 165:165:85", потом таймер каждый раз начинался заново при отключении питания, ну и в заключении долго пытался найти как синхронизировать время.
Видео- http://youtu.be/reKBAI_8LaI
В начале обязательно подтягиваем шину I2С к +5В через резисторы 10к, даже если устройство на шине одно, без резисторов работать не будет.
Библиотеки из примера http://zelectro.cc/Media/Default/%D0...%8B/RTClib.zip
http://zelectro.cc/Media/Default/%D0...D1%8B/Time.zip
Заливаем в ардуино скетч:
PHP код:
#include <Wire.h>
#include "RTClib.h"
#include <Time.h>
RTC_DS1307 RTC;
void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
}
void loop () {
time_t curTime = 0;
// На Serial поступит время в формате unixtime
if (Serial.available() > 0)
{
int eps = millis();
time_t coef = 1000000000;
while (coef > 0)
{
byte b = Serial.read();
if (b == 255)
{
continue;
}
curTime += coef*(b-'0');
coef /= 10;
}
// Устанавливаем считанное по байтам время в RTC
RTC.adjust(curTime + (millis()-eps)/1000);
}
}
Открываем окно терминала, далее переходим по ссылке http://www.bl2.ru/programing/timestamp.html, быстро копируем Текущее Unix время,например: 1423495561, и так же быстро вставляем текст в окно терминала комбинацией клавиш Ctrl + v, нажимаем отправить! Всё! время выставлено, проверяем:
PHP код:
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 RTC;
void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
}
void loop () {
// Определяем время
DateTime now = RTC.now();
// Выводим время в монитор порта
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
delay(1000);
}
-
Re: Бортовой компьютер мотоцикла
Oleg_33, у ds1302 (SPI) и ds1307 (I2C) с точностью хода зачастую проблемы. Будь готов подводить часы на 5-10сек каждый день. В идеале лучше использовать DS3231.
Думал также готовый модуль использовать, потом посмотрел по обвязке и решил отдельно прикупить микруху и осциллятор, чтобы распаять самому и сэкономить место.
-
Re: Бортовой компьютер мотоцикла
да да я зметил модуль врёт, за 3 дня убежал секунд на 30 ... я ведь хотел DS3231 сразу заказать, но что то меня остановило :)
-
Re: Бортовой компьютер мотоцикла
Где то читал, что можно analogRead, digitalWrite ... заменить на код прямого доступа, тем самым с экономить память и увеличить быстродействие, где можно прочитать про это ?
Я к чему веду, библиотека дисплея, меню и прочая ерунда =) сожрала 70% памяти ... а ещё нужно кое что добавить, вот сижу оптимизирую код, убираю лишние функции, операторы ...
-
Re: Бортовой компьютер мотоцикла
Oleg_33, да, можно заменить. Почитать можно здесь (один из самых популярных манов, но мне не сильно понравилось).
Я бы не рекомендовал заниматься оптимизацией, когда еще надобности не возникло. Разумеется когда подключаешь библиотеки, память будет отжираться и казаться, что вот-вот она кончится.
Однако забить все 30Кб (2Кб отожрет загрузчик Arduino) на atmega328 сложновато, если не подключать все подряд.
Самый простой вариант сократить объем занимаемой памяти - выкинуть неиспользуемый код из библиотек, удалив его или окружив комментариями.
Свой код можно особо не оптимизировать - даже 10Кб своего кода - это весьма много текста. Лучше постараться избежать г0внокода, когда заглянув через месяц в свой файл, не поймешь чего имел в виду.
По быстродействию я бы сильно также не парился - это не то место, где оно нужно. Имхо достаточно просто delay и совсем идиотские конструкции не использовать и всё.
Я думаю стоит прислушаться к мнению автора серии книг "Искусство программирования" ;)
Цитата:
Преждевременная оптимизация — корень всех (или большинства) проблем в программировании.
-
Re: Бортовой компьютер мотоцикла
Всё таки не соглашусь, почему бы и не оптимизировать если код станет меньше (возможно сложнее в понимании - насчёт этого вообще не парюсь, всегда можно прикоментировать разъяснительные аннотации :rolleyes: )
С библиотеками все не просто, например убрав часть кода с инициализации SPI интерфейса и поддержки дисплея меньшего размера ... в Adafruit_SSD1306, удалось увеличить память на 5%, а вот из библиотеки MFRC522 какие бы функции я не убирал размер не меняется , получается компилятор сам берёт на себя эту функцию.
-
Re: Бортовой компьютер мотоцикла
Oleg_33, разумеется компилятор что-то выкидывает, но он также не всемогущ.
По мне писать кучу комментариев, если это не обучающий код, - дурной тон. В идеале код должен вообще не содержать комментариев, т.е. быть само-документированным.
В твоем случае, я бы, например, создал наследника класса Adafruit_SSD1306 (аналогично с ds1307, но там можно и просто либу поправить под нужны), добавил ему методы init(), temperature(val), gear(val) и прочие.
Тогда main будет проще читать и поддерживать.
При выборе размер-скорость-простота кода я выбираю простоту кода, потом скорость, а уж потом место. С местом парился бы только в случае, если реально оно вдруг кончилось.
Пример инициализации портов для attiny13 (аля pinMode(..., INPUT))
Код:
ADCSRA |= (1<<ADPS2)|(1<<ADPS1);
ADCSRA |= (1<<ADEN);
DDRB |= (1<<PB3);
PORTB &= ~(1<<PB3);
DDRB |= (1<<PB0);
panel.mux = 2;
panel.muxgnd = 3;
panel.port = &PORTB;
panel.portmask = (1<<PB4);
PORTB |= (1<<PB0);
Поддерживать такое можно только постоянно занимаясь программированием под МК и потому помня какие константы и где используются.
Для тех, у кого МК хобби, т.е. большинство владельцев Arduino, такой код лучше избегать, поскольку уже через месяц не вспомнишь что он делает.
-
Re: Бортовой компьютер мотоцикла
Ладно по экспериментирую потом с портами, вот такая структура получается, дальше пока не могу писать, тк нет полной обвязки от ардуино.
Осторожно много букф :D
PHP код:
#include <MFRC522.h>
#include <OneWire.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "RTClib.h"
#include <TimerOne.h>
#include <EEPROM.h>
#define INTERRUPT__INT 0 // 0 Внешнее прерывание
//#define Spare // 1
#define TEMP_DS18B20__DIGITAL_PIN 2 // 2 Цифровой датчик температуры
//#define Scl // 3
#define GEAR_NEITRAL__DIGITAL_PIN 10 // 4 Минус при включении нейтрали
#define FAN_CONTROL_RUN__DIGITAL_PIN 5 // 5 Минус при включении вентилятора
#define FUELPOMP_CONTROL_RUN__DIGITAL_PIN 6 // 6 Минус при включении насоса
//#define Spare // 7
//#define Spare // 8
#define RST_PIN 9 // 9 RFID
#define SS_PIN 10 // 10 RFID
#define FUELPOMP_RELAY__DIGITAL_PIN 11 // 11 Включение реле топливного насоса
#define FAN_RELAY__DIGITAL_PIN 12 // 12 Включение реле вентилятора охлаждения
#define LED_ERROR__DIGITAL_PIN 13 // 13 Светодиод неисправности
#define FUEL_LEVEL__ANALOG_PIN 0 // 0 Датчик уровня топлива
#define TEMP_RESISTOR__ANALOG_PIN 1 // 1 Датчик температуры охлаждающей жидкости
//#define Spare // 2
//#define Spare // 3
#define GEAR_SWITCH__ANALOG_PIN 4 // 4 Номер передачи
#define IGN_ON__ANALOG_PIN 5 // 5 Плюс при включении зажигания
//FAN ==========================================================================================================
// Глобальные переменные
int RELAY_CURENT; // Текущее состояние реле
int TEMP_CURENT_ANALOG; // Показания с АЦП
byte flag_FAN_CYRENT = 0;
// Константы
#define LOW_COLING_FAN 2
#define HIGH_COLING_FAN 3
#define ERROR_COLING_FAN 4
//_Timer()
int Timer = LOW;
unsigned long currentTime;
unsigned long loopTime;
int TEMP_ARRAY_FAN[4] = {88,110,120, 25}; // напряжение [отключение, включение, перегрев, по температуре окр. воздуха]
//SVITCH GEAR====================================================================================================
// Константы
#define UP_GEAR 300 // Делитель напряжения GEAR_SWITCH__ANALOG_PIN
#define DOWN_GEAR 550 // Делитель напряжения GEAR_SWITCH__ANALOG_PIN
// Глобальные переменные
int GEAR_CURENT;
//
int gear, neital;
int u, g;
boolean flag_gearH = false, flag_gearL = false;
//OUT_TEMP=======================================================================================================
OneWire ds(TEMP_DS18B20__DIGITAL_PIN);
// Глобальные переменные
int OUT_TEMP_CORECTION = 10; // 0 - 20
int OUT_TEMP_CURENT =+ (OUT_TEMP_CORECTION - 10);
//DS1307 RTC =======================================================================================================
RTC_DS1307 RTC;
char ch_time[11];
int time_one = 70, timer_go;
//RFID=======================================================================================================
// Константы
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.
// Глобальные переменные
unsigned long KEY1 = 2910087621;
unsigned long KEY2 = 4124219933;
unsigned long uidDec, uidDecTemp; // Для отображения номера карточки в десятичном формате.
int KEY_OK;
//OLED Display=======================================================================================================
Adafruit_SSD1306 display(4); //OLED_RESET
#define LINE 20 // отступ линии от левого края
#define W_PRBAR 15 // ширина элемента прогресс бара
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111,
B11111111, B11111111};
// Константы
#define M_SERVIS 1
#define SUB_TO2 10
#define SUB_TO3 11
#define SUB_OIL 12
#define SUB_CHAIN 13
#define M_OPTION_FAN 2
#define SUB_ERROR 21
#define SUB_SET_TEMP 22
#define SUB_T_OUT 23
#define SUB_FAN_OFF 24
#define M_FAN 3
#define SUB_STATUS 30
#define SUB_AKTIV 31
#define SUB_CORECT_OUT 32
#define SUB_CORECT_ENGIN 33
#define M_SPEED 4
#define SUB_CORECT 40
#define SUB_SPEED 41
#define M_ERROR1 5
#define M_RROR2 6
#define MAIN_MENU_MAIN 111
#define MAIN_MENU_ERROR 222
#define MAIN_MENU_TAIM 333
#define MAIN_MENU_KEY 444
int servis_Limit[4] = {12000, 6000, 3000, 1000};
//_______________________________________________________________________________________________________________
void setup()
{
//Serial.begin(9600);
/*
pinMode(FAN_RELAY__DIGITAL_PIN, OUTPUT);
pinMode(GEAR_NEITRAL__DIGITAL_PIN, INPUT);
digitalWrite(GEAR_NEITRAL__DIGITAL_PIN, HIGH);
attachInterrupt(INTERRUPT__INT, blnk, FALLING); // 0 Внешнее прерывание
pinMode(GEAR_NEITRAL__DIGITAL_PIN, INPUT); // 4 Минус при включении нейтрали
digitalWrite(GEAR_NEITRAL__DIGITAL_PIN, HIGH);
pinMode(FAN_CONTROL_RUN__DIGITAL_PIN, INPUT); // 5 Минус при включении вентилятора
digitalWrite(FAN_CONTROL_RUN__DIGITAL_PIN, HIGH);
pinMode(FUELPOMP_CONTROL_RUN__DIGITAL_PIN, INPUT); // 6 Минус при включении насоса
digitalWrite(FUELPOMP_CONTROL_RUN__DIGITAL_PIN, HIGH);
pinMode(FUELPOMP_RELAY__DIGITAL_PIN, OUTPUT); // 11 Включение реле топливного насоса
pinMode(FAN_RELAY__DIGITAL_PIN, OUTPUT); // 12 Включение реле вентилятора охлаждения
pinMode(LED_ERROR__DIGITAL_PIN, OUTPUT); // 13 Светодиод неисправности
*/
Wire.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.setTextColor(WHITE);
SPI.begin();
mfrc522.PCD_Init(); // Init MFRC522 card
RTC.begin();
display.clearDisplay();
_DispleyAddMenu(MAIN_MENU_KEY,0); // Надпись на дисплее "KEY ?"
display.display();
}
void loop()
{
if (_Timer(100, 5000) == 10) // Считываем температуру каждые 5 сек
{
TEMP_CURENT_ANALOG = analogRead(TEMP_RESISTOR__ANALOG_PIN); // Температуру двигателя
_Out_Temp(); // Температуру наружного воздуха
}
_TempMonitoring(TEMP_CURENT_ANALOG);
_Gear_Switch_Neutral();
DateTime now = RTC.now();// Определяем время
if (time_one == 70) time_one = now.second() - 2;
if (now.second() > time_one){timer_go = now.second() - time_one;}
else {timer_go ++;}
sprintf (ch_time,"%02i:%02i:%02i",now.hour(),now.minute(), timer_go);
if (KEY_OK == 0){
unsigned long tk = _ReadKeyRFID();
if (tk == KEY1 || tk == KEY2) KEY_OK = 1;
display.clearDisplay();
}
if (KEY_OK == 1){
_DispleyAddMenu(MAIN_MENU_MAIN,0);
display.display();
display.clearDisplay();
delay(1000);
}
}
//________________________________________________________________________________________________________________
//FUNC ***********************************************************************************************************
unsigned long _ReadKeyRFID(){
if ( !mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) return 0;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
uidDecTemp = mfrc522.uid.uidByte[i];
uidDec = uidDec*256+uidDecTemp;
}
return uidDec;
}
int _DispleyAddMenu(int fun, int str){ // номер функции, строка функции
char* myStrings[]={"TO2", "TO3", "Oil","Chain", "Err Temp", "Temp On", "t out>30", "Temp Off"};
char charBufVar[50];
String stringVar;
int iii;
switch (fun)
{
case M_SERVIS: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
__dis(0, 0, 2, WHITE, 0);
display.println(fun + String(">Servis"));
if (str == SUB_TO2){ iii = servis_Limit[0]; stringVar = myStrings[0];}
if (str == SUB_TO3){ iii = servis_Limit[1]; stringVar = myStrings[1];}
if (str == SUB_OIL){ iii = servis_Limit[2]; stringVar = myStrings[2];}
if (str == SUB_CHAIN){ iii = servis_Limit[3]; stringVar = myStrings[3];}
__dis(0, 20, 2, WHITE, 0);
stringVar.toCharArray(charBufVar, 50);
display.println(charBufVar);
__dis(0, 42, 3, WHITE, 1);
display.println(iii);
break; // --- >
case M_OPTION_FAN: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
__dis(0, 0, 2, WHITE, 0);
display.println(fun + String(">Opt Fan"));
if (str == SUB_ERROR){ iii = TEMP_ARRAY_FAN[2]; stringVar = myStrings[4];}
if (str == SUB_SET_TEMP){ iii = TEMP_ARRAY_FAN[1]; stringVar = myStrings[5];}
if (str == SUB_T_OUT){ iii = TEMP_ARRAY_FAN[3]; stringVar = myStrings[6];}
if (str == SUB_FAN_OFF){ iii = TEMP_ARRAY_FAN[0]; stringVar = myStrings[7];}
__dis(0, 20, 2, WHITE, 0);
stringVar.toCharArray(charBufVar, 50);
display.println(charBufVar);
__dis(0, 42, 3, WHITE, 1);
display.println(iii);
break; // --- >
case M_FAN: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
__dis(0, 0, 2, WHITE, 0);
display.println(fun + String(">Fan"));
switch (str)
{
case SUB_STATUS:
__dis(0, 20, 2, WHITE, 0);
display.println("Status");
__dis(0, 42, 3, WHITE, 0);
if (flag_FAN_CYRENT == 1) display.println("ON");
else display.println("OFF");
break; // --- >
case SUB_AKTIV:
__dis(0, 20, 2, WHITE, 0);
display.println("Activation");
__dis(0, 42, 3, WHITE, 1);
display.println("---");
break; // --- >
case SUB_CORECT_OUT:
__dis(0, 20, 2, WHITE, 0);
display.println("Out tem +-");
__dis(0, 42, 3, WHITE, 1);
display.println(OUT_TEMP_CORECTION + String("c"));
break; // --- >
case SUB_CORECT_ENGIN:
__dis(0, 20, 2, WHITE, 0);
display.println("Eng tem +-");
__dis(0, 42, 3, WHITE, 1);
display.println(OUT_TEMP_CORECTION + String("c"));
break; // --- >
}
break; // --- >MAIN_MENU_TAIM
case MAIN_MENU_TAIM: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
__dis(0, 0, 2, WHITE, 0);
display.println("Time");
__dis(0, 20, 2, WHITE, 0);
display.println(ch_time);
break; // --- >
case MAIN_MENU_MAIN: // Главный экран
__dis(0, 0, 8, WHITE, 0); // Номер передачи
if (GEAR_CURENT == 0) display.println("N");
display.println(GEAR_CURENT);
__dis(50, 0, 2, WHITE, 0); // Температура за бортом
display.println( String(OUT_TEMP_CURENT, DEC));
for (int f=0; f< random(0, 65); f+=5) {
display.drawBitmap(128 - W_PRBAR, 64 - f , logo16_glcd_bmp, W_PRBAR, 4, WHITE);
}
display.drawLine(128 - LINE, 64,128 - LINE , 0, WHITE); // линия
break; // --- >
case MAIN_MENU_KEY: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
__dis(0, 0, 4, WHITE, 0);
display.println("NOKEY");
__dis(0, 40, 1, WHITE, 0);
display.println("Honda Varadero");
__dis(0, 50, 1, WHITE, 0);
display.println("computer v15.02.15");
break; // --- >
}
display.display();
}
int __dis(int pos_s, int pos, int siz, int color, int flag){ // 1 позиция с лева, 2 с верху, 3 размер шрифта, 4 цвет
display.setTextSize(siz);
display.setCursor(pos_s,pos);
display.setTextColor(color);
if (flag == 1)display.setTextColor(BLACK, WHITE); //Инверсия
}
int _Out_Temp() // Температура наружного воздуха
{
byte i,present = 0,type_s,data[12],addr[8];
float celsius;
if ( !ds.search(addr)) ds.reset_search();
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) data[i] = ds.read();
int16_t raw = (data[1] << 8) | data[0];
if (type_s){raw = raw << 3;if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];}
OUT_TEMP_CURENT = (float)raw / 16.0;
}
int _Timer(int l, int h) // Возвращет 5 после времени 'l' и 10 после времени 'h'
{
currentTime = millis();
if(currentTime >= (loopTime + l) && (Timer != HIGH)){loopTime = currentTime;Timer = HIGH;return 5;}
if(currentTime >= (loopTime + h) && (Timer = HIGH)){loopTime = currentTime;Timer = LOW;return 10;}
}
int _TempMonitoring(int adc) // Считываем ацп указанного вывода, включаем или выключаем реле.
{
if (adc > 150 ){_RelayColingFan(ERROR_COLING_FAN);return ERROR_COLING_FAN;} // Перегрев
if (adc > 130){_RelayColingFan(HIGH_COLING_FAN);return HIGH_COLING_FAN;} // Включаем
if (adc < 80){_RelayColingFan(LOW_COLING_FAN);return LOW_COLING_FAN;} // Выключаем
}
int _RelayColingFan(int atr) // Включение реле согласно принятому значению температуры
{
switch (atr)
{
case LOW_COLING_FAN: // 80C
digitalWrite(FAN_RELAY__DIGITAL_PIN, HIGH); // Выключено
RELAY_CURENT = digitalRead(FAN_RELAY__DIGITAL_PIN);
break;
case HIGH_COLING_FAN: // 100C
digitalWrite(FAN_RELAY__DIGITAL_PIN, LOW); // Включено
RELAY_CURENT = digitalRead(FAN_RELAY__DIGITAL_PIN);
break;
case ERROR_COLING_FAN: // Перегрев
break;
default: //
//
break;
}
}
int _Gear_Switch_Neutral()
{
int anread = analogRead(GEAR_SWITCH__ANALOG_PIN);
if (anread > DOWN_GEAR) {_Gear_Set(anread,DOWN_GEAR);gear = DOWN_GEAR;} // Если напряжение на делителе "равно" константе (замкнут геркон DOWN) то передаём в функцию напряжение и константу
else if (anread > UP_GEAR) {_Gear_Set(anread,UP_GEAR);gear = UP_GEAR;} // Замкнут геркон UP
if (anread == 0 && gear == DOWN_GEAR) {_Gear_Set(0,DOWN_GEAR);gear = 0;} // Передам в функцию ноль, геркон отключен
if (anread == 0 && gear == UP_GEAR) {_Gear_Set(0,UP_GEAR);gear = 0;} //
//if ( digitalRead(GEAR_NEITRAL__DIGITAL_PIN)== LOW ) {lcd.setCursor(0, 0); lcd.print("Neitral "); GEAR_CURENT = 1;} //Если нейтраль то номер передачи равен одному
}
int _Gear_Set(int abc, int gear1)// Счётчик скоростей в переменной GEAR_CURENT / напряжение ацп, 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
}
}