SoftBank貸出のセンサで動作検証を行った時のスケッチを公開します。
IDEにサンプルがない場合等に参考にして下さい。
ハンズオンの書式と異なる場合がありますが御了承ください。
#46.47.48 Blue/Red/Yellow LED Button
Blue/Red/Yellow_LED_Button
#include <WioCellLibforArduino.h>
#include <stdio.h>
#include <rBase64.h>
#include <string.h>
#include <stdlib.h>
#define ARDUINO_WIO_LTE_M1NB1_BG96
#define BAUDRATE 115200
#define CONSOLE SerialUSB
#define BG96 SerialModule
#define INTERVAL (1000) /*** Push interval(mSec) ***/
/***** enebular info *****/
#define ENEBULAR_NODE_PATH "https://ev2-prod-node-red-37dee588-a74.herokuapp.com" // URL末尾に"/"をつけない
#define ENABULAR_POST_URL "/debug"
#define ENEBULAR_ENDPOINT ENEBULAR_NODE_PATH""ENABULAR_POST_URL
/****** Sensor PIN *****/
#define SENSOR_PIN (WIO_D38)
#define BUTTON_PIN (WIO_D19)
#define LED_PIN (WIO_D20)
//#define SENSOR_PIN (WIO_I2C_D24) /* I2C use D-PORT24 */
/*** ##### D38以外はデフォルト=Disable(給電off) */
#define SET_CEDRXS "at+cedrxs=0" /* set eDrx disable =0 */
#define GET_CEDRXS "at+cedrxs?" /* get eDrx status */
#define SET_QCFG "at+qcfg=\"nwscanseq\",020301" /* set <- M1 (02=M1 03=NB 01=3G-GSM)*/
#define SET_QCFG2 "at+qcfg=\"iotopmode\",2" /* set 0=M1 1=NB1 2=M1 & NB1 */
#define GET_COPS "at+cops?" /* get cops info 1 2 44020 8 */
#define GET_QCSQ "at+qcsq" /* get qcsq info CAT-M1 -40 -64 216 -7 */
#define GET_QNWINFO "at+qnwinfo" /* get qnwinfo info CAT-M1 44020 LTE BAND 1 475 */
/*** Wio LTE 制御クラス *** Wio LTE 本体の処理を呼び出すための変数を定義 */
WioCellular Wio;
int sw_stat=0;
/***** Setup処理 ***** */
void setup() {
delay(1000);
CONSOLE.begin(BAUDRATE);
CONSOLE.println("");
CONSOLE.println("############ SETUP ############");
CONSOLE.println("");
/***** Wio LTE 全体を初期化 *****/
Wio.Init();
CONSOLE.println("### Start Wio LTE initialization ###");
/***** LTE通信モジュールの電源供給を開始 *****/
Wio.PowerSupplyCellular(true);
CONSOLE.println("### Power supply ON ###");
delay(500); /* モジュール安定までWAIT */
/***** LTE通信モジュールを起動(起動済みの場合はリセット) *****/
if (!Wio.TurnOnOrReset()) {
CONSOLE.println("### Turn on or reset ERROR! ###");
return;
}else{
CONSOLE.println("### Turn on or reset Succeeded ###");
}
delay(500); // モジュール安定までWAIT
/***** Mobile Network接続(SB) ***** MANUALでPLMNを直接記述 PLMN=44020 (MCC=400,MNC=20) */
Wio.SetSelectNetwork(WioCellular::SELECT_NETWORK_MODE_MANUAL, "44020");
CONSOLE.println("### SELECT_NETWORK_MODE_MANUAL 44020 ###");
/***** プロバイダ(SB) set *****/
char a_key[8]={};
char u_key[4]={};
char p_key[4]={};
getKey(a_key,u_key,p_key);
if (!Wio.Activate(a_key, u_key, p_key)) {
CONSOLE.println("### NW Connect ERROR! ###");
return;
}else{
CONSOLE.println("### Connecting to NW. Succeeded ###");
}
/***** LTE M1を明示的に指定 *****/
Wio.SetAccessTechnology(WioCellular::ACCESS_TECHNOLOGY_LTE_M1);
CONSOLE.println("### ACCESS_TECHNOLOGY_LTE_M1 ###");
/***** AT Command 実行 *****/
CONSOLE.println("### ISSUE AT COMMAND ###");
/***** e-DRX disable SET (Defalt = OFF) *****/
BG96.println(SET_CEDRXS);
CONSOLE.println(SET_CEDRXS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(500); /* "0" Disable the use of e-I-DRX , "1" Enable the use of e-I-DRX */
/***** e-DRX CHECK *****/
BG96.println(GET_CEDRXS);
CONSOLE.println(GET_CEDRXS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続する通信規格の優先度を変更 *****/
BG96.println(SET_QCFG);
CONSOLE.println(SET_QCFG);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続先候補としてサーチする通信規格を定義 *****/
BG96.println(SET_QCFG2);
CONSOLE.println(SET_QCFG2);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ① *****/
BG96.println(GET_COPS);
CONSOLE.println(GET_COPS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ② 信号強度 受信強度も同時に取得 *****/
BG96.println(GET_QCSQ);
CONSOLE.println(GET_QCSQ);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ③ アクセステクノロジ情報も同時に取得 *****/
BG96.println(GET_QNWINFO);
CONSOLE.println(GET_QNWINFO);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** D38以外のGroveポートにも給電開始 *****/
Wio.PowerSupplyGrove(true);
CONSOLE.println("### ALL GROVE PORT POWER SUPPLY ON ###");
/***** setup Sensor PIN *****/
TemperatureAndHumidityBegin(SENSOR_PIN);
CONSOLE.println("### SETUP TEMPERATURE ###");
CONSOLE.print("Setup Temperature -> ");
CONSOLE.print(SENSOR_PIN);
CONSOLE.println("C");
CONSOLE.println("");
pinMode(BUTTON_PIN, INPUT);
CONSOLE.print("Setup BUTTON_PIN -> ");
CONSOLE.print(BUTTON_PIN);
pinMode(LED_PIN, OUTPUT);
CONSOLE.print("Setup LED_PIN -> ");
CONSOLE.print(LED_PIN);
digitalWrite(LED_PIN, 0);
//attachInterrupt(BUTTON_PIN, sw_on, RISING); // LOWからHIGHに変わったとき
attachInterrupt(BUTTON_PIN, sw_on, FALLING); // HIGHからLOWに変わったとき
/***** Wio LTE セットアップ完了 *****/
CONSOLE.println("");
CONSOLE.println("##### Wio LTE initialize completed. #####");
CONSOLE.println("############ SETUP FIN ############");
CONSOLE.println("############ GOTO LOOP ############");
CONSOLE.println("");
}
/************ Loop処理 ************/
void loop() {
if (sw_stat == 1){
CONSOLE.println("");
CONSOLE.print("BUTTON ON !!!!!! ");
digitalWrite(LED_PIN, 1);
int status;
char body[384];
char imei[20];
char imsi[20];
char iccid[20];
int rss;
float temp;
float humi;
if (!TemperatureAndHumidityRead(&temp, &humi)) {
CONSOLE.println("ERROR!");
goto err;
}
CONSOLE.print("temperature = ");
CONSOLE.print(temp);
CONSOLE.print("C , ");
CONSOLE.print("Current humidity = ");
CONSOLE.print(humi);
CONSOLE.println("% ");
err:
delay(2000);
Wio.GetIMEI(imei, sizeof(imei));
CONSOLE.print("IMEI:");
CONSOLE.println(imei);
Wio.GetIMSI(imsi, sizeof(imsi));
CONSOLE.print("IMSI:");
CONSOLE.println(imsi);
Wio.GetICCID(iccid, sizeof(iccid));
CONSOLE.print("ICCID:");
CONSOLE.println(iccid);
rss = Wio.GetReceivedSignalStrength();
CONSOLE.print("Get RSSI:");
CONSOLE.println(rss);
CONSOLE.println("");
/***** センサから取得した値をJSON形式に変換 *****/
// sprintf(body,"{\"UPTIME\":%lu, \"IMEI\": %s, \"TEMP\":%g, \"HUMI\":%g, \"RSSI\": %d}",millis()/1000, imei,temp,humi,rss);
sprintf(body,"{\"d\" : { \"ambientTemp\" : %g, \"humidity\": %g } }" ,temp,humi);
/***** データ送信先確認 コンソールへ出力 *****/
CONSOLE.println("### Post to \""ENEBULAR_ENDPOINT"\".###");
CONSOLE.print("--> ");
CONSOLE.print(body);
CONSOLE.println("");
/***** Header情報の付与 *****/
WioCellularHttpHeader header;
header["Content-Type"] = "application/json";
/* JSONのbodyを送信する場合、Content-Typeを "application/json" にする */
/***** データ送信 POST *****/
if (Wio.HttpPost(ENEBULAR_ENDPOINT, body, &status, header)) {
CONSOLE.print("<-- ");
CONSOLE.print("enebular ResponseCode:");
CONSOLE.println(status);
}
else {
CONSOLE.print("### Failed to Post. (");
CONSOLE.print(status);
CONSOLE.println(")###");
}
/***** 次回実行までのwait *****/
CONSOLE.print("### Wait for ");
CONSOLE.print(INTERVAL);
CONSOLE.println(" msecs.###");
CONSOLE.println("");
delay(INTERVAL);
sw_stat = 0;
}
else{
digitalWrite(LED_PIN, 0);
CONSOLE.print("w");
delay(400);
digitalWrite(LED_PIN, 1);
delay(100);
}
}
/**********************************************************
WioCellLibForArduino LIB
************************************************************/
void sw_on(){
sw_stat = 1;
CONSOLE.print("Interrupt_stat = ");
CONSOLE.println(sw_stat);
}
/**********************************************************
WioCellLibForArduino
-> Grove
-> grove-temperature-and-humidity-sensor からの引用
************************************************************/
int TemperatureAndHumidityPin;
void TemperatureAndHumidityBegin(int pin){
TemperatureAndHumidityPin = pin;
DHT11Init(TemperatureAndHumidityPin);
}
bool TemperatureAndHumidityRead(float* temperature, float* humidity){
byte data[5];
DHT11Start(TemperatureAndHumidityPin);
for (int i = 0; i < 5; i++) data[i] = DHT11ReadByte(TemperatureAndHumidityPin);
DHT11Finish(TemperatureAndHumidityPin);
if(!DHT11Check(data, sizeof (data))) return false;
if (data[1] >= 10) return false;
if (data[3] >= 10) return false;
*humidity = (float)data[0] + (float)data[1] / 10.0f;
*temperature = (float)data[2] + (float)data[3] / 10.0f;
return true;
}
void DHT11Init(int pin){
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
void DHT11Start(int pin){
// Host the start of signal
digitalWrite(pin, LOW);
delay(18);
// Pulled up to wait for
pinMode(pin, INPUT);
while (!digitalRead(pin)) ;
// Response signal
while (digitalRead(pin)) ;
// Pulled ready to output
while (!digitalRead(pin)) ;
}
byte DHT11ReadByte(int pin){
byte data = 0;
for (int i = 0; i < 8; i++) {
while (digitalRead(pin)) ;
while (!digitalRead(pin)) ;
unsigned long start = micros();
while (digitalRead(pin)) ;
unsigned long finish = micros();
if ((unsigned long)(finish - start) > 50) data |= 1 << (7 - i);
}
return data;
}
void DHT11Finish(int pin){
// Releases the bus
while (!digitalRead(pin)) ;
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
bool DHT11Check(const byte* data, int dataSize){
if (dataSize != 5) return false;
byte sum = 0;
for (int i = 0; i < dataSize - 1; i++) {
sum += data[i];
}
return data[dataSize - 1] == sum;
}
/***** NW接続用関数 *****/
void getKey(char a_key[8],char u_key[4],char p_key[4]){
char org_char[] = "TjEyR3Q1ZGVyY0phcy5tem5PZmdwMjQ=";
rbase64.decode(org_char);
int slen1 = strlen(rbase64.result());
char str1[slen1];
strcpy(str1, rbase64.result());
char org_int[] = "MTQsNCw5LDEzLDE5LDcsMTY=";
rbase64.decode(org_int);
int slen2 = strlen(rbase64.result());
char str2[slen2];
strcpy(str2, rbase64.result());
char *sint;
for (int i=0;i<8;i++){
if (i==0){
sint = strtok(str2,",");
a_key[i] = str1[atoi(sint)];
} else {
sint = strtok(NULL,",");
a_key[i] = str1[atoi(sint)];
if (i==2){
strcpy(u_key,a_key);
strcpy(p_key,a_key);
u_key[i+1] = '\0';
p_key[i+1] = '\0';
} else if (i==7){
a_key[i] = '\0';
}
}
}
}
/***** NW接続用関数ここまで *****/
#49.50 16 x 2 LCD(Black on Yellow/ White on Blue)
#51 4-Digit Display
MoistureSensor
/****************************************************
52 Sample code For Touch Trigger
BG96,Moisture Sensor
to enebular HTTP POST
Mode M1 2019.9.27 by S.MATSUOKA
Update---------------->2019.12.25 by S.NISHIMURA
NiigataSample V.02
*****************************************************/
#include <WioCellLibforArduino.h>
#include <stdio.h>
#include <rBase64.h>
#include <string.h>
#include <stdlib.h>
#define ARDUINO_WIO_LTE_M1NB1_BG96
#define BAUDRATE 115200
#define CONSOLE SerialUSB
#define BG96 SerialModule
#define INTERVAL (60000) /*** Push interval(mSec) ***/
/***** enebular info *****/
#define ENEBULAR_NODE_PATH "https://ev2-prod-node-red-9efa8d82-c82.herokuapp.com" // URL末尾に"/"をつけない
#define ENABULAR_POST_URL "/debug"
#define ENEBULAR_ENDPOINT ENEBULAR_NODE_PATH""ENABULAR_POST_URL
/****** Sensor PIN *****/
#define SENSOR_PIN (WIO_D38)
#define BUTTON_PIN (WIO_D20)
#define SENSOR_PINA4 (WIO_A4)
//#define SENSOR_PIN (WIO_I2C_D24) /* I2C use D-PORT24 */
/*** ##### D38以外はデフォルト=Disable(給電off) */
#define SET_CEDRXS "at+cedrxs=0" /* set eDrx disable =0 */
#define GET_CEDRXS "at+cedrxs?" /* get eDrx status */
#define SET_QCFG "at+qcfg=\"nwscanseq\",020301" /* set <- M1 (02=M1 03=NB 01=3G-GSM)*/
#define SET_QCFG2 "at+qcfg=\"iotopmode\",2" /* set 0=M1 1=NB1 2=M1 & NB1 */
#define GET_COPS "at+cops?" /* get cops info 1 2 44020 8 */
#define GET_QCSQ "at+qcsq" /* get qcsq info CAT-M1 -40 -64 216 -7 */
#define GET_QNWINFO "at+qnwinfo" /* get qnwinfo info CAT-M1 44020 LTE BAND 1 475 */
/*** Wio LTE 制御クラス *** Wio LTE 本体の処理を呼び出すための変数を定義 */
WioCellular Wio;
volatile int sensorValue = 0;
/***** Setup処理 ***** */
void setup() {
delay(1000);
CONSOLE.begin(BAUDRATE);
CONSOLE.println("");
CONSOLE.println("############ SETUP ############");
CONSOLE.println("");
/***** Wio LTE 全体を初期化 *****/
Wio.Init();
CONSOLE.println("### Start Wio LTE initialization ###");
/***** LTE通信モジュールの電源供給を開始 *****/
Wio.PowerSupplyCellular(true);
CONSOLE.println("### Power supply ON ###");
delay(500); /* モジュール安定までWAIT */
/***** LTE通信モジュールを起動(起動済みの場合はリセット) *****/
if (!Wio.TurnOnOrReset()) {
CONSOLE.println("### Turn on or reset ERROR! ###");
return;
}else{
CONSOLE.println("### Turn on or reset Succeeded ###");
}
delay(500); // モジュール安定までWAIT
/***** Mobile Network接続(SB) ***** MANUALでPLMNを直接記述 PLMN=44020 (MCC=400,MNC=20) */
Wio.SetSelectNetwork(WioCellular::SELECT_NETWORK_MODE_MANUAL, "44020");
CONSOLE.println("### SELECT_NETWORK_MODE_MANUAL 44020 ###");
/***** プロバイダ(SB) set *****/
char a_key[8]={};
char u_key[4]={};
char p_key[4]={};
getKey(a_key,u_key,p_key);
if (!Wio.Activate(a_key, u_key, p_key)) {
CONSOLE.println("### NW Connect ERROR! ###");
return;
}else{
CONSOLE.println("### Connecting to NW. Succeeded ###");
}
/***** LTE M1を明示的に指定 *****/
Wio.SetAccessTechnology(WioCellular::ACCESS_TECHNOLOGY_LTE_M1);
CONSOLE.println("### ACCESS_TECHNOLOGY_LTE_M1 ###");
/***** AT Command 実行 *****/
CONSOLE.println("### ISSUE AT COMMAND ###");
/***** e-DRX disable SET (Defalt = OFF) *****/
BG96.println(SET_CEDRXS);
CONSOLE.println(SET_CEDRXS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(500); /* "0" Disable the use of e-I-DRX , "1" Enable the use of e-I-DRX */
/***** e-DRX CHECK *****/
BG96.println(GET_CEDRXS);
CONSOLE.println(GET_CEDRXS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続する通信規格の優先度を変更 *****/
BG96.println(SET_QCFG);
CONSOLE.println(SET_QCFG);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続先候補としてサーチする通信規格を定義 *****/
BG96.println(SET_QCFG2);
CONSOLE.println(SET_QCFG2);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ① *****/
BG96.println(GET_COPS);
CONSOLE.println(GET_COPS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ② 信号強度 受信強度も同時に取得 *****/
BG96.println(GET_QCSQ);
CONSOLE.println(GET_QCSQ);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ③ アクセステクノロジ情報も同時に取得 *****/
BG96.println(GET_QNWINFO);
CONSOLE.println(GET_QNWINFO);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** D38以外のGroveポートにも給電開始 *****/
Wio.PowerSupplyGrove(true);
CONSOLE.println("### ALL GROVE PORT POWER SUPPLY ON ###");
/***** setup Sensor PIN *****/
pinMode(SENSOR_PINA4, INPUT_ANALOG);
CONSOLE.print("Setup Analog_SENSOR_PIN -> ");
CONSOLE.print(SENSOR_PINA4);
/***** Wio LTE セットアップ完了 *****/
CONSOLE.println("");
CONSOLE.println("##### Wio LTE initialize completed. #####");
CONSOLE.println("############ SETUP FIN ############");
CONSOLE.println("############ GOTO LOOP ############");
CONSOLE.println("");
}
/************ Loop処理 ************/
void loop() {
int status;
char body[384];
char imei[20];
char imsi[20];
char iccid[20];
int rss;
char moisture_char[16];
sensorValue = analogRead(SENSOR_PINA4);
CONSOLE.print("Value = " );
CONSOLE.println(sensorValue);
err:
delay(2000);
Wio.GetIMEI(imei, sizeof(imei));
CONSOLE.print("IMEI:");
CONSOLE.println(imei);
Wio.GetIMSI(imsi, sizeof(imsi));
CONSOLE.print("IMSI:");
CONSOLE.println(imsi);
Wio.GetICCID(iccid, sizeof(iccid));
CONSOLE.print("ICCID:");
CONSOLE.println(iccid);
rss = Wio.GetReceivedSignalStrength();
CONSOLE.print("Get RSSI:");
CONSOLE.println(rss);
CONSOLE.println("");
/***** センサから取得した値をJSON形式に変換 *****/
sprintf(body,"{\"d\" : { \"Value01\" : %d, \"rssi\": %d } }" ,sensorValue,rss);
/***** データ送信先確認 コンソールへ出力 *****/
CONSOLE.println("### Post to \""ENEBULAR_ENDPOINT"\".###");
CONSOLE.print("--> ");
CONSOLE.print(body);
CONSOLE.println("");
/***** Header情報の付与 *****/
WioCellularHttpHeader header;
header["Content-Type"] = "application/json";
/* JSONのbodyを送信する場合、Content-Typeを "application/json" にする */
/***** データ送信 POST *****/
if (Wio.HttpPost(ENEBULAR_ENDPOINT, body, &status, header)) {
CONSOLE.print("<-- ");
CONSOLE.print("enebular ResponseCode:");
CONSOLE.println(status);
}
else {
CONSOLE.print("### Failed to Post. (");
CONSOLE.print(status);
CONSOLE.println(")###");
}
/***** 次回実行までのwait *****/
CONSOLE.print("### Wait for ");
CONSOLE.print(INTERVAL);
CONSOLE.println(" msecs.###");
CONSOLE.println("");
delay(INTERVAL);
}
/***** NW接続用関数 *****/
void getKey(char a_key[8],char u_key[4],char p_key[4]){
char org_char[] = "TjEyR3Q1ZGVyY0phcy5tem5PZmdwMjQ=";
rbase64.decode(org_char);
int slen1 = strlen(rbase64.result());
char str1[slen1];
strcpy(str1, rbase64.result());
char org_int[] = "MTQsNCw5LDEzLDE5LDcsMTY=";
rbase64.decode(org_int);
int slen2 = strlen(rbase64.result());
char str2[slen2];
strcpy(str2, rbase64.result());
char *sint;
for (int i=0;i<8;i++){
if (i==0){
sint = strtok(str2,",");
a_key[i] = str1[atoi(sint)];
} else {
sint = strtok(NULL,",");
a_key[i] = str1[atoi(sint)];
if (i==2){
strcpy(u_key,a_key);
strcpy(p_key,a_key);
u_key[i+1] = '\0';
p_key[i+1] = '\0';
} else if (i==7){
a_key[i] = '\0';
}
}
}
}
/***** NW接続用関数ここまで *****/
Vibration_Motor
#include <WioCellLibforArduino.h>
#include <stdio.h>
#include <rBase64.h>
#include <string.h>
#include <stdlib.h>
#define ARDUINO_WIO_LTE_M1NB1_BG96
#define BAUDRATE 115200
#define CONSOLE SerialUSB
#define BG96 SerialModule
#define INTERVAL (1000) /*** Push interval(mSec) ***/
/***** enebular info *****/
#define ENEBULAR_NODE_PATH "https://ev2-prod-node-red-37dee588-a74.herokuapp.com" // URL末尾に"/"をつけない
#define ENABULAR_POST_URL "/debug"
#define ENEBULAR_ENDPOINT ENEBULAR_NODE_PATH""ENABULAR_POST_URL
/****** Sensor PIN *****/
#define MOTOR_PIN (WIO_D38)
#define BUTTON_PIN (WIO_D19)
#define LED_PIN (WIO_D20)
//#define SENSOR_PIN (WIO_I2C_D24) /* I2C use D-PORT24 */
/*** ##### D38以外はデフォルト=Disable(給電off) */
#define SET_CEDRXS "at+cedrxs=0" /* set eDrx disable =0 */
#define GET_CEDRXS "at+cedrxs?" /* get eDrx status */
#define SET_QCFG "at+qcfg=\"nwscanseq\",020301" /* set <- M1 (02=M1 03=NB 01=3G-GSM)*/
#define SET_QCFG2 "at+qcfg=\"iotopmode\",2" /* set 0=M1 1=NB1 2=M1 & NB1 */
#define GET_COPS "at+cops?" /* get cops info 1 2 44020 8 */
#define GET_QCSQ "at+qcsq" /* get qcsq info CAT-M1 -40 -64 216 -7 */
#define GET_QNWINFO "at+qnwinfo" /* get qnwinfo info CAT-M1 44020 LTE BAND 1 475 */
/*** Wio LTE 制御クラス *** Wio LTE 本体の処理を呼び出すための変数を定義 */
WioCellular Wio;
int sw_stat=0;
/***** Setup処理 ***** */
void setup() {
delay(1000);
CONSOLE.begin(BAUDRATE);
CONSOLE.println("");
CONSOLE.println("############ SETUP ############");
CONSOLE.println("");
/***** Wio LTE 全体を初期化 *****/
Wio.Init();
CONSOLE.println("### Start Wio LTE initialization ###");
/***** LTE通信モジュールの電源供給を開始 *****/
Wio.PowerSupplyCellular(true);
CONSOLE.println("### Power supply ON ###");
delay(500); /* モジュール安定までWAIT */
/***** LTE通信モジュールを起動(起動済みの場合はリセット) *****/
if (!Wio.TurnOnOrReset()) {
CONSOLE.println("### Turn on or reset ERROR! ###");
return;
}else{
CONSOLE.println("### Turn on or reset Succeeded ###");
}
delay(500); // モジュール安定までWAIT
/***** D38以外のGroveポートにも給電開始 *****/
Wio.PowerSupplyGrove(true);
CONSOLE.println("### ALL GROVE PORT POWER SUPPLY ON ###");
pinMode( MOTOR_PIN, OUTPUT );
CONSOLE.print("Setup VibrationMotor -> ");
CONSOLE.print(MOTOR_PIN);
/***** Wio LTE セットアップ完了 *****/
CONSOLE.println("");
CONSOLE.println("##### Wio LTE initialize completed. #####");
CONSOLE.println("############ SETUP FIN ############");
CONSOLE.println("############ GOTO LOOP ############");
CONSOLE.println("");
}
/************ Loop処理 ************/
void loop() {
digitalWrite(MOTOR_PIN, HIGH);
CONSOLE.println("Vibration Moter ON");
delay(1000);
digitalWrite(MOTOR_PIN, LOW);
CONSOLE.println("Vibration Moter OFF");
delay(1000);
}
#54 Air Quality Sencer#
WioLTEの出力では電圧不足
#55 Digital Light Sensor
Digital_Light_Sensor
#include <WioCellLibforArduino.h>
#include <stdio.h>
#include <rBase64.h>
#include <string.h>
#include <stdlib.h>
// BOARD Seeed Wio 3G
// GROVE I2C <-> Grove - Digital Light Sensor (SKU#101020030)
#include <MjGrove.h>
#define INTERVAL (2000)
#define ARDUINO_WIO_LTE_M1NB1_BG96
#define BAUDRATE 115200
#define CONSOLE SerialUSB
#define BG96 SerialModule
/***** enebular info *****/
#define ENEBULAR_NODE_PATH "https://ev2-prod-node-red-37dee588-a74.herokuapp.com" // URL末尾に"/"をつけない
#define ENABULAR_POST_URL "/debug"
#define ENEBULAR_ENDPOINT ENEBULAR_NODE_PATH""ENABULAR_POST_URL
/****** Sensor PIN *****/
#define MOTOR_PIN (WIO_D38)
#define BUTTON_PIN (WIO_D19)
#define LED_PIN (WIO_D20)
//#define SENSOR_PIN (WIO_I2C_D24) /* I2C use D-PORT24 */
/*** ##### D38以外はデフォルト=Disable(給電off) */
#define SET_CEDRXS "at+cedrxs=0" /* set eDrx disable =0 */
#define GET_CEDRXS "at+cedrxs?" /* get eDrx status */
#define SET_QCFG "at+qcfg=\"nwscanseq\",020301" /* set <- M1 (02=M1 03=NB 01=3G-GSM)*/
#define SET_QCFG2 "at+qcfg=\"iotopmode\",2" /* set 0=M1 1=NB1 2=M1 & NB1 */
#define GET_COPS "at+cops?" /* get cops info 1 2 44020 8 */
#define GET_QCSQ "at+qcsq" /* get qcsq info CAT-M1 -40 -64 216 -7 */
#define GET_QNWINFO "at+qnwinfo" /* get qnwinfo info CAT-M1 44020 LTE BAND 1 475 */
/*** Wio LTE 制御クラス *** Wio LTE 本体の処理を呼び出すための変数を定義 */
WioCellular Wio;
int sw_stat=0;
GroveBoard Board;
GroveDigitalLight Light(&Board.I2C);
void setup() {
delay(1000);
CONSOLE.begin(BAUDRATE);
CONSOLE.println("");
CONSOLE.println("############ SETUP ############");
CONSOLE.println("");
/***** Wio LTE 全体を初期化 *****/
Wio.Init();
CONSOLE.println("### Start Wio LTE initialization ###");
/***** LTE通信モジュールの電源供給を開始 *****/
Wio.PowerSupplyCellular(true);
CONSOLE.println("### Power supply ON ###");
delay(500); /* モジュール安定までWAIT */
/***** LTE通信モジュールを起動(起動済みの場合はリセット) *****/
if (!Wio.TurnOnOrReset()) {
CONSOLE.println("### Turn on or reset ERROR! ###");
return;
}else{
CONSOLE.println("### Turn on or reset Succeeded ###");
}
delay(500); // モジュール安定までWAIT
/***** D38以外のGroveポートにも給電開始 *****/
Wio.PowerSupplyGrove(true);
CONSOLE.println("### ALL GROVE PORT POWER SUPPLY ON ###");
pinMode( MOTOR_PIN, OUTPUT );
CONSOLE.print("Setup VibrationMotor -> ");
CONSOLE.print(MOTOR_PIN);
/***** Wio LTE セットアップ完了 *****/
CONSOLE.println("");
CONSOLE.println("##### Wio LTE initialize completed. #####");
CONSOLE.println("############ SETUP FIN ############");
CONSOLE.println("############ GOTO LOOP ############");
CONSOLE.println("");
Board.I2C.Enable();
Light.Init();
}
void loop() {
Light.Read();
SerialUSB.print("Current lux = ");
SerialUSB.println(Light.Lux);
delay(INTERVAL);
}
#56 3-Axis Digital Gyro
ボード非対応
#57 Digital Distance Interrupter 0.5 to 5cm
Digital_Distance_Interrupter
/****************************************************
57 Sample code For IR Trigger
BG96,IMEI,RSSI,temp,humi
to enebular HTTP POST
Mode M1 2019.9.27 by S.MATSUOKA
Update---------------->2019.12.25 by S.NISHIMURA
NiigataSample V.02
*****************************************************/
#include <WioCellLibforArduino.h>
#include <stdio.h>
#include <rBase64.h>
#include <string.h>
#include <stdlib.h>
#define ARDUINO_WIO_LTE_M1NB1_BG96
#define BAUDRATE 115200
#define CONSOLE SerialUSB
#define BG96 SerialModule
#define INTERVAL (1000) /*** Push interval(mSec) ***/
/***** enebular info *****/
#define ENEBULAR_NODE_PATH "https://ev2-prod-node-red-9efa8d82-c82.herokuapp.com" // URL末尾に"/"をつけない
#define ENABULAR_POST_URL "/debug"
#define ENEBULAR_ENDPOINT ENEBULAR_NODE_PATH""ENABULAR_POST_URL
/****** Sensor PIN *****/
#define SENSOR_PIN (WIO_D38)
#define IR_PIN (WIO_D20)
//#define SENSOR_PIN (WIO_I2C_D24) /* I2C use D-PORT24 */
/*** ##### D38以外はデフォルトでDisable(給電off) */
#define SET_CEDRXS "at+cedrxs=0" /* set eDrx disable */
#define GET_CEDRXS "at+cedrxs?" /* get eDrx status */
#define SET_QCFG "at+qcfg=\"nwscanseq\",020301" /* set <- M1 (02=M1 03=NB 01=3G-GSM)*/
#define SET_QCFG2 "at+qcfg=\"iotopmode\",2" /* set 0=M1 1=NB1 2=M1 & NB1 */
#define GET_COPS "at+cops?" /* get cops info 1 2 44020 8 */
#define GET_QCSQ "at+qcsq" /* get qcsq info CAT-M1 -40 -64 216 -7 */
#define GET_QNWINFO "at+qnwinfo" /* get qnwinfo info CAT-M1 44020 LTE BAND 1 475 */
/*** Wio LTE 制御クラス *** Wio LTE 本体の処理を呼び出すための変数を定義 */
WioCellular Wio;
/***** Setup処理 ***** */
void setup() {
delay(1000);
CONSOLE.begin(BAUDRATE);
CONSOLE.println("");
CONSOLE.println("############ SETUP ############");
CONSOLE.println("");
/***** Wio LTE 全体を初期化 *****/
Wio.Init();
CONSOLE.println("### Start Wio LTE initialization ###");
/***** LTE通信モジュールの電源供給を開始 *****/
Wio.PowerSupplyCellular(true);
CONSOLE.println("### Power supply ON ###");
delay(500); /* モジュール安定までWAIT */
/***** LTE通信モジュールを起動(起動済みの場合はリセット) *****/
if (!Wio.TurnOnOrReset()) {
CONSOLE.println("### Turn on or reset ERROR! ###");
return;
}else{
CONSOLE.println("### Turn on or reset Succeeded ###");
}
delay(500); // モジュール安定までWAIT
/***** Mobile Network接続(SB) ***** MANUALでPLMNを直接記述 PLMN=44020 (MCC=400,MNC=20) */
Wio.SetSelectNetwork(WioCellular::SELECT_NETWORK_MODE_MANUAL, "44020");
CONSOLE.println("### SELECT_NETWORK_MODE_MANUAL 44020 ###");
/***** プロバイダ(SB) set *****/
char a_key[8]={};
char u_key[4]={};
char p_key[4]={};
getKey(a_key,u_key,p_key);
if (!Wio.Activate(a_key, u_key, p_key)) {
CONSOLE.println("### NW Connect ERROR! ###");
return;
}else{
CONSOLE.println("### Connecting to NW. Succeeded ###");
}
/***** LTE M1を明示的に指定 *****/
Wio.SetAccessTechnology(WioCellular::ACCESS_TECHNOLOGY_LTE_M1);
CONSOLE.println("### ACCESS_TECHNOLOGY_LTE_M1 ###");
/***** AT Command 実行 *****/
CONSOLE.println("### ISSUE AT COMMAND ###");
/***** e-DRX disable SET (Defalt = OFF) *****/
BG96.println(SET_CEDRXS);
CONSOLE.println(SET_CEDRXS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(500); /* "0" Disable the use of e-I-DRX , "1" Enable the use of e-I-DRX */
/***** e-DRX CHECK *****/
BG96.println(GET_CEDRXS);
CONSOLE.println(GET_CEDRXS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続する通信規格の優先度を変更 *****/
BG96.println(SET_QCFG);
CONSOLE.println(SET_QCFG);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続先候補としてサーチする通信規格を定義 *****/
BG96.println(SET_QCFG2);
CONSOLE.println(SET_QCFG2);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ① *****/
BG96.println(GET_COPS);
CONSOLE.println(GET_COPS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ② 信号強度 受信強度も同時に取得 *****/
BG96.println(GET_QCSQ);
CONSOLE.println(GET_QCSQ);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ③ アクセステクノロジ情報も同時に取得 *****/
BG96.println(GET_QNWINFO);
CONSOLE.println(GET_QNWINFO);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** D38以外のGroveポートにも給電開始 *****/
Wio.PowerSupplyGrove(true);
CONSOLE.println("### ALL GROVE PORT POWER SUPPLY ON ###");
/***** setup Sensor PIN *****/
TemperatureAndHumidityBegin(SENSOR_PIN);
CONSOLE.println("### SETUP TEMPERATURE ###");
CONSOLE.print("Setup Temperature -> ");
CONSOLE.print(SENSOR_PIN);
CONSOLE.println("C");
CONSOLE.println("");
pinMode(IR_PIN, INPUT);
CONSOLE.print("Setup IR_PIN -> ");
CONSOLE.print(IR_PIN);
/***** Wio LTE セットアップ完了 *****/
CONSOLE.println("");
CONSOLE.println("##### Wio LTE initialize completed. #####");
CONSOLE.println("############ SETUP FIN ############");
CONSOLE.println("############ GOTO LOOP ############");
CONSOLE.println("");
}
/************ Loop処理 ************/
void loop() {
int ir_State = digitalRead(IR_PIN);
delay(100);
if (ir_State == 0){
CONSOLE.println("");
CONSOLE.print("IR ON !!!!!! ");
int status;
char body[384];
char imei[20];
char imsi[20];
char iccid[20];
int rss;
float temp;
float humi;
if (!TemperatureAndHumidityRead(&temp, &humi)) {
CONSOLE.println("ERROR!");
goto err;
}
CONSOLE.print("temperature = ");
CONSOLE.print(temp);
CONSOLE.print(" C , ");
CONSOLE.print("humidity = ");
CONSOLE.print(humi);
CONSOLE.println(" % ");
err:
delay(2000);
Wio.GetIMEI(imei, sizeof(imei));
CONSOLE.print("IMEI:");
CONSOLE.println(imei);
Wio.GetIMSI(imsi, sizeof(imsi));
CONSOLE.print("IMSI:");
CONSOLE.println(imsi);
Wio.GetICCID(iccid, sizeof(iccid));
CONSOLE.print("ICCID:");
CONSOLE.println(iccid);
rss = Wio.GetReceivedSignalStrength();
CONSOLE.print("Get RSSI:");
CONSOLE.println(rss);
CONSOLE.println("");
/***** センサから取得した値をJSON形式に変換 *****/
// sprintf(body,"{\"UPTIME\":%lu, \"IMEI\": %s, \"TEMP\":%g, \"HUMI\":%g, \"RSSI\": %d}",millis()/1000, imei,temp,humi,rss);
sprintf(body,"{\"d\" : { \"ambientTemp\" : %g, \"humidity\": %g } }" ,temp,humi);
/***** データ送信先確認 コンソールへ出力 *****/
CONSOLE.println("### Post to \""ENEBULAR_ENDPOINT"\".###");
CONSOLE.print("--> ");
CONSOLE.print(body);
CONSOLE.println("");
/***** Header情報の付与 *****/
WioCellularHttpHeader header;
header["Content-Type"] = "application/json";
/* JSONのbodyを送信する場合、Content-Typeを "application/json" にする */
/***** データ送信 POST *****/
if (Wio.HttpPost(ENEBULAR_ENDPOINT, body, &status, header)) {
CONSOLE.print("<-- ");
CONSOLE.print("enebular ResponseCode:");
CONSOLE.println(status);
}
else {
CONSOLE.print("### Failed to Post. (");
CONSOLE.print(status);
CONSOLE.println(")###");
}
/***** 次回実行までのwait *****/
CONSOLE.print("### Wait for ");
CONSOLE.print(INTERVAL);
CONSOLE.println(" msecs.###");
CONSOLE.println("");
delay(INTERVAL);
}
else{
CONSOLE.print("w");
delay(300);
}
}
/**********************************************************
WioCellLibForArduino
-> Grove
-> grove-temperature-and-humidity-sensor からの引用
************************************************************/
int TemperatureAndHumidityPin;
void TemperatureAndHumidityBegin(int pin){
TemperatureAndHumidityPin = pin;
DHT11Init(TemperatureAndHumidityPin);
}
bool TemperatureAndHumidityRead(float* temperature, float* humidity){
byte data[5];
DHT11Start(TemperatureAndHumidityPin);
for (int i = 0; i < 5; i++) data[i] = DHT11ReadByte(TemperatureAndHumidityPin);
DHT11Finish(TemperatureAndHumidityPin);
if(!DHT11Check(data, sizeof (data))) return false;
if (data[1] >= 10) return false;
if (data[3] >= 10) return false;
*humidity = (float)data[0] + (float)data[1] / 10.0f;
*temperature = (float)data[2] + (float)data[3] / 10.0f;
return true;
}
void DHT11Init(int pin){
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
void DHT11Start(int pin){
// Host the start of signal
digitalWrite(pin, LOW);
delay(18);
// Pulled up to wait for
pinMode(pin, INPUT);
while (!digitalRead(pin)) ;
// Response signal
while (digitalRead(pin)) ;
// Pulled ready to output
while (!digitalRead(pin)) ;
}
byte DHT11ReadByte(int pin){
byte data = 0;
for (int i = 0; i < 8; i++) {
while (digitalRead(pin)) ;
while (!digitalRead(pin)) ;
unsigned long start = micros();
while (digitalRead(pin)) ;
unsigned long finish = micros();
if ((unsigned long)(finish - start) > 50) data |= 1 << (7 - i);
}
return data;
}
void DHT11Finish(int pin){
// Releases the bus
while (!digitalRead(pin)) ;
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
bool DHT11Check(const byte* data, int dataSize){
if (dataSize != 5) return false;
byte sum = 0;
for (int i = 0; i < dataSize - 1; i++) {
sum += data[i];
}
return data[dataSize - 1] == sum;
}
/***** NW接続用関数 *****/
void getKey(char a_key[8],char u_key[4],char p_key[4]){
char org_char[] = "TjEyR3Q1ZGVyY0phcy5tem5PZmdwMjQ=";
rbase64.decode(org_char);
int slen1 = strlen(rbase64.result());
char str1[slen1];
strcpy(str1, rbase64.result());
char org_int[] = "MTQsNCw5LDEzLDE5LDcsMTY=";
rbase64.decode(org_int);
int slen2 = strlen(rbase64.result());
char str2[slen2];
strcpy(str2, rbase64.result());
char *sint;
for (int i=0;i<8;i++){
if (i==0){
sint = strtok(str2,",");
a_key[i] = str1[atoi(sint)];
} else {
sint = strtok(NULL,",");
a_key[i] = str1[atoi(sint)];
if (i==2){
strcpy(u_key,a_key);
strcpy(p_key,a_key);
u_key[i+1] = '\0';
p_key[i+1] = '\0';
} else if (i==7){
a_key[i] = '\0';
}
}
}
}
/***** NW接続用関数ここまで *****/
#58 Touch Sensor
Touch_Sensor
/****************************************************
47 Sample code For Touch Trigger
BG96,IMEI,RSSI,temp,humi
to enebular HTTP POST
Mode M1 2019.9.27 by S.MATSUOKA
Update---------------->2019.12.25 by S.NISHIMURA
NiigataSample V.02
*****************************************************/
#include <WioCellLibforArduino.h>
#include <stdio.h>
#include <rBase64.h>
#include <string.h>
#include <stdlib.h>
#define ARDUINO_WIO_LTE_M1NB1_BG96
#define BAUDRATE 115200
#define CONSOLE SerialUSB
#define BG96 SerialModule
#define INTERVAL (1000) /*** Push interval(mSec) ***/
/***** enebular info *****/
#define ENEBULAR_NODE_PATH "https://ev2-prod-node-red-9efa8d82-c82.herokuapp.com" // URL末尾に"/"をつけない
#define ENABULAR_POST_URL "/debug"
#define ENEBULAR_ENDPOINT ENEBULAR_NODE_PATH""ENABULAR_POST_URL
/****** Sensor PIN *****/
#define SENSOR_PIN (WIO_D38)
#define BUTTON_PIN (WIO_D20)
//#define SENSOR_PIN (WIO_I2C_D24) /* I2C use D-PORT24 */
/*** ##### D38以外はデフォルト=Disable(給電off) */
#define SET_CEDRXS "at+cedrxs=0" /* set eDrx disable =0 */
#define GET_CEDRXS "at+cedrxs?" /* get eDrx status */
#define SET_QCFG "at+qcfg=\"nwscanseq\",020301" /* set <- M1 (02=M1 03=NB 01=3G-GSM)*/
#define SET_QCFG2 "at+qcfg=\"iotopmode\",2" /* set 0=M1 1=NB1 2=M1 & NB1 */
#define GET_COPS "at+cops?" /* get cops info 1 2 44020 8 */
#define GET_QCSQ "at+qcsq" /* get qcsq info CAT-M1 -40 -64 216 -7 */
#define GET_QNWINFO "at+qnwinfo" /* get qnwinfo info CAT-M1 44020 LTE BAND 1 475 */
/*** Wio LTE 制御クラス *** Wio LTE 本体の処理を呼び出すための変数を定義 */
WioCellular Wio;
/***** Setup処理 ***** */
void setup() {
delay(1000);
CONSOLE.begin(BAUDRATE);
CONSOLE.println("");
CONSOLE.println("############ SETUP ############");
CONSOLE.println("");
/***** Wio LTE 全体を初期化 *****/
Wio.Init();
CONSOLE.println("### Start Wio LTE initialization ###");
/***** LTE通信モジュールの電源供給を開始 *****/
Wio.PowerSupplyCellular(true);
CONSOLE.println("### Power supply ON ###");
delay(500); /* モジュール安定までWAIT */
/***** LTE通信モジュールを起動(起動済みの場合はリセット) *****/
if (!Wio.TurnOnOrReset()) {
CONSOLE.println("### Turn on or reset ERROR! ###");
return;
}else{
CONSOLE.println("### Turn on or reset Succeeded ###");
}
delay(500); // モジュール安定までWAIT
/***** Mobile Network接続(SB) ***** MANUALでPLMNを直接記述 PLMN=44020 (MCC=400,MNC=20) */
Wio.SetSelectNetwork(WioCellular::SELECT_NETWORK_MODE_MANUAL, "44020");
CONSOLE.println("### SELECT_NETWORK_MODE_MANUAL 44020 ###");
/***** プロバイダ(SB) set *****/
char a_key[8]={};
char u_key[4]={};
char p_key[4]={};
getKey(a_key,u_key,p_key);
if (!Wio.Activate(a_key, u_key, p_key)) {
CONSOLE.println("### NW Connect ERROR! ###");
return;
}else{
CONSOLE.println("### Connecting to NW. Succeeded ###");
}
/***** LTE M1を明示的に指定 *****/
Wio.SetAccessTechnology(WioCellular::ACCESS_TECHNOLOGY_LTE_M1);
CONSOLE.println("### ACCESS_TECHNOLOGY_LTE_M1 ###");
/***** AT Command 実行 *****/
CONSOLE.println("### ISSUE AT COMMAND ###");
/***** e-DRX disable SET (Defalt = OFF) *****/
BG96.println(SET_CEDRXS);
CONSOLE.println(SET_CEDRXS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(500); /* "0" Disable the use of e-I-DRX , "1" Enable the use of e-I-DRX */
/***** e-DRX CHECK *****/
BG96.println(GET_CEDRXS);
CONSOLE.println(GET_CEDRXS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続する通信規格の優先度を変更 *****/
BG96.println(SET_QCFG);
CONSOLE.println(SET_QCFG);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続先候補としてサーチする通信規格を定義 *****/
BG96.println(SET_QCFG2);
CONSOLE.println(SET_QCFG2);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ① *****/
BG96.println(GET_COPS);
CONSOLE.println(GET_COPS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ② 信号強度 受信強度も同時に取得 *****/
BG96.println(GET_QCSQ);
CONSOLE.println(GET_QCSQ);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ③ アクセステクノロジ情報も同時に取得 *****/
BG96.println(GET_QNWINFO);
CONSOLE.println(GET_QNWINFO);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** D38以外のGroveポートにも給電開始 *****/
Wio.PowerSupplyGrove(true);
CONSOLE.println("### ALL GROVE PORT POWER SUPPLY ON ###");
/***** setup Sensor PIN *****/
TemperatureAndHumidityBegin(SENSOR_PIN);
CONSOLE.println("### SETUP TEMPERATURE ###");
CONSOLE.print("Setup Temperature -> ");
CONSOLE.print(SENSOR_PIN);
CONSOLE.println("C");
CONSOLE.println("");
pinMode(BUTTON_PIN, INPUT);
CONSOLE.print("Setup BUTTON_PIN -> ");
CONSOLE.print(BUTTON_PIN);
/***** Wio LTE セットアップ完了 *****/
CONSOLE.println("");
CONSOLE.println("##### Wio LTE initialize completed. #####");
CONSOLE.println("############ SETUP FIN ############");
CONSOLE.println("############ GOTO LOOP ############");
CONSOLE.println("");
}
/************ Loop処理 ************/
void loop() {
int buttonState = digitalRead(BUTTON_PIN);
delay(100);
if (buttonState == 1){
CONSOLE.println("");
CONSOLE.print("BUTTON ON !!!!!! ");
int status;
char body[384];
char imei[20];
char imsi[20];
char iccid[20];
int rss;
float temp;
float humi;
if (!TemperatureAndHumidityRead(&temp, &humi)) {
CONSOLE.println("ERROR!");
goto err;
}
CONSOLE.print("temperature = ");
CONSOLE.print(temp);
CONSOLE.print("C , ");
CONSOLE.print("Current humidity = ");
CONSOLE.print(humi);
CONSOLE.println("% ");
err:
delay(2000);
Wio.GetIMEI(imei, sizeof(imei));
CONSOLE.print("IMEI:");
CONSOLE.println(imei);
Wio.GetIMSI(imsi, sizeof(imsi));
CONSOLE.print("IMSI:");
CONSOLE.println(imsi);
Wio.GetICCID(iccid, sizeof(iccid));
CONSOLE.print("ICCID:");
CONSOLE.println(iccid);
rss = Wio.GetReceivedSignalStrength();
CONSOLE.print("Get RSSI:");
CONSOLE.println(rss);
CONSOLE.println("");
/***** センサから取得した値をJSON形式に変換 *****/
// sprintf(body,"{\"UPTIME\":%lu, \"IMEI\": %s, \"TEMP\":%g, \"HUMI\":%g, \"RSSI\": %d}",millis()/1000, imei,temp,humi,rss);
sprintf(body,"{\"d\" : { \"ambientTemp\" : %g, \"ambientHumi\": %g } }" ,temp,humi);
/***** データ送信先確認 コンソールへ出力 *****/
CONSOLE.println("### Post to \""ENEBULAR_ENDPOINT"\".###");
CONSOLE.print("--> ");
CONSOLE.print(body);
CONSOLE.println("");
/***** Header情報の付与 *****/
WioCellularHttpHeader header;
header["Content-Type"] = "application/json";
/* JSONのbodyを送信する場合、Content-Typeを "application/json" にする */
/***** データ送信 POST *****/
if (Wio.HttpPost(ENEBULAR_ENDPOINT, body, &status, header)) {
CONSOLE.print("<-- ");
CONSOLE.print("enebular ResponseCode:");
CONSOLE.println(status);
}
else {
CONSOLE.print("### Failed to Post. (");
CONSOLE.print(status);
CONSOLE.println(")###");
}
/***** 次回実行までのwait *****/
CONSOLE.print("### Wait for ");
CONSOLE.print(INTERVAL);
CONSOLE.println(" msecs.###");
CONSOLE.println("");
delay(INTERVAL);
}
else{
CONSOLE.print("w");
delay(300);
}
}
/**********************************************************
WioCellLibForArduino
-> Grove
-> grove-temperature-and-humidity-sensor からの引用
************************************************************/
int TemperatureAndHumidityPin;
void TemperatureAndHumidityBegin(int pin){
TemperatureAndHumidityPin = pin;
DHT11Init(TemperatureAndHumidityPin);
}
bool TemperatureAndHumidityRead(float* temperature, float* humidity){
byte data[5];
DHT11Start(TemperatureAndHumidityPin);
for (int i = 0; i < 5; i++) data[i] = DHT11ReadByte(TemperatureAndHumidityPin);
DHT11Finish(TemperatureAndHumidityPin);
if(!DHT11Check(data, sizeof (data))) return false;
if (data[1] >= 10) return false;
if (data[3] >= 10) return false;
*humidity = (float)data[0] + (float)data[1] / 10.0f;
*temperature = (float)data[2] + (float)data[3] / 10.0f;
return true;
}
void DHT11Init(int pin){
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
void DHT11Start(int pin){
// Host the start of signal
digitalWrite(pin, LOW);
delay(18);
// Pulled up to wait for
pinMode(pin, INPUT);
while (!digitalRead(pin)) ;
// Response signal
while (digitalRead(pin)) ;
// Pulled ready to output
while (!digitalRead(pin)) ;
}
byte DHT11ReadByte(int pin){
byte data = 0;
for (int i = 0; i < 8; i++) {
while (digitalRead(pin)) ;
while (!digitalRead(pin)) ;
unsigned long start = micros();
while (digitalRead(pin)) ;
unsigned long finish = micros();
if ((unsigned long)(finish - start) > 50) data |= 1 << (7 - i);
}
return data;
}
void DHT11Finish(int pin){
// Releases the bus
while (!digitalRead(pin)) ;
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
}
bool DHT11Check(const byte* data, int dataSize){
if (dataSize != 5) return false;
byte sum = 0;
for (int i = 0; i < dataSize - 1; i++) {
sum += data[i];
}
return data[dataSize - 1] == sum;
}
/***** NW接続用関数 *****/
void getKey(char a_key[8],char u_key[4],char p_key[4]){
char org_char[] = "TjEyR3Q1ZGVyY0phcy5tem5PZmdwMjQ=";
rbase64.decode(org_char);
int slen1 = strlen(rbase64.result());
char str1[slen1];
strcpy(str1, rbase64.result());
char org_int[] = "MTQsNCw5LDEzLDE5LDcsMTY=";
rbase64.decode(org_int);
int slen2 = strlen(rbase64.result());
char str2[slen2];
strcpy(str2, rbase64.result());
char *sint;
for (int i=0;i<8;i++){
if (i==0){
sint = strtok(str2,",");
a_key[i] = str1[atoi(sint)];
} else {
sint = strtok(NULL,",");
a_key[i] = str1[atoi(sint)];
if (i==2){
strcpy(u_key,a_key);
strcpy(p_key,a_key);
u_key[i+1] = '\0';
p_key[i+1] = '\0';
} else if (i==7){
a_key[i] = '\0';
}
}
}
}
/***** NW接続用関数ここまで *****/
#59 Round Force Sensor FSR402
Round_Force_Sensor_FSR402
/****************************************************
59 Sample code For Touch Trigger
BG96,Round Force Sensor FSR402
to enebular HTTP POST
Mode M1 2019.9.27 by S.MATSUOKA
Update---------------->2019.12.25 by S.NISHIMURA
NiigataSample V.02
*****************************************************/
#include <WioCellLibforArduino.h>
#include <stdio.h>
#include <rBase64.h>
#include <string.h>
#include <stdlib.h>
#define ARDUINO_WIO_LTE_M1NB1_BG96
#define BAUDRATE 115200
#define CONSOLE SerialUSB
#define BG96 SerialModule
#define INTERVAL (500) /*** Push interval (mSec) ***/
#define SEND_CNT (100) /*** Send DATA interval () ***/
/***** enebular info *****/
#define ENEBULAR_NODE_PATH "https://ev2-prod-node-red-37dee588-a74.herokuapp.com" // URL末尾に"/"をつけない
#define ENABULAR_POST_URL "/debug"
#define ENEBULAR_ENDPOINT ENEBULAR_NODE_PATH""ENABULAR_POST_URL
/****** Sensor PIN *****/
#define SENSOR_PIN (WIO_D38)
#define BUTTON_PIN (WIO_D20)
#define SENSOR_PINA4 (WIO_A4)
//#define SENSOR_PIN (WIO_I2C_D24) /* I2C use D-PORT24 */
/*** ##### D38以外はデフォルト=Disable(給電off) */
#define SET_CEDRXS "at+cedrxs=0" /* set eDrx disable =0 */
#define GET_CEDRXS "at+cedrxs?" /* get eDrx status */
#define SET_QCFG "at+qcfg=\"nwscanseq\",020301" /* set <- M1 (02=M1 03=NB 01=3G-GSM)*/
#define SET_QCFG2 "at+qcfg=\"iotopmode\",2" /* set 0=M1 1=NB1 2=M1 & NB1 */
#define GET_COPS "at+cops?" /* get cops info 1 2 44020 8 */
#define GET_QCSQ "at+qcsq" /* get qcsq info CAT-M1 -40 -64 216 -7 */
#define GET_QNWINFO "at+qnwinfo" /* get qnwinfo info CAT-M1 44020 LTE BAND 1 475 */
/*** Wio LTE 制御クラス *** Wio LTE 本体の処理を呼び出すための変数を定義 */
WioCellular Wio;
int sensorValue = 0;
int count = 0;
/***** Setup処理 ***** */
void setup() {
delay(1000);
CONSOLE.begin(BAUDRATE);
CONSOLE.println("");
CONSOLE.println("############ SETUP ############");
CONSOLE.println("");
/***** Wio LTE 全体を初期化 *****/
Wio.Init();
CONSOLE.println("### Start Wio LTE initialization ###");
/***** LTE通信モジュールの電源供給を開始 *****/
Wio.PowerSupplyCellular(true);
CONSOLE.println("### Power supply ON ###");
delay(500); /* モジュール安定までWAIT */
/***** LTE通信モジュールを起動(起動済みの場合はリセット) *****/
if (!Wio.TurnOnOrReset()) {
CONSOLE.println("### Turn on or reset ERROR! ###");
return;
}else{
CONSOLE.println("### Turn on or reset Succeeded ###");
}
delay(500); // モジュール安定までWAIT
/***** Mobile Network接続(SB) ***** MANUALでPLMNを直接記述 PLMN=44020 (MCC=400,MNC=20) */
Wio.SetSelectNetwork(WioCellular::SELECT_NETWORK_MODE_MANUAL, "44020");
CONSOLE.println("### SELECT_NETWORK_MODE_MANUAL 44020 ###");
/***** プロバイダ(SB) set *****/
char a_key[8]={};
char u_key[4]={};
char p_key[4]={};
getKey(a_key,u_key,p_key);
if (!Wio.Activate(a_key, u_key, p_key)) {
CONSOLE.println("### NW Connect ERROR! ###");
return;
}else{
CONSOLE.println("### Connecting to NW. Succeeded ###");
}
/***** LTE M1を明示的に指定 *****/
Wio.SetAccessTechnology(WioCellular::ACCESS_TECHNOLOGY_LTE_M1);
CONSOLE.println("### ACCESS_TECHNOLOGY_LTE_M1 ###");
/***** AT Command 実行 *****/
CONSOLE.println("### ISSUE AT COMMAND ###");
/***** e-DRX disable SET (Defalt = OFF) *****/
BG96.println(SET_CEDRXS);
CONSOLE.println(SET_CEDRXS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(500); /* "0" Disable the use of e-I-DRX , "1" Enable the use of e-I-DRX */
/***** e-DRX CHECK *****/
BG96.println(GET_CEDRXS);
CONSOLE.println(GET_CEDRXS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続する通信規格の優先度を変更 *****/
BG96.println(SET_QCFG);
CONSOLE.println(SET_QCFG);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続先候補としてサーチする通信規格を定義 *****/
BG96.println(SET_QCFG2);
CONSOLE.println(SET_QCFG2);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ① *****/
BG96.println(GET_COPS);
CONSOLE.println(GET_COPS);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ② 信号強度 受信強度も同時に取得 *****/
BG96.println(GET_QCSQ);
CONSOLE.println(GET_QCSQ);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** 接続中の通信規格を表示 ③ アクセステクノロジ情報も同時に取得 *****/
BG96.println(GET_QNWINFO);
CONSOLE.println(GET_QNWINFO);
delay(300);
while(BG96.available()>0){
CONSOLE.write(BG96.read());
}
delay(1000);
/***** D38以外のGroveポートにも給電開始 *****/
Wio.PowerSupplyGrove(true);
CONSOLE.println("### ALL GROVE PORT POWER SUPPLY ON ###");
/***** setup Sensor PIN *****/
pinMode(SENSOR_PINA4, INPUT_ANALOG);
CONSOLE.print("Setup Analog_SENSOR_PIN -> ");
CONSOLE.print(SENSOR_PINA4);
/***** Wio LTE セットアップ完了 *****/
CONSOLE.println("");
CONSOLE.println("##### Wio LTE initialize completed. #####");
CONSOLE.println("############ SETUP FIN ############");
CONSOLE.println("############ GOTO LOOP ############");
CONSOLE.println("");
}
/************ Loop処理 ************/
void loop() {
int status;
char body[384];
char imei[20];
char imsi[20];
char iccid[20];
int rss;
CONSOLE.print("count = ");
CONSOLE.print(count);
CONSOLE.print(" : ");
sensorValue = analogRead(SENSOR_PINA4);
CONSOLE.print("SensorValue = " );
CONSOLE.println(sensorValue);
delay(INTERVAL);
if (count > SEND_CNT){
Wio.GetIMEI(imei, sizeof(imei));
CONSOLE.print("IMEI:");
CONSOLE.println(imei);
Wio.GetIMSI(imsi, sizeof(imsi));
CONSOLE.print("IMSI:");
CONSOLE.println(imsi);
Wio.GetICCID(iccid, sizeof(iccid));
CONSOLE.print("ICCID:");
CONSOLE.println(iccid);
rss = Wio.GetReceivedSignalStrength();
CONSOLE.print("Get RSSI:");
CONSOLE.println(rss);
CONSOLE.println("");
/***** センサから取得した値をJSON形式に変換 *****/
sprintf(body,"{\"d\" : { \"Value01\" : %d, \"rssi\": %d } }" ,sensorValue ,rss);
/***** データ送信先確認 コンソールへ出力 *****/
CONSOLE.println("### Post to \""ENEBULAR_ENDPOINT"\".###");
CONSOLE.print("--> ");
CONSOLE.print(body);
CONSOLE.println("");
/***** Header情報の付与 *****/
WioCellularHttpHeader header;
header["Content-Type"] = "application/json";
/* JSONのbodyを送信する場合、Content-Typeを "application/json" にする */
/***** データ送信 POST *****/
if (Wio.HttpPost(ENEBULAR_ENDPOINT, body, &status, header)) {
CONSOLE.print("<-- ");
CONSOLE.print("enebular ResponseCode:");
CONSOLE.println(status);
}
else {
CONSOLE.print("### Failed to Post. (");
CONSOLE.print(status);
CONSOLE.println(")###");
}
count = 0;
}else{
count ++;
}
}
/**********************************************************
WioCellLibForArduino
-> Grove
-> grove-temperature-and-humidity-sensor からの引用
************************************************************/
/***** NW接続用関数 *****/
void getKey(char a_key[8],char u_key[4],char p_key[4]){
char org_char[] = "TjEyR3Q1ZGVyY0phcy5tem5PZmdwMjQ=";
rbase64.decode(org_char);
int slen1 = strlen(rbase64.result());
char str1[slen1];
strcpy(str1, rbase64.result());
char org_int[] = "MTQsNCw5LDEzLDE5LDcsMTY=";
rbase64.decode(org_int);
int slen2 = strlen(rbase64.result());
char str2[slen2];
strcpy(str2, rbase64.result());
char *sint;
for (int i=0;i<8;i++){
if (i==0){
sint = strtok(str2,",");
a_key[i] = str1[atoi(sint)];
} else {
sint = strtok(NULL,",");
a_key[i] = str1[atoi(sint)];
if (i==2){
strcpy(u_key,a_key);
strcpy(p_key,a_key);
u_key[i+1] = '\0';
p_key[i+1] = '\0';
} else if (i==7){
a_key[i] = '\0';
}
}
}
}
/***** NW接続用関数ここまで *****/