• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь WEB server. Как изменить логику кнопки.?

Neznayka

New member
Приветствую, помощь нужна, я же в рубрике начинающих )))
Код:
if ( !digitalRead(pin13))
  {
    html += "<div style=\"text-align: center; font-size: 18px; font-weight:bold; \"><a href='sw1?sw11=off' style='display: inline-block; color:black; width: 220px; height:120px; -moz-border-radius:5px; border-radius:5px; background-color:#8228a1;  margin: 0 auto;  \'> on</a></div>";
  } else {
    html += "<div style=\"text-align: center; font-size: 18px; font-weight:bold; \"><a href='sw11?sw11=on'  style='display: inline-block; color:white; width: 220px; height:120px; -moz-border-radius:5px; border-radius:5px; background-color:#8198a1;  margin: 0 auto; \'> off</a></div>";
  }
Кнопка (одна), нажатие... либо +1, либо ноль.
Как сделать чтобы +1 и возврат в *0* ?, длительность роли не играет, на подобие - return
 

kab

New member
Приветствую, помощь нужна, я же в рубрике начинающих )))
Код:
if ( !digitalRead(pin13))
  {
    html += "<div style=\"text-align: center; font-size: 18px; font-weight:bold; \"><a href='sw1?sw11=off' style='display: inline-block; color:black; width: 220px; height:120px; -moz-border-radius:5px; border-radius:5px; background-color:#8228a1;  margin: 0 auto;  \'> on</a></div>";
  } else {
    html += "<div style=\"text-align: center; font-size: 18px; font-weight:bold; \"><a href='sw11?sw11=on'  style='display: inline-block; color:white; width: 220px; height:120px; -moz-border-radius:5px; border-radius:5px; background-color:#8198a1;  margin: 0 auto; \'> off</a></div>";
  }
Кнопка (одна), нажатие... либо +1, либо ноль.
Как сделать чтобы +1 и возврат в *0* ?, длительность роли не играет, на подобие - return
Давайте всё-таки поподробнее - чем не устраивает текст, приведенный Вами?

ЗЫ. Мнение =АК= по поводу использования "Вы" и "вы" читал, но с ним не согласен:)
 

Neznayka

New member
Давайте всё-таки поподробнее - чем не устраивает текст, приведенный Вами?

ЗЫ. Мнение =АК= по поводу использования "Вы" и "вы" читал, но с ним не согласен:)
Спасибо, что согласились помочь. Этот код меняет уровень на противоположный, при каждом нажатии, а мне надо на кнопку как нажали и убрали/ Т е Появился уровень и исчез А если еще лучше, чтобы ответ вставить условие, выход лишний мне не надо, я его использовать не буду
Код:
void SW(byte num, bool sw) {
  switch ( num ) {
    case 1: digitalWrite(outpin , !sw); break;  // с WEB кнопки
  }
}
 

kab

New member
Спасибо, что согласились помочь. Этот код меняет уровень на противоположный, при каждом нажатии, а мне надо на кнопку как нажали и убрали
Код:
void SW(byte num, bool sw) {
  switch ( num ) {
    case 1: digitalWrite(outpin , !sw); break;  // с WEB кнопки
  }
}
По тексту первого фрагмента так и есть - пока кнопка нажата - исполняется верхнее "html =...", отпущена - нижнее...

Если надо по нажатию надо переключать значение переменной, то для реализации этого надо ввести еще переменную для хранения старого значения состояния кнопки. И если старое значение кнопки "не нажато", а новое - "нажато", то делать переключение типа value = -value. И не забыть переписать в переменную старого состояния кнопки новое значение.

ЗЫ. Намеренно не привожу готового текста - так для Вас будет интересней и полезней:)
 

kab

New member
Спасибо, что согласились помочь. Этот код меняет уровень на противоположный, при каждом нажатии, а мне надо на кнопку как нажали и убрали/ Т е Появился уровень и исчез А если еще лучше, чтобы ответ вставить условие, выход лишний мне не надо, я его использовать не буду
Код:
void SW(byte num, bool sw) {
  switch ( num ) {
    case 1: digitalWrite(outpin , !sw); break;  // с WEB кнопки
  }
}
Есть еще вариант поставить функцию прерывания на нажатие (там все возможности изменения состояния) кнопки. Но Вам, наверно, пока надо освоится с более простым вариантом - с переменными.
 

kab

New member
Не совсем понял, ка это сюда вставить, если с || условие типа digitalRead( ...) == HIGH вроде понятно, а тут не очень, это как флаг??
типа

...
newValue = digitalRead( ...);
if (oldValue == LOW||newValue <> oldValue) {status = - status}
if (status>0) {...} else {...}
oldValue = newValue;
...

Вроде так.Можно, наверно, как-то покороче - но здесь ясна логика
 

Neznayka

New member
типа

...
newValue = digitalRead( ...);
if (oldValue == LOW||newValue <> oldValue) {status = - status}
if (status>0) {...} else {...}
oldValue = newValue;
...

Вроде так.Можно, наверно, как-то покороче - но здесь ясна логика
sw?sw=on / sw?sw=on передаёт кнопка, при чём тут ..digitalRead( ...);.. Я совсем запутался, сначала надо как то конвертировать во флаг или ещё как, в интернете я по примерам не нашёл
А потом в условие 2й строкой, про кнопку web вставить , мне дигитал рид не нужен
else if (digitalRead(timerPin) == HIGH || //////////// )
 

Neznayka

New member
if (results.value==sw?sw=on) {
digitalWrite(3,HIGH);
}
if (results.value==sw?sw=off)
digitalWrite(3,LOW);

??? так
 

kab

New member
if (results.value==sw?sw=on) {
digitalWrite(3,HIGH);
}
if (results.value==sw?sw=off)
digitalWrite(3,LOW);

??? так
Значит я Вас не понял. То есть Вы хотите опираться не на состояние кнопки (через digitalRead), а на переданное значение параметра sw (on,off)?

Тогда значения из строки с значениями надо предварительно распарсить, т.е. раскидать по переменным - которые Вы упорно называете флагами - суть не в названии :) (вместо on/off легче потом использовать 1/0):

- Пусть stroka - полученная строка с значение переменной. Получится примерно так

int val; // можно определить где -нибудь перед setup

if (stroka.indexOf("sw=off") != -1)
val = 0;
else if (stroka.indexOf("sw=on") != -1)
val = 1;
...

Дальше уже используете переменную val...
 

kab

New member
Или еще проще

if (stroka.indexOf("sw=off") != -1)
digitalWrite(3,LOW);
else if (stroka.indexOf("sw=on") != -1)
digitalWrite(3,HIGH);
 

Neznayka

New member
Значит я Вас не понял. То есть Вы хотите опираться не на состояние кнопки (через digitalRead), а на переданное значение параметра sw (on,off)?

Тогда значения из строки с значениями надо предварительно распарсить, т.е. раскидать по переменным - которые Вы упорно называете флагами - суть не в названии :) (вместо on/off легче потом использовать 1/0):

Дальше уже используете переменную val...
Что то не получилось у меня так. В html я это поменял <a href='sw=off', теперь когда нажимаешь нет перехода

File Not Found
URI: /sw=off
Method: GET
Arguments: 0

Раньше было привязано к
case 1: digitalWrite(outpin_, !sw); break;
был ответ

Объявлять надо было так ?
String stroka;

И как теперь эта конструкция будет работать??

****************************************
void SW(byte num, bool sw) {
switch ( num ) {
case 1: digitalWrite(outpin, !sw); break;
}
}

void handleSW() {

if (server.arg("sw_1")== "on"){
SW(1, HIGH);
}
if (server.arg("sw_1")== "off"){
SW(1, LOW);
}
********************************************
Что б я совсем не запутался, может лучше придерживаться основной конструкции handleSW ?? Изменяя только не через раз 0 и 1, а добавлением флага к этому, каждый раз, т е пусть уже выход есть как есть меняется, а параллельно с ним и флаг, который мне для условия и надо скажем - flagsw . Одно нажатие +1, второе - 0, а выход получается как и был триггером ( пусть остаётся, ладно) Тогда в условие я вставлю как (......... || ! flagsw ....)
 
Последнее редактирование:

kab

New member
@Neznayka
Попробуйте так:
- перед setup поставьте
int flagsw=1;

- а описание функции сделайте так

void handleSW() {
if (flagsw == 1) {flagsw = 0;} else {flagsw = 1;}

if (server.arg("sw_1")== "on"){
digitalWrite(outpin,flagsw );
}
if (server.arg("sw_1")== "off"){
digitalWrite(outpin,1-flagsw );
}
********************************************

Каждая команда будет срабатывать через раз.

PS. Тут где-то еще "}" должна быть
 

Neznayka

New member
@Neznayka
Попробуйте так:
- перед setup поставьте
int flagsw=1;

- а описание функции сделайте так

void handleSW() {
if (flagsw == 1) {flagsw = 0;} else {flagsw = 1;}

if (server.arg("sw_1")== "on"){
digitalWrite(outpin,flagsw );
}
if (server.arg("sw_1")== "off"){
digitalWrite(outpin,1-flagsw );
}
********************************************

Каждая команда будет срабатывать через раз.

PS. Тут где-то еще "}" должна быть
Результат есть но наоборот раньше было через раз, теперь выход +1 через два, а мне надо каждый раз, без триггера с инверсией флага, нажал отработал таймер 5 сек, ещё раз отработал таймер.... Ну а выход в кейсе, получается через раз ( он мне не нужен, будет не подключен ) Вы наверное не так поняли, и флаг в этом условии не работает в этом таймере, сразу +1 и всё
Код:
 //***************key1*************************//
  if ( != flagsw || digitalRead(INPUT_PIN) == HIGH || digitalRead(INPUT_PIN2) == HIGH && !flag_a) {
    flag_a = 1; // устанавливаем флаг при первом нажатии
    moment = millis(); // запоминаем момент времени
    digitalWrite(outpin1, HIGH); // включаем светодиод
    Serial.println("outpin1 +1");
  }
  // если прошло время
  if ((millis() - moment >= 4000) && flag_a) {
    flag_a = 0; // сбрасываем флаг
    digitalWrite(outpin1, LOW);
    Serial.println("outpin1 0");
  }
  //***************key1*************************//
----------------------------------------------------------------------------------

Код:
void handleSW() {

if (flagsw == 1) {flagsw = 0;} else {flagsw = 1;}

if (server.arg("sw_1")== "on"){
digitalWrite(outpin,flagsw );
}
if (server.arg("sw_1")== "off"){
digitalWrite(outpin,1-flagsw );
}
  
  if (server.arg("sw_2")== "on"){
    SW(2, HIGH);
    Serial.println("sw_2 on");
    Serial.println ("");
  }
  if (server.arg("sw_2")== "off"){
    SW(2, LOW);
    Serial.println("sw_2 off");
    Serial.println ("");
  }
   //////////////////////////////
То что case, в я не трогал
 
Последнее редактирование:

kab

New member
@Neznayka

Еще и какой-то таймер появился :(
Честно говоря, я в Ваших желаниях запутался окончательно. На самом деле, по логике, берут наиболее простой аналог, потом его усложняют, подгоняя под свои "хотелки".
Вы же нашли какой-то крутой вариант - и теперь хотите сделать его попроще.
 

Neznayka

New member
@Neznayka

Еще и какой-то таймер появился :(
Честно говоря, я в Ваших желаниях запутался окончательно. На самом деле, по логике, берут наиболее простой аналог, потом его усложняют, подгоняя под свои "хотелки".
Вы же нашли какой-то крутой вариант - и теперь хотите сделать его попроще.
Всё не так .... Таймер и так там был и работает, с локальной тактовой кнопки, мне с самого начала, надо было вписать в условие включения этого таймера + управление со страниц, кнопкой, опять же он управляется, т е стартует, только как бы триггром, не на каждое включение по нажатию, а через раз, попробовал подставить ваш код, получилось через два, как счётчик на 2
 

Neznayka

New member
Код:
///секция 2
  if (digitalRead(INPUT_PIN) == HIGH || digitalRead(INPUT_PIN2) == HIGH && !flag_a   ||       ++++++////////////////+++++++++) {
    flag_a = 1; 
    moment = millis(); 
    digitalWrite(outpin1, HIGH); 
    Serial.println("outpin1 +1");
  }
  if ((millis() - moment >= 240000) && flag_a) { 
    flag_a = 0;
    digitalWrite(outpin1, LOW);
    Serial.println("outpin1 0");
  }
////секция 2
 

kab

New member
@Neznayka
Не..., извините, я пас ... С ходу помочь не получилось - возможности вникать глубже нет. Извините еще раз...
 

Сергей_Ф

Moderator
Команда форума
@Neznayka, вы меня конечно извините, но вы сами прочтите что вы написали...
То вам кнопка нужна, то нет.
То digital.Read() не нужен, то вы сами его вставляете в код.

Если хотите реальной помощи, то приведите весь код, и полностью опишите что вы хотите получить.
 
Сверху Снизу