วันอาทิตย์ที่ 11 พฤศจิกายน พ.ศ. 2561

arduino rf433MHz Wireless RF Transmitter and Receive Module

วันนี้ขอนอกเรื่อง raspberrypi บ้าง บันทึกไว้กันลืม กันหายด้วย

ทำตามเวปที่เขาสอนไว้ การต่อสายสัญญาณ ก็ทำตามได้อยู่ แต่ code มันไม่ได้ตามที่เราอยากได้ จึงต้อง modify code เอง

อธิบายหลักการของ code
ในการส่งข้อมูลของเจ้าตัวนี้ จะส่งซ้ำๆ หลายๆหน เพื่อความชัวร์ของข้อมูล แต่ก็ทำให้เราเขียน code ยากหน่อย เพราะต้องกรองเอาตัวที่ซ้ำออกไป
วิธีการกรองก็คือ ต้องใส่หมายเลขจำนวน byte ที่ส่ง มาด้วย ยกตัวอย่างเช่น
ต้องการส่งคำว่า "HELLO" เราก็ต้องส่ง 0H , 1E, 2L, 3L, 4O คือ มีตัวเลขนำหน้าอักษรที่เราจะส่งแปะติดมาด้วย แล้วก็ต้องปิดท้ายด้วย 0xFF เพื่อให้รู้ว่าหมดข้อมูลแล้ว
ดังนั้นข้อมูลที่เราต้องส่งจริงๆก็คือ 0H , 1E, 2L, 3L, 4O, 5(0xff)


code ข้างล่างนี้ เป็น code ของตัวส่ง

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

void setup() {
  Serial.begin(9600);
  mySwitch.enableTransmit(10);
}

void send_string(const char *str){
  int i=0;
  for(char *p=str; *p; p++){
    mySwitch.send((i<<8)+*p,16);
    i++;
  }
  mySwitch.send((i<<8)+255,16);
}

void loop() {
  send_string("Hello");
  delay(1000);
}

ส่วน code ของภาครับ ก็ต้องกรองเอาตัวที่ไม่ใช่ข้อมูลจริงๆออกไป

code ต่อไปนี้ เป็นของตัวรับ

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();

uint16_t recv_code[5];
static uint8_t last_byte_number;

void setup() {
  Serial.begin(9600);
  mySwitch.enableReceive(0);  // Receiver on interrupt 0 => that is pin #2
}

int receiveValue(){
  if(!mySwitch.available())
    return 1;
  uint16_t code = mySwitch.getReceivedValue();
  uint8_t this_byte_number = code >> 8;
  code = code&0xff;
  if(code == 0xff){
    last_byte_number = this_byte_number;
    mySwitch.resetAvailable();
    Serial.print("\n");
    return 3;
  }else{
    if(code != 0){
      recv_code[this_byte_number] = code;
      mySwitch.resetAvailable();
      Serial.print(this_byte_number);
      Serial.print((char)recv_code[this_byte_number]);
    }
  }
  return 2;
}

void loop() {
  int c = receiveValue();
  if(c==3){
    for(int i=0; i<last_byte_number;i++){
      Serial.write((char)recv_code[i]);
    }
  }
}

พอเราเขียน code และ upload เรียบร้อยแล้ว เราก็เปิด Serial Monitor ดูว่าข้อมูลที่รับได้ เป็นอย่างไรบ้าง