1 Концепт уређаја
Сврха овог развоја је прикупљање података са локалних сензора, слање ових података на Интернет. Корисник ће моћи да види податке који долазе са сензора било где у свету и да донесе даљинску одлуку о активирању одређених актуатора који ће бити лоцирани поред сензора.
Пројекат користи Ардуино УНО и ВиФи модул ЕСП8266-01. Подаци ће се преносити у облак преко веб сервиса ТхингСпеак.цом, а уређаји ће се активирати путем андроид апликације развијене помоћу МИТ АппИнвентор.
ИоТ је концепт рачунарске мреже физичких објеката („ствари“) опремљених уграђеним технологијама за интеракцију једни с другима или са спољним окружењем, сматрајући организацију таквих мрежа феноменом који може обновити економске и друштвене процесе, елиминишући потребу за људским учешћем из дела и операција.
Главни фокус овог ИоТ пројекта биће сервис ТхингСпеак.цом. Локални УНО / ЕСП-01 уређај прима податке од сензора и податке о статусу актуатора, шаље их на Интернет снимање путем одређеног канала статуса ТхингСпеак.цом (ТхингСпеак.цом Статус Цханнел), исти локални уређај прима податке, " читање ”са другог канала података -“ канала извршних уређаја ”(ТхингСпеак.цом Ацтуатор Цханнелс).
Подаци ће се прикупљати помоћу сензора температуре и релативне влажности, температуре и влажности тла и сензора спољне светлости. Ови подаци ће бити послани у облак услуге ТхингСпеак.
Постоје два извршна уређаја - ово је водена електрична пумпа и лампа. Њихов статус ОН / ОФФ такође ће бити послат у облак. Подаци сензора, на пример, могу приказати тренутно стање стакленика или стакленика. Корисник ће контролирати извршне уређаје помоћу андроид апликације.
2 Листа потребних компоненти
Сви линкови су само у информативне сврхе.
2 к ЛЕД (црвена и зелена)
1 к
- $3.00
220В лампа
Отпорник 2 к 330 охм (користи се са ЛЕД)
Отпор 2 к 10К ома (користи се са ДХТ22 и ЛДР)
Отпорник 1 к 4К7 охм (користи се са ДС18Б20)
Хлебна плоча
Јумперс
Спољно напајање за релеј 5В ДЦ
3 Гвоздени део
Сада морате да повежете све сензоре, као што је приказано на дијаграму.
Идеално рјешење би било саставити и тестирати пројект у дијеловима.
У следећем низу:
1. Инсталирајте и тестирајте све сензоре
2Инсталирајте и минимално подесите ЕСП-01
3. Промените ЕСП-01 подешавање на коначну конфигурацију и тест
4. Конфигуришите ТхингСпеак статус канал
5. Инсталирајте ТхингСпеак код на Ардуино и проверите стање сензора у облаку
6. Развити прву верзију програма на андроиду како бисте проверили поруке о стању од сензора
7. Инсталирајте погоне
8. Конфигуришите канале покретача ТхингСпеак
9. Инсталирајте и тестирајте код извршних уређаја на Ардуино-у
10. Направите другу верзију програма на андроиду за цео склоп уређаја.
4 Прикључак сензора
Пројекат користи неке библиотеке које су укључене у. Неопходно је проверити њихову доступност. Почетна конфигурација ових библиотека је следећа:
// ДС18Б20
#инцлуде <ОнеВире.х>
#инцлуде <ДалласТемпературе.х>
#дефине ОНЕ_ВИРЕ_БУС 5 // ДС18Б20 на пин Д5
ОнеВире онеВире (ОНЕ_ВИРЕ_БУС);
ДалласТемпературе ДС18Б20 (& онеВире);
инт земљаТемп = 0;
// ДХТ
#инцлуде "ДХТ.х"
#инцлуде <стдлиб.х>
инт пиноДХТ = 11;
инт типоДХТ = ДХТ22;
ДХТ дхт (пиноДХТ, типоДХТ);
инт аирТемп = 0;
инт аирХум = 0;
// ЛДР (светлост)
#дефине лдрПИН 1
инт светлост = 0;
// Влажност тла
#дефине земљаХумПИН 0
инт земљаХум = 0;
Сада иницијализирамо наше сензоре и приказујемо их у терминалу:
подешавање празнине ()
{
Сериал.бегин (9600);
ДС18Б20.бегин ();
дхт.бегин ();
}
воид петља ()
{
реадСенсорс ();
дисплаиСенсорс ();
кашњење (10000);
}
И на крају, написаћемо две функције: једна очитава очитања са сензора, а друга приказује их на екрану:
/ ********* вредност сензора за читање ************* /
воид реадСенсорс (воид)
{
аирТемп = дхт.реадТемпературе ();
аирХум = дхт.реадХумидити ();
ДС18Б20.рекуестТемпературес ();
земљаТемп = ДС18Б20.гетТемпЦБиИндек (0); // Сензор 0 ће заробити температуру тла у Целзијусу
земљаХум = мапа (аналогно читање (земљаХумПИН), 1023, 0, 0, 100);
лигхт = мапа (аналогРеад (лдрПИН), 1023, 0, 0, 100); // ЛДРДарк: 0 ==> лагано 100%
}
/ ********* Сензори приказа вредности ************* /
неисправни приказ Сензори (празнина)
{
Сериал.принт ("аирТемп (оЦ):");
Сериал.принтлн (аирТемп);
Сериал.принт ("аирХум (%):");
Сериал.принтлн (аирХум);
Сериал.принт ("земљаТемп (оЦ):");
Сериал.принтлн (земљаТемп);
Сериал.принт ("земљаХум (%):");
Сериал.принтлн (земљаХум);
Сериал.принт ("светло (%):");
Сериал.принтлн (лигхт);
Сериал.принтлн ("");
}
Фотографија приказује како се подаци приказују на екрану.
Изворни код се може преузети од аутора.
4 основна конфигурација ЕСП8266-01
Најбржи начин за "разговор" са модулом је АТ наредба. Процесор већ има АТ командни процесор. Подразумевано, модул поседује фабричке поставке од 115200 бауд, у подешавањима морате да поставите 9600 бауд.
Прво морате повезати модул, као што је приказано на фотографији
( Имајте на уму да је Тк терминал ЕСП-01 повезан са Тк терминалом УНО, баш као што су Рк терминали повезани једни са другима. Ова веза ће се касније променити. ).
Затим повежите УНО са рачунаром, отворите ИДЕ и преузмите пример који се налази. Ово је празан код тако да не постоје сукоби између ЕСП-01 и УНО. Овај код је постављен у Ардунио пре повезивања ЕСП-01 са њим, како би били сигурни да Ардунио неће користити игле Тк и Рк за ништа друго.
Сада је потребно да отворите ИДЕ серијски монитор, поставите брзину преноса на 115200 у подешавањима и пошаљете АТ наредбу на ИДЕ серијски монитор. ЕСП-01 треба да пошаље одговор у реду
Сада је потребно да промените брзину података у модулу ЕСП-01. Да бисте то учинили, у ИДЕ-у дајте команду
АТ + ЦИОБАУД = 9600
Може се догодити да се ЕСП-01 врати у фабричке поставке, тада ћете морати да употребите другу наредбу:
АТ + УАРТ_ДЕФ = <баудрате>, <податак>, <стопбит>, <паритет>, <контрола протока>
На пример 9600 бауд / 8 података бита / 1 стоп бита и ниједан паритет и контрола протока
АТ + УАРТ_ДЕФ = 9600,8,1,0,0
Сада промените брзину преноса података у ИДЕ поставкама на 9600 и пошаљите АТ команду, требало би доћи ОК одговор.
Затим морате модул пребацити у режим СТА како би се могао повезати са приступном тачком ваше мреже.
АТ + ЦВМОДЕ = 1
Да би се модул повезао са мрежом, унесите команду АТ + ЦВЈАП = "име_маре", "име_наме_1"где нетворк_наме Је име ваше мреже и нетворк_наме_1 - лозинка за вашу мрежу (лозинка и име мреже морају бити у наводницима)
Ако видите одговор ВИФИ ПРИКЉУЧЕНИ ВИФИ ГОТ ИП, тада је веза успостављена. Провери ИП адресу командом
АТ + ЦИФСР
. Адреса која се појављује на монитору и коју ћете моћи користити у будућности. Једном када конфигуришете модул, можете га трајно повезати, али за то морате променити његов комутациони круг, као што је приказано на слици.
• ЕСП-01 РКС (жуто) -> УНО Пин Д7
• ЕСП-01 ТКС (наранџасти) -> УНО Пин Д6
• ЕСП-01 Цх-Пд (смеђа) -> Вцц (3.3В)
• ЕСП-01 Ресет (плава) -> УНО Пин Д8
• ЕСП-01 Вцц (црвено) -> 3.3В
• ЕСП-01 Гнд (црна) -> УНО ГНД
Имајте на уму да софтверска серијска библиотека користи пин УНО Пин Д7 попут тк и повезује се с излазом ЕСП-01 Ркдок УНО Пин Д6 попут ркповезан са ЕСП-01 ТКС.
Унесите мали код да бисте проверили исправну везу и конфигурацију модула ЕСП-01
#инцлуде <СофтвареСериал.х>
СофтвареСериал есп8266 (6.7); // Рк ==> Пин 6; ТКС ==> Пин7
#дефине спеед8266 9600
подешавање празнине ()
{
есп8266.бегин (спеед8266);
Сериал.бегин (спеед8266);
Сериал.принтлн ("ЕСП8266 тест за подешавање - користите АТ кооманде");
}
воид петља ()
{
док (есп8266.аваилабле ())
{
Сериал.врите (есп8266.реад ());
}
док (Сериал.аваилабле ())
{
есп8266.врите (Сериал.реад ());
}
}
Сада неколико АТ тимова. Погледајте резултате у серијском монитору.
* АТ =====> ЕСП8266 враћа ОК
* АТ + РСТ =====> ЕСП8266 поново покрени и врати ОК
* АТ + ГМР =====> ЕСП8266 враћа АТ верзију; СДК верзија; ид; Ок
* АТ + ЦВМОДЕ? => ЕСП8266 враћа тип режима
* АТ + ЦВЛАП ===> ЕСП8266 враћа блиске приступне тачке
* АТ + ЦИФСР ===> ЕСП8266 враћа означени ИП
Програмски код можете преузети на
6 повезивање сензора и ЕСП-01
Након што се сви сензори повежу и провере, као и провери ЕСП-01 модул, потребно је припремити податке за слање на Интернет.
7 ТхингСпеак
Један од најважнијих делова пројекта је отворена ИоТ платформа која ће вам омогућити прикупљање података са сензора, обраду и анализу истих. Да бисте то учинили, идите на и отворите свој налог. Затим треба да креирате канал на коме ће се налазити 2 актуатора, 5 сензора и једно резервно поље.
• Поље 1: Активатор 1 (уређај 1)
• Поље 2: Активатор 2 (уређај 2)
• Поље 3: Температура ваздуха у оЦ (температура ваздуха у степени Целзијуса)
• Направљено 4: Релативна влажност ваздуха у% (Релативна влажност у%)
• Поље 5: Температура тла у оЦ (Температура тла у гр. Целзијуса)
• Поље 6: Влажност тла у% (влага тла у%)
• Поље 7: Светлост у% (осветљеност у%)
• Поље 8: Резервни део
Поље 8 резервисано је за будуће проширење или за уклањање погрешака. У овом се пројекту користи као бројач грешака у комуникацији између Ардуино / ЕСП-01 и ТхингСпеак.цом.
Једном када креирате Статусни канал, морате да снимите тастере, као што је приказано на фотографији.
8 Слање статуса сензора у облак
Тренутно имамо конфигурирану услугу у облаку и наши сензори прикупљају податке локално. Сада морате да узмете ове податке и пошаљете их у облак на ТхингСпеак.цом.
Да бисте уписали податке у ТхингСпеак канал, потребно је да пошаљете ГЕТ низ. То ће се радити у три фазе.
Пошаљите команду "Старт цмд"
АТ + ЦИПСТАРТ = "ТЦП", "184.106.153.149", 80
Даљња дужина низа
АТ + ЦИПСЕНД = 116
И на крају, ГЕТ низ који ће уписати наше податке у резервисана поља Статус Цханнел.
ГЕТ / упдате? Апи_кеи = Иоур_савед_кеи_хере & фиелд1 = пумп & фиелдламп = 0 & фиелд3 = аирТемп & фиелд4 = аирХум & фиелд5 = земљаТемп & фиелд6 = земљаХум & фиелд7 = светло и поље8 = резервно
Имајте на уму да не би требало да пишемо податке на канал више од 1 пута у 16 секунди.
Предани код ће све то урадити.
// Тхингспеак
Стринг статусЦхВритеКеи = "ВАШ ПИСАТИ КЉУЧ ОВДЕ"; // Статус канала: 385184
#инцлуде <СофтвареСериал.х>
СофтвареСериал ЕспСериал (6, 7); // Рк, Тк
#дефине ХАРДВАРЕ_РЕСЕТ 8
// ДС18Б20
#инцлуде <ОнеВире.х>
#инцлуде <ДалласТемпературе.х>
#дефине ОНЕ_ВИРЕ_БУС 5 // ДС18Б20 на пин Д5
ОнеВире онеВире (ОНЕ_ВИРЕ_БУС);
ДалласТемпературе ДС18Б20 (& онеВире);
инт земљаТемп = 0;
// ДХТ
#инцлуде "ДХТ.х"
#инцлуде <стдлиб.х>
инт пиноДХТ = 11;
инт типоДХТ = ДХТ22;
ДХТ дхт (пиноДХТ, типоДХТ);
инт аирТемп = 0;
инт аирХум = 0;
// ЛДР (светлост)
#дефине лдрПИН 1
инт светлост = 0;
// Влажност тла
#дефине земљаХумПИН 0
инт земљаХум = 0;
// Варијабле које се користе са тајмерима
лонг вритеТимингСецондс = 17; // ==> Дефинишите време узорковања у секунди за слање података
лонг стартВритеТиминг = 0;
дуго прошаоВритеТиме = 0;
// Варијабле које се користе са актуаторима
бооле пумпа = 0;
бооле ламп = 0;
инт резервни = 0;
боолеан еррор;
подешавање празнине ()
{
Сериал.бегин (9600);
пинМоде (ХАРДВАРЕ_РЕСЕТ, ОУТПУТ);
дигиталВрите (ХАРДВАРЕ_РЕСЕТ, ХИГХ);
ДС18Б20.бегин ();
дхт.бегин ();
ЕспСериал.бегин (9600); // Цомуницацао цом Модуло ВиФи
ЕспХардвареРесет (); // Ресет до Модуло ВиФи
стартВритеТиминг = миллис (); // покретање "програмског сата"
}
воид петља ()
{
старт: // лабел
грешка = 0;
елапседВритеТиме = миллис () - стартВритеТиминг;
иф (елапседВритеТиме> (вритеТимингСецондс * 1000))
{
реадСенсорс ();
вритеТхингСпеак ();
стартВритеТиминг = миллис ();
}
иф (грешка == 1) // Поново пошаљи ако пренос није завршен
{
Сериал.принтлн ("<<<< ГРЕШКА >>>>");
кашњење (2000);
гото старт; // пређите на ознаку "старт"
}
}
/ ********* вредност сензора за читање ************* /
воид реадСенсорс (воид)
{
аирТемп = дхт.реадТемпературе ();
аирХум = дхт.реадХумидити ();
ДС18Б20.рекуестТемпературес ();
земљаТемп = ДС18Б20.гетТемпЦБиИндек (0); // Сензор 0 ће заробити температуру тла у Целзијусу
лигхт = мапа (аналогРеад (лдрПИН), 1023, 0, 0, 100); // ЛДРДарк: 0 ==> лагано 100%
земљаХум = мапа (аналогно читање (земљаХумПИН), 1023, 0, 0, 100);
}
/ ********* Цонекао цом ТЦП цом Тхингспеак ******* /
воид вритеТхингСпеак (воид)
{
стартТхингСпеакЦмд ();
// припремити да стринг ГЕТ
Стринг гетСтр = "ГЕТ / упдате? Апи_кеи =";
гетСтр + = статусЦхВритеКеи;
гетСтр + = "& фиелд1 =";
гетСтр + = стринг (пумпа);
гетСтр + = "& фиелд2 =";
гетСтр + = стринг (лампица);
гетСтр + = "& фиелд3 =";
гетСтр + = стринг (аирТемп);
гетСтр + = "& фиелд4 =";
гетСтр + = стринг (аирХум);
гетСтр + = "& фиелд5 =";
гетСтр + = Стринг (земљаТемп);
гетСтр + = "& фиелд6 =";
гетСтр + = Стринг (земљаХум);
гетСтр + = "& фиелд7 =";
гетСтр + = стринг (лигхт);
гетСтр + = "& фиелд8 =";
гетСтр + = Стринг (резервно);
гетСтр + = "\ р \ н \ р \ н";
сендТхингСпеакГетЦмд (гетСтр);
}
/ ********* Поништи ЕСП ************* /
воид ЕспХардвареРесет (воид)
{
Сериал.принтлн ("Ресетинг .......");
дигиталВрите (ХАРДВАРЕ_РЕСЕТ, ЛОВ);
кашњење (500);
дигиталВрите (ХАРДВАРЕ_РЕСЕТ, ХИГХ);
кашњење (8000); // Темпо Рекуарио пара цомецар а лер
Сериал.принтлн ("РЕСЕТ");
}
/ ********* Започните комуникацију са ТхингСпеак ************* /
воид стартТхингСпеакЦмд (воид)
{
ЕспСериал.флусх (); // лимпа о пуферу антес де цомецар а гравар
Стринг цмд = "АТ + ЦИПСТАРТ = \" ТЦП \ ", \" ";
цмд + = "184.106.153.149"; // Ендерецо ИП де апи.тхингспеак.цом
цмд + = "\", 80 ";
ЕспСериал.принтлн (цмд);
Сериал.принт ("енвиадо ==> Старт цмд:");
Серијски.принтлн (цмд);
иф (ЕспСериал.финд ("Грешка"))
{
Сериал.принтлн ("АТ + ЦИПСТАРТ грешка");
повратак
}
}
/ ********* послати ГЕТ цмд на ТхингСпеак ************* /
Стринг сендТхингСпеакГетЦмд (Стринг гетСтр)
{
Стринг цмд = "АТ + ЦИПСЕНД =";
цмд + = стринг (гетСтр.ленгтх ());
ЕспСериал.принтлн (цмд);
Сериал.принт ("енвиадо ==> дужина цмд:");
Серијски.принтлн (цмд);
иф (ЕспСериал.финд ((цхар *) ">")
{
ЕспСериал.принт (гетСтр);
Сериал.принт ("енвиадо ==> гетСтр:");
Сериал.принтлн (гетСтр);
кашњење (500); // темпо пара процесор о ГЕТ, сем одлагања апресента заузет без прокимо цомандо
Стринг мессагеБоди = "";
док (ЕспСериал.аваилабле ())
{
Стринг лине = ЕспСериал.реадСтрингУнтил ('\ н');
иф (лине.ленгтх () == 1)
{// стварни садржај почиње после празног ретка (који има дужину 1)
мессагеБоди = ЕспСериал.реадСтрингУнтил ('\ н');
}
}
Сериал.принт ("Порука је примљена:");
Сериал.принтлн (мессагеБоди);
повратна порукаБоди;
}
друго
{
ЕспСериал.принтлн ("АТ + ЦИПЦЛОСЕ"); // упозорити корисника
Сериал.принтлн ("ЕСП8266 ГРЕШКА ЦИПСЕНД: ПОШАЉИ"); // Поново послати ...
резервни = резервни + 1;
грешка = 1;
врати "грешку";
}
}
Напредак можете видети у серијском монитору.
Изворни код се може преузети на
9 Андроид апликација - први део
Прво морате да креирате кориснички интерфејс. На слици су приказани главни видљиви и невидљиви елементи.
Након тога морате креирати блокове. Ставке менија одговарају бројевима екрана.
1 Државне променљиве које би требало да буду проглашене глобалним
2 Сваке две секунде (у зависности од сата1) позива се поступак "реадАрдуино"
Поступак враћа вриједност варијабли које би требале бити приказане на екрану. У овом случају, државна вредност (0 и 1) за погоне се претвара у "ОН" и "ОФФ" ради боље перцепције.
Ове вредности (Статус) биће приказане у одговарајућим „пречицама“
3 Рутина реадАрдуино ће у основи читати канал статуса у ТхингСпеак. Дакле, морате одредити УРЛ који ће бити послат на Тхингспеак. Да бисте то учинили, 3 глобалне променљиве морају бити декларисане и комбиноване да би се створио УРЛ који ће бити послан ТхингСпеак-у. ГЕТ треба послати на веб компоненту која се зове "АрдуФармБотСтатусЦх"
4 Текст примљен из претходне команде стићи ће у ЈСон формату. Овај текст треба обрадити тако да се свако поље прочита и похрани у одговарајућу глобалну променљиву.
5 Последња ствар коју треба да урадите је да позовете „Аларм“ поступак, који ће анализирати стање два сензора тла. Ако је температура прениска (у нашем случају 10оЦ), треба приказати поруку. Исто је и за влагу ако је испод 60%.
Имајте на уму да смо дефинисали још један тајмер (Цлоцк2), програмиран тако да га покреће сваке секунде. Потребно је само да "пребаците" боју текста поруке (са беле на црвену). Порука ће трептати.
Апликацијски код можете преузети на
10 Прикључивање погона
Команде за укључивање и искључивање пумпе и лампе примају се на даљину. Ардуниоов излаз активираће релеј и ЛЕД, узимајући ове команде. На слици се види како погонске склопове треба повезати. Имајте на уму да је ГНД релејни излаз НЕ ПОВЕЗАНО на ГНД излазУНО. На овај начин ће бити мање сметњи напајања када се релеј покреће.
Конфигурација актуатора канала (Канали покретача)
Све акције понављају поступак подешавања канала Статус. Потребно је створити два канала за сваки од уређаја. За сваки канал напишите ИД канала, тастере за читање и писање. Писаћемо само у првом пољу сваког канала. На пример:
ИД канала 375598 ==> ЛЕД црвено (пумпа)
◦ Фиелд1 = 0 ==> Пумпа ОФФ
◦ Фиелд1 = 1 ==> Пумп ОН
2. ИД канала 375599 ==> ЛЕД зелена (лампица)
◦ Фиелд1 = 0 ==> Лампа је искључена
◦ Фиелд1 = 1 ==> Свјетиљка је укључена
11 активатора пуњења и тестирања кода у Ардунију.
Када смо послали податке у облак, „податке“ смо написали у ТхингСпеак канал каналу, „преносећи“ (учитавајући) ове податке. Сада морамо „прочитати“ податке са канала покретача, „прихватити“ (преузети) те податке.
Да бисте то учинили, пошаљите ГЕТ низ и овај поступак се састоји од 3 фазе.
"Старт цмд"
АТ + ЦИПСТАРТ = "ТЦП", "184.106.153.149", 80
Дужина линије
АТ + ЦИПСЕНД = 36
И сам ГЕТ стринг
ГЕТ / канали / 375598 / поља / 1 / задњи
Канали ће се „читати“ сваких 10 секунди
Након слања ГЕТ-а, морамо прихватити одговор компаније ТхингСпеак. Одговор мора бити 0 или 1, за сваки канал. Ако постоје било које друге вредности, онда их једноставно игноришемо.
Главна разлика између овог дела и претходног је само у функцији реадТхингСпеак (Стринг цханнелИД)
Испод је код који изводи описане радње.
// Тхингспеак
Стринг цаналИД1 = "999999"; // Ацтуатор1
Стринг цаналИД2 = "999999"; // Ацтуатор2
#инцлуде <СофтвареСериал.х>
СофтвареСериал ЕспСериал (6, 7); // Рк, Тк
#дефине ХАРДВАРЕ_РЕСЕТ 8
// Варијабле које се користе са тајмерима
лонг реадТимингСецондс = 10; // ==> Дефинишите време узорковања у секунди за примање података
лонг стартРеадТиминг = 0;
дуго прошаоРеадТиме = 0;
// Релеји
#дефине АЦТУАТОР1 10 // ЦРВЕНА ЛЕД ==> Пумпа
#дефине АЦТУАТОР2 12 // ЗЕЛЕНА ЛЕД ==> Лампа
бооле пумпа = 0;
бооле ламп = 0;
инт резервни = 0;
боолеан еррор;
подешавање празнине ()
{
Сериал.бегин (9600);
пинМоде (АЦТУАТОР1, ОУТПУТ);
пинМоде (АЦТУАТОР2, ОУТПУТ);
пинМоде (ХАРДВАРЕ_РЕСЕТ, ОУТПУТ);
дигиталВрите (АЦТУАТОР1, ХИГХ); // о модуло реле е ативо ем ЛОВ
дигиталВрите (АЦТУАТОР2, ХИГХ); // о модуло реле е ативо ем ЛОВ
дигиталВрите (ХАРДВАРЕ_РЕСЕТ, ХИГХ);
ЕспСериал.бегин (9600); // Цомуницацао цом Модуло ВиФи
ЕспХардвареРесет (); // Ресет до Модуло ВиФи
стартРеадТиминг = миллис (); // покретање "програмског сата"
}
воид петља ()
{
старт: // лабел
грешка = 0;
елапседРеадТиме = миллис () - стартРеадТиминг;
иф (прошлоРеадТиме> (реадТимингСецондс * 1000))
{
инт наредба = реадТхингСпеак (цаналИД1);
иф (наредба! = 9) пумп = наредба;
кашњење (5000);
наредба = реадТхингСпеак (цаналИД2);
иф (наредба! = 9) лампица = наредба;
такеАцтионс ();
стартРеадТиминг = миллис ();
}
иф (грешка == 1) // Поново пошаљи ако пренос није завршен
{
Сериал.принтлн ("<<<< ГРЕШКА >>>>");
кашњење (2000);
гото старт; // пређите на ознаку "старт"
}
}
/ ********* Подузмите акције засноване на ТхингСпеак наредбама ************* /
неважеће акције (неважеће)
{
Сериал.принт ("Пумп:");
Сериал.принтлн (пумпа);
Сериал.принт ("Лампа:");
Сериал.принтлн (лампица);
иф (пумп == 1) дигиталВрите (АЦТУАТОР1, ЛОВ);
остало дигиталВрите (АЦТУАТОР1, ХИГХ);
иф (лампица == 1) дигиталВрите (АЦТУАТОР2, ЛОВ);
остало дигиталВрите (АЦТУАТОР2, ХИГХ);
}
/ ********* Прочитајте наредбу покретача из ТхингСпеак ************* /
инт реадТхингСпеак (Стринг цханнелИД)
{
стартТхингСпеакЦмд ();
инт команда;
// припремити да стринг ГЕТ
Стринг гетСтр = "ГЕТ / канали /";
гетСтр + = цханнелИД;
гетСтр + = "/ поља / 1 / последња";
гетСтр + = "\ р \ н";
Стринг мессагеДовн = сендТхингСпеакГетЦмд (гетСтр);
иф (порукаДовн [5] == 49)
{
цомманд = мессагеДовн [7] -48;
Сериал.принт ("Команда примљена:");
Сериал.принтлн (команда);
}
цомманд наредба = 9;
ретурн цомманд;
}
/ ********* Поништи ЕСП ************* /
воид ЕспХардвареРесет (воид)
{
Сериал.принтлн ("Ресетинг .......");
дигиталВрите (ХАРДВАРЕ_РЕСЕТ, ЛОВ);
кашњење (500);
дигиталВрите (ХАРДВАРЕ_РЕСЕТ, ХИГХ);
кашњење (8000); // Темпо Рекуарио пара цомецар а лер
Сериал.принтлн ("РЕСЕТ");
}
/ ********* Започните комуникацију са ТхингСпеак ************* /
воид стартТхингСпеакЦмд (воид)
{
ЕспСериал.флусх (); // лимпа о пуферу антес де цомецар а гравар
Стринг цмд = "АТ + ЦИПСТАРТ = \" ТЦП \ ", \" ";
цмд + = "184.106.153.149"; // Ендерецо ИП де апи.тхингспеак.цом
цмд + = "\", 80 ";
ЕспСериал.принтлн (цмд);
Сериал.принт ("енвиадо ==> Старт цмд:");
Серијски.принтлн (цмд);
иф (ЕспСериал.финд ("Грешка"))
{
Сериал.принтлн ("АТ + ЦИПСТАРТ грешка");
повратак
}
}
/ ********* послати ГЕТ цмд на ТхингСпеак ************* /
Стринг сендТхингСпеакГетЦмд (Стринг гетСтр)
{
Стринг цмд = "АТ + ЦИПСЕНД =";
цмд + = стринг (гетСтр.ленгтх ());
ЕспСериал.принтлн (цмд);
Сериал.принт ("енвиадо ==> дужина цмд:");
Серијски.принтлн (цмд);
иф (ЕспСериал.финд ((цхар *) ">")
{
ЕспСериал.принт (гетСтр);
Сериал.принт ("енвиадо ==> гетСтр:");
Сериал.принтлн (гетСтр);
кашњење (500); // темпо пара процесор о ГЕТ, сем одлагања апресента заузет без прокимо цомандо
Стринг мессагеБоди = "";
док (ЕспСериал.аваилабле ())
{
Стринг лине = ЕспСериал.реадСтрингУнтил ('\ н');
иф (лине.ленгтх () == 1)
{// стварни садржај почиње после празног ретка (који има дужину 1)
мессагеБоди = ЕспСериал.реадСтрингУнтил ('\ н');
}
}
Сериал.принт ("Порука је примљена:");
Сериал.принтлн (мессагеБоди);
повратна порукаБоди;
}
друго
{
ЕспСериал.принтлн ("АТ + ЦИПЦЛОСЕ"); // упозорити корисника
Сериал.принтлн ("ЕСП8266 ГРЕШКА ЦИПСЕНД: ПОШАЉИ"); // Поново послати ...
резервни = резервни + 1;
грешка = 1;
врати "грешку";
}
}
Можете је преузети на
12 слање команди уређајима
У овој фази имамо конфигурирани канал актуатора који мијења вриједност поља 1 за сваки уређај. Морамо проверити да уређаји правилно раде команде. На крају пројекта користиће се андроид апликација за то, али може и преко прегледача.
Укључите пумпу (укључен црвени ЛЕД)
хттпс://апи.тхингспеак.цом/упдате?апи_кеи=Савед_цханнел_кеи_1&фиелд1=1
Искључите (црвени ЛЕД искључен)
хттпс://апи.тхингспеак.цом/упдате?апи_кеи=Савед канал_кеи_1 & фиелд1 = 0
Укључите лампу (зелена ЛЕД лампица је укључена)
хттпс://апи.тхингспеак.цом/упдате?апи_кеи=Савед канал_кеи_2 & фиелд1 = 1
Искључите лампицу (зелени ЛЕД искључен)
хттпс://апи.тхингспеак.цом/упдате?апи_кеи=Саведен канал_кеи_2 & фиелд1 = 0
14 Завршетак андроид програма
У претходном делу постојао је једноставан програм који је „прочитао“ податке са канала и приказао их на екрану. Сада морамо направити да програм „упише“ наредбе у каналу покретача, тако да ове наредбе контролер може очитати и лампица са пумпом радити у складу с тим.
Тако да корисник може слати наредбе, апликација ће имати два дугмета за сваки уређај. Ако је укључен, плава, ако је искључена, црвена.
Кликом на дугмад у апликацији, резултат можете видети у серијском монитору.
Код се може преузети на
15 Завршна монтажа
У овој фази постоји потпуно завршена андроид апликација, у потпуности састављен „гвоздени“ део, али у контролеру не постоји код који би стално читао податке и слао команде у облак. Треба само да комбинујете све фрагменте кода написане раније. Наравно, код има и додатне опције верификације (на пример, ако ЕСП-01 замрзне). Да бисте то учинили, периодично се пре сваке наредбе за читање или писање шаље АТ наредба.А ако одговор ОК није стигао из модула, модул се присилно поново покреће програмски.
Комплетан код пројекта можете преузети на
На адреси можете добити ажурирања за програмске датотеке.
Такође можете прочитати коментаре на линку до извора, ако нешто није јасно.