본문 바로가기
전자공학/LoRa 통신

아두이노 lora shield(로라 쉴드)로 thingspeak, thingview에 값을 띄워보자, lora shield 시작하기 - (6)

by ohj921189 2020. 8. 16.
반응형

저번 포스팅에 이어 코드 해석을 계속 진행하도록 하겠습니다.

#include "ThingSpeak.h"
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
#include "SNIPE.h"


#define TXpin D9
#define RXpin D8
#define ATSerial Serial


SoftwareSerial DebugSerial(RXpin,TXpin);
SNIPE SNIPE(ATSerial);
int dis,temp,humi;
char buffer[16];

//16byte hex key
String lora_app_key = "11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00";

char ssid[] ="iptime***";   // wifi 이름 
char pass[] ="11******";   // wifi 비밀번호
int keyIndex = 0;            // your network key Index number (needed only for WEP)
WiFiClient  client;

unsigned long myChannelNumber =110****; // Thingspeak 채널 ID 번호
const char * myWriteAPIKey ="MIZM*******"; //Thingspeak Write API Key 

int number = 0;

void setup() {
  ATSerial.begin(115200);  // Initialize serial

 // put your setup code here, to run once:
  while(ATSerial.read()>= 0) {}
  while(!ATSerial);

  DebugSerial.begin(115200);
   /* SNIPE LoRa Initialization */
  if (!SNIPE.lora_init()) {
    DebugSerial.println("SNIPE LoRa Initialization Fail!");
    while (1);
  }

  /* SNIPE LoRa Set App Key */
  if (!SNIPE.lora_setAppKey(lora_app_key)) {
    DebugSerial.println("SNIPE LoRa app key value has not been changed");
  }
  
  /* SNIPE LoRa Set Frequency */
  if (!SNIPE.lora_setFreq(LORA_CH_1)) {
    DebugSerial.println("SNIPE LoRa Frequency value has not been changed");
  }

  /* SNIPE LoRa Set Spreading Factor */
  if (!SNIPE.lora_setSf(LORA_SF_7)) {
    DebugSerial.println("SNIPE LoRa Sf value has not been changed");
  }
  
  /* SNIPE LoRa Set Rx Timeout 
   * If you select LORA_SF_12, 
   * RX Timout use a value greater than 5000  
  */
  if (!SNIPE.lora_setRxtout(5000)) {
    DebugSerial.println("SNIPE LoRa Rx Timout value has not been changed");
  }          
  DebugSerial.println("SNIPE LoRa LED Recv");
  WiFi.mode(WIFI_STA); 
  ThingSpeak.begin(client);  // Initialize ThingSpeak
}

void loop() {
  if(WiFi.status() != WL_CONNECTED){
    DebugSerial.println("Attempting to connect to SSID: ");
    WiFi.begin(ssid, pass);
    DebugSerial.println("\nConnected.");
  }

  
    String ver = SNIPE.lora_recv();
    DebugSerial.println(ver);
    memset(buffer, 0x0, sizeof(buffer));
    ver.toCharArray(buffer, sizeof(buffer));
    sscanf(buffer, "%d:%d:%d", &dis,&humi,&temp);
    DebugSerial.print("Humidity: "); 
    DebugSerial.println(humi);
    DebugSerial.print("Temperature: ");
    DebugSerial.println(temp);
    DebugSerial.print("Distance: ");
    DebugSerial.println(dis);
    delay(1000);

  ThingSpeak.setField(1, dis);
  ThingSpeak.setField(2, temp);
  ThingSpeak.setField(3, humi);

  int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  if(x == 200){
    Serial.println("Channel update successful.");
  }
  else{
    Serial.println("Problem updating channel. HTTP error code " + String(x));
  }
  delay(1000); 
}

String ver = SNIPE.lora_recv(); // 송신 측에서 string 형식으로 값을 보냈으니 수신 측에서도 string 형식으로 값을 받습니다. SNIPE.lora_recv(); 이 함수가 값을 받아오는 함수입니다. 이 함수를 통해 받은 값을 ver이라는 변수에 저장합니다. 

 

memset(buffer, 0x0, sizeof(buffer)); // memset 함수는 특정 메모리의 어떤 시작 주소부터 연속된 범위를 특정한 값으로 모두 바꾸고 싶을 때 사용하는 함수입니다. 처음 매개변수는 채우고자 하는 메모리의 시작 주소이고 두 번째 매개변수는 메모리에 채우고자 하는 값을 넣습니다. 세 번째 매개변수는 채우고자 하는 바이트의 수, 즉 채우고자 하는 메모리의 크기입니다. 여기서는 buffer의 시작 주소부터 끝까지 값을 0으로 채우는 역할을 합니다.

 

ver.toCharArray(buffer, sizeof(buffer)); // toCharArray 함수는 string 형식의 데이터를 문자 배열로 변환하는 역할을 합니다. toCharArray의 첫 번째 매개변수에는 문자를 복사해 넣을 버퍼를 입력하고 두 번째 변수에는 버퍼의 크기를 입력합니다.     

 

sscanf(buffer, "%d:%d:%d", &dis,&humi,&temp); // sscanf 함수는 문자열에서 형식화된 데이터를 읽어오는 함수입니다. 첫 번째 매개변수는 sscanf 함수가 데이터를 얻어올 문자 배열입니다. 두 번째 매개변수는 데이터를 읽어서 어떤 형식으로 형식화되어 있는지 나타내준 다음, 그 순서대로 가변 인자들이 가리키는 메모리에 저장합니다. 이전 송신부에서 온도, 습도, 거리 세 가지의 데이터를 "거리:습도:온도"의 형태로 데이터를 저장하여 송신하였기 때문에 수신부의 sscanf 함수의 두 번째 매개변수를 "%d:%d:%d" 형식으로 나타내줍니다. dis 변수에는 거리 값이 저장되고 humi에는 습도 값이, temp에는 온도 값이 저장됩니다.

 

ThingSpeak.setField(1, dis);
ThingSpeak.setField(2, temp);
ThingSpeak.setField(3, humi);

그런 뒤에 ThingSpeak의 필드 1에 거리 값이 뜨게 하고 필드 2에는 온도 값이, 필드 3에는 습도 값이 뜨게 설정해 줍니다. 

 

 int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); // ThingSpeak.writeFields 함수를 이용하여 나의 채널 번호와 내 채널의 Write API KEY를 사용하여 필드에 값을 기록해 줍니다.

 

 

  if(x == 200){
    Serial.println("Channel update successful.");
  }
  else{
    Serial.println("Problem updating channel. HTTP error code " + String(x));
  }

만약 x가 200이라면 성공적으로 값이 서버에 전송이 된 것이고 그렇지 않으면 HTTP error 코드와 함께 전송에 문제가 생겼다는 것을 시리얼 모니터에 프린트합니다. 

반응형

댓글