Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

SB貸出分 参考スケッチ

Last updated at Posted at 2020-02-19

SoftBank貸出のセンサで動作検証を行った時のスケッチを公開します。
IDEにサンプルがない場合等に参考にして下さい。
ハンズオンの書式と異なる場合がありますが御了承ください。

#46.47.48 Blue/Red/Yellow LED Button
image.png

<接続ポート>
image.png

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

#52 Moisture Sensor
image.png

<接続ポート>
image.png

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接続用関数ここまで *****/

#53 Vibration Motor
image.png

<接続ポート>
image.png

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

image.png

<接続ポート>
image.png

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

image.png

<接続ポート>
image.png

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

image.png

<接続ポート>
image.png

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

image.png

<接続ポート>
image.png

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接続用関数ここまで *****/

#61 GSR sensor
image.png

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?