我創建了通過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應用發送溫度。任何解決方案
嘗試將數據發送到您的手機每秒多少次? – leetibbett
其實我真的不知道......你爲什麼要問?你認爲ESP正試圖發送太快? – Tomiqo
我誤解了代碼。你的android設備多久請求一次數據? – leetibbett