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アプリに温度を送信することを止めることがあります。どんな解決策ですか?
これは何回あなたの携帯電話にデータを送信しようとしていますか? – leetibbett
実際に私はそれを知らない...なぜ尋ねる? ESPがあまりにも速く送信しようとしていると思いますか? – Tomiqo
私はコードを誤読しました。あなたのアンドロイドデバイスがデータを求めている頻度はどれくらいですか? – leetibbett