Мазмуну:

WebApp Controlled Gate Operator Add-on (IoT): 20 Steps (Сүрөттөр менен)
WebApp Controlled Gate Operator Add-on (IoT): 20 Steps (Сүрөттөр менен)

Video: WebApp Controlled Gate Operator Add-on (IoT): 20 Steps (Сүрөттөр менен)

Video: WebApp Controlled Gate Operator Add-on (IoT): 20 Steps (Сүрөттөр менен)
Video: Загадка Титаника : Как они могли не заметить айсберг?! Самая подробная история! 2024, Июль
Anonim
WebApp көзөмөлдөгөн дарбаза оператору кошумча (IoT)
WebApp көзөмөлдөгөн дарбаза оператору кошумча (IoT)
WebApp көзөмөлдөгөн дарбаза оператору кошумча (IoT)
WebApp көзөмөлдөгөн дарбаза оператору кошумча (IoT)
WebApp көзөмөлдөгөн дарбаза оператору кошумча (IoT)
WebApp көзөмөлдөгөн дарбаза оператору кошумча (IoT)

Менин кардарым бар, анын дарбазасы бар, көп адамдар келип кетиши керек болчу. Алар сырттан баскычтопту колдонууну каалашкан жок жана чектүү санда keyfob өткөргүчтөрү бар болчу. Кошумча Keyfobs үчүн жеткиликтүү булакты табуу кыйын болду. Бул Liftmaster дарбазасынын операторун IoT ыңгайлаштырылган аппаратура, веб API жана веб -колдонмо интерфейси менен жаңыртуу үчүн сонун мүмкүнчүлүк болмок деп ойлодум. Бул массалык жеткиликтүүлүк маселесин гана чечпестен, кошумча функцияларды да ачты!

Жогорудагы акыркы сүрөттө мен бир жылга жакын убакыттан бери иштей турган сыноо бөлүмү. Мен жаңыртуу убактысы келди деп ойлодум!

Бул жерде көрсөтүлгөн бардык коддору, аппараттык маалыматтары жана долбоорлору менен толук иштеген чечим.

Долбоорлордун бардык файлдары GitHubда да жайгаштырылган: github.com/ThingEngineer/IoT-Gate-Operator-Addon

CodeIgniter WebApp интерфейсинин мисалы бул жерде жайгаштырылган: projects.ajillion.com/gate Бул мисал түз дарбазага туташкан эмес, бирок дарбазада иштеп жаткан так интерфейс жана код (кээ бир коопсуздук функциялары).

--

Андан да чоң интеграция үчүн IFTTT китепканасын Electric Imp үчүн колдонсоңуз болот.

1 -кадам: Бөлүктөрдү чогултуу

Бөлүктөрдү чогултуу
Бөлүктөрдү чогултуу
  • Сизге жок дегенде 4 GPIO менен Электрдик IMP керек болот, мен IMP001ди апрель сынык тактасы менен колдонуп жатам.
  • Булак чыңалуусун 5В чейин түшүрүү үчүн жөндөгүч. Мен DC-DC Бак Converter Step Down модулун колдонуп жатам. eBootтун MP1584EN версиясы Amazonдон.
  • IMPs чыгаруу менен иштей турган кош (же андан көп) реле модулу же окшош коммутациялык түзмөк. Мен Amazon'дон JBtek 4 Channel DC 5V Relay Module колдонуп жатам.
  • 4 зымдуу терминал. Мен муну колдонуп жатам 5Pcs 2 Rows 12P Wire Connector Screw Terminal Barrier Block 300V 20A Amazon.

2 -кадам: Берилиштер

Жабдуулар
Жабдуулар

Ошондой эле сизге керек болот:

  • 3D принтерге же кичинекей долбоор кутусуна кирүү
  • Капкактын капкагы үчүн 4мм х 6мм жөнүндө 4 кичине бурамалар
  • Кошуу зымы
  • Сым кескичтер
  • Сым тазалагычтар
  • Кичинекей отверткалар
  • Кандооч
  • Ысык желим же силикон
  • Zip галстуктары

3 -кадам: Корпусту чоңойт

Корпусту чоңойтуу
Корпусту чоңойтуу

Кандай өлчөмдөгү корпус керектигин аныктоо үчүн бөлүктөрүңүздү жайгаштырыңыз. Сүрөттөгү макет менен мага туурасы 140 мм, тереңдиги 70 мм жана бийиктиги 30 мм болгон корпус керек.

4-кадам: Wire DC-DC Converter

Wire DC-DC Converter
Wire DC-DC Converter

DC-DC конвертер коллегиясынын ичине жана сыртына электр туташуусу үчүн 3 жуп кызыл жана кара кошуу зымын кескиле.

  • Киргизүү: 100мм
  • IMPге чыгуу: 90мм
  • Реле модулуна чыгаруу: 130мм

Көрсөтүлгөндөй аларды тактаңызга кошуп коюңуз.

5 -кадам: Түзмөктөргө электр зымдары

Түзмөктөргө электр зымдары
Түзмөктөргө электр зымдары
  • DC-DC конвертеринин киришин бурамалуу терминалдык блоктогу эки чекитке туташтырыңыз.
  • Кыска 5В чыгуу зымдарын IMPге туташтырыңыз.
  • Узунураак 5В чыгуучу зымдарды реле модулуна кошуңуз.

6 -кадам: Зым реле модулунун кириштери

Зым реле модулунун кириштери
Зым реле модулунун кириштери
  • Реле модулунун кирүү туташуулары үчүн 4 х 90мм зымдарды кесип. Мен коддоодо кийинчерээк оңой маалымдоо үчүн 4 башка түстү колдондум.
  • Зымдарды реле модулуна 1-4, андан кийин биринчи 4 IMP GPIO тактарына (Pin1, 2, 5, & 7) киргизиңиз.

7 -кадам: IMP Power Jumper

IMP Power Jumper
IMP Power Jumper

Сиз IMPти программалоодо жана сынап жатканда USB кубатын колдонушуңуз керек болот. Бүткөндөн кийин, кубат секиргичин BAT тарапка жылдырууну унутпаңыз.

8 -кадам: Зым дарбазасынын статусун киргизүү

Зым дарбазасынын статусун киргизүү
Зым дарбазасынын статусун киргизүү
  • Каныккан абал үчүн 2 х 80 мм зымдарды кесиңиз.
  • Калган 2 бурамалуу терминалга зымдарды туташтырыңыз.
  • Тиешелүү түрдө IMP GPIO тактарынын (Pin8 & 9) кийинки зымдары.

9 -кадам: Чапты басып чыгаруу же сатып алуу

Капты басып чыгаруу же сатып алуу
Капты басып чыгаруу же сатып алуу

Бул үчүн менин. STL же. F3D файлымды GitHub же Thingiverse жүктөп алсаңыз болот

Эгерде сизде 3D принтерге кирүү мүмкүнчүлүгү жок болсо, анда чакан генералдык проект иштейт.

10 -кадам: Делеңизди кооздоңуз

Сиздин ишиңизди кооздоңуз
Сиздин ишиңизди кооздоңуз

Анткени!

Мен тексттин үстүнө чөгүп кеткен текстти коюп, аны кара курч менен боёгом. Эгерде сиз өзүңүздү укмуштуудай сезсеңиз, аны жылмакай кылуу үчүн акрил боёгу, тырмак лак же башка нерсени колдонсоңуз болот.

11 -кадам: Сымдарды тешүү

Сым үчүн бургулоо тешиги
Сым үчүн бургулоо тешиги

Бардык зымдар чогула турган ортосуна жакын жерде 10-15 мм кичинекей тешик бургула.

Мен Unibitти пластмассадан таза, жылмакай тешик үчүн колдондум.

12 -кадам: Hookup зымдарын даярдоо жана орнотуу

Hookup зымдарын даярдоо жана орнотуу
Hookup зымдарын даярдоо жана орнотуу
Hookup зымдарын даярдоо жана орнотуу
Hookup зымдарын даярдоо жана орнотуу

Биздин аппаратты дарбазанын операторлор тактасына илип коюу үчүн 9 x 5-600мм зымдарды кескиле.

  • 24V кубаттуулугу үчүн 2
  • 3 дарбаза статусу үчүн (2 киргизүү жана жалпы жер)
  • 2 ачык дарбаза сигналы үчүн
  • 2 дарбазанын жабылышы үчүн

Жогоруда саналган топтордун ар бирин бургулап колдонуңуз. Бул бардык нерсени жеңилдетет жана жакшыраак көрүнөт.

Зымдардын ар бирин көрсөтүлгөн терминалдарга туташтырып, туташтырыңыз.

13 -кадам: Маршрут Hookup Wires

Маршрут туташуу зымдары
Маршрут туташуу зымдары

Кошулган зымдарды тешиктен көрсөтүлгөндөй өткөрүңүз.

14 -кадам: компоненттерди орнотуу

Тоо компоненттери
Тоо компоненттери

Компоненттерди кичинекей мончок ысык желим же силикон менен жайгаштырыңыз жана орнотуңуз. Бир бөлүгүн алып салуу керек болсо, өтө көп колдонбоңуз, аларды коргоо үчүн жетиштүү өлчөмдө колдонуңуз.

Мен башында ишти такталарды кармоо үчүн клиптер/өтмөктөр менен басып чыгаргым келген, бирок мен муну орнотушум керек болчу жана убактым жок болчу. Делеге клиптерди кошуу жагымдуу болмок.

15 -кадам: Hookup Wires мөөрүн жабыңыз

Seal Hookup Wires
Seal Hookup Wires

Байланыш зымдарын ысык желим же силикон менен жабыңыз.

16 -кадам: Ишти жабыңыз

Ишти жабуу
Ишти жабуу

Мен бул 3D басылган иштин тизмесинде кичинекей ~ 4мм бурамаларды колдондум. Эгерде сиз кир же ным жөнүндө тынчсызданып жатсаңыз, жабуунун алдында кремнийдин тегерегине силикон же ысык клей салыңыз.

17 -кадам: Дарбаза операторуна орнотуңуз

Gate операторуна орнотуу
Gate операторуна орнотуу
Gate операторуна орнотуу
Gate операторуна орнотуу

Негизги тактада:

  • Ачык дарбаза терминалына 1 релелик чыгууга туташкан эки зымды илиниз. (сүрөттөрдө кызыл/күрөң)
  • 2 релелик чыгууга туташкан эки зымды Жабуу дарбазасына туташтырыңыз. (сүрөттөрдө сары/көк)
  • DC-DC конвертеринин киришине туташтырылган эки зымды 24V аксессуардык электр винт терминалдарына илип коюңуз (сүрөттөрдө кызыл/кара)

Кеңейтүү тактасында

  • Релектин жалпы бурама терминалдарын кичинекей зым менен бирге секирип коюңуз
  • Жалпы жерди релелик жалпы бурамалуу терминалдардын бирине туташтырыңыз (сүрөттөрдө жашыл)
  • 2 дарбазанын статусун киргизүүнү (IMP Pin8 & 9) релелик кадимки ачык (NO) бурамалуу терминалдарга туташтырыңыз (сүрөттөрдө боз/сары)

Зымдарды маршруттаңыз, тыкан көрүнүшү үчүн аларды байлап коюңуз жана ишиңизди орнотууга же коюуга жер табыңыз.

GitHub репозиторийинде жайгаштырылган кошумча, толук чечим сүрөттөр бар.

18 -кадам: Aux Relay режимин коюңуз

Aux Relay режимин коюу
Aux Relay режимин коюу

Көмөкчү релелик өчүргүчтөрдү сүрөттө көрсөтүлгөндөй орнотуңуз.

Бул IMPге дарбазанын жабылганын, ачылышын, ачылышын же жабылышын аныктоо үчүн керектүү сигналдарды берет.

19 -кадам: IMP агенти жана түзмөк коду

IMP агент жана түзмөк коду
IMP агент жана түзмөк коду

Electric Imp Agent коду:

  • Electric Imp IDEде жаңы модель түзүү:
  • Сервериңизди көрсөтүү үчүн URL дарегин алмаштырыңыз

// HTTP иштетүү функциясы

httpHandler функциясы (req, resp) {аракет кылыңыз {local d = http.jsondecode (req.body); //server.log(d.c); if (dc == "btn") {//server.log(d.val); device.send ("btn", d.val); resp.send (200, "Макул"); }} catch (ex) {// Эгерде ката болсо, аны кайра server.log ("ката:" + ex) жөнөтүңүз; resp.send (500, "Ички Server Error:" + ex); }} // HTTP иштетүүчүсүн каттаңыз http.onrequest (httpHandler); // GateStateChange иштетүүчү функциясынын функциясы gateStateChangeHandler (маалыматтар) {// веб -сервиске URL url = "https://projects.ajillion.com/save_gate_state"; // Content-Type аталышын json local headers = {"Content-Type": "application/json"} коюңуз; // Алынган маалыматтарды коддоо жана жергиликтүү органды жазуу = http.jsonencode (маалыматтар); server.log (body); // http:post (url, headers, body).sendsync () веб сервисине маалыматтарды жөнөтүү; } // gateStateChange иштетүүчү device.on ("gateStateChange", gateStateChangeHandler) каттоо;

Electric Imp Agent коду:

  • Моделиңизге Imp түзмөгүн дайындаңыз
  • Аппараттык төөнөгүчтөр жалганганын текшериңиз

// Debouce китепканасы

#require "Button.class.nut: 1.2.0" // gateOpen GPIO pin (активдүү төмөн) gateOpen <- hardware.pin2; // Али дарбазасыClose control GPIO pin (активдүү төмөн) gateClose <- hardware.pin7; // 'gateOpen'ди санариптик 1 (жогорку) gateOpen.configure (DIGITAL_OUT, 1) баштапкы мааниси бар санарип чыгаруу деп конфигурациялаңыз; // 'gateClose' ди санариптик 1 (жогорку) gateClose.configure баштапкы мааниси бар санариптик чыгууга конфигурациялоо (DIGITAL_OUT, 1); // GPIO пин үчүн лакап ат, дарбазанын жылып баратканын көрсөтөт (N. O.) gateMovingState <- Button (hardware.pin8, DIGITAL_IN_PULLUP); // GPIO пин үчүн лакап ат, дарбаза толугу менен ачык экенин көрсөтөт (N. O.) gateOpenState <- Button (hardware.pin9, DIGITAL_IN_PULLUP); // Глобалдык өзгөрмө дарбазанын абалын кармоо үчүн (Open = 1 / Closed = 0) local lastGateOpenState = 0; // Latch Timer объектиси жергиликтүү latchTimer = null agent.on ("btn", функция (берилиштер) {switch (data.cmd) {case "open": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer)); latchTimer = imp.wakeup (1, releaseOpen); server.log ("Open command алынды"); break case "latch30m": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (1800, releaseOpen); server.log ("Latch30m командасы алынды"); break case "latch8h": gateOpen.write (0); if (latchTimer) imp.cancelwakeup (latchTimer); latchTimer = imp.wakeup (28800, releaseOpen); server.log ("Latch8h командасы алынды"); бузуу иши "жабуу": эгерде (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); gateClose.write (0); latchTimer = imp.wakeup (1, releaseClose); server.log ("Азыр жабуу командасы алынды"); демейки бузуу: server.log ("Түймө командасы таанылган жок");}}); function releaseOpen () {if (latchTimer) imp.cancelwakeup (latchTimer); gateOpen.write (1); //server.log("Timeer release gateOpen switch contact "); } function releaseClose () {if (latchTimer) imp.cancelwakeup (latchTimer); gateClose.write (1); //server.log("Timeer release gateClose switch contact "); } gateMovingState.onPress (function () {// Реле иштетилди, дарбаза жылууда //server.log("Gate ачылууда "); жергиликтүү маалыматтар = {" gatestate ": 1," timer ": hardware.millis ()}; agent.send ("gateStateChange", маалыматтар);}). onRelease (function () {// Реле бошотулду, дарбаза эс алууда //server.log("Gate жабык "); жергиликтүү маалыматтар = {"gatestate": 0, "timer": hardware.millis ()}; agent.send ("gateStateChange", маалыматтар);}); gateOpenState.onPress (function () {// Реле иштетилди, дарбаза толугу менен ачылды //server.log("Gate is open "); локалдык маалыматтар = {" gatestate ": 2," timer ": hardware.millis ()}; agent.send ("gateStateChange", маалыматтар);}). onRelease (function () {// Реле бошотулду, дарбаза толук ачылган жок //server.log("Gate жабылып жатат "); жергиликтүү маалыматтар = {"gatestate": 3, "timer": hardware.millis ()}; agent.send ("gateStateChange", маалыматтар);});

20 -кадам: Web кызматы PHP коду

PHP кодунун веб кызматы
PHP кодунун веб кызматы

Мен бул кодду CodeIgniter алкагы үчүн жаздым, анткени мен аны эски долбоорго коштум. Контроллер жана көрүү коду сиз тандаган алкакка оңой ыңгайлаштырылышы мүмкүн.

Жөнөкөй нерселерди сактоо үчүн мен JSON маалыматтарын маалыматтарды сактоо үчүн жалпак файлга сактап койдум. Эгерде сизге журнал керек болсо же ага байланыштуу татаалыраак функциялар болсо, маалымат базасын колдонуңуз.

Мен жазган жана бул долбоордо колдонгон ajax китепканасы GitHub репозиторийинен жүктөп алса болот: ThingEngineer/Codeigniter-jQuery-Ajax

PHP Controller коду:

  • app/controllers/projects.php
  • Маалымат жолуна PHP скриптиңиз жеткиликтүү болушун камсыздаңыз, жайгашкан жери жана окуу/жазуу артыкчылыктары.

load-> helper (array ('file', 'date'));

$ data = json_decode (read_file ('../ app/logs/gatestate.data'), TRUE); switch ($ data ['gatestate']) {case 0: $ view_data ['gatestate'] = 'Жабык'; тыныгуу; 1 -жагдай: $ view_data ['gatestate'] = 'Ачылууда…'; тыныгуу; 2 -жагдай: $ view_data ['gatestate'] = 'Ачык'; тыныгуу; 3 -жагдай: $ view_data ['gatestate'] = 'Жабуу…'; тыныгуу; } $ last_opened = json_decode (read_file ('../ app/logs/projects/gateopened.data'), TRUE); $ view_data ['last_opened'] = убакыт аралыгы ($ last_opened ['last_opened'], time ()). 'мурун'; // Load View $ t ['data'] = $ view_data; $ this-> load-> view ('gate_view', $ t); } function save_gate_state () {$ this-> load-> helper ('file'); $ data = file_get_contents ('php: // input'); write_file ('../ app/logs/projects/gatestate.data', $ data); $ data = json_decode ($ data, TRUE); if ($ data ['gatestate'] == 1) {$ last_opened = array ('last_opened' => time ()); write_file ('../ app/logs/projects/gateopened.data', json_encode ($ last_opened)); }} function get_gate_state () {$ this-> load-> helper (array ('file', 'date')); $ this-> load-> library ('ajax'); $ data = json_decode (read_file ('../ app/logs/projects/gatestate.data'), TRUE); $ last_opened = json_decode (read_file ('../ app/logs/projects/gateopened.data'), TRUE); $ data ['last_opened'] = убакыт аралыгы ($ last_opened ['last_opened'], убакыт ()). 'мурун'; $ this-> ajax-> output_ajax ($ data, 'json', FALSE); // json маалыматтарын жөнөтүү, ajax өтүнүчүн аткарбоо}}/ * Файл долбоорлорунун аягы.php *// * Жайгашкан жери:./application/controllers/projects.php */

PHP көрүү коду:

Мен Bootstrapти алдыңкы учу үчүн колдондум, анткени ал тез, оңой жана жооп берет. Аны бул жерден жүктөп алсаңыз болот: https://getbootstrap.com (jQuery камтылган)

  • app/controllers/gate_view.php
  • АГЕНТ-КОДуңузду Electric Imp агентиңиздин коду менен алмаштырыңыз

IoT Gate Opperator Addon IoT Gate Opperator Addon

  • Үй
  • Admin

Ачуу дарбазасынын ачкычы 30 мүнөткө ачылат 8 саатка ачылат Азыр жабуу Дарбазанын абалы: Акыркы жолу $ (документ).ready (function () {resetStatus ();}) функциясы sendJSON (JSONout) {var url = 'https:// agent.electricimp.com/YOUR-AGENT-CODE '; $.post (url, JSONout); } $ ("#open_gate"). чыкылдатыңыз (function () {var JSONout = '{"c": "btn", "val": {"cmd": "open"}}'; sendJSON (JSONout); $ ("#статус"). текст ("Ачылууда…");}); $ ("#latch30m_gate"). чыкылдатыңыз (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch30m"}}}; sendJSON (JSONout); $ ("#статус"). текст ("Ачылууда…");}); $ ("#latch8h_gate"). чыкылдатыңыз (function () {var JSONout = '{"c": "btn", "val": {"cmd": "latch8h"}}}; sendJSON (JSONout); $ ("#статус"). текст ("Ачылууда…");}); $ ("#close_gate"). чыкылдатыңыз (function () {var JSONout = '{"c": "btn", "val": {"cmd": "close"}}}; sendJSON (JSONout); $ ("#статус"). текст ("Жабуу…");}); function resetStatus () {// Target url var target = 'https://projects.ajillion.com/get_gate_state'; // Var data = {agent: 'app'} суроо; // Ajax посттун сурамын жөнөтүү $.ajax ({url: target, dataType: 'json', type: 'POST', data: data, success: function (data, textStatus, XMLHttpRequest) {switch (data.gatestate) {case 0: $ ("#статус"). Текст ('Жабык'); тыныгуу; 1 -абал: $ ("#абал"). Текст ('Ачылууда…'); тыныгуу; 2 -абал: $ ("#статус").text ('Ачык'); тыныгуу; 3 -абал: $ ("#абал"). текст ('Жабуу…'); тыныгуу; демейки: $ ("#абал"). текст ('Ката');} $ ("#last_opened"). текст (data.last_opened);}, ката: функция (XMLHttpRequest, textStatus, errorThrown) {// Error message $ ("#status"). text ('Server Error');}}); setTimeout (resetStatus, 3000); }

Сунушталууда: