Подключение Arduino к Philips Hue
Я пытаюсь управлять лампами Philips Hue с помощью Arduino Uno (с моделью WiFi shield R3). И щит, и мост Philips Hue подключены к одной сети, и я пытаюсь отправлять команды JSON с Arduino на мост Hue из следующего кода, взятого отсюда.
#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
char ssid[] = "mynetwork"; // your network SSID (name)
char pass[] = "mypass"; // your network password
int status = WL_IDLE_STATUS; // the Wifi radio's status
//Hue constants
const char hueHubIP[] = "192.168.0.50"; //Hue Bridge IP
const char hueUsername[] = "myhue"; //Hue username
const int hueHubPort = 80;
IPAddress server(192,168,0,50);
WiFiClient client;
//Hue variables
boolean hueOn; // on/off
int hueBri; // brightness value
long hueHue; // hue value
String hueCmd; // Hue command
unsigned long buffer=0; //buffer for received data storage
unsigned long addr;
IPAddress ip;
void setup()
{
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield not present");
// don't continue:
while (true);
}
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to WPA SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
// you're connected now, so print out the data:
Serial.print("You're connected to the network");
printCurrentNet();
printWifiData();
ip = WiFi.localIP();
Serial.println(ip);
}
void loop()
{
String command = "{\"on\": true,\"hue\": 50100,\"sat\":255,\"bri\":255,\"transitiontime\":"+String(random(15,25))+"}";
setHue(1,command);
command = "{\"on\": true,\"hue\": 65280,\"sat\":255,\"bri\":255,\"transitiontime\":"+String(random(15,25))+"}";
setHue(2,command);
command = "{\"hue\": 65280,\"sat\":255,\"bri\":255,\"transitiontime\":"+String(random(15,25))+"}";
setHue(1,command);
command = "{\"hue\": 50100,\"sat\":255,\"bri\":255,\"transitiontime\":"+String(random(15,25))+"}";
setHue(2,command);
}
/* setHue() is our main command function, which needs to be passed a light number and a
* properly formatted command string in JSON format (basically a Javascript style array of variables
* and values. It then makes a simple HTTP PUT request to the Bridge at the IP specified at the start.
*/
boolean setHue(int lightNum,String command)
{
if (client.connect(server, 80))
{
Serial.println(F("connected to server"));
while (client.connected()&& status == WL_CONNECTED)
{
client.print(F("PUT /api/"));
client.print(hueUsername);
client.print(F("/lights/"));
client.print(lightNum); // hueLight zero based, add 1
client.println(F("/state HTTP/1.1"));
client.println(F("keep-alive"));
client.print(F("Host: "));
client.println(hueHubIP);
client.print(F("Content-Length: "));
client.println(command.length());
client.println(F("Content-Type: text/plain;charset=UTF-8"));
client.println(); // blank line before body
client.println(command); // Hue command
}
client.stop();
return true; // command executed
}
else
return false; // command failed
}
//client.flush();
//client.stop();
/* A helper function in case your logic depends on the current state of the light.
* This sets a number of global variables which you can check to find out if a light is currently on or not
* and the hue etc. Not needed just to send out commands
*/
boolean getHue(int lightNum)
{
if (client.connect(server, 80))
{
client.print(F("GET /api/"));
client.print(hueUsername);
client.print(F("/lights/"));
client.print(lightNum);
client.println(F(" HTTP/1.1"));
client.print(F("Host: "));
client.println(hueHubIP);
client.println(F("Content-type: application/json"));
client.println(F("keep-alive"));
client.println();
while (client.connected()&& status == WL_CONNECTED)
{
if (client.available())
{
client.findUntil("\"on\":", "\0");
hueOn = (client.readStringUntil(',') == "true"); // if light is on, set variable to true
client.findUntil("\"bri\":", "\0");
hueBri = client.readStringUntil(',').toInt(); // set variable to brightness value
client.findUntil("\"hue\":", "\0");
hueHue = client.readStringUntil(',').toInt(); // set variable to hue value
break; // not capturing other light attributes yet
}
}
client.stop();
return true; // captured on,bri,hue
}
else
return false; // error reading on,bri,hue
}
void printWifiData() {
//WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
}
void printCurrentNet() {
//SSID of the network you're attached to:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
}
}
Приведенный выше код подключает мой Arduino к сети mynet, и я также подключил к нему мост Hue, но он выдает ошибку
Отсутствия доступного сокета
.
ОБНОВЛЕНИЕ (9 марта 2016):
Я реализовал предложения 1
и 4
, данные slash-dev, и смог избавиться от ошибки, связанной с отсутствием доступных сокетов
. Ниже приведен обновленный код:
#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
char ssid[] = "mynetwork"; // your network SSID (name)
char pass[] = "mypass"; // your network password
int status = WL_IDLE_STATUS; // the Wifi radio's status
//Hue constants
const char hueHubIP[] = "192.168.0.50"; //Hue hub IP
const char hueUsername[] = "myhue"; //Hue username
const int hueHubPort = 80;
IPAddress server(192,168,0,50);
WiFiClient client;
//Hue variables
boolean hueOn; // on/off
int hueBri; // brightness value
long hueHue; // hue value
String hueCmd; // Hue command
unsigned long buffer=0; //buffer for received data storage
unsigned long addr;
IPAddress ip;
void setup()
{
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println(F("WiFi shield not present"));
// don't continue:
while (true);
}
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
Serial.print(F("Attempting to connect to WPA SSID: "));
Serial.println(ssid);
// Connect to WPA/WPA2 network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
// you're connected now, so print out the data:
Serial.print(F("You're connected to the network"));
printCurrentNet();
printWifiData();
}
void loop()
{
String command = "{\"on\": true,\"hue\": 50100,\"sat\":255,\"bri\":255,\"transitiontime\":"+String(random(15,25))+"}";
setHue(1,command);
command = "{\"on\": true,\"hue\": 65280,\"sat\":255,\"bri\":255,\"transitiontime\":"+String(random(15,25))+"}";
setHue(2,command);
command = "{\"hue\": 65280,\"sat\":255,\"bri\":255,\"transitiontime\":"+String(random(15,25))+"}";
setHue(1,command);
command = "{\"hue\": 50100,\"sat\":255,\"bri\":255,\"transitiontime\":"+String(random(15,25))+"}";
setHue(2,command);
}
/* setHue() is our main command function, which needs to be passed a light number and a
* properly formatted command string in JSON format (basically a Javascript style array of variables
* and values. It then makes a simple HTTP PUT request to the Bridge at the IP specified at the start.
*/
boolean setHue(int lightNum,String command)
{
client.stop();
if (client.connect(server, 80))
{
Serial.println(F("connected to server"));
while (client.connected()&& status == WL_CONNECTED)
{
client.print(F("PUT /api/"));
client.print(hueUsername);
client.print(F("/lights/"));
client.print(lightNum); // hueLight zero based, add 1
client.println(F("/state HTTP/1.1"));
client.println(F("Connection: keep-alive"));
client.print(F("Host: "));
client.println(hueHubIP);
client.print(F("Content-Length: "));
client.println(command.length());
client.println(F("Content-Type: text/plain;charset=UTF-8"));
client.println(); // blank line before body
client.println(command); // Hue command
}
client.flush();
client.stop();
return true; // command executed
}
else
return false; // command failed
}
/* A helper function in case your logic depends on the current state of the light.
* This sets a number of global variables which you can check to find out if a light is currently on or not
* and the hue etc. Not needed just to send out commands
*/
boolean getHue(int lightNum)
{
client.stop();
if (client.connect(server, 80))
{
client.print(F("GET /api/"));
client.print(hueUsername);
client.print(F("/lights/"));
client.print(lightNum);
client.println(F(" HTTP/1.1"));
client.print(F("Host: "));
client.println(hueHubIP);
client.println(F("Content-type: application/json"));
client.println(F("Connection: keep-alive"));
client.println();
while (client.connected()&& status == WL_CONNECTED)
{
if (client.available())
{
client.findUntil("\"on\":", "\0");
hueOn = (client.readStringUntil(',') == "true"); // if light is on, set variable to true
client.findUntil("\"bri\":", "\0");
hueBri = client.readStringUntil(',').toInt(); // set variable to brightness value
client.findUntil("\"hue\":", "\0");
hueHue = client.readStringUntil(',').toInt(); // set variable to hue value
break; // not capturing other light attributes yet
}
}
client.flush();
client.stop();
return true; // captured on,bri,hue
}
else
return false; // error reading on,bri,hue
}
void printWifiData() {
//WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print(F("IP Address: "));
Serial.println(ip);
}
void printCurrentNet() {
//SSID of the network you're attached to:
Serial.print(F("SSID: "));
Serial.println(WiFi.SSID());
}
@Hyperbola, 👍0
Обсуждение4 ответа
Лучший ответ:
Я подозреваю, что произошел сбой с низким объемом оперативной памяти. Вот несколько советов, которые значительно снизят использование оперативной памяти:
1) У вас все еще есть Serial.print
с использованием строковых констант C в двойных кавычках. Используйте F("строка C")
и для них тоже. Например:
Serial.println( F("WiFi shield not present") );
Каждая строка C в двойных кавычках использует оперативную память в дополнение к программному пространству FLASH. Вы уже сохранили кучу, но вам следует избавиться от вышеуказанных применений.
2) Не используйте
строку
для setHue
.
TL;DR - он будет использовать дополнительную оперативную память, флэш-память, время процессора и вызывать необъяснимые или случайные сбои.
Вместо этого используйте строки C, или массивы символов для переменных, или строковые константы в двойных кавычках. Когда константы заключены в макрос F (), они не используют оперативную память.
Вот пример того, как определить и вызвать setHue
со строками C вместо строки
:
--> мотрите полный код ниже в разделе ОБНОВЛЕНИЕ 3/9/2016 >--
Это просто выводит строки C на серийный
номер, но я надеюсь, вы поймете, как их также можно распечатать для клиента
.
3) Не используйте
строку
для GetHue
.
Вот пример того, как определить и вызвать GetHue,
который использует строки C вместо строки
:
--> Смотрите полный код ниже в разделе ОБНОВЛЕНИЕ 3/9/2016 >--
Просто скопируйте и вставьте отображаемый JSON в поле "Отправить" последовательного монитора. Отладочные отпечатки будут отображать то, что будет проанализировано.
- ПРИМЕЧАНИЕ: Неясно, всегда ли атрибуты JSON возвращаются в одном и том же порядке. В этом примере ожидается тот же порядок, в котором они были отправлены. Для выполнения любого заказа необходимо будет использовать другие методы.
4) Обязательно позвоните
клиенту.промывка()
перед каждым клиентом.остановка()
.
Резюме: Я бы предположил, что комбинация не-F() "строк C", расходующих оперативную память, плюс
использование строки ОЗУ (удвоенное или более), приводит к сбою с низким объемом ОЗУ. Описанный выше подход значительно снизит использование оперативной памяти, а также сэкономит более 1,6 кБ программного пространства. После внедрения этих изменений почти вся оперативная память будет доступна для библиотек Wi-Fi.
ОБНОВЛЕНИЕ 3/9/2016
Вот мои изменения, объединенные в ваш второй скетч.
#include <SPI.h>
#include <WiFi.h>
#include <WiFiClient.h>
char ssid[] = "mynetwork"; // your network SSID (name)
char pass[] = "mypass"; // your network password
int status = WL_IDLE_STATUS; // the Wifi radio's status
//Hue constants
const char hueHubIP[] = "192.168.0.50"; //Hue hub IP
const char hueUsername[] = "myhue"; //Hue username
const int hueHubPort = 80;
IPAddress server(192,168,0,50);
// Uncomment this to *really* use the Wi-Fi sheild.
// Comment this to read & write everything to the Serial Monitor for testing.
//#define REAL_WIFI
#ifdef REAL_WIFI
WiFiClient client;
#else
HardwareSerial & client = Serial; // redirect 'client' to the Serial Monitor
#endif
//Hue variables
boolean hueOn; // on/off
int hueBri; // brightness value
long hueHue; // hue value
String hueCmd; // Hue command
unsigned long buffer=0; //buffer for received data storage
unsigned long addr;
IPAddress ip;
void setup()
{
//Initialize serial and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
// check for the presence of the shield:
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println(F("WiFi shield not present"));
// don't continue:
#ifdef REAL_WIFI
while (true);
#else
status = WL_CONNECTED;
#endif
}
// attempt to connect to Wifi network:
while (status != WL_CONNECTED) {
Serial.print(F("Attempting to connect to WPA SSID: "));
Serial.println(ssid);
// Connect to WPA/WPA2 network:
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
// you're connected now, so print out the data:
Serial.print(F("You're connected to the network"));
printCurrentNet();
printWifiData();
}
void loop()
{
setHue
( 1,
F("{\"on\": true,\"hue\": 50100,\"sat\":255,\"bri\":255,\"transitiontime\":"),
random(15,25),
F("}")
);
delay( 10000 );
setHue
( 2,
F("{\"on\": true,\"hue\": 65280,\"sat\":255,\"bri\":255,\"transitiontime\":"),
random(15,25),
F("}")
);
delay( 10000 );
setHue
( 1,
F("{\"hue\": 65280,\"sat\":255,\"bri\":255,\"transitiontime\":"),
random(15,25),
F("}")
);
delay( 10000 );
setHue
( 2,
F("{\"hue\": 50100,\"sat\":255,\"bri\":255,\"transitiontime\":"),
random(15,25),
F("}")
);
delay( 10000 );
// getHue( 1 );
// getHue( 2 );
}
/* setHue() is our main command function, which needs to be passed a light number and a
* properly formatted command string in JSON format (basically a Javascript style array of variables
* and values. It then makes a simple HTTP PUT request to the Bridge at the IP specified at the start.
*/
boolean setHue
( int lightNum,
const __FlashStringHelper *header,
int parameter,
const __FlashStringHelper *trailer )
{
#ifdef REAL_WIFI
client.stop();
if (client.connect(server, 80))
#endif
{
Serial.println(F("connected to server"));
#ifdef REAL_WIFI
if (client.connected()&& status == WL_CONNECTED)
#endif
{
client.print(F("PUT /api/"));
client.print(hueUsername);
client.print(F("/lights/"));
client.print(lightNum); // hueLight zero based, add 1
client.println(F("/state HTTP/1.1"));
client.println(F("Connection: keep-alive"));
client.print(F("Host: "));
client.println(hueHubIP);
// Calculate total command length.
int cmdLength =
strlen_P( (const prog_char *)header ) +
1 + // Assume one digit for parameter...
strlen_P( (const prog_char *)trailer );
// ... and add room for more digits if necessary.
if (parameter > 9)
cmdLength++;
if (parameter > 99)
cmdLength++;
client.print(F("Content-Length: "));
client.println( cmdLength );
client.println(F("Content-Type: text/plain;charset=UTF-8"));
client.println(); // blank line before body
client.print( header ); // Hue command pieces
client.print( parameter );
client.println( trailer );
}
client.flush();
#ifdef REAL_WIFI
client.stop();
#endif
return true; // command executed
}
#ifdef REAL_WIFI
else
return false; // command failed
#endif
}
//---------------------------------------------------------------------
// Utility function to extract one `bool` value from the client stream.
// No buffers are used. Each character is handled as it is received.
// (you may want/need to add a timeout)
static bool clientParseBool( char delim )
{
bool val = false;
uint8_t count = 0; // number of chars we've read for the value
while (status == WL_CONNECTED) {
if (client.available()) {
char c = client.read();
if (c == delim)
break; // done!
if ((c == ' ') || (count++ > 0))
continue; // skip spaces and anything after the first non-space char
if (c == 't')
val = true;
}
}
// Debug prints
Serial.print( F("bool ") );
Serial.println( val );
return val;
}
//-------------------------------------------
// Utility function to extract one 'unsigned 16-bit int' value from the client stream.
// No buffers are used. Each character is handled as it is received.
// (you may want/need to add a timeout)
static uint16_t clientParseUint( char delim )
{
uint16_t val = 0;
while (status == WL_CONNECTED) {
if (client.available()) {
char c = client.read();
if (c == delim)
break; // done!
if (c == ' ')
continue; // skip spaces
if (isdigit(c))
val = val*10 + (c - '0'); // accumulate one digit of the bri value
}
}
// Debug prints
Serial.print( F("int ") );
Serial.println( val );
return val;
}
//-------------------------------------------
/* A helper function in case your logic depends on the current state of the light.
* This sets a number of global variables which you can check to find out if a light is currently on or not
* and the hue etc. Not needed just to send out commands
*/
boolean getHue(int lightNum)
{
bool gotHue = false;
#ifdef REAL_WIFI
client.stop();
if (client.connect(server, 80))
#endif
{
client.print(F("GET /api/"));
client.print(hueUsername);
client.print(F("/lights/"));
client.print(lightNum);
client.println(F(" HTTP/1.1"));
client.print(F("Host: "));
client.println(hueHubIP);
client.println(F("Content-type: application/json"));
client.println(F("Connection: keep-alive"));
client.println();
if (status == WL_CONNECTED)
{
client.findUntil("\"on\":", "\0");
hueOn = clientParseBool(',');
if (status == WL_CONNECTED)
{
client.findUntil("\"bri\":", "\0");
hueBri = clientParseUint(',');
if (status == WL_CONNECTED)
{
client.findUntil("\"hue\":", "\0");
hueHue = clientParseUint(',');
gotHue = true; // captured all three: on,bri,hue
}
}
}
client.flush();
#ifdef REAL_WIFI
client.stop();
#endif
}
return gotHue;
}
void printWifiData() {
//WiFi shield's IP address:
IPAddress ip = WiFi.localIP();
Serial.print(F("IP Address: "));
Serial.println(ip);
}
void printCurrentNet() {
//SSID of the network you're attached to:
Serial.print(F("SSID: "));
Serial.println(WiFi.SSID());
}
Несколько замечаний:
- У меня не было лишней пустой строки в моем оригинальном
сете
, поэтому я вставил ее обратно, чтобы она соответствовала вашему скетчу. - Я добавил
определение REAL_WIFI, которое я мог бы прокомментировать для тестирования на
Serial
. Когда я запускаю его, я получаю этот вывод:Wi-Fi щит отсутствует
Вы подключены к сетевому идентификатору:
IP-адрес: 0.0.0.0
подключен к серверу
PUT /api/myhue/lights/1/состояние HTTP/1.1
Связь: сохраняй-живи
Хост: 192.168.0.50
Содержание-Длина: 65
Тип содержимого: текст/обычный;кодировка=UTF-8
{"включено": true,"оттенок": 50100,"сб":255,"bri":255,"время перехода":22}
подключен к серверу
PUT /api/myhue/огни/2/состояние HTTP/1.1
Связь: сохраняй-живи
Хост: 192.168.0.50
Содержание-Длина: 65
Тип содержимого: текст/обычный;кодировка=UTF-8
{"включено": true,"оттенок": 65280,"сб":255,"bri":255,"время перехода":24} - Вы можете скопировать и вставить приведенный выше вывод, если хотите добавить и протестировать
GetHue только с помощью последовательного монитора (т. Е. Прокомментировать
#define REAL_WIFI
). - Я добавил 10-секундную задержку между каждым
набором
, просто чтобы ускорить вывод и дать "время перехода"... эм ... некоторое время для работы. Время перехода указано в секундах, поэтомуloop
снова вызоветsetHue до завершения запрошенного перехода. Вы не увидите особых изменений, если будете продолжать говорить ему постепенно менять цвет на новый, но он только немного изменится. Без всякой задержки, я не думаю, что вы что-нибудь увидите. Это может быть вашей текущей проблемой! Через 10 секунд, по крайней мере, он пройдет примерно половину пути. :-(
Спасибо за подробный ответ. Я больше не получаю ошибку "Нет доступной розетки", но код делает не то, что должен, т. Е. Изменяет цвета лампы. Ранее я отправлял команды JSON из браузера своего компьютера, перейдя на IP-адрес моста Philips Hue, и он работает бесперебойно. Взгляните сюда один раз: http://www.developers.meethue.com/documentation/getting-started, @Hyperbola
@Hyperbola, я рад, что ошибка "Нет доступного сокета" исчезла, но мне нужно будет увидеть "код". :) Вы можете отредактировать свой вопрос и добавить раздел ОБНОВЛЕНИЯ с последней версией. Мои примеры, конечно, ничего не сделают с сетью. Они просто используют Последовательный монитор., @slash-dev
Я реализовал предложения "#1 " и "#4", поскольку "#2 " и "#3 " выдавали некоторые ошибки. Однако скетч ничего не делает, независимо от отсутствия ошибок. Он не может изменить цвет лампы. Можете ли вы представить себе какие-либо возможности того же самого? В принципе, мы просто отправляем те же команды JSON из arduino, что и из браузера: developers.meethue.com/documentation/getting-started, @Hyperbola
@Гипербола, новый раздел ОБНОВЛЕНИЯ выше. Я подозреваю, что "переходное время" делает то, что вы ему велели... :-), @slash-dev
Интересно, не заканчивается ли у вас оперативная память? Эти сокеты используют оперативную память, и у вас есть довольно много строковых констант, например:
client.println("Content-Type: text/plain;charset=UTF-8");
Измените это (и все аналогичные), чтобы использовать макрос F ()
:
client.println(F("Content-Type: text/plain;charset=UTF-8"));
Я вставил макрос F() и вырезал некоторые ненужные данные для печати (MAC ID и т. Д.), Но он все равно выдает ту же ошибку. Я обновил вопрос новым кодом, содержащим макрос., @Hyperbola
Некоторые из этих устройств Ethernet поддерживают только ограниченное количество сокетов. Я думал, что это может быть 3 или 4, но можете ли вы узнать, сколько их для вашего WiFi-щита? Или, другими словами, какова спецификация щита? (ссылка), @Nick Gammon
Я использую щит R3, точно такой же, как здесь. (https://www.arduino.cc/en/Main/ArduinoWiFiShield), @Hyperbola
В связи с этим примером, возможно, вам следует вызвать client.stop()
непосредственно перед вызовом client.connect()
в начале setHue()
и GetHue()
. Вы также должны вызывать не только client.stop()
, но и client.flush()
в конце обеих функций, на всякий случай: сначала сбросьте, затем остановите.
На другой ноте исправьте свои заголовки HTTP с client.println(F("сохранить в живых"));
на client.println(F("Соединение: сохранить в живых"));
.
Для всех, кто еще столкнется с этим. Причина, по которой для этого требуется около 10 секунд, заключается в оригинале: while (client.connected())
или в сообщении операции над while (client.connected()&& status == WL_CONNECTED)
. Либо находятся в Сетуэ.
Я прокомментировал, что цикл while отключен (и открывающие { и закрывающие } скобки для этого цикла while, иначе вы, конечно, получите ошибку), и свет оттенка мгновенно изменился.
Если вы поместите строку печати в последовательную строку в этом цикле, вы увидите, что он выполняет этот цикл непрерывно, что вызывает длительную задержку.
Если вы наткнетесь на этот пост с оригинала https://www.makeuseof.com/tag/control-philips-hue-lights-arduino-and-motion-sensor/ обратите внимание, что вы должны изменить операторы if основного цикла на:
if((digitalRead(pir) == 1) && (activated == false) )
и
if((digitalRead(pir) == 0) && (activated == true) )
Таким образом, setHue вызывается только при изменении состояния.
- Обнаружение ESP8266 в сети
- TCP-клиент readStringUntil только при наличии данных
- Невозможно установить связь между модулем ESP-12E и мобильным устройством через маршрутизатор ESP-12E.
- ESP8266 Одноранговая сеть с AP и STA — кэширование клиентов AP, очистка их запросов?
- Мобильная точка доступа с wemos d1 mini
- Восстановите подключение к WIFI
- Wi-Fi-подключения теряются при сбросе подключения
- Каков наилучший способ инициализации Wi-Fi-связи между двумя устройствами (получить IP-адрес)?
См. [Arduino wifi shield - “Сокет недоступен”](http://forum.arduino.cc/index.php?topic=170460.0) нить в forum.arduino.cc, @James Waldby - jwpat7
@jwpat: Я уже видел это решение и добавил указанные строки в свой код, но оно не работает для меня., @Hyperbola
Сообщение об ошибке, по - видимому, исходит из самого кода сетевой библиотеки, а не из любого места в вашем скетче, что является довольно уродливой практикой автора библиотеки-как сказать, что последовательный объект используется таким образом, чтобы он был подходящим местом для отображения ошибок? Чтобы отладить это подробнее, вам, возможно, потребуется покопаться в сетевой библиотеке и добавить свой собственный временный (только для этого проекта) вывод, который более конкретно объясняет, почему сокет недоступен., @Chris Stratton