Arduino uno wifi rev2 застрял внутри цикла

Возможно глупый вопрос, но я не могу понять. При запуске кода ниже. Я хочу открыть коробку, когда код совпадет с кодом в API. Это все работает. Я даже могу закрыть коробку послесловием. Но тогда я застрял в своей петле. после того, как окно закрыто, я хочу, чтобы на экране было написано, что окно закрыто, а затем я хочу, чтобы цикл void() снова запускался. поэтому мой экран снова запрашивает код. Я пытался использовать перерыв и выход, но пока не повезло. весь код:

/* hardware libraries*/
#include <Key.h>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

/*Wifi and request libraries*/
#include <SPI.h>
#include <WiFiNINA.h>
#include <ArduinoJson.h>

#define HIGH 0x1
#define LOW 0x0

/* wifi credentials*/
char ssid[] = "ssid";        // SSID вашей сети (имя)
char pass[] = "password";    // ваш сетевой пароль (используйте для WPA или используйте в качестве ключа для WEP)
int keyIndex = 0;

int status = WL_IDLE_STATUS;
char server[] = "parcelbox.1819.caro.deweze.nxtmediatech.eu";
// Инициализируем клиентскую библиотеку Ethernet
// с IP-адресом и портом сервера
// к которому вы хотите подключиться (порт 80 по умолчанию для HTTP):
WiFiClient client;

LiquidCrystal_I2C lcd(0x27, 16, 2); // ЖК-объект
Servo myservo; //сервообъект
boolean boxOpenend = false ;

/* Keypad*/
const byte ROWS = 4;
const byte COLS = 3;

char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

byte rowPins[ROWS] = {3, 4, 5, 6};
byte colPins[COLS] = {9, 8, 7};

Keypad customKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String value = "";

void setup() {
  lcd.begin(); // запуск ЖК
  Serial.begin(9600);
  myservo.attach(A0); // прикрепляем сервопривод к штифту
  lcd.backlight(); // начальный экранный свет

  /* connect to wifi */
  while (!Serial) {
    ; // ждем подключения последовательного порта. Требуется только для родного порта USB
  }

  // проверяем модуль WiFi:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // не продолжать
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < "1.0.0") {
    Serial.println("Please upgrade the firmware");
  }

  // попытка подключения к сети Wi-Fi:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Подключиться к сети WPA/WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:
    status = WiFi.begin(ssid, pass);

    // ждем 10 секунд для соединения:
    delay(10000);
  }
  Serial.println("Connected to wifi");
  printWifiStatus();
}

void loop() {
  lcd.clear();
  lcd.print("Geef bestelcode");
  char customKey = customKeypad.getKey();   // получаем нажатие клавиши
  value = value + String(customKey);
  lcd.setCursor(0, 1);
  lcd.print(value);
  if (customKey == '#') {

    String response_Status = "";
    Serial.println("\nStarting connection to server...");

    // если вы установили соединение, сообщите об этом через последовательный порт:
    if (client.connect(server, 80)) {

      value.remove(16);
      Serial.println(value);
      Serial.println("connected to server");

      // Делаем HTTP-запрос:
      client.println("GET /api/boxes/1444/code/" + value + " HTTP/1.1");
      client.println("Host: parcelbox.1819.caro.deweze.nxtmediatech.eu");
      client.println("Connection: close");
      client.println();
    }
    // если есть доступные входящие байты
    // с сервера, прочитать их и распечатать:
    StaticJsonBuffer<500> jsonBuffer;

    while (client.connected()) {

      String response = "";
      bool begin = false;

      while (client.available() || !begin) {
        char c = client.read();

        if (c == '{') {
          begin = true;
        }
        if (begin) response += (c);
        if (c == '"}') {
          break;
        }
        delay(1);
      }
      int start = response.indexOf("status\":\"") + 11;
      int end = start + 3;
      response_Status = response.substring(start, end);

      JsonObject& root = jsonBuffer.parseObject(response);

      if (!root.success())
      {
        Serial.print("parseObject(");
        Serial.print(response);
        Serial.println(") failed");
        break;
      }

      Serial.println(response_Status);
      if (response_Status == "200") {

        Serial.println("200");
        boxOpenend = true;

        while (boxOpenend) {

          lcd.clear();
          lcd.print("Box openend ,press");
          lcd.setCursor(0, 1);
          lcd.print(" * to close");

          myservo.write(0);// повернуть сервопривод, чтобы открыть
          delay(175);

          char key = customKeypad.getKey();   // получаем нажатие клавиши
          //значение = значение + строка (ключ);

          if (key == '*') {
            myservo.write(90); // повернуть сервопривод, чтобы заблокировать
            value = "";                           // очистить строку
            boxOpenend = false;

          }
          // коробка возвращается, но я застрял в этом цикле, потому что ЖК-экран остается на «Ящик открыт, нажмите *, чтобы закрыть
        }

      }
      else if (response_Status != "200") {

        Serial.println("not 200");

        lcd.clear();
        lcd.print("wrong code or");
        lcd.setCursor(0, 1);
        lcd.print("already deliverd");

        delay(175);
        value = "";
        exit;
      }
      // то же самое
      break ;
    }
    // если сервер отключен, останавливаем клиент:
    if (!client.connected()) {
      Serial.println();
      Serial.println("disconnecting from server.");
      client.stop();

      // ничего не делать навсегда:
      while (true);
    }
    exit;
  }

  if (customKey == '*') {
    myservo.write(90);                   // повернуть сервопривод, чтобы заблокировать
    value = "";                           // очистить строку
  }

  delay(175); // для оптимального просмотра ЖК-экрана
}

void printWifiStatus() {
  // вывести SSID сети, к которой вы подключены:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // напечатать IP-адрес вашей платы:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // вывести мощность принятого сигнала:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Здесь код застревает. Он продолжает показывать открытое окно, нажмите *, чтобы закрыть. даже когда я нажимаю * и окно закрывается, оно продолжает говорить это

while (boxOpenend) {

          lcd.clear();
          lcd.print("Box openend ,press");
          lcd.setCursor(0, 1);
          lcd.print(" * to close");

          myservo.write(0);// повернуть сервопривод, чтобы открыть
          delay(175);

          char key = customKeypad.getKey();   // получаем нажатие клавиши
          //значение = значение + строка (ключ);

          if (key == '*') {
            myservo.write(90); // повернуть сервопривод, чтобы заблокировать
            value = "";                           // очистить строку
            boxOpenend = false;

          }
          // box gaat terug toe maar ik blijf in deze loop zitten want lcd scherm blijft staan op "Box geopend, druk * om te sluiten
        }

      }

Возможно, у него есть простое решение, о котором я просто не думаю, но оно меня очень беспокоит!

ОБНОВЛЕНИЕ. Мы немного продвинулись в выяснении причин, по которым это не работает. код, который мы запускаем сейчас:

/* hardware libraries*/
#include <Key.h>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

/*Wifi and request libraries*/
#include <SPI.h>
#include <WiFiNINA.h>
#include <ArduinoJson.h>

#define HIGH 0x1
#define LOW 0x0

/* wifi credentials*/
char ssid[] = "XXXXXXX";        // SSID вашей сети (имя)
char pass[] = "XXXXXXX";    // ваш сетевой пароль (используйте для WPA или используйте в качестве ключа для WEP)
int keyIndex = 0;

int status = WL_IDLE_STATUS;
char server[] = "parcelbox.1819.caro.deweze.nxtmediatech.eu";
// Инициализируем клиентскую библиотеку Ethernet
// с IP-адресом и портом сервера
// к которому вы хотите подключиться (порт 80 по умолчанию для HTTP):
WiFiClient client;

LiquidCrystal_I2C lcd(0x27, 16, 2); // ЖК-объект
Servo myservo; //сервообъект
boolean boxOpenend = false ;

/* Keypad*/
const byte ROWS = 4;
const byte COLS = 3;

char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

byte rowPins[ROWS] = {3, 4, 5, 6};
byte colPins[COLS] = {9, 8, 7};

Keypad customKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String value = "";

void setup() {
  lcd.begin(); // запуск ЖК
  Serial.begin(9600);
  myservo.attach(A0); // прикрепляем сервопривод к штифту
  lcd.backlight(); // начальный экранный свет

  /* connect to wifi */
  while (!Serial) {
    ; // ждем подключения последовательного порта. Требуется только для родного порта USB
  }

  // проверяем модуль WiFi:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // не продолжать
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < "1.0.0") {
    Serial.println("Please upgrade the firmware");
  }

  // попытка подключения к сети Wi-Fi:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Подключиться к сети WPA/WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:
    status = WiFi.begin(ssid, pass);

    // ждем 10 секунд для соединения:
    delay(10000);
  }
  Serial.println("Connected to wifi");
  printWifiStatus();
}

void loop() {
  lcd.clear();
  lcd.print("Geef bestelcode");

  char customKey = customKeypad.getKey();   // получаем нажатие клавиши
  value = value + String(customKey);

  lcd.setCursor(0, 1);
  lcd.print(value);


  if (customKey == '#') 
  {
  Serial.println("PRESSED #");
    String response_Status = "";
    Serial.println("\nStarting connection to server...");

  Serial.println("RESULT OF CLIENT.CONNECT()");
  Serial.println(client.connect(server, 80));

    // если вы установили соединение, сообщите об этом через последовательный порт:
    if (client.connect(server, 80) == 1) 
  {
    Serial.println("IK BEN HIER");
    value.remove(4);
    Serial.println(value);
    Serial.println("connected to server");

    // Делаем HTTP-запрос:
    client.println("GET /api/boxes/1444/pin/" + value + " HTTP/1.1");
    client.println("Host: parcelbox.1819.caro.deweze.nxtmediatech.eu");
    client.println("Connection: close");
    client.println();
  } 
  else 
  {
    Serial.println("client.connect() not successfull");
  }

    // если есть доступные входящие байты
    // с сервера, прочитать их и распечатать:
    StaticJsonBuffer<500> jsonBuffer;

    if (client.connected()) 
  {
    Serial.println("CLIENT CONNECTED");

    String response = "";
    bool begin = false;

    while (client.available() || !begin) {
      char c = client.read();

      if (c == '{') {
        begin = true;
      }

      if (begin) {
        response += (c);
      }

      if (c == '"}') {
        break;
      }

      delay(1);
    }

    int start = response.indexOf("status\":\"") + 11;
    int end = start + 3;

    response_Status = response.substring(start, end);
    Serial.println(response_Status);

    // ответ успешен
    if (response_Status == "200")
    {
      Serial.println("RESPONSE 200");
      Serial.println("response state == 200");

      // Сначала открываем коробку
      // 0° означает открытое
      Serial.println("OPEN BOX");
      myservo.write(0);
      delay(175);

      lcd.setCursor(0, 0);
      lcd.print("                ");
      lcd.setCursor(0, 0);
      lcd.print("Box opened ,press");
      lcd.setCursor(0, 1);
      lcd.print("                ");
      lcd.setCursor(0, 1);
      lcd.print(" * to close");
    }
    else 
    {
      Serial.println("RESPONSE NOT 200");
      Serial.println("not 200");

      lcd.clear();
      lcd.print("Foute code of");
      lcd.setCursor(0, 1);
      lcd.print("al afgeleverd");

      delay(175);
    }
    }

  // сброс значения
  value = "";
  }

  // заблокировать ящик и сбросить значение
  if (customKey == '*') 
  {
    Serial.println("CLOSE BOX");
    myservo.write(90); 
    value = "";
    client.stop();
  }

  delay(175); // для оптимального просмотра ЖК-экрана
}

void printWifiStatus() {
  // вывести SSID сети, к которой вы подключены:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // напечатать IP-адрес вашей платы:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // вывести мощность принятого сигнала:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

это последовательный вывод: последовательный вывод

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

, 👍2

Обсуждение

Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат](https://chat.stackexchange.com/rooms/103266/discussion-on-question-by-imkevr-arduino-uno-wifi-rev2-stuck-inside-loop)., @VE7JRO


2 ответа


1

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

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

#include <Key.h>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#include <SPI.h>
#include <WiFiNINA.h>
#include <ArduinoJson.h>

#define HIGH 0x1
#define LOW 0x0

char ssid[] = "ssid";
char pass[] = "password";
int keyIndex = 0;

int status = WL_IDLE_STATUS;
char server[] = "parcelbox.1819.caro.deweze.nxtmediatech.eu";

WiFiClient client;

LiquidCrystal_I2C lcd(0x27, 16, 2);
Servo myservo;

/* Keypad*/
const byte ROWS = 4;
const byte COLS = 3;

char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

byte rowPins[ROWS] = {3, 4, 5, 6};
byte colPins[COLS] = {9, 8, 7};

Keypad customKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String value = "";

void setup() 
{
  lcd.begin();
  Serial.begin(9600);
  myservo.attach(A0);
  lcd.backlight();

  if (WiFi.status() == WL_NO_MODULE) 
  {
    Serial.println("Communication with WiFi module failed!");
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < "1.0.0") { Serial.println("Please upgrade the firmware"); }

  // попытка подключения к сети Wi-Fi:
  while (status != WL_CONNECTED) 
  {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);
    delay(10000);
  }

  Serial.println("Connected to wifi");
  printWifiStatus();
}

void loop() 
{
  lcd.clear();
  lcd.print("Geef bestelcode");
  char customKey = customKeypad.getKey();
  value = value + String(customKey);
  lcd.setCursor(0, 1);
  lcd.print(value);
  if (customKey == '#') 
  {
    String response_Status = "";
    Serial.println("\nStarting connection to server...");

    if ( client.connect( server, 80 ) ) 
    {
      value.remove(16);
      Serial.println(value);
      Serial.println("connected to server");

      // Делаем HTTP-запрос:
      client.println("GET /api/boxes/1444/code/" + value + " HTTP/1.1");
      client.println("Host: parcelbox.1819.caro.deweze.nxtmediatech.eu");
      client.println("Connection: close");
      client.println();
    }

    StaticJsonBuffer<500> jsonBuffer;

    if ( client.connected() ) 
    {
      String response = "";
      bool begin = false;

      // Я не понимаю, почему вы должны использовать || ! начинать
      // Если у клиента нет доступного контента, вы не можете прочитать некоторые
      // Не имеет значения, имеет ли значение begin значение true или false.
      // Или я что-то пропустил?
      while ( client.available() || ! begin ) 
      {
        char c = client.read();

        if ( c == '{' )  { begin = true;    }
        if ( begin )     { response += (c); }
        if ( c == '"}' ) { break;           }

        delay(1);
      }

      // Зачем вы разбираете текст json для специального
      // атрибут, а затем снова разобрать его в объект json
      // где можно прочитать этот атрибут?
      int start = response.indexOf("status\":\"") + 11;
      int end = start + 3;
      response_Status = response.substring(start, end);

// Я закомментировал это, потому что вы не используете корневую переменную
// в следующем коде
// JsonObject& корень = jsonBuffer.parseObject(ответ);
// если (!root.success())
// {
// Serial.print("parseObject(");
// Serial.print(ответ);
// Serial.println(") не удалось");
// перерыв;
// }

      Serial.println(response_Status);
      if (response_Status == "200") 
      {
        Serial.println("response state == 200");

        // Сначала открываем коробку

        // 0° означает открытое
        myservo.write(0);
        delay(175);

        // Затем сообщаем пользователю, как его закрыть

        lcd.clear();
        // Я добавил позиционирование курсора.
        // Насколько я знаю, clear не сбрасывает курсор.
        lcd.setCursor(0, 0);
        lcd.print("Box openend ,press");
        lcd.setCursor(0, 1);
        lcd.print(" * to close");

        // затем проверяем, хочет ли пользователь закрыть его
        char key;
        do 
        {
          key = customKeypad.getKey();
          if (key == '*') 
          {
            // 90° означает блокировку
            myservo.write(90);
            value = "";
          }
        }
        while( key != '*' );

      }
      else
      {
      // Я заменил else if на простой if
      // as (response_Status != "200") - это еще случай
      // из (response_Status == "200")
        Serial.println("response state != 200");

        lcd.clear();
        // добавлено "установить курсор"
        lcd.setCursor(0, 0);
        lcd.print("wrong code or");
        lcd.setCursor(0, 1);
        lcd.print("already deliverd");

        delay(175);
        value = "";
      }
      // я превращаю цикл while в блок if
      // поэтому вам не нужен перерыв; здесь
    }

// Здесь вы можете войти в состояние остановки без причины.
// Даже вы не собираетесь здесь останавливаться.
// если (!client.connected())
// {
// Serial.println();
// Serial.println("отключение от сервера.");
// клиент.стоп();
//
// // ничего не делать навсегда:
// пока (истина);
// }
  }

  if (customKey == '*') 
  {
    // 90° означает блокировку
    myservo.write(90); 
    value = "";     
  }

  // для оптимального просмотра ЖК-экрана
  delay(175);
}

void printWifiStatus() 
{
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Это изменение связано с обновленной версией вашей программы.

Если вы закрываете окно нажатием клавиши, вы также останавливаете клиент с последней строкой.

Удалите следующую строку из программы.

// заблокировать ящик и сбросить значение
if (customKey == '*') 
{
  Serial.println("CLOSE BOX");
  myservo.write(90); 
  value = "";
  // удалите это, так как вы не можете подключиться к остановленному клиенту
  // клиент.стоп();
}
,

Я попробовал ваш код, он отлично строится, я мог открыть коробку и закрыть ее, но на ЖК-дисплее продолжает отображаться «коробка открыта, нажмите *, чтобы закрыть». Ваш код намного читабельнее и структурированнее моего! я могу многому научиться из этого, @imkeVr

Спасибо за ответ и расширение вашего вопроса. Посмотрев на свой код, я увидел, что совершил ужасную ошибку. Возможно, я слишком долго программировал на JavaScript. В JS "" и '' одно и то же. В C/C++ это что-то совершенно другое. Строка while(key != "*") всегда истинна, и Цикл никогда не покидает. Я исправил это в своем ответе. пока (ключ!= '*'). Не могли бы вы также изменить его в своей программе и попробовать эту версию., @Peter Paul Kiefer

@imkeVr Я только что понял, что теперь вы используете совершенно другой код. И было бы лучше, если бы я заглянул в вывод раньше. ;-) Я не верю, что Сервер нарушил связь с клиентом. Я думаю, что вы просто не в состоянии открыть соединение с клиентом, который остановлен. Я обновлю ответ еще раз. ;-), @Peter Paul Kiefer

Я нашел способ, который работает для моей программы. Я поцарапал настройку Wi-Fi в настройке пустоты и переместил ее в свою собственную функцию вне какого-либо цикла или настройки. Таким образом, я мог бы вызвать функцию и восстановить соединение внутри самого цикла пустоты. Теперь он работает как надо. Спасибо за всю помощь, я многому научился, делая это!, @imkeVr

@imkeVr Было приятно с вами работать. Сначала я хотел предложить то, что вы сейчас сделали сами, но я не хотел слишком усложнять свой ответ. И теперь я вижу, что ты справился с этим, используя ту немногочисленную информацию, которую я тебе дал. Это один из моментов, который заставляет меня отвечать на вопросы по SE. И я мог представить, что, если продолжать быстро учиться, наш разговор в будущем будет с измененными рулонами. Я спрашиваю, а ты отвечаешь. Желаю вам и вашему партнеру успехов в проекте., @Peter Paul Kiefer


2
/* hardware libraries*/
#include <Key.h>
#include <Keypad.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>

/*Wifi and request libraries*/
#include <SPI.h>
#include <WiFiNINA.h>
#include <ArduinoJson.h>

#define HIGH 0x1
#define LOW 0x0

/* wifi credentials*/
char ssid[] = "sidd";        // SSID вашей сети (имя)
char pass[] = "pass";    // ваш сетевой пароль (используйте для WPA или используйте в качестве ключа для WEP)
int keyIndex = 0;

int status = WL_IDLE_STATUS;
char server[] = "parcelbox.1819.caro.deweze.nxtmediatech.eu";
// Инициализируем клиентскую библиотеку Ethernet
// с IP-адресом и портом сервера
// к которому вы хотите подключиться (порт 80 по умолчанию для HTTP):
WiFiClient client;

LiquidCrystal_I2C lcd(0x27, 16, 2); // ЖК-объект
Servo myservo; //сервообъект
boolean boxOpenend = false ;

/* Keypad*/
const byte ROWS = 4;
const byte COLS = 3;

char keys[ROWS][COLS] = {
  {'1', '2', '3'},
  {'4', '5', '6'},
  {'7', '8', '9'},
  {'*', '0', '#'}
};

byte rowPins[ROWS] = {3, 4, 5, 6};
byte colPins[COLS] = {9, 8, 7};

Keypad customKeypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
String value = "";

void setup() {
  lcd.begin(); // запуск ЖК
  Serial.begin(9600);
  myservo.attach(A0); // прикрепляем сервопривод к штифту
  lcd.backlight(); // начальный экранный свет

  /* connect to wifi */
  while (!Serial) {
    ; // ждем подключения последовательного порта. Требуется только для родного порта USB
  }
  /*
    // проверяем модуль WiFi:
    if (WiFi.status() == WL_NO_MODULE) {
      Serial.println("Communication with WiFi module failed!");
      // не продолжать
      while (true);
    }

    String fv = WiFi.firmwareVersion();
    if (fv < "1.0.0") {
      Serial.println("Please upgrade the firmware");
    }

    // попытка подключения к сети Wi-Fi:
    while (status != WL_CONNECTED) {
      Serial.print("Attempting to connect to SSID: ");
      Serial.println(ssid);
      // Подключиться к сети WPA/WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:
      status = WiFi.begin(ssid, pass);

      // ждем 10 секунд для соединения:
      delay(10000);
    }
    Serial.println("Connected to wifi");*/
  createConnection();
}

void loop() {
  lcd.clear();
  lcd.print("Bestelcode / pin");

  char customKey = customKeypad.getKey();   // получаем нажатие клавиши
  value = value + String(customKey);

  lcd.setCursor(0, 1);
  lcd.print(value);


  if (customKey == '#')
  {
    createConnection();
    Serial.println("PRESSED #");
    String response_Status = "";
    Serial.println("\nStarting connection to server...");

    Serial.println("RESULT OF CLIENT.CONNECT()");
    Serial.println(client.connect(server, 80));

    // если вы установили соединение, сообщите об этом через последовательный порт:
    if (client.connect(server, 80) == 1)
    { 
      int valueLen = value.length();
      if(valueLen == 5){
      Serial.println("IK BEN een pin ");
      value.remove(4);
      Serial.println(value);
      Serial.println("connected to server");

      // Делаем HTTP-запрос:
      client.println("GET /api/boxes/2025/pin/" + value + " HTTP/1.1");//1444
      client.println("Host: parcelbox.1819.caro.deweze.nxtmediatech.eu");
      client.println("Connection: close");
      client.println();
      }
      if(valueLen ==17){
      Serial.println("IK BEN een bestelcode");
      value.remove(16);
      Serial.println(value);
      Serial.println("connected to server");

      // Делаем HTTP-запрос:
      client.println("GET /api/boxes/2025/code/" + value + " HTTP/1.1");//1444
      client.println("Host: parcelbox.1819.caro.deweze.nxtmediatech.eu");
      client.println("Connection: close");
      client.println();

        }
        else{

          Serial.println("invalid amount of numbers code");
          /*lcd.clear();
          lcd.print("ongeldige code");*/

          }
    }
    else
    {
      Serial.println("client.connect() not successfull");
    }

    // если есть доступные входящие байты
    // с сервера, прочитать их и распечатать:
    StaticJsonBuffer<500> jsonBuffer;

    if (client.connected())
    {
      Serial.println("CLIENT CONNECTED");

      String response = "";
      bool begin = false;

      while (client.available() || !begin) {
        char c = client.read();

        if (c == '{') {
          begin = true;
        }

        if (begin) {
          response += (c);
        }

        if (c == '"}') {
          break;
        }

        delay(1);
      }

      int start = response.indexOf("status\":\"") + 11;
      int end = start + 3;

      response_Status = response.substring(start, end);
      Serial.println(response_Status);

      // ответ успешен
      if (response_Status == "200")
      {
        Serial.println("RESPONSE 200");
        Serial.println("response state == 200");

        // Сначала открываем коробку
        // 0° означает открытое
        Serial.println("OPEN BOX");
        myservo.write(0);
        delay(175);

        lcd.setCursor(0, 0);
        lcd.print("                ");
        lcd.setCursor(0, 0);
        lcd.print("Box open ,druk");
        lcd.setCursor(0, 1);
        lcd.print("                ");
        lcd.setCursor(0, 1);
        lcd.print("* om te sluiten");
        delay(5000);
      }
      else
      {
        Serial.println("RESPONSE NOT 200");
        Serial.println("not 200");

        lcd.clear();
        lcd.print("Foute code of");
        lcd.setCursor(0, 1);
        lcd.print("al geleverd");

        delay(2500);
      }
    }

    // сброс значения
    value = "";
  }

  // заблокировать ящик и сбросить значение
  if (customKey == '*')
  {
    Serial.println("CLOSE BOX");
    myservo.write(90);
    value = "";
    client.stop();
  }

  delay(175); // для оптимального просмотра ЖК-экрана
}
void createConnection() {

  // Эта новая строка необходима для разрыва предыдущего соединения, иначе
  // он попытается использовать старое соединение и никогда не переподключится в случае сбоя соединения
  status = WiFi.disconnect();

  // попытка подключения к сети Wi-Fi:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Подключиться к сети WPA/WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:
    status = WiFi.begin(ssid, pass);

    // ждем 10 секунд для соединения:
    delay(10);
  }
  // теперь вы подключены, поэтому распечатайте статус:
  printWifiStatus();

}

void printWifiStatus() {
  // вывести SSID сети, к которой вы подключены:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // напечатать IP-адрес вашей платы:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // вывести мощность принятого сигнала:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

Мне пришлось переписать мое Wi-Fi-соединение в функцию вне моей настройки. Потому что программа только установила соединение в начале и закрыла его после моего первого запроса. Предоставив ему собственную функцию, я мог вызывать его внутри своего цикла всякий раз, когда пользователь вводил код, программа могла восстановить соединение. Теперь моя программа работает так, как мне нужно.

,