switch/IR_WIFI.ino
2025-12-29 18:25:30 +08:00

173 lines
4.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <IRrecv.h>
#include <IRutils.h>
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#define URL "http://www.baidu.com"
String ssid="";
String password="";
const uint16_t kIrLed = 4; // ESP8266 GPIO pin to use. Recommended: 4 (D2).
const uint16_t kRecvPin = 14;
IRsend irsend(kIrLed);
IRrecv irrecv(kRecvPin);
decode_results results;
WiFiUDP udp;
unsigned int localUdpPort = 9; //本地端口号
IPAddress remote_IP(255, 255, 255, 255);// 自定义远程监听 IP 地址
void UDP_IR();
void IR_UDP();
void httpClientRequest();
const uint16_t tx = 1;
const uint16_t rx = 3;
void setup() {
WiFiManager wifiManager;
//短接 TX RX即可清除WIFI账号密码然后需要重新配置
pinMode(tx, OUTPUT);
digitalWrite(tx, LOW);
pinMode(rx, INPUT_PULLUP);
if (digitalRead(rx) == LOW)
{
delay(100);
if (digitalRead(rx) == LOW)
wifiManager.resetSettings();
}
Serial.begin(115200);
// 建立WiFiManager对象
// 自动连接WiFi。以下语句的参数是连接ESP8266时的WiFi名称
wifiManager.autoConnect("IR_WIFI");
Serial.println("\nWiFi connect succcess!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); //打印本设备IP
Serial.print("gateway address: ");
Serial.println(WiFi.gatewayIP()); //打印网关IP
httpClientRequest();
udp.begin(9); // 指定本地端口号
Serial.println("UDP started");
irsend.begin(); // 启动IR发送
irrecv.enableIRIn(); // 启动IR接收
}
void loop() {
UDP_IR();
IR_UDP();
}
// 发送HTTP请求并且将服务器响应通过串口输出
void httpClientRequest(){
WiFiClient client; //新添加
//重点1 创建 HTTPClient 对象
HTTPClient httpClient;
//重点2 通过begin函数配置请求地址。此处也可以不使用端口号和PATH而单纯的
httpClient.begin(client,URL);
Serial.print("URL: "); Serial.println(URL);
//重点3 通过GET函数启动连接并发送HTTP请求
int httpCode = httpClient.GET();
Serial.print("Send GET request to URL: ");
Serial.println(URL);
//重点4. 如果服务器响应HTTP_CODE_OK(200)则从服务器获取响应体信息并通过串口输出
//如果服务器不响应HTTP_CODE_OK(200)则将服务器响应状态码通过串口输出
if (httpCode == HTTP_CODE_OK) {
// 使用getString函数获取服务器响应体内容
String responsePayload = httpClient.getString();
Serial.println("Server Response Payload: ");
Serial.println(responsePayload);
} else {
Serial.println("Server Respose Code");
Serial.println(httpCode);
}
//重点5. 关闭ESP8266与服务器连接
httpClient.end();
}
void IR_UDP(){
if (irrecv.decode(&results)) {
// print() & println() can't handle printing long longs. (uint64_t)
serialPrintUint64(results.value, HEX);
uint8_t *p=(uint8_t *)&results.value;
udp.beginPacket(remote_IP, localUdpPort); //准备发送数据
udp.write("IR");
udp.write(*p);
udp.write(*(p+1));
udp.write(*(p+2));
udp.write(*(p+3));
udp.write(*(p+4));
udp.write(*(p+5));
udp.write(*(p+6));
udp.write(*(p+7));
udp.endPacket();
irrecv.resume(); // Receive the next value
}
}
void UDP_IR() {
// 检查是否有数据包到达
int packetSize = udp.parsePacket();
if (packetSize) {
// 保证数据包长度不超过缓冲区
if(packetSize > 255) {
packetSize = 255;
}
// 读取数据并打印
uint8_t packetBuffer[11]={0};
int len = udp.read(packetBuffer, packetSize);
// if (len > 0) {
// packetBuffer[len] = '\0';
// Serial.println(packetBuffer);
// }
uint64_t nec=0;
uint8_t *p1=(uint8_t *)&packetBuffer[0];
uint8_t *p2=(uint8_t *)&nec;
if(*p1==0x49 && *(p1+1)==0x52)
{
Serial.println("NEC");
if(*(p1+5) ==0x00) //按键码
{
*p2 =*(p1+2);
*(p2+1)=*(p1+3);
*(p2+2)=*(p1+4);
*(p2+3)=*(p1+5);
}
else if(*(p1+5)==0xff)
nec=0xFFFFFFFFUL;
}
irrecv.pause(); // Pause collection of received IR data.
//0x00FF12EDUL : 用户码一般为0x00+用户反码一般为0xFF+数据码+数据反码 ,注意大小端模式,会造成数据不对应,实际内容是一样的。
irsend.sendNEC(nec);
irrecv.resume(); // Receive the next value
}
}