UECSノード開発用ミドルウェア UARDECS 使用方法 その4

サンプルスケッチ(Thermostat)の解説

#include <SPI.h>
#include <Ethernet.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <CCM.h>
#include <EEPROM.h>
#include <EthernetManager.h>

ノードとして動作させるためのライブラリーをinclude

#define NONE -1
#define A_1S_0 0
#define A_1S_1 1
#define A_10S_0 2
#define A_10S_1 3
#define A_1M_0 4
#define A_1M_1 5
#define S_1S_0 6
#define S_1M_0 7
#define B_0 8
#define B_1 9

#define UECSSHOWDATA 0
#define UECSINPUTDATA 1
#define UECSSELECTDATA 2
#define UECSSHOWSTRING 3

スケッチの可読性を高めるための簡単なマクロ

const byte U_InitPin = 3;

const byte U_InitPin_Sense=HIGH;

U_InitPinにはIPアドレスの設定を初期化するピン番号を指定(現在はD3).このピンは自動的にプルアップされる.ピンの状態がU_InitPin_Senseになった時、
IP
アドレス:192.168.1.7

サブネット:255.255.0.0で,それ以外ではブラウザの設定(p2.htmlで設定した値)で起動する.

const char PROGMEM U_name[] = "UARDECS Node v.1.0";
const char PROGMEM U_vender[] = "XXXXXX Co.";
const char PROGMEM U_uecsid[] = "00000000";

UECSの通信文で使用.詳しくは通信規約を参照のこと.(環境制御には直接関与しない)

const char PROGMEM U_footnote[] = "If you have any question, please contact Yasuba."
const int U_footnoteLetterNumber = 48;

ここで設定した文字列はTOPページの脚注に表示.helpのリンク先を記述することも可能.
2
列目の数字はU_footnoteの文字数を設定する.

char U_nodename[20] = "Sample";

ブラウザで各ページで読み込んだときに表示される.
p2.html
で値を変更可能であるし,ノード起動時に自動的に不揮発性メモリーから読み込まれる.

const int U_HtmlLine = 3;

ユーザが独自登録するhtml画面の行数.設定方法は後述する.
後でU_html配列を設定する時に配列数になる.

UECSOriginalAttribute U_orgAttribute;

これはこのまま登録しておく.

const int U_HtmlLine = 3; //Total number of HTML table rows.

const char PROGMEM NAME0[] = "Temperature";

const char PROGMEM NAME1[] = "UserSwitch";

const char PROGMEM NAME2[] = "SetTemp";

 

//select

const char PROGMEM UECSOFF[] = "OFF";

const char PROGMEM UECSON[] = "ON";

const char PROGMEM UECSAUTO[] = "AUTO";

PROGMEM const char *stringONOFFAUTO[3]={

UECSOFF,

UECSON,

UECSAUTO,

};

PROGMEM const char CENT[] = "C";

PROGMEM const char NONES[] = "";

PROGMEM const char note1[]= "Set temp";

 

signed long webTemp;

signed long setONOFFAUTO;

signed long setONTemp;

const char** dummy = NULL;

U_html配列を登録する際に使用する定数と変数.

struct UECSUserHtml U_html[U_HtmlLine]={

{NAME0, UECSSHOWDATA, CENT, NONES, dummy, 0, &(webTemp), 0, 0, 1},

{NAME1, UECSSELECTDATA, NONES, NONES, stringONOFFAUTO, 3, &(setONOFFAUTO), 0, 0, 0},

{NAME2, UECSINPUTDATA, CENT, note1, dummy, 0, &(setONTemp), 100, 400, 1},

};

・ U_html配列はこの場合3つなのでU_HtmlLine3を設定する.
・ 個々で設定した配列は図3−2のStaus & SetValue以下で表示される.
・ 配列の設定方法は後述する.

enum {

CCMID_InAirTemp,

CCMID_cnd,

CCMID_dummy,

};

可読性を高めるためにCCMIDという記号定数を定義している.

CCMID_dummyは定義したCCMの総数を数えるのに使っている.

const int U_MAX_CCM = CCMID_dummy;
UECSCCM U_ccmList[U_MAX_CCM];

本ノードで使用するCCMの数(送受信あわせて)設定.設定した値はccmList配列でメモリーが確保される.
あまり大きな値にするとプログラムが動かなくなる可能性がある.
void UserInit()
関数内の
UECSsetCCM(で登録したCCMの数を設定する.

const char PROGMEM ccmNameTemp[] = "AirTemp";
const char PROGMEM ccmTypeTemp[] = "InAirTemp";
const char PROGMEM ccmUnitTemp[] = "C";

const char PROGMEM ccmNameCnd[] = "NodeCondition";
const char PROGMEM ccmTypeCnd[] = "cnd.xXX";
const char PROGMEM ccmUnitCnd[] = "";

CCM(通信文)を登録するときに使用する.

void UserInit(){

U_orgAttribute.mac[0] = 0x90;

U_orgAttribute.mac[1] = 0xA2;

U_orgAttribute.mac[2] = 0xDA;

U_orgAttribute.mac[3] = 0x12;

U_orgAttribute.mac[4] = 0x34;

U_orgAttribute.mac[5] = 0x56;

 

//Set ccm list

UECSsetCCM(false, CCMID_InAirTemp, ccmNameTemp, ccmTypeTemp, ccmUnitTemp, 30, 1, A_10S_0);

UECSsetCCM(true,  CCMID_cnd      , ccmNameCnd , ccmTypeCnd , ccmUnitCnd , 30, 0, A_1S_0);
}

この関数内では
・ MACアドレスを登録(U_orgAttibute構造体の要素)
・ UserSetCCM関数を使ってCCMの登録
2つをかならず実施する必要がある.

MACアドレスはArduino EthernetまたはEthernetシールドに貼られたシールに書いてある.無い場合は新規に発行してもらう必要がある.

・ 関数の使い方は後述する

void setSendP1Page(){
}

必要に応じて記述.ブラウザで設定した後に何かしたいとき.処理が無くても関数は必要.

void UserEvery1min(){
if(U_ccmList[CCMID_InAirTemp].validity)

      {

      webTemp = U_ccmList[CCMID_InAirTemp].value;

      }

 

//Thermostat

if(setONOFFAUTO==0)

    {U_ccmList[CCMID_cnd].value=0;}//Manual OFF

else if(setONOFFAUTO==1)

    {U_ccmList[CCMID_cnd].value=1;}//Manual ON

else if(setONOFFAUTO==2 && U_ccmList[CCMID_InAirTemp].validity && U_ccmList[CCMID_InAirTemp].value<setONTemp)

    {U_ccmList[CCMID_cnd].value=1;}//Auto ON

else

    {U_ccmList[CCMID_cnd].value=0;}//OFF
}

この関数は1秒間隔で呼び出される処理を記載する.

動作解説:

U_ccmList[CCMID_InAirTemp].validityにより、InAirTempの値が正常に受信できているかどうか判定している.もし、受信できた場合webTempの値を更新する.

 

サーモスタット動作:

if(setONOFFAUTO==0)

 {U_ccmList[CCMID_cnd].value=0;}//Manual OFF

Webページp1.htmlUserSwitchの項目がOFFになっている時にCCMcnd.xXX1を出力する.

 

else if(setONOFFAUTO==1)

{U_ccmList[CCMID_cnd].value=1;}//Manual ON

Webページp1.htmlUserSwitchの項目がONになっている時にCCMcnd.xXX0を出力する.

 

else if(setONOFFAUTO==2 && U_ccmList[CCMID_InAirTemp].validity && U_ccmList[CCMID_InAirTemp].value<setONTemp)

    {U_ccmList[CCMID_cnd].value=1;}//Auto ON

else

    {U_ccmList[CCMID_cnd].value=0;}//OFF

Webページp1.htmlUserSwitchの項目がAUTOでかつ、InAirTempの値が正常に受信できており、InAirTempの値が設定値を下回った時にcnd.xXX1を出力する.それ以外ではcnd.xXX0を出力する.

void UserEveryLoop(){
}

必要に応じて内部を記述.空でも関数は必要.

void loop(){
UECSloop();
}


void setup(){
UECSsetup();
}

これはこのまま記述する.

 


最初へ 前のページへ 次のページへ