Отправить строку данных из Arduino UNO в ESP8266-01
Есть ли возможность отправить строку из Arduino UNO на ESP8266-01 (только с 8 выводами RX, TX, CH-PD, vcc, ground, reset, GPIO0, GPIO2) без использования без использования команд AT. Я посмотрел везде, и из того, что я вижу, UART не работает, а SoftwareSerial использует только команды AT. Я в полном отчаянии. Кто-нибудь может здесь помочь? пожалуйста.
Я пробовал Serial.write, но только пишет строку, и Esp8266 получает только ints.
Я нашел какой-то код, который, как я думал, может работать, но пока я вижу, что arduino отправляет <100.00:200:00>, но на esp8266 все, что я получаю, - это четыре обратных вопросительных знака<100.00:200:00>
это код на Arduino UNO
#include <SoftwareSerial.h>
SoftwareSerial ESPserial(2, 3); // TX | RX
float water = 100.00;
float battery = 200.00;
void setup()
{
Serial.begin(9600); // communication with the host computer
//while (!Serial) { ; }
// Start the software serial for communication with the ESP8266
ESPserial.begin(57600);
}
void loop()
{
ESPserial.print("<");
ESPserial.print(water,2);
ESPserial.print(":");
ESPserial.print(battery,2);
ESPserial.print(">");
Serial.print("<");
Serial.print(water,2);
Serial.print(":");
Serial.print(battery,2);
Serial.print(">");
delay(10000);
}
а вот и код на ESP8266
#include <SoftwareSerial.h>
#include <string.h>
SoftwareSerial ESPSerial(2,0);
const byte numChars = 32;
char receivedChars[numChars];
boolean newData = false;
String water;
String battery;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
ESPSerial.begin(57600);
delay(10);
}
void loop() {
// put your main code here, to run repeatedly:
recvWithStartEndMarkers();
showNewData();
water= getValue(receivedChars, ':', 0);
battery = getValue(receivedChars, ':', 1);
Serial.println(water);
}
void recvWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
char startMarker = '<';
char endMarker = '>';
char rc;
while (ESPSerial.available() > 0 && newData == false) {
rc = ESPSerial.read();
if (recvInProgress == true) {
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
}
Arduino отправляет записи каждые 10 секунд, а esp печатает ???? каждые 10 секунд, но с запаздыванием.
Я не уверен, каким должен быть вывод контакта для ввода контакта. Прямо сейчас у меня есть Arduino 2(TX), подключенный к GPIO0, и Arduino 3(RX), подключенный к GPIO2.
Может ли кто-то посмотреть на мой код и увидеть, что я делаю неправильно. Я подумал, что отправлю туда два значения, потому что в конце концов мне захочется показать уровень воды и уровень заряда батареи.
@user1114881, 👍2
Обсуждение2 ответа
Лучший ответ:
Я понял это. отправить код-это
Сторона Arduino Uno
f = String('<')+String("Hi")+String(',')+String(waterSensorOutValue)+String(',')+String(sensorBatValue)+String('>');
Serial.print(f);
Сторона ESP
const byte numChars = 32; char receivedChars[numChars]; char tempChars[numChars]; // temporary array for use when parsing // variables to hold the parsed data char messageFromPC[numChars] = {0}; float floatFromPC = 0; float floatFromPC2 = 0; boolean newData = false; //end stuff ti bring in string String f; long itt = 500;
long itt2 = 500;
void loop() {
//new stuff string recvWithStartEndMarkers();
if (newData == true) {
strcpy(tempChars, receivedChars);
// this temporary copy is necessary to protect the original data
// because strtok() used in parseData() replaces the commas with \0
parseData();
showParsedData();
newData = false;
} }
void recvWithStartEndMarkers() {
static boolean recvInProgress = false;
static byte ndx = 0;
char startMarker = '<';
char endMarker = '>';
char rc;
while (Serial.available() > 0 && newData == false) {
rc = Serial.read();
if (recvInProgress == true) {
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
} }
//============
void parseData() { // split the data into its parts
char * strtokIndx; // this is used by strtok() as an index
strtokIndx = strtok(tempChars,","); // get the first part - the string
strcpy(messageFromPC, strtokIndx); // copy it to messageFromPC
strtokIndx = strtok(NULL, ","); // this continues where the previous call left off
floatFromPC = atoi(strtokIndx); // convert this part to an integer
strtokIndx = strtok(NULL, ",");
floatFromPC2 = atoi(strtokIndx); // convert this part to a float
}
//============
void showParsedData() {
Serial.print("Message ");
Serial.println(messageFromPC);
Serial.print("Float ");
Serial.println(floatFromPC);
Serial.print("Float ");
Serial.println(floatFromPC2); } //end new stuff string
Затем подключитесь к Wi-Fi и загрузите в ThingSpeak.
Мне пришлось избавиться от программного обеспечения и подключить RX на Arduino Uno к TX на ESP8266-01, а TX на Arduino Uno к RX на ESP8266-01.
Все работало отлично, пока я не сменил Arduino UNO R3 на Arduino Pro Mini по размеру и энергосбережению.
С той же проводкой (я думаю) и тем же кодом строка (f) не отправляется в ESP. Я не вижу, чтобы индикатор TX мигал на Pro Mini, когда он должен передавать строку(f), и ничего не загружается в ThingSpeak. Не уверен, почему, но я задам другой вопрос для этого. Спасибо всем за помощь.
Это нормально-принять свой собственный ответ в качестве решения., @VE7JRO
Передача данных между Arduino и NodeMCU (последовательная связь)
ссылка на YouTube (на французском языке):
https://youtu.be/0TXmi9EgaCs
Когда вы снимаете видео полностью на французском языке, пожалуйста, не пишите название полностью на английском. Используйте немного французского или напишите "[французский]" в названии или что-то в этом роде., @timemage
привет .. я делаю это видео, чтобы помочь людям решить проблему.. я забываю рекламировать язык в названии .. но самое главное, что это метод (код arduino), используемый для отправки данных .. я собираюсь изменить название и, возможно, сделаю видео на английском языке .. спасибо, @mohamed daouad
Я ценю, что там есть неанглоязычные видео =). Просто хорошо, что люди знают, что они получат, особенно если они уже разочарованы возникшей проблемой. Проголосовал за тебя., @timemage
- AT-команда не отвечает на последовательный монитор
- Получить данные с сайта с помощью ESP8266 с помощью AT-команд
- Программное обеспечениеSerial с ESP8266
- Как связаться с ESP8266 ESP01, отправив данные через программный сериал на Arduino Uno?
- Последовательная связь от Arduino до ESP8266 NodeMCU работает, но от NodeMCU до Arduino не работает
- Отправьте несколько значений из Arduino Uno в nodeMCU, используя последовательный порт.
- Повреждение данных SoftwareSerial - поиск предложений
- Программировать ESP8266, чтобы избежать случайных исключений?
Как вы думаете, почему UART не работает? UART - это то, что я бы предложил..., @Sim Son
Как мне это сделать? Я хочу использовать Arduino IDE для загрузки, но язык, который я нашел, не работал. Нужна ли мне отдельная плата? Извините, @user1114881
Вам просто нужно подключить rx->tx/tx->>rx и посмотреть пример. Существует множество руководств по последовательной связи между arduino и esp8266., @Sim Son
@user1114881 используете ли вы символы возврата End of Line и Carraige в конце отправляемой строки?, @Vaibhav
Arduino 2(TX), подключенный к GPIO0, и Arduino 3(RX), подключенный к GPIO2
нет, вы должны подключить Arduino-TX к Esp-RX и Arduino-RX к Esp-TX. По крайней мере, esp8266 имеет очень ограниченные возможности на gpio0 и gpio2, @Sim Sonкак мне справиться с SoftwareSerial ESPSerial(2,0); на ESP и SoftwareSerial ESPserial(2, 3); // TX | RX на Arduino. Я просто оставляю эту часть или как я назначаю их, @user1114881
Я изменил его на SoftwareSerial ESPSerial(1,3); на ESP и Software Serial ESPserial(0,1); на Arduino и все еще все, что я получаю ???? на последовательном мониторе 57600 бод, @user1114881
Возможно, я нашел один глюк. В коде, который я нашел, есть #include<string.h>, но нет строки библиотеки.h и я не могу найти его в интернете. Можете ли вы указать мне на хороший пример того, чего я хочу достичь? Спасибо за помощь и терпение. кстати сейчас под 57600 я получаю четыре 0, @user1114881