Arduino analóg gombok

A kérdés inkább elektronikai/fizikai jellegű mint programozás.

Arduino nano-ból csinálok "okosotthon" vezérlést (egyelőre: világítás kapcsolás illetve hőmérséklet mérés a helyiségekbe, ami alapján kapcsolja majd a fűtés köröket egy másik arduino).

A probléma, hogy a digitális lábakból nincsen sok, és bizony van ahol pl. 8 kapcsoló van... Nem akarok 8 digitális lábat ellőni csak erre, hogy maradjon még jövőbeni fejleszéseknek. Itt van egy példa arra, hogy hogyan lehet 1 analóg lábra több gombot tenni:https://www.instructables.com/How-to-Multiple-Buttons-on-1-Analog-Pin-A…

Ez tök jó... Csak én azt találtam ki, hogy jó lenne, ha lennének kombók, azaz pl. más történik, ha 2 vagy 3 kapcsolót egyszerre nyomsz meg (Pl. két adott kapcsoló lenyomása egyszerre a helyiség összes világítását lekapcsolja. Vagy a főbejárat melletti kapcsolósornál 3 kapcsoló egyszerre lenyomása a ház összes felkapcsolva maradt villanyát lekapcsolja, és hasonlók). Szóval az ellenállások értékeit úgy kellene megválasztani (mondjuk menjünk el 8 db kapcsolóig, amiből egyszerre maximum tetszőleges 3-at le lehet nyomni), hogy egyértelműen meghatározható legyen, hogy melyik 1, 2 vagy 3 kapcsoló van lenyomva.

Hozzászólások

A linkelt megoldásnál pont a kívánt "egyszerre többet nyomok" esetet nem lehet megengedni, mindegyik gomb határozott feszültséget okoz.

Azt mondanám, hogy emellé a CTRL, SHIFT gombokat külön lábakon kezeld, és akkor azokat már lehet figyelembe lehet venni a feldolgozáskor.

"Normális ember már nem kommentel sehol." (c) Poli

Igen lehet szerintem is. A feladat, hogy az ellenállások értékét úgy kell meghatározni, hogy bármelyik tetszőleges 1 2 vagy 3 értéke egyedi legyen (ezáltal egy egyedi feszültségszint), így pontosan lehet tudni, hogy az adott szinthez mi tartozik.

"Sose a gép a hülye."

Csak míg egy bitmintáról egyértelműen el lehet dönteni hogy ez vagy az, az analógnak akár a páratartalom miatt, akár külső interferencia miatt, akár az érintkezők oxidációja miatt lehet eltérése pluszban-mínuszban. Tehát hagyni kell egy kényelmes tól-ig tartományt.

De ha veszek pl. egy ilyen mintát: 1k, 3k, 10k, 20k, 50k, 100k, 300k, 500k, elsőre tök jól néz ki... Másodjára meg rájössz, hogy az 500k és 501k, de még a 300k vs. 301k ellenállás is ~ugyanaz, szóval stabilan azt nem lehet használni, de ugyanígy sovány az 500+3, 300+3 a 100+1 is... Szóval jól elhatárolható, de mégis egyedi értékeknek kell lenni a kombóknak is.

"Sose a gép a hülye."

Miért a kapcsolók számával operálsz? Miért nem a kapcsoló különböző nyomásával?

- single click
- double click
- hold

Szerintem egy kicsit túlmisztifikálod a valóban szükséges kombók számát, elenyésző lesz az, mikor egy speckó funkciónál többet kell csinálni, főleg, úgy, hogy kevés a gombod. Pl a fenti példádban ha van három gombod a bejáratnál, akkor simán csak longpushal 3 speckó funkciót ki tudsz onnan vezetni. Annál többet meg se fogsz jegyezni, meg úgyis rájössz, hogy inkább vmi automatizmus, meg szoftverből csoportosítás-

A megjegyzés egyébként sarkalatos, bár nyilván egyénfüggő, de nekem pl van 6 kapcsoló egy helyen, egy mindig elmész melette helyen, épp azért került oda, hogy kényelmes legyen egyszerre bármit. Azt a 6-ot nem tudom megjegyezni, hogy melyik mi, nem hogy még miket nyomjak egyszerre. És akkor is személy szerint már inkább azt, hogy "ezt hosszan mást csinál", pl a "nappali lámpája hosszan a nappali összes lámpáját kapcsolja", mint az "ez a kettő együtt mást csinál", pl a "a nappali lámpája együtt egy másikkal kapcsolja az egész nappalit". De ez teljesen egyénfüggő lehet, tényleg.

A bejárat mellett 4 doboz van sorolva, és dupla kapcsolókat vettem... Szóval az ott 8. :)

De hogy mi mit fog kapcsolni, ez még most lesz kitalálva, szóval bármi lehet. Akár az is, hogy lesz egy dedikált "minden le". A nappaliban meg a konyhában is 3 doboz van, az 6 kapcsoló mindkettő. Igazából a logika az volt, hogy ilyen váltókapcsoló jelleggel lehessen majd mindent kapcsolni. Az ajtón ha bemész, lekapcsolod a külső lépcső világítás, felnyomod a nappalit, tovább mész a konyhába, onnan lenyomod a nappalit, fel a konyhát... Aztán ha mész a folyosón tovább, onnan le tudod kapcsolni a konyhát, meg fel a folyosót. Ha bemész a fürdőszobába, fel tudod kapcsolni bent a fenti és/vagy a tükör lámpát, meg le a folyosót... stb.

"Sose a gép a hülye."

Biztos ilyen szinten akarod megoldani? Ott vannak a HomeAssistant-ba szépen integrálható kütyük, csak össze kell legózni.

Szerkesztve: 2023. 01. 23., h – 11:44

Két alternatívát is lehet csinálni:

 * Charlieplexing működik gombokra is, mindegyikre kell egy dióda persze. 4 láb 12 gomb szerintem. (Ha jól emlékszem vegyesíteni is lehet a LED kimenetet és gomb  bemenetet charlieplexinggel, és a beépített felhúzó ellenállás elegendő a működtetéshez ha jól emlékszem.)

 * Input shift regiszterrel latch, chip select (ha van ilyen akkor az SPI vonalat másra is tudod használni), SPI clock, SPI input, tehát 4 lábbal tetszőlegesen sok bemenetet kezelhetsz végtelen hosszan összefűzve.

Három analóg vonalon már lehet kezelni 8 féle állapotot (ebből egy a semmi nincs lenyomva), ugye bináris számrendszer alapján.

A 8 gombot kötheted egy encoder IC-re, pl. 74LS148-ra, vagy hasonló encoderre.
Ez a 8 bemenetből készít egy bináris kimenetet, ami mehet az arduinoba. 

Ez nem rossz, ha csak simán 8 (ami ugye 7 valójában ) gombot kéne illeszteni analógra, de arra ott a sima ellenállásos módszer...

Viszont a vázolt helyzetben "tetszőleges 2 vagy 3 lenyomása" már (8 + 8*7 + 8*7*6) db kombináció. Jó oké nem vagyok telhetetlen... Ne legyen tetszőleges 3 gomb, legyen 1 vagy két CTRL vagy SHIFT vagy akárminek nevezett gomb. De akkor is több mint 8 felállás van.

"Sose a gép a hülye."

Nekem van egy konkrét tapasztalatom ilyen ellenálláshálós gombokkal. Egy gagyi 12 gombos tasztatúra volt. A gombok nem voltak tökéletesek, és a nyomás függvényében nekik is volt ellenállásuk. Emiatt nem lehetett egyértelműen kiolvasni, hogy mit nyomott le a user. De legalábbis néha hibázott. Persze ez egy gagyi példány volt, tudjuk, hogy van ilyen ellenálláshálósból olyan ami jól működik. De idővel ahogy koszosodnak az érintkezők ezek is problémássá válhatnak, és én arra jutottam, hogy soha nem fogok ellenálláshálós billentyűzettel játszani.

Alapvetoen en is vagy a shift regiszterek vagy a Charlie/multiplexing iranyba indulnek el.

SN74**166 (LS, HC, HCT es tarsai) gombokert vannak, es konnyen kezelhetoek az Arduino SPI portjaval (vagy a shiftIn/shiftOut rutinokkal). Ha nem kell csak input, es mas SPI eszkoz nincs, a kimenet es a chip select kihagyhato (ertelemszeruen a 166-ok labat fixen aktivba kotve), 2 labbal megoldhatsz mindent.
Ha output is kell, SN74**595 megint segit. Vegyesen 166 es 595 hasznalhato, ez is filleres tetel, es ha ezeken kivul nincs mas, megint nem kell chip select, 3 labbal meghajthatod mindet (kicsit villogni fognak a ledek, amikor atshifteled rajtuk az egyeb adatot, ha nincs kulon load, de +1 labbal az is megoldhato - ha LEDen kivul masra is hasznalod az outputot, ez mindenkeppen ajanlott).
Ezekkel egymastol fuggetlen input es outputokat kaphatsz tetszoleges mennyisegben.

Vannak portbovitok, ezek flexibilisebbek, de a fenti filleres alkatreszekhez kepest horror aron vannak. Attol fuggoen, hogy mit valasztanal, meg az is lehet, hogy egy par Atmega8 is olcsobban kijon pluszban. De persze nem kell veluk szorakozni, foleg, ha talalsz ra libet.

Multiplexingnel tipikusan matrixban vannak a dolgok, ez is mukodik, hasznaltam mar. N sor es K oszlop eseten N+K labat hasznalsz fel, es N*K gombot kezelhetsz kenyelmesen.

Charlieplexing szinten jo, kicsit macerasabb a vezetekezes, de konnyen lehet gombokat es LEDeket vegyiteni. Hatranya, hogy kicsit nehezebb, mint a multiplexeles, es minden gombhoz kell plusz dioda. (sok gomb egyideju nyomasakor a multiplexinghez is) N labbal N*(N-1)/2 gombot/LEDet tudsz lekezelni.

Multiplexing meg Charlieplexingnel meg arra kell figyelned, hogy a LEDek fenyereje tipikusan csokkenni fog (ha sokat hasznalsz), mert nem tudod oket akarmilyen kombinacioban hajtani az ido 100%-ban. De ez ritkan problema.

Alapvetoen mondjuk 32-48 input+outputig gond nelkul shift regisztereznek. Ha csak par LED van, es kb. 80-120 gomb (mint egy PC-s billentyuzetnel), akkor meg multiplexinggel oldanam meg.

Ha nagyon sok feladat van ezen kivul, a gomb+LED kezelesre betehetsz egy masik, butabb mikrokontrollert, ami csak az eredmenyt adja at (es neki a kivant LEDallapotokat adod). (Atmega8 itt is a baratod, bar mostanaban felment az ara)

A strange game. The only winning move is not to play. How about a nice game of chess?

Charlieplexingnél nincs felezés, N*(N-1) perifériát lehet kezelni N lábbal. Tehát az eredeti 8 gomb követelményhez 4 láb elegendő és még marad 4 tartalék ki/bemenet.

Egyébként nagy +1

Még több bemenetre is lehet shift regiszterezni, a gyakorlati limitje nagyon nagy a megoldásnak - csak a csipek mérete szab csak korlátot, hogy elférjenek. A beshiftelés nagyon gyors lesz, a legtöbb csip simán elviszi a 20MHz-t ami egy alap Arduinon a maximális SPI sebesség.

A Microchip megvette az Atmelt ugye, és kiadtak új szériájú csipeket. Ezek az ATTiny series-0, series-1 csipek. Teljesen mások, mint a "régi" ATTiny-k, a tudásuk a Mega-ákhoz áll közelebb, sok szempontból még annál is többek. Ezek az új csipek sokkal olcsóbbak, mint a "régiek". Ezeket 1USD kürül be lehet szerezni. Tehát atmega8 helyett ilyet érdemes ma már használni. Az egyetlen hátrányuk, hogy sok mindent újra kell tanulni. Én végigmentem ezen és most már imádom ezeket a csipeket.

Igen, a felezesben igazad van, rosszul emlekeztem. A polaritas az egyik, ami megkulonbozteti oket, azert is kell a dioda.

Atmega8-asokat meg 40 cent korul vettem darabjat (volt meg olyan is, hogy $3.8-ert 10-et). Azota felmentek. Mindenesetre az ilyen portbovitoknel tobbet tudnak (logikat is tehetsz bele), es boven van labuk. Szoval erdemes ezt is megvizsgalni.

Egyebkent azt kihagytam, hogy termeszetesen az analog ellenallasos modszer is mukodik, de a zaj es az ellenallasok szorasa miatt nagyon meg kell gondolni a dolgot. Talan ha fold+egy kabelen jon tavolrol valami kapcsolokrol, 2-3 nyomogomb vagy kapcsolo eseten meg meggondolnam. Esetleg ha nem kell egyszerre tobb lenyomasat kezelni, 6-8 db-ig. Egyik ismerosom szenvedett azzal (hasonlo hazautomatizalos project), hogy analog modon tobb ellenallassal nyomogombokat olvasson. Nala pluszban nehezitette, hogy opto elott voltak a nyomogombok/kapcsolok, es utana az ADC. Nem volt egyszeru mutatvany. :) (nala nem kellett megkulonboztetni az egy vonalon levo kapcsolokat - ennyiben egyszerubb volt a dolga - a darabszamukat viszont igen (ilyen folyoson levo vilagitasnyomogombokhoz tervezte at a meglevo rendszeret))

Szinten kihagytam, hogy persze Arduinobol vannak sokkal tobb labuak is. Atmega2560, meg mindenfele ARM alapuaknak alapbol sok laba van, ennel sem kell szorakozni. De a shift-regiszter persze konnyebben bovitheto.

A strange game. The only winning move is not to play. How about a nice game of chess?

Mert szeretném én megcsinálni. Mert szabadon akarom használni arra amire kitalálom. Lehet hogy lesz két gomb (vagy kombó) amivel +/-0.5 fokot lehet állítani majd a kívánt hőmérsékleten.... Mert nem akarok cloudba connectáló semmilyen cuccot. És mondjuk az sem utolsó, hogy

"Wi-Fi rádiójel teljesítmény: 1mW
Wi-Fi Hatótávolság: akár 50 m kültéren és 30 m beltéren (az építőanyagtól függően)"

Hát erre befizetek... Vályog. A 80mW-ra belőtt AP az 50 centis fal túloldalán 1-2 pöcök, két fallal arrébb annyira 0, hogy nem is látszik az SSID. Szóval meg lennék lepődve, ha mondjuk egy ilyen beépített antennás, falba süllyesztett dobozban lévő valami akár csak helyiségen belül stabilan működne

"Sose a gép a hülye."

Bocsánat, de a faszé' szopsz Arduino-val és pláne Nano-val, amikor annyi pénzért már ESP32-t lehet kapni... azon meg van 12 ADC, 2 DAC, 16 PWM és ~32 GPIO, ha az előbbiek nem kellenek.

A diódával akarsz szívni, akkor Charlieplexing.
Ha digit ICvel, akkor billentyűzet mátrix, 4017 oszlopcímzésre, az annyiszor 10 gomb ahány IO+2-t akarsz feláldozni.

Amúgy, osztom _Franko_ kolléga véleményét.

"Maradt még 2 kB-om. Teszek bele egy TCP-IP stacket és egy bootlogót. "