Hanyho bastlírna
Poslední změny
Arduino - KeyCode/Alarm
Hardware
Mega8 Loader
Hardware
LPC interface
Hardware
Simple SNMP
Hardware
Řadič LCD
Hardware
Raspberry PI
Hardware
J-Link
Hardware
AVR miniTOOL
Hardware
ARM C3 STM32
Hardware
10-BaseT
Hardware
LCD SPI
Hardware
UDP Audio
Hardware
ZyXEL patch
Hardware
KIT NXP LPC17xx
Hardware
I2C LPT
Hardware
Digilent S3 DSP
Hardware
Xilinx DLC10
Hardware
Patmel USB
Hardware
POE injektor
Hardware
Xilinx ISE
Software

 

Arduino "Keycode/alarm"(NANO, UNO, MEGA)


příkladem spojení dílčích periferií které je dnes možné koupit za cenu více než přátelskou jsou moduly pro projekt ARDUINO jejich spojením do jednoho funkčního celku můžeme například získat jednoduchý kódový zámek/alarm, který najde využití na mnoha místech jako ovládání otevíráni čehokoli ne jen zámku dveří. Zapojení obsahuje tři periferie - klávesnici s 16ti tlačítky, LCD displej a piezo reproduktor, zadním správného 6-ti místného PINu se zámek odemkne, po opětovném zadání správného PINu zámek zamkne, PIN může obsahovat čísla 0-9 a písmena A-D. Stejné chování dostaneme i při zadávání znaků pomocí sériového portu, například z telefonu přes bluetooth apod...

Dalším příkladem spojení dílčích periferií do jednoho funkčního celku je jednoduchý kódový zámek/alarm. Zapojení obsahuje tři periferie - klávesnici s 16ti tlačítky, LCD displej a piezo reproduktor, zadním správného 6-ti místného PINu se zámek odemkne (rozsvítí buildin-led), po opětovném zadání správného PINu zámek zamkne (zhasne build-in LED), PIN může obsahovat čísla 0-9 a písmena A-D. Stejné chování dostaneme i při zadávání znaků pomocí sériového portu.

'Sketch' používá dvě jednoduché knihovny Dimmer a KeyBoard, jsou použity jen pro zpřehlednění psaného kódu a nedělají nic komplikovaného, celý uvedený příklad by se dal ještě zpřehlednit použitím další knihovny například pro menu. Většinu knihoven nejen jako součást k nějakému hardware/modulu lze najit zde.

        #include "LiquidCrystal.h"
        #include "KeyBoard.h"
        #include "Dimmer.h"
        
        #define DOOR 13

        const char empty[] = "                ";
        const char main[] = "  ARDUINO-DOOR  ";
        const char mainmenu[] = "MAIN MENU:      ";
        const char doorclosed[] = "DOOR CLOSED     ";
        const char dooropened[] = "DOOR OPENED     ";
        const char retry[] = "fail, try again ";
        const char pin[] = "ENTER PIN:______";

        Dimmer dim(10);
        LiquidCrystal lcd (12, 11, 5, 4, 3, 2);
        KeyBoard kb(14, 15, 16, 17, 2, 3, 4, 5);

        char menustate = 0;
        char masterpin[] = "123456";
        char userpin[] = "000000";
        char enteredpin[] = "******";
        int enteredchars = 0;

        void setup() {
          pinMode(DOOR, OUTPUT);
          Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
          analogWrite(9, 10);     // set contrast VO (pwm)
          lcd.begin(16, 2);
          dim.on(128, 30000, 1200);
          menu(0);

          for (int i = 1200; i <= 1600; i += 200) {
            tone(6, i, 20);
            delay(25);
          }
        }

        void loop() {

          if (dim.available() > 0)
            if (dim.dimming()) {
              draw(empty, empty);
              menustate = 0;
            }

          if (kb.available() > 0) {
            dim.on(128, 10000, 600);
            while (char key = kb.read()) {
              tone(6, 1600, 20);
              menu(key);
            }
          }

          if (Serial.available() > 0) {
            char key;

            dim.on(128, 10000, 600);
            while ((key = Serial.read()) != -1)
              if ((key >= '0' && key <= '9') || (key >= 'A' && key <= 'D')) {
                menustate = 1;
                menu(key);
              }
              else if ( key == 0x0d || key == 0x0a ) {
                tone(6, 1600, 20);
                enteredchars = 0;
              }
          }
        }

        void menu(char key) {
          switch (menustate) {
            case 0:
              draw(main, pin);
              lcd.setCursor(10, 1);
              enteredchars = 0;
              menustate = 1;
              break;

            case 1:
            case 3:
              switch (key) {
                case '#':
                  if (enteredchars == 0) {
                    draw(mainmenu, pin);
                    lcd.setCursor(10, 1);
                    menustate = 3;
                  }
                  break;

                case '*':
                  draw(main, pin);
                  lcd.setCursor(10, 1);
                  enteredchars = 0;
                  break;

                default:
                  enteredpin[enteredchars++] = key;
                  lcd.print('*');
                  if (enteredchars == 6) {
                    switch (menustate) {
                      case 1:
                        if (compare(enteredpin, masterpin, 6) || compare(enteredpin, userpin, 6)) {
                          changedoorstate();
                          menustate = 0;
                        }
                        else {
                          draw(retry, pin);
                          lcd.setCursor(10, 1);
                        }
                        break;

                      case 3:
                        if (compare(enteredpin, masterpin, 6)) {
                          draw(mainmenu, empty);
                          menustate = 4;
                        }
                        else {
                          draw(retry, pin);
                          lcd.setCursor(10, 1);
                        }
                        break;
                    }
                    delay(300);
                    enteredchars = 0;
                  }
              }
              break;

            case 4:
              break;
          }
        }

        void changedoorstate () {
          if (digitalRead(DOOR)) {
            digitalWrite(DOOR, LOW);
            draw(dooropened, empty);
            Serial.println(dooropened);
          }
          else {
            digitalWrite(DOOR, HIGH);
            draw(doorclosed, empty);
            Serial.println(doorclosed);
          }
        }

        void draw(const char* line1, const char* line2) {
          lcd.setCursor(0, 0);
          lcd.print(line1);
          lcd.setCursor(0, 1);
          lcd.print(line2);
        }

        bool compare(char* a, char* b, int len) {
          while (--len >= 0)
            if (a[len] != b[len])
              return ( false );
          return true;
        }

    

Zapojíme periferie podle obrázku, nahrajeme zkompilovaný 'sketch', při stisku klávesy by se mělo ozvat z reproduktoru krátké pípnutí jako signál že byla klávesa stištěna, na LCD se zobrazí * aby bylo viditelné kolik znaků je již zadáno, klávesa * zruší vše, klávesa # pokud jsme ještě nezačali zadávat PIN přejde do hlavního menu (není součástí). Při delší neaktivitě LCD zhasne a vrátí se na začátek, stiskem libovolné klávesy se rosvítí.

Alarm example

Činost celého kódu je dána nekonečným prováděním smyčky loop(), při každém průchodu (neměl by trvat více jak pár milisekund) se postupně otestuje zdali knihovna Dimmer nepotřebuje zavolat interní funkci pro stmívání LCD (provádí na základě uloženého časového razítka a počítá že je volána opakovaně, tím je dána i plynulost stmívání), dále se pomocí knihovny KeyBoard otestuje není-li stiknuta klávesa, pokud ano obslouží přijaté klávesy, stejně tak se sériovým portem, vše se do nekonečna rychle opakuje, tak že se z pohledu uživatele jeví jako jeden funkční celek, i když jsou jednotlivé kroky zpracovávany postupně. Kombinace událostí pak má následný vliv na proměnou menustate a enteredchars kde se podle příslušných kombinací vypisují na LCD udaje informující uživatele co právě dělá (zadávání PIN, otevření nebo zavření dveřního zámku apod.)