我创建了通过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应用程序发送温度。任何解决方案?
答案 0 :(得分:0)
如果您不需要太多IO引脚并且可以重新设计硬件,则将所有内容重写为ESP8266
。因此,避免发送AT命令,并且可以容易地调试通信。可以使用ESP8266 Arduino Core
Arduino IDE
中完成