4 — Умный дом на Ардуино. Глава II — Передача и чтение данных. Часть 3 — php — windows 9

Для передачи данных на Ардуино и чтения данных с него будем использовать библиотеку php_serial.class.php.

Данная библиотека написана для Linux Поэтому, мы будем использовать виртуальную машину VirtualBOX с установленной на нее OpenWRT

Далее рассмотрим:

  • Файлы, необходимые для общения с Ардуиной через (, , WinSCP, php_.class.php)
  • Создание виртуальной машины в VirtualBOX
  • Настройка OpenWRT(php, http, dhcp, serial)
  • Пример обмена данных с Ардуиной при помощи php

Загружаем необходимые файлы:

Создание виртуальной машины в VirtualBOX

Запускаем VirtualBOX, жмем создать и вводим предварительные настройки

Скриншот 2014-12-07 09.47.05.png
  • Тип ОС — Linux
  • Версия — 2.6/3.x(32 bit)
  • Объем памяти — не менее 50мб
  • Жесткий диск — Выбираем скачанный файл vdi с образом OpenWRT

После предварительной настройки жмем кнопку «создать«.
Прежде чем запускать машину необходимо произвести дополнительную настройку нажав на кнопку «настройки«.
В настройках выбираем «Сеть«, «Включаем сетевой адаптер«, тип подключения «Сетевой Мост«.

Скриншот 2014-12-07 09.48.26.png

В USB добавляем нашу Ардуину.

Скриншот 2014-12-07 09.48.52.png

Запускаем машину.

Настройка OpenWRT

Последовательно загрузим и настроим следующие компоненты

Для начала необходимо задать пароль для root. Для этого в консоли пишем:

1
psswd
psswd

жмем Enter, и вводим дважды новый пароль.

Настройка TCP/IP

Для доступа к OpenWRT через сеть, а также для установки на нее необходимых компонентов, необходимо сконфигурировать сетевые настройки.
После загрузки OpenWRT нажимаем Enter для начала ввода команд в консоль. В консоли вводим

1
vi /etc/config/network
vi /etc/config/network

Находим нашу сетевую карту eth0.

Скриншот 2014-12-08 22.16.59.png

Внесем изменения в файл

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Copyright (C) 2006 OpenWrt.org
 
config interface loopback
option ifname lo
option proto static
option ipaddr 127.0.0.1
option netmask 255.0.0.0
 
config interface lan
option ifname eth0
option type bridge
option proto static
option ipaddr 192.168.1.100
option netmask 255.255.255.0
option gateway 192.168.1.1
option dns 192.168.1.1
# Copyright (C) 2006 OpenWrt.org

config interface loopback
option ifname lo
option proto static
option ipaddr 127.0.0.1
option netmask 255.0.0.0

config interface lan
option ifname eth0
option type bridge
option proto static
option ipaddr 192.168.1.100
option netmask 255.255.255.0
option gateway 192.168.1.1
option dns 192.168.1.1
Скриншот 2014-12-08 22.15.54.png

В нашей сети используется роутер с DHCP сервером и адресом 192.168.1.1

Для редактирования настроек нажимаем Insert, после внесения изменений нажимаем Esc. Для сохранения изменений пишем :wq и нажимаем Enter, для отмены изменений :q.
Теперь необходимо перезагрузить настройки нашей платы или перезапустить машину(практика показывает, что лучше перезагружать машину). Вводим в консоли

1
/etc/init.d/network restart
/etc/init.d/network restart
Скриншот 2014-12-07 13.20.08.png

Проверяем доступ к репозиторию OpenWRT

1
ping openwrt.org
ping openwrt.org
Скриншот 2014-12-07 15.17.20.png Если пинга нет или ошибка введенного адреса то перезапускаем машину и пробуем снова.
Если пинг есть, можем начинать устанавливать дополнительные компоненты.

Для быстрой установки и настройки компонентов воспользуемся программой WinSCP.
Запускаем программу, вводим IP адрес виртуальной машины, логин и пароль.

Скриншот 2014-12-08 17.57.59.png

Настройка HTTP

Запускаем консоль WinSCP — Ctrl+T

Скриншот 2014-12-08 18.01.34.png

Вводим в консоль и выполняем команды:

1
2
opkg update
opkg install lighttpd lighttpd-mod-cgi lighttpd-mod-access lighttpd-mod-redirect
opkg update
opkg install lighttpd lighttpd-mod-cgi lighttpd-mod-access lighttpd-mod-redirect
Скриншот 2014-12-08 18.06.29.png

Через файловый менеджер создаем папку /www_new/ в ней файл index.html с любым содержимым

Скриншот 2014-12-08 17.58.48.png Скриншот 2014-12-08 19.07.02.png

Редактируем файл /etc/lighttpd/lighttpd.conf

Скриншот 2014-12-08 18.10.03.png

Вносим следующие изменения:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## папка с файлами для нашего сервера, папку необходимо создать вручную
server.document-root = "/www_new/"
## bind to port (default: 80)порт нашего сервера
server.port = 81
## files to check for if .../ is requested
index-file.names = ( "index.html", "default.html", "index.htm", "default.htm", "index.php" )
#### CGI module
cgi.assign = ( ".pl" => "/usr/bin/perl", ".cgi" => "/usr/bin/perl", ".php" => "/usr/bin/php-cgi" )
 
server.modules = (
«mod_cgi»,
«mod_access»,
«mod_redirect»
)
## папка с файлами для нашего сервера, папку необходимо создать вручную
server.document-root = "/www_new/"
## bind to port (default: 80)порт нашего сервера
server.port = 81
## files to check for if .../ is requested
index-file.names = ( "index.html", "default.html", "index.htm", "default.htm", "index.php" )
#### CGI module
cgi.assign = ( ".pl" => "/usr/bin/perl", ".cgi" => "/usr/bin/perl", ".php" => "/usr/bin/php-cgi" )

server.modules = (
«mod_cgi»,
«mod_access»,
«mod_redirect»
)

Запускаем сервер

1
2
/etc/init.d/lighttpd enable
/etc/init.d/lighttpd start
/etc/init.d/lighttpd enable
/etc/init.d/lighttpd start

Проверяем сервер… вводим адрес в браузере «ip_виртуальной_машины:81«, должно появится содержание ранее созданного файла index.html

Настройка PHP

Переименуем ранее созданный файл index.html в index.php
Заменим его содержимое на

1
<!--?php echo 'Ардуино'; ?-->
<!--?php echo 'Ардуино'; ?-->

Установим дополнительные компоненты php через консоль

Скриншот 2014-12-08 19.36.38.png
1
2
opkg update
opkg install php5-cgi php5-mod-pdo php5-mod-sqlite php5-mod-gd php5-mod-session
opkg update
opkg install php5-cgi php5-mod-pdo php5-mod-sqlite php5-mod-gd php5-mod-session

И внесем изменения в файл /etc/php.ini

1
2
3
4
5
6
doc_root = "/www_new"
 
extension=gd.so
extension=pdo.so
extension=sqlite.so
extension=session.so
doc_root = "/www_new"

extension=gd.so
extension=pdo.so
extension=sqlite.so
extension=session.so

Редактируем файл /etc/lighttpd/lighttpd.conf
server.modules = (
«mod_cgi»,
«mod_access»,
«mod_redirect»
)

После внесенных изменений перезагружаем машину, ждем загрузки… вводим адрес в браузере «ip_виртуальной_машины:81«, должно появится «Ардуино»

Настройка USB

Посмотрим через консоль список устройств

1
ls /dev
ls /dev
Скриншот 2014-12-08 20.16.34.png

Ардуины нет!

Устанавливаем компоненты для работы с usb:

1
2
opkg update
opkg install kmod-usb2 kmod-usb-ohci kmod-usb-core kmod-usb-acm kmod-usb-serial-ftdi kmod-usb-serial-pl2303 kmod-usb-serial-cp210x coreutils-stty
opkg update
opkg install kmod-usb2 kmod-usb-ohci kmod-usb-core kmod-usb-acm kmod-usb-serial-ftdi kmod-usb-serial-pl2303 kmod-usb-serial-cp210x coreutils-stty

Обновляем список устройств и видим появилось ttyUSB0 — это и есть Ардуино

Скриншот 2014-12-08 22.21.21.png

Теперь зададим параметры данного устройства, которые будут устанавливаться при запуске виртуальной машины. Изменим файл /etc/rc.local

1
stty -F /dev/ttyUSB0 cs8 19200 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -hupcl
stty -F /dev/ttyUSB0 cs8 19200 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts -hupcl

Перезапускаем машину и переходим к соединению Ардуино через php

Пример Arduino php serial

Загрузим в корневую папку нашего сервера файл php_serial.class.php
Изменим содержимое файла index.php

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
<!--?php include "php_serial.class.php"; 
$serial = new phpSerial; 
$serial--->deviceSet("/dev/ttyUSB0");
$serial->confBaudRate(19200);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->deviceOpen();
$serial->sendMessage("1",0.1);
$read = $serial->readPort(4);
preg_match_all("/\S+/", $read, $matches);
$a=0;
foreach($matches[0] as $value)
{
$a=$a+1;
 
switch ($a)
{
case 1:
break;
case 2:
print 'Температура теплого пола кухни:'.$value.'
';
break;
case 3:
print 'Температура теплого пола ванной:'.$value.'
';
break;
}
}
 
$serial->deviceClose();
 
?>
<!--?php include "php_serial.class.php"; 
$serial = new phpSerial; 
$serial--->deviceSet("/dev/ttyUSB0");
$serial->confBaudRate(19200);
$serial->confParity("none");
$serial->confCharacterLength(8);
$serial->confStopBits(1);
$serial->deviceOpen();
$serial->sendMessage("1",0.1);
$read = $serial->readPort(4);
preg_match_all("/\S+/", $read, $matches);
$a=0;
foreach($matches[0] as $value)
{
$a=$a+1;

switch ($a)
{
case 1:
break;
case 2:
print 'Температура теплого пола кухни:'.$value.'
';
break;
case 3:
print 'Температура теплого пола ванной:'.$value.'
';
break;
}
}

$serial->deviceClose();

?>

мастер контроллера:

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
//Модифицированный скетч мастр-контроллера из статьи http://bigbarrel.ru/?p=1257
String
temp_kitchen_pol, //температура пола кухни
temp_bath_pol;//температура пола ванной
int pin_inter=9;//not 13,12,11,10 //посылаем сигнал прерывание на Slave контроллер
 
void setup() {
Serial.begin(19200);
pinMode(pin_inter, OUTPUT);
 
}
 
void loop() {
synch();//Опрос слейв контроллера
if (Serial.available())//Ожидаем опроса
{
int sr;
sr = Serial.read();
if (sr==0x01 || sr-'0'==0x01 || sr=='1')//команда для начала передачи
{
Serial.println("begin");//начало передачи, для отсеиания мусора в сериал
Serial.println(temp_kitchen_pol);//отпраляем температуру теплого пола кухни
Serial.println(temp_bath_pol); //отправляем температуру теплого пола ванной
}
}
}
 
void synch(){
if (my_timer(10000,0))
{
send_serial(0xf1);//опрос первого контроллера
seria_input();
 
}
}
 
void seria_input(){//прием сообщения от Слейв контроллера
int val;
if (Serial.available())
{
val=Serial.read();
if (val==0xf1)//1
{
temp_kitchen_pol=get_temp_float_serial();// получаем температуру
temp_bath_pol=get_temp_float_serial();// получаем температуру
}
}
}
 
void send_serial(int A)//отправляем сообщение Слейв контроллерам
{
digitalWrite(pin_inter, HIGH);
delay(20);
Serial.write(A);
delay(100);//ожидаем ответ от контроллера
digitalWrite(pin_inter, LOW);
}
//Модифицированный скетч мастр-контроллера из статьи http://bigbarrel.ru/?p=1257
String
temp_kitchen_pol, //температура пола кухни
temp_bath_pol;//температура пола ванной
int pin_inter=9;//not 13,12,11,10 //посылаем сигнал прерывание на Slave контроллер

void setup() {
Serial.begin(19200);
pinMode(pin_inter, OUTPUT);

}

void loop() {
synch();//Опрос слейв контроллера
if (Serial.available())//Ожидаем опроса
{
int sr;
sr = Serial.read();
if (sr==0x01 || sr-'0'==0x01 || sr=='1')//команда для начала передачи
{
Serial.println("begin");//начало передачи, для отсеиания мусора в сериал
Serial.println(temp_kitchen_pol);//отпраляем температуру теплого пола кухни
Serial.println(temp_bath_pol); //отправляем температуру теплого пола ванной
}
}
}

void synch(){
if (my_timer(10000,0))
{
send_serial(0xf1);//опрос первого контроллера
seria_input();

}
}

void seria_input(){//прием сообщения от Слейв контроллера
int val;
if (Serial.available())
{
val=Serial.read();
if (val==0xf1)//1
{
temp_kitchen_pol=get_temp_float_serial();// получаем температуру
temp_bath_pol=get_temp_float_serial();// получаем температуру
}
}
}

void send_serial(int A)//отправляем сообщение Слейв контроллерам
{
digitalWrite(pin_inter, HIGH);
delay(20);
Serial.write(A);
delay(100);//ожидаем ответ от контроллера
digitalWrite(pin_inter, LOW);
}

После обновления страницы получаем

Скриншот 2014-12-08 20.36.28.png

9 комментс для “4 — Умный дом на Ардуино. Глава II — Передача и чтение данных. Часть 3 — php — windows

  1. Ответить Олег Мар 19, 2015 20:16

    Почему то выходит ошибка 403 — Forbidden

  2. Ответить Cерега Апр 8, 2015 20:36

    Доброго времени суток. Подскажите пожалуйста, ну как заставить получать данные из порта дуины, для винды написал на делфи читалку, а здесь не получается. Операционка Убунта 14.04 Обновляем список устройств и видим появилось ttyUSB0 — вижу. Пробую отправлять в порт примитивно 0-1.В ответ тишина. Не совсем понял что делать с этой строкой stty -F /dev/ttyUSB0 cs8 19200 ignbrk -brkint -icrnl -imaxbel -opost -….. Помогите разобраться пожалуйста.

  3. Ответить АЛЕКСАНДР Май 19, 2015 09:52

    выходит ошибка 403 — Forbidden в браузере при запросе index.php

  4. Ответить Геннадий Янв 18, 2017 16:59

    Добрый день!
    Подскажите, на этапе (Обновляем список устройств и видим появилось ttyUSB0) — устройство не появилось. Компоненты для работы с usb устанавливаются без ошибок, виртуальную машину перегружал.Где копать? И что означает строка (kmod-usb-serial-cp210x). Драйвер Ардуино в системе ср340, может с этим связано.
    Пожалуйста подскажите.
    С уважением!

    • Ответить Slava Янв 20, 2017 09:43

      kmod-usb-serial-cp210x — драйвера для работы с микросхемой серии cp210x

      Если у вас ср340, возможно в этом и проблема.

      К сожалению нет в наличии такой ардуины, проверить не могу.

      Когда в виртуальную машину добавляли USB какое там устройство?

Добавить комментарий