Отправить строку данных из 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.

Может ли кто-то посмотреть на мой код и увидеть, что я делаю неправильно. Я подумал, что отправлю туда два значения, потому что в конце концов мне захочется показать уровень воды и уровень заряда батареи.

, 👍2

Обсуждение

Как вы думаете, почему 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


2 ответа


Лучший ответ:

1

Я понял это. отправить код-это

Сторона 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


2

Передача данных между Arduino и NodeMCU (последовательная связь)

ссылка на YouTube (на французском языке):

https://youtu.be/0TXmi9EgaCs

,

Когда вы снимаете видео полностью на французском языке, пожалуйста, не пишите название полностью на английском. Используйте немного французского или напишите "[французский]" в названии или что-то в этом роде., @timemage

привет .. я делаю это видео, чтобы помочь людям решить проблему.. я забываю рекламировать язык в названии .. но самое главное, что это метод (код arduino), используемый для отправки данных .. я собираюсь изменить название и, возможно, сделаю видео на английском языке .. спасибо, @mohamed daouad

Я ценю, что там есть неанглоязычные видео =). Просто хорошо, что люди знают, что они получат, особенно если они уже разочарованы возникшей проблемой. Проголосовал за тебя., @timemage