โค้ดทดสอบบอร์ด LARB32

ตัวอย่างโค้ดสำหรับทดสอบการทำงานของอุปกรณ์ต่างๆบนบอร์ด LARB32 ว่าอุปกรณ์ทำงานได้อย่างปกติไหม โดยปกติแล้วจะเป็นโปรแกรมเริ่มต้นที่แถมมากับตอนซื้อบอร์ดครั้งแรก สามารถโหลดโค้ดด้านล่างนี้ใส่ในบอร์ดแล้วเปิด Serial Terminal ขึ้นมาดูการทำงาน จากนั้นกดปุ่ม (36) จากนั้นบอร์ดจะทำการเช็คอุปกรณ์แต่ละตัวพร้อมทั้งแสดงผลออกทาง Serial Terminal ทั้งหลอด LED, Buzzer, RTC, RS485, PCF8574, Relay และปุ่มกด รายการอุปกรณ์ภายนอกที่ต้องมีสำหรับทดสอบเต็มรูปแบบได้แก่

  1. Relay 8CH active LOW สำหรับทดสอบ IC PCF8574 ขยายขาดิจิตอล
  2. Smart Meter SDM120 สำหรับทดสอบ IC MAX485 สื่อสารแบบ RS485

ถ้าหากไม่มีอุปกรณ์ดังกล่าวก็ยังสามารถทดสอบบอร์ดได้ตามปกติโดยจะข้ามการทดสอบนั้นไป ส่วนไลบรารี่สำหรับ PCF8574 ที่แนะนำสามารถดาวน์โหลดที่ HS3UKA_PCF8574

#include <ModbusMaster.h>
#include <SoftwareSerial.h>
#include <HS3UKA_PCF8574.h>
#include "RTClib.h"

#define PCF8574_ADDRESS 0x20 // ที่อยู่ I2C ของ PCF8574

RTC_DS1307 rtc;
HS3UKA_PCF8574 pcf8574;
SoftwareSerial rs485;

int Button = 36;
int LED = 2;
int Buzzer = 32;
int Relay1 = 27;
int Relay2 = 14;
int RO = 25;
int DI = 33;
int EN = 26;

#define ID_meter  0x01
#define Total_of_Reg  6
#define Reg_Volt                0x0000      //  0.
#define Reg_Current             0x0006      //  1.
#define Reg_ActivePower         0x000C      //  2.          
#define Reg_PowerFactor         0x001E      //  3.
#define Reg_Frequency           0x0046      //  4.
#define Reg_TotalActiveEnergy   0x0156      //  5.

uint16_t const Reg_addr[6] = {
  Reg_PowerFactor,
  Reg_PowerFactor,
  Reg_ActivePower,
  Reg_PowerFactor,
  Reg_Frequency,
  Reg_TotalActiveEnergy
};

float DATA_METER [Total_of_Reg] ;

ModbusMaster node;
//01 04 00 00 00 02 71 3F // Test 30001
//------------------------------------------------
// Convent 32bit to float
//------------------------------------------------
float HexTofloat(uint32_t x) {
  return (*(float*)&x);
}

uint32_t FloatTohex(float x) {
  return (*(uint32_t*)&x);
}
//------------------------------------------------

void preTransmission()
{
  digitalWrite(EN, 1);
}

void postTransmission()
{
  digitalWrite(EN, 0);
}

float Read_Meter_float(char addr , uint16_t  REG) {
  float i = 0;
  uint8_t j, result;
  uint16_t data[2];
  uint32_t value = 0;
  node.begin(addr, rs485);
  result = node.readInputRegisters (REG, 0x04); ///< Modbus function 0x04 Read Input Registers
  delay(500);
  if (result == node.ku8MBSuccess) {
    for (j = 0; j < 2; j++)
    {
      data[j] = node.getResponseBuffer(j);
    }
    value = data[0];
    value = value << 16;
    value = value + data[1];
    i = HexTofloat(value);
    //Serial.println("Connec modbus Ok.");
    return i;
  } else {
    //Serial.print("Connec modbus fail. REG >>> "); Serial.println(REG, HEX); // Debug
    delay(1000); 
    return 0;
  }
}

void GET_METER() {     // Update read all data
  delay(1000);                              // เคลียบัสว่าง 
    for (char i = 0; i < Total_of_Reg ; i++){
      DATA_METER [i] = Read_Meter_float(ID_meter, Reg_addr[i]);//แสกนหลายตัวตามค่า ID_METER_ALL=X
    } 
}

void setup() {
  pinMode(Button,INPUT);
  pinMode(39,INPUT);
  pinMode(34,INPUT);
  pinMode(35,INPUT);
  pinMode(LED,OUTPUT);
  pinMode(Buzzer,OUTPUT);
  pinMode(Relay1,OUTPUT);
  pinMode(Relay2,OUTPUT);
  pinMode(EN, OUTPUT);
  
  delay(1000);
  Serial.begin(115200);
  Serial.println("Start Testing");

  if (!pcf8574.begin(PCF8574_ADDRESS)) {
    Serial.println("Couldn't find PCF8574");
    while (1);
  }
  
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    Serial.flush();
    while (1) delay(10);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running, let's set the time!");
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }

  rs485.begin(2400, SWSERIAL_8N1, RO, DI);
  digitalWrite(EN, 0);
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  Serial.println("Ready!");
}

void loop() {
  
  if(digitalRead(Button)==LOW){
    DateTime now = rtc.now();
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

    Serial.println("LED");
    digitalWrite(LED,HIGH);
    delay(1000);
    digitalWrite(LED,LOW);

    Serial.println("Buzzer");
    digitalWrite(Buzzer,HIGH);
    delay(1000);
    digitalWrite(Buzzer,LOW);

    Serial.println("Realay1");
    digitalWrite(Relay1,HIGH);
    delay(1000);
    digitalWrite(Relay1,LOW);

    Serial.println("Realay2");
    digitalWrite(Relay2,HIGH);
    delay(1000);
    digitalWrite(Relay2,LOW);
    
    delay(1000);

    for (uint8_t p=0; p<8; p++) {
      pcf8574.digitalWrite(p, LOW);  // turn LED on by sinking current to ground
      delay(500);
      pcf8574.digitalWrite(p, HIGH); // turn LED off by turning off sinking transistor
    }
    
    Serial.println();
    float total = Read_Meter_float(ID_meter,Reg_TotalActiveEnergy);
    Serial.print("Total Active Energy = "); Serial.print(total);Serial.println(" kWh");
    delay(5000);
  }
}
Facebook Comments