Установка для проверки/промывки топливных форсунок

MaksVV
Offline
Зарегистрирован: 06.08.2015

В теме по пультоскопу я пооффтопил. В общем переделал скетч генератора сигналов пультоскопа под станцию для проверки инжекторов. Для дисплея OLED Adafruit 128х64. Библиотеки можно взять от пультоскопа. 

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

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <PWM.h>
#define led  9   //пин для генератора сигналов (не менять)

#define levo 10  //кнопка ЛЕВО(можно любой пин)
#define ok 11    //кнопка ОК(можно любой пин)
#define pravo 12 //кнопка ПРАВО(можно любой пин)


#define OLED_RESET 4 
Adafruit_SSD1306 display(OLED_RESET); 
         

int PWM = 128;//стартовое значение ШИМ от 0 до 255        
int32_t frequency = 8; //стартовое значение частоты в Гц


//###########################################################

byte hag=0;
int mnog=0;
int flag=0;

float t = 3.00;
long testtime = 30;
unsigned long time, timer=0;
bool timerenabled=false;


void setup()
{
pinMode (levo, INPUT); digitalWrite (levo, HIGH);
pinMode (pravo, INPUT); digitalWrite (pravo, HIGH);
pinMode (ok, INPUT); digitalWrite (ok, HIGH);


display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

 InitTimersSafe(); 
 bool success = SetPinFrequencySafe(led, frequency); 

display.setTextColor(WHITE);
delay(500); 
    }   


void loop() {
display.clearDisplay();  
if (flag==0){//флаг выборов режима настройки Частоты вращения ДВс
            if(digitalRead(levo)==LOW){
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }
            if(digitalRead(pravo)==LOW){
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима времени впрыска
            if(digitalRead(levo)==LOW){
              t=t-0.1;
              delay(3);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
             t=t+0.1;
             delay(3);//защита от дребезга 
            }  
}
if (flag==3) {display.setCursor(80,50);display.setTextSize(2); // меню старт
    int sec; sec= testtime - ((time - timer)/1000);
    if (timerenabled){  display.print(sec);}
  else display.print ("00");
  
if (!timerenabled){ 
if(digitalRead(pravo)==LOW){ pwmWrite(led, 255-PWM);
  timer=time; 
  timerenabled=true;}
  
  delay(3);//защита от дребезга 
            }
if(digitalRead(levo)==LOW) {pwmWrite(led, 255); timerenabled=false;}
  

}
if (flag==2) {if (!timerenabled){
             if(digitalRead(levo)==LOW){
              testtime=testtime-5;
              if(testtime<0){testtime=0;} 
              delay(3);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
             testtime=testtime+5;
             delay(3);//защита от дребезга 
            }  }   }
PWM=frequency*t*0.255; 
if(PWM<0){PWM=0;} 
if(PWM>255){PWM=255;} 

time = millis();
  if (timerenabled) {
    if ((time-timer)>(testtime*1000)) {pwmWrite(led, 255); timerenabled=false;}
                    }

    
if(digitalRead(ok)==LOW){//переключение разряда выбора частоты 
  delay(20);//защита от дребезга
  hag++;
  if(hag>=4){hag=0;}
} 
////////////
display.setTextSize(1);
display.setCursor(0,0);
display.print("PWM=");
display.print(PWM*100/255);
display.print(" %");
display.setTextSize(2);
display.setCursor(54,0);
display.print(t);
display.setTextSize(1);
display.print("msec");
display.setCursor(0,12);
display.print(frequency); display.print("Hz");


///////////    
display.setCursor(0,29);
 display.setTextSize(2);
long frequencyX=frequency*120;
display.print(frequencyX);display.setTextSize(1);display.print("/min");
display.setTextSize(2);
display.setCursor(80,26);
display.print(testtime); display.setTextSize(1); display.print("sec");

display.setCursor(0,57);
display.setTextSize(1);
display.print(">> ");    
      if(hag==0){//выбор множителя частоты
        display.print("--120/min++ "); 
          mnog=1;
          flag=0;
      }
         
      if(hag==1){//выбор  время впрыска
          display.print("--msec++ ");
          flag=1;
         } 
       if(hag==2){//выбор  время теста
          display.print("--TIME TEST++ ");
          flag=2;
      } 
       if(hag==3){// меню старт
          display.print("START ");
          flag=3;
       }
display.print("<<"); 
       

delay(100);  
display.display();
}

 

 

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

А вся остальная часть?

MaksVV
Offline
Зарегистрирован: 06.08.2015

будет что-то типа этого, на скорую руку. Уже пилю.

 

В попыхах в первой версии кода забыл сделать режим постоянного открытия форсунок, вот версия 2:

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <PWM.h>
#define led  9   //пин для генератора сигналов (не менять)

#define levo 10  //кнопка ЛЕВО(можно любой пин)
#define ok 11    //кнопка ОК(можно любой пин)
#define pravo 12 //кнопка ПРАВО(можно любой пин)


#define OLED_RESET 4 
Adafruit_SSD1306 display(OLED_RESET); 
         

int PWM = 128;//стартовое значение ШИМ от 0 до 255        
int32_t frequency = 8; //стартовое значение частоты в Гц


//###########################################################

byte hag=4;
int mnog=0;
int flag=0;

float t = 3.00;              //время впрыска, мсек
long testtime = 30;          //время теста, сек
bool full = 1;               // флаг режима полное открытие форсунок
unsigned long time, timer=0;
bool timerenabled=false;



void setup()
{
pinMode (levo, INPUT); digitalWrite (levo, HIGH);
pinMode (pravo, INPUT); digitalWrite (pravo, HIGH);
pinMode (ok, INPUT); digitalWrite (ok, HIGH);


display.begin(SSD1306_SWITCHCAPVCC, 0x3C);

 InitTimersSafe(); 
 bool success = SetPinFrequencySafe(led, frequency); 

display.setTextColor(WHITE);
delay(500); 
    }   


void loop() {
display.clearDisplay();  
if (flag==0){//флаг выборов режима настройки Частоты вращения ДВс
            if(digitalRead(levo)==LOW){
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }
            if(digitalRead(pravo)==LOW){
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              delay(3);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима времени впрыска
            if(digitalRead(levo)==LOW){
              t=t-0.1;
              delay(3);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
             t=t+0.1;
             delay(3);//защита от дребезга 
            }  
}
if (flag==4) {display.setCursor(80,50);display.setTextSize(2); // меню старт
    int sec; sec= testtime - ((time - timer)/1000);
    if (timerenabled){  display.print(sec);}
  else display.print ("00");
  
if (!timerenabled){ 
if(digitalRead(pravo)==LOW){ pwmWrite(led, 255-PWM);
  timer=time; 
  timerenabled=true;}
  
  delay(3);//защита от дребезга 
            }
if(digitalRead(levo)==LOW) {pwmWrite(led, 255); timerenabled=false;}
  

}
if (flag==3) {if (!timerenabled){  // время теста
             if(digitalRead(levo)==LOW){
              testtime=testtime-5;
              if(testtime<0){testtime=0;} 
              delay(3);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
             testtime=testtime+5;
             delay(3);//защита от дребезга 
            }  }   }

if (flag==2){if ((digitalRead(levo)==LOW)||(digitalRead(pravo)==LOW)) full=!full;
delay (3);}
if (!full){PWM=frequency*t*0.255;}
else PWM=255; 
if(PWM<0){PWM=0;} 
if(PWM>255){PWM=255;} 

time = millis();
  if (timerenabled) {
    if ((time-timer)>(testtime*1000)) {pwmWrite(led, 255); timerenabled=false;}
                    }

    
if(digitalRead(ok)==LOW){//переключение разряда выбора частоты 
  delay(20);//защита от дребезга
  hag++;
  if(hag>=5){hag=0;}
} 
////////////
display.setTextSize(1);
display.setCursor(0,0);
display.print("PWM=");
display.print(PWM*100/255);
display.print(" %");
if (!full){display.setTextSize(2);
display.setCursor(54,0);
display.print(t);
display.setTextSize(1);
display.print("msec");}
else {display.setTextSize(2);
display.setCursor(67,0);
display.print ("FULL");
display.setTextSize(1);
}
display.setCursor(0,12);
display.print(frequency); display.print("Hz");


///////////    
display.setCursor(0,29);
 display.setTextSize(2);
long frequencyX=frequency*120;
display.print(frequencyX);display.setTextSize(1);display.print("/min");
display.setTextSize(2);
display.setCursor(80,26);
display.print(testtime); display.setTextSize(1); display.print("sec");

display.setCursor(0,57);
display.setTextSize(1);
display.print("<< ");    
      if(hag==0){//выбор множителя частоты
        display.print("N/min"); 
          mnog=1;
          flag=0;
      }
         
      if(hag==1){//выбор  время впрыска
          display.print("millisec");
          flag=1;
         }
         
      if(hag==2){//выбор режима
         display.print("Full On/Off");
        flag=2;
        }

         
       if(hag==3){//выбор  время теста
          display.print("TIME TEST");
          flag=3;
      } 
       if(hag==4){// меню старт
          display.print("START");
          flag=4;
       }
       
       
display.print(" >>"); 
       

delay(100);  
display.display();
}

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Электронику в отдельную коробушку, все таки топливо )))

MaksVV
Offline
Зарегистрирован: 06.08.2015

ага, а то будет бензуино)

man_200
Offline
Зарегистрирован: 29.04.2016

Под дисплеи 3310 или 5110 нужно только библиотеки поменять?

Схему блока мофсет скинь для полного проекта

MaksVV
Offline
Зарегистрирован: 06.08.2015

лучше готовый взять 

MaksVV
Offline
Зарегистрирован: 06.08.2015

под другой дисплей думаю не только библиотеки поменять, код надо править.  

MaksVV
Offline
Зарегистрирован: 06.08.2015

Вот скетч под дисплей LCD 20х4 с i2c . В скетче можно выбрать логику шим, прямая или обратная. Это важно при подключении к форсункам, в зависимости от того, чем будем рулить - плюсом или минусом. Для мосфет модуля, указанного выше по ссылке, должна быть прямая логика ШИМ. 

PS забыл сказать. подключение кнопок, не как в пультоскопе. Я использовал внутреннюю подтяжку к питанию. Поэтому кнопки замыкают "массу".

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <PWM.h>
#define led  9   //пин для генератора сигналов (не менять)

#define levo 10  //кнопка ЛЕВО(можно любой пин)
#define ok 11    //кнопка ОК(можно любой пин)
#define pravo 12 //кнопка ПРАВО(можно любой пин)


LiquidCrystal_I2C lcd(0x27, 20, 4);
         

int PWM = 128;//стартовое значение ШИМ от 0 до 255        
int32_t frequency = 7; //стартовое значение частоты в Гц
                       //(соответсвует 840 об/мин)

//###########################################################

byte hag=4;
int mnog=0;
int flag=0;

bool pwm = 1;   // ЗДЕСЬ НУЖНО ВЫБРАТЬ ЛОГИКУ ВЫХОДА ШИМ - ПРЯМАЯ ИЛИ ОБРАТНАЯ,
//В ЗАВИСИМОСТИ ОТ ТОГО, КАКАЯ ЛОГИКА ВЫХОДНОГО МОСФЕТА И ПОДКЛЮЧЕНИЯ К ФОРСУНКАМ (рулим плюсом или минусом?)
//  0 - ОБРАТНЫЙ ШИМ,   1 - ПРЯМОЙ ШИМ
// ОБРАТНЫЙ ШИМ - 100% шим со скетча соответсвует 0% шим на выходе ардуино (форсунка постоянно открыта) - управление осущесвляется минусом форсунки.
// ПРЯМОЙ ШИМ - 100% шим со скетча соответствует 100% шим на выходе ардуино (форсунка постоянно открыта) - управление осущесвляется плюсом форсунки. 
float t = 3.00;              //время впрыска, мсек
long testtime = 30;          //время теста, сек
bool full = 1;               // флаг режима полное открытие форсунок
unsigned long time, timer=0; // для таймера отсчета времени теста
bool timerenabled=false;     // для таймера отсчета времени теста



void setup()
{
pinMode (levo, INPUT); digitalWrite (levo, HIGH);
pinMode (pravo, INPUT); digitalWrite (pravo, HIGH);
pinMode (ok, INPUT); digitalWrite (ok, HIGH);


lcd.begin();
lcd.backlight();

 InitTimersSafe(); 
 bool success = SetPinFrequencySafe(led, frequency); 


delay(500); 
    }   


void loop() {
//lcd.clear ();
if (flag==0){//флаг выборов режима настройки Частоты вращения ДВс
            if(digitalRead(levo)==LOW){
              full=0;
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              delay(7);//защита от дребезга 
            }
            if(digitalRead(pravo)==LOW){
              full=0;
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              delay(7);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима времени впрыска
            if(digitalRead(levo)==LOW){
              full=0;
              t=t-0.1;
              delay(10);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
             full=0;
             t=t+0.1;
             delay(10);//защита от дребезга 
            }  
}
if (flag==4) {lcd.setCursor(13,1); // меню старт
    int sec; sec= testtime - ((time - timer)/1000);
    if (timerenabled){  lcd.print(sec);lcd.print("   ");}
  else lcd.print ("00");
  
  
if (!timerenabled){ 
if(digitalRead(pravo)==LOW){
  if (!pwm){ pwmWrite(led, 255-PWM);}
  else {pwmWrite(led, PWM);}
  timer=time; 
  timerenabled=true;}
  
  delay(3);//защита от дребезга 
            }
if(digitalRead(levo)==LOW) {
  if (!pwm){pwmWrite(led, 255);}
  else {pwmWrite(led, 0);}
  timerenabled=false;}
  

}
if (flag==3) {if (!timerenabled){  // время теста
             if(digitalRead(levo)==LOW){
              testtime=testtime-5;
              if(testtime<0){testtime=0;} 
              delay(10);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
             testtime=testtime+5;
             delay(10);//защита от дребезга 
            }  }   }

if (flag==2){if ((digitalRead(levo)==LOW)||(digitalRead(pravo)==LOW)) full=!full;
delay (60);}
if (!full){PWM=frequency*t*0.255;}
else PWM=255; 
if(PWM<0){PWM=0;} 
if(PWM>255){PWM=255;} 

time = millis();
  if (timerenabled) {
    if ((time-timer)>(testtime*1000)) {
      if (!pwm){pwmWrite(led, 255);}
      else {pwmWrite(led, 0);}
      timerenabled=false;}
                    }

    
if(digitalRead(ok)==LOW){//переключение менюшек
  delay(20);//защита от дребезга
  hag++;
  if(hag>=5){hag=0;}
} 
////////////

lcd.setCursor(0,0);
if (!full){
lcd.print("inj=");
lcd.print(t);
lcd.print("msec ");
lcd.setCursor(0,1);
lcd.print("N=");
long frequencyX=frequency*120;
lcd.print(frequencyX); 
if (frequencyX>9999) lcd.print(" RPM  ");
else lcd.print(" RPM   "); }
else {lcd.print ("FULL mode    "); lcd.setCursor(0,1); lcd.print ("OPEN         ");}


lcd.setCursor(13,0);
lcd.print(testtime); lcd.print("sec  ");

  lcd.setCursor(0,3);

   lcd.print("<< ");    
      if(hag==0){//выбор множителя частоты
        
        lcd.print("N/min"); 
        lcd.print(" >>         "); 
          mnog=1;
          flag=0;
      }
         
      if(hag==1){//выбор  время впрыска
          lcd.print("millisec");
          lcd.print(" >>      "); 
          flag=1;
         }
         
      if(hag==2){//выбор режима постоянного открытия инжектора 
        lcd.print("Full On/Off");
        lcd.print(" >>   "); 
        flag=2;
        }

         
       if(hag==3){//выбор время теста
          lcd.print("TIME TEST");
           lcd.print(" >>   "); 
          
          flag=3;
      } 
       if(hag==4){// меню старт
         lcd.print("STOP     START");
         lcd.print(" >>"); 
          flag=4;
       }
       
delay(100);  
lcd.display();
}


evgen89
Offline
Зарегистрирован: 07.04.2017

Подскажите дисплей я правильно подобрал

https://ru.aliexpress.com/item/IIC-I2C-TWI-2004-Serial-Blue-Backlight-LC...

bester
Offline
Зарегистрирован: 25.06.2016

А можете подправить под OLED дисплей, чтоб скетч вошел в nano с Atmega168? А то после компиляции вот это пишет "Скетч использует 12514 байт (87%) памяти устройства. Всего доступно 14336 байт. Глобальные переменные используют 926 байт (90%) динамической памяти, оставляя 98 байт для локальных переменных. Максимум: 1024 байт. Недостаточно памяти, программа может работать нестабильно."

И еще, как шрифт уменьшить,. а то не все данные отображаются на OLED дисплей, интервалы между сстроками сделал минимальными и всеравно не влазит всё?

MaksVV
Offline
Зарегистрирован: 06.08.2015

Со шрифтами так не должно быть, может у вас библиотека кривая. Дак влазит же программа, попробуйте как работает, может и не надо ничего править. У меня вообще на 168 меге не компилируется, 150% занимает оперативы

MaksVV
Offline
Зарегистрирован: 06.08.2015

evgen89 пишет:

Подскажите дисплей я правильно подобрал

https://ru.aliexpress.com/item/IIC-I2C-TWI-2004-Serial-Blue-Backlight-LC...

Да

bester
Offline
Зарегистрирован: 25.06.2016

В 328 влазит, а в 168 нет. Библиотеки с сайта пультоскопа вроде брал.

P/S: библиотеки старые удалил, установил новые через оболочку ардуино, все-равно шрифт крупный, все данные не влазят на экран.

MaksVV
Offline
Зарегистрирован: 06.08.2015

под 168 врядли влезет, много слишком не хватает. По поводу шрифта хз, может каким то образом 128 х 32 экран выбирается. Ровно ведь половина не влазит

MaksVV
Offline
Зарегистрирован: 06.08.2015

лучше брать LCD 20х4. Oled конечно четко все, но ппц мелкий он. Да и скетч на 20х4 я уже получше сделал

bester
Offline
Зарегистрирован: 25.06.2016

Есть спаянный пультоскоп на дисплее от нокиа с резисторами на кнопках, можете переделать ваш скетч под него?

nevkon
Онлайн
Зарегистрирован: 20.01.2015

А можно подробнее про саму установку? Как нагнетается, что прогоняется?

evgen89
Offline
Зарегистрирован: 07.04.2017

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

Обычно делается так, берётся насос и какая нибудь рампа от авто (что найдётся подешевле с разборки) тут надо обратить внимание на то что либо насос в сборе с регулятором давления, либо регулятор давления на рампе, ну и дальше всё это куда нибудь крепится кто то варит рамку кто то из дсп выпиливает.

Прогоняется как правило бензин (сам им пользуюсь) но лучше прикупить тест жидкость она цветная лучше видно факел распыла, она не пахнет, она не ГОРИТ. Ибо тут очень аккуратно у многих всё собрано на соплях и одна лишняя искра может привести к печальке.

Heathen
Offline
Зарегистрирован: 23.10.2015

Спустя год тоже руки дошли до стенда, по необходимости использовал программу TestCarInjector на компе. Немного допилил под свои нужды код MaksVV, сделал управление насосом, сливом жидкости из колб и включение ультразвуковой ванны, но никак не могу понять почему на менюшке Ultrasonic на дисплее начинает моргать inj=4 с частотой 1Гц. И еще никак не дойдет, как сделать по окончанию таймера выход в меню SLIV.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <PWM.h>
#define led  9   //пин для генератора сигналов (не менять)

#define levo 10  //кнопка ЛЕВО(можно любой пин)
#define ok 11    //кнопка ОК(можно любой пин)
#define pravo 12 //кнопка ПРАВО(можно любой пин)


LiquidCrystal_I2C lcd(0x27, 20, 4);
         

int PWM = 128;//стартовое значение ШИМ от 0 до 255
int pump = 8; //пин включения насоса 8 
int sliv = 6; //пин слива 6
int uz = 7; //пин включения ультразвука        
int32_t frequency = 7; //стартовое значение частоты в Гц
                       //(соответсвует 840 об/мин)

//###########################################################

byte nfl=0; //флаг насоса
byte uzfl=0; //флаг ультразвука
byte hag=4;
int mnog=0;
int flag=0;

bool pwm = 1;   // ЗДЕСЬ НУЖНО ВЫБРАТЬ ЛОГИКУ ВЫХОДА ШИМ - ПРЯМАЯ ИЛИ ОБРАТНАЯ,
//В ЗАВИСИМОСТИ ОТ ТОГО, КАКАЯ ЛОГИКА ВЫХОДНОГО МОСФЕТА И ПОДКЛЮЧЕНИЯ К ФОРСУНКАМ (рулим плюсом или минусом?)
//  0 - ОБРАТНЫЙ ШИМ,   1 - ПРЯМОЙ ШИМ
// ОБРАТНЫЙ ШИМ - 100% шим со скетча соответсвует 0% шим на выходе ардуино (форсунка постоянно открыта) - управление осущесвляется минусом форсунки.
// ПРЯМОЙ ШИМ - 100% шим со скетча соответствует 100% шим на выходе ардуино (форсунка постоянно открыта) - управление осущесвляется плюсом форсунки. 
float t = 4.50;              //время впрыска, мсек
long testtime = 60;          //время теста, сек
bool full = 0;               // флаг режима полное открытие форсунок
unsigned long time, timer=0; // для таймера отсчета времени теста
bool timerenabled=false;     // для таймера отсчета времени теста



void setup()
{
pinMode (levo, INPUT); digitalWrite (levo, HIGH);
pinMode (pravo, INPUT); digitalWrite (pravo, HIGH);
pinMode (ok, INPUT); digitalWrite (ok, HIGH);
pinMode(pump, OUTPUT); 
pinMode(uz, OUTPUT);
pinMode(sliv, OUTPUT);

lcd.begin();
lcd.backlight();
lcd.setCursor(3,1); lcd.print("T");
delay(300);
lcd.print("E");
delay(300);
lcd.print("S");
delay(300);
lcd.print("T");
delay(300);
lcd.print(" ");
lcd.print("I");
delay(300);
lcd.print("N");
delay(300);
lcd.print("J");
delay(300);
lcd.print("E");
delay(300);
lcd.print("C");
delay(300);
lcd.print("T");
delay(300);
lcd.print("O");
delay(300);
lcd.print("R");
delay(1000);
lcd.setCursor(2,2); lcd.print("PRO_STO Service");
delay(3000);
lcd.clear ();

 InitTimersSafe(); 
 bool success = SetPinFrequencySafe(led, frequency); 


delay(500); 
    }   


void loop() {
//lcd.clear ();
if (flag==0){//флаг выборов режима настройки Частоты вращения ДВс
            if(digitalRead(levo)==LOW){
              full=0;
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              delay(7);//защита от дребезга 
            }
            if(digitalRead(pravo)==LOW){
              full=0;
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              delay(7);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима времени впрыска
            if(digitalRead(levo)==LOW){
              full=0;
              t=t-0.1;
              delay(10);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
             full=0;
             t=t+0.1;
             delay(10);//защита от дребезга 
            }  
}
if (flag==5){//флаг выбора включения насоса
            if(digitalRead(levo)==LOW) {
             nfl=0;
             lcd.clear ();
             lcd.setCursor(2,2);
             lcd.print("OFF << Nasos");
            delay(1000);
            hag=0;
            }
            if(digitalRead(pravo)==LOW) {
              nfl=1;
              uzfl=0;
              testtime=60;
              lcd.clear ();
              lcd.setCursor(5,2);
              lcd.print("Nasos >> ON");
            delay(1000);
            hag=0;
            }
            }
             
if (flag==4) {lcd.setCursor(13,1); // меню старт
    int sec; sec= testtime - ((time - timer)/1000);
    if (timerenabled){  lcd.print(sec);lcd.print("   ");}
  else {lcd.print ("00"); digitalWrite(pump, LOW); digitalWrite(uz, LOW);
  }
  
if (!timerenabled){ 
if(digitalRead(pravo)==LOW){
  if (!pwm){ pwmWrite(led, 255-PWM);
  }
  else {
    if (nfl==1) {digitalWrite(pump, HIGH); 
    digitalWrite(uz, LOW);
    }
    if (uzfl==1) {digitalWrite(uz, HIGH); 
    digitalWrite(pump, LOW);
    }
    delay(3000);
    pwmWrite(led, PWM);
  }
  timer=time; 
  timerenabled=true;}
  
  delay(3);//защита от дребезга 
            }
if(digitalRead(levo)==LOW) {
  digitalWrite(pump, LOW);
  digitalWrite(uz, LOW);
  if (!pwm){pwmWrite(led, 255);}
  else {pwmWrite(led, 0);}
  timerenabled=false;}
}


            
if (flag==3) {if (!timerenabled){  // время теста
             if(digitalRead(levo)==LOW){
              testtime=testtime-5;
              if(testtime<0){testtime=0;} 
              delay(10);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
             testtime=testtime+5;
             delay(10);//защита от дребезга 
            }  }   }

if (flag==2){if ((digitalRead(levo)==LOW)||(digitalRead(pravo)==LOW)) full=!full;
delay (60);}
if (!full){PWM=frequency*t*0.255;}
else PWM=255; 
if(PWM<0){PWM=0;} 
if(PWM>255){PWM=255;} 

time = millis();
  if (timerenabled) {
    if ((time-timer)>(testtime*1000)) {
      if (!pwm){pwmWrite(led, 255);
      }
    else {pwmWrite(led, 0);}
      timerenabled=false;}
                    }

if (flag==6){//флаг включения ультразвука
            if(digitalRead(levo)==LOW) {
             uzfl=0;
             lcd.clear ();
             lcd.setCursor(2,2);
             lcd.print("OFF << Ultrasonic");
            delay(1000);
            hag=0;
            }
            if(digitalRead(pravo)==LOW) {
              uzfl=1;
              nfl=0;
              testtime=360;
              lcd.clear ();
              lcd.setCursor(2,2);
              lcd.print("Ultrasonic >> ON");
            delay(1000);
            hag=0;
            }
            }
                    
if (flag==7){//флаг слива
            if(digitalRead(levo)==LOW) {
             digitalWrite(sliv, LOW);
             lcd.clear ();
             lcd.setCursor(2,2);
             lcd.print("OFF << SLIV");
            delay(1000);
            lcd.clear ();
            hag=0;
            }
            if(digitalRead(pravo)==LOW) {
              lcd.clear ();
              digitalWrite(pump, LOW);
              digitalWrite(sliv, HIGH);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> ON");
              delay(1000);
              lcd.clear();
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 8");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 7");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 6");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 5");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 4");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 3");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 2");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 1");
              delay(1000);
              lcd.clear();
              digitalWrite(sliv, LOW);
            delay(100);
            nfl=0;
            hag=0;
            }
            }

    
if(digitalRead(ok)==LOW){//переключение менюшек
  delay(20);//защита от дребезга
  hag++;
  if(hag>=8){hag=0;}
} 
////////////

lcd.setCursor(0,0);
if (!full){
lcd.print("inj=");
lcd.print(t);
lcd.print("msec ");
lcd.setCursor(0,1);
lcd.print("N=");
long frequencyX=frequency*120;
lcd.print(frequencyX); 
if (frequencyX>9999) lcd.print(" RPM  ");
else lcd.print(" RPM   "); }
else {lcd.print ("FULL mode    "); lcd.setCursor(0,1); lcd.print ("OPEN         ");}


lcd.setCursor(13,0);
lcd.print(testtime); lcd.print("sec  ");

  lcd.setCursor(0,3);

   lcd.print("<< ");    
      if(hag==0){//выбор множителя частоты
        
        lcd.print("N/min"); 
        lcd.print(" >>         "); 
          mnog=1;
          flag=0;
      }
         
      if(hag==1){//выбор  время впрыска
          lcd.print("millisec");
          lcd.print(" >>      "); 
          flag=1;
         }
         
      if(hag==2){//выбор режима постоянного открытия инжектора 
        lcd.print("Full On/Off");
        lcd.print(" >>   "); 
        flag=2;
        }

         
       if(hag==3){//выбор время теста
          lcd.print("TIME TEST");
           lcd.print(" >>   "); 
          
          flag=3;
      } 
       if(hag==4){// меню старт
         lcd.print("STOP     START");
         lcd.print(" >>"); 
          flag=4;
       }

       if(hag==5){//включение насоса
        
        lcd.print("NASOS"); 
        lcd.print(" >>         "); 
          flag=5;
      }
      
      if(hag==6){//включение насоса
        
        lcd.print("Ultrasonic"); 
        lcd.print(" >>         "); 
          flag=6;
      }

      if(hag==7){//включение насоса
        
        lcd.print("SLIV"); 
        lcd.print(" >>         "); 
          flag=7;
      }
delay(100);  
lcd.display();
}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Для начала нужно все сделать без таких делеев (1000)

misha 173
Offline
Зарегистрирован: 17.05.2017

всем  привет! помргите пожалуйста переделать данный скетч под дисплей 1602 ! хотябы где испровлять!  ковыряю уже 5й день сил больше нет (((

MaksVV
Offline
Зарегистрирован: 06.08.2015

все места, где есть lcd.тратата. а вообще на 1602 не влазит всё. Что то убирать придётся или по очереди инфу выводить

 

evgen89
Offline
Зарегистрирован: 07.04.2017

MaksVV ваш скетч из сообшения №8

то то не вяжется со скетчем у меня

C:\Users\Evgen\Desktop\lcd_i2c\lcd_i2c.ino:4:31: fatal error: LiquidCrystal_I2C.h: No such file or directory
 
 #include <LiquidCrystal_I2C.h>
 
                               ^
 
compilation terminated.
 
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno
evgen89
Offline
Зарегистрирован: 07.04.2017

Что то с библиотекой видимо не пойму что уже загружал ругалось что использую две библиотеки

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Библиотека LiquidCrystal_I2C не установлена.

Она должна быть в одном экземляре и находиться тут: Мои документы\Arduino\libraries\

evgen89
Offline
Зарегистрирован: 07.04.2017

Блин мужики подскажите пожалуйста (я маленько дубовый в этом)

Как правильно удалить и загрузить нужную библиотеку 

Уже наверное удалить всю программу и заново 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

В новых версиях Arduino IDE можно сделать так:

1) "Скетч" - "Подключить библиотеку" - "Управлять библиотеками"

2) В появившемся окошке (Менеджер библиотек) справа вверху в строке "Отфильтровать результаты поиска" набрать LiquidCrystal_I2C

3) В отсортированном списке найти строчку LiquidCrystal I2C by Frank de Brabander

3) Нажать на эту строку, а затем на появившуюся справа кнопку "Установка"

evgen89
Offline
Зарегистрирован: 07.04.2017

Вроде с библиотеками получилось теперь вот это

Arduino: 1.8.1 (Windows 10), Плата:"Arduino/Genuino Uno"
 
C:\Users\Evgen\Documents\Arduino\sketch_jun07a\sketch_jun07a.ino:6:17: fatal error: PWM.h: No such file or directory
 
 #include <PWM.h>
 
                 ^
 
compilation terminated.
 
exit status 1
Ошибка компиляции для платы Arduino/Genuino Uno.
Я так понимаю не хватает некой библиотеки PWM т.е некого ЩИМ регулятора
Где скачать библиотеку PWM.h или можно любую и периименовать её в такое название
evgen89
Offline
Зарегистрирован: 07.04.2017

Вроде разобрался с библиотеками теперь такая беда

sketch_jun08a:15: error: invalid digit "8" in octal constant
 
 008
 
 ^
 
sketch_jun08a:17: error: invalid digit "9" in octal constant
 
 009
 
 ^
 
sketch_jun08a:35: error: invalid digit "8" in octal constant
 
 018
 
MaksVV
Offline
Зарегистрирован: 06.08.2015

а ты как скетч от сюда копируешь?

evgen89
Offline
Зарегистрирован: 07.04.2017

Блин ну правой кнопкой мыши копировать

Я походу совсем что то не то делаю 

MaksVV поделитесь ссылкой на нормальную библиотеку PWM

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Скетч нужно копировать без нумерации строк. Наводишь курсор на код, справа вверху кода появляется небольшая панелька с четырьмя кнопками. Вторая слева кнопка копировать. Жмёшь её левой кнопкой мыши. Код скопируется в буфер обмена. Потом встявляешь в IDE как обычно.

evgen89
Offline
Зарегистрирован: 07.04.2017

Поздравляю Шарик вы балбес 

Это про меня в данном случае

Теперь вот это выкидывает Arduino: 1.8.1 (Windows 10), Плата:"Arduino/Genuino Uno"

 
C:\Users\Evgen\Documents\Arduino\sketch_jun08a\sketch_jun08a.ino: In function 'void setup()':
 
sketch_jun08a:44: error: no matching function for call to 'LiquidCrystal_I2C::begin()'
 
 lcd.begin();
 
 
 
evgen89
Offline
Зарегистрирован: 07.04.2017

Вроде нашлась подходящая бибоиотека но как то всё не то на дисплее

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

Нашёл если вдруг у кого качаем отсюда https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library

bester
Offline
Зарегистрирован: 25.06.2016

Сколько дюймов ваш дисплей OLED, не входит все на мой экран.

evgen89
Offline
Зарегистрирован: 07.04.2017

Это к кому вопрос а то тут дисплеев уже много

Вчера потестил пока на светодиоде всё нравится, может на днях до рабочего макета доберусь пока на 555 таймере их гоняю

Вот ещё бы добавить режим плавающей частоты 

Всем спасибо за скетч и за подсказки :)

bester
Offline
Зарегистрирован: 25.06.2016

Вопрос к MaksVV, у меня такой дисплей  https://ru.aliexpress.com/item/Free-Shipping-White-Blue-White-and-Blue-color-0-96-inch-128X64-OLED-Display-Module-For/32717004437.html?spm=2114.13010608.0.0.seue5A , но на него не влазит вся информация почему то. Библиотеки скачивал с разных источников

evgen89
Offline
Зарегистрирован: 07.04.2017

Я их два дня перебирал

solonovich
Offline
Зарегистрирован: 11.08.2015

Скиньте схему вашего устройства, интересно посмотреть, что за зверя вы делаете :)

MaksVV
Offline
Зарегистрирован: 06.08.2015

bester, попробуйте другие скетчи, например пультоскопа. если всё будет также, косяк с библиотекой скорее всего. Все библы удаляем, ставим по новой или пробуем на другом компе. 

bester
Offline
Зарегистрирован: 25.06.2016

винду переставлял, IDE ставил заново, библы ставил, пультоскоп есть, но работает на нокиевском дисплее, не могли бы вы переделать скетч своего проекта под дисплей от нокии? 5110

sir_kimas
Offline
Зарегистрирован: 01.08.2016

Господа. Подскажите пожалуйста, где скачать библиотеку "PWM.h" ?

sir_kimas
Offline
Зарегистрирован: 01.08.2016

Господа. Поделитесь пожалуйста библиотекой "PWM.h"

MaksVV
Offline
Зарегистрирован: 06.08.2015

если внимательно читать то библиотеки можно найти от пультоскопа

http://srukami.inf.ua/rar/PULTOSCOPE_LCD5110_final2_DDS_Z.rar

sir_kimas
Offline
Зарегистрирован: 01.08.2016

MaksVV пишет:

если внимательно читать то библиотеки можно найти от пультоскопа

http://srukami.inf.ua/rar/PULTOSCOPE_LCD5110_final2_DDS_Z.rar

Огромное спасибо. Читал не внимательно!

somamur
Offline
Зарегистрирован: 23.09.2017

Просьба к MaksVV откликнуться Есть интересное коммерческое прдложение по теме Писать на somamur@rambler.ru C уважением Сергей

Heathen
Offline
Зарегистрирован: 23.10.2015

Ребят подскажите дубовому мне, никак не разберусь. В какое место кода вставить такую вот конструкцию? Режим форсаж, во время теста циклично плавно должна нарастать и уменьшаться частота форсунок, допустим от 840 до 6000 оборотов. Куда не вставляю в код, просто не работает. 


    if(forsage==1 && frequency<=7){
              full=0;
              frequency=frequency++;
              bool success = SetPinFrequencySafe(led, frequency);
    }

    if(forsage==1 && frequency>=20){
              full=0;
              frequency=frequency--;
              bool success = SetPinFrequencySafe(led, frequency);
    }

 

sir_kimas
Offline
Зарегистрирован: 01.08.2016

Heathen пишет:

Ребят подскажите дубовому мне, никак не разберусь. В какое место кода вставить такую вот конструкцию? Режим форсаж, во время теста циклично плавно должна нарастать и уменьшаться частота форсунок, допустим от 840 до 6000 оборотов. Куда не вставляю в код, просто не работает. 


    if(forsage==1 && frequency<=7){
              full=0;
              frequency=frequency++;
              bool success = SetPinFrequencySafe(led, frequency);
    }

    if(forsage==1 && frequency>=20){
              full=0;
              frequency=frequency--;
              bool success = SetPinFrequencySafe(led, frequency);
    }

 

Разобрался?

bdm
Offline
Зарегистрирован: 06.12.2017

Как то так, если числа с запятой, то frequency объявить как float

if (timerenabled) {
	sec= testtime - ((time1 - timer)/1000);
	virtuino.vDigitalMemoryWrite(12,sec );

	if (fflag==0) {
		frequency += 0.05;
		bool success = SetPinFrequencySafe(led, frequency);
		
		if (frequency>=50){
			fflag==1;
		}
	}
	if (fflag==1) {	
		frequency -= 0.05;
		bool success = SetPinFrequencySafe(led, frequency);
		
		if (frequency>=7){
			fflag==0;
		}
	}

 

Heathen
Offline
Зарегистрирован: 23.10.2015

bdm пишет:

Как то так, если числа с запятой, то frequency объявить как float

if (timerenabled) {
	sec= testtime - ((time1 - timer)/1000);
	virtuino.vDigitalMemoryWrite(12,sec );

	if (fflag==0) {
		frequency += 0.05;
		bool success = SetPinFrequencySafe(led, frequency);
		
		if (frequency>=50){
			fflag==1;
		}
	}
	if (fflag==1) {	
		frequency -= 0.05;
		bool success = SetPinFrequencySafe(led, frequency);
		
		if (frequency>=7){
			fflag==0;
		}
	}

 

Объясните пожалуйста что за строка virtuino.vDigitalMemoryWrite(12,sec );

Virtuino это какая-то библиотека?

Я вставил в свою модификацию кода вот так, но IDE написала что virtuino не задекларирован

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <PWM.h>
#define led  9   //пин для генератора сигналов (не менять)

#define levo 10  //кнопка ЛЕВО(можно любой пин)
#define ok 11    //кнопка ОК(можно любой пин)
#define pravo 12 //кнопка ПРАВО(можно любой пин)


LiquidCrystal_I2C lcd(0x27, 20, 4);
         

int PWM = 128;//стартовое значение ШИМ от 0 до 255
int pump = 8; //пин включения насоса 8 
int sliv = 6; //пин слива 6
int uz = 7; //пин включения ультразвука        
int32_t frequency = 7; //стартовое значение частоты в Гц
                       //(соответсвует 840 об/мин)
int fflag = 0;                      

//###########################################################

byte nfl=0; //флаг насоса
byte forsage=0;
byte uzfl=0; //флаг ультразвука
byte hag=4;
int mnog=0;
int flag=0;

bool pwm = 1;   // ЗДЕСЬ НУЖНО ВЫБРАТЬ ЛОГИКУ ВЫХОДА ШИМ - ПРЯМАЯ ИЛИ ОБРАТНАЯ,
//В ЗАВИСИМОСТИ ОТ ТОГО, КАКАЯ ЛОГИКА ВЫХОДНОГО МОСФЕТА И ПОДКЛЮЧЕНИЯ К ФОРСУНКАМ (рулим плюсом или минусом?)
//  0 - ОБРАТНЫЙ ШИМ,   1 - ПРЯМОЙ ШИМ
// ОБРАТНЫЙ ШИМ - 100% шим со скетча соответсвует 0% шим на выходе ардуино (форсунка постоянно открыта) - управление осущесвляется минусом форсунки.
// ПРЯМОЙ ШИМ - 100% шим со скетча соответствует 100% шим на выходе ардуино (форсунка постоянно открыта) - управление осущесвляется плюсом форсунки. 
float t = 4.50;              //время впрыска, мсек
long testtime = 60;          //время теста, сек
bool full = 0;               // флаг режима полное открытие форсунок
unsigned long time, timer=0; // для таймера отсчета времени теста
bool timerenabled=false;     // для таймера отсчета времени теста



void setup()
{
pinMode (levo, INPUT); digitalWrite (levo, HIGH);
pinMode (pravo, INPUT); digitalWrite (pravo, HIGH);
pinMode (ok, INPUT); digitalWrite (ok, HIGH);
pinMode(pump, OUTPUT); 
pinMode(uz, OUTPUT);
pinMode(sliv, OUTPUT);

lcd.begin();
lcd.backlight();
lcd.setCursor(3,1); lcd.print("T");
delay(300);
lcd.print("E");
delay(300);
lcd.print("S");
delay(300);
lcd.print("T");
delay(300);
lcd.print(" ");
lcd.print("I");
delay(300);
lcd.print("N");
delay(300);
lcd.print("J");
delay(300);
lcd.print("E");
delay(300);
lcd.print("C");
delay(300);
lcd.print("T");
delay(300);
lcd.print("O");
delay(300);
lcd.print("R");
delay(1000);
lcd.setCursor(2,2); lcd.print("PRO_STO Service");
delay(3000);
lcd.clear ();

 InitTimersSafe(); 
 bool success = SetPinFrequencySafe(led, frequency); 


delay(500); 
    }   


void loop() {
    
//lcd.clear ();



if (flag==0){//флаг выборов режима настройки Частоты вращения ДВс
            if(digitalRead(levo)==LOW){
              full=0;
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              delay(7);//защита от дребезга 
            }
            if(digitalRead(pravo)==LOW){
              full=0;
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              delay(7);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима времени впрыска
            if(digitalRead(levo)==LOW){
              full=0;
              t=t-0.1;
              delay(10);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
             full=0;
             t=t+0.1;
             delay(10);//защита от дребезга 
            }  
}
if (flag==5){//флаг выбора включения насоса
            if(digitalRead(levo)==LOW) {
             nfl=0;
             lcd.clear ();
             lcd.setCursor(2,2);
             lcd.print("OFF << Nasos");
            hag=0;
            }
            if(digitalRead(pravo)==LOW) {
              nfl=1;
              uzfl=0;
              testtime=60;
              lcd.clear ();
              lcd.setCursor(5,2);
              lcd.print("Nasos >> ON");
            hag=0;
            }
            }
             
if (flag==4) {  lcd.setCursor(13,1); // меню старт
    int sec; sec= testtime - ((time - timer)/1000);
    if (timerenabled){  lcd.print(sec); lcd.print("   ");

    if (forsage == 1)
    { virtuino.vDigitalMemoryWrite(12,sec );

  if (fflag==0) {
    frequency += 1;
    bool success = SetPinFrequencySafe(led, frequency);
    
    if (frequency>=50){
      fflag==1;
    }
  }
  if (fflag==1) { 
    frequency -= 1;
    bool success = SetPinFrequencySafe(led, frequency);
    
    if (frequency>=7){
      fflag==0;
    }
    
       }
}
  else {lcd.print ("00");  digitalWrite(pump, LOW); digitalWrite(uz, LOW);
  }
  
if (!timerenabled){ 
if(digitalRead(pravo)==LOW){
  if (!pwm){ pwmWrite(led, 255-PWM);
  }
  
    if (nfl==1) {digitalWrite(pump, HIGH); 
    digitalWrite(uz, LOW);
    }
    if (uzfl==1) {digitalWrite(uz, HIGH); 
    digitalWrite(pump, LOW);
   }
  
    delay(3000);
    
    pwmWrite(led, PWM);

  timer=time; 
  timerenabled=true;
}
  delay(3);//защита от дребезга 
            }
if (digitalRead(levo)==LOW) {
  digitalWrite(pump, LOW);
  digitalWrite(uz, LOW);
  if (!pwm){pwmWrite(led, 255);}
  else {pwmWrite(led, 0);}
  timerenabled=false;}
}



            
if (flag==3) {if (!timerenabled){  // время теста
             if(digitalRead(levo)==LOW){
              testtime=testtime-5;
              if(testtime<0){testtime=0;} 
              delay(10);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
             testtime=testtime+5;
             delay(10);//защита от дребезга 
            }  }   }

if (flag==2){if ((digitalRead(levo)==LOW)||(digitalRead(pravo)==LOW)) full=!full;
delay (60);}
if (!full){PWM=frequency*t*0.255;}
else PWM=255; 
if(PWM<0){PWM=0;} 
if(PWM>255){PWM=255;} 

time = millis();
  if (timerenabled) {
    if ((time-timer)>(testtime*1000)) {
      if (!pwm){pwmWrite(led, 255);
      }
    else {pwmWrite(led, 0);}
      timerenabled=false;}
                    }

if (flag==6){//флаг включения ультразвука
            if(digitalRead(levo)==LOW) {
             uzfl=0;
             lcd.clear ();
             lcd.setCursor(2,2);
             lcd.print("OFF << Ultrasonic");
            hag=0;
            }
            if(digitalRead(pravo)==LOW) {
              uzfl=1;
              nfl=0;
              testtime=360;
              lcd.clear ();
              lcd.setCursor(2,2);
              lcd.print("Ultrasonic >> ON");
            hag=0;
            }
            }
            
if(hag==8){//forsage
         if(digitalRead(levo)==LOW) {
             uzfl=0;
             lcd.clear ();
             lcd.setCursor(2,2);
             lcd.print("OFF << FORSAGE");
            hag=0;
            }
            if(digitalRead(pravo)==LOW) {
              nfl=1;
              forsage=1;
              testtime=120;
              lcd.clear ();
              lcd.setCursor(2,2);
              lcd.print("FORSAGE >> ON");
            hag=0;
      }
}           
if (flag==7){//флаг слива
            if(digitalRead(levo)==LOW) {
             digitalWrite(sliv, LOW);
             lcd.clear ();
             lcd.setCursor(2,2);
             lcd.print("OFF << SLIV");
            delay(1000);
            lcd.clear ();
            hag=0;
            }
            if(digitalRead(pravo)==LOW) {
              lcd.clear ();
              lcd.setCursor(4,2);
              lcd.print("SLIV >> ON");
              digitalWrite(pump, LOW);
              digitalWrite(sliv, HIGH);
         if (nfl==1) {
              delay(1000);
              pwmWrite(led, 255);
              delay(4000);
              pwmWrite(led, 0);
              }
              delay(1000);
              lcd.clear();
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 15");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 14");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 13");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 12");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 11");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 10");
              delay(1000);
              lcd.clear();
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 9");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 8");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 7");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 6");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 5");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 4");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 3");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 2");
              delay(1000);
              lcd.setCursor(4,2);
              lcd.print("SLIV >> 1");
              delay(1000);
              lcd.clear();
              digitalWrite(sliv, LOW);
            delay(100);
            nfl=0;
            hag=0;
            }
            }

    
if(digitalRead(ok)==LOW){//переключение менюшек
  delay(20);//защита от дребезга
  hag++;
  if(hag>=9){hag=0;}
} 
////////////

lcd.setCursor(0,0);
if (!full){
lcd.print("inj=");
lcd.print(t);
lcd.print("msec ");
lcd.setCursor(0,1);
lcd.print("N=");
long frequencyX=frequency*120;
lcd.print(frequencyX); 
if (frequencyX>9999) lcd.print(" RPM  ");
else lcd.print(" RPM   "); }
else {lcd.print ("FULL mode    "); lcd.setCursor(0,1); lcd.print ("OPEN         ");}


lcd.setCursor(13,0);
lcd.print(testtime); lcd.print("sec  ");

  lcd.setCursor(0,3);

   lcd.print("<< ");    
      if(hag==0){//выбор множителя частоты
        
        lcd.print("N/min"); 
        lcd.print(" >>         "); 
          mnog=1;
          flag=0;
      }
         
      if(hag==1){//выбор  время впрыска
          lcd.print("millisec");
          lcd.print(" >>      "); 
          flag=1;
         }
         
      if(hag==2){//выбор режима постоянного открытия инжектора 
        lcd.print("Full On/Off");
        lcd.print(" >>   "); 
        flag=2;
        }

         
       if(hag==3){//выбор время теста
          lcd.print("TIME TEST");
           lcd.print(" >>   "); 
          
          flag=3;
      } 
       if(hag==4){// меню старт
         lcd.print("STOP     START");
         lcd.print(" >>"); 
          flag=4;
       }

       if(hag==5){//включение насоса
        
        lcd.print("NASOS"); 
        lcd.print(" >>         "); 
          flag=5;
      }
      
      if(hag==6){//включение насоса
        
        lcd.print("Ultrasonic"); 
        lcd.print(" >>         "); 
          flag=6;
      }

      if(hag==7){//включение насоса
        
        lcd.print("SLIV"); 
        lcd.print(" >>         "); 
          flag=7;
      }

      if(hag==8){//Forsage
        
        lcd.print("FORSAGE"); 
        lcd.print(" >>         "); 
          flag=8;
      }
delay(100);  
lcd.display();
}