Изменить строку типа данных
В настоящее время я работаю с 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;
}
}
@Rick, 👍1
Обсуждение1 ответ
Лучший ответ:
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;
}
}
- Преобразование строки в IP-адрес
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- Какова цель F() и FPSTR() в ESP8266WebServer -> FSBrowser?
- Как исправить код утечки памяти в ESP8266/NodeMCU, вызванный концентрацией строк?
- Недопустимое преобразование из ошибки 'uint16_t* при создании массива элементов uint16_t
- Печать unsigned long long в ESP8266
- Как преобразовать четыре uint16_t в двойное число с плавающей запятой IEEE754?
- Как заменить объекты String массивами символов, продолжая использовать строковые методы
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