Перейти к содержанию

Электронная приборная панель ВАЗ-2106 (7-сегментные индикаторы)


Рекомендуемые сообщения

Извините, но необходимости в принципиальной не вижу. Компонентов не много. Можно разобраться и по монтажной.

Зачем составление ТЗ? Все необходимые функции указаны в начале (брать информацию с датчиков, и выводить на индикаторы. К спидометру добавляется функция записи в EEPROM свою или внешнюю на SD карту значения не имеет. В серийное производство и отчетность в какие нибудь органы не нужны. Мне для личного пользования.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Ну вы то не видите сложности, а кому то разбираться с этой монтажкой, тратить время. Время нонче дорого и стоит некоторых денег.

>Зачем составление ТЗ?

Это документ, в котором прописываются требования, что бы потом не было: "а я не так говорил, а я думал по другому выглядеть будет"

Поэтом сначала формализация требований, а потом уже составление ТЗ.

В противном случае можно получить "копать от забора до обеда".

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

Поэтому формализация - штука, которая позволяет правильно понять задачу, а ТЗ - разграничить ответсвенность.

Разработка девайсов - штука ресурсоёмкая для заказчика.

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Это правильный подход - тогда Клиент становится "раком", а не исполнитель!

И отсекаются разные "хочу еще!", " а вот если бы оно не так", "а я немножко со схемой накосячил - перепиши ПО" и т.п. ... посему и говорил - в единичном исполнении аФтару будет озвучена сумма, которую без валерьянки лучше не читать!

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

ТЗ (или подобие на него.

Картинка http://s7.hostingkar...932a05325a2.jpg . Это подобие схемы отвечает за уровень бензина, температуру двигателя, тахометр.

От программы требуется чтобы она принимала информацию:

с датчика бензина (его сопротивление от 0 до 33 ком) и выводила информацию на 2 семисегментных индикатора. Единица и точность измерения 1 литр.

с датчика температуры двигателя (его параметры я скажу позже) и выводила информацию на 3 индикатора. Единица и точность измерения 1 градус цельсия

с датчика холла, и выводила информацию на 3 индикатора. Единица и точность измерения 10 ОБ\МИН, до 1000 оборотов задействованы все 3 знака без точки, после тысячи оборотов задействованы 3 знака, но включается точка после первого знака (она показывает тысячи).

Картинка http://s7.hostingkar...2be81e75cc9.jpg. Это подобие схемы отвечает за спидометр и одометр.

От программы требуется чтобы она принимала информацию:

С датчика холла, высчитывала скорость, и выводила это на 3 индикатора. Единица и точность измерения 1 КМ\Ч

Считала суточный пробег, выводила информацию на 4 индикатора, и записывала её себе в EEPROM, и считывала её оттуда при запуске.

Считала общий пробег, выводила информацию на 6 индикаторов, и записывала её себе в EEPROM, и считывала её оттуда при запуске.

При удержании кнопки 3 секунды обнуляла суточный пробег.

После как закончатся цифры 9999 на суточном, и (или) 999999 на общем пробеге, начинала цикл записи по новой.

Точка на индикаторах нигде не нужна. Точность относительная, понимаю что будет погрешность. Главное чтобы на индикаторах они отображались так.

Изменено пользователем Yurchik26
Ссылка на комментарий
Поделиться на другие сайты

"...Схема http://s7.hostingkar...932a05325a2.jpg ...." - это не схема!

"...Схема http://s7.hostingkar...2be81e75cc9.jpg..." - и это - не схема!

"...с датчика бензина (его сопротивление от 0 до 33 ком)..." - закон преобразования? Тарировочная кривая?

"...с датчика холла..." - коэффициент пересчета?

Итог: схем - нет, данных нет, есть - протокол о намерениях ...

Ссылка на комментарий
Поделиться на другие сайты

"...с датчика бензина (его сопротивление от 0 до 33 ком)..." - закон преобразования? Тарировочная кривая?

Данные точные со всех датчиков будут. Будут переданы тому кто согласится писать программу.

"...с датчика холла..." - коэффициент пересчета?

Вы о том сколько оборотов на метр пути? 6 импульсов на метр пути. Это величину будем брать как исходную. И код принимать буду с ней. Только потом калибровать уже под себя.

Ссылка на комментарий
Поделиться на другие сайты

>Это правильный подход - тогда Клиент становится "раком", а не исполнитель!

Всё несколько иначе.

ТС хочет действий в сторону выполнения задания, но ничего не предоставив в замен. Что с моей точки зрения - бессмысленная трата моего времени.

В любом случае пожелаем ТС решения его задачи.

Появится определение суммы на выполнение этой железки, велком в PCBADM на мэйл ру.

Ссылка на комментарий
Поделиться на другие сайты

http://dxportal.ru/drugie-novosti-radiolyubitelya/39256-elektronnaya-pribornaya-panel-vaz-2106-7-segmentnye-indikatory.html

Не знаю как она туда попала. Эти сайты как то связаны? Сам на том сайте я её не размещал.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...

Можно тему опять перенести в вопросы?

Значит так.Цену сказали 70 тыс, я и отказался. Код сделал сам, частично работает. За малым знанием программированием код получился как есть, зато работает, критика кода принимается. Вопрос в том

Сейчас он мерит температуру, литры в баке, и обороты(формулы расчета я пока закоментировал, нет данных). Все хорошо, но если допустим температура величина постоянная(с изменениями) то обороты надо считать за единицу времени, переводить в обороты в минуту, выводить, скидывать на ноль, опять считать и так далее. Программа это делает но она выводит значение на 100 миллисекунд (где то так), и пишет ноль, значение и опять ноль. Помогите, чтобы показывать значение в течении секунды? Обороты считываются с катушки(не с датчика холла)

Зато в Serial.println выводит отличное значение

void printrpm(void)
{					
		 //Serial.println(rpm*60/2);
		 output2(rpm*60/2);
		 rpm=0;
}

#include <SPI.h>
#include <math.h>
#define RPMpin 2
volatile long rpm = 0;
enum { temp = 8, benz = 9, tax = 10 };
void setup()
{
 Serial.begin(9600);
SPI.begin();
pinMode(temp, OUTPUT);
pinMode(benz, OUTPUT);
pinMode(tax, OUTPUT);
 attachInterrupt(0, RPM, FALLING);
}
double Getterm(int RawADC)
{
double cel;
 cel = log(((10240000/RawADC) - 10000));
 //temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp));
 cel = cel * 5;
return cel;
}
double Getterm1(int value)
{
double lit;
 lit = log((10240000/value-10000));
 //lit = 1 / (0.001129148 + (0.000234125 * lit) + (0.0000000876741 * lit * lit * lit));
 lit = lit * 5;
return lit;
}
int hundreds=0, tens=0, ones=0;
int delayTime=1;	
static uint8_t digit[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
static uint8_t pos[3]= {0xfb,0xf7,0xef};		
void printcel(void)
{
double cel = Getterm(analogRead(4));
output(cel);
}

void printlit(void)
{
double lit = Getterm1(analogRead(3));
output1(lit);
}

void printrpm(void)
{					
		 //Serial.println(rpm*60/2);
		 output2(rpm*60/2);
		 rpm=0;
}
void output(int cel)
{
hundreds=cel/100;
tens=(cel-hundreds*100)/10;
ones=cel-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(temp, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(temp, HIGH);
delay(delayTime);				
digitalWrite(temp, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(temp, HIGH);
delay(delayTime);

digitalWrite(temp, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);			
digitalWrite(temp, HIGH);
delay(delayTime);
}
void output1(int lit)
{
hundreds=lit/100;
tens=(lit-hundreds*100)/10;
ones=lit-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(benz, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(benz, HIGH);
delay(delayTime);
digitalWrite(benz, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(benz, HIGH);
delay(delayTime);

digitalWrite(benz, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);			
digitalWrite(benz, HIGH);
delay(delayTime);
}
void output2(int rpm)
{
hundreds=rpm/100;
tens=(rpm-hundreds*100)/10;
ones=rpm-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(tax, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(tax, HIGH);
delay(delayTime);
digitalWrite(tax, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(tax, HIGH);
delay(delayTime);

digitalWrite(tax, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);			
digitalWrite(tax, HIGH);
delay(delayTime);
}
void loop(void)
{
 printcel();
 printlit();
 printrpm();
}
void RPM ()
{
 rpm++;
}

Изменено пользователем Yurchik26
Ссылка на комментарий
Поделиться на другие сайты

Работает блин. Вот код. Только тысячи в измерения не добавлены

#include <SPI.h>
#include <math.h>
unsigned long Tahometr_impulse_count;
byte TahometrPin=2;
double RPM;
unsigned long Check_time ;
enum { temp = 8, benz = 9, tax = 10 };
void setup()
{
 Serial.begin(9600);
SPI.begin();
pinMode(temp, OUTPUT);
pinMode(benz, OUTPUT);
pinMode(tax, OUTPUT);
 pinMode(TahometrPin, INPUT);
 digitalWrite(TahometrPin, HIGH);
 Check_time = millis();
 attachInterrupt(0, TahometrImpulse_on, FALLING);
}
double Getterm(int RawADC)
{
double cel;
 cel = log(((10240000/RawADC) - 10000));
 //temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp));
 cel = cel * 5;
return cel;
}
double Getterm1(int value)
{
double lit;
 lit = log((10240000/value-10000));
 //lit = 1 / (0.001129148 + (0.000234125 * lit) + (0.0000000876741 * lit * lit * lit));
 lit = lit * 5;
return lit;
}
int hundreds=0, tens=0, ones=0;
int delayTime=1;	
static uint8_t digit[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
static uint8_t pos[3]= {0xfb,0xf7,0xef};
unsigned long timer=0, timerPrev=0, thinkingTime=1000;
void printcel(void)
{
double cel = Getterm(analogRead(4));
output(cel);
}

void printlit(void)
{
double lit = Getterm1(analogRead(3));
output1(lit);
}

void printrpm(void)
{					
	 // Serial.println(RPM);
	 output2(RPM);
}
void Calc_RPM()
 {
	 detachInterrupt(0);											
	 int Taho_ChekTime = millis()-Check_time;					
	 if (Taho_ChekTime > 0) {							
	 if (Tahometr_impulse_count > 0){						
		 RPM=((Tahometr_impulse_count*60000)/(Taho_ChekTime));
		 }else{
RPM=0;	
 }
	 }
	 Tahometr_impulse_count = 0;							
	 Check_time = millis();									
	 attachInterrupt(0, TahometrImpulse_on, FALLING);		
 }
void output(int cel)
{
hundreds=cel/100;
tens=(cel-hundreds*100)/10;
ones=cel-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(temp, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(temp, HIGH);
delay(delayTime);				
digitalWrite(temp, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(temp, HIGH);
delay(delayTime);

digitalWrite(temp, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);			
digitalWrite(temp, HIGH);
delay(delayTime);
}
void output1(int lit)
{
hundreds=lit/100;
tens=(lit-hundreds*100)/10;
ones=lit-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(benz, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(benz, HIGH);
delay(delayTime);
digitalWrite(benz, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(benz, HIGH);
delay(delayTime);

digitalWrite(benz, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);			
digitalWrite(benz, HIGH);
delay(delayTime);
}
void output2(int rpm)
{
hundreds=rpm/100;
tens=(rpm-hundreds*100)/10;
ones=rpm-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(tax, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(tax, HIGH);
delay(delayTime);
digitalWrite(tax, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(tax, HIGH);
delay(delayTime);

digitalWrite(tax, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);			
digitalWrite(tax, HIGH);
delay(delayTime);
}
void loop(void)
{
 printcel();
 printlit();
 timer=millis();
 if(timer-timerPrev>thinkingTime)
	 {
		 Calc_RPM();
		 timerPrev=timer;
 }
 printrpm();
}
void TahometrImpulse_on()
{
 Tahometr_impulse_count++;
}

Изменено пользователем Yurchik26
Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Новый код, уже конечный, присутствует квазианалоговая шкала. С пояснениями сделаю позже

#include <SPI.h>
#include <math.h>
unsigned long Tahometr_impulse_count;
byte TahometrPin=2;
double RPM;
unsigned long Check_time ;
int tochkatax = 3;
int tochkavol = 4;
int tochkacel = 5;
double cel = 0;
int lit;
float sensorValue = 0;	
float outputValue = 0;
int clockPin = 0;
int dataPin = 1;
int kvaz = 6;
enum { temp = 8, benz = 9, tax = 10, napr = 7};
void setup()
{
SPI.begin();
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
pinMode(temp, OUTPUT);
pinMode(benz, OUTPUT);
pinMode(tax, OUTPUT);
 pinMode(napr, OUTPUT);
 pinMode(kvaz, OUTPUT);
 pinMode(TahometrPin, INPUT);
 pinMode(tochkatax, OUTPUT);
 pinMode(tochkavol, OUTPUT);
 pinMode(tochkacel, OUTPUT);
 digitalWrite(tochkatax, LOW);
 digitalWrite(tochkavol, LOW);
 digitalWrite(tochkacel, LOW);
 digitalWrite(TahometrPin, HIGH);
 Check_time = millis();
 attachInterrupt(0, TahometrImpulse_on, FALLING);
}
int hundreds=0, tens=0, ones=0;
int delayTime=1;	
static uint8_t digit[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
static uint8_t pos[3]= {0xfb,0xf7,0xef};
unsigned int riad[9] = {
0B00000000,
0B11111110,
0B11111100,
0B11111000,
0B11110000,
0B11100000,
0B11000000,
0B10000000,
0B00000000
};
unsigned int poz[9] = {
0B00000000,
0B00000001,
0B00000011,
0B00000111,
0B00001111,
0B00011111,
0B00111111,
0B01111111,
0B11111111
};
unsigned long timer=0, timerPrev=0, thinkingTime=1000;
void printcelsia(void)
{
output(cel);
}

void printlit(void)
{
output1(lit);
}

void printrpm(void)
{		
	 output2(RPM);
	 output4(RPM);
}
void printvol(void)
{
	 output3(outputValue);
}
void Calc_RPM()
 {
	 detachInterrupt(0);											
	 int Taho_ChekTime = millis()-Check_time;					
	 if (Taho_ChekTime > 0)
		 {							
			 if (Tahometr_impulse_count > 0)
				 {						
					 RPM=((Tahometr_impulse_count*60*1000)/(2*Taho_ChekTime));
				 }	
			 else
				 {
					 RPM=0;
				 }
		 }
	 Tahometr_impulse_count = 0;							
	 Check_time = millis();									
	 attachInterrupt(0, TahometrImpulse_on, FALLING);		
 }
void output(int cel)
{
 if (cel >= 98)
		 {
			 digitalWrite(tochkacel, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkacel, LOW);	
		 }
hundreds=cel/100;
tens=(cel-hundreds*100)/10;
ones=cel-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(temp, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(temp, HIGH);
delay(delayTime);				
digitalWrite(temp, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(temp, HIGH);
delay(delayTime);

digitalWrite(temp, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);
digitalWrite(temp, HIGH);
delay(delayTime);
}
void output1(int lit)
{
hundreds=lit/100;
tens=(lit-hundreds*100)/10;
ones=lit-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(benz, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(benz, HIGH);
delay(delayTime);
digitalWrite(benz, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(benz, HIGH);
delay(delayTime);

digitalWrite(benz, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);			
digitalWrite(benz, HIGH);
delay(delayTime);
}
void output2(int rpm)
{
 if (rpm >= 1000)
		 {
			 rpm=rpm/10;
			 digitalWrite(tochkatax, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkatax, LOW);	
		 }
hundreds=rpm/100;
tens=(rpm-hundreds*100)/10;
ones=rpm-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(tax, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(tax, HIGH);
delay(delayTime);
digitalWrite(tax, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(tax, HIGH);
delay(delayTime);

digitalWrite(tax, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);			
digitalWrite(tax, HIGH);
delay(delayTime);
}
void output3(int outputValue)
{
 if (outputValue >= 150)
		 {
			 digitalWrite(tochkavol, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkavol, LOW);	
		 }
 if (outputValue <= 100)
		 {
			 digitalWrite(tochkavol, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkavol, LOW);	
		 }
hundreds=outputValue/100;
tens=(outputValue-hundreds*100)/10;
ones=outputValue-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(napr, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(napr, HIGH);
delay(delayTime);
digitalWrite(napr, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(napr, HIGH);
delay(delayTime);

digitalWrite(napr, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);			
digitalWrite(napr, HIGH);
delay(delayTime);
}
void output4(int rpm)
{
 int kva =rpm;
 kva = map(kva, 0, 6000, 0, 60);
 int pozi=0;
 double sot=0;
 pozi=kva/8;
sot=(kva/8.0-pozi)*8.0;
 int sot1=sot;
	 if (pozi>=1)
		 {
			 digitalWrite(kvaz, LOW);
			 shiftOut(dataPin, clockPin, MSBFIRST,riad[pozi]); //вывод ряда
			 shiftOut(dataPin, clockPin, MSBFIRST,poz[8]);
			 digitalWrite(kvaz, HIGH);
			 delay(delayTime);
		 }

 digitalWrite(kvaz, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST,riad[pozi+1]); //вывод количества
 shiftOut(dataPin, clockPin, MSBFIRST,poz[sot1]);
 digitalWrite(kvaz, HIGH);
 delay(delayTime);
}

void loop(void)
{
 timer=millis();
 printcelsia();
 printlit();
 printvol();
 printrpm();
 if(timer-timerPrev>thinkingTime)
	 {
		 Calc_RPM();
		 outputValue = float(analogRead(0))/55.8;
		 outputValue = outputValue*10;
		 lit = analogRead(3);
		 lit = map(lit, 0, 390, 0, 40);
		 cel = float(analogRead(4));
		 cel = log((10240000/analogRead(4)-10000));
		 cel = 1/(0.005297+(-0.0002979)*cel+0.0000002685*cel*cel*cel);
		 cel = cel-273.15;
		 timerPrev=timer;
	 }
}

void TahometrImpulse_on()
{
 static unsigned long millis_prev;
 if(millis()-4 > millis_prev)
	 {
	 Tahometr_impulse_count++;
	 }
 millis_prev = millis();
}

Изменено пользователем Yurchik26
Ссылка на комментарий
Поделиться на другие сайты

За все спасибо сайту *** . Практически все оттуда. Надеюсь скетч поможет таким как я. Вместо датчика бензина, стоит датчик холла. (убрал этот заводской, большая погрешность)

Приветствуется критика.

#include <SPI.h>
#include <math.h>
unsigned long Tahometr_impulse_count;
byte TahometrPin=2;
double RPM;
unsigned long Check_time ;
int tochkatax = 3;
int tochkaalarm = 4;									
double cel = 0;
int lit;
float sensorValue = 0;	
float outputValue = 0;
int clockPin = 0;
int dataPin = 1; // Это отдельные регистры под квазианалоговую шкалу.
int kvaz = 6;
enum { vse = 8, tax = 10};


void setup()
{
SPI.begin();
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
pinMode(vse, OUTPUT);
 pinMode(kvaz, OUTPUT);
 pinMode(TahometrPin, INPUT);
 pinMode(tochkatax, OUTPUT);
 pinMode(tochkaalarm, OUTPUT);
 digitalWrite(tochkatax, LOW);
 digitalWrite(tochkaalarm, LOW);
 digitalWrite(TahometrPin, HIGH);
 Check_time = millis();
 attachInterrupt(0, TahometrImpulse_on, FALLING); //Задаем прерывания для тахометра
}


int hundreds=0, tens=0, ones=0;
int delayTime=1;	
static uint8_t digit[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; // Массив цифр которые выводим
static uint8_t pos[8]= {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};					 //Массив Позиции вывода цифры
unsigned int riad[9] = {
0B00000000,
0B11111110,
0B11111100,
0B11111000,								 // Массив вывода ряда на квазианалоговой шкале
0B11110000,
0B11100000,
0B11000000,
0B10000000,
0B00000000
};
unsigned int poz[9] = {
0B00000000,
0B00000001,
0B00000011,
0B00000111,
0B00001111,								 //Массив вывода количества на квазианалоговой шкале
0B00011111,
0B00111111,
0B01111111,
0B11111111
};
unsigned long timer=0, timerPrev=0, thinkingTime=1000;

void printcelsia(void)
{
output(cel);
}

void printlit(void)
{
output1(lit);
}

void printrpm(void)
{		
	 output2(RPM);
	 output4(RPM);
}
void printvol(void)
{
	 output3(outputValue);
}
void Calc_RPM()		 //тут считаем количество оборотов
 {
	 detachInterrupt(0);											
	 int Taho_ChekTime = millis()-Check_time;					
	 if (Taho_ChekTime > 0)
		 {							
			 if (Tahometr_impulse_count > 0)
				 {						
					 RPM=((Tahometr_impulse_count*60*1000)/(2*Taho_ChekTime));
				 }	
			 else
				 {
					 RPM=0;
				 }
		 }
	 Tahometr_impulse_count = 0;							
	 Check_time = millis();									
	 attachInterrupt(0, TahometrImpulse_on, FALLING);		
 }


void output(int cel) // Вывод температуры и последующих на семисегментники (выделяем сотни, десятки, единицы) выводим каждую цифру в свою позицию
{
 if (cel >= 98)
		 {
			 digitalWrite(tochkaalarm, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkaalarm, LOW);	
		 }
hundreds=cel/100;
tens=(cel-hundreds*100)/10;
ones=cel-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[5]);	
digitalWrite(vse, HIGH);
delay(delayTime);				
digitalWrite(vse, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[3]);
digitalWrite(vse, HIGH);
delay(delayTime);
}

void output1(int lit)
{
tens=lit/10;
ones=lit-tens*10;
if (tens==0) tens=10;

digitalWrite(vse, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[0]);			
digitalWrite(vse, HIGH);
delay(delayTime);
}


void output2(int rpm)
{
 if (rpm >= 1000)
		 {
			 rpm=rpm/10;
			 digitalWrite(tochkatax, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkatax, LOW);	
		 }
hundreds=rpm/100;
tens=(rpm-hundreds*100)/10;
ones=rpm-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(tax, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[2]);	
digitalWrite(tax, HIGH);
delay(delayTime);
digitalWrite(tax, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[3]);			
digitalWrite(tax, HIGH);
delay(delayTime);

digitalWrite(tax, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[4]);			
digitalWrite(tax, HIGH);
delay(delayTime);
}


void output3(int outputValue)
{
 if (outputValue >= 150)
		 {
			 digitalWrite(tochkaalarm, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkaalarm, LOW);	
		 }
 if (outputValue <= 100)
		 {
			 digitalWrite(tochkaalarm, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkaalarm, LOW);	
		 }
hundreds=outputValue/100;
tens=(outputValue-hundreds*100)/10;
ones=outputValue-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[8]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[7]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[6]);			
digitalWrite(vse, HIGH);
delay(delayTime);
}

void output4(int rpm)				 //Тут подсчет и выделение цифр для зажигания определенных светодиодов, светодиоды в квазианалоговой шкале подключаются матрицей к двум регистрам
{
 int kva =rpm;
 kva = map(kva, 0, 6000, 0, 60);
 int pozi=0;
 double sot=0;
 pozi=kva/8;
sot=(kva/8.0-pozi)*8.0;
 int sot1=sot;
	 if (pozi>=1)
		 {
			 digitalWrite(kvaz, LOW);
			 shiftOut(dataPin, clockPin, MSBFIRST,riad[pozi]); //вывод ряда
			 shiftOut(dataPin, clockPin, MSBFIRST,poz[8]);
			 digitalWrite(kvaz, HIGH);
			 delay(delayTime);
		 }

 digitalWrite(kvaz, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST,riad[pozi+1]); //вывод количества
 shiftOut(dataPin, clockPin, MSBFIRST,poz[sot1]);
 digitalWrite(kvaz, HIGH);
 delay(delayTime);
}


void loop(void)
{
 timer=millis();
 printcelsia();
 printlit();
 printvol();
 printrpm();
 if(timer-timerPrev>thinkingTime)				 \\Здесь раз в секунду считаем обороты, Напряжение, тепмературу, литры.
	 {
		 Calc_RPM();
		 outputValue = float(analogRead(0))/55.8;
		 outputValue = outputValue*10;
		 lit = analogRead(3);
		 lit = map(lit, 0, 390, 0, 40);
		 cel = float(analogRead(4));
		 cel = log((10240000/analogRead(4)-10000));
		 cel = 1/(0.005297+(-0.0002979)*cel+0.0000002685*cel*cel*cel);
		 cel = cel-273.15;
		 timerPrev=timer;
	 }
}

void TahometrImpulse_on()
{
 static unsigned long millis_prev;
 if(millis()-4 > millis_prev)		 \\Здесь меняя цифру 4, меням какие импульсы (какая их продолжительность) мы будем считать, а какие пропускать.
	 {
	 Tahometr_impulse_count++;
	 }
 millis_prev = millis();
}

Изменено пользователем Yurchik26
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Простите что прерываю ваш ход мыслей.

На вашем месте я б себе купил дисплей нужного размера. Управлял им с микроконтроллера.

Решаю любые проблемы кроме своих. скайп sidatel

uselect-el(dot)ucoz.com

Ссылка на комментарий
Поделиться на другие сайты

Вот в данный момент я пытаюсь сделать топлевомер на основе ардуино про мини и 5110 экран. столкнулся с проблемой именно в написании программы , хотел попросить помощи ))

Ссылка на комментарий
Поделиться на другие сайты

Простите что прерываю ваш ход мыслей.

На вашем месте я б себе купил дисплей нужного размера. Управлял им с микроконтроллера.

Можно, но интерес был именно на семисегментниках собрать. и тут не мысли, я уже почти все собрал, думаю за недельку уже видео работы сниму

В итоге у тебя все правильно заработало? ты сам писал скетч?

да сам, все работает.

Вот в данный момент я пытаюсь сделать топлевомер на основе ардуино про мини и 5110 экран. столкнулся с проблемой именно в написании программы , хотел попросить помощи ))

опыта у меня мало, но чем смогу помогу. напишите в личку, или сюда поточнее все

Изменено пользователем Yurchik26
Ссылка на комментарий
Поделиться на другие сайты

http://youtu.be/lf0VUxumPis



Спасибо за добрые слова. Вверху видео, там пробный запуск, и показать что код работает, правда после запуска пришлось подредактировать код. Косяк был в том что когда показывалась последняя цифра, она и оставалась, за счет этого эта цифра была ярче других, в коде я просто добавил чтоб цифры выключались вообще.
#include <SPI.h>
#include <math.h>
unsigned long Tahometr_impulse_count;
byte TahometrPin=2;
double RPM;
unsigned long Check_time ;
int tochkatax = 3;
int tochkaalarm = 4;									
double cel = 0;
int lit;
float sensorValue = 0;	
float outputValue = 0;
int clockPin = 6;
int dataPin = 7; // Это отдельные регистры под квазианалоговую шкалу.
int kvaz = 5;
enum { vse = 9, tax = 10};


void setup()
{
SPI.begin();
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
pinMode(vse, OUTPUT);
 pinMode(kvaz, OUTPUT);
 pinMode(TahometrPin, INPUT);
 pinMode(tochkatax, OUTPUT);
 pinMode(tochkaalarm, OUTPUT);
 digitalWrite(tochkatax, LOW);
 digitalWrite(tochkaalarm, LOW);
 digitalWrite(TahometrPin, HIGH);
 Check_time = millis();
 attachInterrupt(0, TahometrImpulse_on, FALLING); //Задаем прерывания для тахометра
}


int hundreds=0, tens=0, ones=0;
int delayTime= 1;	
static uint8_t digit[11] = {0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde}; // Массив цифр которые выводим
static uint8_t pos[9]= {0xfd,0x7f,0xfe,0xf7,0xdf,0xef,0xfb,0xbf};					 //Массив Позиции вывода цифры
unsigned int riad[9] = {
0B00000000,
0B11111110,
0B11111100,
0B11111000,								 // Массив вывода ряда на квазианалоговой шкале
0B11110000,
0B11100000,
0B11000000,
0B10000000,
0B00000000
};
unsigned int riad2[9] = {
0B00000000,
0B11111110,
0B11111101,
0B11111011,								 // Массив вывода ряда на квазианалоговой шкале
0B11110111,
0B11101111,
0B11011111,
0B10111111,
0B00000000
};
unsigned int poz[9] = {
0B00000000,
0B00000001,
0B00000011,
0B00000111,
0B00001111,								 //Массив вывода количества на квазианалоговой шкале
0B00011111,
0B00111111,
0B01111111,
0B11111111
};
unsigned long timer=0, timerPrev=0, thinkingTime=1000;

void printcelsia(void)
{
output(cel);
}

void printlit(void)
{
output1(lit);
}

void printrpm(void)
{		
	 output2(RPM);
	 output4(RPM);
}
void printvol(void)
{
	 output3(outputValue);
}
void Calc_RPM()		 //тут считаем количество оборотов
 {
	 detachInterrupt(0);											
	 int Taho_ChekTime = millis()-Check_time;					
	 if (Taho_ChekTime > 0)
		 {							
			 if (Tahometr_impulse_count > 0)
				 {						
					 RPM=((Tahometr_impulse_count*60*1000)/(2*Taho_ChekTime));
				 }	
			 else
				 {
					 RPM=0;
				 }
		 }
	 Tahometr_impulse_count = 0;							
	 Check_time = millis();									
	 attachInterrupt(0, TahometrImpulse_on, FALLING);		
 }


void output(int cel) // Вывод температуры и последующих на семисегментники (выделяем сотни, десятки, единицы) выводим каждую цифру в свою позицию
{
 if (cel >= 98)
		 {
			 digitalWrite(tochkaalarm, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkaalarm, LOW);	
		 }
hundreds=cel/100;
tens=(cel-hundreds*100)/10;
ones=cel-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[2]);	
digitalWrite(vse, HIGH);
delay(delayTime);				
digitalWrite(vse, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[3]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[4]);
digitalWrite(vse, HIGH);
delay(delayTime);
}

void output1(int lit)
{
tens=lit/10;
ones=lit-tens*10;
if (tens==0) tens=10;

digitalWrite(vse, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[0]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

}

void output2(int rpm)
{
 if (rpm >= 1000)
		 {
			 rpm=rpm/10;
			 digitalWrite(tochkatax, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkatax, LOW);	
		 }
hundreds=rpm/100;
tens=(rpm-hundreds*100)/10;
ones=rpm-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(tax, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[5]);	
digitalWrite(tax, HIGH);
delay(delayTime);
digitalWrite(tax, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[3]);			
digitalWrite(tax, HIGH);
delay(delayTime);

digitalWrite(tax, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[6]);			
digitalWrite(tax, HIGH);
delay(delayTime);
 digitalWrite(tax, LOW);
SPI.transfer(0x00);
SPI.transfer(pos[6]);			
digitalWrite(tax, HIGH);
}


void output3(int outputValue)
{
 if (outputValue >= 150)
		 {
			 digitalWrite(tochkaalarm, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkaalarm, LOW);	
		 }
 if (outputValue <= 100)
		 {
			 digitalWrite(tochkaalarm, HIGH);
		 }
 else
		 {
			 digitalWrite(tochkaalarm, LOW);	
		 }
hundreds=outputValue/100;
tens=(outputValue-hundreds*100)/10;
ones=outputValue-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[5]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[6]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[7]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0x00);
SPI.transfer(pos[2]);			
digitalWrite(vse, HIGH);
}

void output4(int rpm)				 //Тут подсчет и выделение цифр для зажигания определенных светодиодов, светодиоды в квазианалоговой шкале подключаются матрицей к двум регистрам
{
 int kva =rpm;
 kva = map(kva, 0, 6000, 0, 60);
 int pozi=0;
 double sot=0;
 pozi=kva/8;
sot=(kva/8.0-pozi)*8.0;
 int sot1=sot;
	 if (pozi>=1)
		 {
			 digitalWrite(kvaz, LOW);
			 shiftOut(dataPin, clockPin, MSBFIRST,riad[pozi]); //вывод ряда
			 shiftOut(dataPin, clockPin, MSBFIRST,poz[8]);
			 digitalWrite(kvaz, HIGH);
			 delay(delayTime);
			 digitalWrite(kvaz, LOW);
			 shiftOut(dataPin, clockPin, MSBFIRST,riad[0]); //вывод ряда
			 shiftOut(dataPin, clockPin, MSBFIRST,poz[0]);
			 digitalWrite(kvaz, HIGH);
			 delay(delayTime);
		 }

 digitalWrite(kvaz, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST,riad2[pozi+1]); //вывод количества
 shiftOut(dataPin, clockPin, MSBFIRST,poz[sot1]);
 digitalWrite(kvaz, HIGH);
 delay(delayTime);

 digitalWrite(kvaz, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST,riad2[0]); //вывод количества
 shiftOut(dataPin, clockPin, MSBFIRST,poz[0]);
 digitalWrite(kvaz, HIGH);
 delay(delayTime);
}


void loop(void)
{
 timer=millis();
 printlit();
 printcelsia();
 printvol();
 printrpm();
 if(timer-timerPrev>thinkingTime)			
	 {
		 Calc_RPM();
		 outputValue = float(analogRead(2))/55.8;
		 outputValue = outputValue*10;
		 lit = analogRead(1);
		 lit = map(lit, 0, 390, 0, 40);
		 cel = float(analogRead(0));
		 cel = log((10240000/analogRead(0)-10000));
		 cel = 1/(0.005297+(-0.0002979)*cel+0.0000002685*cel*cel*cel);
		 cel = cel-273.15;
		 timerPrev=timer;
	 }
}

void TahometrImpulse_on()
{
 static unsigned long millis_prev;
 if(millis()-4 > millis_prev)	
	 {
	 Tahometr_impulse_count++;
	 }
 millis_prev = millis();
}

Изменено пользователем Yurchik26
Ссылка на комментарий
Поделиться на другие сайты

  • 3 недели спустя...

Нужна помощь, помогите. Вод код для спидометра, только ещё без eeprom, вообщем сделал 3 суточника. Решил их проверить, включаю, считают, все хорошо, на кнопку нажимаю, переключаются, удерживаю кнопку обнуляется, короче все хорошо, ну решил проверить на объем, для быстрого набега циферек умножаю на 5000, запускаю. В итоге он считает до 32000 тысяч, потом кракозаблы всякие, и через секунд 3-4 обнуляется, хотя до обнуления ему минимум секунд 10 ещё маслать чтоб счетчик дотикал до функции обнуления. В итоге незнаю что с ним делать. Подозреваю что не хватает памяти, отключил 2 суточника, и оставил только 1, история таже, на 32000 кракозяблы.

Упрощенный код

int hundreds_thousands=0, ten_thousands=0, thousands=0, hundreds=0, tens=0, ones=0;
int delayTime=1;	
static uint8_t digit[11] = {0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde}; // Массив цифр которые выводим
static uint8_t digit2[12] ={0x81,0xf3,0x49,0x61,0x33,0x25,0x05,0xf1,0x01,0x21,0xff};
static uint8_t pos[9]= {0xef,0xf7,0xfb};
static uint8_t pos2[9]= {0x40,0x02,0x10,0x20,0x08,0x04};

void output5(int kmh)
{
hundreds_thousands=kmh/100000;
ten_thousands=(kmh-hundreds_thousands*100000)/10000;
thousands=(kmh-hundreds_thousands*100000-ten_thousands*10000)/1000;
hundreds=(kmh-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(kmh-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=kmh-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

if (hundreds_thousands==0) hundreds_thousands=10;
if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;

digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
void loop(void)
{
 kmh=kmh+kmha;
 output5(kmh);

Полный код

#include <SPI.h>
#include <math.h>
#define button 5
unsigned long Tahometr_impulse_count;
byte TahometrPin=2;
double RPM;
unsigned long Check_time ;
int clockPin = 7;
int dataPin = 8; // Это отдельные регистры под квазианалоговую шкалу.
int kvaz = 6;
double kmh;
double kmha;
double kmh1;
double kmh2;
int vid = 0;
enum { vse = 9, tax = 10};
#define debounce 20 // ms debounce period to prevent flickering when pressing or releasing the button
#define holdTime 1500 // ms hold period: how long to wait for press+hold event
int buttonVal = 0; // value read from button
int buttonLast = 0; // buffered value of the button's previous state
long btnDnTime; // time the button was pressed down
long btnUpTime; // time the button was released
boolean ignoreUp = false; // whether to ignore the button release because the click+hold was triggered
void setup()
{
SPI.begin();
 pinMode(button, INPUT);
 digitalWrite(button, LOW );
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
pinMode(vse, OUTPUT);
 pinMode(kvaz, OUTPUT);
 pinMode(TahometrPin, INPUT);
 digitalWrite(TahometrPin, HIGH);
 Check_time = millis();
 attachInterrupt(0, TahometrImpulse_on, FALLING); //Задаем прерывания для тахометра
}

int hundreds_thousands=0, ten_thousands=0, thousands=0, hundreds=0, tens=0, ones=0;
int delayTime=1;	
static uint8_t digit[11] = {0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde}; // Массив цифр которые выводим
static uint8_t digit2[12] ={0x81,0xf3,0x49,0x61,0x33,0x25,0x05,0xf1,0x01,0x21,0xff};
static uint8_t pos[9]= {0xef,0xf7,0xfb};
static uint8_t pos2[9]= {0x40,0x02,0x10,0x20,0x08,0x04};
unsigned int riad[9] = {
0B00000000,
0B11111110,
0B11111100,
0B11111000,								 // Массив вывода ряда на квазианалоговой шкале
0B11110000,
0B11100000,
0B11000000,
0B10000000,
0B00000000
};
unsigned int riad2[9] = {
0B00000000,
0B11111110,
0B11111101,
0B11111011,								 // Массив вывода ряда на квазианалоговой шкале
0B11110111,
0B11101111,
0B11011111,
0B10111111,
0B00000000
};
unsigned int poz[9] = {
0B00000000,
0B00000001,
0B00000011,
0B00000111,
0B00001111,								 //Массив вывода количества на квазианалоговой шкале
0B00011111,
0B00111111,
0B01111111,
0B11111111
};

unsigned long timer=0, timerPrev=0, thinkingTime=500;

void Calc_RPM()		 //тут считаем количество оборотов
 {
	 detachInterrupt(0);											
	 int Taho_ChekTime = millis()-Check_time;					
	 if (Taho_ChekTime > 0)
		 {							
			 if (Tahometr_impulse_count > 0)
				 {						
					 kmha=Tahometr_impulse_count;
					 kmha=kmha*0.0002833;
					 RPM=((Tahometr_impulse_count*60*1000*60)/(1*Taho_ChekTime));
					 RPM=RPM*0.0017;
				 }	
			 else
				 {
					 kmha=0;
					 RPM=0;
				 }
		 }
	 Tahometr_impulse_count = 0;							
	 Check_time = millis();									
	 attachInterrupt(0, TahometrImpulse_on, FALLING);		
 }

void output2(int rpm)
{				
if (rpm >= 1000)
		 {
			 rpm=rpm/10;	
		 }

hundreds=rpm/100;
tens=(rpm-hundreds*100)/10;
ones=rpm-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(tax, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(tax, HIGH);
delay(delayTime);
digitalWrite(tax, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(tax, HIGH);
delay(delayTime);

digitalWrite(tax, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);			
digitalWrite(tax, HIGH);
delay(delayTime);
 digitalWrite(tax, LOW);
SPI.transfer(0x00);
SPI.transfer(pos[1]);			
digitalWrite(tax, HIGH);
}
void output5(int kmh)
{
if (vid == 0)
{
hundreds_thousands=kmh/100000;
 ten_thousands=(kmh-hundreds_thousands*100000)/10000;
 thousands=(kmh-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(kmh-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(kmh-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=kmh-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
void output6(int kmh1)
{
if (vid == 1)
{
hundreds_thousands=kmh1/100000;
 ten_thousands=(kmh1-hundreds_thousands*100000)/10000;
 thousands=(kmh1-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(kmh1-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(kmh1-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=kmh1-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0x11);
SPI.transfer(pos2[0]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
void output7(int kmh2)
{
if (vid == 2)
{
hundreds_thousands=kmh2/100000;
 ten_thousands=(kmh2-hundreds_thousands*100000)/10000;
 thousands=(kmh2-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(kmh2-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(kmh2-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=kmh2-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0x05);
SPI.transfer(pos2[0]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}

void output4(int rpm)				 //Тут подсчет и выделение цифр для зажигания определенных светодиодов, светодиоды в квазианалоговой шкале подключаются матрицей к двум регистрам
{
 int kva =rpm;
 kva = map(kva, 0, 6000, 0, 60);
 int pozi=0;
 double sot=0;
 pozi=kva/8;
sot=(kva/8.0-pozi)*8.0;
 int sot1=sot;
	 if (pozi>=1)
		 {
			 digitalWrite(kvaz, LOW);
			 shiftOut(dataPin, clockPin, MSBFIRST,riad[pozi]); //вывод ряда
			 shiftOut(dataPin, clockPin, MSBFIRST,poz[8]);
			 digitalWrite(kvaz, HIGH);
			 delay(delayTime);
			 digitalWrite(kvaz, LOW);
			 shiftOut(dataPin, clockPin, MSBFIRST,riad[0]); //вывод ряда
			 shiftOut(dataPin, clockPin, MSBFIRST,poz[0]);
			 digitalWrite(kvaz, HIGH);
		 }

 digitalWrite(kvaz, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST,riad2[pozi+1]); //вывод количества
 shiftOut(dataPin, clockPin, MSBFIRST,poz[sot1]);
 digitalWrite(kvaz, HIGH);
 delay(delayTime);

 digitalWrite(kvaz, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST,riad2[0]); //вывод количества
 shiftOut(dataPin, clockPin, MSBFIRST,poz[0]);
 digitalWrite(kvaz, HIGH);
}


void loop(void)
{
 timer=millis();
 kmh=kmh+kmha*5000;
 kmh1=kmh1+kmha;
 kmh2=kmh2+kmha;
 output2(RPM);
 output4(RPM);
 output5(kmh);
 output6(kmh1);
 output7(kmh2);
 if (kmh>1000000)
		 {
			 kmh=0;
		 }
 if (kmh1>99999)
		 {
			 kmh1=0;
		 }
 if (kmh2>99999)
		 {
			 kmh2=0;
		 }
buttonVal = digitalRead(button);

if (buttonVal == HIGH && buttonLast == LOW && (millis() - btnUpTime) > long(debounce))
{
btnDnTime = millis();
}

if (buttonVal == LOW && buttonLast == HIGH && (millis() - btnDnTime) > long(debounce))
{
if (ignoreUp == false) event1();
else ignoreUp = false;
btnUpTime = millis();
}

if (buttonVal == HIGH && (millis() - btnDnTime) > long(holdTime))
{
event2();
ignoreUp = true;
btnDnTime = millis();
}
buttonLast = buttonVal;
if(timer-timerPrev>thinkingTime)			
	 {
		 Calc_RPM();
		 timerPrev=timer;
	 }
}
//=================================================
void event1()
{
 vid++;
 if(vid==3)
			 {
			 vid=0;
			 }
}
void event2()
		 {
		 if(vid==1)			
				 {
					 kmh1=0;		
				 }
		 if(vid==2)			
				 {
					 kmh2=0;		
				 }
		 }

void TahometrImpulse_on()
{
	 Tahometr_impulse_count++;

}

Сделал так

void loop(void)
{
 timer=millis();
 kmh=945678;
 kmh1=kmh1+kmha;
 kmh2=kmh2+kmha;
 output2(RPM);
 output4(RPM);
 output5(kmh);
 output6(kmh1);
 output7(kmh2);
 if (kmh>1000000)

теперь вместо 945678 он высвечивает 28174.

при kmh=34945; он светит кракозяблы

до kmh=32000 он высвечивает то число которое я напишу

Изменено пользователем Yurchik26
Ссылка на комментарий
Поделиться на другие сайты

Дописал скетч спидометра одометра. Какие будут предложения? И кстати, что в меню 2, там где ТО, знаю что половина счетчиков бесполезна, но мне так захотелось, сложностей это не вызвало, память контроллера ещё позволяет что нибудь добавить, скетч при компилировании пишет

Размер скетча в двоичном коде: 28 684 байт (из 30 720 байт максимум)

Алгоритм такой, при запуске считывает с памяти значения, потом проверяет их, если меньше указанного, то в течении примерно 3 секунд высвечивает ТО, которое скоро надо пройти, потом выключается и больше не включается до следующего запуска.

1- Есть 2 меню, это одометры и ТО.

2- В меню одометры 1 общий который нельзя обнулить, и 2 суточных А и Б.

3- В меню ТО, 9 разделов, масло в двигателе, масло в коробке, масло в редукторе, фильтр воздушный, антифриз, свечи, колодки, тормозная жидкость, выход.

1- Кратковременное нажатие кнопки, по кругу переключает разделы меню.

2- Удерживание более 1.5 сек. сбрасывает параметр, на котором вы находитесь.

3- Удерживание более 5 сек. переключает между меню где одометры, или на меню ТО (но переключает только если вы находитесь на общем одометре (это для меню с одометрами) или на разделе выход (это для меню с ТО)

#include <SPI.h>
#include <math.h>
#include <EEPROM.h>
#define button 5
unsigned long Tahometr_impulse_count;
byte TahometrPin=2;
double RPM;
unsigned long Check_time ;
int clockPin = 7;
int dataPin = 8; // Это отдельные регистры под квазианалоговую шкалу.
int kvaz = 6;
float kmh;
float kmha;
float kmh1;
float kmh2;
//+++++++++++++++++++++++++
float oildvs;
float oiltrans;
float oilredy;
float filvoz;
float antifriz;
float svechi;
float kolodki;
float tormoz;
//+++++++++++++++++++++++++
int menu = 0;
int vid1 = 0;
int vid2 = 0;
int vid3 = 0;
int piu=0;
int m=0;
enum { vse = 9, tax = 10};
#define debounce 10 // ms debounce period to prevent flickering when pressing or releasing the button
#define holdTime 1500 // ms hold period: how long to wait for press+hold event
#define holdTime1 5000
int buttonVal = 0; // value read from button
int buttonLast = 0; // buffered value of the button's previous state
long btnDnTime; // time the button was pressed down
long btnUpTime; // time the button was released
long btnDn1Time;
boolean ignoreUp = false; // whether to ignore the button release because the click+hold was triggered
void setup()
{
 kmh = EEPROM_float_read1(10);
 kmh1 = EEPROM_float_read2(20);
 kmh2 = EEPROM_float_read3(30);
oildvs = EEPROM_float_read4(40);
 oiltrans = EEPROM_float_read5(50);
 oilredy = EEPROM_float_read6(60);
 filvoz = EEPROM_float_read7(70);
 antifriz = EEPROM_float_read8(80);
 svechi = EEPROM_float_read9(90);
 kolodki = EEPROM_float_read10(100);
 tormoz = EEPROM_float_read11(110);
 SPI.begin();
 pinMode(3, OUTPUT); //13й вывод - выход
 pinMode(4, INPUT);	 //2й – вход. Здесь кнопка, замыкающая на землю
 digitalWrite(4, HIGH); //включаем подтягивающий резистор
 pinMode(button, INPUT);
 digitalWrite(button, LOW );
 pinMode(clockPin, OUTPUT);
 pinMode(dataPin, OUTPUT);
pinMode(vse, OUTPUT);
 pinMode(kvaz, OUTPUT);
 pinMode(TahometrPin, INPUT);
 digitalWrite(TahometrPin, HIGH);
 Check_time = millis();
 attachInterrupt(0, TahometrImpulse_on, FALLING); //Задаем прерывания для тахометра
}

unsigned long hundreds_thousands=0, ten_thousands=0, thousands=0, hundreds=0, tens=0, ones=0;
int delayTime=1;	
static uint8_t digit[11] = {0x7e,0x0c,0xb6,0x9e,0xcc,0xda,0xfa,0x0e,0xfe,0xde}; // Массив цифр которые выводим
static uint8_t digit2[12] ={0x81,0xf3,0x49,0x61,0x33,0x25,0x05,0xf1,0x01,0x21,0xff};
static uint8_t pos[9]= {0xef,0xf7,0xfb};
static uint8_t pos2[9]= {0x40,0x02,0x10,0x20,0x08,0x04};
unsigned int riad[9] = {
0B00000000,
0B11111110,
0B11111100,
0B11111000,								 // Массив вывода ряда на квазианалоговой шкале
0B11110000,
0B11100000,
0B11000000,
0B10000000,
0B00000000
};
unsigned int riad2[9] = {
0B00000000,
0B11111110,
0B11111101,
0B11111011,								 // Массив вывода ряда на квазианалоговой шкале
0B11110111,
0B11101111,
0B11011111,
0B10111111,
0B00000000
};
unsigned int poz[9] = {
0B00000000,
0B00000001,
0B00000011,
0B00000111,
0B00001111,								 //Массив вывода количества на квазианалоговой шкале
0B00011111,
0B00111111,
0B01111111,
0B11111111
};

unsigned long timer=0, timerPrev=0, thinkingTime=500; //время считывания импульсов
unsigned long timer1=0, timerPrev1=0, thinkingTime1=3000; //время показания в каком я разделе во 2 меню (ТО)
unsigned long timer2=0, timerPrev2=0, thinkingTime2=300; //время смены анимации
unsigned long timer4=0, timerPrev4=0, thinkingTime4=3000; //время отображения что надо заменить при запуске

void Calc_RPM()		 //тут считаем количество оборотов
 {
	 detachInterrupt(0);											
	 int Taho_ChekTime = millis()-Check_time;					
	 if (Taho_ChekTime > 0)
		 {							
			 if (Tahometr_impulse_count > 0)
				 {						
					 kmha=Tahometr_impulse_count;
					 kmha=kmha*0.0002833;
					 RPM=((Tahometr_impulse_count*60*1000*60)/(5*Taho_ChekTime));
					 RPM=RPM*0.0017;
				 }	
			 else
				 {
					 kmha=0;
					 RPM=0;
				 }
		 }
	 Tahometr_impulse_count = 0;							
	 Check_time = millis();									
	 attachInterrupt(0, TahometrImpulse_on, FALLING);		
 }


void output2(int rpm)
{				
if (rpm >= 1000)
		 {
			 rpm=rpm/10;	
		 }

hundreds=rpm/100;
tens=(rpm-hundreds*100)/10;
ones=rpm-hundreds*100-tens*10;
if (hundreds==0) hundreds=10;
if (hundreds==10 && tens==0)tens=10;
digitalWrite(tax, LOW);	
SPI.transfer(digit[hundreds]);
SPI.transfer(pos[0]);	
digitalWrite(tax, HIGH);
delay(delayTime);
digitalWrite(tax, LOW);
SPI.transfer(digit[tens]);
SPI.transfer(pos[1]);			
digitalWrite(tax, HIGH);
delay(delayTime);

digitalWrite(tax, LOW);
SPI.transfer(digit[ones]);
SPI.transfer(pos[2]);			
digitalWrite(tax, HIGH);
delay(delayTime);
 digitalWrite(tax, LOW);
SPI.transfer(0x00);
SPI.transfer(pos[1]);			
digitalWrite(tax, HIGH);
}
void output5(float kmh)
{
if(menu==0){
if (vid1 == 0)
{
hundreds_thousands=kmh/100000;
 ten_thousands=(kmh-hundreds_thousands*100000)/10000;
 thousands=(kmh-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(kmh-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(kmh-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=kmh-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
}
void output6(float kmh1)
{
if(menu==0){
if (vid1 == 1)
{
hundreds_thousands=kmh1/100000;
 ten_thousands=(kmh1-hundreds_thousands*100000)/10000;
 thousands=(kmh1-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(kmh1-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(kmh1-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=kmh1-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0x11);
SPI.transfer(pos2[0]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
}
void output7(float kmh2)
{
if(menu==0){
if (vid1 == 2)
{
hundreds_thousands=kmh2/100000;
 ten_thousands=(kmh2-hundreds_thousands*100000)/10000;
 thousands=(kmh2-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(kmh2-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(kmh2-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=kmh2-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0x05);
SPI.transfer(pos2[0]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void output8(float oildvs)
{
if(menu==1){
if (vid2 == 0)
{
 if (vid3 == 1){
 digitalWrite(vse, LOW);	
SPI.transfer(0x81);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x9f);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x8f);
SPI.transfer(pos2[2]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 if (piu==1){
 digitalWrite(vse, LOW);	
SPI.transfer(0xb9);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
 delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x57);
SPI.transfer(pos2[4]);	
digitalWrite(vse, HIGH);
 delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0xb9);
SPI.transfer(pos2[5]);	
digitalWrite(vse, HIGH);
 delay(delayTime);
			 }
 else	 {
 digitalWrite(vse, LOW);	
SPI.transfer(0x57);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
 delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0xb9);
SPI.transfer(pos2[4]);	
digitalWrite(vse, HIGH);
 delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x57);
SPI.transfer(pos2[5]);	
digitalWrite(vse, HIGH);
 delay(delayTime);
			 }

 digitalWrite(vse, LOW);	
SPI.transfer(0xff);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
}
else
{
hundreds_thousands=oildvs/100000;
 ten_thousands=(oildvs-hundreds_thousands*100000)/10000;
 thousands=(oildvs-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(oildvs-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(oildvs-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=oildvs-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
}
}
void output9(float oiltrans)
{
if(menu==1){
if (vid2 == 1){
if (vid3 == 1){
 digitalWrite(vse, LOW);	
SPI.transfer(0x81);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x9f);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x8f);
SPI.transfer(pos2[2]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x8d);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xed);
SPI.transfer(pos2[4]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0xe1);
SPI.transfer(pos2[5]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xff);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
}
else
{
hundreds_thousands=oiltrans/100000;
 ten_thousands=(oiltrans-hundreds_thousands*100000)/10000;
 thousands=(oiltrans-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(oiltrans-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(oiltrans-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=oiltrans-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
}
}
void output10(float oilredy)
{
if(menu==1){
if (vid2 == 2)
{
 if (vid3 == 1){
 digitalWrite(vse, LOW);	
SPI.transfer(0x81);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x9f);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x8f);
SPI.transfer(pos2[2]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 if (piu==1){

 digitalWrite(vse, LOW);	
SPI.transfer(0x39);
SPI.transfer(pos2[4]);	
digitalWrite(vse, HIGH);
 delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x47);
SPI.transfer(pos2[5]);	
digitalWrite(vse, HIGH);
 delay(delayTime);
			 }
 else	 {

 digitalWrite(vse, LOW);	
SPI.transfer(0x47);
SPI.transfer(pos2[4]);	
digitalWrite(vse, HIGH);
 delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x39);
SPI.transfer(pos2[5]);	
digitalWrite(vse, HIGH);
 delay(delayTime);
			 }

 digitalWrite(vse, LOW);	
SPI.transfer(0xff);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
}
else
{
hundreds_thousands=oilredy/100000;
 ten_thousands=(oilredy-hundreds_thousands*100000)/10000;
 thousands=(oilredy-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(oilredy-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(oilredy-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=oilredy-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
}
}
void output11(float filvoz)
{
if(menu==1){
if (vid2 == 3)
{
 if (vid3 == 1){
 digitalWrite(vse, LOW);	
SPI.transfer(0x1d);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x9f);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x8f);
SPI.transfer(pos2[2]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x01);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x81);
SPI.transfer(pos2[4]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x61);
SPI.transfer(pos2[5]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0xff);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
}
else
{
hundreds_thousands=filvoz/100000;
 ten_thousands=(filvoz-hundreds_thousands*100000)/10000;
 thousands=(filvoz-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(filvoz-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(filvoz-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=filvoz-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
}
}
void output12(float antifriz)
{
if(menu==1){
if (vid2 == 4)
{
	 if (vid3 == 1){
 digitalWrite(vse, LOW);	
SPI.transfer(0xf1);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0xfd);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x81);
SPI.transfer(pos2[2]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x8d);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x81);
SPI.transfer(pos2[4]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x8f);
SPI.transfer(pos2[5]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0xff);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
}
else
{
hundreds_thousands=antifriz/100000;
 ten_thousands=(antifriz-hundreds_thousands*100000)/10000;
 thousands=(antifriz-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(antifriz-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(antifriz-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=antifriz-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
}
}
void output13(float svechi)
{
if(menu==1){
if (vid2 == 5)
{
	 if (vid3 == 1){
 digitalWrite(vse, LOW);	
SPI.transfer(0x8d);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x01);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x0d);
SPI.transfer(pos2[2]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x33);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0x9f);
SPI.transfer(pos2[4]);	
digitalWrite(vse, HIGH);
delay(delayTime);

 digitalWrite(vse, LOW);	
SPI.transfer(0xff);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
}
else
{
hundreds_thousands=svechi/100000;
 ten_thousands=(svechi-hundreds_thousands*100000)/10000;
 thousands=(svechi-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(svechi-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(svechi-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=svechi-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
}
}
void output14(float kolodki)
{
if(menu==1){
if (vid2 == 6)
{
if (vid3 == 1){
 digitalWrite(vse, LOW);	
SPI.transfer(0x25);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xf1);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xfd);
SPI.transfer(pos2[2]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x81);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x19);
SPI.transfer(pos2[4]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xf3);
SPI.transfer(pos2[5]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xff);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
}
else
{
hundreds_thousands=kolodki/100000;
 ten_thousands=(kolodki-hundreds_thousands*100000)/10000;
 thousands=(kolodki-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(kolodki-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(kolodki-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=kolodki-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
}
}
void output15(float tormoz)
{
if(menu==1){
if (vid2 == 7)
{
	 if (vid3 == 1){
 digitalWrite(vse, LOW);	
SPI.transfer(0x25);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xf1);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xfd);
SPI.transfer(pos2[2]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x81);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x19);
SPI.transfer(pos2[4]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x49);
SPI.transfer(pos2[5]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xff);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
}
else
{
hundreds_thousands=tormoz/100000;
 ten_thousands=(tormoz-hundreds_thousands*100000)/10000;
 thousands=(tormoz-hundreds_thousands*100000-ten_thousands*10000)/1000;
 hundreds=(tormoz-hundreds_thousands*100000-ten_thousands*10000-thousands*1000)/100;
tens=(tormoz-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100)/10;
ones=tormoz-hundreds_thousands*100000-ten_thousands*10000-thousands*1000-hundreds*100-tens*10;

 if (hundreds_thousands==0) hundreds_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==0)ten_thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==0)thousands=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==0)hundreds=10;
 if (hundreds_thousands==10 && ten_thousands==10 && thousands==10 && hundreds==10 && tens==0)tens=10;
digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds_thousands]);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[ten_thousands]);
SPI.transfer(pos2[1]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[thousands]);
SPI.transfer(pos2[2]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(digit2[hundreds]);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
digitalWrite(vse, LOW);
SPI.transfer(digit2[tens]);
SPI.transfer(pos2[4]);			
digitalWrite(vse, HIGH);
delay(delayTime);

digitalWrite(vse, LOW);
SPI.transfer(digit2[ones]);
SPI.transfer(pos2[5]);			
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);
SPI.transfer(0xff);
SPI.transfer(pos2[3]);			
digitalWrite(vse, HIGH);
}
}
}
}
void output16()
{
if(menu==1){
if (vid2 == 8)
{
 digitalWrite(vse, LOW);	
SPI.transfer(0x0d);
SPI.transfer(pos2[0]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x13);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0x9f);
SPI.transfer(pos2[2]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xf1);
SPI.transfer(pos2[3]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xfd);
SPI.transfer(pos2[4]);	
digitalWrite(vse, HIGH);
delay(delayTime);
 digitalWrite(vse, LOW);	
SPI.transfer(0xff);
SPI.transfer(pos2[1]);	
digitalWrite(vse, HIGH);
}
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void output4(int rpm)				 //Тут подсчет и выделение цифр для зажигания определенных светодиодов, светодиоды в квазианалоговой шкале подключаются матрицей к двум регистрам
{
 int kva =rpm;
 kva = map(kva, 0, 120, 0, 60);
 int pozi=0;
 double sot=0;
 pozi=kva/8;
sot=(kva/8.0-pozi)*8.0;
 int sot1=sot;
	 if (pozi>=1)
		 {
			 digitalWrite(kvaz, LOW);
			 shiftOut(dataPin, clockPin, MSBFIRST,riad[pozi]); //вывод ряда
			 shiftOut(dataPin, clockPin, MSBFIRST,poz[8]);
			 digitalWrite(kvaz, HIGH);
			 delay(delayTime);
		 }

 digitalWrite(kvaz, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST,riad2[pozi+1]); //вывод количества
 shiftOut(dataPin, clockPin, MSBFIRST,poz[sot1]);
 digitalWrite(kvaz, HIGH);
 delay(delayTime);

 digitalWrite(kvaz, LOW);
 shiftOut(dataPin, clockPin, MSBFIRST,riad2[0]); //вывод количества
 shiftOut(dataPin, clockPin, MSBFIRST,poz[0]);
 digitalWrite(kvaz, HIGH);
}

void loop(void)
{
 digitalWrite(3, !digitalRead(4));
 if (digitalRead(4)==LOW)
 {
	 EEPROM_float_write1(10, kmh);
	 EEPROM_float_write2(20, kmh1);
	 EEPROM_float_write3(30, kmh2);
	 EEPROM_float_write4(40, oildvs);
	 EEPROM_float_write5(50, oiltrans);
	 EEPROM_float_write6(60, oilredy);
	 EEPROM_float_write7(70, filvoz);
	 EEPROM_float_write8(80, antifriz);
	 EEPROM_float_write9(90, svechi);
	 EEPROM_float_write10(100, kolodki);
	 EEPROM_float_write11(110, tormoz);
 }
 timer=millis();
 timer1=millis();
 timer2=millis();
 timer4=millis();
 kmh=kmh+kmha;
 kmh1=kmh1+kmha;
 kmh2=kmh2+kmha;
 oildvs=oildvs-kmha;
 oiltrans=oiltrans-kmha;
 oilredy=oilredy-kmha;
 filvoz=filvoz-kmha;
 antifriz=antifriz-kmha;
 svechi=svechi-kmha;
 kolodki=kolodki-kmha;
 tormoz=tormoz-kmha;
 zagr();
 output2(RPM);
 output4(RPM);
 output5(kmh);
 output6(kmh1);
 output7(kmh2);
 output8(oildvs);
 output9(oiltrans);
 output10(oilredy);
 output11(filvoz);
 output12(antifriz);
 output13(svechi);
 output14(kolodki);
 output15(tormoz);
 output16();
 if (kmh>999999)
		 {
			 kmh=0;
		 }
 if (kmh1>99999)
		 {
			 kmh1=0;
		 }
 if (kmh2>99999)
		 {
			 kmh2=0;
		 }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
buttonVal = digitalRead(button);

if (buttonVal == HIGH && buttonLast == LOW && (millis() - btnUpTime) > long(debounce))
{
btnDnTime = millis();
btnDn1Time = millis();
}

if (buttonVal == LOW && buttonLast == HIGH && (millis() - btnDnTime) > long(debounce))
{
if (ignoreUp == false) event1();
else ignoreUp = false;
btnUpTime = millis();
}

if (buttonVal == HIGH && (millis() - btnDnTime) > long(holdTime))
{
event2();
ignoreUp = true;
btnDnTime = millis();
}
if (buttonVal == HIGH && (millis() - btnDn1Time) > long(holdTime1))
{
event3();
ignoreUp = true;
btnDn1Time = millis();
}
buttonLast = buttonVal;
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(timer1-timerPrev1>thinkingTime1)			
							 {
								 vid3=0;
							 }
if(timer2-timerPrev2>thinkingTime2)			
							 {
								 piu++;
								 if (piu==2){
										 piu=0;
										 }
								 timerPrev2=timer2;
							 }
if(timer-timerPrev>thinkingTime)			
	 {
		 Calc_RPM();
		 timerPrev=timer;
	 }
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void event1()
{
if(menu==0)
		 {
				 vid1++;
						 if(vid1==3)
									 {
									 vid1=0;
									 }
		 }
if(menu==1)
		 {
				 vid2++;
				 vid3=1;
				 timerPrev1=timer1;
						 if(vid2==9)
									 {
									 vid2=0;
									 }
		 }
}
void event2()
{
if(menu==0)
		 {
		 if(vid1==1)			
				 {
					 kmh1=0;		
				 }
		 if(vid1==2)			
				 {
					 kmh2=0;		
				 }	
		 }
if(menu==1)
		 {
		 if(vid2==0)			
				 {
					 oildvs=10000.00;		
				 }
		 if(vid2==1)			
				 {
					 oiltrans=100000.00;		
				 }
		 if(vid2==2)			
				 {
					 oilredy=50000.00;	
				 }
		 if(vid2==3)			
				 {
					 filvoz=2500.00;		
				 }

		 if(vid2==4)			
				 {
					 antifriz=100000.00;		
				 }
		 if(vid2==5)			
				 {
					 svechi=35000;		
				 }
		 if(vid2==6)			
				 {
					 kolodki=35000.00;		
				 }
		 if(vid2==7)			
				 {
					 tormoz=100000.00;		
				 }
		 }

}

void event3()
{
		 if(menu==0)
					 {
					 if(vid1==0)			
								 {
									 menu=1;
									 vid2=0;
									 vid3=1;
									 timerPrev1=timer1;
								 }
					 }
		 if(menu==1)
					 {
					 if(vid2==8)			
								 {
								 menu=0;
								 vid1=0;
								 }
					 }
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void EEPROM_float_write1(int addr, float kmh) // запись в ЕЕПРОМ
{
byte *x = (byte *)&kmh;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read1(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void EEPROM_float_write2(int addr, float kmh1) // запись в ЕЕПРОМ
{
byte *x = (byte *)&kmh1;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read2(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void EEPROM_float_write3(int addr, float kmh2) // запись в ЕЕПРОМ
{
byte *x = (byte *)&kmh2;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read3(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void EEPROM_float_write4(int addr, float oildvs) // запись в ЕЕПРОМ
{
byte *x = (byte *)&oildvs;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read4(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void EEPROM_float_write5(int addr, float oiltrans) // запись в ЕЕПРОМ
{
byte *x = (byte *)&oiltrans;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read5(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void EEPROM_float_write6(int addr, float oilredy) // запись в ЕЕПРОМ
{
byte *x = (byte *)&oilredy;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read6(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void EEPROM_float_write7(int addr, float filvoz) // запись в ЕЕПРОМ
{
byte *x = (byte *)&filvoz;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read7(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void EEPROM_float_write8(int addr, float antifriz) // запись в ЕЕПРОМ
{
byte *x = (byte *)&antifriz;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read8(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void EEPROM_float_write9(int addr, float svechi) // запись в ЕЕПРОМ
{
byte *x = (byte *)&svechi;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read9(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void EEPROM_float_write10(int addr, float kolodki) // запись в ЕЕПРОМ
{
byte *x = (byte *)&kolodki;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read10(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void EEPROM_float_write11(int addr, float tormoz) // запись в ЕЕПРОМ
{
byte *x = (byte *)&tormoz;
for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}
float EEPROM_float_read11(int addr) // чтение из ЕЕПРОМ
{
byte x[4];
for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
float *y = (float *)&x;
return y[0];
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

void TahometrImpulse_on()
{
	 Tahometr_impulse_count++;

}
void zagr()
{
if(m<=8)
 {
 if(timer4-timerPrev4>thinkingTime4)			
							 {
								 m++;
								 if (m>=8){
										 menu=0;
										 vid2=0;
										 m=10;
										 }
								 timerPrev4=timer4;
							 }
if(m<=8)
 {
		 menu=1;
		 vid3=1;
		 if(m==0)			
				 {		
		 if(oildvs<=500.00)			
				 {
					 vid2=0;
				 }
		 else
			 {
			 m++;
			 }
				 }
		 if(m==1)			
				 {		
		 if(oiltrans<=100.00)			
				 {
					 vid2=1;
				 }
				 else
			 {
			 m++;
			 }
				 }
		 if(m==2)			
				 {	
		 if(oilredy<=100.00)			
				 {
					 vid2=2;
				 }
				 else
			 {
			 m++;
			 }
				 }
		 if(m==3)			
				 {		
		 if(filvoz<=500.00)			
				 {
					 vid2=3;
				 }
				 else
			 {
			 m++;
			 }
				 }
		 if(m==4)			
				 {		
		 if(antifriz<=100.00)			
				 {
					 vid2=4;
				 }
				 else
			 {
			 m++;
			 }
				 }
		 if(m==5)			
				 {	
		 if(svechi<=100.00)			
				 {
					 vid2=5;
				 }
				 else
			 {
			 m++;
			 }
				 }
		 if(m==6)			
				 {	
		 if(kolodki<=100.00)			
				 {
					 vid2=6;
				 }
				 else
			 {
			 m++;
			 }
				 }
		 if(m==7)			
				 {	
		 if(tormoz<=100.00)			
				 {
					 vid2=7;
				 }
				 else
			 {
			 m++;
			 }
				 }
 }
 }	
}

Изменено пользователем Yurchik26
Ссылка на комментарий
Поделиться на другие сайты

Сделал.

Надо добавить в самое начало, к библиотекам рядом.

int kva=0;

unsigned long timer5=0, timerPrev5=0, thinkingTime5=10;

В void loop это

timer5=millis();

и

void output4(int rpm)				   //Тут подсчет и выделение цифр для зажигания определенных светодиодов, светодиоды в квазианалоговой шкале подключаются матрицей к двум регистрам
{
    int kvm =rpm;
    kvm = map(kvm, 0, 120, 0, 60);
    if(timer5-timerPrev5>thinkingTime5)			   
	 {
		  if (kvm>kva)
		  {
		    kva++;
		  }
		  if (kvm<kva)
		  {
		    kva--;
		  }
		 timerPrev5=timer5;
	 }
    int pozi=0;
    double sot=0;   
    pozi=kva/8;
sot=(kva/8.0-pozi)*8.0; 
    int sot1=sot;
	   if (pozi>=1)
		  {
			  digitalWrite(kvaz, LOW);
			  shiftOut(dataPin, clockPin, MSBFIRST,riad[pozi]);    //вывод ряда
			  shiftOut(dataPin, clockPin, MSBFIRST,poz[8]);
			  digitalWrite(kvaz, HIGH);
			  delay(delayTime);
		  }

    digitalWrite(kvaz, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST,riad2[pozi+1]);   //вывод количества
    shiftOut(dataPin, clockPin, MSBFIRST,poz[sot1]);
    digitalWrite(kvaz, HIGH);
    delay(delayTime);

    digitalWrite(kvaz, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST,riad2[0]);   //вывод количества
    shiftOut(dataPin, clockPin, MSBFIRST,poz[0]);
    digitalWrite(kvaz, HIGH);
}

Изменено пользователем Yurchik26
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...