#include <EnergySaving.h>
#include "RTC_SAMD21.h"
#include "DateTime.h"
EnergySaving nrgSave;
RTC_SAMD21 rtc;
int state = 0;
int retry = 5;
String reply;
String location = "test";
void setup() {
Serial.begin(115200); //USBシリアル
Serial1.begin(115200); //ATコマンド シリアル
pinMode(5, OUTPUT); //DCDC ENピン
digitalWrite(5, LOW);
rtc.begin();
Serial.begin(115200);
nrgSave.begin(WAKE_RTC_ALARM);
}
void loop() {
int num = 0;
//ATコマンド
switch (state) {
case 0:
Serial1.write("AT\r\n");
break;
case 1:
Serial1.write("AT+CNACT=0,1\r\n");
break;
case 2:
Serial1.write("AT+CLBS=4,0\r\n");
break;
case 31:
Serial1.write("AT+SHCONF=\"URL\",\"http://データ送信先サーバ\"\r\n");
break;
case 32:
Serial1.write("AT+SHCONF=\"BODYLEN\",1024\r\n");
break;
case 33:
Serial1.write("AT+SHCONF=\"HEADERLEN\",350\r\n");
break;
case 34:
Serial1.write("AT+SHCONN\r\n");
break;
case 4:
Serial1.write("AT+SHSTATE?\r\n");
break;
case 5:
Serial1.print("AT+SHREQ=\"/hoge?location=" + location + "\", 1\r\n");
break;
}
//通信後Sleep
if(state == 6){
digitalWrite(5, LOW); //CAT-M OFF
state = 0;
//RTC時刻設定
DateTime now = DateTime(2021, 1, 1, 0, 0, 0); //DateTime(年,月,日,時間,分,秒)
rtc.adjust(now);
now = rtc.now();
//RTCアラームセット
DateTime alarm = DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute() + 1, now.second());
rtc.setAlarm(alarm);
rtc.enableAlarm(rtc.MATCH_HHMMSS);
//sleep
nrgSave.standby();
}
//5V Boost DCDC ON
if(state == 0){
digitalWrite(5, HIGH); //CAT-M ON
}
//HTTP getリクエスト
while(state == 5){
if(Serial1.available()) {
reply = Serial1.readStringUntil('\n');
Serial.println(reply);
}
num++;
if(reply.indexOf("SHREQ: \"GET\",200") >= 0) {
state = 6;
break;
}else if(num >= retry){
break;
}
delay(300);
}
//HTTPステート確認
while(state == 4){
if(Serial1.available()) {
reply = Serial1.readStringUntil('\n');
Serial.println(reply);
}
num++;
if(reply.indexOf("SHSTATE: 1") >= 0) {
state = 5;
break;
}else if(num >= retry){
break;
}
delay(300);
}
//HTTP設定
while(state == 31 || state == 32 || state == 33 || state == 34){
if(Serial1.available()) {
reply = Serial1.readStringUntil('\n');
Serial.println(reply);
}
num++;
if(reply.indexOf("OK") >= 0) {
if(state == 31) state = 32;
else if(state == 32) state = 33;
else if(state == 33) state = 34;
else if(state == 34) state = 4;
break;
}else if(num >= retry){
break;
}
delay(300);
}
//基地局位置情報
while(state == 2){
if(Serial1.available()) {
reply = Serial1.readStringUntil('\n');
Serial.println(reply);
}
num++;
if(reply.indexOf("+CLBS:") >= 0) {
reply.replace(" ", "-");
reply.replace("\r", "-");
location = reply;
state = 31;
break;
}else if(num >= retry){
break;
}
delay(300);
}
//通信開始
while(state == 1){
if(Serial1.available()) {
reply = Serial1.readStringUntil('\n');
Serial.println(reply);
}
num++;
if(reply.indexOf("ACTIVE") >= 0) {
state = 2;
break;
}else if(num >= retry){
break;
}
delay(300);
}
//AT導通確認
while(state == 0){
if(Serial1.available()) {
reply = Serial1.readStringUntil('\n');
Serial.println(reply);
}
num++;
if(reply.indexOf("OK") >= 0) {
state = 1;
break;
}else if(num >= retry){
break;
}
delay(300);
}
Serial.println(state);
//Serial.println(location);
delay(1000);
}
void alarmMatch(){
Serial.println("WakeUP");
}