Fórum témák

» Több friss téma
Fórum » Arduino
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Lapozás: OK   740 / 839
(#) gordonfreemN válasza Skori hozzászólására (») Jún 26, 2022 /
 
Köszi, jövő héten megnézem (attól függ mikor, hogy mennyire lesznek fárasztó napjaim).
A polaritásváltáshoz sikerült megírnom valami kódfélét, bár szerintem ez elég igénytelen lett, de a célnak megfelel:
  1. if (cm == 0 && cs == 0) { //ha piros/mode=0 akkor zöld/select=0-nél kapcsolja az in relé 1-t
  2.     digitalWrite(in_relay1, 1); //bemeneti 1-es relé kiemenet HIGH
  3.     if (buttonstate2 == 0) {digitalWrite(reset_relay1, 0);} //ha a választógomb LOW akkro az 1-es relé reset is LOW
  4.     delay(50); //vár 50ms-ot
  5.     if (buttonstate2 == 1) {digitalWrite(reset_relay1, 1);} //ha a választógomb HIGH akkro az 1-es relé reset is HIGH
  6.     digitalWrite(in_relay2, 0); //bemeneti 2-es relé kiemenet LOW
  7.     digitalWrite(in_relay3, 0); //bemeneti 3-mas relé kiemenet LOW
  8.   }
  9.   if (cm == 0 && cs == 1) { //ha piros/mode=0 akkor zöld/select=1-nél kapcsolja az in relé 2-t
  10.     digitalWrite(in_relay2, 1);
  11.     if (buttonstate2 == 0) {digitalWrite(reset_relay1, 0);}
  12.     delay(50);
  13.     if (buttonstate2 == 1) {digitalWrite(reset_relay1, 1);}
  14.     digitalWrite(in_relay1, 0);
  15.     digitalWrite(in_relay3, 0);
  16.   }
  17.   if (cm == 0 && cs == 2) { //ha piros/mode=0 akkor zöld/select=2-nél kapcsolja az in relé 3-t
  18.     digitalWrite(in_relay3, 1);
  19.     if (buttonstate2 == 0) {digitalWrite(reset_relay1, 0);}
  20.     delay(50);
  21.     if (buttonstate2 == 1) {digitalWrite(reset_relay1, 1);}
  22.     digitalWrite(in_relay1, 0);
  23.     digitalWrite(in_relay2, 0);
  24.   }


in_relay* az NC7SZ19 egyik bemenete, a reset_relay* a másik.

Így az NC7SZ19 forgatja a polaritást amikor vált, amikor nyugalomban van akkor pedig nincs potenciálkülönbség a két kimenete közt.
Ha nagyon nagy sületlenséget csináltam itt, akkor írjátok meg kérlek
A hozzászólás módosítva: Jún 26, 2022
(#) gordonfreemN hozzászólása Jún 30, 2022 /
 
Üdv!

Az volna a kérdésem, hogy hogyan lehet az, a setup egymás után lefuttatja a kiadott digitalwrite-okat amiből arra következtettem, a mikrovezérlő sorról sorra haladva hajtja végre az utasításokat viszont van egy if, ami sehogy sem akar végrehajtódni időben?
  1. void loop()
  2. {
  3.   buttonstate_m = digitalRead(button_m); //gomb állapot kiolvasása
  4.   if (buttonstate_m != lastbuttonstate_m) //gombnyomás történt? Gomb állapota változott az előzőhöz képest?
  5.   {
  6.     delay(50); //ha történt változás az előző állapothot képest, várj 50ms-ot
  7.     if (buttonstate_m == 0) //ha a gomb nyomva, azaz bemenet értéke alacsony akkor
  8.     {
  9.       vmod++; //növelje vmod változó értékét eggyel, kiindulóérték null
  10.     }
  11.   }  
  12.   switch (vmod) {
  13.     case 0: //ha értéke null
  14.       digitalWrite(mode_led1, 1);
  15.       digitalWrite(mode_led2, 0);
  16.       digitalWrite(mode_led3, 0);
  17.       if (vset != vset_in) {vset == vset_in;}
  18.       break;
  19.     case 1: //ha értéke egy
  20.       digitalWrite(mode_led1, 0);
  21.       digitalWrite(mode_led2, 1);
  22.       digitalWrite(mode_led3, 0);
  23.       break;
  24.     case 2: //ha értéke kettő
  25.       digitalWrite(mode_led1, 0);
  26.       digitalWrite(mode_led2, 0);
  27.       digitalWrite(mode_led3, 1);
  28.       break;
  29.     default: //ha értéke bármi más mint az előzőek
  30.       vmod = 0; //akkor vmod értéke legyen null
  31.       break;
  32.       //Serial.println(vset);
  33.   }
  34.   //Serial.println(vset);
  35.   lastbuttonstate_m = buttonstate_m; //gomb előző állapotát írja be a gomb aktuális állapotának
  36.   EEPROM.update(0, vmod); //tegye eepromba a vmod változó értékét, ha az változott
  37. //---------------------------------------------------------------------------------------------------------
  38.   buttonstate_s = digitalRead(button_s); //gomb állapot kiolvasása
  39.   if (buttonstate_s != lastbuttonstate_s) //gombnyomás történt? Gomb állapota változott az előzőhöz képest?
  40.   {
  41.     delay(50); //ha történt változás az előző állapothot képest, várj 50ms-ot
  42.     if (buttonstate_s == 0) //ha a gomb nyomva, azaz bemenet értéke alacsony akkor
  43.     {
  44.       vset++; //növelje vset változó értékét eggyel, kiindulóérték null
  45.     }
  46.   }
  47.   switch (vset) {
  48.       case 0: //ha értéke null
  49.         digitalWrite(set_led1, 1);
  50.         digitalWrite(set_led2, 0);
  51.         digitalWrite(set_led3, 0);
  52.         break;
  53.       case 1: //ha értéke egy
  54.         digitalWrite(set_led1, 0);
  55.         digitalWrite(set_led2, 1);
  56.         digitalWrite(set_led3, 0);
  57.         break;
  58.       case 2: //ha értéke kettő
  59.         digitalWrite(set_led1, 0);
  60.         digitalWrite(set_led2, 0);
  61.         digitalWrite(set_led3, 1);
  62.         break;
  63.       default: //ha értéke bármi más mint az előzőek
  64.         vset = 0; //akkor vset értéke legyen null
  65.         break;
  66.   }
  67.   lastbuttonstate_s = buttonstate_s; //gomb előző állapotát írja be a gomb aktuális állapotának
  68.   EEPROM.update(1, vset); //tegye eepromba a vset változó értékét, ha az változott
  69. //--------------------------------------------------------------------------------------------------------
  70.   if (vmod == 0 && vset == 0) { //ha mode=0 akkor set=0-nél kapcsolja az in relé 1-t
  71.     vset_in = 0;
  72.     digitalWrite(in_relay1, 1); //bemeneti 1-es relé kiemenet HIGH
  73.     if (buttonstate_s == 0) {digitalWrite(reset_relay_in, 0);} //ha a választógomb LOW akkro az 1-es relé reset is LOW
  74.     delay(50); //vár 50ms-ot
  75.     if (buttonstate_s == 1) {digitalWrite(reset_relay_in, 1);} //ha a választógomb HIGH akkro az 1-es relé reset is HIGH
  76.     digitalWrite(in_relay2, 0); //bemeneti 2-es relé kiemenet LOW
  77.     digitalWrite(in_relay3, 0); //bemeneti 3-mas relé kiemenet LOW

Erről a részről van szó: if (vset != vset_in) {vset == vset_in;}

Értéket a gombbal adok neki.
Ha a vmod értéke mondjuk 0 és a vset értéke is 0, majd vmod értéke 2-nél vset értékét átírom 0-ról 1-re, akkor ha visszalépek a vmod-dal 0-ra, szeretném ha a vset visszaállna szintén 0-ra, azaz arra, amin akkor volt, mikor legutóbb a vmod 0 volt.
A hozzászólás módosítva: Jún 30, 2022
(#) _BiG_ válasza gordonfreemN hozzászólására (») Jún 30, 2022 / 1
 
Mert az értékadás (=) helyett értékvizsgálat van (==), ami végrehajtódik, de annak nincs látszatja itt.
Amúgy a vset értéke mikor lesz kiinduló null? A loop előtt nullázva van?
(#) gordonfreemN válasza _BiG_ hozzászólására (») Jún 30, 2022 /
 
eeprom-ból fogja kiolvasni. Legelső alkalommal majd beállítom, aztán mindig az előző.

Köszi a tippet, nagyon sügér vagyok, még keverem a kettőt...

Visszatérve, hogy mikor lesz nulla. Igazából nem kell, hogy nulla legyen kiinduláskor sem, mindig arra kell beállnia, amire legutóbb be volt állítva. Kivéve az első indulásakor a mikrovezérlő eeprom-ból nem tudom mit fog olvasni, mert abban nem lesz semmi, azaz nem definiált tatalom lesz.
A hozzászólás módosítva: Jún 30, 2022
(#) _BiG_ válasza gordonfreemN hozzászólására (») Jún 30, 2022 / 1
 
De most már talán kevésbé kutyulódik eztán.
(#) gordonfreemN válasza _BiG_ hozzászólására (») Jún 30, 2022 /
 
Sajna így nem működik, valamiért nem a vset-et írja nullára (az előző példánál maradva) hanem a vset_in-t írja inkább át 1-re amit nem igazán értek miért. Már második napja ülök rajta és nem esik le.
A hozzászólás módosítva: Jún 30, 2022
(#) _BiG_ válasza gordonfreemN hozzászólására (») Jún 30, 2022 /
 
Én a vset_in -re egy értékadást láttam, az jóval utána van, ahol nullázva lett (71.sor).
A problémás sorban az történik, ha különböző a vset és a vset_in, akkor a vset_in bemásolódik vset-be. De előtte lehet a vset_in 1 is és a vset 0,2,3...stb, tehát a vset 1 lesz, és nem a vset_in -be íródik 1, hanem abban már benne van. De hol is van előbb állítva? Van inicializálás, vagy csak memóriaszemét van benne?
És mire van használva a vset_in? Sehol máshol nincs az értéke változtatva, csak a 71. sorban.
(#) gordonfreemN válasza _BiG_ hozzászólására (») Jún 30, 2022 /
 
  1. byte vmod;
  2. byte vset;
  3. byte vset_in;
  4.  
  5. void setup()
  6. {
  7.   Serial.begin(9600);
  8.   pinMode(mode_led1, OUTPUT);
  9.   pinMode(mode_led2, OUTPUT);
  10.   pinMode(mode_led3, OUTPUT);
  11.   pinMode(set_led1, OUTPUT);
  12.   pinMode(set_led2, OUTPUT);
  13.   pinMode(set_led3, OUTPUT);
  14.   pinMode(in_relay1, OUTPUT);
  15.   pinMode(in_relay2, OUTPUT);
  16.   pinMode(in_relay3, OUTPUT);
  17.   pinMode(out_relay1, OUTPUT);
  18.   pinMode(out_relay2, OUTPUT);
  19.   pinMode(cb_relay1, OUTPUT);
  20.   pinMode(cb_relay2, OUTPUT);
  21.   pinMode(reset_relay_in, OUTPUT);
  22.   pinMode(reset_relay_out, OUTPUT);
  23.   pinMode(reset_relay_cb, OUTPUT);
  24.   pinMode(button_m, INPUT);
  25.   pinMode(button_s, INPUT);
  26.   buttonstate_m = 1;
  27.   buttonstate_s = 1;
  28.   lastbuttonstate_m = 1;
  29.   lastbuttonstate_s = 1;
  30.  
  31.   vmod = EEPROM.read(0); //"mode" stored value write in the variable
  32.   vset = EEPROM.read(1); //"set" stored value write in the variable
  33.   vset_in = vset;
  34. }
  35. void loop()


Bemásoltam a vonatkozó setup részeket.
Tehát a 71-edik sorban ha vmod=0 és vset is 0 akkor vset_in is nulla ami lényegében a vmod 0-ban beállított vset értéket örökítené meg.
Amikor vmod=2 és vset=1 akkor még nem kell örökíteni, mert majd ha vmod=0-ban működik, akkor ide is megcsinálom ezt. De vset =1(*).
Aztán vmod=0 ismét (a loop elején a gombnyomásfigyelésnél ezt a gombnyomás és annak hatására a v++ okkozza) ekkor a switch belép a case 0-ba és végrehajtja ami ott van, digitalWrite-ok, meg az if feltétele ha teljesül, akkor azt. Mivel előzőleg vset már 1 volt, vset_in pedig 0, úgy gondolom le kéne futnia annak, hogy a vset_in értékét beírja a vset-be.
Ekkor azt várnám, hogy a loop másik felében a vset-nél lévő switch a case 1(*) helyett a case 0-ba lép be, mivel azt a korábbi if (vset != vset_in) {vset == vset_in;} vezérlő struktúra a teljesült feltétel alapján átírta 0-ra.
Ehelyett a vset_in íródik át 1-re.

Bemásoljam egybe az egész programizét? Úgy egyszerűbb lenne?
A hozzászólás módosítva: Jún 30, 2022
(#) _BiG_ válasza gordonfreemN hozzászólására (») Jún 30, 2022 /
 
  1. vset = EEPROM.read(1); //"set" stored value write in the variable
  2.   vset_in = vset;


Itt egyenlővé válik a két érték - emiatt már le se fut az if utáni feltételes ág -, de hogy a vset_in mikor 0? Miután a programban egy helyen ki lett nullázva, de később. Ha már 1, akkor az is marad. Ugyanis van egy vset++, ami ha nulla is volt egyszer valamikor a vset, utána tuti 1 lesz. És ha vset 1, és a vset_in is 1, már nem fut le a kérdéses if.
(#) gordonfreemN válasza _BiG_ hozzászólására (») Jún 30, 2022 /
 
Itt egyenlővé válik a két érték - emiatt már le se fut az if utáni feltételes ág Persze, indítás után még ne vacakoljon ezzel, mert úgyis oda áll be, ahol kikapcsoláskor azaz az eepromban volt. Utánna viszont a vset is és a vmod is felvehet 0,1,2 értékeket (mást nem) és kedvemre állíthatom őket egymáshoz képest. Amit szeretnék, hogy ha a az 0,1 vagy 2 vmod-ot egyszer már beállítottam és ujra rálépek az adott értékűre, akkor a vset álljon vissza arra amin előzőleg volt.
de hogy a vset_in mikor 0? Miután a programban egy helyen ki lett nullázva, de később. Ha már 1, akkor az is marad. arra gondolok, hogy a készülék indításakor még a vset_in a vset értékre áll be, nem kell belépni az if-be. De ha valamikor a vset-nek adok más értéket (például 0 ból lesz 1) a vmod 0 címen akkor a kód végi if-ek írni fogják az adott feltételnek megfelelően a vset_in-t (
  1. if (vmod == 0 && vset == 1) { //ha mode=0 akkor set=0-nél kapcsolja az in relé 1-t
  2.     vset_in = 1;
). Majd ha a vmod 2 értéken vset 0-át állítok be, és a vmod-dal visszalépek vmod 0-ra és a loop ha a sorok végére ér és újra kezdi, akkor már bele kellene futni az ifbe
  1. switch (vmod) {
  2.     case 0: //ha értéke null
  3.       digitalWrite(mode_led1, 1);
  4.       digitalWrite(mode_led2, 0);
  5.       digitalWrite(mode_led3, 0);
  6.       if (vset != vset_in) {vset = vset_in;}
  7.       break;

és a vset_in értékére kellene írnia a vset-et, nem?
Ha már 1, akkor az is marad. Ugyanis van egy vset++, ami ha nulla is volt egyszer valamikor a vset, utána tuti 1 lesz. v++ csak akkor lesz ha gombnyomás történik, switch viszont minden alkalommal amikor változik a vmod vagy vset értéke, lefut.

Fáradok, bocsi, közben javítottam a leírást.
A hozzászólás módosítva: Jún 30, 2022
(#) gordonfreemN válasza gordonfreemN hozzászólására (») Jún 30, 2022 /
 
Kommenteket a kódban nem javítottam, azt ne nézd.
(#) _BiG_ válasza gordonfreemN hozzászólására (») Jún 30, 2022 /
 
Hajjaj...

vset++; //növelje vset változó értékét eggyel, kiindulóérték null

Mitől null? Induláskor eepromból olvasva, és ha ott nem nulla?

Aztán:
if (vmod == 0 && vset == 0) { //ha mode=0 akkor set=0-nél kapcsolja az in relé 1-t
vset_in = 0;

Mi biztosítja, hogy a vmod és a vset egyszerre legyen nulla? Ha valamelyik nem az, akkor a vset_in sose nullázódik, tehát ha 1 van benne, az is marad. Ha az a vset++ épp egyre áll be, akkor az az if ott a rossz értékadással már nem fut le.

Lehet, hogy előbb egy folyamatábrát kéne rajzolni (Jackson-ábra), hogy átlátható legyen a program és az adott folyamat csak ott és úgy történjen meg, ahol épp kell.
(#) gordonfreemN válasza _BiG_ hozzászólására (») Jún 30, 2022 /
 
Mitől null? Induláskor eepromból olvasva, és ha ott nem nulla? igen, itt a komment hibásan maradt. Igazából mindegy, hogy 0,1 vagy 2 az érték, a lényeg, hogy növelje. Az pedig biztos, hogy ezek közül (0,1,2) lesz valamelyik. Mondjuk amikor fel lesz programozva, akkor lehet még érdekes ez, hogy akkor mire áll be, de megírhatom hozzá, hogy ha nem 0,1 vagy 2 az érték, akkor legyen mondjuk 0. Akkor ez meg lenne.
Mondjuk a setupba megírom ezt:
  1. if (vmod != 0 || (1 || 2)) {vmod = 0;}
  2.   if (vset != 0 || (1 || 2)) {vset = 0;}

Na nem ilyen egyszerűen, de mindjárt kitalálom, mert így igen csak nem jó

Mi biztosítja, hogy a vmod és a vset egyszerre legyen nulla? Ha valamelyik nem az, akkor a vset_in sose nullázódik, tehát ha 1 van benne, az is marad. Ha az a vset++ épp egyre áll be, akkor az az if ott a rossz értékadással már nem fut le. a nyomógombok kombinációja. Két nyomógomb van, egyik a vset másik a vmod. Amikor a nyomógombokkal kiválasztom a 0 és 0 értékeket, akkor a feltétel teljesül.
A hozzászólás módosítva: Jún 30, 2022
(#) _BiG_ válasza gordonfreemN hozzászólására (») Jún 30, 2022 /
 
Idézet:
„Na nem ilyen egyszerűen, de mindjárt kitalálom, mert így igen csak nem jó

Hát nagyon nem
Eleve seupban értékvizsgálat, mikor van eeprom? Az eepromot a felprogramozáskor kell a kezdőértékkel betölteni, mert utána az eszköz úgyis módosítgatja. És ezt figyelembe véve írni a programot.

De mi volna a program célja? Azért mondom a Jackson-ábrát, mert nem kódot kéne írni először, hanem algoritmizálni. Utána már egyszerűbb leprogramozni, ha már látszik, hogy pl. ezek a változók miként kell, hogy értéket váltsanak.
(#) gordonfreemN válasza _BiG_ hozzászólására (») Jún 30, 2022 /
 
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.

Eleve seupban értékvizsgálat, mikor van eeprom? Ezzel egyébként mi a gond? Csak hogy ne kövessek el ilyet máskor.
A hozzászólás módosítva: Jún 30, 2022
(#) gordonfreemN válasza _BiG_ hozzászólására (») Jún 30, 2022 /
 
Most jut eszembe, szerintem a switch-ben megadott default-tal kivédtem a 0,1,2-től eltérő értékeket a változóban. Az első, felprogramozás utáni kiolvasás az eepromból lehetne egy nem meghatározott érték, de a változó típusa byte, 0-255 lehet az érték ami belekerül, de ez csak az első gombnyomásig fordulhatna elő. Sőt, ha belép minden alkalommal a switch-be, akkor még gombnyomás sem kell.
A hozzászólás módosítva: Jún 30, 2022
(#) gordonfreemN hozzászólása Júl 2, 2022 /
 
Sziasztok.
Most már működni kezd a dolog. A beállított kombinációkat elmenti. De ha valaki nagyon kedves lenne és nem fáradtság, ha lát benne hibát amit mindenképp javítani kellene, tegye meg legyen kedves és jelez felém. Előre is köszönöm az építő jellegű kritikákat. Ez az első barbárkodásom eddig programozás terén.
  1. #include <EEPROM.h>
  2. const int mode_led1 = A2; //piros led
  3. const int mode_led2 = A3; //piros led
  4. const int mode_led3 = A4; //piros led
  5. const int set_led1 = 11; //zöld led
  6. const int set_led2 = 12; //zöld led
  7. const int set_led3 = 13; //zöld led
  8.  
  9. const int in_relay1 = 4;
  10. const int in_relay2 = 5;
  11. const int in_relay3 = 6;
  12. const int out_relay1 = 7;
  13. const int out_relay2 = 8;
  14. const int cb_relay1 = 9;
  15. const int cb_relay2 = 10;
  16.  
  17. int reset_relay_in = 3;
  18. int reset_relay_out = 2;
  19. int reset_relay_cb = 1;
  20.  
  21. const int button_m = A0; //mode gomb
  22. const int button_s = A1; //set gomb
  23. int buttonstate_m;
  24. int buttonstate_s;
  25. int lastbuttonstate_m;
  26. int lastbuttonstate_s;
  27.  
  28. byte vmod;
  29. byte vset;
  30. byte vset_in;
  31. byte vset_out;
  32. byte vset_cb;
  33. unsigned long timer;
  34.  
  35. void setup()
  36. {
  37.   Serial.begin(9600);
  38.   pinMode(mode_led1, OUTPUT);
  39.   pinMode(mode_led2, OUTPUT);
  40.   pinMode(mode_led3, OUTPUT);
  41.   pinMode(set_led1, OUTPUT);
  42.   pinMode(set_led2, OUTPUT);
  43.   pinMode(set_led3, OUTPUT);
  44.   pinMode(in_relay1, OUTPUT);
  45.   pinMode(in_relay2, OUTPUT);
  46.   pinMode(in_relay3, OUTPUT);
  47.   pinMode(out_relay1, OUTPUT);
  48.   pinMode(out_relay2, OUTPUT);
  49.   pinMode(cb_relay1, OUTPUT);
  50.   pinMode(cb_relay2, OUTPUT);
  51.   pinMode(reset_relay_in, OUTPUT);
  52.   pinMode(reset_relay_out, OUTPUT);
  53.   pinMode(reset_relay_cb, OUTPUT);
  54.   pinMode(button_m, INPUT);
  55.   pinMode(button_s, INPUT);
  56.   buttonstate_m = 1;
  57.   buttonstate_s = 1;
  58.   lastbuttonstate_m = 1;
  59.   lastbuttonstate_s = 1;
  60.   digitalWrite(set_led1, 1);
  61.   digitalWrite(set_led2, 1);
  62.   digitalWrite(set_led3, 1);
  63.   digitalWrite(mode_led1, 1);
  64.   digitalWrite(mode_led2, 1);
  65.   digitalWrite(mode_led3, 1);
  66.   delay(500);
  67.   vmod = EEPROM.read(0); //"mode" tárolt értéket a vmod változóba ír
  68.   vset_in = EEPROM.read(1); //"set_in" tárolt értéket a vset változóba ír
  69.   vset_out = EEPROM.read(2); //"set_in" tárolt értéket a vset változóba ír
  70.   vset_cb = EEPROM.read(3); //"set_in" tárolt értéket a vset változóba ír
  71.   timer = 0;
  72. }
  73. void loop()
  74. {
  75.   buttonstate_m = digitalRead(button_m); //gomb állapot kiolvasása
  76.   if (buttonstate_m != lastbuttonstate_m) //gombnyomás történt? Gomb állapota változott az előzőhöz képest?
  77.   {
  78.     delay(50); //ha történt változás az előző állapothot képest, várj 50ms-ot
  79.     if (buttonstate_m == 0) //ha a gomb nyomva, azaz bemenet értéke alacsony akkor
  80.     {
  81.       vmod++; //növelje vmod változó értékét eggyel
  82.     }
  83.   }
  84.   switch (vmod) {
  85.     case 0: //ha értéke null
  86.       digitalWrite(mode_led1, 1);
  87.       digitalWrite(mode_led2, 0);
  88.       digitalWrite(mode_led3, 0);
  89.       break;
  90.     case 1: //ha értéke egy
  91.       digitalWrite(mode_led1, 0);
  92.       digitalWrite(mode_led2, 1);
  93.       digitalWrite(mode_led3, 0);
  94.       break;
  95.     case 2: //ha értéke kettő
  96.       digitalWrite(mode_led1, 0);
  97.       digitalWrite(mode_led2, 0);
  98.       digitalWrite(mode_led3, 1);
  99.       break;
  100.     default: //ha értéke bármi más mint az előzőek
  101.       vmod = 0; //akkor vmod értéke legyen null
  102.       break;
  103.   }
  104.   lastbuttonstate_m = buttonstate_m; //gomb előző állapotát írja be a gomb aktuális állapotának
  105.   timer = millis();
  106.   if ((millis() - timer) > 5000) {
  107.   EEPROM.update(0, vmod); //tegye eepromba a vmod változó értékét, ha az változott
  108.   }
  109. //---------------------------------------------------------------------------------------------------------
  110.   if (vmod == 0) {if (vset_in != vset) {vset = vset_in;}}
  111.   if (vmod == 1) {if (vset_out != vset) {vset = vset_out;}}
  112.   if (vmod == 2) {if (vset_cb != vset) {vset = vset_cb;}}
  113.   buttonstate_s = digitalRead(button_s); //gomb állapot kiolvasása
  114.   if (buttonstate_s != lastbuttonstate_s) //gombnyomás történt? Gomb állapota változott az előzőhöz képest?
  115.   {
  116.     delay(50); //ha történt változás az előző állapothot képest, várj 50ms-ot
  117.     if (buttonstate_s == 0) //ha a gomb nyomva, azaz bemenet értéke alacsony akkor
  118.     {
  119.       vset++; //növelje vset változó értékét eggyel
  120.     }
  121.   }
  122.   if (vmod == 0) {
  123.   switch (vset) {
  124.       case 0: //ha értéke null
  125.         digitalWrite(set_led1, 1);
  126.         digitalWrite(set_led2, 0);
  127.         digitalWrite(set_led3, 0);
  128.         break;
  129.       case 1: //ha értéke egy
  130.         digitalWrite(set_led1, 0);
  131.         digitalWrite(set_led2, 1);
  132.         digitalWrite(set_led3, 0);
  133.         break;
  134.       case 2: //ha értéke kettő
  135.         digitalWrite(set_led1, 0);
  136.         digitalWrite(set_led2, 0);
  137.         digitalWrite(set_led3, 1);
  138.         break;
  139.       default: //ha értéke bármi más mint az előzőek
  140.         vset = 0; //akkor vset értéke legyen null
  141.         break;
  142.   }
  143.   }
  144.   if (vmod == 1) {
  145.   switch (vset) {
  146.       case 0: //ha értéke null
  147.         digitalWrite(set_led1, 1);
  148.         digitalWrite(set_led2, 0);
  149.         digitalWrite(set_led3, 0);
  150.         break;
  151.       case 1: //ha értéke egy
  152.         digitalWrite(set_led1, 0);
  153.         digitalWrite(set_led2, 1);
  154.         digitalWrite(set_led3, 0);
  155.         break;
  156.       default: //ha értéke bármi más mint az előzőek
  157.         vset = 0; //akkor vset értéke legyen null
  158.         break;
  159.   }
  160.   }
  161.   if (vmod == 2) {
  162.   switch (vset) {
  163.       case 0: //ha értéke null
  164.         digitalWrite(set_led1, 1);
  165.         digitalWrite(set_led2, 0);
  166.         digitalWrite(set_led3, 0);
  167.         break;
  168.       case 1: //ha értéke egy
  169.         digitalWrite(set_led1, 0);
  170.         digitalWrite(set_led2, 1);
  171.         digitalWrite(set_led3, 0);
  172.         break;
  173.       default: //ha értéke bármi más mint az előzőek
  174.         vset = 0; //akkor vset értéke legyen null
  175.         break;
  176.   }
  177.   }
  178.   lastbuttonstate_s = buttonstate_s; //gomb előző állapotát írja be a gomb aktuális állapotának
  179. //-------------------------------------------------------------------------------------------------------
  180.   if (vmod == 0 && vset == 0) { //ha mode=0 akkor set=0-nél kapcsolja az in relé 1-t
  181.     vset_in = 0;
  182.     digitalWrite(in_relay1, 1); //bemeneti 1-es relé kiemenet HIGH
  183.     if (buttonstate_s == 0) {digitalWrite(reset_relay_in, 0);} //ha a választógomb LOW akkro az 1-es relé reset is LOW
  184.     delay(25); //vár 50ms-ot
  185.     if (buttonstate_s == 1) {digitalWrite(reset_relay_in, 1);} //ha a választógomb HIGH akkro az 1-es relé reset is HIGH
  186.     digitalWrite(in_relay2, 0); //bemeneti 2-es relé kiemenet LOW
  187.     digitalWrite(in_relay3, 0); //bemeneti 3-mas relé kiemenet LOW
  188.   }
  189.   if (vmod == 0 && vset == 1) { //ha mode=0 akkor set=1-nél kapcsolja az in relé 2-t
  190.     vset_in = 1;
  191.     digitalWrite(in_relay2, 1);
  192.     if (buttonstate_s == 0) {digitalWrite(reset_relay_in, 0);}
  193.     delay(25);
  194.     if (buttonstate_s == 1) {digitalWrite(reset_relay_in, 1);}
  195.     digitalWrite(in_relay1, 0);
  196.     digitalWrite(in_relay3, 0);
  197.   }
  198.   if (vmod == 0 && vset == 2) { //ha mode=0 akkor set=2-nél kapcsolja az in relé 3-t
  199.     vset_in = 2;
  200.     digitalWrite(in_relay3, 1);
  201.     if (buttonstate_s == 0) {digitalWrite(reset_relay_in, 0);}
  202.     delay(25);
  203.     if (buttonstate_s == 1) {digitalWrite(reset_relay_in, 1);}
  204.     digitalWrite(in_relay1, 0);
  205.     digitalWrite(in_relay2, 0);
  206.   }
  207.   if (vmod == 1 && vset == 0) {
  208.     vset_out = 0;
  209.     digitalWrite(out_relay1, 1);
  210.     if (buttonstate_s == 0) {digitalWrite(reset_relay_out, 0);}
  211.     delay(25);
  212.     if (buttonstate_s == 1) {digitalWrite(reset_relay_out, 1);}
  213.     digitalWrite(out_relay2, 0);
  214.   }
  215.   if (vmod == 1 && vset == 1) {
  216.     vset_out = 1;
  217.     digitalWrite(out_relay2, 1);
  218.     if (buttonstate_s == 0) {digitalWrite(reset_relay_out, 0);}
  219.     delay(25);
  220.     if (buttonstate_s == 1) {digitalWrite(reset_relay_out, 1);}
  221.     digitalWrite(out_relay1, 0);
  222.   }
  223.   if (vmod == 2 && vset == 0) {
  224.     vset_cb = 0;
  225.     digitalWrite(cb_relay1, 1);
  226.     if (buttonstate_s == 0) {digitalWrite(reset_relay_cb, 0);}
  227.     delay(25);
  228.     if (buttonstate_s == 1) {digitalWrite(reset_relay_cb, 1);}
  229.     digitalWrite(cb_relay2, 0);
  230.   }
  231.   if (vmod == 2 && vset == 1) {
  232.     vset_cb = 1;
  233.     digitalWrite(cb_relay2, 1);
  234.     if (buttonstate_s == 0) {digitalWrite(reset_relay_cb, 0);}
  235.     delay(25);
  236.     if (buttonstate_s == 1) {digitalWrite(reset_relay_cb, 1);}
  237.     digitalWrite(cb_relay1, 0);
  238.   }
  239.   timer = millis();
  240.   if ((millis() - timer) > 5000) {
  241.   EEPROM.update(1, vset_in); //tegye eepromba a vset_in változó értékét, ha az változott
  242.   EEPROM.update(2, vset_out); //tegye eepromba a vset_out változó értékét, ha az változott
  243.   EEPROM.update(3, vset_cb); //tegye eepromba a vset_cb változó értékét, ha az változott
  244.   }
  245. //--------------------------------------------------------------------------------------------------------
  246. }

Két dolog még akadt. A millis() függvényt nem bírom működésre sehogy sem. A másik, hogy amikor a kódban a vmod változót léptetem, 0-ról 1-re és 1-ről 2-re gond nélkül együtt váltja a vset-hez és vmod-hoz tartozó kiemeneteket (set_LEDeket), de a vmod 2-ről 0-ra észrevenni kicsi késleltetést a set_LED és mod_LEDek közt. Ennek mi lehet az oka?
A hozzászólás módosítva: Júl 2, 2022
(#) _BiG_ válasza gordonfreemN hozzászólására (») Júl 2, 2022 /
 
A millisnél meg kell adni a függvénynek, hogy hány milliszekundumot késleltessen, paraméter nélkül honnan tudná?
A nullázások más-más programhelyen történnek, közben delay hegyek vannak és feltételvizsgálatok. Milyen összefüggés van a változók állapotának változásában? Muszáj mindegyiket külön vizsgálni, vagy a vmod nullázása húzhatja maga után a vset nullázását? Mert akkor egy feltételi ágba lehet tenni a kettőt (101. sor).
Hirtelen ránézve ezt látom.
(#) _BiG_ válasza gordonfreemN hozzászólására (») Júl 2, 2022 /
 
Amúgy mi lesz a cél, mit kell csinálnia az áramkörnek? Azt olvastam hogy valami be-kimenet kiválasztó, de kicsit részletesebben. Mert csak faragjuk a biteket, de mikor tudjuk, hogy már jó? És mi az a minimum, amivel megy, mert kissé redundánsnak érzem a kódot.
Mik az egyes gombok és ledek, relék funkciója?
A hozzászólás módosítva: Júl 2, 2022
(#) Kera_Will válasza gordonfreemN hozzászólására (») Júl 2, 2022 /
 
Lehet nem is kellene külön külön piros meg zöld ledek.
Lehet elég lenne 1 darab duál led piros/zöld .
A relék tekercseinek a vezérlő bitjei közé kötve, mikor melyik alacsony/magas aszerint világítana adott színnel.Persze a "vasat" nem ismerve lehet elvetélt ötlet.
(#) Skori válasza _BiG_ hozzászólására (») Júl 2, 2022 /
 
Kevered a delay() függvénnyel. A millis() az indulás óta eltelt időt adja vissza ms-ban, és nincs paramétere.
(#) _BiG_ válasza Skori hozzászólására (») Júl 2, 2022 /
 
Oh, valóban eltévedtem
(#) Josi777 válasza gordonfreemN hozzászólására (») Júl 2, 2022 /
 
Szerintem akkor lehetne megállapítani, hogy jól működik-e, ha tudnám, hogy mit kéne csinálnia. De így, hogy nem tudom, ez a kód hibátlan
(#) Jonni válasza Kera_Will hozzászólására (») Júl 2, 2022 /
 
Az nem biztos ,hogy jó mert ha kétszínű ledet használ, és ha mindkét szín egyszerre kapcsol, akkor sárga lesz .
(#) Kera_Will válasza Jonni hozzászólására (») Júl 2, 2022 /
 
Hogy sárga legyen akkor 2 kivezetéses duál led Zöld/Piros nek a lábain portokat felváltva kellene billegtetni gyorsan szem tehetetlenségénél gyorsabban.
pl.: dual led szembekötve piros zöld
A hozzászólás módosítva: Júl 2, 2022
(#) Jonni válasza Kera_Will hozzászólására (») Júl 2, 2022 /
 
Akkor nem egyre gondoltunk.
(#) gordonfreemN válasza Josi777 hozzászólására (») Júl 2, 2022 /
 
Bővebben: Link
Ide leírtam, de ha ez nem elég, akkor tudnom kellene, mit és hogyan fogalmazzak meg neked, hogy világos legyen. Lényegében ebből a gondolatból indult ki a dolog.
Ami még kellhet hozzá, hogy set-reset relékkel működtetem a kapcsolást, a kód végén az if-ek ezt a polaritásforgatást hivatottak megvalósítani.
Mivel működik, inkább csak az érdekel, van-e ami nem etikus, helyes, vagy problémát okozhat esetleg kódolás szempontokat figyelembe véve.
Például olvastam olyat Bővebben: Link, hogy egymás alá lehet pakolni több if vezérlőt, de a másodiktól kezdve mind legyen else if, mert if-ből csak egyet szabad. Ennek ellenére a kód nálam így is működik. Ha nem tudom miért nem szabad, azaz nem értem meg a miértjét, akkor elég nehéz a helyes úton maradni.
Ha inkább csak zavaró a jelenlétem, vagy a kérdéseim azt is elfogadom (persze jó ha értesülök róla, hogy nem kívánt a jelenlét ebben a formában) de akkor jó lenne tudni miért jött létre ez a topik.

Arra a kérdésre, hogy miért nem működik a millis() sem kaptam világos választ, ami most nem számonkérés, inkább csak nem értem, hogy nem kapok egyértelmű információkat, mondván: jöjjön rá magától, vagy csak másnak sincs ötlete.
A hozzászólás módosítva: Júl 2, 2022
(#) gordonfreemN válasza _BiG_ hozzászólására (») Júl 2, 2022 /
 
Akkor jó, ha:
Két darab nyomógombbal
a) vezérel 12db set-reset DPDT relét,ezen belül tartalmaz:
-2*3db bemenetválasztót, melyekből 1 bemenetre 1 relé jut, a nem aktív állapotban majd GND-re lesz téve a nem aktív bemenet
-2*2db kimenet választó relét, melyeknél egy relével oldom meg a két kimenet választását
-2*2db schematic választást (lenne egy ilyen meg egy olyan panel beépítve, de ez még nem biztos) aminél a kapcsolás be és kimenetét is leválasztanám 1-1 relével
b) és vezérel 2*3db kapcsolási állapot visszajelző LED-et.
1) Bekapcsolás után visszaállítja a kikapcsoláskori állapotot mind a be,ki és schematik módokban
2) Mód választáskor ha a be módról a ki módra lépek és azt állítom, majd visszalépek a be módra, akkor a visszajelzés álljon vissza, tehát őrizze meg az állapotát.
3) Természetesen ha módválasztóval lelépek a be módról, az őrizze meg az aktuális állapotát
4) Az egyik gomb léptesse az mód választást, a másik a kiválasztott módon belül az aktuális ki, be menetet vagy a schematikot. Ezért elég 6 LED a visszajelzésre.
(#) Massawa válasza gordonfreemN hozzászólására (») Júl 2, 2022 /
 
Sokkal többre mennénk ha lerajzoldád a vezérlés kapcsolási rajzát ( nem a relé kontaktusait) ugy attekinthetöbb lenne mit es hogyan akarsz megoldani.
(#) _BiG_ válasza gordonfreemN hozzászólására (») Júl 2, 2022 /
 
Akkor még kérdés: az áramkör mindig 1-1 csatlakozót párosít, mint bemenet-kimenet? Mert ugye két kimenetet nem illik csak úgy összekötni... van, hogy kijön a működtető füst.
Azaz a doboz egyik felén vannak a bemenetek, amik közül kiválasztható az aktív, és ugyanez a másik oldalon is, mint kimenet. Tehát mi küldjön jelet mire.
Jól látom?
És ezen felül lehetséges még egy áramköri lap, amit ugyanígy hozzá lehet rendelni a csatlakozókhoz, leválasztva a másikat.
Es persze majd mindent jegyezzen meg a vezérlő, lapváltáskor is legyen mindjárt az utolsó beálítás az aktív konfig. (A progi még nem tartalmazza)
Következő: »»   740 / 839
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem