Подключение 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, но он выдает ошибку Отсутствия доступного сокета.

Error message

ОБНОВЛЕНИЕ (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());
}

, 👍0

Обсуждение

См. [Arduino wifi shield - “Сокет недоступен”](http://forum.arduino.cc/index.php?topic=170460.0) нить в forum.arduino.cc, @James Waldby - jwpat7

@jwpat: Я уже видел это решение и добавил указанные строки в свой код, но оно не работает для меня., @Hyperbola

Сообщение об ошибке, по - видимому, исходит из самого кода сетевой библиотеки, а не из любого места в вашем скетче, что является довольно уродливой практикой автора библиотеки-как сказать, что последовательный объект используется таким образом, чтобы он был подходящим местом для отображения ошибок? Чтобы отладить это подробнее, вам, возможно, потребуется покопаться в сетевой библиотеке и добавить свой собственный временный (только для этого проекта) вывод, который более конкретно объясняет, почему сокет недоступен., @Chris Stratton


4 ответа


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

1

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

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


3

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

  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


1

В связи с этим примером, возможно, вам следует вызвать client.stop() непосредственно перед вызовом client.connect() в начале setHue() и GetHue(). Вы также должны вызывать не только client.stop(), но и client.flush() в конце обеих функций, на всякий случай: сначала сбросьте, затем остановите.

На другой ноте исправьте свои заголовки HTTP с client.println(F("сохранить в живых")); на client.println(F("Соединение: сохранить в живых"));.

,

0

Для всех, кто еще столкнется с этим. Причина, по которой для этого требуется около 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 вызывается только при изменении состояния.

,