arduino控制红外接收,发送
对于空调的控制 一般都是红外控制。这样我们就可以将esp模块和红外模块联合使用
这样来对空调进行远程的无线的控制
演示视频:
红外接收
使用的是引脚11 使用波特率是9600
调用的IRremote库,将接收到的光信号转换为数值。
\#include <IRremote.h>
int PIN_RECV = 11;
IRrecv irrecv(PIN_RECV);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value);
irrecv.resume();
}
}
可以根据这个代码 来获取到 遥控器上相关按键的值
记录下来 用到下面进行发送
(在我的这个项目中 我是要演示效果,所以控制的是一个数码管 使用arduino pro mini 进行控制 通过红外接收 接收到的信息 处理后控制TM1637数码管进行显示)
红外发送
下列代码经过改造,是使用在要红外控制显示。思路是一样的
就是使用 sendNEC(); 函数发送值,可以发送十六进制的值或者十进制等。
代码网上很多
也可以参考我博客上
使用esp开发
发送给esp相应的指令 进入callback函数中进行解析
解析之后 控制红外发送,发送相应的码段
使用的esp12f GPIO4引脚
使用到的库有
<IRremoteESP8266.h>
<IRsend.h> // 红外发送的库
<ESP8266WiFi.h>
<PubSubClient.h> // mqtt 的库
- 制定发送和接收的规则
>char* order_infor[] ={“on”,”off”,”tema”,”tems”,”warm”,”cold”,”winda”,”winds”}; // 控制的温度
long enc[] ={0xFF30CF,0xFF18E7,0xFF7A85,0xFF10EF,0xFF38C7,0xFF5AA5,0xFF42BD,0xFF4AB5};//发射的红外 十六进制值
接收到0(打开) 发送第一个编码 接收到1 (关闭) 发送第二个编码…..
2. callback中处理 接收到的值(防止出现错误的命令)
int isint = 0;// 如果有字母 就为1 全数字就为0
for (int i=0; i< strplayload.length();i++) // 检测接收到的命令里面是否含有 非数字的字符
{
if (!isDigit(strplayload[i]))
{
isint = 1;
break;
}
}
- 根据callback处理的结果 进行发送 (callback中代码)
if(isint == 0){
int older_air = strplayload.toInt() ; // 转换为 int类型
if(older_air >=1 && older_air<=8){
irsend.sendSony(enc[older_air - 1], 12);
client.publish("air_cond/status", "IR remote is running");
client.publish("air_cond/status", order_infor[older_air -1]);
}
完整代码仅供参考
根据自己的应用场景 再进行相应的更改代码
\#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
// Update these with values suitable for your network.
const char* ssid = "nihen_pc";
const char* password = "#";
const char* mqtt_server = "192.168.137.41";
WiFiClient espClient;
PubSubClient client(espClient);
long lastMsg = 0;
char msg[50];
int value = 0;
String tmpTopic;
String strplayload;
#define IR_LED 4 // ESP8266 GPIO pin to use. Recommended: 4 (D2).
IRsend irsend(IR_LED); // Set the GPIO to be used to sending the message.
char* order_infor[] ={"on","off","tema","tems","warm","cold","winda","winds"}; // 控制的温度
long enc[] ={0xFF30CF,0xFF18E7,0xFF7A85,0xFF10EF,0xFF38C7,0xFF5AA5,0xFF42BD,0xFF4AB5};//发射的红外 十六进制值
void setup() {
//pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
irsend.begin();
// Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
tmpTopic = String((char *)topic);
payload[length] = '\0';
strplayload = String((char*)payload);
client.publish("mp3player/status", "get older ");
int isint = 0;// 如果有字母 就为1 全数字就为0
for (int i=0; i< strplayload.length();i++) // 检测接收到的命令里面是否含有 非数字的字符
{
if (!isDigit(strplayload[i]))
{
isint = 1;
break;
}
}
if(isint == 0){
int older_air = strplayload.toInt() ; // 转换为 int类型
if(older_air >=1 && older_air<=8){
irsend.sendSony(enc[older_air - 1], 12);
client.publish("air_cond/status", "IR remote is running");
client.publish("air_cond/status", order_infor[older_air -1]);
}
}
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("connected");
client.publish("air_cond/status", "init...");
// ... and resubscribe
client.subscribe("air_cond/older");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
}
[…] arduino控制红外接收,发送 […]