Kuk-bot je jednoduchá blbůstka na pracovní stůl pro rozptýlení. Kouká, rozhlíží se a když si ho nebudete všímat bude smutný.
Elektricky jde jen o pár součástek: Arduino mega, OLED 128×64 SSD1306, sensor pohybu MPU6050 a fotorezistor s obyč rezistorem. Vše je v pixle od vitamínů.
Zapojení je velmi jednoduché protože OLED i pohybový senzor komunikují po I2C sběrnici, tak jsou připojeny na ní a na napájení. Fotorezistor tvoří dělič napětí společně s rezistorem 10k a jeho výstup je připojený na pin A0.
Program pro Arduino je ke stažení níže
a funkce je nejlépe poznat na videu:
Zajímavá chujovina, ale zasloužilo by si to pár optimalizací programu. U takovéhle věci to nevadí, ale obrázky zabírají velké množství paměti. Na to, že se jedná pouze o pár geometrických tvarů. Vykresloval bych to příkazy DrawLine, DrawPixel (apod.). Každý symbol je pak na pár řádků kódu.
Další věcí je, že bych trochu zjednodušil podmínky. „elseif“ je jedna z nejhorších možných konstrukcí na přehlednost. Proměnná „stav“ nabývá pouze dvou hodnot, tak bych ji dal jako bool. Pak by šlo jednoduše:
if(stav){
//vzhuru
//dalsi prikazy, pokud je vzuhu. Tady bych resil svetlo, pohyb atd
}
else{
//spi
//dalsi prikazy pokud spi. Tady bych resil svetlo, pohyb atd
}
Vykreslování samotných tvarů bych nevolal jako samotné funkce, ale jako jednu funkci s parametrem. Navíc bych optimalizoval vykreslování, aby probíhalo pouze při změně symbolu, např.:
uint8_t last_tvar; //posledni vykreslovany tvar
void Vykresleni(uint8_t tvar){
//vykreslovani symbolu
if(tvar != last_tvar){
//probehla zmena tvaru, vykresleni
display.clearDisplay(); //vymazani displeje
switch(tvar) {
case 0:
//vykresleni tvaru 0
case 1:
//vykresleni tvaru 1
break;
default:
//vykresleni nedefinovaneho tvaru
break;
}
}
last_tvar = tvar; //zaznamenani posledniho vykreslovaneho tvaru
}
Pak volat pouze funkci. Drasticky se tím omezí množství opakujícího se kódu:
Vykresleni(1); //vykresli tvar c. 1 pouze pokud nastala zmena grafiky
Navíc jsem tam zahlídl nějaký náznak časování. Ale i tak je tam spousta příkazů delay. To nemusí být problém, ale opět – u většího programu to může zbytečně brzdit. Vygoogluj „Čekání bez příkazu delay()“. Najdeš články, nebo knihovny na časování pomocí millis(). Dá se tím vytvořit jakýsi multitasking, kde třeba každých 100 ms můžeš zpracovávat jednu věc a paralelně k tomu třeba jednou za sekundu zpracovávat něco jiného. Jednodušeji pak i čítat sekundy, aby se nemusel čas zadávat v ms… Jak si na ty 4 řádky kódu člověk zvykne, tak už Delay nepoužije 😀
Zdarec, určitě by to šlo i jinak. Máš taky dobrý řešení. Paměť a časování nejsou kritický u takovýho projektu tak to tak neřešim. Časování přes millis znam a používam když je potřeba, delay taky někdy stačí 😉