В первой части рассмотрен вариант построения web-клиента на платформе Arduino. В итоге, устройство формирует GET запрос к сайту с параметрами, в которых передается текущее состояние системы. В этой части рассмотрим php-файлы, обрабатывающие этот запрос и обеспечивающие взаимодействие с «клиентом-человеком» (а заодно уж и ведение некоей базы данных о состоянии системы в различные периоды времени).
Итак: наше устройство формирует GET запросы к указанному в тексте скетча сайту, странице avr.php. В запросе передаются три переменные с значениями состояния выводов 7 (ниже обозначено X) и 9 (Y) arduino и температуры с датчика (Z):
«GET /avr.php?in1=X&out1=Y&temp1=Z»
Файл avr.php представляет собой небольшую программку:
<?php $TheFile = "data.txt"; //имя файла с базой данных $WhoWrite = "dev"; //запись инициируется устройством $Date = date("Y-m-d H:i:s"); //считываем дату и время с сервера $Open = fopen ($TheFile, "r"); //открываем файл для чтения if ($Open) { $Data = file ($TheFile); //читаем данные из файла if (count($Data) > 0) { for ($n = 0; $n < count($Data); $n++) { $GetLine = explode("\t", $Data[$n]); } fclose ($Open); //находим последнюю запись "от пользователя" $IsFind = FALSE; for ($n = 0; $n < count($Data); $n++) { $m = count($Data) - $n - 1; $GetLine = explode("\t", $Data[$m]); if ($GetLine[1] == "hum") { $IsFind = TRUE; break; } } if ($IsFind) { //отсылаем данные о состоянии выхода (out), установенного на сайте print ("$Date\t$GetLine[0]\tout1=$GetLine[3]<BR>\n"); //передаем состояние вых линии } else {print ("$Date\tData from human is not in $TheFile!<BR>\n"); } } else {print ("$Date\tNo data in $TheFile!<BR>\n");} // данных в файле нет } else { print ("$Date\Unable to read from $TheFile!<BR>\n"); } //проверим наличие требуемых параметров in1, out1, temp1 в запросе GET if (isset($_GET["in1"]) & isset($_GET["out1"]) & isset($_GET["temp1"])) { //если праметры есть, то $in1 = $_GET["in1"]; $out1 = $_GET["out1"]; $temp1 = $_GET["temp1"]; //проверим не совпадают ли новые данные с прежними, полученными от устройства $IsWrite = TRUE; //изначально считаем: надо писать! if (count($Data) > 0) { //если файл пуст - пишем $IsFind = FALSE; for ($n = 0; $n < count($Data); $n++) { //ищем предыдущую запись от устройства $m = count($Data) - $n - 1; $GetLine = explode("\t", $Data[$m]); if ($GetLine[1] = "dev") {$IsFind = TRUE; //нашли! break; } } if ($IsFind) { //сверим старые и новые данные $temp_new = round($temp1); //температура округленная новая $temp_old = round($GetLine[4]); //температура округленная старая if (($GetLine[2] == $in1) & ($GetLine[3] == $out1) & ($temp_new == $temp_old)) { $IsWrite = FALSE; } } } if ($IsWrite) { //открываем файл для записи в него $Open = fopen ($TheFile, "a"); //добавляем новую запись (если получится) if ($Open) { fwrite ($Open, "$Date\t$WhoWrite\t$in1\t$out1\t$temp1\n"); fclose ($Open); //ОК - запись прошла print ("$Date\tOK. Data write to $TheFile!<BR>\n"); } else { //ошибка - не открылся файл на запись print ("$Date\tUnable to write to $TheFile!<BR>\n"); } } else { print ("$Date\tData is equal. Not to write to $TheFile!<BR>\n");} } else {//если нет параметров - отсылаем прошлые данные print ("$Date\tData in GET is not found!<BR>\n"); } //ошибка - данные в запросе не найдены ?>
По тексту масса комментариев, так что — разобраться можно. Вкратце, при работе скрипта происходит следующее:
— открывается файл базы данных «data.txt», в котором сохраняются все поступающие с клиента данные;
— в файле находим последнюю запись, которая сделана с сайта (т.е. не по запросу с ардуино): признак такой записи — «hum» во второй колонке («GetLine[1]»);
— данные о состоянии вывода pin 9 (колонка 4 — «GetLine[3]») отсылаются в ответе на запрос в переменной out1;
— если в запросе были приняты данные, они сверяются с последней записью из базы данных и, при отличии от них, записываются в базу.
Файл form.php — также небольшая программка. Он предназначен для просмотра данных из базы и записи изменений в нее. Скрипт отрабатывает следующие функции:
— отображение последних десяти записей из базы данных;
— запись в базу данных строки с состоянием pin 9 (колонка 3), которое бы мы хотели видеть на плате Arduino;
— форма для ввода данных о состоянии выхода.
Выполняемая функция скрипта определяется наличием переменных в строке запуска файла:
— out=0/1 — функция записи в базу;
— psw=123 — включение режима ввода данных;
— без параметров, скрипт просто отображает данные из базы.

Если обращаться к странице form.php web-сервера без параметров, то картинка будет как слева. Здесь можно просмотреть последние записи из базы данных.
Если обращаться к странице form.php web-сервера с параметром psw=123 (123 — это «как бы» пароль), то картинка будет как в центре. Здесь можно просмотреть последние записи из базы данных и управлять цифровой линией: выставить нужное состояние и нажать кнопку «Send». По нажатию кнопки «Cut» программа перезапускается с параметром cut=Cut. При таком запуске файл data.txt сокращается до 400 байт — остаются последние записи из файла. Таким образом можно сократить размер файла.
Если обращаться к странице form.php web-сервера с параметром out=0|1, то картинка будет как справа. Такой запрос происходит по нажатию кнопки «Send» в предыдущем экране. Здесь можно просмотреть последние записи из базы данных и увидеть сверху результат нами сформированной записи.
Файл data.txt — собственно база данных в текстовом формате. Каждая запись — это строка с пятью значениями: дата/время записи, признак «кем сделана запись» (dev/hum), pin 7, pin 9, температура. При создании такого файла на сервере обязательно надо дать права на запись в файл всем клиентам (0666 в свойствах файла).
PS (2015) Конечно, хостинг, где размещаются описанные выше файлы, должен обеспечивать работу PHP. Я «тренировался» на бесплатном hostinger.ru — до событий на Украине он работал с бесплатными российскими аккаунтами «вполне себе прилично», но… В-общем, латыши сейчас почти прикрыли халяву — дольше месяца бесплатно продержаться скорей всего не получится.