Hirdetés

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

  • gordonfreemN

    addikt

    Sziasztok. Próbálkozok az első programom megírásával. Tulajdonképp működik, de azért közszemlére teszem, lehet e bármit elegánsabban megoldani.


    #include <EEPROM.h>
    const int mode_led1 = A2;
    const int mode_led2 = A3;
    const int mode_led3 = A4;
    const int set_led1 = 11;
    const int set_led2 = 12;
    const int set_led3 = 13;

    const int in_relay1 = 4;
    const int in_relay2 = 5;
    const int in_relay3 = 6;
    const int out_relay1 = 7;
    //const int out_relay2 = 8;
    const int cb_relay1 = 9;
    //const int cb_relay2 = 10;

    const int reset_relay_cb = 1;
    const int reset_relay_out = 2;
    const int reset_relay_in = 3;

    const int button_m = A0; //mode gomb
    const int button_s = A1; //set gomb
    bool buttonstate_m;
    bool buttonstate_s;
    bool lastbuttonstate_m;
    bool lastbuttonstate_s;

    byte vmod;
    byte vset;
    byte vset_in;
    byte vset_out;
    byte vset_cb;
    unsigned long timer;

    void setup()
    {
      //Serial.begin(9600);
      pinMode(mode_led1, OUTPUT);
      pinMode(mode_led2, OUTPUT);
      pinMode(mode_led3, OUTPUT);
      pinMode(set_led1, OUTPUT);
      pinMode(set_led2, OUTPUT);
      pinMode(set_led3, OUTPUT);
      pinMode(in_relay1, OUTPUT);
      pinMode(in_relay2, OUTPUT);
      pinMode(in_relay3, OUTPUT);
      pinMode(out_relay1, OUTPUT);
      //pinMode(out_relay2, OUTPUT);
      pinMode(cb_relay1, OUTPUT);
      //pinMode(cb_relay2, OUTPUT);
      pinMode(reset_relay_in, OUTPUT);
      pinMode(reset_relay_out, OUTPUT);
      pinMode(reset_relay_cb, OUTPUT);
      pinMode(button_m, INPUT);
      pinMode(button_s, INPUT);
      buttonstate_m = 1;
      buttonstate_s = 1;
      lastbuttonstate_m = 1;
      lastbuttonstate_s = 1;
      digitalWrite(set_led1, 1);
      digitalWrite(set_led2, 1);
      digitalWrite(set_led3, 1);
      digitalWrite(mode_led1, 1);
      digitalWrite(mode_led2, 1);
      digitalWrite(mode_led3, 1);
      delay(500);
      vmod = EEPROM.read(0); //"mode" tárolt értéket a vmod változóba ír
      vset_in = EEPROM.read(1); //"set_in" tárolt értéket a vset változóba ír
      vset_out = EEPROM.read(2); //"set_out" tárolt értéket a vset változóba ír
      vset_cb = EEPROM.read(3); //"set_out" tárolt értéket a vset változóba ír
      
    //az eeprom vmod, vset_in stb tartalom legelőször 255 lesz, ha e változók eepromtartalma nem 0,1 vagy 2, akkor legyen 0
      if ((vmod < 0) || (vmod > 2)) {vmod = 0;}
      if ((vset_in < 0) || (vset_in > 2)) {vset_in = 0;}
      if ((vset_out < 0) || (vset_out > 1)) {vset_out = 0;}
      if ((vset_cb < 0) || (vset_cb > 1)) {vset_cb = 0;}
    //bekapcsoláskor a ki-be és schematik választók (relék) beállítása az eltárolt értékre-----------------------------------------------
      if (vset_in == 0) {
          digitalWrite(in_relay1, 1);
          digitalWrite(in_relay2, 0);
          digitalWrite(in_relay3, 0); 
          digitalWrite(reset_relay_in, 0);
          delay(20);
          digitalWrite(reset_relay_in, 1);
      }
      if (vset_in == 1) {
          digitalWrite(in_relay1, 0);
          digitalWrite(in_relay2, 1);
          digitalWrite(in_relay3, 0);
          digitalWrite(reset_relay_in, 0);
          delay(20);
          digitalWrite(reset_relay_in, 1); 
      }
      if (vset_in == 2) {
          digitalWrite(in_relay1, 0);
          digitalWrite(in_relay2, 0);
          digitalWrite(in_relay3, 1);
          digitalWrite(reset_relay_in, 0);
          delay(20);
          digitalWrite(reset_relay_in, 1);  
      }
      if (vset_out == 0) {
          digitalWrite(out_relay1, 1);
          digitalWrite(reset_relay_out, 0);
          delay(20);
          digitalWrite(reset_relay_out, 1); 
      }
      if (vset_out == 1) {
          digitalWrite(out_relay1, 0);
          digitalWrite(reset_relay_out, 0);
          delay(20);
          digitalWrite(reset_relay_out, 1); 
      }
      if (vset_cb == 0) {
          digitalWrite(cb_relay1, 1);
          digitalWrite(reset_relay_cb, 0);
          delay(20);
          digitalWrite(reset_relay_cb, 1); 
      }
      if (vset_cb == 1) {
          digitalWrite(cb_relay1, 0);
          digitalWrite(reset_relay_cb, 0);
          delay(20);
          digitalWrite(reset_relay_cb, 1); 
      }
      timer = 0;
      
    }
    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
          {
            vmod++; //növelje vmod változó értékét eggyel
            timer = millis(); //timer változó legyen millis aktuális értékével feltöltve
          }
      }
      switch (vmod) {
        case 0: //ha értéke null
          digitalWrite(mode_led1, 1);
          digitalWrite(mode_led2, 0);
          digitalWrite(mode_led3, 0);
          break;
        case 1: //ha értéke egy
          digitalWrite(mode_led1, 0);
          digitalWrite(mode_led2, 1);
          digitalWrite(mode_led3, 0);
          break;
        case 2: //ha értéke kettő
          digitalWrite(mode_led1, 0);
          digitalWrite(mode_led2, 0);
          digitalWrite(mode_led3, 1);
          break;
        default: //ha értéke bármi más mint az előzőek
          vmod = 0; //akkor vmod értéke legyen null
          break; 
      }
      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(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(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(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(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(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(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(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 működése:

    Ez egy be és kimenetválasztós előerősítő lenne majd.
    vmod kiválasztja, hogy be vagy kimenet
    vset a be vagy kimeneten belül kiválasztja, hogy melyik (0,1,2 ami pl be esetén hasamraütök, TV, CD, PC).
    nem szeretném, hogy elfelejtse a beállított értékeket kikapcsolás után, mivel nem szeretnék minden bekapcsolást azzal kezdeni, hogy beállítom a be és kimeneteket amiket épp használnék - ezért az eepromos huncutság.
    Illetve amikor beállítom a bemenetet, majd a kimenetet, aztán mégis visszaléptetem a mod-dal a bemeneti választásra, akkor a visszajelző LED (digitalwrite-ok a switch-ben) a bemenet aktuális allapotát jelezze, ne pedig maradjon ott, ahova a kimenetkor állítottam.

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