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

bdm
Offline
Зарегистрирован: 06.12.2017
virtuino.vDigitalMemoryWrite(12,sec );

Это у меня вместо дисплея вывод на экран телефона

Тут еще надо по идее сохранять при запуске таймера, а потом восстанавливать значение frequency при запуске forsage

if (forsage==1){forsagememory=frequency;frequency=7;}

Восстановить перед timerenabled=false

if (forsage==1){frequency=forsagememory;}

Сам код

#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)
			{ 
				if (fflag==0) {
					frequency += 1;
					
					if (frequency>=50){
						fflag==1;
					}
				}
				if (fflag==1) { 
					frequency -= 1;
					
					if (frequency>=7){
						fflag==0;
					} 
				}
				bool success = SetPinFrequencySafe(led, frequency); 
			}

			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();
	}

 

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

Господа подскажите. Как переделать скеч на аналоговые кнопки?

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

что такое аналоговые кнопки?

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

MaksVV пишет:

что такое аналоговые кнопки?

 

кнопки на аналоговом входе. например А0

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

вместо А0 пишите 14 и пользуйтесь на здоровье

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

MaksVV пишет:

вместо А0 пишите 14 и пользуйтесь на здоровье

 

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

как?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

MaksVV пишет:

вместо А0 пишите 14 и пользуйтесь на здоровье

Лучше пишите как есть: А0
Потому что  это 14 только для Уноподобных плат.
Для Мега  всё совсем не так......

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

sir_kimas пишет:

MaksVV пишет:

что такое аналоговые кнопки?

кнопки на аналоговом входе. например А0

  
Нет.
Кнопки на аналоговом входе всё равно цифровые.
Аналоговые кнопки - это когда на одном аналоговом входе их несколько.

Читайте классика:

http://alxarduino.blogspot.ru/2013/09/ReadAnalogKeys.html

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

что все пины заняты? нафига этот гемор, с несколькими кнопками на один пин

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

MaksVV пишет:

что все пины заняты? нафига этот гемор, с несколькими кнопками на один пин

 

У меня просто шилд с кнопками готовый.

Cyxapb
Offline
Зарегистрирован: 30.12.2017

Подскажите, получаеться все форсунки вместе выполняют одно и то же? я видел промывку так там они поочереди включались.

И выход на форсунки, как я понял, это:

#define led  9   //пин для генератора сигналов (не менять)?

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

Всё верно поняли. все форсунки параллельно подключаются к мосфет модулю. Мосфет модуль управляется с пина 9 ардуино. А зачем поочереди нужно? Помоему наоборот лучше одновременно, чтобы сравнить факел распыла и т.д.

Cyxapb
Offline
Зарегистрирован: 30.12.2017

Получаеться что одновременно лучьше и быстрее, просто то была заводская установка, и мне интересно было=)

estee
Offline
Зарегистрирован: 29.01.2018

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

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

На этой картинке видно, что запущен тест, таймер идет, зеленый светодиод под мосфетом не светится:

На этой картинке тест завершен, диод светится, на 9м пине +5 вольт.

Мосфет подключил так же, как в рекомендуемом модуле с Али, просто валялся без дела полевик с n-каналом. Форсунку подключал, срабатывает параллельно со светодиодом, значит, мосфет работает правильно. Кстати, подобная ситуация и с мосфет модулем была - работает в инверсии с момента начала теста. Слева от мосфета - крен для питания ардуино и дисплея.

 

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

MaksVV пишет:

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

estee
Offline
Зарегистрирован: 29.01.2018

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

#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;

bool pwm = 1;

float t = 3.00;              //время впрыска, мсек
long testtime = 20;          //время теста, сек
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){
              full=0;
              frequency=frequency-mnog;
              if(frequency<0){frequency=0;}
              bool success = SetPinFrequencySafe(led, frequency);
              delay(100);//защита от дребезга 
            }
            if(digitalRead(pravo)==LOW){
              full=0;
              frequency=frequency+mnog;
              bool success = SetPinFrequencySafe(led, frequency);
              delay(100);//защита от дребезга 
            }  
}
if (flag==1){//флаг выборов режима времени впрыска
            if(digitalRead(levo)==LOW){
              full=0;
              t=t-0.1;
              delay(100);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
              full=0;
              t=t+0.1;
              delay(100);//защита от дребезга 
            }  
}
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){
  if (!pwm){ pwmWrite(led, 255-PWM);}
  else {pwmWrite(led, PWM);}
  timer=time; 
  timerenabled=true;}
  
  delay(100);//защита от дребезга 
            }
            
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(100);//защита от дребезга
            }
            if(digitalRead(pravo)==LOW){
             testtime=testtime+5;
             delay(100);//защита от дребезга 
            }  }   }

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)) {
      if (!pwm){pwmWrite(led, 255);}
      else {pwmWrite(led, 0);}
      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("TEST TIME");
          flag=3;
      } 
       if(hag==4){// меню старт
          display.print("START");
          flag=4;
       }
       
       
display.print(" >>"); 
       

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

 

almazik
Offline
Зарегистрирован: 06.01.2018

Здравствуйте, возможно ли на этом  скетче сделать регулировку скважноссти?

 

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

изменение времени впрыска это и есть регулировка скважности.