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

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

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

esolate
Offline
Зарегистрирован: 09.07.2018

Всех приветствую. Я пока в этом только основы постигаю еще, поэтому и решил за помощью обратиться. Можно ли на основе данной схемы сделать так чтобы длина импульса открытия форсунки была 22мс(если можно с возможностью корректировки хотя бы в небольшом диапазоне), а количество циклов ее открытия в минуту регулировалось от 1 до 500 ? Читал что можно через millis задать время открытия и время паузы, подскажите если не трудно, хотя может ересь написал и там форма ипульса не прямоугольная будет. Само устройство простое - конструктивно это тот же стенд, но только с одной форсункой (12 Ом) которая работает как дозатор. Я человек технически грамотный и схватываю быстро, но в ардуино пока полный валенок, так что заранее извините за глупые вопросы )  

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

немного доработал код (LCD 20x4).

- убрал delay (), оптимизировал меню; 

- теперь опрос кнопок более надёжный, точнее титановый  - по велу Клапы; 

- добавил разновидность сопротивлений форсунок (высокого и низкого сопротивления), чтобы не убить форсунки в случае, если они низкоомные. В режиме полного открытия теперь постоянный импульс осуществляется только 2мс - для подъёма иглы клапана форсунки, далее удерживающий ШИМ 4кГц;

- добавил пищалку buzzer, при нажатии кнопок, чтобы сразу понятно было нажал или нет. 

- поправил коменты в скетче; 

Сигналы на выходе особо не проверял, ослика пока нет. Проверьте кто нить.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <PWM.h>
#define outPWM  9   //пин для генератора сигналов (не менять) - это выход на Мосфет управления форсунками. 

#define buzzer         3    // пин пищалки
#define pressBut       650  // частота тона нажатия клавиш
#define time_presstone 90   // длительность тона нажатия клавиш

#include <Button.h> // библиотека для создания различных видов нажитий на кнопки плюс защита от дребезга, спасибо КЛАПАУЦИЮ!. 
Button test;    

LiquidCrystal_I2C lcd(0x27, 20, 4); // адрес LCD на шине i2c и  строчность LCD 
         


byte PWM = 128;         //стартовое значение ШИМ (от 0 до 255)

byte frequency = 7; //стартовое значение частоты в Гц
                    //(соответсвует 840 об/мин)

byte Menu=4;    // номера меню, по умолчанию меню "старт теста"

bool pwm = 1;   // ЗДЕСЬ НУЖНО ВЫБРАТЬ ЛОГИКУ ВЫХОДА ШИМ - ПРЯМАЯ ИЛИ ОБРАТНАЯ,
//В ЗАВИСИМОСТИ ОТ ТОГО, КАКАЯ ЛОГИКА НА ВХОДЕ МОСФЕТА. РУЛИМ ПРИ ЭТОМ "МИНУСОМ" ФОРСУНКИ!!! Т.Е. ОДИН ВЫВОД ФОРСУНКИ +12В, ВТОРОЙ - К ВЫХОДУ МОСФЕТА. 
//  0 - ОБРАТНЫЙ ШИМ,   1 - ПРЯМОЙ ШИМ
// ОБРАТНЫЙ ШИМ - 100% ШИМ СООТВЕТСТВУЕТ ПОЛНОМУ СИГНАЛУ "GND" НА ВЫХОДЕ МОСФЕТА
// ПРЯМОЙ ШИМ -   100% ШИМ СООСТВЕТСВУЕТ ПОЛНОМУ СИГНАЛУ "12В" НА ВЫХОДЕ МОСФЕТА 

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

bool timerenabledOPENvalve = 0; // для таймера отсчета времени на открытие иглы форсунки
uint32_t  timerValve = 0;       // для таймера отсчета времени на открытие иглы форсунки
uint32_t prev = 0;              // для таймера периодического вывода инфы на экран

// ниже кнопки, замыкают GND, подтяжка к питанию включена в библе кнопок
#define LEVOpin  10 //пин кнопки ЛЕВО (можно любой пин)
#define MENUpin  11 //пин кнопки МЕНЮ (можно любой пин)
#define PRAVOpin 12 //пин кнопки ПРАВО(можно любой пин)

#define LEVO 0      // порядковые номера кнопок (для работы библиотеки кнопок)
#define MENU 1      // порядковые номера кнопок (для работы библиотеки кнопок)
#define PRAVO 2     // порядковые номера кнопок (для работы библиотеки кнопок)

bool longpressLEVO = 0;   // флаг длительного удержания кнопки
bool longpressPRAVO = 0;  // флаг длительного удержания кнопки
bool longpressMENU = 0;   // флаг длительного удержания кнопки

bool menu = 0;       // флаг вывелось или нет на экран новое меню 

bool Impedance = 1;  // сопротивление обмотки форсунки true - больше 10 Ом, false - менее 5 Ом

void setup()
{
//ниже настройка пина пищалки
pinMode (buzzer, OUTPUT); digitalWrite (buzzer, LOW);  

//ниже настройка библиотеки работы кнопок
test.NO(); // N.O. Normal Open
test.pullUp();
test.duration_bounce       (  50);
unsigned long duration_check = 200;
test.duration_click_Db     (duration_check);
test.duration_inactivity_Up(duration_check);
test.duration_inactivity_Dn(600);
test.duration_press        (500);
test.button(LEVOpin, MENUpin, PRAVOpin); // arduino pins connected to button

//ниже настройка LCD
lcd.begin();
lcd.backlight();

//ниже настройка выхода PWM
 InitTimersSafe(); 
 SetPinFrequencySafe(outPWM, frequency); 

if (!pwm){ pwmWrite(outPWM, 255);}
else {pwmWrite(outPWM, 0);}

//ниже мелодия при включении
tone(buzzer,659,150);
delay(150);
tone(buzzer,659,300);
delay(300);
tone(buzzer,659,150);
delay(300);
tone(buzzer,523,150);
delay(150);
tone(buzzer,659,300);
delay(300);
tone(buzzer,784,600);
    }   


void loop() {

test.read();   // обновление состояния кнопок

// ниже опрос длительных нажатий на кнопки
if (test.event_inactivity_Dn(LEVO) ==1)   longpressLEVO = 1;
if (test.event_click_Up (LEVO) == 1)      longpressLEVO = 0;
if (test.event_inactivity_Dn(PRAVO) ==1)  longpressPRAVO =1;
if (test.event_click_Up (PRAVO) == 1)     longpressPRAVO =0;

if (Menu==0){//меню выбора Частоты вращения ДВС
             
             if (!menu){lcd.setCursor(3,3);
             lcd.print("N/min"); 
             lcd.print(" >>         "); menu=1;}
             
             if (test.event_click_Dn  (LEVO) == 1 || (longpressLEVO && !Delay)) {
              
              full=0;
              frequency--;
              if(frequency<1){frequency=1;}
              if (longpressLEVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();
            }
            if (test.event_click_Dn  (PRAVO) == 1 || (longpressPRAVO && !Delay)) {
           
              full=0;
              frequency++; if (frequency>83) frequency=83;
              if (longpressPRAVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();
            }  
}
if (Menu==1){//меню выбора длины импульса (времени) впрыска
            
            if (!menu){lcd.setCursor(3,3);
            lcd.print("millisec");
            lcd.print(" >>      "); menu=1;}
          
            if (test.event_click_Dn  (LEVO) == 1 || (longpressLEVO && !Delay)) {
              full=0;
              t-=0.1;
              if (t<1.00) t=1.00;
              if (longpressLEVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();
                                                                      }
            
            
            if (test.event_click_Dn  (PRAVO) == 1 || (longpressPRAVO && !Delay)) {
              full=0;
              t+=0.1;
              if (t>11.00) t=11.00;
              if (longpressPRAVO) {Delay = 1; timerDelay = time;}   
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();     
                                                                        }
            
            }

if (Menu==2) {  // меню выбора/отмены режима постоянного открытия форсунок

if (!menu){lcd.setCursor(3,3);
lcd.print("Full On/Off");
lcd.print(" >>   "); menu=1;} 
  
  if(!timerenabled) if (test.event_click_Dn  (LEVO) == 1 ||  test.event_click_Dn  (PRAVO) == 1) 
  {full=!full; tone (buzzer, pressBut, time_presstone);}
  
             }

            
if (Menu==3) {  // меню выбора времени теста

if (!menu){lcd.setCursor(3,3);
lcd.print("TIME TEST");
lcd.print(" >>   "); menu=1;}

if( !timerenabled){
              if (test.event_click_Dn  (LEVO) == 1 || (longpressLEVO && !Delay)) {
              testtime-=5;
              if(testtime<0){testtime=0;} 
              if (longpressLEVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);                                                          }
              
              if (test.event_click_Dn  (PRAVO) == 1 || (longpressPRAVO && !Delay)) {
              testtime+=5;
              if(testtime>600){testtime=600;} 
              if (longpressPRAVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);                                                             }
            
            }          }  

if (Menu==4) { // меню старт

 if (!menu){lcd.setCursor(3,3);
 lcd.print("STOP     START");
 lcd.print(" >>");  menu=1;}

if (!timerenabled && test.event_click_Dn  (PRAVO) == 1){ 
  timer=time; 
  timerenabled=true; 
  tone (buzzer, 1500, 700);   
  PWMrefresh();
  
  }
  
  
            
if (test.event_click_Dn  (LEVO) == 1){
  if (!pwm){pwmWrite(outPWM, 255);}
  else {pwmWrite(outPWM, 0);}
  timerenabled=false;
  tone (buzzer, pressBut, time_presstone);  
  }
  

}

if (Menu==5) {// меню выбора сопротивления обмотки форсунки

if (!menu){lcd.setCursor(3,3);
lcd.print("IMPEDANCE");
lcd.print(" >>     "); menu=1;}

if (!timerenabled) {if (test.event_click_Dn  (LEVO) == 1 ||  test.event_click_Dn  (PRAVO) == 1) 
{Impedance=!Impedance; tone (buzzer, pressBut, time_presstone);  }} 
}




// ниже работа таймера времени теста

time = millis();

if (Delay && time - timerDelay>93 ) Delay = 0;

  if (timerenabled) {
if (timerenabledOPENvalve && time - timerValve > 2000) timerenabledOPENvalve = 0;
  
   if (timerenabledOPENvalve && full) 
    {
      if (Impedance){
       if (!pwm)pwmWrite(outPWM, 10);
       else     pwmWrite(outPWM, 245);    
                    }
      else {
        if (!pwm)pwmWrite(outPWM, 90);
        else     pwmWrite(outPWM, 165);    
           }
    }

        
    if ((time-timer)>(testtime*1000)) {
      if (!pwm){pwmWrite(outPWM, 255);}
      else {pwmWrite(outPWM, 0);}
      timerenabled=false;
      tone (buzzer, 1500, 1500); 
      
            }
                    }

    
if (test.event_click_Dn (MENU) == 1){ //переключение менюшек
  Menu++; menu = 0; tone (buzzer, pressBut, time_presstone);
  if(Menu>=6){Menu=0;}
} 


// ниже обновление информации на LCD

if (millis () - prev>100){
lcd.setCursor(14,1);
int sec; sec= testtime - ((time - timer)/1000);
    if (timerenabled){  lcd.print(sec);lcd.print("   ");}
  else lcd.print ("00 ");

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(4,2);
lcd.print("Imp: ");
if (Impedance) lcd.print (">10 Ohm ");
else lcd.print ("<5 Ohm  ");

}


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

  lcd.setCursor(0,3);

   lcd.print("<< ");    
      
      
lcd.display();
prev = millis();
}
}



// ниже фукнция включения выхода PWM

void PWMrefresh(){
  SetPinFrequencySafe(outPWM, frequency);
  if (!full)PWM=frequency*t*0.255;
    else PWM=255; 
    if(PWM<0)PWM=0;
    if(PWM>255)PWM=255;
  if (full) {timerenabledOPENvalve=1; timerValve = time; SetPinFrequencySafe(outPWM, 4000);}
  if (timerenabled){
  if (!pwm){ pwmWrite(outPWM, 255-PWM);}
  else {pwmWrite(outPWM, PWM);}
                   }
  }

видос

agromir
Offline
Зарегистрирован: 17.09.2018

Здравствуйте.  подскажите, а по какой схеме все подключается?

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

agromir
Offline
Зарегистрирован: 17.09.2018

MaksVV, спасибо.  А для ардуино уно нужно что-то переделывать или скетч  и библиотеки ваши подойдут.

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

для Uno всё тоже самое, что и для Nano. 

agromir
Offline
Зарегистрирован: 17.09.2018

шланги часто меняете на стенде, обычные топливные установлены?

agromir
Offline
Зарегистрирован: 17.09.2018

шланги часто меняете на стенде, обычные топливные установлены?

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

я ещё сам стенд то не собрал)) Но пересилил себя и уже начал потихоньку собирать. Планирую шланг такой снаружитряпичный использовать. 

agromir
Offline
Зарегистрирован: 17.09.2018

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

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

Semperit

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

я буду использовать специальную проверочную цветную жидкость. Думаю она не будет разъедать шланг. 

Rzhevskiy
Offline
Зарегистрирован: 22.09.2018

Добрый вечер. Хочу использовать Ваш код. Подскажите пожалуйста в чём проблема у меня.

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

Установите библиотеку для кнопок титановый вел от Клапауция

Rzhevskiy
Offline
Зарегистрирован: 22.09.2018

Вроде кнопки устанавливал. Может не те?. Если не трудно,поделитесь библиотекой нужной. Перепробовал штуки 4ре библиотеки- всё видать не то.

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

Спасибо.)))))

agromir
Offline
Зарегистрирован: 17.09.2018

MaksVV пишет:

я ещё сам стенд то не собрал)) Но пересилил себя и уже начал потихоньку собирать. Планирую шланг такой снаружитряпичный использовать. 

Здравствуйте. собрал стенд. хотелось бы узнать как реализована функция проверки высокоомных и низкоомных форсунок. что изменяется при переключении?

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

Давно код писал, не помню точно, а щас смотреть лень. Там на низкоомной настройке импульсы на форсунки выглядят в виде пачек высокочастотного ШИМ. Чтобы обмотка инжектора не грелась и не горела. Например делаете режим фул опен, а в реале вместо потенциала на форсунке шим.

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

Блин красиво у вас получилось. Зачет. Жду отчета, работает ли вообще этот код. И есть ли косяки, глюки.

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

А вообще вот , уже было:

MaksVV пишет:

- добавил разновидность сопротивлений форсунок (высокого и низкого сопротивления), чтобы не убить форсунки в случае, если они низкоомные. В режиме полного открытия теперь постоянный импульс осуществляется только 2мс - для подъёма иглы клапана форсунки, далее удерживающий ШИМ 4кГц;

Feed_you
Offline
Зарегистрирован: 01.01.2019

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

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

Мысли о реализации:

1) Стенд больше диагностический и имеет несколько программ

  а) Тестирование форсунок на холостых

  б) тестирование форсунок на оборотах равные значению 3000 оборотов

  в) Режим промывки, работы форсунок в ультрозвуковой ванне.

  г) Режим с ручными настройками, которые не думаю что нужны в целом, но так как проект открытый, у всех свои потребности.

2) Режим а и б я бы совместил по алгоритму, (до запуска этих режимов реализовать первый слив на полное открытие форсунок на N секунд, для того чтобы стравить воздух в рампе, нам же нужна точность) 1 наполнение в в течение N секунд, по истечение времени на экране отображается ок (пока мы смотрим уровень пролитого), при нажатие ок включается сливной насос и открываются клапана для слива на N секунд (рвное полному сливу), далее начинается выполнение 2 программы, после ее исполнения так же на экране ок (пока мы смотрим уровень пролитого), при нажатии ок включается сливной насос, открываются клапана и сливатся жидкость обратно в резервуар.

3) слив жидкости в резервуар происходит через фильтр, каждый измерительный цилиндр имеет свой клапан, дабы избежать сильной погрешности, подачу так же можно осуществить через бензонасос автомобильный, Про травление воздуха описал во 2 пункте.

4) программа для промывки в ультрозвуке, как правило в ванной они лежат от 15 минут, по включает ванну, так же каждые 2.5 минуты форсы работают как на холостом, сначала 2.5 просто лежат в ультрозвуке и так 3 жды. 

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

Буду рад если автор данной темы подхватит и поможет сделать этот проект полноценным, со своей стороны постораюсь помочь чем смогу, возможно оснащением.

Измерительный цилиндр пластиковый - https://s.click.aliexpress.com/e/crdWOBXU

Клапан для слива - https://s.click.aliexpress.com/e/c9U8JNoW

Насос для быстрого слива - https://s.click.aliexpress.com/e/coTALjMe

прошу не пинать.

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

я пользуюсь данным стендом довольно редко и городить огород с автоматическими режимами очень лениво, мне проще тумблер нажать для включения/отключения бензонасоса и слить самому из мензурок. Готов добавить разве что готовые сценарии типа ХХ, средние нагрузки, мощностной режим. 

Кстати найти мензурки со штуцерами внизу и мерными делениями крайне проблематично. 

agromir
Offline
Зарегистрирован: 17.09.2018

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

agromir
Offline
Зарегистрирован: 17.09.2018

Так же есть возможность подключения компьютера для промывки кавитацией через программу CarTest Injector .

Было бы неплохо такие режимы с делать на ардуино.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Да ладно... старо как мир )))

Давайте-уж Common Rail форсунки "дрюкать" будем "черезДурдуину" и II коды по тест-планам присваивать )))

Чо, слабо скетч "забабахать" А???                 )))

Feed_you
Offline
Зарегистрирован: 01.01.2019

Вам наверное тогда в комерческий раздел.

Feed_you
Offline
Зарегистрирован: 01.01.2019

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

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

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

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

дисплей 1602 обычно чаще в наличии бывает. Вот скетч для него. Индикация попроще естественно, но всё есть.

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <PWM.h>
#define outPWM  9   //пин для генератора сигналов (не менять) - это выход на Мосфет управления форсунками. 

#define buzzer         3    // пин пищалки
#define pressBut       650  // частота тона нажатия клавиш
#define time_presstone 90   // длительность тона нажатия клавиш

#include <Button.h> // библиотека для создания различных видов нажитий на кнопки плюс защита от дребезга, спасибо КЛАПАУЦИЮ!. 
Button test;    

LiquidCrystal_I2C lcd(0x27, 16, 2); // адрес LCD на шине i2c и  строчность LCD 
         


byte PWM = 128;         //стартовое значение ШИМ (от 0 до 255)

byte frequency = 7; //стартовое значение частоты в Гц
                    //(соответсвует 840 об/мин)

byte Menu=4;    // номера меню, по умолчанию меню "старт теста"

bool last5 = 0;

bool pwm = 1;   // ЗДЕСЬ НУЖНО ВЫБРАТЬ ЛОГИКУ ВЫХОДА ШИМ - ПРЯМАЯ ИЛИ ОБРАТНАЯ,
//В ЗАВИСИМОСТИ ОТ ТОГО, КАКАЯ ЛОГИКА НА ВХОДЕ МОСФЕТА. РУЛИМ ПРИ ЭТОМ "МИНУСОМ" ФОРСУНКИ!!! Т.Е. ОДИН ВЫВОД ФОРСУНКИ +12В, ВТОРОЙ - К ВЫХОДУ МОСФЕТА. 
//  0 - ОБРАТНЫЙ ШИМ,   1 - ПРЯМОЙ ШИМ
// ОБРАТНЫЙ ШИМ - 100% ШИМ СООТВЕТСТВУЕТ ПОЛНОМУ СИГНАЛУ "GND" НА ВЫХОДЕ МОСФЕТА
// ПРЯМОЙ ШИМ -   100% ШИМ СООСТВЕТСВУЕТ ПОЛНОМУ СИГНАЛУ "12В" НА ВЫХОДЕ МОСФЕТА 

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

bool timerenabledOPENvalve = 0; // для таймера отсчета времени на открытие иглы форсунки
uint32_t  timerValve = 0;       // для таймера отсчета времени на открытие иглы форсунки
uint32_t prev = 0;              // для таймера периодического вывода инфы на экран

// ниже кнопки, замыкают GND, подтяжка к питанию включена в библе кнопок
#define LEVOpin  10 //пин кнопки ЛЕВО (можно любой пин)
#define MENUpin  11 //пин кнопки МЕНЮ (можно любой пин)
#define PRAVOpin 12 //пин кнопки ПРАВО(можно любой пин)

#define LEVO 0      // порядковые номера кнопок (для работы библиотеки кнопок)
#define MENU 1      // порядковые номера кнопок (для работы библиотеки кнопок)
#define PRAVO 2     // порядковые номера кнопок (для работы библиотеки кнопок)

bool longpressLEVO = 0;   // флаг длительного удержания кнопки
bool longpressPRAVO = 0;  // флаг длительного удержания кнопки
bool longpressMENU = 0;   // флаг длительного удержания кнопки

bool menu = 0;       // флаг вывелось или нет на экран новое меню 

bool Impedance = 1;  // сопротивление обмотки форсунки true - больше 10 Ом, false - менее 5 Ом

void setup()
{
//ниже настройка пина пищалки
pinMode (buzzer, OUTPUT); digitalWrite (buzzer, LOW);  

//ниже настройка библиотеки работы кнопок
test.NO(); // N.O. Normal Open
test.pullUp();
test.duration_bounce       (  50);
unsigned long duration_check = 200;
test.duration_click_Db     (duration_check);
test.duration_inactivity_Up(duration_check);
test.duration_inactivity_Dn(600);
test.duration_press        (500);
test.button(LEVOpin, MENUpin, PRAVOpin); // arduino pins connected to button

//ниже настройка LCD
lcd.begin();
lcd.backlight();

//ниже настройка выхода PWM
 InitTimersSafe(); 
 SetPinFrequencySafe(outPWM, frequency); 

if (!pwm){ pwmWrite(outPWM, 255);}
else {pwmWrite(outPWM, 0);}

//ниже мелодия при включении
tone(buzzer,659,150);
delay(150);
tone(buzzer,659,300);
delay(300);
tone(buzzer,659,150);
delay(300);
tone(buzzer,523,150);
delay(150);
tone(buzzer,659,300);
delay(300);
tone(buzzer,784,600);
    }   


void loop() {

test.read();   // обновление состояния кнопок

// ниже опрос длительных нажатий на кнопки
if (test.event_inactivity_Dn(LEVO) ==1)   longpressLEVO = 1;
if (test.event_click_Up (LEVO) == 1)      longpressLEVO = 0;
if (test.event_inactivity_Dn(PRAVO) ==1)  longpressPRAVO =1;
if (test.event_click_Up (PRAVO) == 1)     longpressPRAVO =0;

if (Menu==0){//меню выбора Частоты вращения ДВС
             
             if (!menu){lcd.setCursor(3,1);
             lcd.print("   N/min"); 
             lcd.print("   >>"); menu=1;}
             
             if (test.event_click_Dn  (LEVO) == 1 || (longpressLEVO && !Delay)) {
              
              full=0;
              frequency--;
              if(frequency<1){frequency=1;}
              if (longpressLEVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();
            }
            if (test.event_click_Dn  (PRAVO) == 1 || (longpressPRAVO && !Delay)) {
           
              full=0;
              frequency++; if (frequency>83) frequency=83;
              if (longpressPRAVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();
            }  
}
if (Menu==1){//меню выбора длины импульса (времени) впрыска
            
            if (!menu){lcd.setCursor(3,1);
            lcd.print("     ms");
            lcd.print("    >>"); menu=1;}
          
            if (test.event_click_Dn  (LEVO) == 1 || (longpressLEVO && !Delay)) {
              full=0;
              t-=0.1;
              if (t<1.00) t=1.00;
              if (longpressLEVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();
                                                                      }
            
            
            if (test.event_click_Dn  (PRAVO) == 1 || (longpressPRAVO && !Delay)) {
              full=0;
              t+=0.1;
              if (t>11.00) t=11.00;
              if (longpressPRAVO) {Delay = 1; timerDelay = time;}   
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();     
                                                                        }
            
            }

if (Menu==2) {  // меню выбора/отмены режима постоянного открытия форсунок

if (!menu){lcd.setCursor(3,1);
lcd.print(" Full OPEN ");
lcd.print(">>"); menu=1;} 
  
  if(!timerenabled) if (test.event_click_Dn  (LEVO) == 1 ||  test.event_click_Dn  (PRAVO) == 1) 
  {full=!full; tone (buzzer, pressBut, time_presstone);}
  
             }

            
if (Menu==3) {  // меню выбора времени теста

if (!menu){lcd.setCursor(3,1);
lcd.print("   TIME");
lcd.print("    >>"); menu=1;}

if( !timerenabled){
              if (test.event_click_Dn  (LEVO) == 1 || (longpressLEVO && !Delay)) {
              testtime-=5;
              if(testtime<0){testtime=0;} 
              if (longpressLEVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);                                                          }
              
              if (test.event_click_Dn  (PRAVO) == 1 || (longpressPRAVO && !Delay)) {
              testtime+=5;
              if(testtime>600){testtime=600;} 
              if (longpressPRAVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);                                                             }
            
            }          }  

if (Menu==4) { // меню старт

 if (!menu){lcd.setCursor(3,1);
 lcd.print("STOP START");
 lcd.print(" >>");  menu=1;}

if (!timerenabled && test.event_click_Dn  (PRAVO) == 1){ 
  timer=time; 
  timerenabled=true; 
  tone (buzzer, 1500, 700);   
  PWMrefresh();
  
  }
  
  
            
if (test.event_click_Dn  (LEVO) == 1){
  if (!pwm){pwmWrite(outPWM, 255);}
  else {pwmWrite(outPWM, 0);}
  timerenabled=false;
  tone (buzzer, pressBut, time_presstone);  
  }
  

}

if (Menu==5) {// меню выбора сопротивления обмотки форсунки

if (!menu){lcd.setCursor(3,1);
lcd.print(" IMPEDANCE");
lcd.print(" >>"); menu=1;}

if (!timerenabled) {if (test.event_click_Dn  (LEVO) == 1 ||  test.event_click_Dn  (PRAVO) == 1) 
{last5 = 1; Impedance=!Impedance; lcd.setCursor(0,0);
lcd.print("Imp: ");
if (Impedance) lcd.print (">10 Ohm ");
else lcd.print ("<5 Ohm  "); tone (buzzer, pressBut, time_presstone);  }} 
}




// ниже работа таймера времени теста

time = millis();

if (Delay && time - timerDelay>93 ) Delay = 0;

  if (timerenabled) {
if (timerenabledOPENvalve && time - timerValve > 1000) timerenabledOPENvalve = 0;
  
   if (!timerenabledOPENvalve && full) 
    {
      if (Impedance){
       if (!pwm)pwmWrite(outPWM, 10);
       else     pwmWrite(outPWM, 245);    
                    }
      else {
        if (!pwm)pwmWrite(outPWM, 90);
        else     pwmWrite(outPWM, 165);    
           }
    }

        
    if ((time-timer)>(testtime*1000)) {
      if (!pwm){pwmWrite(outPWM, 255);}
      else {pwmWrite(outPWM, 0);}
      timerenabled=false;
      tone (buzzer, 1500, 1500); 
      
            }
                    }

    
if (test.event_click_Dn (MENU) == 1){ //переключение менюшек
  Menu++; menu = 0; tone (buzzer, pressBut, time_presstone);
  if(Menu>=6){Menu=0;}
} 


// ниже обновление информации на LCD

if (millis () - prev>100){

if(Menu !=5){
if (last5) lcd.setCursor(0,0), lcd.print("           "), last5=0;
lcd.setCursor(0,0);
if (!full){
lcd.print(t,1);
lcd.print(" ");
long frequencyX=frequency*120;
lcd.print(frequencyX); 

}
else {lcd.print ("Full     ");}

}

lcd.setCursor(9,0);
int sec; sec= testtime - ((time - timer)/1000);
    if (timerenabled){  lcd.print(sec);lcd.print("   ");}
  else if (Menu !=5) lcd.print ("00 ");


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

  lcd.setCursor(0,1);

   lcd.print("<< ");    
      
      
lcd.display();
prev = millis();
}
}



// ниже фукнция включения выхода PWM

void PWMrefresh(){
  SetPinFrequencySafe(outPWM, frequency);
  if (!full)PWM=frequency*t*0.255;
    else PWM=255; 
    if(PWM<0)PWM=0;
    if(PWM>255)PWM=255;
  if (full) {timerenabledOPENvalve=1; timerValve = time; SetPinFrequencySafe(outPWM, 4000);}
  if (timerenabled){
  if (!pwm){ pwmWrite(outPWM, 255-PWM);}
  else {pwmWrite(outPWM, PWM);}
                   }
  }

 

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

в скетче #70 небольшая ошибка была, исправил 

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <PWM.h>
#define outPWM  9   //пин для генератора сигналов (не менять) - это выход на Мосфет управления форсунками. 

#define buzzer         3    // пин пищалки
#define pressBut       650  // частота тона нажатия клавиш
#define time_presstone 90   // длительность тона нажатия клавиш

#include <Button.h> // библиотека для создания различных видов нажитий на кнопки плюс защита от дребезга, спасибо КЛАПАУЦИЮ!. 
Button test;    

LiquidCrystal_I2C lcd(0x27, 20, 4); // адрес LCD на шине i2c и  строчность LCD 
         


byte PWM = 128;         //стартовое значение ШИМ (от 0 до 255)

byte frequency = 7; //стартовое значение частоты в Гц
                    //(соответсвует 840 об/мин)

byte Menu=4;    // номера меню, по умолчанию меню "старт теста"

bool pwm = 1;   // ЗДЕСЬ НУЖНО ВЫБРАТЬ ЛОГИКУ ВЫХОДА ШИМ - ПРЯМАЯ ИЛИ ОБРАТНАЯ,
//В ЗАВИСИМОСТИ ОТ ТОГО, КАКАЯ ЛОГИКА НА ВХОДЕ МОСФЕТА. РУЛИМ ПРИ ЭТОМ "МИНУСОМ" ФОРСУНКИ!!! Т.Е. ОДИН ВЫВОД ФОРСУНКИ +12В, ВТОРОЙ - К ВЫХОДУ МОСФЕТА. 
//  0 - ОБРАТНЫЙ ШИМ,   1 - ПРЯМОЙ ШИМ
// ОБРАТНЫЙ ШИМ - 100% ШИМ СООТВЕТСТВУЕТ ПОЛНОМУ СИГНАЛУ "GND" НА ВЫХОДЕ МОСФЕТА
// ПРЯМОЙ ШИМ -   100% ШИМ СООСТВЕТСВУЕТ ПОЛНОМУ СИГНАЛУ "12В" НА ВЫХОДЕ МОСФЕТА 

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

bool timerenabledOPENvalve = 0; // для таймера отсчета времени на открытие иглы форсунки
uint32_t  timerValve = 0;       // для таймера отсчета времени на открытие иглы форсунки
uint32_t prev = 0;              // для таймера периодического вывода инфы на экран

// ниже кнопки, замыкают GND, подтяжка к питанию включена в библе кнопок
#define LEVOpin  10 //пин кнопки ЛЕВО (можно любой пин)
#define MENUpin  11 //пин кнопки МЕНЮ (можно любой пин)
#define PRAVOpin 12 //пин кнопки ПРАВО(можно любой пин)

#define LEVO 0      // порядковые номера кнопок (для работы библиотеки кнопок)
#define MENU 1      // порядковые номера кнопок (для работы библиотеки кнопок)
#define PRAVO 2     // порядковые номера кнопок (для работы библиотеки кнопок)

bool longpressLEVO = 0;   // флаг длительного удержания кнопки
bool longpressPRAVO = 0;  // флаг длительного удержания кнопки
bool longpressMENU = 0;   // флаг длительного удержания кнопки

bool menu = 0;       // флаг вывелось или нет на экран новое меню 

bool Impedance = 1;  // сопротивление обмотки форсунки true - больше 10 Ом, false - менее 5 Ом

void setup()
{
//ниже настройка пина пищалки
pinMode (buzzer, OUTPUT); digitalWrite (buzzer, LOW);  

//ниже настройка библиотеки работы кнопок
test.NO(); // N.O. Normal Open
test.pullUp();
test.duration_bounce       (  50);
unsigned long duration_check = 200;
test.duration_click_Db     (duration_check);
test.duration_inactivity_Up(duration_check);
test.duration_inactivity_Dn(600);
test.duration_press        (500);
test.button(LEVOpin, MENUpin, PRAVOpin); // arduino pins connected to button

//ниже настройка LCD
lcd.begin();
lcd.backlight();

//ниже настройка выхода PWM
 InitTimersSafe(); 
 SetPinFrequencySafe(outPWM, frequency); 

if (!pwm){ pwmWrite(outPWM, 255);}
else {pwmWrite(outPWM, 0);}

//ниже мелодия при включении
tone(buzzer,659,150);
delay(150);
tone(buzzer,659,300);
delay(300);
tone(buzzer,659,150);
delay(300);
tone(buzzer,523,150);
delay(150);
tone(buzzer,659,300);
delay(300);
tone(buzzer,784,600);
    }   


void loop() {

test.read();   // обновление состояния кнопок

// ниже опрос длительных нажатий на кнопки
if (test.event_inactivity_Dn(LEVO) ==1)   longpressLEVO = 1;
if (test.event_click_Up (LEVO) == 1)      longpressLEVO = 0;
if (test.event_inactivity_Dn(PRAVO) ==1)  longpressPRAVO =1;
if (test.event_click_Up (PRAVO) == 1)     longpressPRAVO =0;

if (Menu==0){//меню выбора Частоты вращения ДВС
             
             if (!menu){lcd.setCursor(3,3);
             lcd.print("N/min"); 
             lcd.print(" >>         "); menu=1;}
             
             if (test.event_click_Dn  (LEVO) == 1 || (longpressLEVO && !Delay)) {
              
              full=0;
              frequency--;
              if(frequency<1){frequency=1;}
              if (longpressLEVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();
            }
            if (test.event_click_Dn  (PRAVO) == 1 || (longpressPRAVO && !Delay)) {
           
              full=0;
              frequency++; if (frequency>83) frequency=83;
              if (longpressPRAVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();
            }  
}
if (Menu==1){//меню выбора длины импульса (времени) впрыска
            
            if (!menu){lcd.setCursor(3,3);
            lcd.print("millisec");
            lcd.print(" >>      "); menu=1;}
          
            if (test.event_click_Dn  (LEVO) == 1 || (longpressLEVO && !Delay)) {
              full=0;
              t-=0.1;
              if (t<1.00) t=1.00;
              if (longpressLEVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();
                                                                      }
            
            
            if (test.event_click_Dn  (PRAVO) == 1 || (longpressPRAVO && !Delay)) {
              full=0;
              t+=0.1;
              if (t>11.00) t=11.00;
              if (longpressPRAVO) {Delay = 1; timerDelay = time;}   
              else tone (buzzer, pressBut, time_presstone);
              PWMrefresh();     
                                                                        }
            
            }

if (Menu==2) {  // меню выбора/отмены режима постоянного открытия форсунок

if (!menu){lcd.setCursor(3,3);
lcd.print("Full On/Off");
lcd.print(" >>   "); menu=1;} 
  
  if(!timerenabled) if (test.event_click_Dn  (LEVO) == 1 ||  test.event_click_Dn  (PRAVO) == 1) 
  {full=!full; tone (buzzer, pressBut, time_presstone);}
  
             }

            
if (Menu==3) {  // меню выбора времени теста

if (!menu){lcd.setCursor(3,3);
lcd.print("TIME TEST");
lcd.print(" >>   "); menu=1;}

if( !timerenabled){
              if (test.event_click_Dn  (LEVO) == 1 || (longpressLEVO && !Delay)) {
              testtime-=5;
              if(testtime<0){testtime=0;} 
              if (longpressLEVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);                                                          }
              
              if (test.event_click_Dn  (PRAVO) == 1 || (longpressPRAVO && !Delay)) {
              testtime+=5;
              if(testtime>600){testtime=600;} 
              if (longpressPRAVO) {Delay = 1; timerDelay = time;}
              else tone (buzzer, pressBut, time_presstone);                                                             }
            
            }          }  

if (Menu==4) { // меню старт

 if (!menu){lcd.setCursor(3,3);
 lcd.print("STOP     START");
 lcd.print(" >>");  menu=1;}

if (!timerenabled && test.event_click_Dn  (PRAVO) == 1){ 
  timer=time; 
  timerenabled=true; 
  tone (buzzer, 1500, 700);   
  PWMrefresh();
  
  }
  
  
            
if (test.event_click_Dn  (LEVO) == 1){
  if (!pwm){pwmWrite(outPWM, 255);}
  else {pwmWrite(outPWM, 0);}
  timerenabled=false;
  tone (buzzer, pressBut, time_presstone);  
  }
  

}

if (Menu==5) {// меню выбора сопротивления обмотки форсунки

if (!menu){lcd.setCursor(3,3);
lcd.print("IMPEDANCE");
lcd.print(" >>     "); menu=1;}

if (!timerenabled) {if (test.event_click_Dn  (LEVO) == 1 ||  test.event_click_Dn  (PRAVO) == 1) 
{Impedance=!Impedance; tone (buzzer, pressBut, time_presstone);  }} 
}




// ниже работа таймера времени теста

time = millis();

if (Delay && time - timerDelay>93 ) Delay = 0;

  if (timerenabled) {
if (timerenabledOPENvalve && time - timerValve > 1000) timerenabledOPENvalve = 0;
  
   if (!timerenabledOPENvalve && full) 
    {
      if (Impedance){
       if (!pwm)pwmWrite(outPWM, 10);
       else     pwmWrite(outPWM, 245);    
                    }
      else {
        if (!pwm)pwmWrite(outPWM, 90);
        else     pwmWrite(outPWM, 165);    
           }
    }

        
    if ((time-timer)>(testtime*1000)) {
      if (!pwm){pwmWrite(outPWM, 255);}
      else {pwmWrite(outPWM, 0);}
      timerenabled=false;
      tone (buzzer, 1500, 1500); 
      
            }
                    }

    
if (test.event_click_Dn (MENU) == 1){ //переключение менюшек
  Menu++; menu = 0; tone (buzzer, pressBut, time_presstone);
  if(Menu>=6){Menu=0;}
} 


// ниже обновление информации на LCD

if (millis () - prev>100){
lcd.setCursor(14,1);
int sec; sec= testtime - ((time - timer)/1000);
    if (timerenabled){  lcd.print(sec);lcd.print("   ");}
  else lcd.print ("00 ");

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(4,2);
lcd.print("Imp: ");
if (Impedance) lcd.print (">10 Ohm ");
else lcd.print ("<5 Ohm  ");

}


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

  lcd.setCursor(0,3);

   lcd.print("<< ");    
      
      
lcd.display();
prev = millis();
}
}



// ниже фукнция включения выхода PWM

void PWMrefresh(){
  SetPinFrequencySafe(outPWM, frequency);
  if (!full)PWM=frequency*t*0.255;
    else PWM=255; 
    if(PWM<0)PWM=0;
    if(PWM>255)PWM=255;
  if (full) {timerenabledOPENvalve=1; timerValve = time; SetPinFrequencySafe(outPWM, 4000);}
  if (timerenabled){
  if (!pwm){ pwmWrite(outPWM, 255-PWM);}
  else {pwmWrite(outPWM, PWM);}
                   }
  }

 

And_N
Offline
Зарегистрирован: 19.02.2019

Привет! Ктонибудь переносил скетч с 99 поста на мегу 2560? Не могу запустить. Нет на 9 пине ничего. Во всем этом только пытаюсь разобраться. Остальное все работает (экран на параллельном интерфейсе и кнопки). Причем на этом скетче один раз (первый) импульсы пошли... пин рабочий - проверял примерами с библиотек. Мега просто есть, валяется) поэтому на ней "познаю мир". В какую сторону копать в коде пока не пойму...