Először vegyük figyelembe a program logikáját. Két csapos csoportja van: 6 érintkező csatlakozik a vezetékekhez, és 6 érintkező csatlakozik a terminálokhoz. Az első dolog, amit tennék, elfelejteném, hogy ezek két különféle csoport. Fontolja meg, hogy csak 12 érintkezõje van, amelyeket a felhasználó speciális módon csatlakoztat. Így a legtöbb furcsa dolog, amelyet a használó megtehet, például a vezetékek összekapcsolása nem különösebb eset. Csak egy érvénytelen kombináció. Most az van, hogy a 12 közül minden csapra meghatározhatja, hogy össze vannak-e kötve. Ha olyan pár csatlakozik, amelynek nem szabad, akkor érvénytelen kombinációja van. Ha bármelyik pár nincs összekapcsolva, annak lennie kell, akkor ez ismét érvénytelen kombináció. Ha minden pár a várt állapot (vagy csatlakoztatva van, vagy nincs csatlakoztatva), akkor a felhasználó megoldotta a feladványt.
Most a hardver oldalról. Egyszerű módja annak, hogy megtudja, hogy két érintkező nincs-e összekapcsolva, az, ha egyiküket INPUT_PULLUP
-ra állítja, a másikat pedig OUTPUT
LOW
-ra. Ez a második tű legyen a csak hozzáférhető a felhasználó számára, aki LOW
-t ad ki. Az összes többi kitett lábat INPUT
vagy INPUT_PULLUP
értékként kell beállítani. Most, ha az első beolvassa a LOW
-t, akkor tudod, hogy van kapcsolatod. Ha a HIGH
feliratot olvassa, akkor a két érintkező nincs összekapcsolva.
Itt van egy példa program, amely bemutatja ezt az elvet. Összekapcsolja a 66 lehetséges párot, hogy ellenőrizze, hogy kapcsolódnak-e. Csak ki kell cserélnie a belső if
kódot, amely érvényesíti a kombinációt.
const int PIN_COUNT = 12; const uint8_t pins [PIN_COUNT] = {...}; void setup () {Serial.begin (9600); // Állítsa az összes csapot INPUT_PULLUP értékre. for (int i = 0; i < PIN_COUNT; i ++) pinMode (csapok [i], INPUT_PULLUP);} void loop () {// Hurkoljon az összes csappárra (csapok [i], csapok [j]).
// Állítsa az [i] csapokat OUTPUT LOW értékre, majd olvassa el a [j] csapokat. for (int i = 0; i < PIN_COUNT - 1; i ++) {pinMode (csapok [i], OUTPUT); digitalWrite (csapok [i], LOW); for (int j = i + 1; j < PIN_COUNT; j ++) {if (digitalRead (csapok [j]) == ALACSONY) {Serial.print ("csapok"); Soros nyomtatás (csapok [i]); Soros nyomtatás ("és"); Soros nyomtatás (csapok [j]); Serial.println ("össze vannak kötve."); }} pinMode (csapok [i], INPUT_PULLUP); }}
Ami a biztonságot illeti, jól kell lenned mindaddig, amíg a felhasználóknak nincs semmilyen alacsony impedanciájú föld- vagy feszültségforrásuk. Különösen a GND és az 5V érintkezők ne legyenek hozzáférhetők a felhasználók számára. A fokozott védelem érdekében 1 kΩ-os ellenállást sorozatosan lehet elhelyezni az egyes csapokhoz, de akkor az összes aktívan nem tesztelt csapot INPUT
helyett INPUT_PULLUP
kell beállítani, különben több A párhuzamos húzások elkezdhetik versenyezni a soros ellenállást.