Цветарство по програмистски, v. 2.0

~ 30 Jan 2012, 03:53

След като предходният опит да накараме коледната звезда да цъфне (с груба сила) завърши с неуспех, този път ще опитаме по-нежничко.

Самото цвете бе обект на непрекъснат тормоз (както се вижда), но не само от мен, а и от майка ми, която де що види, че гадинката малко от малко е пуснала листенце/филизче над 20 сантиметра височина от дъното на саксията, го минаваше набързо с ножицата. Така де, бунтовете трябва да се потушават в зародиш.
Това лято, обаче, оставих цветето да си расте без ограничения, то се разлисти, разхубави, набъбна, с една дума - красавица :)
Респективно, за Нещото тази година щеше да е необходим значително по-голям кашон. Сменях и квартири, а в новата нямаше къде да закача кранчето.

Последва реализация на една друга идея: да държим цветето на тъмно, и да му светим по 10 часа на денонощие.

1. Първо изследвах как е най-подходящо да се осветява фотосинтезираща гад. НАСА са правили подробни изследвания за това (примерно), като тяхната идея да ползват LED-ове е основно откъм ефективност и ресурси. LED-овете не греят, респективно растението не изпарява много вода така, отдено са с високо КПД.
В този патент пък хората са изследвали, и препоръчват да се ползват червени, оранжеви и сини диоди, в отношение 12:6:1.

2. Накупих си голямо количесто ultra-bright LED-ове. Сметката колко диода ми трябват се оказа учудващо тежка и е удоволствие да си изпържиш мозъка със всичките фотометрични единици: лумени, луксове, кандели, ватове на стерадиан. В крайна сметка на платката разположих 17 червени, 8 жълти и два сини. Целта беше да докарам около 2000 лукса пиково осветление, което се получи (за фотоизмервател ползвах dSLR :D)

3. Задължителният breadboard, по време на прототипирането:
Image.Image

4. И вече прехвърлено върху реална платка:
Image

5. От различни графики с измерена яркост на слънцето по денонощие се ориентирах, че светлината по време на изгрев се увеличава над 1000 пъти (по-скоро към 10000). Чрез ШИМ докарах гладко "изгряване" на светилото ми (вижте клипчето долу). В крайна сметка, докарвам контраст 1000:1, като началото на изгрева е малко бъгаво. Освен това, жълтите диоди ги паля 20 минути след червените, сините - час по-късно, уж там да се симулира различния цвят на слънцето по изгрев/залез.

6. Канибализирах една стара лампа:
Image

малко болтчета и пластинки от Meccano:
Image

И така имаме тестов блинк върху моята странна "лампа"
Image.Image

7. Отчитането на времето се прави с един часовникарски чип - DS1302 - и кварцов резонатор. Времената на изгрев и залез са коректни за цялата година, и отговарят на истинските изгрев/залез в Сан Антонио, Тексас (ето един целогодишен калкулатор). Тъй като PIC-а малко трудно се оправя с floating point, синуси, косинуси и т.н., времената просто съм ги забил в статичен масив, в делта-компресиран вид.
DS1302 поддържа времето даже и след изгасване на тока, като поддържането на CMOS-а в тея случаи принципно се прави с батерия, но аз избрах просто да ръгна един голям електролитен кондензатор, който DS1302-то да пълни при наличие на ток:
Image

Учудващо, оказва се, че с 4700µF държи точно време повече от денонощие.

8. Сложих коледната звезда на относително тъмничко място, "лампата" на 30 сантиметра отгоре й (за да имаме достатъчно разпръскване на снопа светлина - тези диоди са доста тесен лъч). Ръгаме в контакта и си имаме целодневно зарево в стаята :)

Image.Image
Image.Image

Ето го и на клипче: Youtube.

Цялото нещо харчи около ват. Диодите не греят въобще (тествано с пръстомер).

Това вече върви около месец и половина. Коледната звезда все още не почервенява.
Ако растенията можеха да се самоубиват, това отдавна да си е направило харакири :)

Някои неща, които научих:

Цял embedded проект на C. За този проект не написах нито ред асемблер, всичко на C, ползвайки Hi-tech компилатора. Вече не мога да кажа за какво е отишъл всеки отделен байт от паметта, но след като паметта стига - проблем няма¹.
Комуникация с външен хардуер, в случая DS1302-ката. Може да се каже, че за пръв път съм написал собствен драйвер. Нищо особено, но доста неща, свързани с комуникацията между чипове, ми се изясниха.
Всичко, свързано с осветлението: луксове, лумени, кандели и имат ли те почва у нас.
Постоянна памет (EEPROM) в такива проекти. Благодарение на нея реализирах 0-бутонен потребителски интерфейс. Исках уредът да има два режима - стандартен и тестов, като в последния да мига със всичките диоди, малко като коледни лампички. Това, обаче, би изисквало или DIP switch, или някакъв бутон на платката. Е, има и по-хитър начин да предадем нашето желание на уреда, боравейки с ключа On/Off:

1. Уредът се включва (On)
2. Веднага се изключва обратно (Off)
3. Включва се наново. Ако времето между 1) и 2) е под секунда, влизаме в тестов режим, иначе - в нормален. Тук ни върши работа постоянната памет. Първата работа на софтуера, при пускане, е да вдигне един флаг (в EEPROM-а), а секунда по-късно (ако все още не са ни изключили), флагът се сваля обратно. При следващото пускане можем да видим какво е състоянието на флага, и така да определим в кой режим да работим.

Компилаторът е там, за да се ползва. Преди бях голям фен на пълненето на сорс-файловете със симпатични масивчета от магически числа, хитроумно пресметнати отвънка с някакво скриптче. Hardcoding на макс. Постепенно се преориентирах към вкарване на повече от работата вътре в C/C++ кода, когато е възможно, тъй като компилаторът все пак може да сметне доста неща сам. И вместо магически числа - код, макроси или подобни, които стигат до същите магически числа. Например: DS1302-ката се нуждае от ток, за да си помни датата и часа. При първоначално пускане, или след преместване между платките, тя е "неинициализирана" и си мисли, че е първи Януари, 2000г. Е, бих могъл просто да си направя отделен билд за тези случаи, и да въведа в C кода текущата дата и час, и след като ги налея веднъж в DS1302, да си продължа, разчитайки на нея. Е, вместо хардкоднати дата/час, тези неща могат да се вземат от "променливите" __DATE__ и __TIME__, които компилаторът любезно ни предоставя.
MPLabX под Linux. Не е най-великото IDE на земята, но върши работа.

---
¹ Това мислене, разбира се, е много, много, *много* грешно. Като нищо утре ще пропиша на C#



Коментари:

#1 от nickysn, изпратено на 30 Jan 2012, 16:15


Внимавай само Apple да не решат да те съдят заради 0-бутонния интерфейс ;)




Име:
За връзка: (Линк към вашия блог/сайт/e-mail; незадължително)
Вашият коментар:

Сметнете израза: детдесет и дет минус шеcтдeсет и eднo = (въведи с цифри)


<<

Valid XHTML 1.0 Strict