Отправка данных о температуре и почве с использованием esp8266-01 через software serial
Код, который я использовал, был из Интернета, и я пытался использовать его для отправки данных в firebase через веб-сервер. Но вывод, который я получаю от последовательного монитора, был просто «ATE0», что означает, что что-то не так. Следовательно, я не могу приступить к решению этой проблемы.
Я испробовал несколько ресурсов в Интернете, чтобы решить мою текущую проблему.
Я надеюсь, что кто-то может мне помочь
Спасибо :)
#include <SoftwareSerial.h>;
SoftwareSerial Serial1(10, 11);
#include "DHT.h"
#define Terra "terra1"
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2; эйагагана соя
int j=0;
int prev=0;
int pres=0;
String status="";
String buff(64);
String getStr(128);
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
// Serial.println(F("Датчики влажности и влажности почвы"));
delay(2000);
Serial1.setTimeout(5000);
dht.begin();
if (!connectWiFi()) {
Serial.println("Can not connect to the WiFi.");
while (true)
; // ничего не делать
}
Serial.println("OK, Connected to WiFi.");
sendCommand("AT+CIPSTA?");
sendCommand("AT+CIPDNS_CUR?");
sendCommand("AT+CIPSTAMAC?");
}
void loop() {
j=analogRead(A0);
j=map(j,0,982,148,0);
pres=j;
if(j>100)
j=100;
else if(j<0)
j=0;
prev=j;
delay(1000);
float h = dht.readHumidity();
// Чтение температуры в градусах Цельсия (по умолчанию)
float t = dht.readTemperature();
// Чтение температуры в градусах Фаренгейта (isFahrenheit = true)
float f = dht.readTemperature(true);
// Проверяем, не завершились ли какие-либо операции чтения, и выходим досрочно (чтобы повторить попытку).
// if (isnan(h) || isnan(t) || isnan(f)) {
// Serial.println(F("Не удалось прочитать с датчика DHT!"));
// возвращаться;
// }
// Расчет теплового индекса в Фаренгейтах (по умолчанию)
float hif = dht.computeHeatIndex(f, h);
// Расчет теплового индекса в градусах Цельсия (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
// Serial.print(F("Влажность: "));
// Serial.print(h);
// Serial.print(F("% Температура: "));
// Serial.print(t);
// Serial.print(F("°C"));
// Serial.print(("Влажность почвы: "));
// Serial.print(j);
// Serial.println("%");
// подключаемся к серверу
if (sendCommand("AT+CIPSTART=\"TCP\",\"https://terraduino.000webhostapp.com\",80")) {
Serial.println("connected to Cloud");
// формируем HTTP-запрос
getStr = "GET /upload.php?terra=";
getStr += Terra;
getStr += "&j=";
getStr += j;
getStr += "&t=";
getStr += t;
getStr += "&h=";
getStr += h;
getStr += " HTTP/1.1\r\n";
//ВЕБ СЕРВЕР
getStr += "Host: https://terraduino.000webhostapp.com\r\n\r\n";
// открываем буфер отправки
buff = "AT+CIPSEND=";
buff += getStr.length();
if (sendCommand(buff.c_str()) && Serial1.find(">")) { // прошивка АТ готова принимать данные
// отправляем HTTP-запрос
Serial.println(getStr);
Serial1.print(getStr);
// вывести HTTP-ответ
if (Serial1.find("+IPD,")) { // получен ответ
int l = Serial1.parseInt();
while (l > 0) {
if (Serial1.available()) {
Serial.write(Serial1.read());
}
}
Serial.println("--------------");
} else {
Serial.println("no response");
}
} else {
Serial.println("send error");
}
sendCommand("AT+CIPCLOSE");
} else {
Serial.println("Error connecting");
}
}
bool connectWiFi() {
if (!sendCommand("ATE0")) // эхо выключено
return false;
if (!sendCommand("AT+CIPMUX=0")) // установить режим одиночного соединения
return false;
if (!sendCommand("AT+CWMODE=1")) // установить режим STA
return false;
return sendCommand("AT+CWJAP=\"I Pronounce you Man and Wifi\",\"-PX?*[email protected]\"");
}
bool sendCommand(const char* cmd) {
Serial.println(cmd);
Serial1.println(cmd);
while (true) {
buff = Serial1.readStringUntil('\n');
buff.trim();
if (buff.length() > 0) {
Serial.println(buff);
if (buff == "OK" || buff == "SEND OK" || buff == "ALREADY CONNECTED")
return true;
if (buff == "ERROR" || buff == "FAIL" || buff == "SEND FAIL")
return false;
}
}
}
@Warren Paulino, 👍1
Обсуждение1 ответ
Я бы сказал, что вы застряли в функции sendCommand
. Вы печатаете переменную cmd
(cmd="ATE0") на терминал, а затем отправляете команду в ESP через Serial1 = Software Serial. Serial1 настроен на скорость передачи данных 9600 (Serial1.begin(9600)
), это зависит от вашего ESP, но это может быть неправильно. Обычное значение — 115200 (Serial1.begin(115200)
). Но поскольку это может варьироваться от платы к плате, это также может быть неправильно.
Если я прав, и вы настроили неправильную скорость передачи данных, команда не может быть понята ESP, и для нее может отсутствовать даже символ новой строки после команды.
Поэтому ESP ничего не отправляет обратно, а 'buff.length()' равно 0. Затем while(true)
запускается, запускается и запускается... .
да, это была идея. Но я не могу вернуться к AT-командам, я проверил все провода и процесс прошел хорошо. вывод - это просто некоторая внутренняя информация и неизвестные случайные символы, напечатанные в мониторе последовательного порта., @Warren Paulino
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- AT-команда не отвечает на последовательный монитор
- Отправка данных Arduino в MySQL с помощью phpMyAdmin и XAMPP на Windows10
- Arduino выводит значения мусора на serial monitor с ESP8266
- ошибка: espcomm_upload_mem failed при загрузке скетча
- фатальная ошибка ESP8266WiFi.h: Такого файла или каталога нет
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Получить данные с сайта с помощью ESP8266 с помощью AT-команд
Платы ESP определенно не подходят для начинающих. Проблема с ними в том, что на них могут быть очень разные версии прошивки. Например, вы не можете быть уверены, какую скорость передачи данных они используют. Итак, вам нужно выяснить, какую скорость передачи данных использует последовательный интерфейс. Вы настроили 9600 бит/сек, но большинству плат требуется 115200. Гуру Event ESP очищают ESP с помощью хорошо определенной прошивки: например, https://medium.com/@aallan/getting-started-with-the-esp8266-270e30feb4d1, @Peter Paul Kiefer
Было бы неплохо также добавить к вопросу полный вывод Arduino. Вывод помогает нам следить за программой и тем, как она выполняется., @Peter Paul Kiefer
спасибо, сэр, вывод был просто "ATE0", @Warren Paulino
Вы установили скорость передачи данных прошивки AT на 9600 бод? (кстати, я написал эту версию функции sendCommand), @Juraj
еще нет, сэр, офигенно!, @Warren Paulino
это не работает, @Warren Paulino
после того, как я загрузил минимальный минимум для разделения ESP-01 на arduino, я получил этот вывод. Оба NL и CR 115200 бод установлены в последовательном мониторе, ets 8 января 2013 г., первая причина: 4, режим загрузки: (3,0) сброс wdt загрузка 0x40100000, лен 1856, комната 16 хвост 0 контрольная сумма 0x63 загрузка 0x3ffe8000, длина 776, комната 8 хвост 0 контрольная сумма 0x02 загрузка 0x3ffe8310, длина 552, комната 8 хвост 0 контрольная сумма 0x79 сумма 0x79 2-я загрузочная версия: 1.5 Скорость SPI: 40 МГц Режим SPI: DOUT Размер и карта флэш-памяти SPI: 8 Мбит (512 КБ + 512 КБ) перейти к запуску user1 @ 1000, @Warren Paulino
@Juraj нужна помощь, сэр, @Warren Paulino
Я подключил RX и TX Arduino и esp-01 соответственно при загрузке bareminimum и установил BL & NR и скорость передачи 115200, все равно не работает, @Warren Paulino
https://chat.stackexchange.com/transcript/85432/2018/11/7, @Juraj
короткая версия https://arduinoprosto.ru/q/57496/arduino-uno-with-esp8266-01-with-at, @Juraj
Возможный дубликат Arduino Uno с ESP8266-01 с AT, @Juraj
я уже читал эти статьи, @Warren Paulino