- Hamarosan megkezdődik a nubia 2,8K-s táblagépének szállítása
- Barátokká váltak az eddig rivális AI-óriások
- ASUS blog: Ideális olcsó utazós gép lett az új Vivobook S14
- Az Aura Displays hordozható monitorhármasa jól felturbózhatja a produktivitást
- Dual Mode-os IPS monitorral adott magáról életjelet a Gigabyte
- Milyen széket vegyek?
- Lítium-ion/Li-ion akkumulátorok
- Kormányok / autós szimulátorok topikja
- Intel Core Ultra 3, Core Ultra 5, Ultra 7, Ultra 9 "Arrow Lake" LGA 1851
- Melyik tápegységet vegyem?
- Milyen belső merevlemezt vegyek?
- Szünetmentes tápegységek (UPS)
- Házi hangfal építés
- VR topik
- Nem indul és mi a baja a gépemnek topik
-
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
Janos250 #23217 üzenetére
Igen, az összenyitás indította az egészet. Azzal kezdtem, hogy vezérelhetem-e az egy oldali tranzisztorokat egyszerre, egy mikrovezérlö kimenetről.
Keresgéltem azóta motorvezérlő IC-t, de nehéz ügy olyat találni, amihez elég az 5V-os tápom úgy, hogy ebből 4,5V maradjon a kimenetre is illetve kapható is itthon.
Konkrét IC kell, nem moduláris eszköz.
Egyébként egyre nehezebb alkatrészt is beszerezni, az rs components és most látom: már a tme is csak vállalkozásoknak cégeknek szállít... Remek.
Marad a farnell aminél megint csak nem volt egyszerű a legutóbbi rendelésem, hestore, hqelektronika meg a lomex, ja és a ret. -
gordonfreemN
addikt
válasz
Tankblock #23210 üzenetére
Abba gondolj bele ha motor az egy tekercs ahogy meg próbálod megállítani vagy megfordítani az irányt a tewkercxs szerenté az addig fenntlévő áramot fennttartani..... ezért kell egy dióda / FET.....
Ez stimm, csak gyakorlati oldalról ilyenek, hogy az a dióda nem az a dióda...
szkópom is van, de analóg...
Nézegetek motorvezérlő IC-ket, de hestore szegényes belőle (modul nem jó).
Agyalok, hogyan alakítsam át a tápot, de ezt olyan jó lenne megúszni. -
gordonfreemN
addikt
válasz
Janos250 #23208 üzenetére
Kezdem a válaszokat sorban:
Aryes: köszönöm a motorvezérlős tippet. Első körben megpróbálnám ezekkel a FET-ekkel, de ha azt mondjátok halott ügy akkor elvetem és megpróbálom a vezérlőt. A panelt most fogom tervezni, de az alkatrészek már meg vannak.
Egyenáramú vezérlést szántam, nem pwm-eset.Tankblock: rendben, köszi, csak azt éreztem, hogy talán fárasztóak lehetnek a kérdéseim. Az 1V drop-ot én a motorvezérlö IC-re értettem.
Fesz esés nálam is van, 4,9V-ból marad 4,3-4,4 a motorra (van irf7316 is. Ez még jó, a motor 4-6VDC közt működik és 100mA normál illetve 150mA végállás árama van. Esetemben egyébként úgy néztem, hogy az induláskor veszi csak fel a 100mA-t, utána 60mA-rel beéri.
Van egy fluke 87 V DMM-em, azon van peak detector, azzal talán meg tudnám vizsgálni, hogy lekapcsoláskor mekkora csúcsfesz indukálódik.
Freewheel diode: ez ismeretlen volt számomra, de a google azt mondja, ez a flyback dióda, tehát a visszirányú feszültséglökések ellen van (spike). Lehet hibásan, de én azt gondoltam, a 7309-ben lévő védődióda erre a célra megfelel. Ha tévedtem, természetesen erről gondoskodom.
Jelenleg a tesztre USB, de ez termézsetesen nem USB lesz. Egy 5V-os 230/5V DCDC konverter lenne a digitális/vezérlö rész tápja. Ez szolgáltatná a standby tápot is hogy távirányítóról bekapcsolható legyen a hangerőszabályzó, tehát ez adja a tápot a mikrovezérlőnek, de a hangerőszabályzó áramkörének nem, az toroidról.üzemel.Janos250: köszi a tippeket neked is. Nem a FET-en esik 1V a tesztáramkörömnél, hanem sok motorvezérlő IC-nél talalkoztam ezzel, ami nekem nem jó. A nálam lévők szerintem kinyitnak, kólülönben nem hajtana a motor
-
gordonfreemN
addikt
válasz
Tankblock #23202 üzenetére
Szia.
Csak 5V tápom van. Nézegettem ezeket, de mind "fogyaszt" több mint 1V-ot, mire a kimenetre jut (szaturációs fesz miatt talán).
Elnézést, ha bosszantó a kérdésem, nem volt célom ilyemsire, mindössze az van, hogy ez az eslö FET-es alkalmazásom, mikrovezérlöben sem vagyok pro, ezért gondoltam attól, hogy működik, inkább kérdezek.
Tehát erre megoldásként, be lehetne tenni egy dc-dc konvertert, de tényleg nincs más mód? -
gordonfreemN
addikt
Köszönöm
Tulajdonképp arrol van szó, hogy a vezérlö egy kimenetéről hajtom meg egyszerre a low és high side-ot azaz az alsó és felsö tranzisztort oldalanként és így elöfordulhat-e valami gond.
De amúgy este kirpóbáltam tesztpanelon, összevissza nyomkodtam az irányváltást és nem volt gond, tehát félig már tudom jó. A másik fele ami speckó esetben fordulhat elö esetleg,olvastam FET felrobbanásokról ha lassan vannak kinyitva stb. -
gordonfreemN
addikt
válasz
gordonfreemN #23190 üzenetére
Gyorsan összedobtam a lényeget, mire gondolok.
-
gordonfreemN
addikt
válasz
gordonfreemN #23189 üzenetére
7309:
-
gordonfreemN
addikt
Sziasztok!
Megtehetem azt egy atmegA328P, egy alps RK271 motor poti és két IRF7309 H hidas vezérlés esetében, hogy a 7309-ek G1 és G2 bemeneteit "egyszerre" vezérlem?
Azaz egy-egy atmega kimenetről hajtom meg a két-két pint a két 7309-en.
Schematik-ot teszek fel hozzá ha kell, épp készül. -
gordonfreemN
addikt
válasz
Ton-ton #21947 üzenetére
Köszönöm az illusztrációkat a képekkel és a tanácsokat. Teszek fel képeket, közelebb hozom vele kicsit az elképzelést:
Aryes:: közben... igazából az RX-TX-et nem is kell leválasztani, az mehet párhuzamosan valami kimenethez, ami nem zavarodik össze feltöltéskor az rx-tx vonallal
-
gordonfreemN
addikt
Gondolkodtam, hogyan tudnám a legkevesebb módosítással leküzdeni a problémámat, viszont az atmega2560 azon felül, hogy méretben sem kicsi (a panelem méretei korlátozottak), árban sem olcsó (9k körüli árak) sok felesleges pin is maradna használaton kívül.
minimum 25 IO pinre lenne szükségem.Találtam ezt az atmega328 változatot: ATMEGA328PB-AU amiről az 5. oldal ezt írja: General Purpose I/O pins 27.
Számolgattam, és ezen a változaton a3 és 6 pin-nél, illetve a 19 és 22 pin-nél úgynevezett Port E 4bit-es IO található, így
PB0-7=8db IO
PC0-5=6db IO
PD0-7=8db IO
PE0-3=4db IOA RESET=PC6 portot mindenképp le kellett hagynom, az fixen maradna. Így összesen 26 IO maradna.
A programozást így valami kapcsolóval kellene megoldai, hogy ha átkapcsolom, akkor leválassza az RX-TX és XTAL1-2 vonalakat az egyébként másra használt vonalakról.
Ez így akkor jó lehet szerintetek is?
-
gordonfreemN
addikt
válasz
gordonfreemN #21915 üzenetére
set-reset vagy latching relay angolban
-
gordonfreemN
addikt
-
gordonfreemN
addikt
válasz
Ton-ton #21910 üzenetére
Nem. Bipoláris relé, impulzussal vezérlem. Hogy rajta lehetne-e hagyni a vezérlőjelet? Nem tudom, mindenesetre szerintem nem illik, meg az még egy harmadik panelen van és azt már végképp nem szeretném előlről kezdeni. Az már anyagilag végképp fájna.
Postas99: Valószínűleg igazad van, de épp azért "kattantam" rá az MCU-ra, hogy ne kelljen ilyen multiplexer féle logikai IC-ket használnom. Aztán persze most mégis pont ezért kértem segítséget... hgy mivel lehetne. Fontolgatom a lehetőségeket.
Ton-ton 21912: nem értem mire gondolsz ez alatt, miben segítene ez?
-
gordonfreemN
addikt
válasz
Janos250 #21905 üzenetére
Szia!
Nagyon jó ötleteket írsz, ezt köszönöm! Nagyon érdekesen hangzik amit mondasz, amúgy is gondolkodtam a programozási ismereteim bővítésével, szóval ez jó iránynak tűnik. Viszont ha ennyire visszanyúlok, akkor a projektet kb kezdhetem előlről, mert a szoftverek már működnek, van távirányítás stb, csak az IO-k számába buktam bele. Ennek is amúgy hosszúra nyülik az oka, kb 4 éve vettem aliról egy távirányító vezérlőt, mondom na de jó, csak a körítés kell hozzá. Ekkor még sehova sem akartam szoftvert írni. Igen ám, de 1 évvel később mikor sikerült összeraknom és letesztelnem, kiderült, nincs ki/bekapcs. Írtam az eladónak, hát az külön panel, plusz pénz. 1 évvel később rájöttem, hogy arduinoval is meg tudnám oldani. Elkezdtem írni a szoftvert ehhez is, mert a ki/bemenet választáshoz már folyamatban volt, egy csoporttársam unsztolására elkezdtem foglalkozni az arduinoval. Na és szép lassan kilyukadtam itt, hogy hát csak meg kéne csinálni komplexbe, mert jelenleg két küllön 328 van, az egyik az eredeti projektre, a másik meg a távirányítóhoz.
JulianSinulf: köszi a tippet.
-
gordonfreemN
addikt
válasz
Gergosz2 #21906 üzenetére
Nem használtam még shift regisztert, szóval nem tudom jó lenne-e, de köszi a tippet vizsgálódom a témában, ha lekezelne egy DC motort ezzel meg egy infravevőt, az már jó lehet.
A feladat: előerősítő bemenet és kimenetválasztó (ez utóbbi nem szokványos, de megfontoltan van rá szükségem) :
be-set x 3 és be-reset x 1 (itt a bemenetek külön relét kaptak, tehát vagy aktívba billenti a bemenetet vagy leválasztja, mivel másik bemenet/bemeneti relé lesz/válik aktív{vá} a nem aktív relék vonalai le vannak választva, "lebegnek", így nem fordul elő, hogy egy relére két bemenetről is érkezik jel) Már most utólag látom, ez felesleges lépés volt...
ki-set x 1 és ki-reset x 1 (itt csatornánként egy relét használtam, mivel úgy is csak azon lesz bemenet, amire kikapcsolja)
és még egy set-reset egyéb funkcióhoz. Ez összesen 8 kimenet.
Van két választógombom (egy ki/bemenet közti választó és egy ami azon belül váltogatt) ez 2 bemenet.
Van 6db LED = 6 kimenet (az világít, amelyik kimenet bemenet stb aktív)
Van 1 kimenet, ami az előerősítő panelt némítja
Egy bekapcsoló gomb, melynek a LED-jét még vezérlem, ez 1 kimenet és
Egy tápot kapcsoló relét vezérlő 1 kimenet.Ezen felül kellene 4 kimenet a potméter H-Hidas irányváltójához és 1 bemenet az infralednek, meg egy egy másik LED-nek vagy valami ilyesmi, még nem találtam ki pontosan meg vagy 3 pin tartaléknak.
-
gordonfreemN
addikt
-
gordonfreemN
addikt
Sziasztok!
Gondolkodom mivel tudnám megoldani a korábbi projektem (atmega328) ugyanis kiderült, hogy a 19db I/O nem lesz elég, kellene még legalább 6.
Gondolkodom port extenderben (MCP23017) bár ezzel is tátott szájjal rohangálás van, mert az SDA-SCL pinek foglaltak, tervezhetek új panelt neki. Vagy akkor már több értelme van másik vezérlőre építkezni? 2560-at néztem, de az ára horror. Igaz fel kellene nőni már ehhez az inflációhoz, 6 kenyeret veszek az árából...Hasonló arduino környezetben fejleszthető megoldás van ami alkalmasabb lenne nekem?
Elgondolkodtam kettő mega328 összekötésén is, de szerintem a megfelelő lábak nélkül ez se lenne jó megoldás.
ui.: extender esetén van handicap? Ha igen, mi?
-
gordonfreemN
addikt
válasz
bagarol #19806 üzenetére
kérdésem még az volna, hogy ha értem mi történik az már egy lépés előre?
Annak ellenére, hogy most pl. te írtad meg a kódot helyettem, azért ilyenekből is tanulok, vagy ezt teljesen más szinten kellene művelnem?Ezekre keresem a választ, hogy mit csinálnak:
1) IRrecv irrecv(RECV_PIN);
2) decode_results results;
3) irrecv.enableIRIn();
4) if (irrecv.decode(&results)) {
5) long int decCode = results.value;
6) irrecv.resume(); -
gordonfreemN
addikt
válasz
bagarol #19802 üzenetére
Ugyanaz. Miután lenyomtam a gombot, világít és úgy is marad gomb felengedésre is. Váltani persze vált a két led közt.
(#19791) vargalex: egy kérdés még a break-kel kapcsolatban: tehát ha befut egy case-be, akkor végrehajtja ami ott van, majd ha a végén ott figyel a break, akkor ez azt jelenti a loop innen indul ujra. Jól gondolom?
-
gordonfreemN
addikt
válasz
gordonfreemN #19790 üzenetére
Ez jelenleg szintén azt teszi, hogy megnyomom: felvillan és marad akkor is ha elengedem a gombot.
(#19791) vargalex
A -1-es case esetén (eset esetén) ha betettem a break-et, akkor a case -1 és a hozzá tartozó break közti műveleteket sem hajtotta végre.
(#19792) vargalex
A soros log alapján Ayres kolléga megoldása jó kell, hogy legyen. A case -1 ágába a break-on kívül más nem kell. Akkor ez pipa, így is csináltam, de nem a kívánt (még nyomom addig világít) módon működött továbbra sem.
Viszont azt gyanítom, hogy kellene valami timeout is, mert amíg nyomod, addig jön a -1, igen ez így van
de ha elengeded, akkor nem fog jönni semmi igen, ez is így van
és nem is fut be a default ágba. pontosan ezt próbáltam meg lentebb kevesebb sikerrel megosztani
Vagy, ha nem nyomsz gombot, akkor az irrecv.decode-ban áll? Ott hogyan állhat, ezt honnan tudom? Az a baj, azt se tudom az irrecv.decode mit jelent vagyis mit csinál, számomra ismeretlen arduino parancs. Keresgéljek utánna? Vagy van kedved esetleg segíteni megérteni? A jelentése gondolom én az lenne, hogy IR receiver decode, azaz az IR vevő dekódolás, tehát a fogadott jel dekódolása, vagyis a fogadott, IR adó által küldött kódból különböző szűrőfázisokon és demoduláláson átesett jel -
gordonfreemN
addikt
Megérkeztem, tudok tesztelni. Tehát akkor mit nézzek meg?
-
gordonfreemN
addikt
válasz
gordonfreemN #19786 üzenetére
Na mostmár valamit a könyvtáraknál is szétcsesztem, le se tudom fordítani a kódot.
Ha valakinek lenne türelme ebben segíteni, akkor a maradék hajam hálával fog tartozni, amiért nem hullik ki.
Szerintem előlről kellene kezdeni, tehát, ahhoz hogy az IRremote.h lib nemtudom mitcsináljon kellene ez a lib, addig a kódban megírt "hivatkozások" nincs mire mutassanak szerintem. Tehát most fogom, törlöm az összes ilyen lib-et és akkor innen kezdjük.Na semmi. Van ez az IR remote könyvtár. Ezt lehet telepíteni többféle verzióban, az újjabbakban (2 felett) történt valami változtatás ami a régi hivatkozásokat (nem tudom mi ennek a neve, amikor a libben lévő megírt kódra egy paranccsal hivatkozunk) már nem ismerte, a példaprogramom meg a régi szerint volt megírva.
-
gordonfreemN
addikt
Nem ugrik be a defaultba, ha a
case -1:
break;
-et beteszem a kódba. Enélkül bemegy defaultba és waiting jön a com-on ahogy kell.
Nem értem.
Ha kiveszem a break-et a -1-es case után akkor belép, és végrhajtja a benne lévő utasítást, de ki is jön belőle ugye és megy tovább a default-ba.
Ha beteszem a break-et, nem hajlandó a benne lévő utasítást se végrehajtani
Másik távval is teszteltem, az is -1-et ad hosszú nyomásra, azzal is igyanez a hiba. -
gordonfreemN
addikt
Valami nem oké még, mindössze annyit tettem, hogy bemásoltam a -1-es caset ahogy mutattad. Most ugyanúgy működik mint eredetileg. Felvillan és úgy marad ha megnyomom.
Közben még: arra volna tiapasztalatotok, hogy a potméter DC motorját H-hidas vezérléssel milyen eszközel érdemes megoldani? Jó lenne a minél kevesebb fesz esés a vezérlőn, mert 5VDC-m van és a motornak is kell ennyi. Ez esetben csak szubminiatűr relé jöhet szóba?
-
gordonfreemN
addikt
& vargalex: Ennyi az egész kód egyelőre.
Köszi.
Küldi a jelet nyomva tartáskor. A soros monitoron ezek szerint az ismétlés kódja a -1 ?
Ha igen, akkor gomdolkodom, hogyan lehetne megoldani ezt így ebben a formában.na még tovább olvasva a válaszok: igen ez a kód amit betettem még csak arra képes, hogy vagy az egyik led vagy a másik világít. Azt szeretném, hogy amíg nyomom a távon a gombot (hangerőt nyomom egyébként) addig világítson, azután ha elengedtem, kapcsoljon ki a led is. Az a LED világítson amelyik gombot épp nyomom.
Ebből majd egy DC motort fogok vezérelni hangerőszabályzásra: ALPS RK27112.Lehet látni S22-n az infrát.
-
gordonfreemN
addikt
Szia!
Köszönöm mindenkinek a segítséget. Sajnos az említett kód nem segített, egyszer felvillan aztán süket a led. Delay-el is ez a helyzet. Próbálkoztam már én is ilyesmivel, de nekem se jött be. Esetleg más ötlet?
Gondolom a kódok miatt érdemes ennél a switch-case-nél maradni és ezt csűrni csavarni valahogy. -
gordonfreemN
addikt
Sziasztok!
Legutóbb meg lettem jegyezve, hogy feltöltöttem a kódomat ide. Isten lássa lelkem, most beregeltem a github-ra, de azért ezt egy nem ősprogramozói lélek 10perc alatt nem látja át. Vagy lehet csak én vagyok béna, mindegy. Most se hosszú a kód amiről kérdeznék, talán elfér itt.
#include <IRremote.h>
int RECV_PIN = 11;
int playPin = 8;
int pausePin = 13;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(115200);
irrecv.enableIRIn(); // Start the receiver
pinMode(playPin, OUTPUT); // sets the digital pin as output
pinMode(pausePin, OUTPUT); // sets the digital pin as output
}
void loop() {
if (irrecv.decode(&results)) {
long int decCode = results.value;
Serial.println(decCode);
switch (results.value) {
case 6072407:
Serial.println("Play");
digitalWrite(playPin, HIGH); // sets the LED on
digitalWrite(pausePin, LOW);
break;
case 6066287:
Serial.println("Pause");
digitalWrite(pausePin, HIGH); // sets the LED on
digitalWrite(playPin, LOW);
break;
default:
Serial.println("Waiting ...");
}
irrecv.resume(); // Receive the next value
}
}
Infra kommunikáció megvan, veszi az arduino a táv jeleket, de arra nem jövök rá, hogyan tudnám azt megcsinálni, hogy csak addig világítson a LED még nyomom a gombot a távon. Ebben tudna valaki segíteni? -
gordonfreemN
addikt
válasz
Tankblock #19648 üzenetére
Köszönöm neked is, meg mindenkinek.
Köszi a leírást, megint kicsit közelebb kerültem ehhez az egészhez.
Mivel eléggé kezdő vagyok, talán célszerű az arduino-nál maradni, ezt hallom mindenhonnan. Első sorban ebben a világban jó lenne eligazodni. Azt szeretném elérni egyelőre, hogy tudjam mi az a library, mi hogy működik stb. Ehhez persze kell keresnem olyan feladatokat, amiket szivesen csinálok, ahol van motiváció mint itt, bár ez utóbbi mint kiderült nem célszerű.
Ezért úgy döntöttem, hallgatok az itteni tanácsokra és elengedem ezt a dolgot.Power LED egy elírás, bocsi. Nagyfényerejű LED.
-
gordonfreemN
addikt
3: mar elfelejtettem mit akartam 3.nak
ez jó volt.
Köszönöm a szakmai tanácsot, akkor átgondolom ezt.
Egyébként egy ilyen hálózati táplálású készüléknél kikapcskor el szokták tenni az mcu-t alvóba?
Erősítők, előerősítők, akármik? Ez most előerősítő lesz csak azért emeltem ki azt. Szóval mi a szokás, mert akkor abba az irányba mennék. -
gordonfreemN
addikt
válasz
razorbenke92 #19642 üzenetére
Ilyesmire gondolok:
[egy folyamatos kihunyó-felerősödő állapot]Nem energiakritikus, egyrészt inkább tanulási cél, másrészt ha már van olyan funkció a készüléken, hogy kikapcs, akkor arra gondoltam, hogy a mikrovezérlőt is pihenni küldeném. De hálózati táplálású lesz a késülék, tehát akár jegelhetném is a dolgot, ha nincs rá ésszerű megoldás.
A villogó LED magas fényerejű LED lesz, talán eléri az 1mA-t.
Szóval akkor marad számomra vagy az órajelvisszavétel, vagy el kell engedni eztKöszönöm a tippeket!
-
gordonfreemN
addikt
Természetesen így teszek, ezért meg is köszöntem a tippet!
A megoldás amit említesz... (és köszönöm!) ez azt jelentené, hogy lemegy a for ciklusban a led villogás mondjuk egyszer, majd belép powerdown módba és onnantól nincs villogás?A lenti példánál (#19639) gordonfreemN válasza dew28 (#19636) üzenetére írtam legalább egy butaságot: 8s-ig tartanám powerdown módban, ezzel az a baj, hogy addig kellene nyomogatni a button_p-t is. Inkább egy 2s-os powerdown-al lenne ez talán élhető.
-
gordonfreemN
addikt
Oké, egyébként is megáll, persze, csak ha a time argumentumban konkrét időt használok, akkor az idő leteltével feléled és a loop ismét lefut. Így innen ki lehet ugrasztani bármilyen bemenettel.
Például azt mondom, hogy ha vpower 0 a feltétele az if igaz ágába való belépésnek, akkor ott lefut 8 másodpercig a powerdown, majd abból kilép és megint lefut a loop. Ha közben én a button:p-t nyomva 1-re állítom a vpower változó értékét, akkor nem fog bemenni a powerdown módba.
Kérdés, hogy így nyerek vagy vesztek, mert az MCU így minden loop-kor fel kell éledjen, ez nem tudom mennyi energiával jár.
Ha forever-t használok akkor pedig csak akkor tér magához, ha az interrupt lábakon beérkezik a megszakítás, ellenkező esetben addig ott marad. -
gordonfreemN
addikt
válasz
Tankblock #19637 üzenetére
Szia,
Igazad van, nem írtam le elég részletesen mit is szeretnék.
Ezúton kibővítem a tudnivalókat:
A cél az volna, hogy a készülék kikapcsolásakor a power LED villogjon fade-elve (így jelezvén, hogy a készülék feszültség alatt áll) illetve menjen valami energiatakarék módba, mivel nincs használva a készülék.
a "valami energiatakarék mód" alatt azt értem, hogy az összes lehetséges blokk lekapcsolása. De szeretném ha a power LED villogna ebben az állapotban.
Ebbe az állapotba a button_p megnyomásakor menjen és abból azzal éledjen is fel. Ezt a vpower változóval lehetne megadni, amikor az értéke 0/LOW akkor energiatakarék módba kerül, amikor a vpower 1/HIGH akkor pedig feléled.
A gondom még ezzel, hogy az áramkör elkészült, miután kitaláltam ezt az energiatakarékosságot és a button_p a 8-as lábon van. Ezt PIN change funkcióval fel lehet használni interruptra, de olvasom, hogy ez lassú ezért például a debounce bizonytalanná teszi az állapotfelismerést.Nem tudom ez elég-e ahhoz, hogy érthető legyen mit is szeretnék. Bevallom annyi mindent találtam (még csak ismerkedek az arduinoval/mega328-al és a programozással), hogy teljes lett a káosz a fejemben és ez érződik is a hsz-eimen.
Én úgy vettem ki az eddig olvasottakból, hogy az avr/sleep.h-t a frodító elevel tartalmazza de sasjnos amíg nem értem miért van szükség mellette/helyette a LowPower könyvtárra addig az egész értelmezése is homályba vész. Persze meg lehet így is írni egy egyszerű kódot, csak nem túl optimálisan.A PIN change-hez is találtam egy könyvtárat de nem igazán akar leesni mire is jó ez nekem. Persze nem muszáj elmagyarázni, majd valahogy rájövök, eddig is azért megoldottam már néhány feladatot.
A kódomat valóban feltehetném a githubra, de ez egy programozásról szóló fórum ahol ez el kell férjen, nem 5000 karaktert szúrtam be, ezért nem lehet pálcát törni senki felett szerintem. Amúgy az ötletet köszi!
Köszönöm, hogy további jó hobbizást kívánsz, de nem jön át, hogy ezzel úgymond elküldesz innen vagy csak a jóindulat beszél belőled. Én utóbbira szavaszom azért elsőre
-
gordonfreemN
addikt
Kezd valami kialakulni.
#include "LowPower.h"
const int powerled = 9;
int brightness = 0;
int fadeAmount = 10;
const int button_p = 2;
bool buttonstate_p;
bool lastbuttonstate_p;
byte vpower;
const int powerrelay = 13;
void setup() {
pinMode(powerled, OUTPUT);
pinMode(button_p, INPUT);
buttonstate_p = 1;
lastbuttonstate_p = 1;
pinMode(powerrelay, OUTPUT);
}
void wakeUp() {
// Just a handler for the pin interrupt.
}
void loop() {
if (vpower == 0) {
analogWrite(powerled, brightness);
brightness = brightness + fadeAmount;
if (brightness <= 0 || brightness >= 250) {
fadeAmount = -fadeAmount;
}
delay(30);
if (brightness == 0) {
digitalWrite(powerled, 0);
}
}
if (vpower == 1) {analogWrite(powerled, 255);}
buttonstate_p = digitalRead(button_p); //gomb állapot kiolvasása
if (buttonstate_p != lastbuttonstate_p) //gombnyomás történt? Gomb állapota változott az előzőhöz képest?
{
delay(500); //ha történt változás az előző állapothot képest, várj 50ms-ot
if (buttonstate_p == 0) //ha a gomb nyomva, azaz bemenet értéke alacsony akkor
{
if (vpower < 1) { //ha vpower értéke kisebb mint egy
vpower++; //növelje vpower változó értékét eggyel
}
else { //ha vpower értéke egy vagy több
vpower = 0; //akkor legyen az értéke nulla
}
}
if (vpower == 0) {
digitalWrite(powerrelay, 0);
// Allow wake up pin to trigger interrupt on low.
attachInterrupt(0, wakeUp, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
// Disable external pin interrupt on wake up pin.
detachInterrupt(0);
// Do something here
}
if (vpower == 1) {digitalWrite(powerrelay, 1);}
}
lastbuttonstate_p = buttonstate_p;
}Na most itt egy olyan kérdésem lenne, hogy akkor a loop megáll ha sleep forever-t használok?
Csak mert a LED fade megállt.
A cél az volna, hogy a készülék kikapcsolásakor a power LED villogjon fade-elve (így jelezvén, hogy a készülék feszültség alatt áll) illetve menjen valami energiatakarék módba, mivel nincs használva a készülék.
Ez nem a teljes kód, csak egy részletet kihoztam belőle, a jelenlegi cél érdekében feleslegesnek éreztem az egészet ide vetni. -
gordonfreemN
addikt
Jó, jogos.
Amúgy a feltett kérdésre tényleg nem tudni a választ vagy csak hagyjátok a kezdőt saját utakat járni?
Mert tényleg nem értem miért mi a különbség a lowpower.h és az avr/sleep.h közt.Próbálkozok egyébként:
#include "LowPower.h"
void setup() {
// put your setup code here, to run once:
}
void loop() {
{
// Allow wake up pin to trigger interrupt on low.
attachInterrupt(0, wakeUp, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
// Disable external pin interrupt on wake up pin.
detachInterrupt(0);
// Do something here
}
}
de azt a hibát adja az ellenőrzés, hogy'wakeUp' was not declared in this scope
-
gordonfreemN
addikt
Köszönöm mindkettőtöknek a választ.
Akkor atmega328-nál eleve csak a lowpower.h és az avr/sleep.h játszik.
Ezek közt mi a különbség?
Ezt a lowpower.h-t nem tudja alapból a fordító, külön kell rákeresni neten és feltölteni rá.
Ez szokványos? Nekem fura, mert olyan érzésem van, mintha egy idegen által megírt valamit töltenék fel éshasználnék. -
gordonfreemN
addikt
sziasztok!
Szeretnék egy minimális energiamegtakarítást elérni atmega328 MCU-val.
Olvasom, hogy van ez a sleep mode (
#include <avr/sleep.h>
) melyet alapból tartalmaz a mikrovezérlő.
Aztán van ez az (
#include "ArduinoLowPower.h"
) és van a (
#include "LowPower.h"
).
Ezek közt mi a különbség?
A lowPowerek külön könyvtárak és külön kell letölteni őket?
Ezeket a fordító könyvtárkezelőjében miért nem találom?Lehetséges 9-es pinről is feléleszteni energiatakarékos módból, vagy csak a dedikált interrupt 1-2 lábakon?
A loop az energiamegtakarításkor i folyamatosan fut, vagy ilyenkor csak az interrupt lábat figyeli és ha azon bejön a megszakítás akkor feléled?
Nagyon köszönöm ha tudsz segíteni ennek a megértésében,
-
gordonfreemN
addikt
Na, köszi de akkor végül csak a kijelző lesz, mert bár én se ecseteltem, de 60mm-ben maximalizálnám a dolgot. Szolidra szeretném az előlapon, nem meghatározóra.
De amúgy a ledes se hülyeség, bár hogy milyen kicsi a lépték azt nehéz lenézni.
Mindenesetre oled-et ily módon tudnék vezérelni atmegával? -
gordonfreemN
addikt
Üdv!
Azt szeretném kérdezni, szerintetek megolható-e atmegával meg egy beszerezhető kijelzővel hasonló kivezérlés kijelző?
[link]
0:30-tól -
gordonfreemN
addikt
Igen, rossz kereső szavakat használtam.
kérdés még: Ilyen esetben a RESET pin-t mire kössem? A CH340 DTR kimenetére, sorba egy kondival vagy mehet a 328 tápjáráa 10k-val, vagy mindegy? Ha jól sejtem ez csak egy induláskori reset ha tápon van és a CH340-en pedig minden felprogramozás indításánál egy resettel indít vagy fejezi be azt. Akkor célszerű a CH340-re kötni.
-
gordonfreemN
addikt
Attól függ, hogy szeretném-e hogy kell-e? vagy jó-e ha van?
Tehát akkor ujra: a nano-ról leforrasztottam az atmega328-at (ellátási problémák miatt) és ezt fogom beültetni egy általam tervezett panelba, amit úgy látom sok féle képpen fel tudok majd programozni.
Azért nem programoztam fel még akkor a 328-at, mikor fent volt a nano-n, mert szeretném magán a beültetett panelon felprogramozni.
Tehát fel tudom programozni ISP-vel is, de ez plusz eszköz vagy az arduino uno-val is megoldható.
oks, ennek a bekötése hogyan nézne ki, milyen alkatrészek kellenek az atmega328 köré, hogy ez működjön?
Aztán lehet még gondolom FT232 chip-el is, ha mondjuk a panelomba ültetett 328 mellé teszek egy ilyen chipet.
Szóval keresem a legegyszerűbb de legpraktikusabb megoldást is, ahol a praktikussákot azon a síkon értem, hogy ha kell valamit módosítanom majd az programon, akkor a lehető legegyszerűbben tudjak ismét programot tölteni rá. Nyilván ezzel ki is lyukadtunk az USB kábelnél, FT232-t beültetve csak egy USB kábelre van szükség, de mondjuk az UNO-t se nagy szám mellé tenni, ha valamit írni kell rajta (ami lehet hogy soha nem fog megtörténni)ui.: például egy másik kérdés, kell-e a RESET pin-t felhúzni tápra? Ha igen, akkor 330R vagy 10k? Találtam mindenélre értéket is, meg azt is, hogy nem muszály ezt felhúzni.
-
gordonfreemN
addikt
Sziasztok!
Mivel a programom elkészült, szeretném elkészíteni hozzá a panelt. Egy atmega328p TQFP tokot ültetnék majd be. Ezen már van bootloader, mivel egy arduino nano-ról lett leszedve.
A segítségeteket abban szeretném kérni, hogy ha tudjátok, leírnátok milyen alkatrészeket hova kell bekötni és hogyan kell ezután feltolni rá a programomat?
A neten nézelődök, de annyi az infó, hogy elveszek bennünk mindahányszor. Például lehet az arduino panelt használni is? Annak FT232 chip-jét is, de ezt akár be is ültethetem, ekkor már csak egy USB csatlakozóra lenne szükség?
Szükséges külső 16MHz-es oszcillátor vagy elhagyható?
Mik a szokások és mik az ajánlások? -
gordonfreemN
addikt
Na jó, de a doboz már megvan és egy LED-nek van hely
Azaz pontosabban 3 mod LED meg 3 set LED
Még mielőtt elmerülünk ebbe: ugyanezeket a LED-eket kell használni a bemenetnél is, ahol viszont van vezérlés minden beállított kimenetre és ez 3szor a 3 bemenetre.a kimenet bemenetre van állítva
ez nem világos. Hogy érted, hogy a kimenet bementre van állítva?
-
gordonfreemN
addikt
Teljesen igazad van. Az első esetben amikor a bemeneteket vezérlem. A másik két esetben már gonsoloodóba estem, hogy hogyan tudnám megoldani, nyilván plusz alkatrészekkel.
Feltöltök hozzá egy rajzot.
Set-reset reléket használok a jel kapcsolására.
A kimenetvalasztás úgy történik, hogy set állapotban az egyik kimenet aktív, reset állapotban a másik. Ez vezérlö oldalról annyit tesz, hogy van a mikrovezérlő kimenetén fesz vagy nincs. Ezért ide már kellene eg, tranzisztor is, hogy amikor nincs fesz, akkor kapjon feszt a másik visszajelző led. Hasonló a helyzet az áramkör választó (cb) esetén is. Nyilván megfontolandó a kevés plusz alkatrész cserébe a felszabaduot kikenetekért. Ha kell. -
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
-
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
Hirdetés
- Counter-Strike: Global Offensive (CS:GO) / Counter-Strike 2 (CS2)
- Android alkalmazások - szoftver kibeszélő topik
- Milyen széket vegyek?
- Bittorrent topik
- Path of Exile (ARPG)
- Redmi Note 14 5G - jól sikerült az alapmodell
- Mibe tegyem a megtakarításaimat?
- Metal topik
- One mobilszolgáltatások
- Debrecen és környéke adok-veszek-beszélgetek
- További aktív témák...
- Void RGB PC - i7 9700f, 16Gb RAM, RTX 2080Ti 11Gb stb.
- ÚJ PS5 Slim - FW 8.40 - Lemezolvasó - Lua Loader - Lua játék - Lapse
- új, bontatlan, iPhone 16E gyárilag kártya-független, apple világgaranciával
- Üzletből, garanciával, Macbook Pro Retina 16" 2019, Gray i9 64GB RAM 1TB SSD Radeon Pro 5500M
- Üzletből, garanciával, Macbook Pro Retina 16" 2019, Gray i9 64GB RAM 2TB SSD Radeon Pro 5600M 8GB
- AKCIÓ! Microsoft XBOX Series S 512GB játékkonzol garanciával hibátlan működéssel
- Garmin Fenix 8 Amoled 51mm Sapphire Carbon Gray DLC - Használt, karcmentes
- Okosóra felvásárlás!! Samsung Galaxy Watch 5 Pro, Samsung Galaxy Watch 6 Classic
- Bomba ár! HP EliteBook 840 G2 - i5-5GEN I 8GB I 256GB SSD I 14" HD+ I Cam I W10 I Garancia!
- BESZÁMÍTÁS! MSI B550M R7 3700X 16GB DDR4 512GB SSD RTX 3060Ti 8GB NZXT H5 Flow RGB 650W
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest