2017-02-12 8 views
2

Wi-Fiで制御されたケトルを作成しました。私はWi_fiモジュールESP8266、Arduino、水センサー、リレー、温度センサーを使用しました。ケトルは最初の開始時に正常に動作するので、私がArduinoのコードで持っているものはすべて正しく動作します。問題は、Wi-Fi経由でAndroidアプリにデータを取得する必要があるときだけです。アプリケーションでAsyncTaskクライアントを使用しましたが、時々私はケトルに接続できません。あるいは、実際の温度を取得したい場合、たとえば20℃でうまくいく場合がありますが、実際の温度はそれに固執します。これが発生すると、私は再びアプリケーションを開き、再び接続します。ケトルは正しくスイッチオフされ、アンドロイドが正しいデータを送信しているので、ESP8266とAndroidアプリとの接続はちょっとバグがあります。 ESPとAndroidの間に通信を確立して、完全なサイクルで正しいデータを送信する可能性はありますか?ArduinoとAndroid over Wi-Fi接続

#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

私はコードを誤読しました。あなたのアンドロイドデバイスがデータを求めている頻度はどれくらいですか? – leetibbett

答えて

0

多くのIOピンを必要とせずにハードウェアを再設計できる場合は、すべてをESP8266に書き換えてください。 ATコマンドの送信を避け、通信を簡単にデバッグすることができます。 Arduino IDEで行うことができますESP8266 Arduino Core

+0

私はこの記事を見つけた[リンク](http://web-engineering.info/node/52)私はそれを試みます。それはESP8266ライブラリで動作します – Tomiqo