Страница 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);
}