Arduino с LED не сбрасывается/перезапускается/запускается при подключении к источнику питания

i2c arduino-nano-33-iot

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

Когда мы загружаем скетч в Arduino, он делает именно то, что должен, и показывает на ЖК-дисплее следующее: LCD with Data

Но когда мы отсоединяем Arduino от ПК и снова подключаем его к ПК (или к любому другому источнику питания), на ЖК-дисплее появляется следующее:

Кажется, что Arduino просто не перезапускает скетч и бездействует, давая ЖК-дисплею странный вывод. Когда мы открываем последовательный монитор в Arduino IDE, Arduino перезагружается, и снова появляется правильная информация. Нажатие кнопки сброса на самом Arduino не сработало и, похоже, ничего не дало.

При попытке других примеров (например, Blink) он перезапускается при повторном подключении к ПК, поэтому кажется, что проблема заключается в нашем коде.

Вот наш полный код:

#include <SPI.h>
#include <WiFiNINA.h>
#include <ArduinoJson.h> // Библиотека для десериализации JSON
#include <Wire.h> // Библиотека для связи I2C
#include <LiquidCrystal_I2C.h> // Библиотека для ЖК-дисплея

LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4);

char ssid[] = "WifiSSID";
char pass[] = "WifiPassword";
bool reading = false;

int refreshRate = 5000;

int status = WL_IDLE_STATUS;
IPAddress server(192,168,1,201);

WiFiClient client;

char json[512];
StaticJsonDocument<512> doc;

void setup() {
  Serial.begin(9600);
  while (!Serial) continue;

  memset(json, 0, sizeof json);
  
  lcd.init();
  lcd.backlight();

  lcd.setCursor(4, 1); 
  lcd.print("CONNECTING.."); 
  status = WiFi.begin(ssid, pass);

  if (status != WL_CONNECTED) {
    while(status != WL_CONNECTED) {
      Serial.println("Retrying connection in two seconds...");
      delay(2000);
      status = WiFi.begin(ssid, pass);
    }
  }
  else {
    lcd.setCursor(0, 1); 
    lcd.print("                    ");
  
    Serial.println("Connected to wifi");
    Serial.println("\nStarting connection...");
    sendRequest();
  }
}

void loop() {
  // если есть доступные входящие байты
  // с сервера, прочитайте их и распечатайте:
  if (client.available()) {
    char c = client.read();
    if (c == '[') {
      reading = true;
      memset(json, 0, sizeof json);
    } else if (c == ']') {
      reading = false;
      printJson();
    } else if (reading) {
      int len = strlen(json);
      json[len] = c;
      json[len+1] = '\0';
    }
  }

  // если сервер отключен, остановите клиент:
  if (!client.connected()) {
    client.stop();
    delay(refreshRate);
    sendRequest();
  }
}

void sendRequest() {
  if (client.connect(server, 80)) {
      Serial.println("Connected to server. Requesting data...");
      client.println("GET /api/v1/smartmeter?json=object&limit=1&round=on HTTP/1.0");
      client.println();
    }
}

void printJson() {
  DeserializationError error = deserializeJson(doc, json);

  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.f_str());
    return;
  }

  int energy = doc["CONSUMPTION_W"];
  float gas = doc["CONSUMPTION_GAS_M3"];
  Serial.println(json);
  Serial.println(energy);
  Serial.println(gas);
  
  lcd.setCursor(0, 0); 
  lcd.print("CONSUMPTION ENERGY:"); 
  lcd.setCursor(0, 1); 
  lcd.print(energy); 
  lcd.setCursor(8, 1); 
  lcd.print("WATT"); 
  
  lcd.setCursor(0, 2); 
  lcd.print("CONSUMPTION GAS:"); 
  lcd.setCursor(0, 3); 
  lcd.print(gas); 
  lcd.setCursor(8, 3); 
  lcd.print("M3"); 
}

Может быть, кто-нибудь из вас знает, почему Arduino отказывается перезагружаться при повторном подключении к ПК или источнику питания и как это исправить?

Заранее спасибо!

, 👍2


1 ответ


Лучший ответ:

5

Вы пометили вопрос как nano, так и arduino-nano-33-iot, но я предполагаю, что между ними вы используете последнее,потому что на ардуино с родным USB (а не простым Arduino Nano) while (!Serial) continue; ждет последовательного соединения, например последовательного монитора, быть на связи.

Этого не происходит, когда вы подключаетесь к источнику питания или просто подключаете его к машине, не открывая порт.

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

,

Эй, маг! Мы удалили while (!Serial) continue; из кода, и теперь он отлично работает! Большое спасибо за быстрый ответ. Ваше здоровье!, @Mithras