• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь, с получением перменной

deman3333

New member
Всем здравствуйте. Срочно нужна помощь. Обо всем помаленьку - имеется es8266-01 которая управляет ардуиной через библиотеку aREST. На ЕСПхе поднят простенький веб сервер, 3 кнопки, действия на сервере (нажатия кнопок из браузера) обрабатываются java скриптом. Теперь в чем проблема- помимо кнопок так-же есть ползунок/slider со значениями 0-100, каким образом есп может получить это значение и присвоить его переменной? Буду признателен за помощь))
 

lsm

Разработчик Smart.js
Команда форума
1. JS код на странице должен ловить изменение слайдера и слать запрос серверу (esp8266), например /set_value?v=12345
2. на сервере (esp8266) нужно добавить REST endpoint /set_value который возьмет значение v
 

deman3333

New member
1. JS код на странице должен ловить изменение слайдера и слать запрос серверу (esp8266), например /set_value?v=12345
2. на сервере (esp8266) нужно добавить REST endpoint /set_value который возьмет значение v
С RESTом я то разберусь, самое главное присвоить значение слайдера переменной

проблема с запросами((
 

deman3333

New member
HTML в студию (там где ползунок) включая FORM если он есть
</style>
</head>
<body>
<script type="text/javascript">
var xmlHttp = new XMLHttpRequest();
function cmd(action)
{
xmlHttp.open("GET", "http://192.168.1.35/" + action, true);
xmlHttp.send(null);
}
tmr();
</script>
<div class="button" ontouchstart="cmd('cl');" onclick="cmd('cl');" ontouchend="cmd('stop');">cl</div>
<div class="button" ontouchstart="cmd('VKL');" onclick="cmd('VKL');">ON</div>
<div class="button" ontouchstart="cmd('OTKL');" onclick="cmd('OTKL');">OFF</div>

<form onsubmit="return false" oninput="level.value = flevel.valueAsNumber">
<input name="flevel" id="flying" type="range" min="0" max="100" value="0" ontouchstart="cmd('S');">
<output for="flying" name="level">0</output>
</form>
</body>
</html>
 

Юрий Ботов

Moderator
Команда форума
Попробуйте так:
... value="0" ontouchstart="cmd('S"+this.value+"');">
Если не пойдет то так:
... value="0" ontouchstart="cmd('S"+document.getElementById("flying").value+"');">
Должно уходить S c числом...( например "S12" ) Потом на сервере думаю разберете... Аккуратнее с кавычками!
 

deman3333

New member
Попробуйте так:

Если не пойдет то так:

Должно уходить S c числом...( например "S12" ) Потом на сервере думаю разберете... Аккуратнее с кавычками!
То ли я недалекий то ли лыжи не едут)) не работает, я так понимаю после действия с ползунком к адресу в браузере должно добавляться - "/S" и значение ползунка?
 

Юрий Ботов

Moderator
Команда форума
Должен уходить запрос. Отображаться в командной строке оно не обязано когда запрос через XMLHttpRequest(). Командную строку меняют запросы через form submit.
единственное что меня смущает - "ontouchstart", не знаю к месту ли он тут. Я бы поставил "onchange"
 

deman3333

New member
Должен уходить запрос. Отображаться в командной строке оно не обязано когда запрос через XMLHttpRequest(). Командную строку меняют запросы через form submit.
единственное что меня смущает - "ontouchstart", не знаю к месту ли он тут. Я бы поставил "onchange"
Мдааааа, надо учить матчасть) ставил onchange - слайдер перестает работать, т.е. не изменяет свое значение, разбираться и заморачиваться не стал, ибо сейчас самое главное с переменной разобраться, а потом уже все остальное корректировать.
 

Юрий Ботов

Moderator
Команда форума
Давайте к началам вернемся. Что вообще нужно сделать: какие именно "контролы" нужны и какое именно поведение вы от них ожидаете.
Почему я это спрашиваю? Я не понимаю зачем нужно каждое изменение скролика передавать на сервер, причем не новое, а предыдущее положение. Я бы послал какой то кнопкой только последнее значение скролика. Но возможно я чего то не понимаю.
 

deman3333

New member
Давайте к началам вернемся. Что вообще нужно сделать: какие именно "контролы" нужны и какое именно поведение вы от них ожидаете.
Почему я это спрашиваю? Я не понимаю зачем нужно каждое изменение скролика передавать на сервер, причем не новое, а предыдущее положение. Я бы послал какой то кнопкой только последнее значение скролика. Но возможно я чего то не понимаю.
В общем - к 328 атмеге будет подключены светодиоды, и прочая мелочь. + L293 с двигателями, этими двигателями я хочу управлять слайдером с веб сервера, а так как есп, управляет атмегой через AREST, мне нужно получить значения со слайдера, и присвоить его переменной, которая отправиться все через тот же арест в атмегу для ШИМ сигнала. т.е. в serial будет уходить /analog/"пин"/"эта самая переменная" остальное все готово, осталось только это
 

Юрий Ботов

Moderator
Команда форума
Попробуй вот так:

HTML:
<body>
<script type="text/javascript">
  var xmlHttp = new XMLHttpRequest();
  function cmd(action) { xmlHttp.open("GET", "http://192.168.1.35/" + action, true); xmlHttp.send(null); }
  tmr();
</script>
<div class="button" ontouchstart="cmd('cl');" onclick="cmd('cl');" ontouchend="cmd('stop');">cl</div>
<div class="button" ontouchstart="cmd('VKL');" onclick="cmd('VKL');">ON</div>
<div class="button" ontouchstart="cmd('OTKL');" onclick="cmd('OTKL');">OFF</div>

<input type="range"  min="0" max="100" id="flying" value="50"
   onchange="var a=document.getElementById('flying').value;document.getElementById('flevel').innerHTML=a;cmd('FLY/'+a);return false;">
<br>
<div id="flevel">0</div>
</body>
Просто заменить все что в БОДИ.
 

deman3333

New member
что то запутался я((( ява скрип при ontouchstart (нажатие сенсора) через ("cmd('VKL');) ссылается на ДНС строчку httpServer.on("/VKL", cmdVKL); и выполняется void cmdVKL() насколько я понял <---- Взято Для Примера. А куда будет ссылаться из вашего примера cmd('FLY/'+a); ? замучал я походу вас)) вот весь скетч

по
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h>
const char* host = "aLO";
const char* ssid = "ZyXEL";
const char* password = "87751660017";
extern const char* html;


int a;

ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;

int timeout = 0;
int led=2;
void showindex() {
httpServer.sendHeader("Connection", "close"); // Important for latency
httpServer.send(200, "text/html", html);
}
void cmdcl() {
digitalWrite(led, HIGH);
Serial.println("/digital/3/1");
Serial.println("OKAY");
timeout = 10000;
httpServer.sendHeader("Connection", "close");
httpServer.send(200, "text/html", "");
}
void cmdVKL() {
digitalWrite(led, HIGH);
Serial.println("/digital/3/1");
Serial.println("OKAY");
timeout = 10000;
httpServer.sendHeader("Connection", "close");
httpServer.send(200, "text/html", "");
}

void cmdOTKL() {
digitalWrite(led, LOW);
Serial.println("/digital/3/0");
Serial.println("OKAY");
timeout = 10000;
httpServer.sendHeader("Connection", "close");
httpServer.send(200, "text/html", "");
}
void cmdS() {
Serial.print("/analog/3/");
//Serial.print();
//Serial.print();
timeout = 10000;
httpServer.sendHeader("Connection", "close");
httpServer.send(200, "text/html", "");
}


void cmdstop() {
digitalWrite(led, LOW);
Serial.println("/digital/3/0");
Serial.println("OKAY");
httpServer.sendHeader("Connection", "close");
}

void setup(void){
pinMode(2, OUTPUT);
digitalWrite(2, LOW);
Serial.begin(115200);
Serial.println();
Serial.println("Starting...");
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, password);
while(WiFi.waitForConnectResult() != WL_CONNECTED){
WiFi.begin(ssid, password);
Serial.println("WiFi failed, retrying.");
}

MDNS.begin(host);

httpUpdater.setup(&httpServer);
httpServer.on("/", showindex);
httpServer.on("/cl", cmdcl);
httpServer.on("/VKL", cmdVKL);
httpServer.on("/OTKL", cmdOTKL);
httpServer.on("/stop", cmdstop);

httpServer.begin();
MDNS.addService("http", "tcp", 80);
Serial.printf("Started compled!-");
Serial.print("IP adres-");
Serial.println(WiFi.localIP());
}


void loop(void){
// sila = WiFi.RSSI(); // Меряем силу сигнала
// Serial.println(sila);
// delay(2000);
httpServer.handleClient();
delay(1);
}


const char *html = R"(
<html>
<head>
<meta content="width=device-width, initial-scale=1" name="viewport" />
<style type="text/css">
.button {
width: 25%;
height: 100px;
background-color: #ddd;
margin:10px;
font-size: 35px;
text-align:center;
line-height: 100px;
display: inline-block;
-moz-user-select: none;
-webkit-user-select: none;
-ms-user-select:none;
}
</style>
</head>
<body>
<script type="text/javascript">
var xmlHttp = new XMLHttpRequest();
function cmd(action) { xmlHttp.open("GET", "http://192.168.1.35/" + action, true); xmlHttp.send(null); }
tmr();
</script>
<div class="button" ontouchstart="cmd('cl');" onclick="cmd('cl');" ontouchend="cmd('stop');">cl</div>
<div class="button" ontouchstart="cmd('VKL');" onclick="cmd('VKL');">ON</div>
<div class="button" ontouchstart="cmd('OTKL');" onclick="cmd('OTKL');">OFF</div>

<input type="range" min="0" max="100" id="flying" value="50"
onchange="var a=document.getElementById('flying').value;document.getElementById('flevel').innerHTML=a; cmd('FLY/'+a);return false;">
<br>
<div id="flevel">0</div>
</body>
</html>
)";
 

Юрий Ботов

Moderator
Команда форума
:) я думал вы лучше меня знаете как это разбирать :)

Если серьезно то так разбирают только статические параметры: http://x.x.x/par ,а для динамических есть другой классический способ их передачи: http://x.x.x/pref?par1='1'&par2='2' .

В вашем сервере есть способ доступа к этим параметрам, это функция args() возвращающая число параметров и функция arg(String name) возвращающая параметр по его имени (Arduino/ESP8266WebServer.h at master · esp8266/Arduino · GitHub).

То есть, по всей видимости надо сгенерить строку немного подругому: cmd("FLY?val='"+a+"'");
А на сервере httpServer.on("/FLY", cmdFLY); а внутри cmdFLY проверить наличие параметра и если он есть прочитать его. Кстати, там на гитхабе есть и примеры использования...
 

deman3333

New member
:) я думал вы лучше меня знаете как это разбирать :)
Нет) ) поэтому и пишу в разделе для новичков , а скетч чужой , просто измененный , а так с работой есп туговато (( времени особо нет заниматься. Экспериментировал со скетчами пришёл к нужному результату, хоть и до конца не понял принципа работы) ) значение слайдера переменной присваиваются все Окай . Но вот теперь другая делема) ) работать через браузер вообще не удобно , + как я понял слайдер нельзя поставить в вертикальное расположение , что ещё больше добавляет неудобств . Буду теперь делать приложение на ап ивенторе, с ним проблем нет. Осталось только разобраться как по запросам в адресную строку (например s123) есп принимали это значение все той же переменной ) ) вообщем-то нужно выбирать время и сидеть разбираться
 

deman3333

New member
:) я думал вы лучше меня знаете как это разбирать :)

Если серьезно то так разбирают только статические параметры: http://x.x.x/par ,а для динамических есть другой классический способ их передачи: http://x.x.x/pref?par1='1'&par2='2' .

В вашем сервере есть способ доступа к этим параметрам, это функция args() возвращающая число параметров и функция arg(String name) возвращающая параметр по его имени (Arduino/ESP8266WebServer.h at master · esp8266/Arduino · GitHub).

То есть, по всей видимости надо сгенерить строку немного подругому: cmd("FLY?val='"+a+"'");
А на сервере httpServer.on("/FLY", cmdFLY); а внутри cmdFLY проверить наличие параметра и если он есть прочитать его. Кстати, там на гитхабе есть и примеры использования...
Не поделитесь ссылками на источники? где можно обо всем посчитать по подробнее? особенно про динамические
 

Юрий Ботов

Moderator
Команда форума

deman3333

New member
Да где угодно, вот первое что нашлось - » HTTP-запрос методом GET. а так разумеется в стандарте - HTTP 1.1 - Русский перевод спецификации RFC 2068. но с поправкой - (& вместо ; ). Так уж сложилось что практически все тут от стандарта отходят.
Спасибо за помощь ) все доигрался , есп отошёл в мир иной , горит синий светодиод и в монитор летит не пойми что. Заливал бут по нулевому адресу, не помогло (( после заливки другой прошивки снова горит .
 
Сверху Снизу