Witam,
Napisałem sobie program.
Wszystko teoretycznie działa.
Działa jak arduino się nie zawiesi.
Siedzę nad tym już 3 dzień i nie mogę znaleźć rozwiązania dlaczego raz się wiesza a raz nie.
Może ktoś zerknie i wskaże mi gdzie jest problem?
Pozdrawiam
Ps. Błagam bo już mnie męczy co zrobiłem nie tak. Zawiesza się w losowych momentach.
Napisałem sobie program.
Wszystko teoretycznie działa.
Działa jak arduino się nie zawiesi.
Siedzę nad tym już 3 dzień i nie mogę znaleźć rozwiązania dlaczego raz się wiesza a raz nie.
Może ktoś zerknie i wskaże mi gdzie jest problem?
Pozdrawiam
Kod PHP:
#include <Bounce2.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
LiquidCrystal_I2C lcd(0x3f, 20, 4);
// Inicjalizacja obiektu Bounce
Bounce debouncerA = Bounce();
Bounce debouncerB = Bounce();
Bounce debouncerC = Bounce();
Bounce debouncerD = Bounce();
//przyciski menu
#define BTN_BACK 3
#define BTN_NEXT 4
#define BTN_UP 2
#define BTN_DOWN 5
#define lenght 16.0
#define PinWtr1 6
#define PinWtr2 7
#define PinWtr3 8
#define PinWtr4 9
typedef enum {
BACK, NEXT, UP, DOWN, NONE
} ENUM_BUTTON;
int PinWtr[] = {
6, 7, 8, 9
};
//inne
long MenuA = 1;
//podmenu 1
long MenuB = 1;
//podmenu wtrysk posredni
long MenuC = 1;
//podmenu rodzaj wtrysku
long MenuD = 1;
double percent=100.0;
unsigned char b;
unsigned int peace;
//parametry testera
float czas_wtrysku = 5;
int czas_wtrysku_us = 0;
int czas_dzial_min = 0;
int czas_dzial_sek = 0;
int czas_dzial = 0;
int czas_obrotu = 0;
int czas_obrotu_mnozenie = czas_obrotu*2;
int Typ = 1;
float czas = 0;
float czas_start;
int obroty = 600;
int zapet_sekwencja;
int zapet_full;
int zapetlenie = 0;
//znak strzalki przy wyborze
byte strzalka[] = {
B11000,
B11100,
B11110,
B11111,
B11111,
B11110,
B11100,
B11000
};
byte smutnamina[] = {
B00000,
B00000,
B01010,
B00000,
B01110,
B10001,
B00000,
B00000
};
byte p1[] = {
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000
};
byte p2[] = {
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000
};
byte p3[] = {
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
B11100
};
byte p4[] = {
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110
};
byte p5[] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111
};
void setup()
{
pinMode(BTN_NEXT, INPUT_PULLUP);
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_BACK, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
debouncerA.attach(BTN_NEXT);
debouncerA.interval(100);
debouncerB.attach(BTN_UP);
debouncerB.interval(100);
debouncerC.attach(BTN_BACK);
debouncerC.interval(100);
debouncerD.attach(BTN_DOWN);
debouncerD.interval(100);
lcd.init();
lcd.begin(20,4); // Inicjalizacja LCD 4x20
lcd.backlight(); // zalaczenie podwietlenia
lcd.setCursor(0,0);
lcd.print("RDS GARAGE");
lcd.setCursor(0,1);
lcd.print("www.RDSgarage.pl");
lcd.setCursor(0,2);
lcd.print("Z pasji do");
lcd.setCursor(0,3);
lcd.print("motoryzacji!");
delayMicroseconds(3500);
lcd.clear();
lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
lcd.print("Tester wtryskiwaczy");
lcd.setCursor(0,1); //Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("Wersja v1.02");
lcd.setCursor(0,2); //Ustawienie kursora w pozycji 0,0 (drugi wiersz, pierwsza kolumna)
lcd.print("TESTOWA");
delayMicroseconds(3500);
lcd.clear();
}
void loop() {
debouncerA.update();
debouncerB.update();
debouncerC.update();
debouncerD.update();
lcd.createChar(0, strzalka);
lcd.createChar(1, smutnamina);
lcd.createChar(2, p1);
lcd.createChar(3, p2);
lcd.createChar(4, p3);
lcd.createChar(5, p4);
lcd.createChar(6, p5);
ENUM_BUTTON pressedButton = getButton();
switch (MenuA) {
case 1:
if(pressedButton == DOWN) {
if (MenuB < 2) {
MenuB++;
}
}
if(pressedButton == UP) {
if (MenuB > 1) {
MenuB--;
}
}
lcd.setCursor(0,0);
lcd.print("Wybierz ukl. wtry.:");
//start podmenu 1
switch (MenuB) {
case 1:
lcd.setCursor(0,1);
lcd.write(0);
lcd.print("Wtrysk posredni");
lcd.setCursor(0,2);
lcd.print("Wtrysk bezposredni");
lcd.setCursor(18,2);
lcd.print (" ");
if(pressedButton == NEXT) {
MenuA = 2;
lcd.clear();
}
break;
case 2:
lcd.setCursor(0,1);
lcd.print("Wtrysk posredni");
lcd.setCursor(15,1);
lcd.print (" ");
lcd.setCursor(0,2);
lcd.write(0);
lcd.print("Wtrysk bezposredni");
if(pressedButton == NEXT) {
MenuA = 3;
lcd.clear();
}
break;
}
//koniec podmenu 1
break;
//WYBOR 2 - MenuA
case 2:
if(pressedButton == DOWN) {
if (MenuC < 3) {
MenuC++;
lcd.clear();
}
}
if(pressedButton == UP) {
if (MenuC > 1) {
MenuC--;
lcd.clear();
}
}
switch (MenuC) {
case 1:
lcd.setCursor(0,0);
lcd.print("Wtrysk posredni:");
lcd.setCursor(0,1);
lcd.write(0);
lcd.print("Test nowy");
lcd.setCursor(0,2);
lcd.print("Test zdefiniowany");
lcd.setCursor(0,3);
lcd.print("Ustawienia");
if(pressedButton == NEXT) {
MenuA = 4;
lcd.clear();
}
break;
case 2:
lcd.setCursor(0,0);
lcd.print("Wtrysk posredni:");
lcd.setCursor(0,1);
lcd.print("Test nowy");
lcd.setCursor(0,2);
lcd.write(0);
lcd.print("Test zdefiniowany");
lcd.setCursor(0,3);
lcd.print("Ustawienia");
break;
case 3:
lcd.setCursor(0,0);
lcd.print("Wtrysk posredni:");
lcd.setCursor(0,1);
lcd.print("Test nowy");
lcd.setCursor(0,2);
lcd.print("Test zdefiniowany");
lcd.setCursor(0,3);
lcd.write(0);
lcd.print("Ustawienia");
break;
}
if(pressedButton == BACK) {
MenuA = 1;
lcd.clear();
}
break;
//WYBOR 3 - MenuA
case 3:
lcd.setCursor(0,0);
lcd.print("Wybrales wtrysk");
lcd.setCursor(0,1);
lcd.print("bezposredni.");
lcd.setCursor(0,2);
lcd.print("Funkcja obecnie");
lcd.setCursor(0,3);
lcd.print("niedostepna ");
lcd.write(1);
lcd.print(" .");
if(pressedButton == BACK) {
MenuA = 1;
lcd.clear();
}
break;
//WYBOR 4 - MenuA
case 4:
lcd.setCursor(0,0);
lcd.print("Wprowadz czas");
lcd.setCursor(0,1);
lcd.print("wtrysku:");
lcd.setCursor(0,2);
lcd.print("Czas: ");
lcd.print(float(czas_wtrysku));
lcd.print(" ms");
if(pressedButton == DOWN) {
czas_wtrysku = czas_wtrysku-0.1;
lcd.clear();
}
if(pressedButton == UP) {
czas_wtrysku = czas_wtrysku+0.1;
lcd.clear();
}
if(pressedButton == BACK) {
MenuA = 2;
lcd.clear();
}
if(pressedButton == NEXT) {
MenuA = 5;
lcd.clear();
}
break;
//WYBOR 5 - MenuA
case 5:
lcd.setCursor(0,0);
lcd.print("Wprowadz czas");
lcd.setCursor(0,1);
lcd.print("dzialania:");
lcd.setCursor(0,2);
lcd.print("Czas: ");
lcd.print(czas_dzial_min);
lcd.print("min ");
lcd.print(czas_dzial_sek);
lcd.print("sek ");
lcd.setCursor(0,3);
lcd.print("WPROWADZ MINUTY ");
if(pressedButton == DOWN) {
czas_dzial_min--;
lcd.clear();
}
if(pressedButton == UP) {
czas_dzial_min++;
lcd.clear();
}
if(pressedButton == BACK) {
MenuA = 4;
lcd.clear();
}
if(pressedButton == NEXT) {
MenuA = 6;
lcd.clear();
}
break;
//WYBOR 6 - MenuA
case 6:
lcd.setCursor(0,0);
lcd.print("Wprowadz czas");
lcd.setCursor(0,1);
lcd.print("dzialania:");
lcd.setCursor(0,2);
lcd.print("Czas: ");
lcd.print(czas_dzial_min);
lcd.print("min ");
lcd.print(czas_dzial_sek);
lcd.print("sek ");
lcd.setCursor(0,3);
lcd.print("WPROWADZ SEKUNDY");
if(pressedButton == DOWN) {
if (czas_dzial_sek != 0) {
czas_dzial_sek--;
lcd.clear();
}
}
if(pressedButton == UP) {
if (czas_dzial_sek != 59) {
czas_dzial_sek++;
lcd.clear();
}
}
if(pressedButton == BACK) {
MenuA = 5;
lcd.clear();
}
if(pressedButton == NEXT) {
MenuA = 7;
lcd.clear();
}
break;
//WYBOR 7 - MenuA
case 7:
if(pressedButton == UP) {
if (obroty < 7000) {
obroty = obroty+100;
lcd.clear();
}
}
if(pressedButton == DOWN) {
if (obroty > 500) {
obroty= obroty-100;
lcd.clear();
}
}
lcd.setCursor(0,0);
lcd.print("Wprowadz obroty:");
lcd.setCursor(0,1);
lcd.print(obroty);
lcd.print("rpm");
if(pressedButton == BACK) {
MenuA = 6;
lcd.clear();
}
if(pressedButton == NEXT) {
MenuA = 8;
lcd.clear();
}
break;
//WYBOR 8 - MenuA
case 8:
if(pressedButton == DOWN) {
if (MenuD < 2) {
MenuD++;
lcd.clear();
}
}
if(pressedButton == UP) {
if (MenuD > 1) {
MenuD--;
lcd.clear();
}
}
switch (MenuD) {
case 1:
lcd.setCursor(0,0);
lcd.print("Typ wtrysku:");
lcd.setCursor(0,1);
lcd.write(0);
lcd.print("Sekwencja");
lcd.setCursor(0,2);
lcd.print("Full grupa");
if(pressedButton == NEXT) {
Typ = 1;
MenuA = 9;
lcd.clear();
}
break;
case 2:
lcd.setCursor(0,0);
lcd.print("Typ wtrysku:");
lcd.setCursor(0,1);
lcd.print("Sekwencja");
lcd.setCursor(0,2);
lcd.write(0);
lcd.print("Full grupa");
if(pressedButton == NEXT) {
Typ = 2;
MenuA = 9;
lcd.clear();
}
break;
}
if(pressedButton == BACK) {
MenuA = 7;
lcd.clear();
}
break;
//WYBOR 8 - MenuA
case 9:
lcd.setCursor(0,0);
if (Typ == 1) {
lcd.print("Praca sekwencja.");
} else {
lcd.print("Praca full grupa.");
}
lcd.setCursor(0,1);
lcd.print("Czas:");
if (czas_dzial_min == 0 && czas_dzial_sek == 0) {
lcd.print("bez limitu");
} else {
lcd.print(czas_dzial_min);
lcd.print("min ");
lcd.print(czas_dzial_sek);
lcd.print("sek");
}
lcd.setCursor(0,2);
lcd.print("Obroty:");
lcd.print(obroty);
lcd.print(" rpm");
lcd.setCursor(0,3);
lcd.print("Czas wtrysk: ");
lcd.print(float(czas_wtrysku));
lcd.print("ms");
if(pressedButton == BACK) {
MenuA = 7;
lcd.clear();
}
if(pressedButton == NEXT) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ETAP 1/2");
lcd.setCursor(0,1);
lcd.print("ZALACZAM");
lcd.setCursor(0,2);
lcd.print("POMPE");
lcd.setCursor(0,3);
lcd.print("PALIWA");
//delay(5000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("ETAP 2/2");
lcd.setCursor(0,1);
lcd.print("ZALACZAM");
lcd.setCursor(0,2);
lcd.print("WTRYSKIWACZE");
//delay(1000);
MenuA = 10;
lcd.clear();
czas_dzial = czas_dzial_sek + (czas_dzial_min * 60);
czas_wtrysku_us = round(czas_wtrysku * 1000);
czas_obrotu = (1000/(obroty/60)*1000);
zapet_sekwencja = 120000000/obroty;
zapet_full = 60000000/obroty;
//sprawdzenie zapetlen
if(Typ == 1) {
if (zapet_sekwencja <= czas_wtrysku_us) {
lcd.setCursor(0,0);
lcd.print("PRACA W");
lcd.setCursor(0,1);
lcd.print("ZAPETLENIU!");
zapetlenie = 1;
delay(1000);
} else {
zapetlenie = 0;
}} else {
if (zapet_full<= czas_wtrysku_us) {
lcd.setCursor(0,0);
lcd.print("PRACA W");
lcd.setCursor(0,1);
lcd.print("ZAPETLENIU!");
zapetlenie = 1;
delay(1000);
} else {
zapetlenie = 0;
}}
czas = (millis()/1000) + czas_dzial_sek + (czas_dzial_min * 60);
czas_start = (millis()/1000);
}
break;
//WYBOR 10 - MenuA
case 10:
/* lcd.setCursor(0,0);
lcd.print(czas - czas_start);
lcd.setCursor(0,1);
lcd.print(millis()/1000 - czas_start);
lcd.setCursor(0,2);
lcd.print(czas_dzial);
lcd.setCursor(0,3);
lcd.print(double((millis()/1000 - czas_start)/(czas - czas_start))*100);
lcd.print(" %"); */
if (czas_dzial_min == 0 && czas_dzial_sek == 0) {
lcd.setCursor(0,0);
lcd.print("PRACA BEZ LIMITU");
lcd.setCursor(0,1);
lcd.print("WCISNIJ COFNIJ");
lcd.setCursor(0,2);
lcd.print("ABY PRZERWAC");
if(Typ == 1) {
Sekwencja(czas_wtrysku_us, czas_obrotu_mnozenie, zapetlenie);
} else {
Full(czas_wtrysku_us, czas_obrotu);
}
if(pressedButton == BACK) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TEST PRZERWANO");
delay(2000);
MenuA = 1;
lcd.clear();
}
} else {
if(Typ == 1) {
Sekwencja(czas_wtrysku_us, czas_obrotu*2, zapetlenie);
} else {
Full(czas_wtrysku_us, czas_obrotu);
}
if(percent > 100) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TEST ZAKONCZONO");
analogWrite(PinWtr1, 0);
analogWrite(PinWtr2, 0);
analogWrite(PinWtr3, 0);
analogWrite(PinWtr4, 0);
delay(1000);
MenuA = 1;
lcd.clear();
}
if(pressedButton == BACK) {
lcd.setCursor(0,3);
lcd.print("TEST PRZERWANO");
analogWrite(PinWtr1, 0);
analogWrite(PinWtr2, 0);
analogWrite(PinWtr3, 0);
analogWrite(PinWtr4, 0);
delay(2000);
MenuA = 1;
lcd.clear();
}
lcd.setCursor(0, 0);
double value = ((millis()/1000 - czas_start)/(czas - czas_start)) ;
percent = value*100.0;
lcd.print("UKONCZONO:");
lcd.print(" ");
lcd.print(percent);
lcd.print(" % ");
lcd.setCursor(0,2);
double a=lenght/100*percent;
if (a>=1) {
for (int i=1;i<a;i++) {
lcd.write(6);
b=i;
}
a=a-b;
}
peace=a*5;
switch (peace) {
case 0:
break;
case 1:
lcd.write(2);
break;
case 2:
lcd.write(3);
break;
case 3:
lcd.write(4);
break;
case 4:
lcd.write(5);
break;
}
for (int i =0;i<(lenght-b);i++) {
lcd.print(" ");
}
break;
}
}
}
ENUM_BUTTON getButton() {
if(digitalRead(BTN_BACK)) return BACK;
if(digitalRead(BTN_NEXT)) return NEXT;
if(digitalRead(BTN_UP)) return UP;
if(digitalRead(BTN_DOWN)) return DOWN;
return NONE;
}
//sterowanie full group
void Full(int wtrysk, int obroty1)
{
analogWrite(PinWtr1, 255); //Stan wysoki na mosfet
analogWrite(PinWtr2, 255); //Stan wysoki na mosfet
analogWrite(PinWtr3, 255); //Stan wysoki na mosfet
analogWrite(PinWtr4, 255); //Stan wysoki na mosfet
delayMicroseconds(wtrysk); //Odczekanie na dawkowanie wtrysku
analogWrite(PinWtr1, 0); //Stan niski na mosfet
analogWrite(PinWtr2, 0); //Stan niski na mosfet
analogWrite(PinWtr3, 0); //Stan niski na mosfet
analogWrite(PinWtr4, 0); //Stan niski na mosfet
delayMicroseconds(obroty1-wtrysk); //Odczekanie czasu na obrot walu odjac czas wtrysku benzyny np. 120ms = 1000obr
}
//sterowanie sekwencyjne
void Sekwencja(int wtrysk, int obroty2, int zapetl)
{
for (int i=0 ; i < 4 ; i++) {
analogWrite(PinWtr[i], 255);
delayMicroseconds(wtrysk);
analogWrite(PinWtr[i], 0);
}
delayMicroseconds(obroty2-wtrysk);
}
Ps. Błagam bo już mnie męczy co zrobiłem nie tak. Zawiesza się w losowych momentach.