Learning XBee With XBee Series 2 Starter Kit (Part 2)

ทดลองเชื่อมต่อโมดูล XBee เข้ากับบอร์ด Arduino
              หลังจากทดสอบเฉพาะโมดูล XBee ว่าสามารถติดต่อกันได้แล้ว ต่อไปจะนำบอร์ด Arduino มารับ-ส่งข้อมูลจากโมดูล XBee ในฝั่ง Router ให้บอร์ด Arduino รับข้อมูลที่มาจาก XBee ด้วย Software Serial แล้วส่งต่อไปที่ Hardware Serial เพื่อแสดงข้อมูลที่รับมาได้บนเครื่องคอมพิวเตอร์ ในขณะเดียวกันก็ให้ Arduino รับข้อมูลจาก Hardware Serial ที่ส่งมาจากเครื่องคอมพิวเตอร์ แล้วส่งผ่าน Software Serial ไปที่ XBee

              เนื่องจากบอร์ด Arduino Uno R3 มีพอร์ต Serial (Hardware Serial) เพียง 1 พอร์ตต่อกับชิพ USB to Serial เพื่อต่อกับเครื่องคอมพิวเตอร์แล้ว จึงไม่สามารถนำไปต่อเข้ากับอุปกรณ์อื่นได้ ต้องใช้ Software Serial ติดต่อกับ XBee แทน โดยในตัวอย่างนี้กำหนดขา Rx เป็นขา 2 เชื่อมต่อกับขา Tx ของ XBee และขา Tx เป็นขา 3 เชื่อมต่อกับขา Rx ของ XBee

โดยโค้ดโปรแกรมของ Arduino มีดังนี้

#include <SoftwareSerial.h>
#define RxD 2
#define TxD 3
SoftwareSerial mySerial(RxD,TxD); // RX, TX
void setup() {
    Serial.begin(9600);
    pinMode(RxD, INPUT);
    pinMode(TxD, OUTPUT);
    mySerial.begin(9600);
}
 
void loop() {
    if (mySerial.available()) {
        char incoming  = mySerial.read();
        Serial.write(incoming);
    }
    if (Serial.available()) {
        char incoming_2  = Serial.read();
        mySerial.write(incoming_2);
    }
}

จากโค้ด

#include <SoftwareSerial.h>
#define RxD 2
#define TxD 3

SoftwareSerial mySerial(RxD,TxD); // RX, TX

            ประกาศเรียกใช้งานไลบรารี่ Software Serial โดย #include <SoftwareSerial.h> จากนั้นกำหนดออบเจ็กต์ SoftwareSerial mySerial จากขาได้กำหนดไว้ใน RxD ขา 2 และ TxD ขา 3

Serial.begin(9600);
pinMode(RxD, INPUT);
pinMode(TxD, OUTPUT);
mySerial.begin(9600);

            ในฟังก์ชั่น setup() กำหนด Hardware Serial Baud Rate เป็น 9600 bps กำหนดขา 2 เป็นอินพุตและขา 3 เป็นเอาท์พุตสำหรับติดต่อ Software Serial จากนั้นเรียกคำสั่ง SoftwareSerial mySerial Software กำหนดให้ Serial Baud Rate เป็น 9600 bps เช่นกัน

if (mySerial.available()) {
        char incoming  = mySerial.read();
        Serial.write(incoming);
    }

    if (Serial.available()) {
        char incoming_2  = Serial.read();
        mySerial.write(incoming_2);
    }

             ในฟังก์ชั่น loop() ถ้าตรวจสอบได้ว่า มีตรวจสอบข้อมูลส่งเข้ามาที่ Software Serial ด้วยคำสั่ง mySerial.available() ให้โปรแกรมอ่านค่าด้วยคำสั่ง mySerial.read() และส่งต่อไปที Hardware Serial ด้วยคำสั่ง Serial.write(incoming)


             เช่นเดียวกัน ถ้ามีข้อมูลส่งเข้ามาที่ Hardware Serial โปรแกรมจะอ่านค่าและส่งออกไปที SoftwareSerial mySerial
             ให้อัพโหลดโปรแกรมไปที่บอร์ด โดยเลือกที่ Tools > Board > Arduino Uno เลือกพอร์ต Serial ของ Arduino ที่ Tools > Port > พอร์ตของ Arduino ในตัวอย่างนี้เป็น COM10 ดังภาพ

จากนั้นกดปุ่ม Upload Sketch เมื่อเสร็จแล้วกดปุ่มเปิดโปรแกรม Serial monitor ขึ้นมา

ทดสอบส่งข้อความระหว่างกัน

Mini Project จำลองระบบ Monitoring และควบคุมความชื้น, อุณหภูมิและคุณภาพอากาศ ในโรงเรือน

            จากการได้ทดสอบสื่อสารด้วยโมดูล XBee มาแล้วสามารถลองนำหลักการมาประยุกต์ในโปรเจคจริงๆ ได้ ตัวอย่างนี้นำมาทำโปรเจคจำลองระบบควบคุมสภาพอากาศในโรงเรือนให้เหมาะสมกับต้นไม้ที่ปลูก โดยใช้บอร์ด Arduino อ่านค่าอุณหภูมิและความชื่นจากเซ็นเซอร์ DHT22 และเซ็นเซอร์วัดคุณภาพอากาศ จากนั้นส่งข้อมูลไปให้โปรแกรมบนเครื่องคอมพิวเตอร์เปรียบเทียบ ถ้าค่ามากกว่าหรือน้อยกว่า จากที่โปรแกรมกำหนดไว้โปรแกรมจะส่งคำสั่ง Relay ทั้ง 2 เปิด-ปิด ทำให้พัดลมทำงานดังภาพ

อุปกรณ์ที่ใช้เพิ่มเติมจากชุดXBee Series 2 Starter Kit
– i Module Arduino Connector Base Shield จำนวน 1 pcs
EADN022: https://www.thaieasyelec.com/i-module-arduino-connector-base-shield.html
– i Module – Relay Kit V1.0 จำนวน 2 pcs 
EADN025: https://www.thaieasyelec.com/i-module-relay-kit-v1-0.html
– Grove – Temperature&Humidity Sensor Pro – DHT22 จำนวน 1 pcs
ESEN173: https://www.thaieasyelec.com/grove-temperature-humidity-sensor-pro-dht22.html
– Grove – Air Quality Sensor 1.0 จำนวน 1 pcs
ESEN184: https://www.thaieasyelec.com/grove-air-quality-sensor-1-3.html

 4 Wire Cable (20cm.) for i Module จำนวน 2 pcs

ELNK039 : https://www.thaieasyelec.com/4-wire-cable-20cm.html
             การต่อวงใช้ให้เสียบ Base Shield ลงบน XBee Shield จากนั้นเชื่อมต่อ Relay DHT22 และ Air Quality Sensor ผ่าน Base Shield โดยต่อกับขา Arduino ดังตารางด้านล่าง

ในส่วนของ Grove ทั้งสองตัวต้องสลับสายตามรูป

โค้ดโปรแกรมบนบอร์ด Arduino มีดังนี้ (สามารถโหลดโค้ดโปรแกรม Arduino ได้ที่นี่)

#include "Arduino.h"
#include <SoftwareSerial.h>
#include "DHT.h"
#include "AirQuality.h"
#define RxD 2
#define TxD 3
#define DHTPIN 4   
#define Relay_fan_1 5 
#define Relay_fan_2 6
#define Air_Quality_PIN A0

boolean _run = true;
char incoming;
float h = 0;
float t = 0;
float f = 0;

AirQuality airqualitysensor;
int current_quality =-1;
SoftwareSerial mySerial(RxD,TxD); // RX, TX
DHT dht(DHTPIN,DHT22);

void setup() {
    Serial.begin(9600);
    Serial.println("Hello I'm Arduino");
    pinMode(RxD, INPUT);
    pinMode(TxD, OUTPUT);
    mySerial.begin(9600);
    mySerial.println("Hi Send from Arduino");
    mySerial.println("<<------------------->>");
    mySerial.println("Initing Sensor Please wait a few seconds...");
    pinMode(Relay_fan_1, OUTPUT);
    pinMode(Relay_fan_2, OUTPUT);
    digitalWrite(Relay_fan_1,HIGH);  //Off Relay Fan Front
    digitalWrite(Relay_fan_2,HIGH);  //Off Relay Fan Back
    airqualitysensor.init(14);
    dht.begin();
}

 

void loop () {
    if (mySerial.available())  {
        incoming  = mySerial.read();
        switch(incoming) {
            case 'a' :  digitalWrite(Relay_fan_1,HIGH);
                            mySerial.println("Relay_font_OFF"); break;
            case 'b' :  digitalWrite(Relay_fan_1,LOW);
                            mySerial.println("Relay_font_ON");break;
            case 'c' :  digitalWrite(Relay_fan_2,HIGH);
                            mySerial.println("Relay_Back_OFF");break;
            case 'd' :  digitalWrite(Relay_fan_2,LOW);
                            mySerial.println("Relay_Back_ON");break;
            case 'r' :  _run = true;  mySerial.println("Arduino_run");break;
            case 's' :  _run = false; mySerial.println("Arduino_stop");break;
        }
    }
    current_quality = airqualitysensor.slope();
    if (current_quality >= 0) {   // if a valid data returned.
        if (isnan(h) || isnan(t) || isnan(f)) {
            mySerial.println("Failed to read from DHT sensor!");
            return;
        }
        float hi = dht.computeHeatIndex(f, h);
        //--------------- Send to PC ------------------//
        mySerial.println("<<----------Start---------->>");
        mySerial.print("Humidity: ");
        mySerial.print(h);
        mySerial.println(" %");
        mySerial.print("Temperature: ");
        mySerial.print(t);
        mySerial.print(" *C ");
        mySerial.print(", ");
        mySerial.print(f);
        mySerial.println(" *F");
        mySerial.print("Heat index: ");
        mySerial.print(hi);
        mySerial.println(" *F");
        mySerial.print("Air Quality: ");
        if (current_quality==0) {
            mySerial.print("High pollution! Force signal active :");
            mySerial.println(airqualitysensor.first_vol);
        }
        else if (current_quality==1) {
            mySerial.print("High pollution! :");
            mySerial.println(airqualitysensor.first_vol);
        }
        else if (current_quality==2)  {
            mySerial.print("Low pollution! :");
            mySerial.println(airqualitysensor.first_vol);
        }
        else if (current_quality ==3) {
            mySerial.print("Fresh air :");
            mySerial.println(airqualitysensor.first_vol);
        }
        mySerial.println("<<----------Stop---------->>");
        //---------- Reset Value ------------//
        h=0;
        f=0;
        t=0;
        //---------- Reset Value ------------//
        //--------------- Send to PC ------------------//
    } // End current_quality >= 0
} //End Loop

//---------- Interrupt Timer -----------------//

    ISR(TIMER2_OVF_vect)  {
    if(_run == true) {
        if(airqualitysensor.counter==122) { //set 2 seconds as a detected duty
            //---------------  Air Qulity -----------//
                airqualitysensor.last_vol=airqualitysensor.first_vol;
                airqualitysensor.first_vol=analogRead(Air_Quality_PIN);
                airqualitysensor.counter=0;
                airqualitysensor.timer_index=1;
            //---------------  Air Qulity -----------//
            //--------------- DHT22 ------------------//
            h = dht.readHumidity();
            t = dht.readTemperature();   // Read temperature as Celsius
            f = dht.readTemperature(true);
            //--------------- DHT22 ------------------//
        }
        else {
            airqualitysensor.counter++;
        }
    } //end if _run== true
} // end 2 sec timer
//---------- Interrupt Timer -----------------//


จากโค้ดจะเห็นได้ว่า 

#include "Arduino.h"
#include <SoftwareSerial.h>
#include "DHT.h"
#include "AirQuality.h"

เรียกใช้งานไลบรารี่ Software Serial สำหรับเชื่อมต่อเข้ากับโมดูล XBee ไลบรารี่ DHT และ ไลบรารี่ AirQuality สำหรับเชื่อมต่อกับเซ็นเซอร์ทั้ง 2 

Serial.begin(9600);
Serial.println("Hello I'm Arduino");
pinMode(RxD, INPUT);
pinMode(TxD, OUTPUT);
mySerial.begin(9600);
mySerial.println("Hi Send from Arduino");
mySerial.println("<<------------------->>");
mySerial.println("Initing Sensor Please wait a few seconds...");
pinMode(Relay_fan_1, OUTPUT);
pinMode(Relay_fan_2, OUTPUT);
digitalWrite(Relay_fan_1,HIGH);  //Off Relay Fan Front
digitalWrite(Relay_fan_2,HIGH);  //Off Relay Fan Back
airqualitysensor.init(14);
dht.begin();

        ในฟังก์ชั่น Setup() กำหนด Baud Rate ใช้งาน Hardware Serial และ Software Serial เป็น 9600 กำหนดขา I/O ที่ใช้สั่งงาน Relay ควบคุมพัดลม และกำหนดให้เซ็นเซอร์ทั้งสองเริ่มทำงาน

if (mySerial.available())  {
        incoming  = mySerial.read();
        switch(incoming) {
            case 'a' :  digitalWrite(Relay_fan_1,HIGH);
                            mySerial.println("Relay_Front_OFF"); break;
            case 'b' :  digitalWrite(Relay_fan_1,LOW);
                            mySerial.println("Relay_Front_ON");break;
            case 'c' :  digitalWrite(Relay_fan_2,HIGH);
                            mySerial.println("Relay_Back_OFF");break;
            case 'd' :  digitalWrite(Relay_fan_2,LOW);
                            mySerial.println("Relay_Back_ON");break;
            case 'r' :  _run = true;  mySerial.println("Arduino_run");break;
            case 's' :  _run = false; mySerial.println("Arduino_stop");break;
        }
    }

        ในฟังก์ชั่น loop() คอยรับคำสั่งที่มาจากเครื่องคอมพิวเตอร์ผ่าน Software Serial เช่น ถ้าส่งตัวอักษร ‘a’ มาให้ Relay ตัวที่ 1 ทำงานและส่งข้อความกลับ “Relay_Front_OFF” หรือส่ง ‘r’ คือกำหนดให้ตัวแปร _run เป็น true คือ Arduino เริ่มวนอ่านค่าจากเซ็นเซอร์

current_quality = airqualitysensor.slope();
    if (current_quality >= 0) {   // if a valid data returned.
        if (isnan(h) || isnan(t) || isnan(f)) {
            mySerial.println("Failed to read from DHT sensor!");
            return;
    }

            ถ้าค่าที่อ่านได้จากเซ็นเซอร์ Air Quality มีค่ามากกว่า 0 และค่าที่อ่านได้จาก DHT22 เก็บไว้ในตัวแปร h t f เป็นค่าตัวเลข จากนั้นโปรแกรมจะเริ่มส่งข้อมูลไปยังเครื่องคอมพิวเตอร์

float hi = dht.computeHeatIndex(f, h);
        //--------------- Send to PC ------------------//
        mySerial.println("<<----------Start---------->>");
        mySerial.print("Humidity: ");
        mySerial.print(h);
        mySerial.println(" %");
        mySerial.print("Temperature: ");
        mySerial.print(t);
        mySerial.print(" *C ");
        mySerial.print(", ");
        mySerial.print(f);
        mySerial.println(" *F");
        mySerial.print("Heat index: ");
        mySerial.print(hi);
        mySerial.println(" *F");     

             ส่งข้อมูลไปยังเครื่องคอมพิวเตอร์โดยเริ่มจากส่ง “<<———-Start———->>” จากนั้นตามด้วยข้อมูลความชื้น อุณหภูมิ ค่า Heat Index ที่คำนวณออกมาได้

mySerial.print("Air Quality: ");        
        if (current_quality==0) {
            mySerial.print("High pollution! Force signal active :");
            mySerial.println(airqualitysensor.first_vol);
        }
        else if (current_quality==1) {
            mySerial.print("High pollution! :");
            mySerial.println(airqualitysensor.first_vol);
        }
        else if (current_quality==2)  {
            mySerial.print("Low pollution! :");
            mySerial.println(airqualitysensor.first_vol);
        }
        else if (current_quality ==3) {
            mySerial.print("Fresh air :");
            mySerial.println(airqualitysensor.first_vol);
        }
        mySerial.println("<<----------Stop---------->>"); 

              ส่งข้อมูลจากเซ็นเซอร์ Air Quality โดยกำหนดคุณภาพอากาศเป็น 4 ระดับ (0-3) และค่าที่อ่านได้จากเซ็นเซอร์จากนั้นส่งข้อความ “<<———-Stop———->>”

ISR(TIMER2_OVF_vect)  {
    if(_run == true) {
        if(airqualitysensor.counter==122) { //set 2 seconds as a detected duty
            //---------------  Air Qulity -----------//
                airqualitysensor.last_vol=airqualitysensor.first_vol;
                airqualitysensor.first_vol=analogRead(Air_Quality_PIN);
                airqualitysensor.counter=0;
                airqualitysensor.timer_index=1;
            //---------------  Air Qulity -----------//
            //--------------- DHT22 ------------------//
            h = dht.readHumidity();
            t = dht.readTemperature();   // Read temperature as Celsius
            f = dht.readTemperature(true);
            //--------------- DHT22 ------------------//
        }
        else {
            airqualitysensor.counter++;
        }
    } //end if _run== true
} // end 2 sec timer


               เมื่อมีการ Interrupt จาก Timer 2 ถ้าตรวจสอบได้ว่าตัวแปร _run เป็น true คือให้ Arduino อ่านค่าจากเซ็นเซอร์ได้ และค่า Counter เท่ากับ 122 (ประมาณ 2 วินาที) Arduino อ่านค่าจาก Air Quality และ DHT22 

               โปรแกรมมอนิเตอร์และควบคุมบนเครื่องคอมพิวเตอร์อ่านค่าจาก Serial port ที่โมดูล XBee เชื่อมต่ออยู่ นำข้อมูลที่ได้ไปแสดงผลด้วย Graph และ Histogram (สามารถโหลดโค้ดโปรแกรมที่รันบน PC – XBee Monitoring ได้ที่นี่) ขั้นตอนการใช้โปรแกรมเบื้องต้น

1. เลือกพอร์ต Serial ที่เชื่อมต่อกับโมดูล XBee จากนั้นกดปุ่ม Connect

2. ถ้าไม่มีข้อผิดพลาดในการเชื่อมต่อ โปรแกรมจะแสดงข้อมูลที่ Arduino ส่งมา

3. สามารถสั่งให้ Arduino หยุดอ่านค่าจากเซ็นเซอร์ โดยกดปุ่ม Start หรือกดปุ่มอีกครั้ง เพื่อให้เริ่มอ่านค่าจากเซ็นเซอร์ กดปุ่ม Fan 1 และ Fan 2 เพื่อควบคุม Relay 1 และ Relay 2

4. ในแต่ละแถบ จะแสดงค่าที่รับมาได้เป็น Graph เมื่อเทียบกับจำนวนครั้งที่ส่ง และแสดงความถี่ของข้อมูลที่รับได้ผ่าน Graph Histogram

ถ้าข้อมูลเกินกว่าหรือต่ำกว่าที่กำหนดไว้ใน Set Limit ของแต่ละค่า โปรแกรมจะแสดงข้อความในช่อง Alert เป็น Warning

โดยโค้ดโปรแกรมบนเครื่องคอมพิวเตอร์มีดังนี้ 

private void serial_XBee_DataReceived(object sender, SerialDataReceivedEventArgs e) {
    tbx_data_in.BeginInvoke(new InvokeDelegate(updateTextbox_));
}

             เมื่อมีข้อมูลส่งเข้ามาที่ Serial port ที่เชื่อมต่อจะไปคอนโทรล Text Box tbx_data_in เข้าไปทำงานในฟังก์ชั่น updateTextbox()

buffer_raw = serial_XBee.ReadExisting();
tbx_data_in.Text += buffer_raw;
buffer_process += buffer_raw;


             ในฟังก์ชั่น updateTextbox() จะอ่านค่าจาก Serial เก็บไว้ในตัวแปร buffer_raw ซึ่งจะส่งค่าไปยัง Text Box tbx_data_in และตัวแปร buffer_process

if (buffer_process.IndexOf("Stop") != -1) {
           int index_humid = buffer_process.IndexOf("Humidity:");
           int index_temp = buffer_process.IndexOf("Temperature:");
           int index_heat = buffer_process.IndexOf("Heat index:");
           int index_air = buffer_process.IndexOf("Air Quality:");
           str_humid = buffer_process.Substring(index_humid + 10, 5);
           str_temp = buffer_process.Substring(index_temp + 13, 5);
           str_heat = buffer_process.Substring(index_heat + 12, 5);
           str_air = buffer_process.Substring(index_air + 12);
           int index_air_value = str_air.IndexOf(":");
           str_air_value = str_air.Substring(index_air_value + 1, 3);
           lb_state_ss_temp.Text = str_temp + " °C";
           lb_state_ss_humid.Text = str_humid + "%";
           lb_state_ss_air.Text = str_air_value;
           buffer_process = "";
           count++;</

        นำตัวแปร buffer_process มาเลือกเฉพาะข้อมูลที่ต้องการเก็บข้อความที่ต้องไว้ในตัวแปร str_humid str_temp str_heat str_air นำไปแสดงในแท็บหน้า Overview

try {
    temp_value =  Convert.ToDouble(str_temp);
    humid_value = Convert.ToDouble(str_humid);
    heat_value = Convert.ToDouble(str_heat);
    air_value = Convert.ToInt32(str_air_value);
    index_histo_temp = (int)(temp_value * 100);
    index_histo_humid = (int)(humid_value * 100);
    index_histo_heat = (int)(heat_value * 100);
   }

catch {
    MessageBox.Show("Temp:" + str_temp + "\r\n" +
    "Humid:" + str_humid + "\r\n" +
    "Heat:" + str_heat + "\r\n" +
    "Air:" + str_air);

     }

             แปลงข้อความในตัวแปรทั้ง 4 (str_humid str_temp str_heat str_air) เป็นข้อมูลตัวเลข ถ้ามีข้อผิดพลาดเกิดขึ้นให้แสดง Message Box พร้อมข้อมูลที่รับเข้ามา  

//---------- Graw graph & histogram Temp----------//
chart_graph_temp.Series[0].Points.AddXY(count, temp_value);
chart_histo_temp.Series[0].Points.AddXY(temp_value, histogram_temp[index_histo_temp] += 1);
//---------- Graw graph & histogram Temp----------//

//---------- Graw graph & histogram Humid----------//
chart_graph_humid.Series[0].Points.AddXY(count, humid_value);
chart_histo_humid.Series[0].Points.AddXY(humid_value, histogram_humid[index_histo_humid] += 1);
//---------- Graw graph & histogram Humid----------//

//---------- Graw graph & histogram Heat----------//
chart_graph_heat.Series[0].Points.AddXY(count, heat_value);
chart_histo_heat.Series[0].Points.AddXY(heat_value, histogram_heat[index_histo_heat] += 1);
//---------- Graw graph & histogram Heat----------//

//---------- Graw graph & histogram Air----------//
chart_graph_air.Series[0].Points.AddXY(count, air_value);
chart_histo_air.Series[0].Points.AddXY(air_value, histogram_air[air_value] += 1);
//---------- Graw graph & histogram Air----------//

        นำข้อมูลตัวเลขที่ได้จากการแปลงข้อความข้างต้นเก็บข้อมูลเซ็นเซอร์ทั้ง 4 มาวาด Graph และ Histogram

การ Update Firmware

        เฟิร์มแวร์ (Firmware) คือโปรแกรมขนาดเล็กที่ใช้ในการควบคุมการทำงานของอุปกรณ์อิเล็กทรอนิกส์ต่างๆ เช่น การควบคุมการทำงานตามคำสั่งต่างๆ สำหรับ XBee ก็มีเฟิร์มแวร์ควบคุมการทำงานเหมือนกันโดย XBee Series ต่างกันก็จะมีเวอร์ชันเฟิร์มแวร์ที่แตกต่างกันด้วย

ขั้นตอนการตั้งค่า Default parameter และ Update Firmware ของ Xbee ด้วยโปรแกรม XCTU (ตัวอย่างนี้ใช้กับ XBee S2C)

1. กด Default เพื่อทำการ Reset ค่า parameter ต่างๆใน XBee ให้เป็นค่าเริ่มต้น                                                                                           

จะมีหน้าต่างขึ้นมาให้ยืนยันว่าต้องการ Reset หรือไม่ กด Yes

2. กด Update ดังภาพ

3. เลือกรุ่น (Product family) ของ XBee เป็น XB24C ที่ช่อง Function set กำหนดให้ XBee เป็น ZIGBEE TH Reg และเลือก Version เป็นรุ่นล่าสุด (405F) ดังภาพแล้วกดปุ่ม Update

4. รอซักครู่ โปรแกรมจะอัพเดท Firmware และเซต Parameter เป็นค่าเริ่มต้นตามที่เราได้กำหนดก่อนหน้านี้

5. ถ้าการอัพเดทสำเร็จ โปรแกรมจะแสดงข้อความ “Radio firmware has been update success fully” เสร็จสิ้นขั้นตอนการ Update Firmware

ขอขอบคุณ ข้อมูลจาก

(https://www.digi.com/)

(http://jeffbelback.me/projects/2014/09/17/XbeeDeviceTypes/)