Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Отправка данных с Arduino на WEB-сервер GET-запросом

Здравствуйте уважаемые пользователи сайта «паяльник», сегодня мне хотелось бы поделиться своим опытом проектирования и разработки устройства под управлением Arduino, основная задача которого сбор данных с датчиков и отправка их на полноценный WEB-сервер с PHP/MySQL.

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

Описание устройства

Вычислительным мозгом устройства является платформа Arduino UNO, для связи с сетью используется Ethernet Shield, помимо этого, я установил LCD KeyPad Shield для вывода информации о состоянии различных устройств и команд, также установил все возможные датчики и реле.

Полный список используемых компонентов:

  • Arduino UNO – мозг системы;
  • Ethernet Shield – связь с сетью;
  • LCD KeyPad Shield – дисплей для вывода информации;
  • DHT11 – датчик температуры и влажности;
  • Датчик движения;
  • Реле-модуль;
  • Пульт ДУ.

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

Клиентская часть на Arduino

Усвойте как незыблемую истину, что чудес в мире информационных технологий не бывает, и если устройство работает не так, как вы задумывали, значит, Вы где-то ошиблись.

Итак, давайте для начала разберемся, как вообще послать какой-либо запрос к Web-серверу. Если Вы думаете, что это слишком сложно, то Вы ошибаетесь. Человек так устроен, что просто не способен создавать что-то невообразимое, в чем он сам же не смог разобраться.

В нашем распоряжении имеется устройство на базе Arduino с которого необходимо отправить запрос на WEB-сервер. Инициатором обмена данными обычно выступает браузер, в нашем случае – Arduino. Web-сервер никому и никогда просто так ничего не пошлет, чтобы он что-нибудь отправил клиенту надо, чтобы клиент его об этом попросил. Простейший HTTP запрос может выглядеть, например, так:

GET http://www.php.net/ HTTP/1.0\r\n\r\n
GET - тип запроса, тип запроса может быть разным, например POST, HEAD, PUT, DELETE.
http://www.php.net/ - URI от которого мы хотим получить хоть какую-нибудь информацию.
HTTP/1.0 - тип и версия протокола, который мы будем использовать в процессе общения с сервером.
\r\n - конец строки, который необходимо повторить два раза.

В нашем случае запрос к серверу выглядит следующим образом:

GET /add.php?k=asREb25C&t=24.00&h=35.00 HTTP/1.1
Host: site.ru
Connection: close

Скетч программы представлен ниже:

#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"

//Константы
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес

EthernetClient client;

//Переменные
unsigned long int timeConn = millis();      // Частота отправки данных о t/h на сервер
float h;                                    // Значение температуры
float t;                                    // Значение влажности
char server[] = "site.ru";

/*--------------------------------------------------------------
 Необходимые настройки
 --------------------------------------------------------------*/
void setup()
{
  //Старт
  Serial.begin(9600);
  Ethernet.begin(mac);
  dht.begin();
}
/*--------------------------------------------------------------
 Основное тело программы
 --------------------------------------------------------------*/
void loop()
{
  h = dht.readHumidity();
  t = dht.readTemperature();
  if (millis() - timeConn > 2000) {
    sendData(t,h);
    timeConn = millis();
    Serial.println("CONNECT SERVER: Send temp/hum");
  }
}
/*--------------------------------------------------------------
 Функция отправляет данные о температуре и влажности на 
 WEB сервер.
 --------------------------------------------------------------*/
void sendData(float t, float h) {
  client.connect(server, 80);
  client.print( "GET /add.php?");
  client.print("k=");  // Специальный код, например asREb25C
  client.print("&");
  client.print("t=");
  client.print(t);
  client.print("&");
  client.print("h=");
  client.print(h);
  client.println(" HTTP/1.1");
  client.print( "Host: " );
  client.println(server);
  client.println( "Connection: close" );
  client.println();
  client.println();
  client.stop();
  client.flush();
}

Как было сказано выше, в своем устройстве я использовал также и другие датчики, в связи с чем скетч моего устройства выглядит следующим образом:

/*--------------------------------------------------------------
 Программа:    Arduino Home Server 
 Автор:       С.С. Гранкин, http://www.factoblog.ru
 --------------------------------------------------------------*/

#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
#include <LiquidCrystal.h>
#include <IRremote.h>


//Константы
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

LiquidCrystal lcd(8, 9, 4, 5, 6, 7 );

byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // Мак адрес

EthernetClient client;

//Переменные
long unsigned int lowIn;                  // Время, в которое был принят сигнал отсутствия движения(LOW)    
boolean lockLow = true;                   // Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
boolean takeLowTime;                      // Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
boolean PIR = false;                      // Вкл./Выкл. датчик движения
unsigned long int timeConn = millis();    // Частота отправки данных о t/h на сервер
unsigned long int sendSens = millis();    // Частота отправки данных о датчиках на сервер
int h;                                    // Значение температуры
int t;                                    // Значение влажности
int codeLCD = 0;                          // Код для LCDisplay()
boolean REBOOT = true;                    // Перезагрузка (не менять!)
IRrecv irrecv(19);                        // Пин, к которому подключен приемник
decode_results results;
char server[] = "site.ru";
byte load[8] = {
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111,
  0b11111
};
byte gradus[8] = {
  0b00110,
  0b01001,
  0b01001,
  0b00110,
  0b00000,
  0b00000,
  0b00000,
  0b00000
};

/*--------------------------------------------------------------
 Вводим необходимые настройки
 --------------------------------------------------------------*/
void setup()
{
  //Пины
  pinMode(3, OUTPUT);            // Подсветка LCD
  pinMode(14, OUTPUT);           // Реле-1
  pinMode(18, INPUT);            // Датчик движения

  //Значения
  digitalWrite(14, HIGH);         // Отключаем реле-1

  //Старт
  Serial.begin(9600);
  irrecv.enableIRIn();
  Ethernet.begin(mac);
  dht.begin();
  lcd.begin(16, 2);
  lcd.createChar(0,load);
  lcd.createChar(1,gradus);
  display("Calibrating PIR","sensor - 10 sec.");
  digitalWrite(3, HIGH);
  lcd.clear();
  for(int i = 0; i < 16; i++) {
    lcd.setCursor(0,0);
    lcd.print("Calibrating PIR");
    lcd.setCursor(i,2);
    lcd.write(byte(0));
    delay(1500);
  }
  digitalWrite(3, LOW);
  //Приветствие LCD
  display("Arduino Server","Status: is RUN");

}
/*--------------------------------------------------------------
 Основное тело программы
 --------------------------------------------------------------*/
void loop()
{
  h = dht.readHumidity();
  t = dht.readTemperature();
  motion(PIR);
  if (millis() - sendSens > 120000 || REBOOT==true) {
    sensor(PIR, REBOOT);
    sendSens = millis();
    display("CONNECT SERVER","Sending data");
  }
  if (millis() - timeConn > 14400000 || REBOOT == true) {
    sendData(t,h);
    timeConn = millis();
    REBOOT = false;
    display("CONNECT SERVER","Send temp/hum");
  }
  LCDispay(codeLCD);
  if (irrecv.decode(&results)) {
    switch (results.value) {
    case 16738455: // 1
      LCDispay(0);
      codeLCD = 0;
      break;

    case 16750695: // 2
      LCDispay(1);
      codeLCD = 1;
      break;

    case 16712445: //ОК
      digitalWrite(3, HIGH);
      delay(1500);
      digitalWrite(3, LOW);
      break;

    case 16728765: //*
      PIR = true;
      display("MOTION SENSOR","Status: ON");
      break;

    case 16732845: //#
      PIR = false;
      lockLow = true; 
      digitalWrite(14, HIGH);
      display("MOTION SENSOR","Status: OFF");
      break;
    }
    irrecv.resume(); 
  }

}
/*--------------------------------------------------------------
 Функция вывода информации на LCD KeyPad Shield
 Принемает параметр id.
 --------------------------------------------------------------*/
void LCDispay(int id) {
  switch(id) {
  case 1:
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Rele-1:OFF Rele-2:ON");
    lcd.setCursor(0,2);
    lcd.print("Light:1950");
    break;

  default:
    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Temp:");
    lcd.setCursor(5,0);
    lcd.print(t);
    lcd.write(byte(1));
    lcd.setCursor(9,0);
    lcd.print("Hum:");
    lcd.setCursor(13,0);
    lcd.print(h);
    lcd.print("%");
    lcd.setCursor(0,2);
    lcd.print("Motion:");
    if (PIR == true) {
      lcd.print("ON");
      lcd.setCursor(7,2);
    } 
    else {
      lcd.print("OFF");
      lcd.setCursor(8,2);
    }
    break;
  }
}
/*--------------------------------------------------------------
 Функция отправляет данные о сотоянии датчиков, реле и тд.
 на WEB сервер.
 --------------------------------------------------------------*/
void sensor(int p1, int rb) {
  client.connect(server, 80);
  client.print( "GET /add.php?");
  client.print("k="); // Специальный код, например asREb25C
  client.print("&");
  client.print("p1=");
  client.print(p1);
  client.print("&");
  client.print("rb=");
  client.print(rb);
  client.print("&");
  client.print("ram=");
  client.print(freeRam());
  client.println(" HTTP/1.1");
  client.print( "Host: " );
  client.println(server);
  client.println( "Connection: close" );
  client.println();
  client.println();
  client.stop();
  client.flush();
}
/*--------------------------------------------------------------
 Функция датчика движения (PIR-sensor)
 --------------------------------------------------------------*/
void motion(int PIR) {

  if (PIR==true) {
    if(digitalRead(18) == HIGH) {
      if(lockLow) {
        lockLow = false;     
        digitalWrite(14, LOW);
        display("MOTION DETECTED","RELE-1 is ON");
        Serial.println(lowIn);
        Serial.println("MOTION DETECTED RELE-1 is ON");
      }        
      takeLowTime = true;
    } 
    else {      
      if(takeLowTime) {
        lowIn = millis();
        takeLowTime = false;
      }
      if(!lockLow && millis() - lowIn > 5000) { 
        lockLow = true;               
        digitalWrite(14, HIGH);
        display("MOTION FINISH","RELE-1 is OFF");
        Serial.println(lowIn);
        Serial.println("MOTION FINISH RELE-1 is OFF");
      }
    }
  }
}
/*--------------------------------------------------------------
 Функция отправляет данные о температуре и влажности на 
 WEB сервер.
 --------------------------------------------------------------*/
void sendData(float t, float h) {
  client.connect(server, 80);
  client.print( "GET /add.php?");
  client.print("k="); // Специальный код, например asREb25C
  client.print("&");
  client.print("t=");
  client.print(t);
  client.print("&");
  client.print("h=");
  client.print(h);
  client.println(" HTTP/1.1");
  client.print( "Host: " );
  client.println(server);
  client.println( "Connection: close" );
  client.println();
  client.println();
  client.stop();
  client.flush();
}
/*--------------------------------------------------------------
 Функция вывода информации на LCD KeyPad Shild
 Принемает параметр title1 - первая строка (max 16 символов),
 title2 - вторая сторока.
 --------------------------------------------------------------*/
void display(String title1, String title2) {
  lcd.clear();
  lcd.setCursor(0,0);
  digitalWrite(3, HIGH);
  lcd.print(title1);
  lcd.setCursor(0,2);
  lcd.print(title2);
  delay(1600);
  digitalWrite(3, LOW);
}
/*--------------------------------------------------------------
 Функция выводит количество свободных байт RAM
 --------------------------------------------------------------*/
int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

Серверная часть

Наше устройство на базе Arduino будет посылать на сервер различные данные с разной периодичностью, сделано это для того, чтобы просто не засорять базу данных MySQL излишней информацией. Для примера установим, что данные о состоянии датчиков (датчиков движения, реле и тд) буду отправляться с периодичностью в 2 мин., а данные о температуре и влажности каждые 4 часа. 

Арендовать полноценный Web сервер мы, конечно, не будем, потому что это дорого, да и попросту неразумно, обойдемся услугой хостинга. Хостинг – это не компьютер и не программа, а услуга по предоставлению вебмастеру для его сайта места на своих серверах. Требования к хостингу минимальны: php не ниже 5.3, MySQL с субд.

Код серверной части прикреплен к данной статье. Для удобства он разбит на несколько файлов:

  1. /system/core.php – «ядро» нашего сервера, здесь прописываются данные для подключения к базе данных.
  2. /system/functions.php – здесь содержатся различные пользовательские функции, которые нам понадобятся при работе.
  3. /style/ - стили CSS.
  4. .htaccess – Содержит настройки для сервера. По умолчанию выставлен часовой пояс +3 (Москва).
  5. _sever.sql – дамп БД. Данный файл необходимо импортировать в базу данных.
  6. Index.php – наш главный файл (страница), который будет выводить информацию о состоянии датчиков.
  7. Add.php – данный файл будет принимать и обрабатывать данные от Arduino.

Для того, чтобы только наше устройство могло отправлять данные на сервер, мы в GET-запросе будем передавать специальный код (ключ), как бы подтверждая тот факт, что данные действительно передает Arduino.

Заключение

В статье я не коснулся вопроса, как обрабатывать ответ от сервера (если мы хотим управлять устройством через интернет), сделал я так потому, что наша серверная часть никак не защищена, т.е. любой желающий может зайти на сайт и посмотреть информацию о датчиках движения и т.д. В связи с этим, необходимо организовывать полноценную аунтификацию на PHP и MySQL, а это уже никак не подходит под тематику данного ресурса.

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

P.S. Живой пример: http://home.telwik.ru/

Прикрепленные файлы:

Теги:

Опубликована: Изменена: 21.08.2016 0 5
Я собрал 1 4
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 4 чел.

Комментарии (65) | Я собрал (0) | Подписаться

+2
aykovalev #
Классная идея, реализуемая. Заинтересовало не то слово. Автору стоит продолжать работать в этом направлении, думаю других разработчиков связь с всемирной паутиной интересует не меньше!
Ответить
0

[Автор]
Grankin #
Я рад, что моя статья вам была интересна
Ответить
0
atmel007 #
Вот реально хожу 2 недели собираюсь такую инфу искать а тут вы, как бальзам на душу.
Ответить
0

[Автор]
Grankin #
Это была более практическая статья, а скоро будет чисто теоретическая для новичков, без привязки к языкам программирования и аппаратуре.
Ответить
0
Пугачев Роман Андреевич #
Добрый вечер!
Я понимаю, что, возможно, позно, но возникла проблема.
Прикрепленный файл: Безымянный.png
Ответить
0
Радиш Денис #
Вы как-то решили проблему?
Ответить
0
Aleksey #
Что Я сделал не так?
На картинки изображение как выглядит страничка
Прикрепленный файл: Безымянный.jpg
Ответить
0

[Автор]
Grankin #
Можно ссылку на страницу?
Ответить
0

[Автор]
Grankin #
В файле head.php подправьте на соответствующую строку на link rel="stylesheet" href="./style/style.css"
Ответить
0
Александр #
Хотелось бы повторить устройство и поэкспериментировать. Возможно ли использование платы атмега2560? Что-то надо менять в программе?
Ответить
0

[Автор]
Grankin #
ard.mega2560 использовать можно и нужно. Ничего менять в коде не надо. Хотя возможности ардино мега раскрываются в полной мере если использовать плату в качестве сервера. В данной схеме большой разницы нет: используете ли вы уно или мега.
Ответить
0
Александр #
На сколько я понимаю, чтобы использовать ее в качестве сервера необходим выделенный IP. Использовал teleduino работает. Реализация (как я понял) аналогична Вашей, только много пользователей, много не нужного мне, отсутствие возможности править обработку запросов сервером (php скрипты).
Ответить
0
Игорь #
Если соберетесь расширять программу по фунционалу, то очень скоро почувствуете необходимость хранить строковые константы во флэш пямяти микроконтроллера. Ее, в отлличии от оперативки, намного больше. Я наступил на эти грабли, когда реализовывал вэб сервер на ардуинке.
Ответить
0

[Автор]
Grankin #
Полностью с вами согласен
Ответить
0
Роман #
Добрый день, в меня проблема с графиком вот пишет
на месте графика ] }, yAxis: { title: { text: 't °C/ h %' } }, plotOptions: { line: { dataLabels: { enabled: true }, enableMouseTracking: false } }, series: [{ name: 'Температура', data: [
Warning: Invalid argument supplied for foreach() in A:\home\kontroller.ua\www\index.php on line 307
] }, { name: 'Влажность', data: [
Warning: Invalid argument supplied for foreach() in A:\home\kontroller.ua\www\index.php on line 314
] }] }); });
Ответить
0

[Автор]
Grankin #
Так трудно сказать в чем дело. Что содержится в массиве $temp? Т.е. в каком виде там данные, посмотрите через функцию var_dump()
Ответить
+1
Михаил #
У меня работает ровно 6 дней 20 часов и уходит в аут, не пойму от чего. Как у вас на счет этого?
Ответить
0

[Автор]
Grankin #
На ардуино уно я подобного не наблюдал, хотя больше недели у меня устройство не работало (перезаписывал код). На ардуино мега устройство "падает" через 2-3 часа. Довольно частое явление. Причину такого поведения я так и не выяснил, за бугром предлагают различные пути решения этой проблемы (через прерывания), однако причину никто не знает.
Ответить
0
Михаил #
У меня на меге, но я разобрался точно, падает мега, работает стабильно, До указанного времени. Я думаю может из-за таймера. Хотя пишут около 50 дней. Есть ли разница сколько значений?
Вот скорее всего висяк:
unsigned long int timeConn = millis();
unsigned long int sendSens = millis();
Переменная int и long не могут быть вместе и по наименьшему unsigned int получается.
unsigned int: 0...65535 (= 216−1), что ближе похоже к правде
Ответить
0

[Автор]
Grankin #
Насчет переменных я с вами не согласен, так как я эти варианты в свое время с книг брал. На мой взгляд причина в чипе wiznet. Возможно, что буфер данных на чипе переполняется, и чип уходит в аут, но при этом, он откликается на пинг, а также принимает и обрабатывает ряд других пакетов. В моей локально сети ходит много всякого служебного мусора, в связи с этим uptime сервера на ардуино 2-3 часа. Однако на ардуино уно uptime 99.99%, короче надо думать... опять же через прерывание по таймеру все прекрасно работает в штатном режиме.
Ответить
0
armlive #
С переменными разобрался, это абсолютно одно и тоже:

unsigned long
unsigned long int
Как раз таки чип wiznet работает исправно)
У меня не только отправка данных, но и прием с сервера команд каждую секунду. Прием данных с другого контроллера по радио и т.п. Работать перестает все.
Вчера заменил на уно, не изменяя код... посмотрим, ну и для сравнения стабильности запрограммировал ESP-12e, на тот же сервер отсылает millis().
Кстати, если

client.print( "GET /add.php?");
client.print("k="); /
client.print("&");
client.print("t=");
.......
Заменить на такой вид:

client.print(String("GET ") + "add.php?" + "&&K=" + "&&T=" + t +.......
" HTTP/1.1\r\n" +
"Host: " + server+ "\r\n" +
"Connection: close\r\n\r\n");
То код выполняется быстрее
И не понял про uptime 99.99%, короче надо думать?????
Ответить
0

[Автор]
Grankin #
"про uptime" я имел в виду, что на уно все работает стабильно. Будет интересно увидеть результаты вашего тестирования
Ответить
0
armlive #
Проблема все же видимо в дешевой китайской меге. На уно и esp12 все отработало без сбоев. Заказал еще парочку мега, другой производитель, жду.
Ответить
0
Сергей #
У меня открывается пустая страница в какую сторону копать ?
Ответить
0

[Автор]
Grankin #
Ошибка в php скрипте, создайте файл .htaccess (название пустое, расширение htaccess) и скопируйте в него

php_flag display_errors on
DirectoryIndex index.php
Options -Indexes
AddDefaultCharset utf-8

После чего загрузите в папку, в которой данный скрипт. Перейдите в index.php, если есть ошибка, то она должна отобразиться.

Скорей всего пути неправильно прописаны

require_once 'system/core.php';
require_once 'system/functions.php';

Попробуйте абсолютные пути прописать.
Ответить
0
Sergey #
Не могли бы Вы переделать Ваш скетч на использование FiWi модуля ESP8266. Заранее благодарен.
Ответить
0

[Автор]
Grankin #
К сожалению данного модуля не имею
Ответить
0
Sashok #
Есть проблема, при переходе на версию PHP7, неработает get запрос. В чём может быть проблема.
Так как на PHP5.4 всё работает.
Ответить
0

[Автор]
Grankin #
Даже не знаю, с новыми версиями php не работал. Даже не знал что 7 версия вышла
Ответить
0
Sashok #
Получилось, всё заработало!
Только класс mysql больше неподдерживается в PHP7. Вместо неё теперь mysqli
Ответить
0
Marat #
Напишите поподробнее, тоже не хочет выполняться запрос
Ответить
0
Igor #
Если ваш сервер использует php 7 или выше, то весь синтаксис с обращением к базе денных надо менять.

к примеру:
в настройках (коре.пхп)
есть подключение к базе вида: mysql_connect
mysql_connect(DBHOST, DBUSER, DBPASS)
в пхп 5 оно работает, в 7 пхп уже нужно добавить "i" и постоянный коннект к базе "mysql_pconnect" не используется, надо в 7рке писать так: mysqli_connect('p:'. DBHOST, DBUSER, DBPASS, DBNAME)
- заметьте добавляется "DBNAME".

Я весь день менял менял все переписывал, вое как веб морда заработала, но гет запросы ардуина не может доставить до базы данных и записать в неё, причем ЛОГИ негде не увидишь... х..рен его знает почему.
Мне кажется автор конечно молодец, но синтаксис написания программы у него не универсальный, по этому очень трудно его адаптировать к универсальному синтаксису написания процедур для 7-рки php.

Весь день я убил, ничего не получилось, похоже для php7 надо с нуля писать и код для ардуино и сам скрипт на сайт.
Ответить
0
Игорь #
в файле add.php
есть строчка:
$total = mysql_result(mysql_query("SELECT count(*) FROM `stat`"),0);

Данное расширение (mysql_result) устарело, начиная с версии PHP 5.5.0, и удалено в PHP 7.0.0.

меняем на
$total = mysqli_data_seek(mysqli_query($connect,"SELECT count(*) FROM `stat`"),0);
Ответить
0
Игорь #
Пробовал, работает через раз, библиотеки wifi передатчика как то коряво работает, они подключают ваше устройство к wifi точке через которую вы идете в интернет, но wifi модуль то отправляет то не отправляет данные, не поймешь.... Я с бубном танцевал танцевал, потом плюнул. А вот с "Изернет шильдом" описанном выше все ок, с теме же основными настройками.
Ответить
0
Игорь #
Спасибо Вам огромное за труды. У меня только два вопроса...
График рисуется, данные в базу льются. но график заполнил ячейки и дальше не обновляется , то есть весит со старыми данными... Подскажите куда копать ? Когда удаляю данные из базы график с новым временем рисует график

второй вопрос
Notice: Undefined variable: t in /srv/www/arduino/htdocs/index.php on line 303
ссылаеться на эту строчку ... но я не нашел $t
foot($t);
Ответить
0

[Автор]
Grankin #
По поводу графика, там немного все коряво реализовано. насколько я помню график выводит последние 15 значений, 16 значение не отображается, однако как только значений будет 17, все будет работать нормально.
По поводу переменной: удалите просто $t -> foot();
Просто много где скрипт использовался, поэтому некоторые вещи здесь не нужны. а вообще, если скрипт в паблике, то отключите все нотисы и воринги в php, это не безопасно.
Ответить
0
Sherzod #
Здравствуйте!
У меня GET запрос не поступает к серверу, то есть данные не добавляются в базу. Если в браузере набрать:
http://localhost/add.php?t=25.10&h=53.30 - то данные добавляются в базу, то есть файл add.php работает как надо.

Сервер как вы поняли локальный. Может быть езернет шилд не умеет отправлять GET запросы локальному серверу, а работает только с сервером с которым можно соединится только через интернет? Если так, то можно ли как то обойти или может есть решение чтобы ардуино с езернет шилдом работал с локальным сервером?
Ответить
0

[Автор]
Grankin #
Ардуино может работать с локальными серверами (у меня rasp pi работает), в вашем случае немного будет сложнее. Если вы используете Денвер на видовс, то то посмотрите в интернете, как привязать ip адрес к денверу. И в ардуино прописать уже не localhost, а ip адрес. Если не получится, напишите ещё раз коммент, а распишу подробно все. С телефона не удобно
Ответить
0
Sherzod #
Заработал!
У меня Debian 8.2. Создал новый хост, привязал IP 192.168.1.10 и сервером указал этот же адрес. Соответственно add.php перенес в новый хост и все заработало! Спасибо!
Пишите новые такие же интересные статьи!
Ответить
0
talibanich #
localhost также обычно доступен по адресу 127.0.0.1 и ничего привязывать не надо.
Также как вариант еще можно жестко в файле hosts сопоставить имя и IP адрес
Ответить
0
Sherzod #
Вместо localhost'а указывал 127.0.0.1, но запрос не принимался. Не могу предположить даже с чем это связано. Конфиги локалхоста стоят по умолчанию и вроде как отличий от нового хоста нет. Если разберусь, отпишусь.

Да, в файле hosts привязал 192.168.1.10 к новому хосту типа mysite.ru. После этого заработал.
Ответить
0

[Автор]
Grankin #
Вики: "localhost так называемый, «локальный хост», по смыслу — этот компьютер". Проще говоря, это маленькая закрытая "сеть" внутри устройства (пк). В нашем случая ардуино взаимодействует по локальной сети с компьютером, и пренебрегать правилами протокола ip нельзя. Если так интересно, можно почитать книги по курсу cisco.
Ответить
0
Algri #
Скажите пожалуйста, данные по dht11 пишутся в БД и отображаются на сервере, а вот датчик движения нет, я правильно понимаю по скетчу это DI(18), ну я туда контакт и посадил - нет данных в БД. Что не так.
Ответить
0

[Автор]
Grankin #
По умолчанию датчик движения выключен boolean PIR = false;
Поменяйте значение false на true и проверьте результат. а вообще, нужно в таких случаях выкладывать свой скетч для проверки
Ответить
0
Algri #
Спасибо вам огромное за разработку. Датчик движения1 установился в ON(в базе тоже 1) - boolean PIR = false(установил на true). Скетч ваш "arduino". Скажите пожалуйста единственное осталось реализовать это DO "как обрабатывать ответ от сервера". Что можно придумать с добавлением кнопки на сервере и выводом на DO Arduino. Спасибо.
Ответить
+1

[Автор]
Grankin #
В этой статье описаны все процессы, методы и способы управления ардуино через интернет
Ответить
0
Александр #
Сделал виртуальный сервер на Denver.
С ардуино никак не получается передать данные. В браузере все получается, через командную строку. ПОМОГИТЕ! В Чем причина? Файлы прилагаю.
Прикрепленный файл: Smart.rar
Ответить
0

[Автор]
Grankin #
Во-первых, это не мой скетч, во-вторых, не работает потому что "Проекты, заведенные в Денвере, по умолчанию не доступны из локальной сети. Это достигается благодаря тому, что все виртуальные хосты имеют IP-адрес 127.0.0.1, всегда обозначающий "текущая локальная машина". Почитайте на сайте денвера, как присвоить реальный ip адрес. и да, в скетче у вас прописан домен, а нужен IP адрес, потому что вряд ли у вас есть DNS сервер.
Ответить
0
Александр #
Спасибо, причина именно в этом, когда присвоил ему ip, заработало
Ответить
0
Елена #
Залила файла на хостинг, база заполнена, а графики не отображаются. Ошибок нет. В чем может быть проблема?
Ответить
0
Ильнар #
Можно ли мимо мускула сразу вывести с контроллера на сервер?
Ответить
0

[Автор]
Grankin #
Можно что угодно, главное наличие прямых рук. Без БД трудно работать, хранить показания датчиков в файлах то еще извращенство
Ответить
0
Ильнар #
Хранить в файлах не собираюсь, через мускул работает, но я еще хочу напрямую пустить некоторые данные, так сказать онлайн. Может подскажете ?
Ответить
0
Андрей #
Добрый день. Большое спасибо за статью, очень полезная инфа.
Подскажите куда копать: данные на сервере пишутся с разницей в 3 часа. Я так понимаю, где-то нужно настроить часовой пояс, но я совсем не силен в вебе.
Ответить
0

[Автор]
Grankin #
Вообще в файле .htaccess прописан +3 часовой пояс (php_value date.timezone "Europe/Moscow"). Загугли этот вопрос.
Ответить
0
Андрей #
Спасибо. Сделал так:
if (function_exists('date_default_timezone_set'))
date_default_timezone_set('Europe/Moscow');
Ответить
0
Mexaelb #
Добрый день,
подскажите почему при гет запросе ответ возвращается в виде
400 Bad Request
nginx/1.10.1
или пишет
busy s...
Ответить
0
Владимир #
Здравствуйте, попытался сделать всё, как в видео, и у меня не получилось настроить базу данных
Выдаёт вот такую ошибку
Прикрепленный файл: Скрин.png
Ответить
0
REZERV #
Как реализовать включение и выключение реле через кнопку на сервере?
Ответить
0
Адам #
Подскажите, пожалуйста, в чем может быть проблема?
Прикрепленный файл: Screenshot_2.png
Ответить
0
EverGrand #
У кого возникают проблемы с подключением, чтобы видеть ошибки (если отключены сервером), правим файл index.php.
первые 2 строки коментируем
//require_once '/system/core.php'; // стартуем ядро двигателя
//require_once '/system/functions.php'; // стартуем функции
после них добавляем
@ini_set ( 'display_errors', true );
@ini_set ( 'html_errors', false );

define ( 'ROOT_DIR', dirname ( __FILE__ ) );
require_once ROOT_DIR . '/system/core.php';// стартуем ядро двигателя
require_once ROOT_DIR . '/system/functions.php'; // стартуем функции
Ответить
0
Иван #
Можно ли реализовать это без Ethernet Shield?
Ответить
0
Мири #
Всем привет, пытаюсь повторить данный проект возникла проблема вот никак не могу решить.
Запросы никак не отправляются на сервер. Обычным get запросом проверяю через браузер сервер ок, но Arduino никак не посылает запросы, как найти в чем проблема. Или каким образом можно debug делать?

Буду благодарен если кто нибудь поможет мне.
Ответить
0
Валерий #
У Вас получилось разобраться? У меня такая же проблема, но отправка не идет потому что ip не получает если использовать библиотеку указанную в скетче. У Вас скорее всего так же.
Ответить
0
Chidwi #
Несколько дней провозился с этим проектом, проблема заключается в файлах php, там используется устаревшее обращение к базе данных, которое в версиях php7+ было удалено, в частности было mysql, стало mysqli. Нужно или переписывать php странички на новый лад или ставить php версии 5-6.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Набор для сборки - УНЧ 2х60 Вт на TDA7294 Discovery V8
вверх