Arduino с LED не сбрасывается/перезапускается/запускается при подключении к источнику питания
Мы с другом работаем над скетчем Arduino, который делает запрос к локальному API, анализирует эти данные и выводит их на жидкокристаллический дисплей.
Когда мы загружаем скетч в Arduino, он делает именно то, что должен, и показывает на ЖК-дисплее следующее:
Но когда мы отсоединяем 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 отказывается перезагружаться при повторном подключении к ПК или источнику питания и как это исправить?
Заранее спасибо!
@Mithras, 👍2
1 ответ
Лучший ответ:
Вы пометили вопрос как nano
, так и arduino-nano-33-iot
, но я предполагаю, что между ними вы используете последнее,потому что на ардуино с родным USB (а не простым Arduino Nano) while (!Serial) continue;
ждет последовательного соединения, например последовательного монитора, быть на связи.
Этого не происходит, когда вы подключаетесь к источнику питания или просто подключаете его к машине, не открывая порт.
Если вы хотите мигнуть светодиодом внутри этого цикла, чтобы увидеть, что он действительно застрял там.
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?
- Что означает в I2C «NACK получен»?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом
Эй, маг! Мы удалили
while (!Serial) continue;
из кода, и теперь он отлично работает! Большое спасибо за быстрый ответ. Ваше здоровье!, @Mithras