Tento projekt vznikl pro naše děti, aby používaly kartáček na čištení zubů dostatečně dlouho.
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ží.
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.
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)
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: