Отправить строку из Arduino Pro Mini в ESP8266-01 - PullRequest
0 голосов
/ 07 июня 2019

У меня есть проект, в котором я использую Arduino для сбора данных с датчиков из двух источников, а затем отправляю их в ESP8266, используя TX-> RX и RX-> TX. Поскольку я использую AutoConnect для подключения ESP к WiFi, я не могу использовать AT Commands и SoftwareSerial. Мне удалось подключить ESP к Wi-Fi и отправить информацию в ThingSpeak, введя имя и пароль Wi-Fi, а также ключ API записи ThingSpeak и сохранив их в EPROM ESP. Затем я отправляю информацию датчика от Arduino на ESP в виде строки, используя следующий код.

const int batteryInPin = A1;
sensorBatValue = analogRead(batteryInPin);
sensorOutValue = map(sensorBatValue,0,1024,0,225);
const int waterInPin = A3;
int waterSensorInValue;//reading our water lever sensor
int waterSensorOutValue;//conversion of water sensor value
waterSensorInValue = analogRead(waterInPin);
waterSensorOutValue = map(waterSensorInValue,0,1024,0,225);
f = String('<')+String("Hi")+String(',')+String(waterSensorOutValue)+String(',')+String(sensorBatValue)+String('>');
Serial.print(f);

Затем я использую следующий код, чтобы получить информацию о ESP и отправить ее в ThingSpeak

const byte numChars = 32;
char receivedChars[numChars];
char tempChars[numChars];  
char messageFromPC[numChars] = {0};
int floatFromPC = 0;
int floatFromPC2 = 0;
boolean newData = false;
char Password[36]="";
long itt = 500;
long itt2 = 500;

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;
    }
long itt =floatFromPC;
long itt2 = floatFromPC2;

long itt =floatFromPC;


    long itt2 = floatFromPC2;

EEPROM.begin(512);
    Serial.println(""); //Goto next line, as ESP sends some garbage when you reset it  
  Serial.print(char(EEPROM.read(addr)));    //Read from address 0x00
  addr++;                      //Increment address
  Serial.print(char(EEPROM.read(addr)));    //Read from address 0x01
  addr++;                      //Increment address
  Serial.println(char(EEPROM.read(addr)));    //Read from address 0x02

  //Read string from eeprom
  String www;   
  //Here we dont know how many bytes to read it is better practice to use some terminating character
  //Lets do it manually www.circuits4you.com  total length is 20 characters
  for(int i=0;i<16;i++) 
  {
    www = www + char(EEPROM.read(0x0F+i)); //Read one by one with starting address of 0x0F    
  }  

  Serial.print(www);  //Print the text on serial monitor




    if (client.connect(defaultHost,80))
    { // "184.106.153.149" or api.thingspeak.com
        itt++;  //Replace with a sensor reading or something useful

        String postStr = www;
        postStr +="&field1=";
        postStr += String(itt);
        postStr +="&field2=";
        postStr += String(itt2);
        postStr += "\r\n\r\n\r\n";

        client.print("POST /update HTTP/1.1\n");
        client.print("Host: api.thingspeak.com\n");
        client.print("Connection: close\n");
        client.print("X-THINGSPEAKAPIKEY: "+String (www)+"\n");
        client.print("Content-Type: application/x-www-form-urlencoded\n");
        client.print("Content-Length: ");
        client.print(postStr.length());
        client.print("\n\n\n");
        client.print(postStr);

        Serial.println("% send to Thingspeak");
    }

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);
}

Как я уже сказал, я не использую AT-команды для отправки этого в ThingSpeak.

Сначала я отлично работал на Arduino Uno R3, но решил перейти на Arduino Pro Mini из-за размера и предполагаемой энергоэффективности. Однако теперь, когда Arduino Pro Mini подключен к ESP с тем же кодом и той же проводкой, он НЕ РАБОТАЕТ. [Code] [/ code]

Нужно ли использовать какой-то другой код, чтобы заставить его работать? ESP позволяет мне вводить информацию и подключаться к Wi-Fi, а также отправляет информацию в ThingSpeak в соответствующее время. Я не знаю, отправляется ли информация в ESP с Arduino Pro Mini, но я не вижу мигающий индикатор, когда предполагается отправка строки f. Я получаю 1 значение в публикации для уровня воды и 0 для уровня заряда батареи на ThingSpeak.

Любые идеи будут с благодарностью.

...