Как изменить переменную на ардуино с PHP сервера, использую internet sheald W5100

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

Как изменить переменную на ардуино с PHP сервера, использую internet sheald W5100

b707
Онлайн
Зарегистрирован: 26.05.2017

погуглите про MQTT протокол

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

ок, спасибо, сейчас

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

MQTT - это короче отдельный софт через облако

b707
Онлайн
Зарегистрирован: 26.05.2017

rush пишет:

MQTT - это короче отдельный софт через облако

и незачем так орать.
Да, через облако. И что не так?

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

а примера нет как гет или пос запросами организовать, у меня просто на пхп сервер отправляет а как на оборот сделать не где найти не могу

b707
Онлайн
Зарегистрирован: 26.05.2017

rush пишет:

 а как на оборот сделать не где найти не могу

а не надо наоборот. Чтобы "наоборот" - это вам придется на ардуине сервер поднимать, а это дело грустное, слабовата она для этого.

Как раз отправлять с ардуины запросы на внешний сервер - самое правильное решение вашей задачи. именно для этого придуман MQTT. но в принципе он не единствкенный. можно и без него

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rush пишет:

а примера нет как гет или пос запросами организовать, у меня просто на пхп сервер отправляет а как на оборот сделать не где найти не могу

И не найдёте. Вы не до конца понимаете смысл слов "сервер" и "клиент". Запросы шлёт всегда клиент, а сервер их обслуживает. И никогда "наоборот". Клиент никогда не принимает никаких запросов.

Если хотите, чтобы ардуина обслуживала запросы откуда-то, нужно пднимать на ней хоть крохотный-простенький, но сервер. Поднимите и дёргайте его из пхп сколько хотите.

Впрочем, есть  вариант (подойдёт или нет - зависит от Вашей задачи). Ваша адруина может оставаясь чистым клиентом, долбить пхп-сервер запросами скажем раз в секунду "дай мне значение моей любимой переменной", а тот должен отвечать. Только меняться перемнная быдет не точно в том момент, когда на php поменялась, а при ближайшем запросе.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

...

Женя! И то и другое есть вот-прям в примерах к стандартной ethernet.h размещенной в ИДЕ с раздачи, то есть по умолчанию.

Я вообще не могу понять, что происходит с людьми? Не нужно в библиотеку ГПНТБ ехать, даже в Гугль лезть не надо, нужно просто открыть пример на своем компе, и все равно: "Подайте на пропитание!", вот как это у них получается?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

rush пишет:

а примера нет как гет или пос запросами организовать, у меня просто на пхп сервер отправляет а как на оборот сделать не где найти не могу

обсуждалось неоднократно, делаете запрос на сервер (можно почаще), а в ответ PHP уже шлет ответ, в котором есть некая команда, типа так:

            while (client.available()) {
              String line = client.readStringUntil('~');
              Serial.println(line);
              // find response // в случае получения нужной строки включаем/отключаем реле
              if (line.indexOf(" SetRelayON ") >= 0) {
                RELAYON; relayStatus = 1;
                client.stop();
                deviceMode = 0;
                Serial.println();
                Serial.println("Closed connection");
                break;
              } else if (line.indexOf(" SetRelayOFF ") >= 0) {
                RELAYOFF; relayStatus = 0;
                client.stop();
                deviceMode = 0;
                Serial.println();
                Serial.println("Closed connection");
                break;
              }
              // end find - processing
            }

 

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

я так и думал что ругать будете, на счет клиент-серверной архитектуры

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

rush пишет:

я так и думал что ругать будете, на счет клиент-серверной архитектуры

если проброс портов на железку есть, то можно и микро сервер нарисовать, вопрос что на нем должно быть...

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

http://arduino.ru/forum/proekty/ethernet-vyklyuchatel-nagruzki-v-lokalnoi-seti

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rush пишет:

я так и думал что ругать будете, на счет клиент-серверной архитектуры

Так ото ж :-)))

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

а можно сделать ГЕТ по файлу с нужной мне переменной и в ответ мне содержимое этого файла с числом, а на HTML C PHP я сам буду туда вводить число? 

client.print( "GET /temp.txt");
client.available();
char c = client.read();
Serial.println(c);
delay (2000);

 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Сделать можно все, вопрос какими силами...
Сами как пробовали? Что не получилось?

ЗЫ. Или надеетесь на готовый код? Зря, здесь халявщиков не любят.

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

я первый раз в жизни пишу форум, кот готовый мне не нужен, не пойму в каком виде PHP сервер должен отправлять ответ на запрос(на другом форуме прочитал что автоматически), а как ардуина его читает я уже понял

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

Вот мой проект https://www.youtube.com/watch?v=1Zwehtj-R6M

в плане терминала все работает

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

есть еще одна мысль:"а можно эмитировать нажатие этих кнопок удаленно?" 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

rush пишет:

я первый раз в жизни пишу форум, кот готовый мне не нужен, не пойму в каком виде PHP сервер должен отправлять ответ на запрос(на другом форуме прочитал что автоматически), а как ардуина его читает я уже понял

Не поверите, в том же виде как вы формируете HTML страничку, например:

if ($sw_pos == 'on')
{
echo " setRelayOFF ~"
} else
{
echo " setRelayON ~"
}

 

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

у меня маленький успех!!! я уже получаю инфу от сервера

delay (5000); // без паузы не выводило
while (client.available()) {
  String line = client.readStringUntil('~'); //выводит весь PHP файл если даже тильды там нету она в другом файле
  Serial.println(line);

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

rush пишет:

у меня маленький успех!!! я уже получаю инфу от сервера

Обмыл?

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

НЕ ДО ЭТОГО!!!!  Я этого с суботы бьюсь, у меня предзацита скоро, уже пожалел что эту тему выбрал, над одной фунцией бьюсь, мне просто "информационную систему" нужно именно сделать, а как терминал не прокатит 

Вот нашел урок в https://www.youtube.com/watch?time_continue=243&v=8vC4VJLzghs там с 4 минуты расписанно как дальше переменные искать в этих строках

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rush пишет:

Вот нашел урок 

Чего вы все так видео любите? Читать не умеете? :)

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

rush пишет:

НЕ ДО ЭТОГО!!!!  

Напрасно! Народная мудрость она такая ...

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

ЕвгенийП пишет:

rush пишет:

Вот нашел урок 

Чего вы все так видео любите? Читать не умеете? :)

уже начитался, я к тому что у него часть скетча спилить, а так что мне его смотреть и слушать

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

Ворота пишет:

rush пишет:

НЕ ДО ЭТОГО!!!!  

Напрасно! Народная мудрость она такая ...

так спиться можно после каждого успеха

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

rush пишет:

уже начитался

незаметно что-то :(

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

Вот как изменить переменную на ардуино с PHP сервера 

String msg = "GET /test.php?t="+ String(t) + "&h="+String(h);
Serial.println(msg);
client.connect(server, 80);
client.println(msg);
delay (5000); // без паузы не выводило
while (client.available()) {                  //пока клиент активен
  String line = client.readStringUntil('$'); //читаю до символа
  Serial.println(line);                      //выводит строковое
client.stop();                               //останавливаем иначе выводит лишние строки
int intVar;                                  //переменная для преобразования из стринг в инт, для изменения значений заданной температуры открытия и закрытия
//преобразуем
String stringVar = line;
intVar=stringVar.toInt();
opt2=intVar;                               //присваиваем  
Serial.println(opt2);                      // выводим
  }
delay (2000);
// delay (8000);
  }

А на php сервере, в том файле который мы отправляем гет запрос GET Test.PHP должно быть 

echo "45 $";

для ответа

вот пример файла подключения к базе

<?php
echo "45 $";
    
    // Параметры для подключения
    $db_host = "localhost"; 
    $db_user = "root"; // Логин БД
    $db_password = ""; // Пароль БД
    $db_base = 'test'; // Имя БД
    $db_table = "sensor_data"; // Имя Таблицы БД
  $client_ip = $_SERVER['REMOTE_ADDR'];
// получение значения переменной температура
$temp = $_GET["t"];
// получение значения влажность
$hum = $_GET["h"];
    // Подключение к базе данных
	
    $mysqli = new mysqli($db_host,$db_user,$db_password,$db_base);
    mysqli_set_charset($mysqli, "utf8");
    // Если есть ошибка соединения, выводим её и убиваем подключение
	if ($mysqli->connect_error) {
	    die('Ошибка : ('. $mysqli->connect_errno .') '. $mysqli->connect_error);
	} 
?>

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Теперь главное - надеятся, что сервер не заDDOS-ит ардуину длинным HTTP-хидером ))

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

Вот маленький успех в отпраке переменных Arduino Uno Sheald W5100 https://www.youtube.com/watch?v=pPggXbwTXtw

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

У меня маленькая проблема появилась, не сталкивались? теперь если использовать как терминал, а не удаленно, в тот момент когда контроллер занят другими циклами кнопки не работают, помогает только долгое нажатие на кнопку 1клик в 10сек, раньше использовал функцию SmartDelay foo(20000UL); сейчас не помогает.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Кнопки повесить на прерывания как вариант. А вообще пока скетч что то не видно....сложно судить.

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

сейчас в порядок его приведу а то я тут на вертел уже

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Если там обильно встречаются вызовы функции типа delay(1000), то можно не постить - дело в них.

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019

Ну это понятно, они есть, на что заменить можно, я скетч приготовил, там не портянка коменты есть

 

 

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019
#include <SmartDelay.h>
SmartDelay foo(20000UL);
SmartDelay foo2(2000UL);
SmartDelay foo3(20000UL);
#include <Wire.h>                  // подключаем библиотеку I2C
#include <LiquidCrystal_I2C.h>     // подключаем библиотеку дисплея 
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем какой дисплей

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

#define DHTPIN 2  // задаем контакт подключенный 
#define DHTTYPE DHT11  // задаем тип подключаемого датчика // DHT 11

// обьявляем обьект dht с параметрами
DHT dht(DHTPIN, DHTTYPE);
const int buttonPin = 3;    // номер пина для кнопки
const int buttonPin1 = 4;    // номер пина для кнопки
int buttonState;
int buttonState1;
int s=0;
int opt=30;   

#include <Stepper_28BYJ.h>
// установить количество шагов 4078 для мотора 
#define STEPS 4078
// задать управляющие пины (Pin) на плате контроллера Ардуино
Stepper_28BYJ stepper(STEPS, 5, 6, 7, 8);
   
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4C, 0xFB };
byte ip[] = { 192, 168, 100, 30 };

//IP адрес сервера который будет собирать статистику
byte server[] = { 192, 168, 100, 68 };

EthernetClient client;
void setup()
{
  Ethernet.begin(mac, ip);
  dht.begin(); // запускаем датчик
  // Для отладки включим отправку данных в COM порт
  Serial.begin(9600);
  lcd.init();                      // инициализируем дисплей                
  lcd.backlight();                 // Включаем подсветку дисплея
  pinMode(buttonPin, INPUT);
  stepper.setSpeed(13);
}

void loop()
{

int h = dht.readHumidity();// считываем влажность
int t = dht.readTemperature();// считываем температуру

String msg = "GET /test.php?t="+ String(t) + "&h="+String(h)+ "&opt="+String(opt);
Serial.println(msg);
client.connect(server, 80);
client.println(msg);
delay (5000); // без паузы не выводило

 
while (client.available()) {                  //пока клиент активен
  String line = client.readStringUntil('$'); //читаю до символа
  Serial.println(line);                      //выводит строковое
client.stop();                               //останавливаем иначе выводит лишние строки
int intVar;                                  //переменная для преобразования из стринг в инт, для изменения значений заданной температуры открытия и закрытия
//преобразуем
String stringVar = line;
intVar=stringVar.toInt();
opt=intVar;                               //присваиваем  
Serial.println(opt);                      // выводим
  }
delay (2000);

if (foo.Now()) { // задержка 2 сек между считываниями
  lcd.setCursor(0, 0);
  lcd.print("t="); 
 lcd.print(t);
 lcd.print("c");
           lcd.print(" ");          
 lcd.print("h=");
  lcd.print(h); 
  lcd.print("%");

lcd.setCursor(0, 1);
  lcd.print("Optim="); 
   lcd.print(opt);

   
   if   (t>opt and s!=1){
s=1;
stepper.step(+850);
   }
   if   (t<opt and s==1){
s=0;
stepper.step(-850);
   }
}

  // считываем состояние кнопки и записываем в переменную
  buttonState = digitalRead(buttonPin);
  buttonState1 = digitalRead(buttonPin1);
   
 if (buttonState == HIGH) // если кнопка0 нажата
  {
++opt;     
 delay(200);
  }
   if (buttonState1 == HIGH) // если кнопка1 нажата
  {
--opt;     
 delay(200);

}
}

rush пишет:

У меня маленькая проблема появилась, не сталкивались? теперь если использовать как терминал, а не удаленно, в тот момент когда контроллер занят другими циклами кнопки не работают, помогает только долгое нажатие на кнопку 1клик в 10сек, раньше использовал функцию SmartDelay foo(20000UL); сейчас не помогает.

rush
rush аватар
Offline
Зарегистрирован: 21.05.2019
​SmartDelay foo2(200000000UL);
SmartDelay foo3(100000000UL);
SmartDelay foo(10000000UL);
if (foo.Now()) {
}
if (foo.Now()) {
}
if (foo.Now()) {
}

Решил проблему!!! везде где стоит delay заменил на циклы