Tento projekt vznikl pro naše děti, aby používaly kartáček na čištení zubů dostatečně dlouho.

Přesýpací časovač

Funkce:

Po zapnutí se na "displeji" objeví základní tvar evokujicí naplněné přesýpací hodiny a postupně propadající dolů, kde tvoří hromádku. Po přesypání všech kuliček se zobrazí logo smajlíka a zůstane svítit. Pokud krabičku otočíme o 180 stupnů, začne přesýpání znovu, a tak stále dokola, pokud to nevypneme.

Baterie v tom vydrží dlouho, několik let jsem měl baterie připájeny, protože držáky tužkových baterií, co jsem měl, pravidelně ztrácely po měsíci kontakt. Nynější držák je tam cca 2 roky, tak jako baterie, a bez problému drží.

Detail na přesýpací časovač

Konstrukce:

Určitě někdo odsoudí použití 5V modulu arduina na 3V, ale tohle má měřit dětem čas při čištění zubů a zastavení chodu skončí max křikem dětí. Dle mých zkušeností ale nikdy k problémům nedošlo, baterie jsem měnil, když už nebyly vidět LED diody jak svítí, přesto Arduino pracovalo dále. Program jsem stvořil velmi narychlo, když jsem dostal tento nápad nad matrix displejem, který jsem objevil z jiného projektu a bylo mi líto ho zahodit.

Prvotní verze měla "nadefinováno" asi 22 datových polí s nastavením svitu ledek a ty se postupně přepínaly. Fungovalo to, ale spotřebovalo to celou ram. Při dalším upgrade jsem přidal snímač pro zjištění polohy krabičky a zjistil jsem, že "zpětný chod" se mi do paměti už nevejde.

Ke schématu asi není co dodat, odpory jsem zvolil přiměřeně svitu, asi 1k, což svití celkem málo, ale když jsem matrix přelepil papírovou páskou, tak dosažený kontrast je dobrý. Zapojení vzniklo na klasické destičce,na kterou jsem připájel Arduino mini a odpory z jednotlivých portů a to celé připájel k matrix displeji. Teprve poté jsem zjistil co kam vede a nastavil porty tak jak byly zapojeny. Popis pinů matrix modulu a Arduina je popsán na začátku programu.

Mechanická konstrukce vznikla použitím mé oblíbené instalační krabice na omítku a zbytku z vypínače - rámeček je tuším ABB swing. Do rámečku jsem vlepil matrix s již připojenou a funkční elektronikou, z obalu na CD/DVD jsem vytvořil plexi kryt (ten tam drží jen namáčknutím), do krabičky s vypilovanou dírou na vypínač vlepil držák baterií a spínač překlopení, a bylo hotovo.

Krabička zapojení Přesýpacího časovače

Použité komponenty:

   -maticové pole 8x8 led diod

   -Arduino mini (nebo něco podobného)

   -vypínač dle libosti

   -spínač indikující převrácení krabičky

   -8 rezistorů 470-1k (všechny shodné)

   -kus univerzálního plošného spoje

   -krabička instalační pro montáž na omítku

   -kryt z vypínače pasující ke krabičce

   -baterie (2x AA 1,5 V nebo cokoli 3-5 V)

Schéma zapojení Přesýpacího časovače

Program:

/* presypaci hodiny pro deti - ovladani 8X8 LED

RADKY jsou S ODPORY  +
poradi radky  1 - 8
vyvod 9-14-8-12-1-7-2-5
pin  A3-12-2-A0-9-3-8-5

poradi sloupce 1 - 8
vyvod 13-3-4-10-6-11-15-16
pin   13-7-6-A2-4-A1-11-10


7.8.2016  poslední úpravy
kompilovano v IDE 1.6.5
*/
  #include <Arduino.h> 
  #include <avr/pgmspace.h>
  
   unsigned long aktual_milis  ;
   unsigned long old_milis; 
   byte citac_obr = 0;
   int cas_cykl = 2800;  //cas prepinani v msec ,normal=2800 msec x 20 stavu= cca 60 sec
  
    byte sloupce[] = {13,7,6,A2,4,A1,11,10};
    byte radky[] =   {A3,12,2,A0,9,3,8,5};
     
    //dvojrozměrné pole pro obrázek
     byte obrazek[8][8] = {     //  uvodni logo , je zobrazeno po startu
    {0,0,0,0,0,0,0,0},
    {1,1,1,1,1,0,0,1},
    {0,0,1,0,1,0,0,1},
    {0,0,1,0,1,1,1,1},
    {0,0,1,0,1,0,0,1},
    {0,0,1,0,1,0,0,1},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0}
    };
   
     byte obrazek1[8][8]  = {      // zakladni stav pro standartni stav
    {1,1,1,1,1,1,1,1},
    {0,1,1,1,1,1,1,0},
    {0,0,1,1,1,1,0,0},
    {0,0,0,1,1,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0}
    };
      byte obrazek21[8][8] = {    // zaverecny smile pro obraceny stav
    {0,0,1,1,1,1,0,0},
    {0,1,0,0,0,0,1,0},
    {1,0,0,1,1,0,0,1},
    {1,0,1,0,0,1,0,1},
    {1,0,0,0,0,0,0,1},
    {1,0,1,0,0,1,0,1},
    {0,1,0,0,0,0,1,0},
    {0,0,1,1,1,1,0,0}
    };
      byte obrazek22[8][8] = { // posledni stav po presypani /první pro obraceny stav
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0},
    {0,0,0,1,1,0,0,0},
    {0,0,1,1,1,1,0,0},
    {0,1,1,1,1,1,1,0},
    {1,1,1,1,1,1,1,1}
    };
      byte obrazek23[8][8] = { //zaverecny smile -standartni stav
  {1,1,1,1,1,1,1,1},
  {1,0,1,0,0,0,0,1},
  {1,1,1,1,0,1,0,1},
  {1,0,1,0,0,0,0,1},
  {1,1,0,0,0,0,1,1},
  {1,0,1,1,1,1,0,1},
  {1,0,0,0,0,0,0,1},
  {1,1,1,1,1,1,1,1}
  };
     byte obrazek24[8][8] = { //zaverecny smile02 - standartni stav
    {0,0,1,1,1,1,0,0},
    {0,1,0,0,0,0,1,0},
    {1,0,1,0,0,1,0,1},
    {1,0,0,0,0,0,0,1},
    {1,0,1,0,0,1,0,1},
    {1,0,0,1,1,0,0,1},
    {0,1,0,0,0,0,1,0},
    {0,0,1,1,1,1,0,0}
    };
    
    //------------------------------------
    void setup(){
    for(int i = 0; i < 8; i++){
    //nastavíme piny
    pinMode(sloupce[i], OUTPUT);
    pinMode(radky[i], OUTPUT);
    //zajistíme vypnutí displeje
    digitalWrite(sloupce[i], HIGH);
    digitalWrite(radky[i], LOW);
    //tlacitko - prepinac pro obrácený směr
    pinMode(0,INPUT); 
    digitalWrite(0,HIGH);
    }
    }
/*---------------------------------------------------------------------------------*/     
    void loop(){
    
      
     refresh();    // prekresleni obrázku

   
    /*zobrazeni obrazku--------*/ 
    for(int i = 0; i < 8; i++){
    //zapneme řádek i
    digitalWrite(radky[i], HIGH);
    //dále pracujeme s jednotlivými sloupci
    for(int j = 0; j < 8; j++){
    //pokud je ve vybraném políčku 1, rozsvítí se LED
    if(obrazek[i][j] == 1){
    digitalWrite(sloupce[j], LOW);
    }
    }
    delay(2); //chvíli počkáme, aby byl obraz dostatečně jasný (zmensuje kmitocet..)
    //vypneme všechny sloupce
    for(int j = 0; j < 8; j++){
    digitalWrite(sloupce[j], HIGH);
    }
    //vypneme řádek i
    digitalWrite(radky[i], LOW);
      
     }
    
    }   
/*-----------------------------------------------------------------*/
    void refresh(){
     
      aktual_milis =  millis () - old_milis ;
       
      if(aktual_milis <= cas_cykl) return; //pokud se prekroci cas=dalsi obrazek
      old_milis = millis ();
      citac_obr++;
      // obcersteveni obrazku
     for(int x = 0; x < 8; x++){
       for(int y = 0; y < 8; y++){

        
       if (citac_obr ==0)  citac_obr = 1;
      
       if (citac_obr ==1 && digitalRead(0)==LOW)  citac_obr = 50;  // pokracovani pri prevraceni
       
       if (citac_obr ==1)  obrazek[x][y] = obrazek1[x][y];  // prvni cely obrazek 
       if (citac_obr ==2)  {
        obrazek[0][4] = 0;
        obrazek[7][4] = 1;
       }
      if (citac_obr ==3)  {
        obrazek[0][3] = 0;    // zhasnuty bit
        obrazek[6][4] = 1;    // svitici  bit
       }
       if (citac_obr ==4)  {      // tady se nastavuji jen zmeny v obrazku po bitech
        obrazek[1][4] = 0;
        obrazek[7][3] = 1;
       }
        if (citac_obr ==5)  {
        obrazek[0][5] = 0;
        obrazek[7][5] = 1;
       }
        if (citac_obr ==6)  {
        obrazek[0][2] = 0;
        obrazek[6][3] = 1;
       }
       if (citac_obr ==7)  {
        obrazek[1][3] = 0;
        obrazek[7][2] = 1;
       }
       if (citac_obr ==8)  {
        obrazek[0][6] = 0;
        obrazek[5][4] = 1;
       }
       if (citac_obr ==9)  {
        obrazek[0][1] = 0;
        obrazek[7][6] = 1;
       }
       if (citac_obr ==10)  {
        obrazek[1][5] = 0;
        obrazek[6][5] = 1;
       }
       if (citac_obr ==11)  {
        obrazek[1][2] = 0;
        obrazek[7][1] = 1;
       }
       if (citac_obr ==12)  {
        obrazek[0][0] = 0;
        obrazek[6][2] = 1;
       }
       if (citac_obr ==13)  {
        obrazek[0][7] = 0;
        obrazek[5][3] = 1;
       }
       if (citac_obr ==14)  {
        obrazek[1][1] = 0;
        obrazek[4][4] = 1;
       }
       if (citac_obr ==15)  {
        obrazek[1][6] = 0;
        obrazek[6][6] = 1;
       }
       if (citac_obr ==16)  {
        obrazek[2][3] = 0;
        obrazek[7][7] = 1;
       }
       if (citac_obr ==17)  {
        obrazek[2][4] = 0;
        obrazek[5][5] = 1;
       }
       if (citac_obr ==18)  {
        obrazek[2][5] = 0;
        obrazek[5][2] = 1;
       }
       if (citac_obr ==19)  {
        obrazek[2][2] = 0;
        obrazek[5][2] = 0;  // zhasnout minuly bod
        obrazek[7][0] = 1;
        obrazek[6][1] = 1;
       }
       if (citac_obr ==20)  {
        obrazek[3][3] = 0;
        obrazek[5][2] = 1;
       }
      
       if (citac_obr ==21) obrazek[x][y] = obrazek22[x][y];  // cela pyramida
       if (citac_obr ==22) obrazek[x][y] = obrazek23[x][y]; //smile 1
       if (citac_obr ==23) obrazek[x][y] = obrazek24[x][y]; // smile 2
       if (citac_obr ==24) citac_obr = 23;
       if (citac_obr ==23 && digitalRead(0)==HIGH)  citac_obr = 23; // zastaveni po prvni strane
       if (citac_obr ==23 && digitalRead(0)==LOW)  citac_obr = 50;  // pokracovani pri prevraceni

      if (citac_obr ==50) obrazek[x][y] = obrazek22[x][y];  //prvni prevraceny - cely

      if (citac_obr ==51)  {
        obrazek[0][4] = 1;
        obrazek[7][4] = 0;
       }
        if (citac_obr ==52)  {
        obrazek[0][3] = 1;    // zhasnuty bit
        obrazek[7][3] = 0;    // svitici  bit
       }
       if (citac_obr ==53)  {
        obrazek[1][4] = 1;
        obrazek[6][4] = 0;
       }
        if (citac_obr ==54)  {
        obrazek[0][5] = 1;
        obrazek[7][5] = 0;
       }
        if (citac_obr ==55)  {    //
        obrazek[2][4] = 1;
        obrazek[7][2] = 0;
       }
       if (citac_obr ==56)  {
        obrazek[1][3] = 1;
        obrazek[6][3] = 0;
       }
       if (citac_obr ==57)  {
        obrazek[1][5] = 1;
        obrazek[7][6] = 0;
       }
       if (citac_obr ==58)  {
        obrazek[0][2] = 1;
        obrazek[7][1] = 0;
       }
       if (citac_obr ==59)  {
        obrazek[0][6] = 1;
        obrazek[6][5] = 0;
       }
       if (citac_obr ==60)  {
        obrazek[1][2] = 1;
        obrazek[6][2] = 0;
       }
       if (citac_obr ==61)  {
        obrazek[0][1] = 1;
        obrazek[7][0] = 0;
       }
       if (citac_obr ==62)  {
        obrazek[0][7] = 1;
        obrazek[7][7] = 0;
       }
       if (citac_obr ==63)  {
        obrazek[3][4] = 1;
        obrazek[6][1] = 0;
       }
       if (citac_obr ==64)  {
        obrazek[1][6] = 1;
        obrazek[6][6] = 0;
       }
       if (citac_obr ==65)  {
        obrazek[2][5] = 1;
        obrazek[5][3] = 0;
       }
       if (citac_obr ==66)  {
        obrazek[1][1] = 1;
        obrazek[5][4] = 0;
       }
       if (citac_obr ==67)  {
        obrazek[0][0] = 1;
        obrazek[5][5] = 0;
       }
       if (citac_obr ==68)  {
        obrazek[2][3] = 1;
        obrazek[5][2] = 0;
       }
       if (citac_obr ==69)  {
        obrazek[2][2] = 1;
        obrazek[4][4] = 0;
       }
       if (citac_obr ==70)  obrazek[x][y] = obrazek1[x][y]; // posledni cely obrazek = prvni cely
       if (citac_obr ==71) obrazek[x][y] = obrazek21[x][y]; // smile 2 - otoceny
       if (citac_obr ==73) citac_obr = 72;
       if (citac_obr ==72 && digitalRead(0)==LOW)  citac_obr = 72; // zastaveni po  strane
       if (citac_obr ==72 && digitalRead(0)==HIGH)  citac_obr = 1;  // pokracovani pri prevraceni
    
       }  //for
     }  //for
     
    }  //end refresh
// ------------- konec------------------------------------------------------------

Video:

FB gp tw

Další podobné články