Menetszámláló

2019-02-17

 

Egy olvasóm felhívott, és egy korábbi AVR-rel készített menetszámlálóm után érdeklődött. Sok mindenről beszéltünk, végül mondtam, hogy összerakok egy egyszerűbbet, kis kínai kütyükből. Kell hozzá egy Arduino Nano, egy LED & KEY modul, meg egy mikrokapcsoló. Ja, meg vezetékek, meg egy 5V-os táp. Ez most elmaradt, USB-ről kapja a kapcsolás az 5V-ot. A mikrokapcsolóhoz hozzá kell gondolni egy kis mechanikát, egy rugólapot, egy bütykös tengelyt, ami minden fordulat során működteti a kapcsolót. Ez az egész ami a képen látható, nem került 10 USD-be.

A számláló tud le/fel számolni, a Reset-elésen kívül beállítható/módosítható a számláló állása. A gombok funkciója balról jobbra:
FEL - LE - RESET - - 1000 - 100 - 10 -1
A szám kapcsolókkal a fel/le állapot szerint a számláló értéke állítható. Az alábbi program érdekessége, hogy oda kellett figyelni mind a mikrokapcsoló, mind a billentyűzet pergésmentesítésére. És ugye a program nem ragadhat le egyiknél sem, mert ha folyamatosan nyomnánk valamelyik gombot, esetleg közben a tekercsünk továbbcsévélődne, igaz ez nem életszerű. A kijelző panel egy TM1638 chip-re épül, ami I2C soros vonalon vezérelhető, illetve olvasható. A neten találhatók ezt kezelő library-k, én írtam hozzá egy sajátot.



/******************************************************************************
*   Author       -  Kiraly Tibor
*                   http://www.tkiraaly.hu
*   Date         -  2019.02.17.
*   Chip         -  Ardiono, LED & KEY Board (TM1638)
*   Compiler     -  Arduino IDE
*
*   Szamlalo (le/fel/0-9999) tekercselogephez
*   
*******************************************************************************
*
*   +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
*   !   ! !   ! !   ! !   ! !   ! !   ! !   ! !   !    
*   ! 7 ! ! 6 ! ! 5 ! ! 4 ! ! 3 ! ! 2 ! ! 1 ! ! 0 !
*   !   ! !   ! !   ! !   ! !   ! !   ! !   ! !   !
*   +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
*
*   +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
*   ! O ! ! O ! ! O ! ! O ! ! O ! ! O ! ! O ! ! O !    
*   +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
*     Fel   Le    Reset       1000  100   10    1
*
*******************************************************************************/

#include <kt_lkb.h>


int i;                                           // munka valtozo
int n= -100;                                     // szamlalo
int d= 0;                                        // novekmeny
unsigned char irany= 1;                          // irany (1-fel, 2-le)
unsigned char kapcsolo_allapot= 8;               // kapcsolo elozo allapot
unsigned char key;



kt_lkb k( 5, 6, 7);                              // data_io, clock, strobe



void setup()
{
   pinMode( 2, INPUT_PULLUP);                    // erintkezok felhuzasa
   pinMode( 3, INPUT_PULLUP);
}



void loop()
{
   if ( ( digitalRead( 2) == 0) && ( kapcsolo_allapot == 0))  // kapcsolo be
   {
      kapcsolo_allapot= 1;
      if( irany == 1) n+= 1;
      else            n-= 1;
   }                                                          
   if ( digitalRead( 3) == 0) kapcsolo_allapot= 0;            // kapcsolo ki
   
   i= k.inkey();                                 // bill. kezeles
   if( i < 8 ) key= i;                           // bill. eltarolasa
   else                                          // bill. felengedve, kiertekeles (hogy ne peregjen)
   {
      if ( key == 7) irany= 1;                   // fel
      if ( key == 6) irany= 2;                   // le
      if ( key == 5) n= 0;                       // reset
      if ( key == 3) d= 1000;
      if ( key == 2) d= 100;
      if ( key == 1) d= 10;
      if ( key == 0) d= 1;
      if( irany == 1) n+= d;
      else            n-= d;
      d= 0;
      key= 8;
   }
   if ( n < 0) n= 0;                             // limit
   if ( n > 9999) n= 9999;

   i= n;                                         // szamlalo kiiras
   k.write( i% 10, 0);                           // 1
   i= i/ 10;
   k.write( i% 10, 1);                           // 10
   i= i/ 10;
   k.write( i% 10, 2);                           // 100
   i= i/ 10;
   k.write( i% 10, 3);                           // 1000

   if( irany == 1)                               // irany kiiras
   {
      k.write( 'F', 7);
      k.write( 'E');
      k.write( 'L');
   }
   else
   {
      k.write( 'L', 7);
      k.write( 'E');
      k.write( ' ');
   }
   k.show();
}

Ennyi az egész, itt a vége, fuss el véle.