Arduino和Android通过Wi-Fi连接

时间:2017-02-12 15:04:09

标签: android arduino wifi esp8266 arduino-esp8266

我创建了通过Wi-Fi控制的水壶。我使用了Wi_fi模块ESP8266,Arduino,水传感器,继电器和温度传感器。水壶在第一次启动时工作正常,所以我在Arduino代码中所拥有的一切都能正常工作。唯一的问题是我需要通过Wi-Fi将数据传输到Android应用程序。我在应用程序中使用了AsyncTask客户端,有时我无法连接到我的水壶,或者当我想要获得实际温度时它很好,例如20°C,但实际温度卡在那里。发生这种情况时,我再次重新打开应用程序连接,然后再次运行。水壶正确关闭所以android正在发送正确的数据只有ESP8266和Android应用程序之间的连接有点儿。是否有其他可能性在ESP和Android之间建立通信以发送完整周期的正确数据?

#include <OneWire.h>       
OneWire  ds(9);             
int nPinWaterState = 8;     
int nPinRelayState = 7;          
byte addr[8];              
bool bRelay=false;           
bool bWater=true;           
int nTemp=0;            
int nFinishTemp=-1;    
void setup()
void setup()
{
  Serial.begin(9600);                                     
  InitDS18B20();                                          
  pinMode(nPinWaterState, INPUT);                          
  pinMode(nPinRelayState, OUTPUT);                              
  digitalWrite(nPinRelayState,HIGH);                           

  sendData("AT+RST\r\n",1000);                            
  sendData("AT+CWSAP=\"Kettle\",\"123\",3,0\r\n",200);   
  sendData("AT+CWMODE=2\r\n",200);                        
  sendData("AT+CIPAP=\"192.168.0.100\"\r\n",200);         
  sendData("AT+CWDHCP=0,1\r\n",200);                      
  sendData("AT+CIPMUX=1\r\n",200);                        
  sendData("AT+CIPSERVER=1,8888\r\n",200);                
 }    
void loop()
{
  ReadSensors();                                                    
  if(!bWater || nTemp>=nFinishTemp)                           
  {
     bRelay=false;
  }

  if(Serial.available())                                            
  {
    if(Serial.find((char*)"+IPD,"))                                 
{

 String strRead =Serial.readStringUntil('\n');                  
 int connectionId=strRead[0]-48;                                

 if(Serial.find((char*)"AND:"))                                 
 {                                  
   strRead=Serial.readStringUntil('\n');                        
   nFinishTemp=strRead.substring(1,4).toInt();              
   if(strRead[0]=='T')                                          
   {
      if(bWater && nTemp<nFinishTemp)                     
      {
        bRelay=true;
      }
   }
   else
   {
      bZap=false;
   }
 }

我发送给Android设备的这个字符串

    String strSend = "KET:";
    if(bRelay) 
{
strSend=strSend+'T';
}                                                              
         else
         {
            strSend=strSend+'F';
         }

 if(bWater)                                               
 {
    strSend=strSend+'T';
 }
 else
 {
    strSend=strSend+'F';
 }

 char strTemp[3];
 sprintf (strTemp, "%03d",nTemp);                 
 strSend=strSend+strTemp;
 String cipSend = "AT+CIPSEND=";
 cipSend += connectionId;
 cipSend += ",";
 cipSend +=strSend.length();
 cipSend +="\r\n";

 sendData(cipSend,20);
 sendData(strSend,20);
 String closeCommand = "AT+CIPCLOSE="; 
 closeCommand+=connectionId;                           
 closeCommand+="\r\n";
 sendData(closeCommand,20); 
}
}

   if (bRelay)                                               
   {
     digitalWrite(nPinRelayState,LOW);
   }
   else
   {
     digitalWrite(nPinRelayState,HIGH);      
   } 
}
    String sendData(String command, const int timeout)
{
    String response = "";
    Serial.print(command);                                                                             
    long int time = millis();
    while( (time+timeout) > millis())
{
  while(Serial.available())
  {                                             
    char c = Serial.read();                     
    response+=c;
  }  
}
return response;
}
void ReadSensors(void)
{                                    
  float tempC;
  tempC=ReadDS18B20();
  nTemp=(int)tempC;                                                 
  bWater = !digitalRead(nPinWaterState); 
}

最后DS18B20温度传感器工作

    void InitDS18B20(void)
{

if ( !ds.search(addr)) {

ds.reset_search();
delay(100);
return;
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {

      return;
  }
}
float ReadDS18B20(void)
{
  byte i;
  byte present = 0;                                          
  byte data[12];
  float celsius;

  ds.reset();
  ds.select(addr);  
  ds.write(0x44, 1);                        

  delay(100);                              


  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);                          

  for ( i = 0; i < 9; i++) {               
  data[i] = ds.read();
  }
  int16_t raw = (data[1] << 8) | data[0];

  byte cfg = (data[4] & 0x60);

  if (cfg == 0x00) raw = raw & ~7;         
  else if (cfg == 0x20) raw = raw & ~3;   
  else if (cfg == 0x40) raw = raw & ~1;    


  celsius = (float)raw / 16.0;
  return(celsius);
} 

正如我所说,整个代码中的所有内容都工作,因为我只希望WiFi模块有时会停止向Android应用程序发送温度。任何解决方案?

1 个答案:

答案 0 :(得分:0)

如果您不需要太多IO引脚并且可以重新设计硬件,则将所有内容重写为ESP8266。因此,避免发送AT命令,并且可以容易地调试通信。可以使用ESP8266 Arduino Core

Arduino IDE中完成