2017-02-12 28 views
2

Я создал чайник, управляемый через Wi-Fi. Я использовал Wi_fi модуль ESP8266, Arduino, датчик воды, реле и датчик температуры. Чайник отлично работает при первом запуске, поэтому все, что у меня есть в коде для Arduino, работает правильно. Проблема только в том, что мне нужно получить данные в Android-приложении через Wi-Fi. Я использовал клиент AsyncTask в приложении, и иногда я не могу подключиться к моему чайнику, или когда я хочу получить фактическую температуру, он идет хорошо, например, при 20 ° C, но тогда температура в нем регулируется. Когда это произойдет, я снова открою приложение, а затем снова заработает. Чайник отключается правильно, поэтому андроид посылает правильные данные, только соединение между ESP8266 и Android-приложением немного ошибочно. Есть ли еще одна возможность установить связь между ESP и Android для отправки правильных данных для полного цикла?Arduino и Android через 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); 
} 

Как я сказал, что все в целом код работы, я хотел только, что Wi-Fi модуль иногда перестает посылать температуру в приложение для Android. Любые решения?

+0

Сколько раз в секунду вы пытаетесь отправить данные на свой телефон? – leetibbett

+0

На самом деле я действительно не знаю, что ... Почему ты спрашиваешь? Думаю, ESP пытается отправить слишком быстро? – Tomiqo

+0

Я неправильно читаю код. Как часто ваше устройство Android запрашивает данные? – leetibbett

ответ

0

Если вам не нужны большие контакты IO, и вы можете переделать свое оборудование, а затем переписать все на ESP8266. Таким образом, избегайте отправки AT-команд, и связь может быть легко отлажена. Это можно сделать в Arduino IDE с ESP8266 Arduino Core

+0

Я нашел эту статью [link] (http://web-engineering.info/node/52) Я попробую это. Он работает с библиотекой ESP8266 – Tomiqo