If..else с периодичностью.
- Войдите на сайт для отправки комментариев
Ср, 16/06/2021 - 10:59
Приветсвую!
Например имеем такой цикл
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 скрипт? Подкиньте пример если не сложно. А то я не силен.
Большое спасибо!
Балалайка, ну очень просто. "Пологаю", типа:
every(5000)
action();
Не?
Нет, совсем не понятно. Откуда вылезли страницы какие-то?
Нет, совсем не понятно. Откуда вылезли страницы какие-то?
Adolf_Balalaykin, Вы уж определитесь, что Вам нужно: перенести в setup или чтобы выполнялось "с периодичностью".
Всё равно не понятно. Как setup связан со страницей?
Adolf_Balalaykin, Вы уж определитесь, что Вам нужно: перенести в 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% °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>// ======================== Кнопки ===================================== 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 работает от термостата. Если галка снята (положение "ручное") работает принудительное включение/отключение с помощью кнопки на вэб странице.
Нет, не понятней. У тебя проц перезагружается при каждом запросе, что ли?
Вы про это?
request->send(SPIFFS, "/index.html", "text/html", false, processor);
Adolf_Balalaykin, Вы уж определитесь, что Вам нужно: перенести в setup или чтобы выполнялось "с периодичностью".
А какая связь между setup и else?
Нет, если есть особое желание, можно, конечно, сделать и "с периодичностью" из setup. Но это неверное архитектурное решение из-за которого не будет работать loop.
В общем, пока я вижу ситуацию такой: у Вас есть некоторая идея-фикс, которую Вы не хотите сообщать общественности, но почему-то решили, что она может быть реализована только из setup.
Вы объясните, чего хотите. Не в терминах решения (setup, loop, if/else, чего-то еще), а в терминах самой задачи. И, думаю, Вам подскажут, как это сделать, не прибегая к извращениям типа "периодичность в setup".
В общем, пока я вижу ситуацию такой: у Вас есть некоторая идея-фикс, которую Вы не хотите сообщать общественности, но почему-то решили, что она может быть реализована только из 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 в сетап вопрос частично решен. Но как вы правильно заметели, ни о какой переодичности говорить не приходится. Конечно есть другой путь, но для этого надо переписать часть кода. А в этом у меня не хватает знаний.
setup() выполняется ОДИН раз, при включении питания. Будешь дальше тупить - будет только глум.
При этом статус кнопки "ON" или "OFF" должен отображатся корректно хоть в ручном, хоть в автоматическом режиме. Застрял на пол пути. Проблема озвучена выше.
если вы думаете. что вы что-то обьяснили - то я вас огорчу, написана сплошная белиберда.
это было неверное решение. Но. похоже, вы настолько мало понимаете в коде. что не только решить проблему - а даже обьяснить в чем она толком не можете.
Стоит немного поднять свой уровень с помощью учебников, прежде чем двигаться дальше
PS непонятно, что эта тема делает в "программировании"
Определился. В сетапе с переодичностью.
Твоя цитата? И ты считаешь, что ты не му..ак, так я понимаю? Не могу согласиться.
void setup() { if (бла..бла..бла) { // действие A } else { // действие Б - а именно digitalWrite(32, ledState1); digitalWrite(33, ledState2); digitalWrite(25, ledState3); digitalWrite(26, ledState4); digitalWrite(27, ledState5); } }Это тоже сам написал, никто не принуждал? И снова считаешь, что ты не му..ак?
это было неверное решение. Но. похоже, вы настолько мало понимаете в коде. что не только решить проблему - а даже обьяснить в чем она толком не можете.Стоит немного поднять свой уровень с помощью учебников, прежде чем двигаться дальше PS непонятно, что эта тема делает в "программировании"
[/quote]
У меня все еще впереди. Я лишь пару месяцев как взялся за это дело. Видимо я ошибся форумом. Наводящих вопросов было куча, много флуда и никакой информативности. Всем спасибо кто реально попытался помочь!
Adolf_Balalaykin, огрызаться Вы, конечно, горазды. Но только это вряд ли приблизит Вас к решению Вашей проблемы.
Лучше бы отвечали на вопросы: в посте №10 я Вас спросил:
А какая связь между setup и else?
Всем спасибо кто реально попытался помочь!
не обманывай себя, пока таких в ветке не отмечено. Невозможно помочь тому. кто сам еще не знает. что ему надо...
У меня все еще впереди.
Это вряд ли. Прогресс на 4,5 месяца нулевой. Вам придется превзойти по продолжительности жизни дубы в Коломенском лесопарке...
Видимо я ошибся форумом.
Да, ошибся. Нельзя тебе помочь. После фразы о переносе в "сетап" становится понятно, что тебе нужно читать лекцию, часа на два (и бесплатно!), о работе контроллера и даже об устройстве веб-сервера на нем, хотя похоже ты из мира "веб-программистов" к нам свалился.
Если ты начинающий, то и начинай нормально, с того, что понимаешь. Даже если это веб сервер. К примеру - пусть пара диодиков моргает с разными частотами, а через веб морду - управлять этими частотами, или пусть на экране часики стрелками крутят через веб-сокет. И все это по шагам, от простого примера с диодом и кнопкой, и добавлением по ступеньке. Тогда можно будет будет, пусть и не сразу, хоть на одном языке объяснить, почему ты в первом сообщении написал полную херню, доходчиво?
А пока так: либо засовываешь свое самолюбие глубоко в жопу и слушаешь по шагам. Путь сам выбирай - начни с такого кода, который понимаешь и будем добавлять по одному элементу за раз. Я сам и помогу.
Или - скатертью ... дорога ;))
void loop() { digitalWrite(32, ledState1); digitalWrite(33, ledState2); digitalWrite(25, ledState3); digitalWrite(26, ledState4); digitalWrite(27, ledState5); }void setup() { if (бла..бла..бла) { // действие A } else { // действие Б - а именно digitalWrite(32, ledState1); digitalWrite(33, ledState2); digitalWrite(25, ledState3); digitalWrite(26, ledState4); digitalWrite(27, ledState5); } }Введите переменную- флаг с присвоением значения в сетап, а в лууп по условию её значения делайте свои "Б".