• Система автоматизации с открытым исходным кодом на базе 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() не нужен, то вы сами его вставляете в код.

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