Как изменить переменную на ардуино с PHP сервера, использую internet sheald W5100
- Войдите на сайт для отправки комментариев
Ср, 22/05/2019 - 14:14
Как изменить переменную на ардуино с PHP сервера, использую internet sheald W5100
погуглите про MQTT протокол
ок, спасибо, сейчас
MQTT - это короче отдельный софт через облако
MQTT - это короче отдельный софт через облако
и незачем так орать.
Да, через облако. И что не так?
а примера нет как гет или пос запросами организовать, у меня просто на пхп сервер отправляет а как на оборот сделать не где найти не могу
а как на оборот сделать не где найти не могу
а не надо наоборот. Чтобы "наоборот" - это вам придется на ардуине сервер поднимать, а это дело грустное, слабовата она для этого.
Как раз отправлять с ардуины запросы на внешний сервер - самое правильное решение вашей задачи. именно для этого придуман MQTT. но в принципе он не единствкенный. можно и без него
а примера нет как гет или пос запросами организовать, у меня просто на пхп сервер отправляет а как на оборот сделать не где найти не могу
И не найдёте. Вы не до конца понимаете смысл слов "сервер" и "клиент". Запросы шлёт всегда клиент, а сервер их обслуживает. И никогда "наоборот". Клиент никогда не принимает никаких запросов.
Если хотите, чтобы ардуина обслуживала запросы откуда-то, нужно пднимать на ней хоть крохотный-простенький, но сервер. Поднимите и дёргайте его из пхп сколько хотите.
Впрочем, есть вариант (подойдёт или нет - зависит от Вашей задачи). Ваша адруина может оставаясь чистым клиентом, долбить пхп-сервер запросами скажем раз в секунду "дай мне значение моей любимой переменной", а тот должен отвечать. Только меняться перемнная быдет не точно в том момент, когда на php поменялась, а при ближайшем запросе.
...
Женя! И то и другое есть вот-прям в примерах к стандартной ethernet.h размещенной в ИДЕ с раздачи, то есть по умолчанию.
Я вообще не могу понять, что происходит с людьми? Не нужно в библиотеку ГПНТБ ехать, даже в Гугль лезть не надо, нужно просто открыть пример на своем компе, и все равно: "Подайте на пропитание!", вот как это у них получается?
а примера нет как гет или пос запросами организовать, у меня просто на пхп сервер отправляет а как на оборот сделать не где найти не могу
обсуждалось неоднократно, делаете запрос на сервер (можно почаще), а в ответ 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 }я так и думал что ругать будете, на счет клиент-серверной архитектуры
я так и думал что ругать будете, на счет клиент-серверной архитектуры
если проброс портов на железку есть, то можно и микро сервер нарисовать, вопрос что на нем должно быть...
а так вот например - примитивный сервер, с браузера подключайтесь и меняйте что хотите
http://arduino.ru/forum/proekty/ethernet-vyklyuchatel-nagruzki-v-lokalnoi-seti
я так и думал что ругать будете, на счет клиент-серверной архитектуры
Так ото ж :-)))
а можно сделать ГЕТ по файлу с нужной мне переменной и в ответ мне содержимое этого файла с числом, а на HTML C PHP я сам буду туда вводить число?
Сделать можно все, вопрос какими силами...
Сами как пробовали? Что не получилось?
ЗЫ. Или надеетесь на готовый код? Зря, здесь халявщиков не любят.
я первый раз в жизни пишу форум, кот готовый мне не нужен, не пойму в каком виде PHP сервер должен отправлять ответ на запрос(на другом форуме прочитал что автоматически), а как ардуина его читает я уже понял
Вот мой проект https://www.youtube.com/watch?v=1Zwehtj-R6M
в плане терминала все работает
теперь мне преподователь поставила задачу чтобы можно было управлять дистанционно, у меня пока успех в отправке на PHP затем в MySql, температуру при которой будет открывать или закрывать ввожу двумя кнопками, первая уменьшает переменную вторая увеличивает, и затем по условию идет сравнение.
есть еще одна мысль:"а можно эмитировать нажатие этих кнопок удаленно?"
я первый раз в жизни пишу форум, кот готовый мне не нужен, не пойму в каком виде PHP сервер должен отправлять ответ на запрос(на другом форуме прочитал что автоматически), а как ардуина его читает я уже понял
Не поверите, в том же виде как вы формируете HTML страничку, например:
if ($sw_pos == 'on') { echo " setRelayOFF ~" } else { echo " setRelayON ~" }у меня маленький успех!!! я уже получаю инфу от сервера
delay (5000); // без паузы не выводило while (client.available()) { String line = client.readStringUntil('~'); //выводит весь PHP файл если даже тильды там нету она в другом файле Serial.println(line);у меня маленький успех!!! я уже получаю инфу от сервера
Обмыл?
НЕ ДО ЭТОГО!!!! Я этого с суботы бьюсь, у меня предзацита скоро, уже пожалел что эту тему выбрал, над одной фунцией бьюсь, мне просто "информационную систему" нужно именно сделать, а как терминал не прокатит
Вот нашел урок в https://www.youtube.com/watch?time_continue=243&v=8vC4VJLzghs там с 4 минуты расписанно как дальше переменные искать в этих строках
Вот нашел урок
Чего вы все так видео любите? Читать не умеете? :)
НЕ ДО ЭТОГО!!!!
Напрасно! Народная мудрость она такая ...
Вот нашел урок
Чего вы все так видео любите? Читать не умеете? :)
уже начитался, я к тому что у него часть скетча спилить, а так что мне его смотреть и слушать
НЕ ДО ЭТОГО!!!!
Напрасно! Народная мудрость она такая ...
так спиться можно после каждого успеха
уже начитался
незаметно что-то :(
Вот как изменить переменную на ардуино с 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 должно быть
для ответа
вот пример файла подключения к базе
<?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); } ?>Теперь главное - надеятся, что сервер не заDDOS-ит ардуину длинным HTTP-хидером ))
Вот маленький успех в отпраке переменных Arduino Uno Sheald W5100 https://www.youtube.com/watch?v=pPggXbwTXtw
У меня маленькая проблема появилась, не сталкивались? теперь если использовать как терминал, а не удаленно, в тот момент когда контроллер занят другими циклами кнопки не работают, помогает только долгое нажатие на кнопку 1клик в 10сек, раньше использовал функцию SmartDelay foo(20000UL); сейчас не помогает.
Кнопки повесить на прерывания как вариант. А вообще пока скетч что то не видно....сложно судить.
сейчас в порядок его приведу а то я тут на вертел уже
Если там обильно встречаются вызовы функции типа delay(1000), то можно не постить - дело в них.
Ну это понятно, они есть, на что заменить можно, я скетч приготовил, там не портянка коменты есть
#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); } }У меня маленькая проблема появилась, не сталкивались? теперь если использовать как терминал, а не удаленно, в тот момент когда контроллер занят другими циклами кнопки не работают, помогает только долгое нажатие на кнопку 1клик в 10сек, раньше использовал функцию SmartDelay foo(20000UL); сейчас не помогает.
SmartDelay foo2(200000000UL); SmartDelay foo3(100000000UL); SmartDelay foo(10000000UL); if (foo.Now()) { } if (foo.Now()) { } if (foo.Now()) { }Решил проблему!!! везде где стоит delay заменил на циклы