——Са ДВИН форума за програмере
У овом броју ћемо вам представити награђивани случај отвореног кода са ДВИН Девелопер Форума: Интелигентни систем за контролу хране за мачке.Инжењери су користили ДВИН паметни екран да надгледају температуру, влажност и преосталу количину хране за мачке, као и да сачувају евиденцију о једењу мачке.Такође су јединствено дизајнирали скуп корисничког интерфејса у стилу сликања мастилом, као и ефекат клика мастилом када се додирне прстом, како би побољшали визуелну перцепцију повратних информација о додиру.
Увод:
1.УИ сликовни материјал
ДВИН паметни екран завршава развој корисничког интерфејса на основу слика, звука и других материјала који се морају унапред припремити у складу са садржајем екрана.
2.Развој интерфејса
Софтвер ДГУС враћа ефекат корисничког интерфејса преко слојева, комбинује припремљене материјале у комплетну слику у ДГУС софтверу и поставља функције екрана и додира.
3. Имплементирајте ефекте клика и звучне ефекте
Положај додира се добија кроз програм 51, ефекат притиска прати кретање прста, а постиже се и звучни ефекат пратње кључа.
(1) Откријте код локације додира и пустите звук:
воид ТоуцхДетецт()
{
у16 Ва[3] = 0;
у8 и = 0;
фор(и = 0;и <3;и++)
{
Ва[и] = Реад_Дгус(0к0016 + и);
иф(Ва[0] == 0к5А01)
{
}
друго
{
пауза;
}
}
иф(и != 0) //Први клик за улазак
{
у16 плаи[2] = {0к0001, 0к4000};
тоуцхАниматионФлаг = 1;
тоуцхАниматионЦнт = 0;
тоуцхПосКс = Ва[1];
тоуцхПосИ = Ва[2];
врите_дгус_вп(0к00А0, плаи, 2);
}
}
(2) Код за екран са ефектом додира је следећи:
воид ТоуцхСтарт()
{
иф(тоуцхАниматионФлаг == 1)
{
иф(тоуцхАниматионЦнт == 0)
{
Врите_Дгус(0к5011, тоуцхПосКс - 100);
Врите_Дгус(0к5012, тоуцхПосИ - 100);
}
Врите_Дгус(0к5000, тоуцхАниматионЦнт);
тоуцхАниматионЦнт++;
иф(тоуцхАниматионЦнт == 6)
{
тоуцхАниматионФлаг = 0;
Врите_Дгус(0к5011, 1024);
Врите_Дгус(0к5012, 600);
}
}
}
4. Следећи корак је постављање одговарајућих параметара кроз екран, а затим преношење података на контролер хране за мачке преко ЕСП32 да би се реализовала функција аутоматског храњења мачје хране.Конкретан код је следећи:
//Преузми статус дугмета
воид гет_кеи_статус()
{
инт и = 0;
//у16 Ва=Реад_Дгус(аддр);
у16 Ва=Реад_Дгус(0к1000);
иф(Ва != 0к0000)
{
//Sтатус паге
иф(Ва == 0к0103) //Поставите број г
{
у16 свитцхпаге[2] = {0к5А01, 19};
сетНум = плацеГрамНум;
бацкПаге = 1;//Повратак на страницу са статусом
Врите_Дгус(0к4000 + 0, сетНум % 10);
Врите_Дгус(0к4000 + 2, сетНум / 10 % 10);
Врите_Дгус(0к4000 + 4, сетНум / 100 % 10);
Врите_Дгус(0к4000 + 6, сетНум / 1000 % 10);
врите_дгус_вп(0к0084, свитцхпаге, 2);
}
иначе иф(Ва == 0к0102)
{
ОнеСендДата3(плацеГрамНум);//Местохрана за мачкеједном
}
елсе иф(Ва == 0к0101) //Страница подешавања
{
у16 свитцхпаге[2] = {0к5А01, 3};
фор(и = 0;и < 6;и++)
{
иф(и == 0)
{
Врите_Дгус(0к3070 + и * 0к10 + 0, цуррентТиме[и] % 10);
Врите_Дгус(0к3070 + и * 0к10 + 2, цуррентТиме[и] / 10 % 10);
Врите_Дгус(0к3070 + и * 0к10 + 4, цуррентТиме[и] / 100 % 10);
Врите_Дгус(0к3070 + и * 0к10 + 6, цуррентТиме[и] / 1000 % 10);
}
друго
{
Врите_Дгус(0к3070 + и * 0к10 + 0, цуррентТиме[и] % 10);
Врите_Дгус(0к3070 + и * 0к10 + 2, цуррентТиме[и] / 10 % 10);
}
}
врите_дгус_вп(0к0084, свитцхпаге, 2);//Уђите на страницу са подешавањима
}
елсе иф(Ва == 0к0100) //Rстраница са записима
{
у16 свитцхпаге[2] = {0к5А01, 2};
фор(и = 0;и < 6;и++)
{
иф(и == 0)
{
Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[0][и] % 10);
Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[0][и] / 10 % 10);
Врите_Дгус(0к2000 + и * 0к10 + 4, еатФеедЛист[0][и] / 100 % 10);
Врите_Дгус(0к2000 + и * 0к10 + 6, еатФеедЛист[0][и] / 1000 % 10);
}
друго
{
Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[0][и] % 10);
Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[0][и] / 10 % 10);
}
}
врите_дгус_вп(0к0084, свитцхпаге, 2);//Унесите страницу са записом
}
//Rстраница са записима
елсе иф(Ва == 0к0201) //Сними претходну страницу
{
иф(лоокЕатЦнт > 0)
{
лоокЕатЦнт--;
фор(и = 0;и < 6;и++)
{
иф(и == 0)
{
Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[лоокЕатЦнт][и] % 10);
Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[лоокЕатЦнт][и] / 10 % 10);
Врите_Дгус(0к2000 + и * 0к10 + 4, еатФеедЛист[лоокЕатЦнт][и] / 100 % 10);
Врите_Дгус(0к2000 + и * 0к10 + 6, еатФеедЛист[лоокЕатЦнт][и] / 1000 % 10);
}
друго
{
Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[лоокЕатЦнт][и] % 10);
Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[лоокЕатЦнт][и] / 10 % 10);
}
}
}
}
елсе иф(Ва == 0к0202) //Сними страницу следећу страницу
{
иф(лоокЕатЦнт < еатЦнт - 1)
{
лоокЕатЦнт++;
фор(и = 0;и < 6;и++)
{
иф(и == 0)
{
Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[лоокЕатЦнт][и] % 10);
Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[лоокЕатЦнт][и] / 10 % 10);
Врите_Дгус(0к2000 + и * 0к10 + 4, еатФеедЛист[лоокЕатЦнт][и] / 100 % 10);
Врите_Дгус(0к2000 + и * 0к10 + 6, еатФеедЛист[лоокЕатЦнт][и] / 1000 % 10);
}
друго
{
Врите_Дгус(0к2000 + и * 0к10 + 0, еатФеедЛист[лоокЕатЦнт][и] % 10);
Врите_Дгус(0к2000 + и * 0к10 + 2, еатФеедЛист[лоокЕатЦнт][и] / 10 % 10);
}
}
}
}
//Страница подешавања
иначе иф(Ва == 0к0302)
{
иф(временски режим == 1)
{
тимеМоде = 0;
Врите_Дгус(0к3А12, 139);
}
}
иначе иф(Ва == 0к0303)
{
иф(тимеМоде == 0)
{
тимеМоде = 1;
Врите_Дгус(0к3А12, 242);
}
}
елсе иф(Ва >= 0к0304 && Ва <= 0к0309)
{
у16 свитцхпаге[2] = {0к5А01, 19};
бацкПаге = 3;
бацкНум = Ва;
сетНум = тимрИнтервалХоур[Ва - 0к0304];
Врите_Дгус(0к4000 + 0, сетНум % 10);
Врите_Дгус(0к4000 + 2, сетНум / 10 % 10);
Врите_Дгус(0к4000 + 4, сетНум / 100 % 10);
Врите_Дгус(0к4000 + 6, сетНум / 1000 % 10);
врите_дгус_вп(0к0084, свитцхпаге, 2);
}
елсе иф(Ва >= 0к030А && Ва <= 0к030Ф)
{
у16 свитцхпаге[2] = {0к5А01, 19};
бацкПаге = 3;
бацкНум = Ва;
сетНум = ЦуррентТиме[Ва - 0к030А];
Врите_Дгус(0к4000 + 0, сетНум % 10);
Врите_Дгус(0к4000 + 2, сетНум / 10 % 10);
Врите_Дгус(0к4000 + 4, сетНум / 100 % 10);
Врите_Дгус(0к4000 + 6, сетНум / 1000 % 10);
врите_дгус_вп(0к0084, свитцхпаге, 2);
}
//Aподеси страницу са подацима
елсе иф(Ва == 0к0400) //Потврди
{
у16 свитцхпаге[2] = {0к5А01, 0к0000};
свитцхпаге[1] = бацкПаге;
иф(бацкПаге == 1) //Повратак на страницу са статусом
{
плацеГрамНум = сетНум;
Врите_Дгус(0к1140 + 0, плацеГрамНум % 10);
Врите_Дгус(0к1140 + 2, плацеГрамНум / 10 % 10);
}
елсе иф(бацкПаге == 3)
{
иф(бацкНум >= 0к0304 && бацкНум <= 0к0309)
{
у16 селецт = 0;
селецт = (назадНум - 0к0304) * 0к10;
тимрИнтервалХоур[назадНум - 0к0304] = сетНум;
Врите_Дгус(0к3010 + селецт + 0, сетНум % 10);
Врите_Дгус(0к3010 + селецт + 2, сетНум / 10 % 10);
}
елсе иф(бацкНум >= 0к030А && бацкНум <= 0к030Ф)
{
у16 селецт = 0;
селецт = (назадНум - 0к0304) * 0к10;
цуррентТиме[бацкНум - 0к030А] = сетНум;
иф(назадНум == 0к030А)
{
Врите_Дгус(0к3010 + селецт + 0, сетНум % 10);
Врите_Дгус(0к3010 + селецт + 2, сетНум / 10 % 10);
Врите_Дгус(0к3010 + селецт + 4, сетНум / 100 % 10);
Врите_Дгус(0к3010 + селецт + 6, сетНум / 1000 % 10);
}
друго
{
Врите_Дгус(0к3010 + селецт + 0, сетНум % 10);
Врите_Дгус(0к3010 + селецт + 2, сетНум / 10 % 10);
}
}
}
врите_дгус_вп(0к0084, свитцхпаге, 2);
}
елсе иф(Ва == 0к0401) //Назад
{
у16 свитцхпаге[2] = {0к5А01, 0к0000};
свитцхпаге[1] = бацкПаге;
врите_дгус_вп(0к0084, свитцхпаге, 2);
}
елсе иф(Ва == 0к0402) //Нумеричко повећање
{
сетНум++;
Врите_Дгус(0к4000 + 0, сетНум % 10);
Врите_Дгус(0к4000 + 2, сетНум / 10 % 10);
Врите_Дгус(0к4000 + 4, сетНум / 100 % 10);
Врите_Дгус(0к4000 + 6, сетНум / 1000 % 10);
}
елсе иф(Ва == 0к0403) //Нумеричко смањење
{
иф(сетНум > 0)
сетНум--;
Врите_Дгус(0к4000 + 0, сетНум % 10);
Врите_Дгус(0к4000 + 2, сетНум / 10 % 10);
Врите_Дгус(0к4000 + 4, сетНум / 100 % 10);
Врите_Дгус(0к4000 + 6, сетНум / 1000 % 10);
}
Врите_Дгус(0к1000, 0);
}
}
Време поста: 19.09.2023