Witam wszystkich, chciałbym się zapytać czy jest mi ktoś w stanie pomóc z kodem, który według mnie powinien działać, lecz niestety w połowie wykonania case'ów program przestaje działać do momentu funkcji resetującej. Chodzi o to, aby po uruchomieniu programu moduł pomiaru prądu ACS712 30A mierzył dany prąd i wyświetlał wartość na wyświetlaczu LCD 4x20 (ta część kodu działa) oraz przy wykorzystaniu przekaźnika 6 kanałowego po odpowiednim czasie zapalał parami żarówki (przez 10 sekund - zapalona 1 i 2 żarówka, wyłączenie żarówek, na następne 10 sekund zapalać kolejne dwie czyli 3 i 4, wyłączyć je oraz zapalić 5 i 6 i wyłączyć. Ostatnim krokiem programu jest zapalenie wszystkich zarówek i analogicznie zgaszenie ich po 10 sekundach. Program na delay działa, lecz niestety pomiary występują tylko po wykonaniu całej pętli loop. Program napisany na case zmienia to działanie i resetuje program po 51s, lecz niestety w momencie zapalenia 5 i 6 żarówki w serial monitorze występują tylko pomiary prądu i brakuje kroku wyłącz 5 i 6 zarowke oraz calego dotyczącego wszystkich żarówek, po czym resetuje sie zgodnie po 51 sekundach. Czy ktos jest w stanie mi pomoc i podpowiedziec dlaczego program nie działa w 100% dobrze? Kod załączam w załączniku oraz na samym końcu postu.
Działanie wg. serial monitora:
Zarowki wylaczone
Amps = 1.406
Zarowki 1 i 2 zapalone.
Amps = 1.258
Amps = 1.258
Amps = 1.184
Amps = 1.184
Amps = 1.184
Zarowki 1 i 2 zgaszone.
Amps = 1.332
Zarowki 3 i 4 zapalone.
Amps = 1.184
Amps = 1.258
Amps = 1.184
Amps = 1.184
Amps = 1.110
Zarowki 3 i 4 zgaszone.
Amps = 1.258
Zarowki 5 i 6 zapalone.
Amps = 1.184
Amps = 1.258
Amps = 1.258
Amps = 1.184
Amps = 1.110
Amps = 1.258
Amps = 1.258
Amps = 1.332
Amps = 1.258
Amps = 1.184
Amps = 1.258
Amps = 1.258
Czas zresetowany.
KOD:
#include &tArduino.h&t
#include &tWire.h&t
#include &tLiquidCrystal_I2C.h&t
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int zarowka1 = 7;
const int zarowka2 = 6;
const int zarowka3 = 5;
const int zarowka4 = 4;
const int zarowka5 = 3;
const int zarowka6 = 2;
const int analogIn = A0;
int mVperAmp = 66;
int RawValue = 0;
int ACSoffset = 2500;
double Voltage = 0;
double Amps = 0;
unsigned long ostatniPomiar = 0;
const int czasPomiarowy = 2000;
unsigned long zapamietanyCzas = 0;
unsigned long aktualnyCzas = 0;
const int wylacz = 2000;
const int wlacz12 = 3000;
const int wylacz12 = 13000;
const int wlacz34 = 15000;
const int wylacz34 = 25000;
const int wlacz56 = 27000;
const int wylacz56 = 37000;
const int wlacz123456 = 39000;
const int wylacz123456 = 49000;
unsigned long resetInterval = 51000;
unsigned long startTime = 0;
enum StanZarowek {
WYLACZONE,
WLACZ_ZAROWKI_12,
WYLACZ_ZAROWKI_12,
WLACZ_ZAROWKI_34,
WYLACZ_ZAROWKI_34,
WLACZ_ZAROWKI_56,
WYLACZ_ZAROWKI_56,
WLACZ_ZAROWKI_123456,
WYLACZ_ZAROWKI_123456
};
StanZarowek aktualnyStan = WYLACZONE;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.begin(20, 4);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Pomiar prądu i napięcia!");
startTime = millis();
pinMode(zarowka1, OUTPUT);
pinMode(zarowka2, OUTPUT);
pinMode(zarowka3, OUTPUT);
pinMode(zarowka4, OUTPUT);
pinMode(zarowka5, OUTPUT);
pinMode(zarowka6, OUTPUT);
}
void loop() {
aktualnyCzas = millis();
unsigned long elapsedTime = aktualnyCzas - startTime;
// POMIAR PRĄDU:
if (aktualnyCzas - ostatniPomiar &t= czasPomiarowy) {
ostatniPomiar = aktualnyCzas;
RawValue = analogRead(analogIn);
Voltage = (RawValue / 1024.0) * 5000;
Amps = ((Voltage - ACSoffset) / mVperAmp);
Serial.print("\t Amps = ");
Serial.println(Amps, 3);
displayCurrent(Amps);
}
// ZAPALANIE ŻARÓWEK:
switch (aktualnyStan) {
case WYLACZONE:
if (elapsedTime &t= WYLACZONE) {
digitalWrite(zarowka1, HIGH);
digitalWrite(zarowka2, HIGH);
digitalWrite(zarowka3, HIGH);
digitalWrite(zarowka4, HIGH);
digitalWrite(zarowka5, HIGH);
digitalWrite(zarowka6, HIGH);
Serial.println("Zarowki wylaczone");
aktualnyStan = WLACZ_ZAROWKI_12;
}
break;
case WLACZ_ZAROWKI_12:
if (elapsedTime &t= wlacz12) {
digitalWrite(zarowka1, LOW);
digitalWrite(zarowka2, LOW);
Serial.println("Zarowki 1 i 2 zapalone.");
aktualnyStan = WYLACZ_ZAROWKI_12;
}
break;
case WYLACZ_ZAROWKI_12:
if (elapsedTime &t= wylacz12) {
digitalWrite(zarowka1, HIGH);
digitalWrite(zarowka2, HIGH);
Serial.println("Zarowki 1 i 2 zgaszone.");
aktualnyStan = WLACZ_ZAROWKI_34;
}
break;
case WLACZ_ZAROWKI_34:
if (elapsedTime &t= wlacz34) {
digitalWrite(zarowka3, LOW);
digitalWrite(zarowka4, LOW);
Serial.println("Zarowki 3 i 4 zapalone.");
aktualnyStan = WYLACZ_ZAROWKI_34;
}
break;
case WYLACZ_ZAROWKI_34:
if (elapsedTime &t= wylacz34) {
digitalWrite(zarowka3, HIGH);
digitalWrite(zarowka4, HIGH);
Serial.println("Zarowki 3 i 4 zgaszone.");
aktualnyStan = WLACZ_ZAROWKI_56;
}
break;
case WLACZ_ZAROWKI_56:
if (elapsedTime &t= wlacz56) {
digitalWrite(zarowka5, LOW);
digitalWrite(zarowka6, LOW);
Serial.println("Zarowki 5 i 6 zapalone.");
aktualnyStan = WYLACZ_ZAROWKI_56;
}
break;
case WYLACZ_ZAROWKI_56:
if (elapsedTime &t= wylacz56) {
digitalWrite(zarowka5, HIGH);
digitalWrite(zarowka6, HIGH);
Serial.println("Zarowki 5 i 6 zgaszone.");
aktualnyStan = WLACZ_ZAROWKI_123456;
}
break;
case WLACZ_ZAROWKI_123456:
if (elapsedTime &t= wlacz123456) {
digitalWrite(zarowka1, LOW);
digitalWrite(zarowka2, LOW);
digitalWrite(zarowka3, LOW);
digitalWrite(zarowka4, LOW);
digitalWrite(zarowka5, LOW);
digitalWrite(zarowka6, LOW);
Serial.println("Wszystkie zarowki zapalone.");
aktualnyStan = WYLACZ_ZAROWKI_123456;
}
break;
case WYLACZ_ZAROWKI_123456:
if (elapsedTime &t= wylacz123456) {
digitalWrite(zarowka1, HIGH);
digitalWrite(zarowka2, HIGH);
digitalWrite(zarowka3, HIGH);
digitalWrite(zarowka4, HIGH);
digitalWrite(zarowka5, HIGH);
digitalWrite(zarowka6, HIGH);
Serial.println("Wszystkie zarowki zgaszone.");
aktualnyStan = WYLACZONE;
}
break;
}
// RESET MILLIS CO 51 SEKUND:
if (elapsedTime &t= resetInterval) {
startTime = aktualnyCzas;
Serial.println("Czas zresetowany.");
aktualnyStan = WYLACZONE;
}
delay(10); // Dodaj krótką pauzę dla stabilności
}
// WYŚWIETLANIE PRĄDU NA LCD 4x20:
void displayCurrent(float Amps) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Prad: ");
lcd.print(Amps);
lcd.print(" A");
}
Działanie wg. serial monitora:
Zarowki wylaczone
Amps = 1.406
Zarowki 1 i 2 zapalone.
Amps = 1.258
Amps = 1.258
Amps = 1.184
Amps = 1.184
Amps = 1.184
Zarowki 1 i 2 zgaszone.
Amps = 1.332
Zarowki 3 i 4 zapalone.
Amps = 1.184
Amps = 1.258
Amps = 1.184
Amps = 1.184
Amps = 1.110
Zarowki 3 i 4 zgaszone.
Amps = 1.258
Zarowki 5 i 6 zapalone.
Amps = 1.184
Amps = 1.258
Amps = 1.258
Amps = 1.184
Amps = 1.110
Amps = 1.258
Amps = 1.258
Amps = 1.332
Amps = 1.258
Amps = 1.184
Amps = 1.258
Amps = 1.258
Czas zresetowany.
KOD:
#include &tArduino.h&t
#include &tWire.h&t
#include &tLiquidCrystal_I2C.h&t
LiquidCrystal_I2C lcd(0x27, 20, 4);
const int zarowka1 = 7;
const int zarowka2 = 6;
const int zarowka3 = 5;
const int zarowka4 = 4;
const int zarowka5 = 3;
const int zarowka6 = 2;
const int analogIn = A0;
int mVperAmp = 66;
int RawValue = 0;
int ACSoffset = 2500;
double Voltage = 0;
double Amps = 0;
unsigned long ostatniPomiar = 0;
const int czasPomiarowy = 2000;
unsigned long zapamietanyCzas = 0;
unsigned long aktualnyCzas = 0;
const int wylacz = 2000;
const int wlacz12 = 3000;
const int wylacz12 = 13000;
const int wlacz34 = 15000;
const int wylacz34 = 25000;
const int wlacz56 = 27000;
const int wylacz56 = 37000;
const int wlacz123456 = 39000;
const int wylacz123456 = 49000;
unsigned long resetInterval = 51000;
unsigned long startTime = 0;
enum StanZarowek {
WYLACZONE,
WLACZ_ZAROWKI_12,
WYLACZ_ZAROWKI_12,
WLACZ_ZAROWKI_34,
WYLACZ_ZAROWKI_34,
WLACZ_ZAROWKI_56,
WYLACZ_ZAROWKI_56,
WLACZ_ZAROWKI_123456,
WYLACZ_ZAROWKI_123456
};
StanZarowek aktualnyStan = WYLACZONE;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.begin(20, 4);
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Pomiar prądu i napięcia!");
startTime = millis();
pinMode(zarowka1, OUTPUT);
pinMode(zarowka2, OUTPUT);
pinMode(zarowka3, OUTPUT);
pinMode(zarowka4, OUTPUT);
pinMode(zarowka5, OUTPUT);
pinMode(zarowka6, OUTPUT);
}
void loop() {
aktualnyCzas = millis();
unsigned long elapsedTime = aktualnyCzas - startTime;
// POMIAR PRĄDU:
if (aktualnyCzas - ostatniPomiar &t= czasPomiarowy) {
ostatniPomiar = aktualnyCzas;
RawValue = analogRead(analogIn);
Voltage = (RawValue / 1024.0) * 5000;
Amps = ((Voltage - ACSoffset) / mVperAmp);
Serial.print("\t Amps = ");
Serial.println(Amps, 3);
displayCurrent(Amps);
}
// ZAPALANIE ŻARÓWEK:
switch (aktualnyStan) {
case WYLACZONE:
if (elapsedTime &t= WYLACZONE) {
digitalWrite(zarowka1, HIGH);
digitalWrite(zarowka2, HIGH);
digitalWrite(zarowka3, HIGH);
digitalWrite(zarowka4, HIGH);
digitalWrite(zarowka5, HIGH);
digitalWrite(zarowka6, HIGH);
Serial.println("Zarowki wylaczone");
aktualnyStan = WLACZ_ZAROWKI_12;
}
break;
case WLACZ_ZAROWKI_12:
if (elapsedTime &t= wlacz12) {
digitalWrite(zarowka1, LOW);
digitalWrite(zarowka2, LOW);
Serial.println("Zarowki 1 i 2 zapalone.");
aktualnyStan = WYLACZ_ZAROWKI_12;
}
break;
case WYLACZ_ZAROWKI_12:
if (elapsedTime &t= wylacz12) {
digitalWrite(zarowka1, HIGH);
digitalWrite(zarowka2, HIGH);
Serial.println("Zarowki 1 i 2 zgaszone.");
aktualnyStan = WLACZ_ZAROWKI_34;
}
break;
case WLACZ_ZAROWKI_34:
if (elapsedTime &t= wlacz34) {
digitalWrite(zarowka3, LOW);
digitalWrite(zarowka4, LOW);
Serial.println("Zarowki 3 i 4 zapalone.");
aktualnyStan = WYLACZ_ZAROWKI_34;
}
break;
case WYLACZ_ZAROWKI_34:
if (elapsedTime &t= wylacz34) {
digitalWrite(zarowka3, HIGH);
digitalWrite(zarowka4, HIGH);
Serial.println("Zarowki 3 i 4 zgaszone.");
aktualnyStan = WLACZ_ZAROWKI_56;
}
break;
case WLACZ_ZAROWKI_56:
if (elapsedTime &t= wlacz56) {
digitalWrite(zarowka5, LOW);
digitalWrite(zarowka6, LOW);
Serial.println("Zarowki 5 i 6 zapalone.");
aktualnyStan = WYLACZ_ZAROWKI_56;
}
break;
case WYLACZ_ZAROWKI_56:
if (elapsedTime &t= wylacz56) {
digitalWrite(zarowka5, HIGH);
digitalWrite(zarowka6, HIGH);
Serial.println("Zarowki 5 i 6 zgaszone.");
aktualnyStan = WLACZ_ZAROWKI_123456;
}
break;
case WLACZ_ZAROWKI_123456:
if (elapsedTime &t= wlacz123456) {
digitalWrite(zarowka1, LOW);
digitalWrite(zarowka2, LOW);
digitalWrite(zarowka3, LOW);
digitalWrite(zarowka4, LOW);
digitalWrite(zarowka5, LOW);
digitalWrite(zarowka6, LOW);
Serial.println("Wszystkie zarowki zapalone.");
aktualnyStan = WYLACZ_ZAROWKI_123456;
}
break;
case WYLACZ_ZAROWKI_123456:
if (elapsedTime &t= wylacz123456) {
digitalWrite(zarowka1, HIGH);
digitalWrite(zarowka2, HIGH);
digitalWrite(zarowka3, HIGH);
digitalWrite(zarowka4, HIGH);
digitalWrite(zarowka5, HIGH);
digitalWrite(zarowka6, HIGH);
Serial.println("Wszystkie zarowki zgaszone.");
aktualnyStan = WYLACZONE;
}
break;
}
// RESET MILLIS CO 51 SEKUND:
if (elapsedTime &t= resetInterval) {
startTime = aktualnyCzas;
Serial.println("Czas zresetowany.");
aktualnyStan = WYLACZONE;
}
delay(10); // Dodaj krótką pauzę dla stabilności
}
// WYŚWIETLANIE PRĄDU NA LCD 4x20:
void displayCurrent(float Amps) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Prad: ");
lcd.print(Amps);
lcd.print(" A");
}