Kocka LEDu in pospeškomer

Odkril sem, čemu služi kocka LEDu!

Kocka je priključena, kot je opisano v prejšnjem blogu. Dodal pa sem analogni pospeškomer na pine A0, A1 in A2, poleg tega pa še zvočnik na pin 1, ker je to lepo slišati.

Program bi se dalo napisati tudi krajše, vendar mi je tule več do prijaznosti do bralca.

// Koordinate trenutno prizgane diode
char x, y, z;

// (Predvidena) prebrana vrednost v vodoravni legi
#define O 512
// Potrebno odstopanje od O, da spremenimo koordinate
#define D 10


void nastavi(char x, char y, char z, char stanje) {
    /* Prizge ali ugasne (stanje = HIGH ali LOW) diodo na
     * koordinatah x, y, z.
     * Funkcija ni primerna za vec prizganih diod hkrati.
     */
    digitalWrite(2 + z, stanje);
    digitalWrite(5 + x + 3 * y, stanje);
}

void setup() {
    for(int i = 1; i < 14; i++) {
        pinMode(i, OUTPUT);
        digitalWrite(i, LOW);
    }
    x = y = z = 1;
    nastavi(x, y, z, HIGH);
}


char change(char pin, char value) {
    /* Prebere napetost na podanem pinu in pove, za koliko
     *  (-1, 0, +1) je potrebno spremeniti vrednost. Ce je
     *  vrednost na meji (0 ali 2) in bi jo sprememba spravila
     *  prek meje, vrne 0.
     */
    int acc = analogRead(pin);
    if ((acc > O + D) && (value < 2)) {
        return +1;
    }
    if ((acc < O - D) && (value > 0)) {
        return -1;
    }
    return 0;
}

void loop() {
    char dx = change(0, x);
    char dy = change(1, y);
    char dz = change(2, z);
    if (dx || dy || dz) {       // Ce je potrebno spremeniti katero od koordinat
        nastavi(x, y, z, LOW);  // Ugasnemo trenutno
        x += dx;                // Spremenimo koordinate
        y += dy;
        z += dz;
        digitalWrite(1, HIGH);  // Zvocnik
        nastavi(x, y, z, HIGH); // Premaknemo
        delay(30);
        digitalWrite(1, LOW);
    }
}

Dodaj odgovor

Vaš e-naslov ne bo objavljen. * označuje zahtevana polja