If..else с периодичностью.

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021
Приветсвую!
Например имеем такой цикл
void loop() {
digitalWrite(32, ledState1);
digitalWrite(33, ledState2);
digitalWrite(25, ledState3);
digitalWrite(26, ledState4);
digitalWrite(27, ledState5);
}
Где ledState..есть HIGH или LOW в зависимости настроения моей тёщи.
Его необходимо перенести в void setup() {.....} под контроль оператора If..else
Если сделать так:
void setup() {
if (бла..бла..бла)
 {
  // действие A
}
else
{
  // действие Б - а именно
  digitalWrite(32, ledState1);
  digitalWrite(33, ledState2);
  digitalWrite(25, ledState3);
  digitalWrite(26, ledState4);
  digitalWrite(27, ledState5);
 }
}
Выполнение происходит только при каждом обновлении страницы (оно и понятно, потому как действие "Б" выполнятеся лишь однократно).
Как сделать так, что бы действие "Б" выполнялось с определенной переодичностью? Например каждые 5 сек. Пологаю через функцию в java скрипт? Подкиньте пример если не сложно. А то я не силен.
Большое спасибо!

 

Green
Offline
Зарегистрирован: 01.10.2015

Балалайка, ну очень просто. "Пологаю", типа:
every(5000)
  action();
Не?

rkit
Offline
Зарегистрирован: 23.11.2016

Adolf_Balalaykin пишет:

Выполнение происходит только при каждом обновлении страницы (оно и понятно, потому как действие "Б" выполнятеся лишь однократно).

Нет, совсем не понятно. Откуда вылезли страницы какие-то?

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

rkit пишет:

Adolf_Balalaykin пишет:

Выполнение происходит только при каждом обновлении страницы (оно и понятно, потому как действие "Б" выполнятеся лишь однократно).

Нет, совсем не понятно. Откуда вылезли страницы какие-то?

Это асинхронный вэб сервер. Управление термостатом.Включение по установленному температурному порогу + кнопки принудительного включения независимо от температуры.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Adolf_Balalaykin, Вы уж определитесь, что Вам нужно: перенести в setup или чтобы выполнялось "с периодичностью".

rkit
Offline
Зарегистрирован: 23.11.2016

Всё равно не понятно. Как setup связан со страницей?

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

andriano пишет:

Adolf_Balalaykin, Вы уж определитесь, что Вам нужно: перенести в setup или чтобы выполнялось "с периодичностью".

Определился. В сетапе с переодичностью. Если бы просто выполнить с периодичностью, то оставил бы в лупе и сюда не писал. Но в данном случае нужно впихать именно в else для проверки соответсвия под уже действующее условие. 

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

rkit пишет:
Всё равно не понятно. Как setup связан со страницей?

ОК, так понятней?

// Импортируем библиотеки
#include <WiFi.h>
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include "SPIFFS.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

// Задаем сетевые настройки
const char* ssid = "*****";
const char* password = "*******";
IPAddress local_IP(192, 168, 1, 68);  // Задаем статический IP-адрес:
IPAddress gateway(192, 168, 1, 1);  // Задаем IP-адрес сетевого шлюза:
IPAddress subnet(255, 255, 255, 0);    // Задаем маску сети:
IPAddress primaryDNS(8, 8, 8, 8);      // Основной ДНС (опционально)
IPAddress secondaryDNS(8, 8, 4, 4);    // Резервный ДНС (опционально)
AsyncWebServer server(80);             // Создаем сервер через 80 порт
AsyncWebSocket ws("/ws");              // Создаем объект WebSocket

// Запускаем SPIFFS
void initSPIFFS() {
  if (!SPIFFS.begin(true)) {
    Serial.println("Произошла ошибка при монтировании SPIFFS");
  }
  Serial.println("SPIFFS примонтировано успешно");
}

// Запускаем WiFi
void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
       delay(500);
	   Serial.print("Подключаюсь к WiFi ...");
  }
  Serial.println(WiFi.localIP());
}

// На всех выводах GPIO по умолчанию устанавливаем 0. 
bool ledState1 = 0;
bool ledState2 = 0;
bool ledState3 = 0;
bool ledState4 = 0;
bool ledState5 = 0;

String inputMessage = "25.0";          // пороговое значение температуры по умолчанию
String lastTemperature;                // Переменная lastTemperature, это последние показания температуры, которые будут сравниваться с пороговым значением.
String enableArmChecked = "checked";   // Переменная enableArmChecked сообщит нам, установлен ли флажок для автоматического управления выводом или нет.
String inputMessage2 = "true";         // В случае, если он установлен, значение, сохраненное на inputMessage2, должно быть установлено в true.

void notFound(AsyncWebServerRequest *request) {
  request->send(404, "text/plain;charset=utf-8", "Страница не найдена");
} 

// BME280 - Универсальный датчик
Adafruit_BME280 bme;                   // Подключаем датчик в режиме I2C

String getTemperature2() {
  float IN4 = bme.readTemperature() - 1.04;
  Serial.print("BME280- Температура: ");
  Serial.print(IN4);
  Serial.print(F(" °C "));
  return String(IN4);
}

String getPressure() {
  float IN5 = bme.readPressure() / 133.3;
  Serial.print(" Давление: ");
  Serial.print(IN5);
  Serial.print(" мм.рт.ст ");
  return String(IN5);
}

String getHumidity() {
  float IN6 = bme.readHumidity();
  Serial.print(" Влажность: ");
  Serial.print(IN6);
  Serial.println(" %");
  return String(IN6);
}

// Уведомляем клиентов о текущем состоянии светодиода
void notifyClients1() {ws.textAll(String(ledState1));}
void notifyClients2() {ws.textAll(String(ledState2 + 2));}
void notifyClients3() {ws.textAll(String(ledState3 + 4));}
void notifyClients4() {ws.textAll(String(ledState4 + 6));}
void notifyClients5() {ws.textAll(String(ledState5 + 8));}

/* функция обратного вызова, которая запускается всякий раз, когда мы получаем новые
  данные от клиентов по протоколу WebSocket. Если мы получаем сообщение “toggle”, мы
  переключаем значение переменной ledState. Кроме того, мы уведомляем всех клиентов,
  вызывая функцию notifyClients (). Таким образом, все клиенты получают уведомление об
  изменении и соответствующим образом обновляют интерфейс.*/

void handleWebSocketMessage(void *arg, uint8_t *data, size_t len) {
  AwsFrameInfo *info = (AwsFrameInfo*)arg;
  if (info->final && info->index == 0 && info->len == len && info->opcode == WS_TEXT) {
    data[len] = 0;
    if (strcmp((char*)data, "toggle1") == 0) {ledState1 = !ledState1;notifyClients1();}
    if (strcmp((char*)data, "toggle2") == 0) {ledState2 = !ledState2;notifyClients2();}
    if (strcmp((char*)data, "toggle3") == 0) {ledState3 = !ledState3;notifyClients3();}
    if (strcmp((char*)data, "toggle4") == 0) {ledState4 = !ledState4;notifyClients4();}
    if (strcmp((char*)data, "toggle5") == 0) {ledState5 = !ledState5;notifyClients5();}
  }
}

// Настройка прослушивания событий для обработки различных асинхронных шагов протокола WebSocket
void onEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type,
             void *arg, uint8_t *data, size_t len) {
  switch (type) {
    case WS_EVT_CONNECT:                  // когда клиент вошел в систему
      Serial.printf("WebSocket client #%u connected from %s\n", client->id(), client->remoteIP().toString().c_str());
      break;
    case WS_EVT_DISCONNECT:               // когда клиент вышел из системы
      Serial.printf("WebSocket client #%u disconnected\n", client->id());
      break;
    case WS_EVT_DATA:                     // при получении пакета данных от клиента
      handleWebSocketMessage(arg, data, len);
      break;
    case WS_EVT_PONG:                     // в ответ на запрос ping
    case WS_EVT_ERROR:                    // при получении ошибки от клиента
      break;
  }
}

String processor(const String& var) {
  Serial.println(var);

    if(var == "DATA4"){
    return lastTemperature;
  }
  else if(var == "THRESHOLD"){
    return inputMessage;
  }
  else if(var == "ENABLE_ARM_INPUT"){
    return enableArmChecked;
  }

  if (var == "STATE1") {if (ledState1) {return "ON";} else {return "OFF";}}
  if (var == "STATE2") {if (ledState2) {return "ON";} else {return "OFF";}}
  if (var == "STATE3") {if (ledState3) {return "ON";} else {return "OFF";}}
  if (var == "STATE4") {if (ledState4) {return "ON";} else {return "OFF";}}
  if (var == "STATE5") {if (ledState5) {return "ON";} else {return "OFF";}}

  return String();         // эту строку возможно придется удалить
}

// Переменная флага для отслеживания того, были ли активированы триггеры или нет
bool triggerActive = false;
// Следующие переменные будут использоваться для проверки того, получили ли мы HTTP-запрос GET из этих полей ввода, и сохранения значений в переменные соответственно.
const char* PARAM_INPUT_1 = "threshold_input";
const char* PARAM_INPUT_2 = "enable_arm_input";

// Интервал между показаниями датчиков.
unsigned long previousMillis = 0;     
const long interval = 5000;

// Инициализация WebSocket
void initWebSocket() {
  ws.onEvent(onEvent);
  server.addHandler(&ws);
}

void setup() {
  // Последовательный порт для отладки
  Serial.begin(115200);

  pinMode(32, OUTPUT); digitalWrite(32, LOW);
  pinMode(33, OUTPUT); digitalWrite(33, LOW);
  pinMode(25, OUTPUT); digitalWrite(25, LOW);
  pinMode(26, OUTPUT); digitalWrite(26, LOW);
  pinMode(27, OUTPUT); digitalWrite(27, LOW);

    // Инициализация датчика BME280
  if (!bme.begin(0x76)) {
    Serial.println("Не обнаружен датчик BME280, проверьте соединение!");
    while (1);
  }

  // Настраиваем статический IP-адрес:
  if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
    Serial.println("Режим клиента не удалось настроить");
  }

  initSPIFFS();
  initWiFi();
  initWebSocket();

  //=============== Отправляем в браузер вэб страницу ==================

 // Маршрут до корневого каталога веб страницы
  server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
	request->send(SPIFFS, "/index.html", "text/html", false, processor);
  });

  // Маршрут для загрузки файла style.css
 server.on("/style.css", HTTP_GET, [](AsyncWebServerRequest * request) {
   request->send(SPIFFS, "/style.css", "text/css");
 });

 server.on("/script.js", HTTP_GET, [](AsyncWebServerRequest * request) {
   request->send(SPIFFS, "/script.js", "text/javascript");
 });

// Итак, мы проверяем, содержит ли запрос входные параметры, и сохраняем эти параметры в переменные:
  // Получите HTTP GET запрос по адресу <ESP_IP>/get?threshold_input=<inputMessage>&enable_arm_input=<inputMessage2>
  server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
/* Это часть кода, где переменные будут заменены значениями, представленными на форме. Переменная inputMessage 
сохраняет пороговое значение температуры, а переменная inputMessage2 сохраняет, установлен ли флажок или нет 
(если мы должны контролировать GPIO или нет)*/
    // ПОЛУЧИТЬ значение threshold_input on <ESP_IP>/get?threshold_input=<inputMessage>
    if (request->hasParam(PARAM_INPUT_1)) {
      inputMessage = request->getParam(PARAM_INPUT_1)->value();
      // ПОЛУЧИТЬ значение enable_arm_input on<ESP_IP>/get?enable_arm_input=<inputMessage2>
      if (request->hasParam(PARAM_INPUT_2)) {
        inputMessage2 = request->getParam(PARAM_INPUT_2)->value();
        enableArmChecked = "checked";
// Если флажок установлен, выполним эту часть кода
      }
      else {
        inputMessage2 = "false";
        enableArmChecked = "";
// Если флажок не установлен, выполним эту часть кода
 digitalWrite(32, ledState1);
 digitalWrite(33, ledState2);
 digitalWrite(25, ledState3);
 digitalWrite(26, ledState4);
 digitalWrite(27, ledState5);

      }
    }
    Serial.println(inputMessage);
    Serial.println(inputMessage2);
	
// После отправки значений в форме отображается новая страница с сообщением, что запрос был успешно отправлен в ESP32 со ссылкой для возврата на домашнюю страницу.
  request->send(200, "text/html;charset=utf-8", "HTTP GET запрос отправляется ESP32.<br><a href=\"/\">Вернутся на страницу</a>");
  });
  
  server.onNotFound(notFound);

  server.begin();  // Запуск веб сервера
}

void loop() {
  ws.cleanupClients();

//  digitalWrite(32, ledState1);
//  digitalWrite(33, ledState2);
//  digitalWrite(25, ledState3);
//  digitalWrite(26, ledState4);
//  digitalWrite(27, ledState5);
  
// таймеры для получения новых показаний температуры каждые 5 секунд.
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
  //  sensors.requestTemperatures();
  //  float IN4 = sensors.getTempCByIndex(0);
  float IN4 = bme.readTemperature()-1.04;
    Serial.print(IN4);
    Serial.println(" *C");
    
    lastTemperature = String(IN4);
    
/* Получив новое значение температуры, мы проверяем, находится ли она выше или ниже порогового значения, 
и соответственно включаем или выключаем выход.В этом примере мы устанавливаем выходное состояние на ВЫСОКОЕ, если выполняются все эти условия:
Текущая температура выше порога; Включено автоматическое управление выводом (флажок установлен на веб-странице);
Если выход еще не был запущен.*/
    
    // Проверьте, если температура выше порога и если она должна вызвать выход
    if(IN4 > inputMessage.toFloat() && inputMessage2 == "true" && !triggerActive){
      String message = String("Температура выше порога. Текущая температура: ") + 
        String(IN4) + String("C");
      Serial.println(message);
      triggerActive = true;
      digitalWrite(32, HIGH);
    }
// Затем, если температура опускается ниже порога, установите выход на НИЗКИЙуровень .
// Проверьте, не находится ли температура ниже порогового значения и не нужно ли вызвать выход
    else if((IN4 < inputMessage.toFloat()) && inputMessage2 == "true" && triggerActive) {
      String message = String("Температура ниже порога. Текущая температура: ") + 
       String(IN4) + String(" C");
// В зависимости от вашего приложения вы можете изменить выход на НИЗКИЙ, когда температура выше порога , и на ВЫСОКИЙ, когда выход ниже порога.
      Serial.println(message);
      triggerActive = false;
      digitalWrite(32, LOW);
    }
  }
}

Строки 224-229 перенес из void loop.

index.html

<!DOCTYPE HTML>
<html>
<head>
  <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="icon" href="data:,">
  <link rel="stylesheet" type="text/css" href="style.css">
  <title>ESP Web Server</title>
</head>
<body>
  <div class="topnav">
    <h1>ESP WebSocket Server</h1>
  </div>
  <div class="content">
    <div class="card">
      <h2>Out - GPIO 32</h2>
      <p class="state">Status: <span id="state1">%STATE1%</span></p>
      <p><button id="button1" class="button">Button 1</button></p>  
  <h2>Out - GPIO 33</h2>
      <p class="state">Status: <span id="state2">%STATE2%</span></p>
      <p><button id="button2" class="button">Button 2</button></p>
  <h2>Out - GPIO 25</h2>
      <p class="state">Status: <span id="state3">%STATE3%</span></p>
      <p><button id="button3" class="button">Button 3</button></p>
  <h2>Out - GPIO 26</h2>
      <p class="state">Status: <span id="state4">%STATE4%</span></p>
      <p><button id="button4" class="button">Button 4</button></p>
  <h2>Out - GPIO 27</h2>
      <p class="state">Status: <span id="state5">%STATE5%</span></p>
      <p><button id="button5" class="button">Button 5</button></p>
    </div>
  </div>
  <h2>BME280</h2> 
  <h3>%DATA4% &deg;C</h3>
  <form action="/get">
    Температурный порог <input type="number" step="0.1" name="threshold_input" value="%THRESHOLD%" required><br>
    Автоматика <input type="checkbox" name="enable_arm_input" value="true" %ENABLE_ARM_INPUT%><br><br>
    <input type="submit" value="Применить">
  </form>
  <script src="/script.js"></script>
</body>
</html>
 
java script
// ======================== Кнопки =====================================

  var gateway = `ws://${window.location.hostname}/ws`;
  var websocket;
  window.addEventListener('load', onLoad);
  function initWebSocket() {
    console.log('Trying to open a WebSocket connection...');
    websocket = new WebSocket(gateway);
    websocket.onopen    = onOpen;
    websocket.onclose   = onClose;
    websocket.onmessage = onMessage;
  }
  
  function onOpen(event) {
    console.log('Connection opened');
  }
  function onClose(event) {
    console.log('Connection closed');
    setTimeout(initWebSocket, 2000);
  }
 
  function onMessage(event) { 
    switch(event.data) {
      case '0': document.getElementById("state1").innerHTML = "OFF"; break
      case '1': document.getElementById("state1").innerHTML = "ON"; break
      case '2': document.getElementById("state2").innerHTML = "OFF"; break
      case '3': document.getElementById("state2").innerHTML = "ON"; break
      case '4': document.getElementById("state3").innerHTML = "OFF"; break
      case '5': document.getElementById("state3").innerHTML = "ON"; break
	  case '6': document.getElementById("state4").innerHTML = "OFF"; break
      case '7': document.getElementById("state4").innerHTML = "ON"; break
	  case '8': document.getElementById("state5").innerHTML = "OFF"; break
      case '9': document.getElementById("state5").innerHTML = "ON"; break
    }
    }
  
  function onLoad(event) {initWebSocket(); initButton();}

  function initButton() {
    document.getElementById('button1').addEventListener('click', toggle1);
	document.getElementById('button2').addEventListener('click', toggle2);
	document.getElementById('button3').addEventListener('click', toggle3);
	document.getElementById('button4').addEventListener('click', toggle4);
	document.getElementById('button5').addEventListener('click', toggle5);
  }
  
  function toggle1(){websocket.send('toggle1');}
  function toggle2(){websocket.send('toggle2');}
  function toggle3(){websocket.send('toggle3');}
  function toggle4(){websocket.send('toggle4');}
  function toggle5(){websocket.send('toggle5');}

style.css

html {

  font-family: Arial, Helvetica, sans-serif;
  text-align: center;  /* центровка кнопок внутри рамки */
}
h1 {
  font-size: 1.8rem;  /*размер шрифта заголовка "ESP WebSocket Server**/
  color: white;       /*цвет шрифта заголовка "ESP WebSocket Server" */
}
h2{
  font-size: 1.3rem;  /*размер шрифта Out-GPIO хх*/
  font-weight: bold;
  color: #143642;     /*цвет шрифта Out-GPIO хх*/
}
.topnav {
  overflow: hidden;
  background-color: #3f07db; /*цвет рамки надписи "ESP WebSocket Server*/
}
body {
  margin: 0;
}
.content {
  padding: 30px;     /* расстояние между заголовком и рамкой*/
  max-width: 600px;  /* ширина рамки*/
  margin: 0 auto;
}
.card {
  background-color: #F8F7F9; /* цвет рамки*/
  box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5);
  padding-top:10px;     /* отступ от первой кнопки до верхнего края рамки*/
  padding-bottom:20px;  /* отступ от последней кнопки до нижнего края рамки*/
}
.button {
  padding: 8px 23px;   /*высота и ширина кнопки*/
  font-size: 24px;      /*размер шрифта кнопки (размер кнопки адаптируется под размер шрифта)*/
  text-align: center;   /*центровка надписи внутри кнопки*/
  outline: none;
  color: #fff;                 /*цвет шрифта в кнопке*/
  background-color: #0f8b8d;   /*цвет кнопки*/
  border: none;
  border-radius: 5px;          /*радиус закругления углов кнопки*/
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
  -webkit-tap-highlight-color: rgba(0,0,0,0);
 }
/*  button:hover {background-color: #6b0f8c} /* Цвет кнопки при наведении */
 .button:active {
   background-color: #0f8b8d;
   box-shadow: 2 2px #CDCDCD;
   transform: translateY(2px);
 }
 .state {
   font-size: 1.0rem; /* размер шрифта статуса кнопки */
   color:#8c8c8c;     /* цвет активной кнопки*/
   font-weight: bold;
 }

 

Это я пытаюсь объеденить два разных проекта. В одном включение/отключение кнопок на вэб сокете, во втором термостат. Ставишь галку в положении "авто", выход GPIO32 работает от термостата. Если галка снята (положение "ручное") работает принудительное включение/отключение с помощью кнопки на вэб странице.

 

rkit
Offline
Зарегистрирован: 23.11.2016

Нет, не понятней. У тебя проц перезагружается при каждом запросе, что ли?

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

Вы про это?

request->send(SPIFFS, "/index.html", "text/html", false, processor);

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Adolf_Balalaykin пишет:

andriano пишет:

Adolf_Balalaykin, Вы уж определитесь, что Вам нужно: перенести в setup или чтобы выполнялось "с периодичностью".

Определился. В сетапе с переодичностью. Если бы просто выполнить с периодичностью, то оставил бы в лупе и сюда не писал. Но в данном случае нужно впихать именно в else для проверки соответсвия под уже действующее условие. 

А какая связь между setup и else?

Нет, если есть особое желание, можно, конечно, сделать и "с периодичностью" из setup. Но это неверное архитектурное решение из-за которого не будет работать loop. 

В общем, пока я вижу ситуацию такой: у Вас есть некоторая идея-фикс, которую Вы не хотите сообщать общественности, но почему-то решили, что она может быть реализована только из setup. 

Вы объясните, чего хотите. Не в терминах решения (setup, loop, if/else, чего-то еще), а в терминах самой задачи. И, думаю, Вам подскажут, как это сделать, не прибегая к извращениям типа "периодичность в setup".

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

andriano пишет:

В общем, пока я вижу ситуацию такой: у Вас есть некоторая идея-фикс, которую Вы не хотите сообщать общественности, но почему-то решили, что она может быть реализована только из setup. 

Вы объясните, чего хотите. Не в терминах решения (setup, loop, if/else, чего-то еще), а в терминах самой задачи. И, думаю, Вам подскажут, как это сделать, не прибегая к извращениям типа "периодичность в setup".

Да нет никакого секрета. Выше я написал о своей цели. Хотел объеденить два проекта. Этот  https://randomnerdtutorials.com/esp32-websocket-server-arduino/#more-99437 и вот этот https://randomnerdtutorials.com/esp32-esp8266-thermostat-web-server/ В двух словах, необходимо получить управляемый выход. Который бы управлялся в двух режимах.

1. Режим "Авто" - (галка установлена) на выходе имеем 1 или 0 в зависимости от заданной температуры.

2. Режим "Ручной" - (галка снята) По нажатию кнопки на выходе имеем 1 или 0.

При этом статус кнопки "ON" или "OFF" должен отображатся корректно хоть в ручном, хоть в автоматическом режиме. Застрял на пол пути. Проблема озвучена выше. Перетащив фрагмент кода из loop в сетап вопрос частично решен. Но как вы правильно заметели, ни о какой переодичности говорить не приходится. Конечно есть другой путь, но для этого надо переписать часть кода. А в этом у меня не хватает знаний.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

setup() выполняется ОДИН раз, при включении питания. Будешь дальше тупить - будет только глум.

b707
Offline
Зарегистрирован: 26.05.2017

Adolf_Balalaykin пишет:

При этом статус кнопки "ON" или "OFF" должен отображатся корректно хоть в ручном, хоть в автоматическом режиме. Застрял на пол пути. Проблема озвучена выше.

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

Цитата:
Перетащив фрагмент кода из loop в сетап вопрос частично решен.

это было неверное решение. Но. похоже, вы настолько мало понимаете в коде. что не только решить проблему - а даже обьяснить в чем она толком не можете.

Стоит немного поднять свой уровень с помощью учебников, прежде чем двигаться дальше

 

PS непонятно, что эта тема делает в "программировании"

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021
wdrakula пишет:
 
setup() выполняется ОДИН раз, при включении питания. Будешь дальше тупить - будет только глум.
 
Очень информативный ответ! Мы что на ты уже перешли?
Вы вообще внимательно читали прежде чем свои пять копеек вставить?  Или решили по своему блеснуть умом?
 
Adolf_Balalaykin пишет:
 (оно и понятно, потому как действие "Б" выполнятеся лишь однократно).
 
 
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Adolf_Balalaykin пишет:

Определился. В сетапе с переодичностью.

Твоя цитата? И ты считаешь, что ты не му..ак, так я понимаю? Не могу согласиться.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Adolf_Balalaykin пишет:

Если сделать так:
void setup() {
if (бла..бла..бла)
 {
  // действие A
}
else
{
  // действие Б - а именно
  digitalWrite(32, ledState1);
  digitalWrite(33, ledState2);
  digitalWrite(25, ledState3);
  digitalWrite(26, ledState4);
  digitalWrite(27, ledState5);
 }
}
Выполнение происходит только при каждом обновлении страницы

Это тоже сам написал, никто не принуждал? И снова считаешь, что ты не му..ак?

Adolf_Balalaykin
Offline
Зарегистрирован: 01.02.2021

b707 пишет:

это было неверное решение. Но. похоже, вы настолько мало понимаете в коде. что не только решить проблему - а даже обьяснить в чем она толком не можете.Стоит немного поднять свой уровень с помощью учебников, прежде чем двигаться дальше PS непонятно, что эта тема делает в "программировании"

[/quote]

У меня все еще впереди. Я лишь пару месяцев как взялся за это дело. Видимо я ошибся форумом. Наводящих вопросов было куча, много флуда и никакой информативности. Всем спасибо кто реально попытался помочь!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Adolf_Balalaykin, огрызаться Вы, конечно, горазды. Но только это вряд ли приблизит Вас к решению Вашей проблемы.

Лучше бы отвечали на вопросы: в посте №10 я Вас спросил:

А какая связь между setup и else?

b707
Offline
Зарегистрирован: 26.05.2017

Adolf_Balalaykin пишет:

Всем спасибо кто реально попытался помочь!

не обманывай себя, пока таких в ветке не отмечено. Невозможно помочь тому. кто сам еще не знает. что ему надо...

Rumata
Rumata аватар
Offline
Зарегистрирован: 29.03.2019

Adolf_Balalaykin пишет:

У меня все еще впереди.

Это вряд ли. Прогресс на 4,5 месяца нулевой. Вам придется превзойти по продолжительности жизни дубы в Коломенском лесопарке... 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Adolf_Balalaykin пишет:

 Видимо я ошибся форумом.

Да,  ошибся. Нельзя тебе помочь. После фразы о переносе в "сетап" становится понятно, что тебе нужно читать лекцию, часа на два (и бесплатно!), о работе контроллера и даже об устройстве веб-сервера на нем, хотя похоже ты из мира "веб-программистов" к нам свалился.

Если ты начинающий, то и начинай нормально, с того, что понимаешь. Даже если это веб сервер. К примеру - пусть пара диодиков моргает с разными частотами, а через веб морду - управлять этими частотами, или пусть на экране часики стрелками крутят через веб-сокет. И все это по шагам, от простого примера с диодом и кнопкой, и добавлением по ступеньке. Тогда можно будет будет, пусть и не сразу, хоть на одном языке объяснить, почему ты в первом сообщении написал полную херню, доходчиво?

А пока так: либо засовываешь свое самолюбие глубоко в жопу и слушаешь по шагам. Путь сам выбирай - начни с такого кода, который понимаешь и будем добавлять по одному элементу за раз. Я сам и помогу.

Или - скатертью ... дорога ;))

lilik
Offline
Зарегистрирован: 19.10.2017

Adolf_Balalaykin пишет:

Приветсвую!
Например имеем такой цикл
void loop() {
digitalWrite(32, ledState1);
digitalWrite(33, ledState2);
digitalWrite(25, ledState3);
digitalWrite(26, ledState4);
digitalWrite(27, ledState5);
}
Где ledState..есть HIGH или LOW в зависимости настроения моей тёщи.
Его необходимо перенести в void setup() {.....} под контроль оператора If..else
Если сделать так:
void setup() {
if (бла..бла..бла)
 {
  // действие A
}
else
{
  // действие Б - а именно
  digitalWrite(32, ledState1);
  digitalWrite(33, ledState2);
  digitalWrite(25, ledState3);
  digitalWrite(26, ledState4);
  digitalWrite(27, ledState5);
 }
}
Выполнение происходит только при каждом обновлении страницы (оно и понятно, потому как действие "Б" выполнятеся лишь однократно).
Как сделать так, что бы действие "Б" выполнялось с определенной переодичностью? Например каждые 5 сек. Пологаю через функцию в java скрипт? Подкиньте пример если не сложно. А то я не силен.
Большое спасибо!

 

Введите переменную- флаг с присвоением значения в сетап, а в лууп по условию её значения делайте свои "Б".