Hirdetés
- Meggyi001: Áram nélkül....méltóság nélkül.....
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
- gban: Ingyen kellene, de tegnapra
- sziku69: Szólánc.
- Luck Dragon: Asszociációs játék. :)
- Lalikiraly: Macbook NEO 2
- N€T0X|N: Talaria tuning: meg kéne tudni állni!
- Elektromos rásegítésű kerékpárok
- sziku69: Fűzzük össze a szavakat :)
- hcl: GPT diszk kisebbre klónozása
Új hozzászólás Aktív témák
-
A finomítottam a programkódot főként a memóriafoglalás csökkentése miatt, valamint RGB LED-re cseréltem a 4 db különálló LED-et. Debounce-al kiváltottam a delay-t a gombok lenyomásakor. Szerkesztettem az írásomat is.
-
A delay-jel sok mindent meg lehet oldani az elején, de ne tedd, ne szokj rá! Nézz utána a millis() használatának, van is example program Blink without delay néven.
A másik a tipp későbbiekre: a gombnyomások kezelésére az interrupt funkció hasznos lehet.
-
válasz
Hieronymus
#6
üzenetére
Ugyanez volt az oltásnál, körülérte a sor az épületet.
-
JasL
őstag
Tetszik az ötlet! A programkódod viszont szerintem nagyon hosszú, lehetne szépen refaktorálni ezt, pl ledeket tömbbe szervezni, és 4 soros low-high kapcsolgatások helyett egy külön erre a dologra tervezett metódusban, mondjuk: turn_on_led(int sorszam) -ban egy ciklussal végigiterálni a tömbön, és mind-et low-ra kapcsolni, kivéve az az egyet amelyik high. Ezzel sokkal olvashatóbb lenne a kódod, tömörebb, és profibb.
A gombnyomásaidon nincs debounce kód, így ha a gomb magas szintre kerül – de egy mechanikus gomb többször is beolvasható rövid időn belül, ami többszörös számláláshoz vezethet. Ez 100%, hogy be fog következni, tapasztalat több projektemben is. Tehát KELL debounce-ot hozzáadnod.
A többiekkel egyet értek, manuális nyomkodás helyett inkább egy irányérzékelő szonár szenzor, én még egy reset gombot is raknék, ami nulláz, ha a szonár félreérzékelne és a define-ok is mehetnek.
Egy kis példakód, a ciklikusnál egyszerűbb azért, de rövidebb még mindig:
void gombok() {
// Alapállapot – minden LED ki
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
// Csak a megfelelő LED legyen bekapcsolva
switch (emberekSzama) {
case 0:
digitalWrite(ledPin4, HIGH); // kék
break;
case 1:
digitalWrite(ledPin1, HIGH); // zöld
break;
case 2:
digitalWrite(ledPin2, HIGH); // sárga
break;
case 3:
digitalWrite(ledPin3, HIGH); // piros
break;
}És egy komplettebb kód, ezt olvasd át:
#define buttonPin1 7 // felső gomb +
#define buttonPin2 6 // alsó gomb -
#define ledPin1 13 // zöld LED
#define ledPin2 12 // sárga LED
#define ledPin3 11 // piros LED
#define ledPin4 10 // kék LED
byte emberekSzama = 0;
const byte maxEmber = 3; // max. érték
bool lastButtonState1 = LOW;
bool lastButtonState2 = LOW;
void setup() {
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
pinMode(ledPin4, OUTPUT);
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
// LED teszt
for (int i = ledPin1; i >= ledPin4; i--) {
digitalWrite(i, HIGH);
delay(300);
digitalWrite(i, LOW);
}
}
void loop() {
// Olvasd be az aktuális gombállapotokat
bool currentButtonState1 = digitalRead(buttonPin1) == LOW; // gomb lenyomva: LOW
bool currentButtonState2 = digitalRead(buttonPin2) == LOW;
// Gomb1 (növelés) – csak akkor számít, ha most nyomták le
if (currentButtonState1 && !lastButtonState1) {
if (emberekSzama < maxEmber)
emberekSzama++;
delay(200); // debounce
}
// Gomb2 (csökkentés)
if (currentButtonState2 && !lastButtonState2) {
if (emberekSzama > 0)
emberekSzama--;
delay(200); // debounce
}
// Frissítsd a korábbi állapotokat
lastButtonState1 = currentButtonState1;
lastButtonState2 = currentButtonState2;
// LED vezérlés
gombok();
}
void gombok() {
// Alapállapot – minden LED ki
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
digitalWrite(ledPin4, LOW);
// Csak a megfelelő LED legyen bekapcsolva
switch (emberekSzama) {
case 0:
digitalWrite(ledPin4, HIGH); // kék
break;
case 1:
digitalWrite(ledPin1, HIGH); // zöld
break;
case 2:
digitalWrite(ledPin2, HIGH); // sárga
break;
case 3:
digitalWrite(ledPin3, HIGH); // piros
break;
}
} -
-
Stitch
őstag
Kezdésnek jó kis feladat. Írtad, hogy: "Azonban így is működik."
Akarod, hogy jól is működjön?
Mi történik, ha épp a delay(200) legelején nyomsz valamelyik gombra?
Mi történik, ha tovább tartod nyomva valamelyik gombot, mint 200ms?
Mi történik, ha emberekSzama = 3 értéknél hozzáadunk még egyet?
Mi történik, ha emberekSzama = 0 értéknél levonsz még egyet? -
Turulbir
tag
A kapcsoláshoz:
-A mikrokapcsolóknál az ellenállások nagyobbra vehetőek (min. 4,7K de mivel CMOS IC-ről lévén szó, lehet inkább 10K), ez kisebb áramot jelent a bemeneten. Egyébként az atmegaban van beépített felhúzó ellenállás is, de fogalmam sincs arduinonál hogy kell bekapcsolni.
-A kimeneten célszerűbb negatív logikát alkalmazni (LED korlátozó ellenálláson keresztül VCC-re kötve, logikai 0 kimenetnél világít (GND)). Ennek oka, hogy a mikrokontrollerek kimenetei (n és p típusú MOSFET azonos méretben) általában nagyobb áramot képesek "testre kapcsolni" (sink) mint "tápra" (source), bár az arduinoban lévő atmega viszont pont szimmetrikus áramra van csinálva (valószínűleg nem azonos méretű a két FET), tehát itt nem számít. Valamint ha "direktben viszik" a LEDeket, akkor a korlátozó ellenállást 20mA-ra kell méretezni (ennyi a mikrokontroller kimenetének sink és source árama(asszem max. 40mA per pin, de portonként és összesen is van külön korlátozás). Tehát nagy fényerejű LED-et külső tranzisztorral érdemes meghajtani.RGB LEDet pedig modulálva kell meghajtani. Tehát sárga fény esetén nem egyszerre megy a piros és a zöld, hanem 50-50% kitöltési tényezővel felváltva. Ki kell kísérletezni, milyen frekvenciánál "veri át az ember szemét" (látszik egyöntetűen, folytonosan sárgának), de ezt csak valódi fizikai hardveren tudod megtenni (hiszen a kontrollműszer a saját szemed).
-
Faragok még rajta, ha lesz időm.
Kísérleteztem azzal is, hogy RGB led legyen a 4 különálló led helyett. Már van rá egy 80 százalékos megoldásom. 🙂Köszönöm a jó tanácsokat.
-
Turulbir
tag
Egyébként gondolkodtam még egy kicsit rajta:
Mivel nem 7 szegmens kijelzés van, hanem csak ledek, funkcióját tekintve ez igazából egy 4 bites kétirányú shift regiszter.
Le lehetne úgy is kódolni, hogy egy bitet jobbra-balra shiftelünk egy változóban és ezt másoljuk be az output regiszterbe.
0001 (üres a bolt) --> 0010 (1 vevő van a boltban) --> 0100 (2 vevő van a boltban) --> 0010 (1 vevő van a boltban)
Kiírva ezt a változót a pl. a PORTA-ra egy művelettel beállíthatjuk az összes ledet....interruptra kötjük a két gombot és altatjuk a procit... javíthatatlan low level hardveres vagyok
...várjál már, nézzük meg van -e ilyen IC készen
(az a vicc, hogy tényleg van)De komolyra fordítva a szót: Ugyanaz a feladat rengeteg módon megoldható! Igazából mikor mi az igény. Egy házi feladatnál leginkább az, hogy egy fél délután alatt összedobjon az ember olyan kódot, ami lefut és beadható (áh sose csináltam ilyet
). A fenti gondolatmenetem pedig egy erősen hardveres szemlélet. -
Turulbir
tag
A kettő közti lényegi különbség, hogy ahogy először csináltad: létrehoztál 6db int típusú változót, ezeknek lefoglaltál 6*16bit műveleti memóriát, értéket adtál nekik, majd ahányszor hivatkoztál rájuk a kódban, ezeket a ramból olvastad be. Define esetén amikor a compiler lefordítja a kódot, egy egyszerű behelyettesítést végez, a program memóriába az utasításhoz egy konstans kerül a memóriacím helyett.
Az csak hab a tortán, hogy az arduino-ban lévő AVR 8bites, tehát 16bites változókkal "duplán" dolgozik (2x hajt végre 8bites műveletet).Ilyen egyszerű kódnál mondhatni "nem számít", de jobb az elején megszokni az optimális kódolást, mint leszokni a berögződött dolgokról, amikor már egy projekt elérte a hardver határait. (akkor szokott az lenni, hogy: -Főnök, kell egy nagyobb mikrokontroller, ez betelt!
)A define pedig sok egyébre is hasznos tud lenni.
u.i.
Mondjuk és ahhoz a kihalófélben lévő állatfajhoz tartozom, aki még írt kódot mikrokontrollerhez assembly-ben, szóval átlátom, hogy mit is csinál a hardver. Az a vicc, hogy a fenti program AVR assemblyben nem is lenne hosszabb, mint C-ben, sőt... -
Ja már értem ezt a define módszert.
Így átírtam és Tinkercad-ben működik megfelelően://gombok deklarációja//int buttonPin1 = 7; //felső gomb +//int buttonPin2 = 6; //alsó gomb -//ledek deklarációja//int ledPin1 = 13; //zöld//int ledPin2 = 12; //sárga//int ledPin3 = 11; //piros//int ledPin4 = 10; //kék#define buttonPin1 7#define buttonPin2 6#define ledPin1 13#define ledPin2 12#define ledPin3 11#define ledPin4 10byte emberekSzama=0;Köszönöm a tippet.
-
Turulbir
tag
Némi észrevétel a programkódhoz:
A deklarációnál 7db int-ből 6db teljesen felesleges, ezek konstansok, a futás során nem változnak, define használatával a compiler majd behelyettesíti őket (6x16bit RAM felszabadul). A 7. int helyett egy byte típusú váltózó bőven elég, hiszen 0-3-ig számolunk csak (16->8bit ram). A kód így 112bit helyett 8bit RAM-ot használ. Valószínűleg ha jó a compiler, akkor ROM is szabadul fel, és a ciklusidő is csökkenhet, legalábbis AVR assembly-ben kevesebb utasítással megoldható így konstansokkal.Többek között ugyanez az oka, csak nagyban annak hogy a 8GB betelik az asztaliban...
-
-
-
Pl. így. A leggyakoribb az infra.
Két pár kell, azzal már lehet detektálni, hogy kifele, vagy befele mozgott a cucc, ami átment rajta. (Melyik jelez előbb alapon.)
(Nem raktam még össze ilyet, illetve nem is találtam hirtelen megvalósítást, de valahogy így működik.)
(Na! Itt. Bár ez se egészen azt csinálja, hogy egy ajtón ki-be mászkálást detektál.) -
válasz
Hieronymus
#2
üzenetére
Azt én se kétlem, hogy az emberek zöme el tud ötig számolni, annyi ujj azért akad a kézen
A cikk viszont tök jó irányt képvisel.
-
-
Gomb helyett a gyakorlatban a legkirályabb az áthaladást jelző érzékelő, ami jelzi, hogy be- vagy ki irányban mozgott valaki. Ez nyilván a gomb helyére simán beköthető, lekezelhető.
De különben tök jó

-
válasz
morcosharcos
#1
üzenetére
Köszönöm. Én is szívesen láttam volna ehhez hasonló jelzést, nem az eladónak kellett volna rendet tartani és kitessékelni egy-egy vásárlót, ha már túl sokan voltak bent.
-
válasz
Hieronymus
#2
üzenetére
Egyetértek, az ellen nem véd, ha egy beteg ember megy be. Fura volt ez a létszámkorlát, nem is mindenhol tartották be. Ahol meg igen, ott az utcán állt 20 méteres sor, ami meg elég kellemetlen volt.
-
válasz
morcosharcos
#1
üzenetére
Az ötletmegvalósítása jó. Az ötlet sem rossz.
A gyakorlatban viszont értelmetlen.A világ nagyobb részén nem okozott gondot, ha az ajtóra kitettek egy táblát. Maximum x személy tartózkodhat egyszerre az eladótérben.
Szó nélkül betartották az emberek.Van egy másik, nagyobb gond ezzel a megoldással. Látszólagos biztonságérzetet ad.
Ha az eladó fertőzött, minden vásárló fertőzött lehet. Lényegtelen mit mutat az eszköz.
Ha egy vásárló fertőzött volt és már elment, a fertőzés továbbra is aktív marad a levegőben. A vírusok molekuláris mozgásuk okán, nagyon lassan ülepednek ki a levegőből. Még akkor lebeghetnek, amikor már a fehérje burkolatuk szétesik, fertőző képtelenné válnak.Volt jó más ötlet, de azokból sem lett hasznos termék.
A legjobb egy olyan telefon app, ami néhány másodpercnyi beszéd alapján kiszűrte a fertőzötteket.
Mégis volt baj vele. Akkor jelzett amikor nyilvánvaló lett a fertőzöttség. Megelőzésre alkalmatlan volt a megoldás. Szükségtelen, mert aki hallott egy aktív szakaszban lévő fertőzöttet, az app nélkül is felismeri a jellegzetes hangot. -
Engem valahol zavar is, hogy a hatóságok anno (nyilván nem csak itthonról beszélek) sok esetben annyira szartak bele a védekezésbe, hogy a tiédhez hasonló jó ötletek alig-alig, elvétve jelentek csak meg a gyakorlatban.
Szép munka, tisztelem a mérnököket!
Új hozzászólás Aktív témák
- GIGABYTE RX 6800 XT 16GB GDDR6 GAMING OC - Eladó!
- BESZÁMÍTÁS! ASRock A520M R5 5500 16GB DDR4 500GB SSD RX 5700XT 8GB Rampage SHIVA Seasonic 650W
- BESZÁMÍTÁS! MSI B450M R5 5600 16GB DDR4 512GB SSD RX 6650 XT 8GB Rampage SHIVA FSP 650W
- BESZÁMÍTÁS! ASUS B450M R7 5700 32GB DDR4 512GB SSD RTX 3060 12GB Rampage SHIVA Cooler Master 650W
- BESZÁMÍTÁS! AsRock H510M i5 11500 16GB DDR4 512GB SSD RTX 3060 12GB Rampage SHIVA Adata 600W
- GAMING PC! Intel i5-14600KF / 9070 XT / 32GB DDR5 / B760 WIFI / 1TB NVMe / 850w! BeszámítOK
- AKCIÓ! ASUS B660M i5 12400F 32GB DDR4 500GB SSD RTX 5060Ti 16GB Lian LI LANCOOL 207 Inwin 650W
- BESZÁMÍTÁS! Asus H110M i5 7400 8GB DDR4 120GB SSD 500GB HDD GTX 1050 Ti Formula Air Mesh G3 400W
- 0perces DDR5 5600 vadiúj 2x16GB memória 1 év garancia
- ÁRGARANCIA!Épített KomPhone Ryzen 7 9800X3D 64GB RAM RTX 5090 32GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest

(az a vicc, hogy tényleg van)
). A fenti gondolatmenetem pedig egy erősen hardveres szemlélet.
