E đang đùng esp8266-01 + arduino uno để gửi data lên thingspeak.....nhưng chạy nhiều lúc lại gặp lỗi này và k gửi đc data lên..bác nào có kinh nghiệm xem lỗi này xử lí giup e vs ạ
code:
// Hàm gửi lệnh AT
int8_t sendATcommand(char* ATcommand, char* expected_answer, unsigned int timeout) {
uint8_t x = 0, answer = 0;
char response[100];
unsigned long previous;
memset(response, '\0', 100); // xóa buffer
delay(100);
while ( Serial1.available() > 0) Serial1.read(); // đọc input
Serial1.println(ATcommand); // Gửi lệnh AT
x = 0;
previous = millis();
// Chờ phản hồi
do {
if (Serial1.available() != 0) {
// Nếu có dữ liệu trong buffer UART, đọc và kiểm tra nó với expected_answer
response[x] = Serial1.read();
x++;
// Nếu đúng thì trả kết quả answer = 1, thoát hàm
if (strstr(response, expected_answer) != NULL)
{
answer = 1;
}
}
} while ((answer == 0) && ((millis() - previous) < timeout)); // Nếu sai thì tiếp tục thử lại cho tới hết thời gian timeout
Serial.println(response); // In giá trị nhận được để debug
return answer;
}
// Hàm gửi lệnh AT 2 để gửi dữ liệu
int8_t sendATcommand2(char* ATcommand, char* expected_answer1,
char* expected_answer2, unsigned int timeout) {
uint8_t x = 0, answer = 0;
char response[100];
unsigned long previous;
memset(response, '\0', 100); // Xóa buffer
delay(100);
while ( Serial1.available() > 0) Serial1.read();
Serial1.println(ATcommand); // Gửi lệnh AT
x = 0;
previous = millis();
// Chờ phản hồi
do {
// Nếu có dữ liệu từ UART thì đọc và kiểm tra
if (Serial1.available() != 0) {
response[x] = Serial1.read();
x++;
// Trả về giá trị 1 nếu nhận được expected_answer1
if (strstr(response, expected_answer1) != NULL)
{
answer = 1;
}
// Trả về giá trị 2 nếu nhận được expected_answer2
else if (strstr(response, expected_answer2) != NULL)
{
answer = 2;
}
}
}
// Đợi time out
while ((answer == 0) && ((millis() - previous) < timeout));
Serial.println(response); // In giá trị nhận được để debug
return answer;
}
/***************************************************
Kết nối wifi
****************************************************/
void connectWiFi(void)
{
sendATcommand("AT", "OK", 5000); //Kiểm tra kết nối
sendATcommand("AT+CWMODE=1", "OK", 5000); //Cấu hình chế độ station
sendATcommand("AT+CWJAP=\"HAHA\",\"mothaibabon\"", "OK", 5000); //ten_wifi và mat_khau
//sendATcommand("AT+CWJAP=\"HAHAHA\",\"mothaibabon\"", "OK", 5000);
sendATcommand("AT+CIPMUX=1", "OK", 5000); // Bật chế độ đa kết nối
sendATcommand("AT+CIFSR", "OK", 5000); // Hiển thị ip
Serial.println("ESP8266 Connected");
}
/***************************************************
Kết nối với ThingsSpeak.com
****************************************************/
void startThingSpeakCmd(void)
{
memset(aux_str, '\0', 100);
snprintf(aux_str, sizeof(aux_str), "AT+CIPSTART=1,\"TCP\",\"%s\",80", IP);
if (sendATcommand2(aux_str, "OK", "ERROR", 20000) == 1)
{
Serial.println("OK Connected Thingspeak");
}
}
/***************************************************
Gửi data lên channel ThingsSpeak.com
****************************************************/
void sendThingSpeakCmd(void)
{
memset(aux_str, '\0', 100);
sprintf(aux_str, "AT+CIPSEND=1,%d", legth);
if (sendATcommand2(aux_str, ">", "ERROR", 20000) == 1)
{
Serial.println(cmd);
sendATcommand2(cmd, "SEND OK", "ERROR", 30000);
}
}
/***************************************************
Cập nhật dữ liệu lên thingspeak.com
****************************************************/
void updatedataThingSpeak(void)
{
for( int i=0; i < 2 ;i++)
{
startThingSpeakCmd ();
sprintf(cmd, "%s&field1=%d&field2=%d&field3=%d&field4=%d&field5=%d&field6=%d&field7=%d&field8=%d", msg,tempDHT, humDHT, lumen, soilMoisttb, pumpWaterStatus1,pumpWaterStatus2, pumpWaterStatus3, pumpmistStatus);
legth = strlen(cmd) + 2;
sendThingSpeakCmd();
sendATcommand("AT+CIPCLOSE=1", "OK", 5000);
}
}
/***************************************************
Cập nhật trang thai bom lên thingspeak.com
****************************************************/
void updateThingSpeak(void)
{
for (int i = 0; i < 2; i++)
{
startThingSpeakCmd ();
sprintf(cmd, "%s&field5=%d&field6=%d&field7=%d&field8=%d", msg, pumpWaterStatus1,pumpWaterStatus2, pumpWaterStatus3, pumpmistStatus);
legth = strlen(cmd) + 2;
sendThingSpeakCmd();
sendATcommand("AT+CIPCLOSE=1", "OK", 5000);
}
}