2017-02-12 106 views
2

我創建了通過Wi-Fi控制的水壺。我使用了Wi_fi模塊ESP8266,Arduino,水傳感器,繼電器和溫度傳感器。水壺在第一次啓動時工作正常,所以我在代碼中爲Arduino所做的一切正常工作。唯一的問題是當我需要通過Wi-Fi獲取數據到Android應用時。我在應用程序中使用了AsyncTask客戶端,有時我無法連接到我的水壺,或者當我想要獲得實際溫度時,例如20°C的溫度會很好,但是實際溫度會在那裏出現。發生這種情況時,我再次打開應用程序連接,然後再次運行。水壺關閉正確,所以android發送正確的數據只有ESP8266和Android應用程序之間的連接是有點bug。有沒有其他的可能性來建立ESP和Android之間的通信以發送正確的數據以進行全週期?通過Wi-Fi連接的Arduino和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應用發送溫度。任何解決方案

+0

嘗試將數據發送到您的手機每秒多少次? – leetibbett

+0

其實我真的不知道......你爲什麼要問?你認爲ESP正試圖發送太快? – Tomiqo

+0

我誤解了代碼。你的android設備多久請求一次數據? – leetibbett

回答

0

如果你不需要太多的IO引腳,你可以重新設計你的硬件,然後重寫所有內容到ESP8266。因此避免發送AT命令並且可以輕鬆調試通信。它可以在Arduino IDEESP8266 Arduino Core

+0

我發現這篇文章[鏈接](http://web-engineering.info/node/52)我會嘗試。它適用於ESP8266庫 – Tomiqo