Управление питанием при помощи Arduino . Часть вторая.
Появилось немного фоточек процесса :), в продолжение предыдущего поста
P.S. «Реализация в железе» — не моя.
[Not a valid template]Жизнь замечательных грибов
Архив статей и записей написанных Грибовым Павлом
Появилось немного фоточек процесса :), в продолжение предыдущего поста
P.S. «Реализация в железе» — не моя.
[Not a valid template]Задача: необходимо обеспечить скрытие пароля для пользователя.
Решение:
1 2 3 4 5 6 7 8 9 |
$("#password").filter(function() { return true; }).each(function() { $(this).text("******"); }); $('#password').editable({ type: 'password', success: function(data) {if (data!="") $().toastmessage('showWarningToast', data);} }); |
Для решения задачи управления розетками было принято решение разработать сиё на основе Arduino. Самый простой способ = самый надежный. Будем управлять по протоколу http. Для этого на ардулине придется «поднять» мини web сервер, который единственно на что способен : 1) принимать запрос и выполнять его 2) Отправлять в json формате информацию о статусе реле. Дополнительно в скетче использовалась библиотека TextFinder, для выделения параметров запроса GET.
Скетч:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
#include <SPI.h> #include <Ethernet.h> #include <TextFinder.h> //назначаем МАС и IP byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress ip(192,168,1,177); EthernetServer server(80); //на каких ногах переключатели int pinscount=8; int pins[]={2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}; int pins_status[]={LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW,LOW}; int command = 0; int setpin=0; int setpinstatus=0; void setup() { Serial.begin(9600); // start the Ethernet connection and the server: Ethernet.begin(mac, ip); server.begin(); Serial.print("server is at "); Serial.println(Ethernet.localIP()); for (int i=0; i < pinscount; i++){ pinMode(pins[i], OUTPUT); }; } void loop(){ EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { TextFinder response(client); if(response.find("GET /")) { if (response.find("command=")) { command = response.getValue(); Serial.println(command); } }; if (command==1) { client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); client.print("<!DOCTYPE HTML>"); //Выводим информацию об устройстве client.print("{\"ip\":\""); client.print(Ethernet.localIP()); client.print("\",\"pins\":["); for (int i=0; i < pinscount; i++){ client.print(pins[i]); if (i<pinscount-1){client.print(",");}; }; client.print("],\"pinsstatus\":["); for (int i=0; i < pinscount; i++){ client.print(pins_status[i]); if (i<pinscount-1){client.print(",");}; }; client.print("]}\n"); }; if (command==99){ client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); client.print("<!DOCTYPE HTML>"); if (response.find("setpin=")) { setpin = response.getValue(); Serial.println(setpin); } if (response.find("setpinstatus=")) { setpinstatus = response.getValue(); Serial.println(setpinstatus); } digitalWrite(pins[setpin], setpinstatus); pins_status[setpin]=setpinstatus; client.print("{\"status\":\"ok\"}\n"); }; client.stop(); } } delay(1); client.stop(); Serial.println("client disonnected"); } } |
Пример запроса на получение статуса розеток:
http://192.168.1.177/?command=1
Пример запроса на переключение реле:
http://192.168.1.177/?command=99&setpin=3&setpinstatus=1
Таким образом, т.к. на выходе JSOIN, легко нарисовать «Веб морду».
Вот уже больше месяца, Почта РФ глобально обновляет своё ПО в подразделениях. Как результат — платежи организации где я работаю в настоящий момент, не принимаются ни в одном отделении. Стучание во все доступные инстанции приводит к нулевому результату. Хорошо, что я мудрый человек и изначально когда заключали договор с Почтой РФ предупредил, что не нужно особо рекламировать оплату посредством Почты ибо структура не понятная, не поворотливая и главное что когда с ними общаешся, возникает стойкое ощущение, что им ты как контрагент не нужен вовсе.
Данный плагин разработан для сохранения состояния колонок таблиц jqgrid при перезагрузке страницы. Сохраняет/восстанавливает состояние колонок: скрыт/не скрыт и ширину. Более ничего. В принципе легко доработать для получения возможности сохранения любых других параметров.
Пример использования:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
jQuery("#fininetinfo").jqGrid({ url:'tinfo.php?orgid='+defaultorgid+"&blibase="+$("#blibase").val()+"&agrm_id="+agrm_id, datatype: "json", colNames:['id','Сумма','Тариф','Период','Дата нач.'], colModel:[ {name:'record_id' ,index:'record_id' , width:15,search: false,hidden:true,fixed:true}, {name:'amount' ,index:'amount' , width:55,editable:false,search: true,fixed:true}, {name:'tarif' ,index:'tarif' , width:60,editable:false,search: true}, {name:'period' ,index:'period' , width:60,editable:true,search: false,fixed:true}, {name:'dateofcharge',index:'dateofcharge' , width:60,editable:false,search: true,fixed:true} ], resizeStop: function() { $("#fininetinfo").saveCommonParam("fininetinfo"); }, gridComplete:function() { $("#fininetinfo").loadCommonParam("fininetinfo"); }, ... ... |
Команды:
1 |
$("селектор").saveCommonParam("уникальный идентификатор"); //сохраняем данные по колонкам |
1 |
$("селектор").loadCommonParam("уникальный идентифкатор использованный в saveCommonParam"); // загрузить данные по колонкам. |
Собственно сам плагин:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
$(function() { $.jgrid.extend({ setColWidth: function (iCol, newWidth, adjustGridWidth) { return this.each(function () { var $self = $(this), grid = this.grid, p = this.p, colName, colModel = p.colModel, i, nCol; if (typeof iCol === "string") { colName = iCol; for (i = 0, nCol = colModel.length; i < nCol; i++) { if (colModel[i].name === colName) { iCol = i; break; } } if (i >= nCol) { return; } } else if (typeof iCol !== "number") { return; } grid.resizing = { idx: iCol }; grid.headers[iCol].newWidth = newWidth; grid.newWidth = p.tblwidth + newWidth - grid.headers[iCol].width; grid.dragEnd(); if (adjustGridWidth !== false) { $self.jqGrid("setGridWidth", grid.newWidth, false); } }); } }); $.jgrid.extend({ saveCommonParam: function(stname){ colarray=$(this).jqGrid('getGridParam','colModel'); localStorage.setItem(stname, JSON.stringify(colarray)); console.log(JSON.stringify(colarray)); }, loadCommonParam: function(stname){ if (localStorage[stname]!=undefined) { colarray=localStorage[stname]; if (colarray!=""){ obj_for_load=JSON.parse(colarray); // загружаем JSON в массив for (i in obj_for_load) { //console.log("name:",obj_for_load[i].name); //console.log("width:",obj_for_load[i].width); if (obj_for_load[i].hidden==true){ $(this).hideCol(obj_for_load[i].name); } else { $(this).showCol(obj_for_load[i].name); if (obj_for_load[i].fixed==true){ $(this).setColWidth(obj_for_load[i].name, obj_for_load[i].width); }; } }; } } else { console.log("в локальном хранилище не найден ключ "+stname); }; } }); }); |