My int always becomes 0 after the loop ends

I'm working on a one person project for my friends company. It's a selenoid valve controller. I finished the pcb and the components and also assembly. Everything works fine for now but I have a 0 integer problem after every loop.

Using esp32-S3- wroom one of them is N16R8 other one is N8R8 (its not atmel) they are standart at least

1)- my first question is where is the problem why ''bitti'' becomes 0 after the loop?
2)- second question is overflow of millis(), I need minimum of 1 day continuous working. If its 49 days with using ''unsigned long'' then there is no problem.
3)- third question is when I reset the board esp32s3 GPIO 1 and 2 gives highs and lows. Can I block it only with software? ( its uart or USB I think ) They are directly connected to the mosfet gate drivers which is problematic. I can change the pcb layout and pins but just want to learn if it is possible without changing the pcb ( I'm almost drawing the third pcb)

It's a simple project like ''blink without delay'' and I'm controlling only 2 mosfets with 2 inputs that are interrupted. I'm entering one mod and counting the ''bitti'' but it becomes 0 after every time loop starts.

I'm new in the forum also I'm physics graduated not even electronics ( But i trust my hardware knowledge unlike the software which ı used in days of university), also sory for Turkish words and terms.



void setup() { // put your setup code here, to run once:

Serial.println("SETUP LOOP BAŞLADI AMK");
pinMode(14, INPUT); // kontrol giriş 1 delme modu
pinMode(13, INPUT); // kontrol giriş 2  Temizlik modu şu anda aktif çalışıyor.
pinMode(4, INPUT); // 4.pini analog giriş olarak atıyoruz (burdaki pinMode aslında giriş olarak tanımladık bi işe yaradığı yok)
pinMode(5, INPUT); // 5.pini analog giriş olarak atıyoruz (burdaki pinMode aslında giriş olarak tanımladık bi işe yaradığı yok)
pinMode(6, INPUT); // 6.pini analog giriş olarak atıyoruz (burdaki pinMode aslında giriş olarak tanımladık bi işe yaradığı yok)
pinMode(2, OUTPUT); // mosfet çıkış 3
pinMode(1, OUTPUT); // mosfet çıkış 4
pinMode(9, OUTPUT); // yedek serbest pin 
pinMode(10, OUTPUT); // yedek serbest pin 
pinMode(43, OUTPUT); // UART için yedek çıkış RX0
pinMode(44, OUTPUT); // UART için yedek pin TX0
Serial.begin(921600); // USB CDC ON BOOT >> Enabled  and  ESP32-S3DEVMODULE and USB MODE >> Hardware CDC and JTAG // Eğer gerekirse denetim başlatmak için yazdım.

}

void IRAM_ATTR ISR1() { // Enerji 1 den 0 olursa interruptı vur ve bittiyi 0 yapki tekrar başlasın (falling interrupt enerji kesilince şoklama başlatmak için)
digitalWrite(1, LOW); // eğer sağdaki mosfet açıksa kapat
digitalWrite(2, LOW); // eğer soldaki mosfer açıksa kapat
int reset = 1; // reset atsın
}
void IRAM_ATTR ISR2() { // Enerji 0 dan 1 olursa interruptı vur şoklama dursun ve bittiyi 0 yap ki enerji kesilirse tekrar şoklama başlasın (rising)
digitalWrite(1, LOW); // eğer sağdaki mosfet açıksa kapat
digitalWrite(2, LOW); // eğer soldaki mosfer açıksa kapat
int reset = 1; // reset atsın
}
void IRAM_ATTR ISR3() { // Temizlik modu değiştirilirse eğer reset atılsın)
digitalWrite(1, LOW); // eğer sağdaki mosfet açıksa kapat
digitalWrite(2, LOW); // eğer soldaki mosfer açıksa kapat
int reset = 1; // reset atsın
}

void loop() { // put your main code here, to run repeatedly:

attachInterrupt (digitalPinToInterrupt (13), ISR1, FALLING); // eğer 13, delgi pini LOW olursa reset atacak
attachInterrupt (digitalPinToInterrupt (13), ISR2, RISING); // eğer 13 delgi pini HIGH olursa reset atacak
attachInterrupt (digitalPinToInterrupt (14), ISR2, CHANGE); // eğer 14 temizlik pini değişir ise reset atacak

int VR_1 = analogRead (4); // 0 ile 4095 arasında bir sayı gelecek VR_1=sayı (en soldaki trimpot)
int VR_2 = analogRead (5); // 0 ile 4095 arasında bir sayı gelecek VR_2=sayı (ortadaki trimpot)
int VR_3 = analogRead (6); // 0 ile 4095 arasında bir sayı gelecek VR_3=sayı (en sağdaki trimpot)
int ZAMAN_1 = ((VR_1/100) + 80); //en soldaki trimpotdan gelen sayıyı burada süreye çeviriyoruz (min 80ms, max 121ms normal=100ms)
int ZAMAN_2 = ((VR_2/4) + 1500); //ortadaki trimpotdan gelen sayıyı burada süreye çeviriyoruz (min 1500ms, max 2500ms normal=2200ms)
int ZAMAN_3 = ((VR_3*5) + 10000); //en sağdaki trimpotdan gelen sayıyı burada süreye çeviriyoruz (min 10000ms, max 30000ms normal=20500ms)
int enerji = digitalRead (14); // ilk giriş pini enerji veren pin
int temizlik = digitalRead (13); // ikinci giriş pini temizlik modu pini 3. en sağdaki trimpot çalışacak ve yaklaşık 20sn de bir 1.pin high olduğunda delme yaparken valfleri açacak.
int bitti = bitti; // eğer şoklama bittiyse bittinin 1 olması bitmediyse 0 olması lazım, kalan değerinin aynısı değişmeden kalacak.
int reset = reset;
unsigned long ensonhavaon; // enson staticten alınıyor daha sonra alınamıyor zaten
unsigned long ensonhavaoff; // enson staticten alınıyor daha sonra alınamıyor zaten
unsigned long ensonmillis = (millis());
unsigned long ensonstatic = ensonmillis;
unsigned long fark;

Serial.println ("--------------------------------------");
Serial.println ("ELKADiR LOOP BAŞLADI");
Serial.println ("ELKADiR");
Serial.println ("BiTTi'NiN KALANI");
Serial.println (bitti);

if (reset == 1) { // 1.MOD reset modu, reseti interrupt atacak sonra hemen 0 yapmak lazım
    reset = 0;
    digitalWrite (1, LOW); // eğer sağdaki mosfet açıksa kapat
    digitalWrite (2, LOW); // eğer soldaki mosfet açıksa kapat
    bitti = 0; // Şoklamayı yeniden başlatalım diye şoklanma adedini sıfırladık
    Serial.println ("1.mod reset atıldı");
}
else if (enerji == LOW && temizlik == LOW && bitti >= 20) { // 2.MOD şoklama bitti modu sadece bekleyecek. yapacak hiç bişey yok, delgi gelirse reset
    digitalWrite (1, LOW); // eğer sağdaki mosfet açıksa kapat
    digitalWrite (2, LOW); // eğer soldaki mosfet açıksa kapat
    Serial.println ("2.mod şoklama bitti dinleniyor");
}
else if (enerji == HIGH && temizlik == LOW) { // 3.MOD delgi modu, yapacak bişey yok delgi durana kadar devam, delgi durursa reset
    digitalWrite (1, LOW); // eğer sağdaki mosfet açıksa kapat
    digitalWrite (2, LOW); // eğer soldaki mosfet açıksa kapat
    Serial.println ("3.mod delgi modunda bekliyor");
}
else if (enerji == HIGH && temizlik == HIGH) { // 4.MOD temizlik modu, delgideyken temizle ort20sn
    Serial.println ("4.mod temizliğe başlandı");
    if (bitti == 0) { // 4.MOD-a temizliğe başla
        digitalWrite (1, LOW); // Sayım için zaten kapalı mosfeti kapattık.
        ensonhavaoff = ensonstatic;
        bitti = 1;
        Serial.println ("4.mod 1.aşama bitti");
    }
    else if (bitti == 1) { // 4.MOD-b 1i şokla
        fark = (ensonmillis - ensonhavaoff);
        if (fark > ZAMAN_3) {
            digitalWrite (1, HIGH); // Sayım için ilk mosfeti açtık
            ensonhavaon = ensonstatic;
            bitti = 2;
            Serial.println ("4.mod 2.aşama bitti");
        }
    }
    else if (bitti == 2) { // 4.MOD-c 1i kapat
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite (1, LOW);
            ensonhavaoff = ensonstatic; // Sayımla ilk mosfet kapandı
            bitti = 3;
            Serial.println ("4.mod 3.aşama bitti");
        }
    }
    else if (bitti == 3) { // 4.MOD-d 2i şokla
        fark = (ensonmillis - ensonhavaoff);
        if (fark > ZAMAN_3) {
            digitalWrite (2, HIGH);
            ensonhavaon = ensonstatic; // Sayımla ikinci mosfeti açtık
            bitti = 4;
            Serial.println ("4.mod 4.aşama bitti");
        }
    }
    else if (bitti == 4) { // 4.MOD-e 2i kapat
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite (2, LOW);
            bitti = 0;
            Serial.println ("4.mod 4.aşama bitti bu son aşamaydı");
        }
    }
}
else if (enerji == LOW && bitti < 20) { // 5.MOD ŞOKLAMA MODU - ŞOKLAMA ŞİMDİ BAŞLIYORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
    Serial.println ("5.mod şoklama döngüsüne girildi");
    if (bitti == 0) { // 5.MOD ŞOKLAMA 1.adım
        digitalWrite (1, HIGH); // Sayım için ilk mosfeti açtık
        ensonhavaon = ensonstatic;
        bitti = 1;
        Serial.println ("5.mod şoklama başladı 1.adım bitti");
    }
    else if (bitti == 1) { // 5.MOD ŞOKLAMA 2.adım
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite (1, LOW); // Sayımla ilk mosfet kapandı
            ensonhavaoff = ensonstatic; 
            bitti = 2;
            Serial.println ("5.mod şoklama başladı 2.adım bitti");
        }
    }
    else if (bitti == 2) {
        fark = (ensonmillis - ensonhavaoff);
        if (fark > ZAMAN_2) {
            digitalWrite (2, HIGH); // Sayımla ikinci mosfeti açtık
            ensonhavaon = ensonstatic;
            bitti = 3;
            Serial.println ("5.mod şoklama başladı 3.adım bitti");
        }
    }
    else if (bitti == 3) {
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite (2, LOW); // Sayımla ikinci mosfeti kapattık
            ensonhavaoff = ensonstatic;
            bitti = 4;
            Serial.println ("5.mod şoklama başladı 4.adım bitti");
        }
    }
    else if (bitti == 4) {
        fark = (ensonmillis - ensonhavaoff);
        if (fark > ZAMAN_2) {
            digitalWrite (1, HIGH); // Sayım için ilk mosfeti açtık
            ensonhavaon = ensonstatic;
            bitti = 5;
            Serial.println ("5.mod şoklama başladı 5.adım bitti");
        }
    }
    else if (bitti == 5) {
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite (1, LOW); // Sayımla ilk mosfet kapandı
            ensonhavaoff = ensonstatic; 
            bitti = 6;
            Serial.println ("5.mod şoklama başladı 6.adım bitti");
        }
    }
    else if (bitti == 6) {
        fark = (ensonmillis - ensonhavaoff);
        if (fark > ZAMAN_2) {
            digitalWrite (2, HIGH); // Sayımla ikinci mosfeti açtık
            ensonhavaon = ensonstatic; 
            bitti = 7;
            Serial.println ("5.mod şoklama başladı 7.adım bitti");
        }
    }
    else if (bitti == 7) {
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite (2, LOW); // Sayımla ikinci mosfeti kapattık
            ensonhavaoff = ensonstatic;
            bitti = 8;
            Serial.println ("5.mod şoklama başladı 8.adım bitti");
        }
    }
    else if (bitti == 8) {
        fark = (ensonmillis - ensonhavaoff);
        if (fark > ZAMAN_2) {
            digitalWrite (1, HIGH); // Sayım için ilk mosfeti açtık
            ensonhavaon = ensonstatic;
            bitti = 9;
            Serial.println ("5.mod şoklama başladı 9.adım bitti");
        }
    }
    else if (bitti = 9) {
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite (1, LOW); // Sayımla ilk mosfet kapandı
            ensonhavaoff = ensonstatic; 
            bitti = 10;
            Serial.println ("5.mod şoklama başladı 10.adım bitti");
        }
    }
    else if (bitti = 10) {
        fark = (ensonmillis - ensonhavaoff);
        if (fark > ZAMAN_2) {
            digitalWrite (2, HIGH); // Sayımla ikinci mosfeti açtık
            ensonhavaon = ensonstatic; 
            bitti = 11;
            Serial.println ("5.mod şoklama başladı 11.adım bitti");
        }
    }
    else if (bitti = 11) {
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite (2, LOW); // Sayımla ikinci mosfeti kapattık
            ensonhavaoff = ensonstatic;
            bitti = 12;
            Serial.println ("5.mod şoklama başladı 12.adım bitti");
        }
    }
    else if (bitti = 12) {
        fark = (ensonmillis - ensonhavaoff);
        if (fark > ZAMAN_2) {
            digitalWrite (1, HIGH); // Sayım için ilk mosfeti açtık
            ensonhavaon = ensonstatic;
            bitti = 13;
            Serial.println ("5.mod şoklama başladı 13.adım bitti");
        }
    }
    else if (bitti = 13) {
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite (1, LOW); // Sayımla ilk mosfet kapandı
            ensonhavaoff = ensonstatic; 
            bitti = 14;
            Serial.println ("5.mod şoklama başladı 14.adım bitti");
        }
    }
    else if (bitti = 14) {
        fark = (ensonmillis - ensonhavaoff);
        if (fark > ZAMAN_2) {
            digitalWrite (2, HIGH); // Sayımla ikinci mosfeti açtık
            ensonhavaon = ensonstatic; 
            bitti = 15;
            Serial.println ("5.mod şoklama başladı 15.adım bitti");
        }
    }
    else if (bitti = 15) {
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite(2, LOW); // Sayımla ikinci mosfeti kapattık
            ensonhavaoff = ensonstatic;
            bitti = 16;
            Serial.println ("5.mod şoklama başladı 16.adım bitti");
        }
    }
    else if (bitti = 16) {
        fark = (ensonmillis - ensonhavaoff);
        if (fark > ZAMAN_2) {
            digitalWrite (1, HIGH); // Sayım için ilk mosfeti açtık
            ensonhavaon = ensonstatic;
            bitti = 17;
            Serial.println ("5.mod şoklama başladı 17.adım bitti");
        }
    }
    else if (bitti = 17) {
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite (1, LOW); // Sayımla ilk mosfet kapandı
            ensonhavaoff = ensonstatic; 
            bitti = 18;
            Serial.println ("5.mod şoklama başladı 18.adım bitti");
        }
    }
    else if (bitti = 18) {
        fark = (ensonmillis - ensonhavaoff);
        if (fark > ZAMAN_2) {
            digitalWrite (2, HIGH); // Sayımla ikinci mosfeti açtık
            ensonhavaon = ensonstatic; 
            bitti = 19;
            Serial.println ("5.mod şoklama başladı 19.adım bitti");
        }
    }
    else if (bitti = 19) {
        fark = (ensonmillis - ensonhavaon);
        if (fark > ZAMAN_1) {
            digitalWrite (2, LOW); // Sayımla ikinci mosfeti kapattık
            ensonhavaoff = ensonstatic;
            bitti = 20;  // Bitti 20 oldu amk
            Serial.println ("5.mod şoklama başladı 20.adım bitti");
        }
    }
}

Serial.println("BiTTi");
Serial.println(bitti);
Serial.println("ensonhavaon");
Serial.println(ensonhavaon);
Serial.println("ensonhavaoff");
Serial.println(ensonhavaoff);
Serial.println("ensonmillis");
Serial.println(ensonmillis);
Serial.println("ensonstatic");
Serial.println(ensonstatic);
Serial.println("FARK");
Serial.println(fark);
Serial.println("ZAMANLAMALAR");
Serial.println(ZAMAN_1);
Serial.println(ZAMAN_2);
Serial.println(ZAMAN_3);
Serial.println("--------------------------------------");
delay(500);

}

These assignments are nonsense.
Also these are local variables, loose theri values on exit of loop().

Same nonsense. The local variable reset is unknown outside the functions.

If a variable shall preserve its value after exit from a function then it has to be static (local) or defined outside the function (global).

1 Like

For global variable I was writing in loop or in setup but now I'm writing above setup, and it worked. Now I will rewrite and test until it compiletely works.

I'm just noob. :smiley:

Thank you [DrDiettrich]

For other questions 2 and 3 if anyone have idea i will be happy

RE: question #2
Yes millis() takes ~49 days before rollover.
If all of the variables used are unsigned long and you are properly using subtraction in your millis() calculations there will never be a problem with rollover

1 Like

in my project there are two pins interrupting
and i just wanted to test both differently
one is tested as change, other one is tested as both rising and falling
both of them works well
u can use three of them also there is HIGH and LOW interrupt trigger
so there are 5 different interrupts and u need to think when and how to interrupt. use the most proper one

yes u can also use separate both rising and falling

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.