Új hozzászólás Aktív témák

  • gordonfreemN

    addikt

    válasz Tankblock #17729 üzenetére

    Lehet rájöttem mire gondoltál, vagy ha nem is, olyan ötletet adtál, amivel megoldottam egy utolsó számomra zavaró jelenséget: bár működőképes volt a panel, mégis ha elég gyorsan nyomkodtam a mode gombot, akkor volt a mode változó 2 értékének 0-ra történő írásakor a ledek váltásában némi késleltetés.
    A következő módosítással sikerült (már csak a loop-ot teszem be, a többi változatlan):
    void loop()
    {
    //vmod beállítása----------------------------------------------------------------------------------------
    buttonstate_m = digitalRead(button_m); //gomb állapot kiolvasása
    if (buttonstate_m != lastbuttonstate_m) //gombnyomás történt? Gomb állapota változott az előzőhöz képest?
    {
    delay(50); //ha történt változás az előző állapothot képest, várj 50ms-ot
    if (buttonstate_m == 0) //ha a gomb nyomva, azaz bemenet értéke alacsony akkor
    {
    if (vmod < 2) {
    vmod++; //növelje vmod változó értékét eggyel
    }
    else {
    vmod = 0;
    }
    timer = millis(); //timer változó legyen millis aktuális értékével feltöltve
    }
    }
    lastbuttonstate_m = buttonstate_m; //gomb előző állapotát írja be a gomb aktuális állapotának
    if ((millis() - timer) > 5000) { //ha millis értéke mínusz timer értéke nagyobb mint 5sec (azaz eltelt 5mp)
    EEPROM.update(0, vmod); //tegye eepromba a vmod változó értékét, ha az változott
    }
    //vset beállítása------------------------------------------------------------------------------------------
    if (vmod == 0) {vset = vset_in;}
    if (vmod == 1) {vset = vset_out;}
    if (vmod == 2) {vset = vset_cb;}
    buttonstate_s = digitalRead(button_s);
    if (buttonstate_s != lastbuttonstate_s)
    {
    delay(50);
    if (buttonstate_s == 0)
    {
    vset++;
    timer = millis();
    }
    }
    switch (vset) {
    case 0:
    digitalWrite(set_led1, 1);
    digitalWrite(set_led2, 0);
    digitalWrite(set_led3, 0);
    break;
    case 1:
    digitalWrite(set_led1, 0);
    digitalWrite(set_led2, 1);
    digitalWrite(set_led3, 0);
    break;
    case 2:
    if (vmod == 0) {
    digitalWrite(set_led1, 0);
    digitalWrite(set_led2, 0);
    digitalWrite(set_led3, 1);}
    else if (vmod == 1 || vmod == 2){vset = 0;}
    break;
    default:
    vset = 0;
    break;
    }
    lastbuttonstate_s = buttonstate_s; //gomb előző állapotát írja be a gomb aktuális állapotának
    //bemenet kiválasztása----------------------------------------------------------------------------------------
    if (vmod == 0 && vset == 0) { //ha vmod nulla, akkor a bemenet beállítása történik és vset_in felveszi az aktuális vset értéket
    vset_in = 0; //bemeneti változó beállítása
    digitalWrite(mode_led1, 1);
    digitalWrite(mode_led2, 0);
    digitalWrite(mode_led3, 0);
    digitalWrite(in_relay1, 1); //bemeneti 1-es relé kiemenet HIGH
    digitalWrite(in_relay2, 0); //bemeneti 2-es relé kiemenet LOW
    digitalWrite(in_relay3, 0); //bemeneti 3-mas relé kiemenet LOW
    if (buttonstate_s == 0) {digitalWrite(reset_relay_in, 0);} //csak ha set gombnyomás történik akkor az 1-es relé resetje LOW
    delay(10);
    if (buttonstate_s == 1) {digitalWrite(reset_relay_in, 1);} //csak ha set gombnyomás befejeződött akkor az 1-es relé resetje HIGH
    }
    if (vmod == 0 && vset == 1) {
    vset_in = 1;
    digitalWrite(mode_led1, 1);
    digitalWrite(mode_led2, 0);
    digitalWrite(mode_led3, 0);
    digitalWrite(in_relay1, 0);
    digitalWrite(in_relay2, 1);
    digitalWrite(in_relay3, 0);
    if (buttonstate_s == 0) {digitalWrite(reset_relay_in, 0);}
    delay(10);
    if (buttonstate_s == 1) {digitalWrite(reset_relay_in, 1);}
    }
    if (vmod == 0 && vset == 2) {
    vset_in = 2;
    digitalWrite(mode_led1, 1);
    digitalWrite(mode_led2, 0);
    digitalWrite(mode_led3, 0);
    digitalWrite(in_relay1, 0);
    digitalWrite(in_relay2, 0);
    digitalWrite(in_relay3, 1);
    if (buttonstate_s == 0) {digitalWrite(reset_relay_in, 0);}
    delay(10);
    if (buttonstate_s == 1) {digitalWrite(reset_relay_in, 1);}
    }
    //kimenet kiválasztása---------------------------------------------------------------------------------------
    if (vmod == 1 && vset == 0) {
    vset_out = 0;
    digitalWrite(mode_led1, 0);
    digitalWrite(mode_led2, 1);
    digitalWrite(mode_led3, 0);
    digitalWrite(out_relay1, 1);
    if (buttonstate_s == 0) {digitalWrite(reset_relay_out, 0);}
    delay(10);
    if (buttonstate_s == 1) {digitalWrite(reset_relay_out, 1);}
    }
    if (vmod == 1 && vset == 1) {
    vset_out = 1;
    digitalWrite(mode_led1, 0);
    digitalWrite(mode_led2, 1);
    digitalWrite(mode_led3, 0);
    digitalWrite(out_relay1, 0);
    if (buttonstate_s == 0) {digitalWrite(reset_relay_out, 0);}
    delay(10);
    if (buttonstate_s == 1) {digitalWrite(reset_relay_out, 1);}
    }
    //áramköri lap kiválasztása-----------------------------------------------------------------------------------
    if (vmod == 2 && vset == 0) {
    vset_cb = 0;
    digitalWrite(mode_led1, 0);
    digitalWrite(mode_led2, 0);
    digitalWrite(mode_led3, 1);
    digitalWrite(cb_relay1, 1);
    if (buttonstate_s == 0) {digitalWrite(reset_relay_cb, 0);}
    delay(10);
    if (buttonstate_s == 1) {digitalWrite(reset_relay_cb, 1);}
    }
    if (vmod == 2 && vset == 1) {
    vset_cb = 1;
    digitalWrite(mode_led1, 0);
    digitalWrite(mode_led2, 0);
    digitalWrite(mode_led3, 1);
    digitalWrite(cb_relay1, 0);
    if (buttonstate_s == 0) {digitalWrite(reset_relay_cb, 0);}
    delay(10);
    if (buttonstate_s == 1) {digitalWrite(reset_relay_cb, 1);}
    }
    //EEPROM írása------------------------------------------------
    if ((millis() - timer) > 5000) {
    EEPROM.update(1, vset_in); //tegye EEPROM-ba a vset_in változó értékét, ha az változott
    EEPROM.update(2, vset_out); //tegye EEPROM-ba a vset_out változó értékét, ha az változott
    EEPROM.update(3, vset_cb); //tegye EEPROM-ba a vset_cb változó értékét, ha az változott
    }
    //--------------------------------------------------------------------------------------------------------
    //Serial.println(buttonstate_s);
    }

    A mode változónál kivettem a switch case-t és egy egyszerű if-el helyettesítettem :R

Új hozzászólás Aktív témák