Aduino mega2560 + xy-md02 Modbus RTU rs485

xser1998 (Xser1998) February 17, 2021, 6:23am #1

aduino mega2560 + xy-md02 Modbus RTU rs485 มีพี่ๆคนใหนเคยเล่นใหมครับ ผมติดอยู่นี่มาเป็นอาทิตย์ละ ช่วยแนะนำด้วยครับ (มือใหม่หัดเล่นครับ**ขอบคุณล้วงหน้าครับ)

ภาพ

ภาพ

Remy_Martin (Permpol Thanapunnamas) February 17, 2021, 7:17am #2

หนึ่งอาทิตย์นี้

1.ได้อะไรไปบ้าง
2.ทำอะไรบ้าง
3.ติดปัญหาจุดไหน

อธิบายหน่อยครับ

xser1998 (Xser1998) February 19, 2021, 6:25am #3

โค้ดเสร็จแล้วครับแต่พออัพลงบอร์ดแล้วไม่มีค่าใดๆส่งมาเลยครับ และ[k’8iyh’ติดปัญหา error serial2 ด้วยครับ
#include <SoftwareSerial.h> #include <HardwareSerialRS485.h> #include <MessageReader.h> include <ArduinoModbus.h> เข้ามาแล้วก็ยัง error เหมือนเดิมครับ

Remy_Martin (Permpol Thanapunnamas) February 21, 2021, 12:00pm #4

copy error เต็มมาดูหน่อย

Remy_Martin (Permpol Thanapunnamas) February 21, 2021, 5:05pm #5

ที่เคยผ่านตา

xser1998 (Xser1998) February 22, 2021, 5:09pm #6

C:\Users\PY_art\Documents\Arduino\sketch_feb22a\sketch_feb22a.ino: In function 'void setup()':
sketch_feb22a:45:41: error: no matching function for call to 'HardwareSerial::begin(int, int, int, int)'
   Serial2.begin(9600, SERIAL_8N1, 18, 19); // Rx, Tx
                                         ^
In file included from C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/Arduino.h:233:0,
                 from sketch\sketch_feb22a.ino.cpp:1:
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/HardwareSerial.h:121:10: note: candidate: void HardwareSerial::begin(long unsigned int)
     void begin(unsigned long baud) { begin(baud, SERIAL_8N1); }
          ^~~~~
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/HardwareSerial.h:121:10: note:   candidate expects 1 argument, 4 provided
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/HardwareSerial.h:122:10: note: candidate: void HardwareSerial::begin(long unsigned int, uint8_t)
     void begin(unsigned long, uint8_t);
          ^~~~~
C:\Program Files\WindowsApps\ArduinoLLC.ArduinoIDE_1.8.42.0_x86__mdqgnx93n4wtt\hardware\arduino\avr\cores\arduino/HardwareSerial.h:122:10: note:   candidate expects 2 arguments, 4 provided
exit status 1
no matching function for call to 'HardwareSerial::begin(int, int, int, int)'

Remy_Martin (Permpol Thanapunnamas) February 22, 2021, 5:16pm #7

ต้องวางโค้ตหลักมาดูจึงจะตอบได้ครับ

xser1998 (Xser1998) February 23, 2021, 4:33pm #8

#include <ModbusMaster.h>
#include <Arduino.h>  
#include <SoftwareSerial.h> 

#define DE_RE_PIN 7
#define MODE_SEND HIGH
#define MODE_RECV LOW

float temp = 0, humi = 0;

void readXY_MD02() {
  uint8_t buff[] = {
    0x01, // Devices Address
    0x04, // Function code
    0x00, // Start Address HIGH
    0x01, // Start Address LOW
    0x00, // Quantity HIGH
    0x02, // Quantity LOW
    0x20, // CRC LOW
    0x0B  // CRC HIGH
  };

  digitalWrite(DE_RE_PIN, MODE_SEND);
  Serial2.write(buff, sizeof(buff));
  Serial2.flush(); // wait send completed
  digitalWrite(DE_RE_PIN, MODE_RECV);

  if (Serial2.find("\x01\x04")) {
    uint8_t n = Serial2.read();
    if (n != 4) {
      Serial.println("Error data size");
      return;
    }

    temp = ((uint16_t)(Serial2.read() << 8) | Serial2.read()) / 10.0;
    humi = ((uint16_t)(Serial2.read() << 8) | Serial2.read()) / 10.0;
  } else {
    Serial.println("ERROR Timeout");
    return;
  }
}

void setup() {
  pinMode(DE_RE_PIN, OUTPUT);
  digitalWrite(DE_RE_PIN, MODE_RECV);
  
  Serial.begin(115200);
  
  Serial2.begin(9600, SERIAL_8N1, 18, 19); // Rx, Tx
  Serial2.setTimeout(200);
}

void loop() {
  readXY_MD02();
  Serial.print("Temperature: ");
  Serial.print(temp);
  Serial.println(" *C");
  Serial.print("Humidity: ");
  Serial.print(humi);
  Serial.println(" *C");
  delay(500);
}

Remy_Martin (Permpol Thanapunnamas) February 23, 2021, 4:39pm #9

โค้ตที่ใช้มันผิดรึป่าวครับ ตัวอย่างใช้กับ arduino อันนี้คือตัวอย่างที่อยู่ต้อง

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Native USB only
  }


  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(38400);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

arduino.cc

Software Serial Example

Open-source electronic prototyping platform enabling users to create interactive electronic objects.

อันนี้ HardwareSerial ตัวอย่างนี้ใช้กับ esp32

ตัวส่ง

#include <HardwareSerial.h>
HardwareSerial SerialTFMini( 1 );
HardwareSerial SerialBrain( 2 );
////// serial(1) = pin27=RX green, pin26=TX white
////// serial(2) = pin16=RXgreen , pin17=TX white
#define SerialDataBits 115200
void setup()
{
  SerialBrain.begin( SerialDataBits );
  SerialTFMini.begin(  SerialDataBits, SERIAL_8N1, 27, 26 );
  }
  void fSendLIDAR_InfoSerialToBrain( void *pvParameters )
{
  struct stu_LIDAR_INFO pxLIDAR_INFO;
  for ( ;; )
  {
    xEventGroupWaitBits (eg, evtGetIMU, pdTRUE, pdTRUE, portMAX_DELAY);
    xSemaphoreTake( sema_LIDAR_FOR_ALARM, xSemaphoreTicksToWait );
    xQueueReceive ( xQ_LIDAR_FOR_ALARM, &pxLIDAR_INFO, QueueReceiveDelayTime );
    xSemaphoreGive( sema_LIDAR_FOR_ALARM );
    int CellCount = 1 ;
   // send LIDAR info for alarm
    String sSerial = "";
    sSerial.reserve ( 300 );
    sSerial.concat( "<#," ); //sentence begin
    sSerial.concat( String(ScanPoints) + "," );
    sSerial.concat( String(pxLIDAR_INFO.ServoSweepUp) + "," ); // get direction of scan
    for ( CellCount; CellCount <= ScanPoints; CellCount++ )
    {
      sSerial.concat( String(pxLIDAR_INFO.Range[CellCount]) + "," );
    }
    sSerial.concat( ">" ); //sentence end
    vTaskDelay( 10 );
    SerialBrain.println ( sSerial );
  }
  vTaskDelete( NULL );
} // void fSendLIDAAR_InfoSerialToBrain( void *pvParameters )

ตัวรับ

void fReceiveSerial_LIDAR( void * parameters  )
{
  bool BeginSentence = false;
  sSerial.reserve ( StringBufferSize300 );
  char OneChar;
  for ( ;; )
  {
    EventBits_t xbit = xEventGroupWaitBits (eg, evtReceiveSerial_LIDAR, pdTRUE, pdTRUE, portMAX_DELAY);
    // vTaskDelayUntil( &xLastWakeTime, xFrequency );
    if ( LIDARSerial.available() >= 1 )
    {
      while ( LIDARSerial.available() )
      {
        OneChar = LIDARSerial.read();
        if ( BeginSentence )
        {
          if ( OneChar == '>')
          {
            if ( xSemaphoreTake( sema_ParseLIDAR_ReceivedSerial, xSemaphoreTicksToWait10 ) == pdTRUE )
            {
              xQueueOverwrite( xQ_LIDAR_Display_INFO, ( void * ) &sSerial );
              xEventGroupSetBits( eg, evtParseLIDAR_ReceivedSerial );
              //
            }
            BeginSentence = false;
            break;
          }
          sSerial.concat ( OneChar );
        }
        else
        {
          if ( OneChar == '<' )
          {
            sSerial = ""; // clear string buffer
            BeginSentence = true; // found begining of sentence
          }
        }
      } //  while ( LIDARSerial.available() )
    } //if ( LIDARSerial.available() >= 1 )
    xSemaphoreGive( sema_ReceiveSerial_LIDAR );
    //            Serial.print( "fReceiveSerial_LIDAR " );
    //        Serial.print(uxTaskGetStackHighWaterMark( NULL ));
    //            Serial.println();
    //        Serial.flush();
  }
  vTaskDelete( NULL );
} //void fParseSerial( void * parameters  )

xser1998 (Xser1998) February 24, 2021, 3:40am #10

ถ้าติดต่อผ่าน Max485 ด้วยหล่ะครับ

Remy_Martin (Permpol Thanapunnamas) February 24, 2021, 6:01am #11

เคลียร์ที่ละประเด็นก่อนนะครับ อันที่ error นี้ได้หรือยัง

xser1998 (Xser1998) February 24, 2021, 6:17am #12

ได้แล้วครับ

Remy_Martin (Permpol Thanapunnamas) February 24, 2021, 6:44am #13

แก้ไขอย่างไรสรุปหน่อยครับ

xser1998 (Xser1998) February 25, 2021, 2:48am #14

ผมไล่โค้ดใหม่เกือบทั้งหมดเลยครับโดยใช้ตัวอย่างที่พี่ให้มาเป็นหลักครับบวกกับโค้ดในเว็บด้วยครับตอนนี้ get data เข้ามาแล้วครับแต่อุณหภูมิ ขึ้น 0.00 ตลอดเลยครับ เช็ค pin แล้วและลองไล่ดูโค้ดใหม่แล้วแต่ก็ยังไม่รู้ครับว่าพลาดตรงใหน

Remy_Martin (Permpol Thanapunnamas) February 25, 2021, 3:02pm #15

ขอดูโค้ตล่าสุดหน่อย

xser1998 (Xser1998) March 2, 2021, 2:10am #16

#include <SoftwareSerial.h>
#include <ModbusMaster.h>

SoftwareSerial mySerial(17, 16); // RX, TX

#define MAX485_DE      7
#define MAX485_RE_NEG  7

ModbusMaster node;

void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

void setup()
{
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  // Init in receive mode
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
  Serial.println("start init serial 0");
  Serial.begin(9600);
  
  while (!Serial) {
    Serial.println("loop for init serial 0"); // wait for serial port to connect. Needed for Native USB only
  }
  Serial.println("start init software serial");
  mySerial.begin(9600);
  while (!mySerial) {
    Serial.println("loop for init software serial"); // wait for serial port to connect. Needed for Native USB only
  }
  
  // Modbus slave ID 1
  node.begin(1, mySerial);
  
  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
}

void loop()
{
  uint8_t result;
  uint16_t data[1]; // prepare variable of storage data from sensor
   
  Serial.println("get data");
  result = node.readInputRegisters(1, 2); // Read 2 registers starting at 1)
  if (result == node.ku8MBSuccess)
  {
    Serial.print("Temp: ");
    Serial.println(node.getResponseBuffer(0)/10.0f);
    Serial.print("Humi: ");
    Serial.println(node.getResponseBuffer(1)/10.0f);
  }
  delay(1000);
}

xser1998 (Xser1998) March 1, 2021, 8:34am #17

ขออภัยที่ตอบช้านะครับ

Remy_Martin (Permpol Thanapunnamas) March 2, 2021, 2:10am #18

ถ่ายการต่อ ฮาร์ดแวร์ มาดูหน่อยครับ

Remy_Martin (Permpol Thanapunnamas) April 24, 2021, 2:21pm #19

เป็นไงบ้างครับ กระทู้นี้อัพเดทกันหน่อย