Hirdetés
-
PROHARDVER!
Arduino hardverrel és szoftverrel foglakozó téma. Minden mikrovezérlő ami arduinoval programozható, és minden arduino program, board, és hardverrel kapcsolatos kérdések helye.
Ú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
-
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.
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
- Milyen házat vegyek?
- Vezetékes FEJhallgatók
- PH!otósok beszélgetős, offolós topikja
- Milyen légkondit a lakásba?
- Samsung Galaxy Watch4 és Watch4 Classic - próbawearzió
- Futás, futópályák
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Azonnali informatikai kérdések órája
- One otthoni szolgáltatások (TV, internet, telefon)
- PlayStation 5
- További aktív témák...
- Újszerű bivaly Lenovo Thinkpad T16 gen3 (13.gen Core Ultra 7 32Gb DDR5 1 Tb SSD) MAGYAR 30 hó GARI!
- Bivaly Lenovo T14 gen5 (Core Ultra 7 32Gb DDR5 1 Tb SSD) laptopom eladó 30 hónap gyártói garanciával
- Bomba ár! Dell Latitude 3410 - i3-10110U I 8GB I 256SSD I HDMI I 13,3" FHD Touch I Cam I W11 I Gari
- Bomba ár! Dell Latitude E5550 - i5-5GEN I 8GB I 128SSD I 15,6" FHD Touch I HDMI I W10 I Cam I Gari!
- Bomba ár! Dell Latitude E5540 - i5-4GEN I 4GB I 240SSD I Nvidia I 15,6" FHD I Cam I W10 I Garancia!
- GYÖNYÖRŰ iPhone 14 128GB Midnight -1 ÉV GARANCIA - Kártyafüggetlen, MS3972, 100% Akkumulátor
- Samsung Galaxy S22 5G 128GB, Kártyafüggetlen, 1 Év Garanciával
- HIBÁTLAN iPhone 13 128GB Starlight -1 ÉV GARANCIA - Kártyafüggetlen, MS3432
- Ha mindkettőt viszed, 170ért tied! - Apple Thunderbolt Display
- Eladó szép állapotban levő Apple iPhone 11 64GB fehér / 12 hónap jótállással!
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Laptopműhely Bt.
Város: Budapest

) de köszi a tippet, észben fogom tartani, ha lesz kapacitás, elkezdem olvasgatni a témát.
ekkold

