Страница 1 из 2

Вопрос новичка по чтению сенсоров

Добавлено: Пн янв 07, 2013 11:28 pm
doctor64
Добрый день!

Вот, обнаружил этот интересный проект, но не очень понимаю как мне проинтегрировать мою существующую систему.

Конкретно есть ардуино контроллер к которому подключенны датчики температуры, давления, влажности. Плюс он управляет электрооборудованием аквариума. Может репортить текущее состояние по простым командам в ком порт. Но, пробросить ком порт в сокет не проблема через tinkerproxy, объекты как описанно в http://smartliving.ru/Main/ScMonitorHeating я создал, а как собственно сделать регулярный опрос датчиков?

Прошу прощения если вопрос глупый, мне бы пример...

Re: Вопрос новичка по чтению сенсоров

Добавлено: Вт янв 08, 2013 11:08 am
meboo
На примере этого сценария можно сделать опрос всех Ваших датчиков. http://smartliving.ru/Main/ScMonitorHeating
Также будет полезным раздел сценариев на сайте проэкта.

Re: Вопрос новичка по чтению сенсоров

Добавлено: Вт янв 08, 2013 12:17 pm
doctor64
Я эту страницу уже со всех сторон пересмотрел, но так и не понял, где, собственно, происходит опрос датчиков.
Потому и спрашиваю.

Re: Вопрос новичка по чтению сенсоров

Добавлено: Вт янв 08, 2013 1:00 pm
meboo
Варианта 2:
1) ардуино сам говорит системе состояние датчиков после опроса путем отправки запроса на веб сервер Майордомо:
GET /objects/?object=sensorZal&op=m&m=tempChanged&t=%0d.%d;
2) если используется ардуино в роли сервера - тогда можно через веб-переменные считывать состояние.

По первому варианту код можно посмотреть здесь: https://github.com/sochkasov/majordomo- ... roller.ino
По второму: https://github.com/sochkasov/majordomo- ... Server.ino
но я еще не понял как с помощью веб переменных витягивать нужную мне информацию по датчикам, сам спрашиваю у знатоков: http://smartliving.ru/forum/viewtopic.php?f=4&t=78
Ястно только одно, что в коде нужно добавить две строки

Код: Выделить всё

void loop() {
char buff[64];
int len = 64;
webserver.processConnection(buff, &len); // process incoming connections one at a time forever
sensors.requestTemperatures();
delay(1000); 
}

Re: Вопрос новичка по чтению сенсоров

Добавлено: Вт янв 08, 2013 1:10 pm
doctor64
К сожалению, оба метода мне не подходят - у моего ардуино нет веб-интерфейса и уже практически нет места во флеше чтобы его добавить. только простые команды по serial/socket

Re: Вопрос новичка по чтению сенсоров

Добавлено: Вт янв 08, 2013 1:17 pm
sergejey
Если arduino подключен напрямую к компьютеру, то можно без веб-интерфейса и ethernet-шилда передавать данные в систему напрямую с помощью программы ArduinoGW: http://smartliving.ru/Main/ArduinoDirect

Просто Arduino должна сообщать о том, что изменилась температура строчкой такого плана:
GET /objects/?object=sensorZal&op=m&m=tempChanged&t=25.2
Программа ArduinoGW считает эту строчку и перешлёт запрос на MajorDoMo

Re: Вопрос новичка по чтению сенсоров

Добавлено: Вт янв 08, 2013 2:52 pm
doctor64
Спасибо, но не подходит, я уже думал об этом.
Во первых, формат обмена с ардуино уже существует, используется в моих существующих программах и переделывать его некуда - там байт 40 свободных осталось во внутреннем флеше.
Во вторых - мне нужен поллинг, а не event-driving - собственно управлением исполнительными устройствами занимается ардуино, а не центральный сервер - так, с моей точки зрения, надежнее в плане отказов. Отказ управления нагревателем в аквариуме будет иметь весьма печальные последствия.

А можно как-то по таймеру периодически вызывать код? Мне, собственно, нужно запихнуть несколько простых команд в ком порт или tcp socket, прочитать ответ и распарсить, и обновить переменные в объектах.

Re: Вопрос новичка по чтению сенсоров

Добавлено: Вт янв 08, 2013 3:21 pm
sergejey
По таймеру можно вызывать код через правку метода таймера onNewMinute, там можно добавить свой runScript, а в сам скрипт уже встроить чтение сокета и сохранение данных. Как-то так :)

Re: Вопрос новичка по чтению сенсоров

Добавлено: Вт янв 08, 2013 3:57 pm
doctor64
(грустно) мне бы примерчик, я php не знаю. Я вообще эмбеддщик

Re: Вопрос новичка по чтению сенсоров

Добавлено: Вт янв 08, 2013 5:11 pm
sergejey
Попробуем )

Пример чтения данных из tcp сокета (взято из работы с одним из устройств, которое только tcp-сокеты и понимает):

Код: Выделить всё

   $host='192.168.0.1'; //хост
   $port='2323'; // порт

   $ar='';
   $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
   if ($socket === false) {
     echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n";
     return 0;
   }
   $result = socket_connect($socket, $host, $port);
   if ($result === false) {
     echo "socket_connect( $socket , $host , $port) failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
     return 0;
   }
    $in=$command;
    socket_write($socket, $in, strlen($in));
    $res='';
    $res=socket_read($socket, 2048, PHP_BINARY_READ);
    if ($res) {
     $total=strlen($res);
     for($i=0;$i<$total;$i++) {
      $ar[]=ord($res[$i]);
     }
    } else {
     $ar=0;
    }
   socket_close($socket);

   if ($ar) {
    //если что-то прочитали, то записываем это что-то в переменную
    setGlobal('MyObject.MyProperty',$ar);
   }