Kérdés:
Több pinMode () és digitalWrite () csap lecserélése egy tömbre
zdub
2016-10-19 21:10:12 UTC
view on stackexchange narkive permalink

Szeretnék egy „tömb egyetlen sorának felhasználásával” kitakarítani egy olyan kódot, amely több pinMode () és digitalWrite () sort is tartalmaz. Nagyon új vagyok mindkét tömbben, ezért kissé zavart vagyok. A következő példák a kód részei, amelyek egy 4 számjegyű, 7 szegmenses LED-et vezérelnek.

  // Megjelenítési csapok definiálása // Digit pins (közös katód) int digit1 = 13; // Kijelző tű 1 számjegy2 = 12; // Kijelző tű 2 számjegy 3 = 11; // Kijelző tű 6 számjegy 4 = 10; // Kijelző 8. tű // Segins pinsint segA = 2; // Kijelző tű 14int segB = 3; // Kijelző tüske 16int segC = 4; // Kijelző tüske 13int segD = 5; // Kijelző tű 3int segE = 6; // Kijelző tű 5int segF = 7; // Kijelző tű 11int segG = 8; // Megjeleníti a 15-ös tűt, kerülje a beállítást () {pinMode (segA, OUTPUT); pinMode (segB, OUTPUT); pinMode (segC, OUTPUT); pinMode (segD, OUTPUT); pinMode (segE, OUTPUT); pinMode (segF, OUTPUT); pinMode (segG, OUTPUT); pinMode (digit1, OUTPUT); pinMode (digit2, OUTPUT); pinMode (digit3, OUTPUT); pinMode (digit4, OUTPUT);} # define SEGMENT_ON LOW # definiálja SEGMENT_OFF HIGH kapcsolót (numberToDisplay) {eset 0: digitalWrite (segA, SEGMENT_ON); digitalWrite (segB, SEGMENT_ON); digitalWrite (segC, SEGMENT_ON); digitalWrite (segD, SEGMENT_ON); digitalWrite (segE, SEGMENT_ON); digitalWrite (segF, SEGMENT_ON); digitalWrite (segG, SEGMENT_OFF); break;  

Tűk meghatározása:

Biztos vagyok benne, hogy az alábbi kód a helyes módszer a csapok tömbként való tárolására (de kérem, javítson ki, ha én ' m rossz).

  digitPins [] = {13 12 11 10}; segPins [] = {2 3 4 5 6 7 8};  

pinMode():

Tudom, hogy a for ciklust használhatnám a pin módok beállításához, de van-e még egyszerűbb módszer? Valami ilyesmi működne?

  pinMode (digitPins [], OUTPUT); pinMode (segPins [], OUTPUT);  

digitalWrite ():

Hozzáférhettem a tömbből a megfelelő PIN-kódhoz, amelyet a digitalWrite () -ben használhatok, mint az alábbi kód, de ez ugyanannyi kódsort eredményezne (és még zavaróbb lenne). Van még egy lehetőség?

  digitalWrite (segPins [1], HIGH);  
Néhány releváns kérdés: [Interfacing billentyűzet arduino-val 7 szegmenses kijelzővel] (https://arduino.stackexchange.com/questions/30222/interfacing-key-pad-with-arduino-with-7-segment-display) és [7 szegmenses megjelenítési kód] (https://arduino.stackexchange.com/questions/29159/7-segment-display-code).
Mivel ez egy négyjegyű, 7 szegmenses kijelzőről szól, valószínűleg a legrelevánsabb kérdés az ellenőrzés: [Hogyan használhatunk egy közös 7-szegmenses anódos, 4-jegyű kijelzőt?] (Http://arduino.stackexchange.com/q / 21608).
Négy válaszokat:
JRobert
2016-10-20 00:26:18 UTC
view on stackexchange narkive permalink

a csapok tömbként való tárolásának helyes módja

A tömb inicializálóinak majdnem helyesek; csak vesszővel kell elválasztania az értékeket:

  digitPins [] = {13, 12, 11, 10}; segPins [] = {2, 3, 4, 5, 6, 7 , 8};  

A pinMode () ciklust kell meghívnia; nem fogad el tömböt argumentumként.

Mi a helyzet a digitalWrite () -vel, ahol a HIGH és LOW keveréke van?

Vannak (legalábbis ) kétféleképpen: Készítsen HIGH és LOW értékeket tartalmazó tömböket, egyezzen a digitPins [] és a segPins [] tömbökkel egyenként. Vagy a könnyebb karbantartás érdekében deklarálja a pin # és az érték adatstruktúráját ( struct ); készítsen tömböt azokból. Kicsit összetettebb, de hasznosabb is. Tehát például:

  typedef struct {uint8_t pinNum; bool pinVal;} pinInit_t; pinInit_t digitPins [] {{13, HIGH}, {12, LOW}, {11, LOW}, {10, HIGH}}; void setup () {// tegye ide a beállítási kódot, futtassa egyszer:} void loop () {// tegye ide a fő kódot, hogy többször fusson:}  

struct az "adatszerkezet" rövidítése; lehetővé teszi, hogy a különböző típusú adatokat egyetlen megnevezett és címezhető egységgé egyesítse. A typedef új adattípust deklarál, és azt mondja: "Ne foglaljon most memóriát; ez (pinInit) csak leírás. A későbbiekben használom." Lehetővé teszi a pinInit megnevezett adattípus használatát, ahol csak natív adattípust használhat, és megengedett egy többértékű adattípus (például egy tömb).

Így létrehozhatunk egy tömböt pinInit s (pin- # / logikai értékpárok) csak az új típus nevének használatával.

Akkor az inicializáló kód a következőképpen nézhet ki:

  uint8_t i; for (i = 0; i < sizeof (digitPIN) / sizeof (pinInit_t); ++ i) {pinMode (digitPins [i] .pinNum, OUTPUT); digitalWrite (digitPins [i] .pinNum, digitPins [i] .pinVal);}  

A sizeof (digitPins) / sizeof (pinInit) kifejezés az inicializálók számát értékeli (bájtok száma a tömbben / bájtok száma egy tömb tagban).

A digitPins [i] .pinNum kifejezés jelentése: "a pinInit tömb digitPins-ben kapja meg az i-edik elemet ..." (ne feledje, ez egy értékpár), "... és vegye fel a "pinNum" tag értékét. Kicsit bonyolultabb, amikor először belegondolunk, de nézzük meg, milyen könnyen olvasható a tömb. És egy tipp a kifejezés elolvasására: visszafelé olvastam: "a pinNum tagja a digitPins tömb i-edik eleme. "

Holnap, vagy a következő hónapban, amikor újabb tűre van szükségünk, nem kell frissítenünk 2 tömböt (természetesen emlékezünk arra, hogy egymás között legyenek! ); csak adjon hozzá egy másik 2 értékű elemet az egy digitPins [] tömbhöz.

Dat Ha
2016-10-19 21:16:27 UTC
view on stackexchange narkive permalink

[KIEGÉSZÍTŐ KÓD és A KÓD MAGYARÁZATA]

Ez az a funkció, amelyet a megjegyzésekben közzétett linkben használnak:

  void number (int num) // num a megjelenítendő szám {for (int i = 0; i<7; i ++) // a 7 szegmensen (7 led) keresztül haladva {digitalWrite (segment [i], nums [szám] [i]); // mondd meg az arduinónak, hogy kapcsolja be vagy ki, melyik led vezetett}}  

Nagyszerű, mert a következő hívással használhatja:

  szám (/ * a megjeleníteni kívánt szám * /);  

A for ciklus használata elkerüli a sok dolog másolását és beillesztését. Ez lehetővé teszi sok memória megtakarítását is.

Ezután egy kis 0-9 időzítő megjelenítéséhez ezt megteheti:

  for (int i = 0 ; i<10; i ++) {szám (i); // megjeleníti a számkésleltetést (1000); // várjon 1 másodperc}  

[EREDETI VÁLASZ]

Használjon tömböt és egy hurok.

  int szegmensek = {2,3,4,5,6,7,8}; // a pinsvoid setup () deklarálása a (int i = 0; i<8; i ++) {pinMode (szegmensek [i], OUTPUT) számára; // kimenetnek nyilvánítás}}  

Nagyon hasznos. Ugyanezt tegye a számjegyekkel is.

Ez a módszer sok esetben működik:

  • sok érzékelő, kapcsoló
  • sok kimenet, például led, relé , tranzisztorok
Mit szólnál a digitalWrite () alkalmazáshoz, ahol a HIGH és a LOW keveréke van?
@zdub, amely valóban bonyolultabbá teszi a dolgokat, de ha * jó * megoldást szeretne arra, amit valószínűleg keres, szerkessze a kérdését, hogy egynél több lehetőséget mutasson az adatok írására.
itt van egy hozzászólás, amelyet jó ideje tettem közzé a 7-seg-ről: http://arduino.stackexchange.com/questions/30031/switching-methods-functions-with-a-button/30032#30032
A HIGH és LOW keverékéhez csak a HIGH és LOW listát kell megadni egy tömbben. Egyébként feltétlenül állítsa be a "const" tömböt, és ami még jobb, rendezze a "PROGMEM" -be is, bár ennek teljesítményre van hatása.
@canadiancyborg 2D tömbök !! Nem tudtam, hogy ez egy lehetőség, de azt hiszem, működni fog. Miért kell ennek a digitalWrite-nek ([i] szakasz, [n] [num] [i]) egy for ciklusban lennie? Miért nem lehet az „i” csak változó, és a kód a for ciklus nélkül működik.
hát mert ledenként 7 szegmensed van és hány számjegyet kell bekapcsolni ??? egy tömb egyszerűen gyorsabb. Egy perc alatt szerkesztem az előadót. és rosszul magyarázza a kódot egy kicsit tovább
felejtsd el, amit az előző megjegyzésben mondtam, csak kövesd az anwser szerkesztését !!!
Thomas Devoogdt
2017-12-31 16:31:44 UTC
view on stackexchange narkive permalink

Egyéni módszerhasználat

Használt hivatkozás: https://stackoverflow.com/a/33235154/5500092

Használhat olyan egyéni módszert is, mint ez:

  template<size_t size>void pinMode (const uint8_t (&pin) [size], uint8_t mode) {for (size_t i = 0; i < size; ++ i) {pinMode (pin [i ], mód); }} template<size_t size>void digitalWrite (const uint8_t (&pin) [size], uint8_t val) {for (size_t i = 0; i < size; ++ i) {digitalWrite (pin [i], val); }}  

Ezután meghatároz egy tömböt a csapokkal:

  uint8_t displayPins [4] = {13, 12, 11, 10}; uint8_t segmentPins [7] = {2, 3, 4, 5, 6, 7, 8};  

És végül a beállítás során:

  érvénytelen beállítás () {pinMode (displayPins, OUTPUT); pinMode (segmentPins, OUTPUT);} void loop () {// Logikája a digitalWrite szolgáltatással.}  

A logikája

PS: A logikájához, akár használhatja is:

  template<size_t size>void digitalWrite (const uint8_t (&pin) [size], const uint8_t (&val) [size]) {for (size_t i = 0; i < size; + i) {digitalWrite (pin [i], val [i]); }}  

És adjon meg minden szegmensszámhoz egy egyedi értéktömböt.

  uint8_t nulla [7] = {HIGH, HIGH, HIGH, HIGH, HIGH , HIGH, LOW}; ...  

Vagy akár:

  uint8_t szegmens [] [7] = {{HIGH, HIGH, HIGH, HIGH , HIGH, HIGH, LOW}, // 0 {____, ____, ____, ____, ____, ____, ____}, // 1 {____, ____, ____, ____, ____, ____, ____}, // 2. .. {____, ____, ____, ____, ____, ____, ____}}; // F  

És használja:

  digitalWrite (segmentPins, segment [5]); // kinyomtatni 5  
bandirom
2018-07-04 19:04:35 UTC
view on stackexchange narkive permalink
  func () {logikai csapok [] = {1,1,1,1,1,1,0}; mert (int i = 0; i<7; i ++) `digitalWrite (segPins [i], csapok [i]);}  

ez mind :)

Kérjük, adjon meg egy szöveges leírást, miért válasz a javasolt megoldás. A kódot is formázza helyesen. Kérjük, olvassa el a [Hogyan írjak egy jó választ] című cikket (https://arduino.stackexchange.com/help/how-to-answer). Ha jól bemutatott választ ad, akkor nem kap ennyi visszhangot.
1. Ez nem segít, mivel a tíz számjegy mindegyikéhez egy ilyen funkcióra lenne szükség. 2. Nem áll össze.


Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...