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