Keresés

Ú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

  • gordonfreemN

    addikt

    válasz Tankblock #17729 üzenetére

    Ha jól értem ezt a #define-t akkor ez annyi, hogy kevesebb program memóriát használ fel ezért lenne nekem jobb?
    Az EEPROM csak akkor ír ha változik, egyébként nem. Az update vizsgál és csak ha van változás, akkor ír.
    De egyébként lehetne úgy is, hogy teszek rá egy if ágat és csak akkor léptetem bele ha volt gombnyomás így a loop nem hajtaná végre minden ciklusban a parancsot.

    Nem sok időm van a C++-ra most, utolsó félévem következik plusz államvizsga (nem programozásból :) ) de köszi a tippet, észben fogom tartani, ha lesz kapacitás, elkezdem olvasgatni a témát. :R Személy szerint a Python jobban megtetszett a C mellett. Azt nem tudom piacképes-e, illetve abból mit tudok majd felépíteni a későbbiekben, de ezeket amúgy inkább csak érintőleges tanultuk. Épp ezért kezdtem el arduino-zni, hogy ne vesszen az a kevéske tudás sem.

    Viszont érdekelne ez az interrupt-os téma. Ebben tudsz néhány mondattal segíteni még, hogy hogyan is gondoltad? Akár egy egyszerű de hasonló példán keresztül, mint amit feltettem (abból egy részlet mondjuk).

    Egy portra nem bírom tenni, mert nincsenek összerendelve a ledek és a be/kimenetek fizikailag, a kettő közt a program teremt kapcsolatot. Arra gondolok, hogy míg a SET LED kapcsolja a bemenetet is, addig a kimenetet is meg még egy áramkör váltást is kezel. Vagy félre értettelek?

    Ami lemaradt az előző hsz-emből, arduino uno-ról van szó. Bár ez lehet egyértelmű volt

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