求助,红外模块和wifi模块单独可以用,但是放在一起了不行-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3814|回复: 8

[未解决] 求助,红外模块和wifi模块单独可以用,但是放在一起了不行

[复制链接]
发表于 2018-4-10 10:43 | 显示全部楼层 |阅读模式
#include <IRremote.h>
//#include <IRremoteInt.h>

#include <Adafruit_NeoPixel.h>
#include <SoftwareSerial.h>

#define PIN 11
#define LED_number 16
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_number, PIN, NEO_GRB + NEO_KHZ800);
#define WIFI_TX       9
#define WIFI_RX       8
SoftwareSerial wifi(WIFI_RX, WIFI_TX);   //RX, TX
String _comdata_wifi = "";             //for incoming wifi serial data

int BlueColor=000;
int GreenColor=000;
int RedColor=000;

int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {

irrecv.enableIRIn();

  Serial.begin(9600);
   wifi.begin(115200);
  strip.begin();
  strip.setBrightness(50);
  Serial.println("system is ready!");
  wifi.println("AT+CWMODE=3\r\n");
  delay(500);
  wifi.println("AT+CIPMUX=1\r\n");
  delay(500);
  wifi.println("AT+CIPSERVER=1,5000\r\n");
  delay(500);


}

void loop() {

  if(Serial.available()){
    String order = "";
    while (Serial.available()){
      char cc = (char)Serial.read();
      order += cc;
      delay(2);
    }
    order.trim();
    wifi.println(order);
  }
  String wifidata=getWifiSerialData();
    if(wifidata!=""){
    Serial.println(wifidata);
Serial.println(wifidata.substring(12,15));
if(wifidata.substring(12,15)=="RGB")
  {
      RedColor=wifidata.substring(15,18).toInt();
      GreenColor=wifidata.substring(18,21).toInt();
      BlueColor=wifidata.substring(21,24).toInt();
      //colorRGB(RedColor,GreenColor,BlueColor);
      colorRGB1(RedColor,GreenColor,BlueColor);
      Serial.print(GreenColor);
      Serial.print(RedColor);
      Serial.print(BlueColor);
       Serial.print("\r\n");
      delay(20);
  }
  }
  wifidata="";

   if (irrecv.decode(&results)) {
    switch(results.value)
    {
    case 0xFF6897:colorRGB1(0,0,0);break;//0
    case 0xFF30CF:colorRGB1(255,0,0);break;//1
    case 0xFF18E7:colorRGB1(255,128,0);break;//2
    case 0xFF7A85:colorRGB1(255,255,0);break;  //3
    case 0xFF10EF:colorRGB1(0,255,0);break; //4
    case 0xFF38C7:colorRGB1(0,255,255);break;//5
    case 0xFF5AA5:colorRGB1(0,0,255);break;//6
    case 0xFF42BD:colorRGB1(128,0,255);break;//7
    case 0xFF4AB5:colorRGB1(255,255,255);break;//8
    }
    irrecv.resume(); // 接收下一个值
  }


}

//void colorRGB(int red, int green, int blue){
//      analogWrite(RedPin,constrain(red,0,255));
//      analogWrite(GreenPin,constrain(green,0,255));
//      analogWrite(BluePin,constrain(blue,0,255));
//}
void colorRGB1(int red, int green, int blue){
      for(uint8_t j=0;j<16;j++)
      {
      strip.setPixelColor(j,constrain(red,0,255),constrain(green,0,255),constrain(blue,0,255));
      strip.show();
      delay(2);
      }
      delay(200);
      }


String readTtl() {
  String comdata = "";
  while (Serial.available())
  {
    comdata += char(Serial.read());
    delay(2);
  }
  return comdata;
}

String getWifiSerialData(){
  String _comdata_wifi = "";             //for incoming wifi serial data
  while (wifi.available()>0){
    _comdata_wifi += char(wifi.read());   //get wifi data
  }
   return _comdata_wifi;
}


我是想做一个可以同时红外和wifi控制的led彩灯,wifi可以单独控制颜色,红外也可以单独控制颜色,但两个代码合在一起就不行了。
只能红外遥控器控制,wifi控制不能。
就是代码中的 irrecv.enableIRIn(); 这个红外启动函数导致了wifi乱码。


原本wifi单独接收,控制颜色没有问题

QQ图片20180410103607.png

setup()加了 irrecv.enableIRIn(); 后就乱码,就wifi控制不了颜色,但wifi还是有接收到数据的
QQ图片20180410103601.png

请问有什么好的解决方法,试过改波特率,但是好像不行,因为硬件模块都是固定的。

发表于 2018-4-13 14:41 | 显示全部楼层
lyj764299121 发表于 2018-4-13 09:02
我试过错开了arduino uno上所有的带有定时器的引脚,但问题还是照样发生。 ...

你的几个需求都运行在虚拟串口或类虚拟串口状态,大概看了下库文件,红外更是改动了几个定时器,影响到了wifi的波特率,造成wifi乱码,解决办法确实如奈何大侠所言,改用硬件串口多的开发板才能正常运行。
或者,看你硬件串口只用于与计算机通讯,你试着把wifi换到硬件端口上去,用外部供电(不用USB),看看是否有效。
发表于 2018-4-10 11:08 | 显示全部楼层
貌似和内部定时器冲突有关,错开引脚试试
 楼主| 发表于 2018-4-10 11:22 | 显示全部楼层
上海老王 发表于 2018-4-10 11:08
貌似和内部定时器冲突有关,错开引脚试试

怎么错开是esp8266—wifi模块错开吗?
发表于 2018-4-10 12:35 | 显示全部楼层
估计是两个库用到了同一个定时器,要自己改库还是挺废时间的,估计对你也太难了。
最简单的办法:换arduino mega,有足够多的硬件串口,就不会用到软件串口了
 楼主| 发表于 2018-4-10 14:04 | 显示全部楼层
奈何col 发表于 2018-4-10 12:35
估计是两个库用到了同一个定时器,要自己改库还是挺废时间的,估计对你也太难了。
最简单的办法:换arduino ...

除了换硬件这个方法,有没有改上面代码的方法实现

点评

看懂代码。。。然后改了。。。  详情 回复 发表于 2018-4-10 15:17
发表于 2018-4-10 15:17 | 显示全部楼层
lyj764299121 发表于 2018-4-10 14:04
除了换硬件这个方法,有没有改上面代码的方法实现

看懂代码。。。然后改了。。。
 楼主| 发表于 2018-4-13 09:02 | 显示全部楼层
上海老王 发表于 2018-4-10 11:08
貌似和内部定时器冲突有关,错开引脚试试

我试过错开了arduino uno上所有的带有定时器的引脚,但问题还是照样发生。
发表于 2022-7-5 00:44 | 显示全部楼层
听说wifi 会干扰 红外接收  我断开esp32 的WiFi连接  红外马上正常
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 00:43 , Processed in 0.424075 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表