Arduino อ่านค่าจาก sensor COD ด้วย RS485

UV254-COD-with-wiper.pdf (1.3 MB)
สวัสดีครับ ขออนุญาติสอบถามเกี่ยวกับการใช้ Arduino อ่านค่าด้วย RS485 รายละเอียดตาม PDF ที่แนบครับ ปัญหาคือไม่สามารถดึงค่าได้ ผมเขียนโปรแกรมโดยก๊อปปี้ตัวอย่างเซ็นเซอร์ XY-MD02 มาเป็นตัวอย่าง เนื่องจากมีให้ดูเยอะบนอินเตอร์เน็ต ผมมีเซ็นเซนเซอร์ XY-MD02 ซึ่งทำแล้วได้ผล แต่พอแก้ไปอ่านเซนเซอร์ COD ดังไฟล์ PDF ที่แนบมา มันทำไม่ได้ครับ รบกวนชวยแนะนำทีครับ ด้านล่างคือโค๊ดที่ผมลองแก้มาครับ

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

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

#define MAX485_DE      4
#define MAX485_RE_NEG  5

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");
  }
  
  node.begin(0x01, mySerial);  
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);

}
bool state = true;
void loop()
{
  uint32_t result;
  uint16_t data[2];

//    // Toggle the coil at address 0x0002 (Manual Load Control)
//  result = node.writeSingleCoil(0x0002, state);
//  state = !state;
  
  Serial.println("get data");
  result = node.readInputRegisters(0x0040,2);
  if (result == node.ku8MBSuccess)
  {
    Serial.print("COD: ");
    Serial.println(node.getResponseBuffer(0x0002)/10.00f);
    Serial.print("TOC: ");
    Serial.println(node.getResponseBuffer(0x0004)/10.00f);

    Serial.println();
  
  }
  delay(3000);
}

ขอดูโค้ตชุดนี้หน่อยครับ

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

จะอ่านเซ็นเซอร์พร้อมกัน 2 ตัว หรอ

อ่านจาก COD sensor แค่ตัวเดียวครับ XY-MD02 ผมนำมาเป็นตัวอย่าง และลองเขียนตาม แต่ดึงค่าออกมาไม่ได้คับผม

ผมดูจากตรงนี้ลองกำหนด address ให้ตรงและตัวเลขด้วย น่าจะใช้ทั้ง 2 อย่าง เพื่อดึงค่า อุณหภูมิมาอ่าน

image

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

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

#define MAX485_DE      4
#define MAX485_RE_NEG  5

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");
  }
  
  node.begin(0x01, mySerial);  
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);

}
bool state = true;
void loop()
{
  uint32_t result;
  uint16_t data[2];

//    // Toggle the coil at address 0x0002 (Manual Load Control)
//  result = node.writeSingleCoil(0x0002, state);
//  state = !state;
  
  Serial.println("get data");
  result = node.readInputRegisters(0x0030,2); //แก้ตรงนี้
  if (result == node.ku8MBSuccess)
  {
    Serial.print("COD: ");
    Serial.println(node.getResponseBuffer(0x0002)/10.00f);
    Serial.print("TOC: ");
    Serial.println(node.getResponseBuffer(0x0004)/10.00f);

    Serial.println();
  
  }
  delay(3000);
}

ลองดูผลหน่อยเป็นไงบ้าง

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