Изменить строку типа данных

В настоящее время я работаю с ESP8266 NodeMCU V3 и коммутационной платой ИК-передатчика. Модуль получает ИК-команды NEC через HTTP-запрос, а затем отправляет их через ИК-передатчик. Получение команды из HTTP-запроса и отправка статических (заранее запрограммированных) ИК-команд NEC работает отлично. Однако проблема заключается в том, что команда NEC IR, которую я получаю через HTTP, имеет тип переменной/данных String (после обработки). irsend.sendNEC(); однако требует uint64_t в качестве типа ввода, согласно сообщению об ошибке, которое я получаю в Arduino IDE.

Честно говоря, я не особо разбираюсь в типах данных C. Поиски типа «Arduino String to uint64_t» оказались пустыми или перевернутыми. Одна публикация была близка к тому, что я пытаюсь сделать, но irsend.sendNEC(strtoul (без запроса)); тоже не помогло.

Код Arduino;

  • Проверить // Отправить команду IR NEC почти внизу
  • Второй и третий irsend.sendNEC(); приведены в качестве примера, а не в окончательном коде
  • HTTP-запрос имеет следующий формат: http://192.168.1.xxx/rest/ir/nec/0xFB0042BD

Sketch.ino

// Конфигурация
const char* CONFIG_SSID      = "mywifi";
const char* CONFIG_PSK       = "wifipassword";
const int   CONFIG_SERIAL    = 115200;
const int   CONFIG_PORT      = 80;
const int   CONFIG_TIMEOUT   = 5000;
const int   CONFIG_IRTPIN    = 2;

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

// Подключаем библиотеки
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <IRrecv.h>
#include <IRutils.h>

// Создаем объект веб-сервера
WiFiServer server(CONFIG_PORT);

// Создаем объект IR Send
IRsend irsend(CONFIG_IRTPIN);

// Инструкции по настройке
void setup() {

  // Запустить последовательный порт и светодиод
  Serial.begin(CONFIG_SERIAL);
  Serial.println();
  Serial.println("Starting setup");
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 1);

  // Запускаем Wi-Fi соединение
  Serial.print("Connecting to: ");
  Serial.println(CONFIG_SSID);
  WiFi.mode(WIFI_STA);
  WiFi.begin(CONFIG_SSID, CONFIG_PSK);

  // Ждем соединения WiFi
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected!");

  // Выводим информацию о подключении WiFi
  Serial.print("  SSID: ");
  Serial.println(WiFi.SSID());
  Serial.print("  RSSI: ");
  Serial.print(WiFi.RSSI());
  Serial.println(" dBm");
  Serial.print("  Local IP: ");
  Serial.println(WiFi.localIP());

  // Запуск веб-сервера
  Serial.println("Starting webserver...");
  server.begin();
  delay(1000);
  Serial.println("Webserver started!");

  // Печать информации о веб-сервере
  Serial.print("  Host: ");
  Serial.println(WiFi.localIP());
  Serial.print("  Port: ");
  Serial.println(CONFIG_PORT);

  // Начать ИК-отправку
  Serial.println("Starting IR Send...");
  irsend.begin();
  delay(1000);
  Serial.println("IR Send started!");

  // Настройка завершена
  Serial.println("Setup completed");
  digitalWrite(LED_BUILTIN, 0);
  Serial.println();

}

// Инструкции цикла
void loop() {

  // Ждем нового клиента
  WiFiClient client = server.available();
  if (client) {

    // Новый клиент
    digitalWrite(LED_BUILTIN, 1);
    Serial.println("New client connected");

    // Подождем, пока клиент выполнит полный запрос
    unsigned long timeout = millis() + CONFIG_TIMEOUT;
    Serial.println("Waiting for client request to finish...");
    while (!client.available() && millis() < timeout) {
      delay(1);
    }

    // Завершить клиентское соединение по истечении тайм-аута, чтобы не задерживать доступность
    if (millis() < timeout) {
      Serial.println("Client request finished!");
    } else {
      Serial.println("Client request timeout!");
      client.flush();
      client.stop();
      digitalWrite(LED_BUILTIN, 0);
      Serial.println();
      return;
    }

    // Перехватываем клиентский запрос
    String req = client.readStringUntil('\r');
    Serial.print("Request header: ");
    Serial.println(req);
    if (req.indexOf(F("/rest/ir/nec/")) != -1) {

      // Получить IR Отправить запрос NEC
      String irrequest = req;
      irrequest.remove(0, ((irrequest.lastIndexOf("/rest/ir/nec/")) + 13));
      irrequest.remove((irrequest.indexOf(" ")));
      Serial.print("IR Send NEC code: ");
      Serial.println(irrequest);

      // Отправить команду IR NEC
      Serial.println("Sending IR NEC command");
      irsend.sendNEC(irrequest);    // <<< вот в чем проблема
      irsend.sendNEC(0xFB0042BD);   // Это работает
      irsend.sendNEC("0xFB0042BD"); // Это не

      // Отправляем HTTP-ответ
      Serial.println("Sending HTTP/1.1 200 OK");
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/plain");
      client.println("Connection: close");
      client.println();
      client.println("OK");

    } else {

      // Неверный запрос
      Serial.println("Invalid client request");
      Serial.println("Sending HTTP/1.1 404 response");
      client.println("HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html><body>Not found</body></html>");

    }

    // Очистить выходной буфер
    Serial.println("Flushing output buffer");
    client.flush();
    digitalWrite(LED_BUILTIN, 0);
    Serial.println();
    return;

  }

}

, 👍1

Обсуждение

irsend.sendNEC(strtoul(irrequest.c_str(), NULL, 10)); http://www.cplusplus.com/reference/cstdlib/strtoul/ https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/c_str/, @Juraj


1 ответ


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

4

irsend.sendNEC(strtoul(irrequest.c_str(), NULL, 10)); сделал свое дело с помощью Юрай. Большое спасибо! Мне нужно было только установить 10 на 16, чтобы заставить его работать.

Рабочий код:

// Конфигурация
const char* CONFIG_SSID      = "mywifi";
const char* CONFIG_PSK       = "wifipassword";
const int   CONFIG_SERIAL    = 115200;
const int   CONFIG_PORT      = 80;
const int   CONFIG_TIMEOUT   = 5000;
const int   CONFIG_IRTPIN    = 2;

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

// Подключаем библиотеки
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <IRrecv.h>
#include <IRutils.h>

// Создаем объект веб-сервера
WiFiServer server(CONFIG_PORT);

// Создаем объект IR Send
IRsend irsend(CONFIG_IRTPIN);

// Инструкции по установке
void setup() {

  // Запустить последовательный порт и светодиод
  Serial.begin(CONFIG_SERIAL);
  Serial.println();
  Serial.println("Starting setup");
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, 1);

  // Запускаем Wi-Fi соединение
  Serial.print("Connecting to: ");
  Serial.println(CONFIG_SSID);
  WiFi.mode(WIFI_STA);
  WiFi.begin(CONFIG_SSID, CONFIG_PSK);

  // Ждем соединения WiFi
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected!");

  // Выводим информацию о подключении WiFi
  Serial.print("  SSID: ");
  Serial.println(WiFi.SSID());
  Serial.print("  RSSI: ");
  Serial.print(WiFi.RSSI());
  Serial.println(" dBm");
  Serial.print("  Local IP: ");
  Serial.println(WiFi.localIP());

  // Запуск веб-сервера
  Serial.println("Starting webserver...");
  server.begin();
  delay(1000);
  Serial.println("Webserver started!");

  // Печать информации о веб-сервере
  Serial.print("  Host: ");
  Serial.println(WiFi.localIP());
  Serial.print("  Port: ");
  Serial.println(CONFIG_PORT);

  // Начать ИК-отправку
  Serial.println("Starting IR Send...");
  irsend.begin();
  delay(1000);
  Serial.println("IR Send started!");

  // Настройка завершена
  Serial.println("Setup completed");
  digitalWrite(LED_BUILTIN, 0);
  Serial.println();

}

// Инструкции цикла
void loop() {

  // Ждем нового клиента
  WiFiClient client = server.available();
  if (client) {

    // Новый клиент
    digitalWrite(LED_BUILTIN, 1);
    Serial.println("New client connected");

    // Подождем, пока клиент выполнит полный запрос
    unsigned long timeout = millis() + CONFIG_TIMEOUT;
    Serial.println("Waiting for client request to finish...");
    while (!client.available() && millis() < timeout) {
      delay(1);
    }

    // Завершить клиентское соединение по истечении тайм-аута, чтобы не задерживать доступность
    if (millis() < timeout) {
      Serial.println("Client request finished!");
    } else {
      Serial.println("Client request timeout!");
      client.flush();
      client.stop();
      digitalWrite(LED_BUILTIN, 0);
      Serial.println();
      return;
    }

    // Перехватываем клиентский запрос
    String req = client.readStringUntil('\r');
    Serial.print("Request header: ");
    Serial.println(req);
    if (req.indexOf(F("/rest/ir/nec/")) != -1) {

      // Получить IR Отправить запрос NEC
      String irrequest = req;
      irrequest.remove(0, ((irrequest.lastIndexOf("/rest/ir/nec/")) + 13));
      irrequest.remove((irrequest.indexOf(" ")));
      Serial.print("IR Send NEC code: ");
      Serial.println(irrequest);

      // Отправить команду IR NEC
      Serial.println("Sending IR NEC command");
      irsend.sendNEC(strtoul(irrequest.c_str(), NULL, 16));

      // Отправляем HTTP-ответ
      Serial.println("Sending HTTP/1.1 200 OK");
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/plain");
      client.println("Connection: close");
      client.println();
      client.println("OK");

    } else {

      // Неверный запрос
      Serial.println("Invalid client request");
      Serial.println("Sending HTTP/1.1 404 response");
      client.println("HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html><body>Not found</body></html>");

    }

    // Очистить выходной буфер
    Serial.println("Flushing output buffer");
    client.flush();
    digitalWrite(LED_BUILTIN, 0);
    Serial.println();
    return;

  }

}
,