arduino输出乱码与远程控制

最近在做项目,使用arduino控制超声波,pm2.5等传感器,以及继电器等,然后连接wifi进行远程控制

发现代码都正确 ,但是板子串口输出是乱码的情况

一一排查之后发现是超声波的trig口接在了wemos版的d9上,这是一个板子自带的led灯的控制口

超声波传感器总是发出‘滋滋’的声音,吓我一跳

最后改为了,d8,d10才解决,代码如下

#include
#define MAX_SRV_CLIENTS 1
#define dustPin A0
#define Trig  0 //引脚Tring 连接 IO D8
#define Echo 15 //引脚Echo 连接 IO D10
int flower_led=5;//d3
int led_led=4;//d4
int door_led=14;//d5
int power_led=12;//d6
int curatin_led=13;//d7

float dustVal=0;
int ledPower=16;//d2
int delayTime=280;
int delayTime2=40;
float offTime=9680;
float cm; //距离变量
float temp; //



//连接 AP 的账号
const char* ssid = "Tenda_3BFE70";
//连接用的密码
const char* password = "lizhendewifi";
WiFiServer server(2222);
WiFiClient serverClients[MAX_SRV_CLIENTS];
void setup()
{
  Serial.begin(115200);
  pinMode(ledPower,OUTPUT);
  pinMode(dustPin,INPUT);

  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
  
  pinMode(flower_led, OUTPUT);
  digitalWrite(flower_led, HIGH);//设定通电后电机不转
  pinMode(led_led, OUTPUT);
  pinMode(door_led, OUTPUT);
  pinMode(power_led, OUTPUT);
  pinMode(curatin_led, OUTPUT);


  WiFi.begin(ssid, password);
  Serial.print("\nconnecting to "); Serial.println(ssid);
  uint8_t i = 0;
  //此处省略对于连接网络失败的判断,但是连接网络还是需要一定的延时
  while (WiFi.status() != WL_CONNECTED && i++ < 20)delay(500);
  if (i == 21)
    Serial.println("error internet");
  server.begin();
  server.setNoDelay(true);
  Serial.println(WiFi.localIP());
  Serial.println(" and 2222");
  
}
void loop()
{
  uint8_t i;
  if (server.hasClient())
  {
    for (i = 0; i < MAX_SRV_CLIENTS; i++)
    {
      if (!serverClients[i] || !serverClients[i].connected())
      {
        if (serverClients[i])serverClients[i].stop();
        serverClients[i] = server.available();
        Serial.println("a client accept");
        Serial.println(i);
        continue;
      }
    }
    WiFiClient serverClient = server.available();
    serverClient.stop();
  }
  for (i = 0; i < MAX_SRV_CLIENTS; i++)
  {
    if (serverClients[i] && serverClients[i].connected())
    {
//      这个是pm2.5的数据感知
        delay(2000);
        digitalWrite(ledPower,LOW);
        delayMicroseconds(delayTime);
        dustVal=analogRead(dustPin);
        delayMicroseconds(delayTime2);
        digitalWrite(ledPower,HIGH);
        delayMicroseconds(offTime);
        char dust_string[55];
        itoa(dustVal, dust_string, 10);
        char new_dust_string[55] = "dust:";
        char flag_sectaion[] = ",";
        strcat(dust_string, flag_sectaion);
        strcat(new_dust_string,dust_string);
        
        //这个是超声波的测距信息
              //给Trig发送一个低高低的短时间脉冲,触发测距
        digitalWrite(Trig, LOW); //给Trig发送一个低电平
        delayMicroseconds(2);    //等待 2微妙
        digitalWrite(Trig,HIGH); //给Trig发送一个高电平
        delayMicroseconds(10);    //等待 10微妙
        digitalWrite(Trig, LOW); //给Trig发送一个低电平
        
        temp = float(pulseIn(Echo, HIGH)); //存储回波等待时间,
        //pulseIn函数会等待引脚变为HIGH,开始计算时间,再等待变为LOW并停止计时
        //返回脉冲的长度
        
        //声速是:340m/1s 换算成 34000cm / 1000000μs => 34 / 1000
        //因为发送到接收,实际是相同距离走了2回,所以要除以2
        //距离(厘米)  =  (回波时间 * (34 / 1000)) / 2
        //简化后的计算公式为 (回波时间 * 17)/ 1000
        cm = (temp * 17 )/1000; //把回波时间换算成cm

        int flower_status=digitalRead(flower_led);
        int led_status=digitalRead(led_led);
        int door_status=digitalRead(door_led);
        int power_status=digitalRead(power_led);
        int curatin_status=digitalRead(curatin_led);
        //距离信息封装
        char distance_string[55];
        itoa(cm, distance_string, 10);
        char new_distance_string[55] = "distance:";
        strcat(distance_string, flag_sectaion);
        strcat(new_distance_string,distance_string);

                //浇花信息封装
        char flower_string[55];
        itoa(flower_status, flower_string, 10);
        char new_flower_string[55] = "water_flower_status:";
        strcat(flower_string, flag_sectaion);
        strcat(new_flower_string,flower_string);

        //灯信息封装
        char led_string[55];
        itoa(led_status, led_string, 10);
        char new_led_string[55] = "light_status:";
        strcat(led_string, flag_sectaion);
        strcat(new_led_string,led_string);

                //门信息封装
        char door_string[55];
        itoa(door_status, door_string, 10);
        char new_door_string[55] = "door_status:";
        strcat(door_string, flag_sectaion);
        strcat(new_door_string,door_string);

                //电源信息封装
        char power_string[55];
        itoa(power_status, power_string, 10);
        char new_power_string[55] = "power_status:";
        strcat(power_string, flag_sectaion);
        strcat(new_power_string,power_string);


                //窗帘信息封装
        char curatin_string[55];
        itoa(curatin_status, curatin_string, 10);
        char new_curatin_string[55] = "curtain_status:";
        strcat(curatin_string, flag_sectaion);
        strcat(new_curatin_string,curatin_string);
        
        char s[255] = "infoone-";
        strcat(s, new_dust_string);
        strcat(s, new_flower_string);
        strcat(s, new_led_string);
        strcat(s, new_door_string);
        strcat(s, new_power_string);
        strcat(s, new_curatin_string);
        strcat(s, new_distance_string);
        
        serverClients[i].write(s, strlen(s));
        Serial.println(s);
        delay(1);

    }
  }
  for (i = 0; i < MAX_SRV_CLIENTS; i++)
  {
    if (serverClients[i] && serverClients[i].connected())
    {
        if (serverClients[i].available())
      {
        while (serverClients[i].available())
        {
           Serial.println("服务器收到数据");
          String line = serverClients[i].readStringUntil('\n');
          Serial.println(line);
          //这个地方加延时是因为服务器收到的数据零碎,不足以判别,等待接收到完整数据,并串口输出,此时数据大概已经组装好了
          delay(1000);
          if (line.equals("curtain_open"))
          {
            digitalWrite(curatin_led, HIGH);//设定是灭的
          }
          if (line.equals("curtain_close"))
          {
            digitalWrite(curatin_led, LOW); //设定是灭的
          }
          if (line.equals("light_open"))
          {
            digitalWrite(led_led, HIGH);//设定是灭的
          }
          if (line.equals("light_close"))
          {
            digitalWrite(led_led, LOW); //设定是灭的
          }
          if (line.equals("water_open"))
          {
            digitalWrite(flower_led, HIGH);//设定是灭的
          }
          if (line.equals("water_close"))
          {
            digitalWrite(flower_led, LOW);//设定是灭的
          }
           if (line.equals("door_open"))
          {
            digitalWrite(door_led, HIGH);//设定是灭的
          }
          if (line.equals("door_close"))
          {
            digitalWrite(door_led, LOW);//设定是灭的
          }
           if (line.equals("power_open"))
          {
            digitalWrite(power_led, HIGH);//设定是灭的
          }
          if (line.equals("power_close"))
          {
            digitalWrite(power_led, LOW);//设定是灭的
          }

        }
      }
    }
  }

 delay(2000);
   
  
}

 

你可能感兴趣的:(arduino)