저번 포스팅에 이어 코드 해석을 계속 진행하도록 하겠습니다.
#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 코드와 함께 전송에 문제가 생겼다는 것을 시리얼 모니터에 프린트합니다.
댓글