ใช้ SoftwareSerial แล้วค่าส่งไม่ตรง มั่ว

ใช้ SoftwareSerial แล้วค่าส่งไม่ตรง มั่ว

portOne.print(temp);
  portOne.print(" ");
  portOne.print(humidity);
  portOne.print(" ");
  portOne.print(resetNET);
  portOne.print(" ");
  portOne.print(S_from_humi);
  portOne.print(" ");
  portOne.print(S_to_hum);
  portOne.print(" ");
  portOne.print(S_from_temp);
  portOne.print(" ");
  portOne.print(S_to_temp);
  portOne.print(" ");
  portOne.print(S_from_loopM);
  portOne.print(" ");
  portOne.print(S_to_loopM);
  portOne.print(" ");
  portOne.print(S_from_loopS);
  portOne.print(" ");
  portOne.print(S_to_loopS);
  portOne.print("\n");

ตัวรับ

while (portOne.available() > 0)
  {
    temp = portOne.parseInt();
    hum = portOne.parseFloat();
    S_from_temp = portOne.parseInt();
    S_from_humi = portOne.parseInt();
    S_to_temp = portOne.parseInt();
    S_to_hum = portOne.parseInt();
    S_from_loopM = portOne.parseInt();
    S_from_loopS = portOne.parseInt();
    S_to_loopM = portOne.parseInt();
    S_to_loopS = portOne.parseInt();
    
    Blynk.virtualWrite(V0, temp);
    Blynk.virtualWrite(V1, hum);
    Blynk.virtualWrite(V2, S_from_temp);
    Blynk.virtualWrite(V3, S_from_humi);
    Blynk.virtualWrite(V4, S_to_temp);
    Blynk.virtualWrite(V5, S_to_hum);
    Blynk.virtualWrite(V6, S_from_loopM);
    Blynk.virtualWrite(V7, S_from_loopS);
    Blynk.virtualWrite(V8, S_to_loopM);
    Blynk.virtualWrite(V9, S_to_loopS);
    
    if (portOne.read() == '\n')
    {
      Serial.print("humidity");
      Serial.print(": ");
      Serial.print(hum); 
      Serial.print("    temperature: ");
      Serial.print(temp);
      Serial.print("    reset: ");
      Serial.println(resetNET);
    }
  }  

หรือผมเขียนผิดหรอครับ

ต่ออะไร จะสื่อสารระหว่างอะไรครับ อธิบายเพิ่มเติมด้วย

ต่อระหว่าง ESP8266 กับ arduino uno สือสารโดยใช้ TX RX

ถ่ายวิธีการต่อมาดูหน่อยครับ

ขอดูลิ้งค์อ้างอิงหน่อย สำหรับโค้ตที่นำมาใช้

https://www.myarduino.net/article/178/สอนใช้งาน-nodemcu-esp8266-ส่งข้อมูลหากันแบบ-serial-รับค่า-sensor-ต่างๆจาก-arduino

int i_data = 34;
int f_data = 52;
int a_data = 12;
int z_data = 17;
int q_data = 11;
int c_data = 13;
#include <SoftwareSerial.h>
SoftwareSerial UnoSerial(13, 12); // RX | TX
void setup()
{
  pinMode(13, INPUT);
  pinMode(12, OUTPUT);
  Serial.begin(9600);
  UnoSerial.begin(9600);
}
void loop() {
  UnoSerial.print(i_data);
  UnoSerial.print(" ");
  UnoSerial.print(f_data);
  UnoSerial.print(" ");
  UnoSerial.print(a_data);
  UnoSerial.print(" ");
  UnoSerial.print(z_data);
  UnoSerial.print(" ");
  UnoSerial.print(q_data);
  UnoSerial.print(" ");
  UnoSerial.print(c_data);
  UnoSerial.print("\n");
}
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
SoftwareSerial s_serial(D1, D0); // RX | TX
void setup() {
  pinMode(D1, INPUT);
  pinMode(D0, OUTPUT);
  Serial.begin(9600);
  s_serial.begin(9600);
  Serial.println();
}

void loop() {
  while (s_serial.available() > 0)
  {
    int i_data = s_serial.parseInt();
    int f_data = s_serial.parseInt();
    int a_data = s_serial.parseInt();
    int z_data = s_serial.parseInt();
    int q_data = s_serial.parseInt();
    int c_data = s_serial.parseInt();
    Serial.print("num1 :");
    Serial.println(i_data);
    Serial.print("num2 :");
    Serial.println(f_data);
    Serial.print("num3 :");
    Serial.println(a_data);
    Serial.print("num4 :");
    Serial.println(z_data);
    Serial.print("num5 :");
    Serial.println(q_data);
    Serial.print("num6 :");
    Serial.println(c_data);
    delay(500);
  }

}

ลองส่งแล้วค่า ออกมาแล้วไม่ตรงอะครับ

ผมเห็นจุดผิดโค้ตละจุด ละ ลองมาร์คให้ผมดูหน่อยว่า ตรงไหน ฝึกสกิลกันสักนิดนะครับ เพราะมันใช้ตลอดเวลา

ได้แล้ว ครับ ศึกษา หาอันใหม่ 555

ตัว NodeMCU

/**
 * www.arduinona.com
 * ตัวอย่างการสื่อสารข้อมูลระหว่าง Arduino และ ESP8266
 */
#include <SoftwareSerial.h>

/**
 * NodeMCU v3 (ESP8266)
 * RX = GPIO 5 (D1)
 * TX = GPIO 4 (D2)
 */
SoftwareSerial arduinocon(D1, D0); 


void setup()  {

  Serial.begin(115200);

  arduinocon.begin(57600);

  Serial.println("\n\n\nStart esp8266 from ArduinoNa.com");

}

 

void loop() {
  static String msg="";

  /**
   * เช็คว่าถ้ามีค่าเข้ามาจาก Serial monitor ให้วนรับค่า  
   * และแสดงออกทาง arduino ทีละตัวอักษร
   * และแสดงออกทาง Serial monitor ทีละตัวอักษร จนครบทุกตัวอักษร
   * และออกจาก loop
   */
  while (Serial.available() > 0) {
    char inByte = Serial.read();
    arduinocon.write(inByte);
    Serial.write(inByte);
  }
  

  /**
   * เช็คว่าถ้ามีค่าเข้ามาจาก arduino ให้วนรับค่า 
   * และแสดงออกทาง Serial monitor ทีละตัวอักษร จนครบทุกตัวอักษร
   * และออกจาก loop
   */
  while (arduinocon.available() > 0) {
    char inByte = arduinocon.read();


    //เก็บสะสมค่าไว้ใน String ชื่อ msg
    msg+= inByte;

    //จนกว่าค่าที่อ่านได้จะเป็นการขึ้นบรรทัดใหม่
    if(inByte =='\n') {

      //ดึงค่าแรก (index 0) ออกจาก String msg เก็บไว้บน value_1
      String value_1 = getValue(msg, ',', 0);
      
      //ดึงค่าแรก (index 1) ออกจาก String msg เก็บไว้บน value_2
      String value_2 = getValue(msg, ',', 1);
//      
//      //ดึงค่าแรก (index 1) ออกจาก String msg เก็บไว้บน value_2
      String value_3 = getValue(msg, ',', 2);
//
//      //ดึงค่าแรก (index 1) ออกจาก String msg เก็บไว้บน value_2
      String value_4 = getValue(msg, ',', 3);
//
//      //ดึงค่าแรก (index 1) ออกจาก String msg เก็บไว้บน value_2
      String value_5 = getValue(msg, ',', 4);
      
      Serial.print( value_1.toInt() ); //แปลงค่าจาก String เป็นจำนวนเต็มด้วย toInt()
      Serial.print(" and ");
      Serial.println( value_2.toFloat() ); //แปลงค่าจาก string เป็นทศนิยมด้วย toFloat()
      Serial.print(" and ");
      Serial.print( value_3.toFloat() ); //แปลงค่าจาก string เป็นทศนิยมด้วย toFloat()
      Serial.print(" and ");
      Serial.print( value_4.toFloat() ); //แปลงค่าจาก string เป็นทศนิยมด้วย toFloat()
      Serial.print(" and ");
      Serial.println( value_5.toFloat() ); //แปลงค่าจาก string เป็นทศนิยมด้วย toFloat()
      msg = "";
    }
  }
}


/**
 * ใช้ดึงค่า String ออกจาก String โดยใช้การตัดคำจาก separator ซึ่ง
 * อาจจะเป็น , ; : หรืออะไรก็ได้ที่ใช้แยกคำ
 */
String getValue(String data, char separator, int index)
{
  int found = 0;
  int strIndex[] = {0, -1};
  int maxIndex = data.length()-1;

  for(int i=0; i<=maxIndex && found<=index; i++){
    if(data.charAt(i)==separator || i==maxIndex){
        found++;
        strIndex[0] = strIndex[1]+1;
        strIndex[1] = (i == maxIndex) ? i+1 : i;
    }
  }

  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}

ตัว Uno

/**
   www.arduinona.com
   ตัวอย่างการสื่อสารข้อมูลระหว่าง Arduino และ ESP8266
*/

#include <SoftwareSerial.h>

/**
   RX = 10
   TX = 11
*/
SoftwareSerial esp8266con(13, 12);


void setup()  {

  Serial.begin(115200);

  esp8266con.begin(57600);
  Serial.println("\n\n\nStart arduino from ArduinoNa.com");

}



void loop() {



  /**
     เช็คว่าถ้ามีค่าเข้ามาจาก esp8266 ให้วนรับค่าทีละตัวอักษร
     และส่งออก Serial monitor ทีละตัวอักษร จนครบทุกตัวอักษร
     และออกจาก loop
  */
  while (esp8266con.available() > 0) {
    char inByte = esp8266con.read();
    Serial.write(inByte);
  }

  /**
     ส่งค่าด้วยความเร็ว 1 ข้อความต่อวินาที
  */
  static uint32_t last_send = millis();
  if (millis() - last_send > 1000) {
    last_send = millis();
    static int value = 0;

    //สร้างข้อความที่คั่นด้วย , และปิดท้ายด้วยการขึ้นบรรทัดใหม่ เพื่อส่งไปยัง esp8266
    String msg = String(millis()) + "," + String(value) + "," + String("60") + "," + String("80") + "," + String("75") + "\n";
    esp8266con.write( msg.c_str(), msg.length());
    Serial.print("Send to arduino - " + msg);
    value = (value + 1) % 100;
  }

}

หมายถึงยังไงครับ ไม่ได้แก้จากของเดิมหรอ

ไม่ได้แก้ ครับ ลองหาในเน็ตเพิ่มเติม แล้วเจอเลยเอามาลองแล้วใช้ได้ตามที่ต้องการพอดี

จะบอกว่า อันที่ให้แก้ กับอันที่เอามาใหม่ มันแก้จุดที่ผมให้หามาแล้วทั้งคู่ครับ จริงๆ ไม่จำเป็นต้องใช้โค้ตอื่น โค้ตเดิมแก้แค่บรรทัดเดียวก็ออกเหมือนกันครับ

คือยังไงหรอครับ