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

## サンプルスケッチ(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; | ユーザが独自登録するhtmｌ画面の行数．設定方法は後述する． 後でU_htm l配列を設定する時に配列数になる．
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配列はこの場合３つなのでU_HtmlLineは3を設定する． ・　個々で設定した配列は図３−２の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.htmlのUserSwitchの項目がOFFになっている時にCCMのcnd.xXXに1を出力する． else if(setONOFFAUTO==1) {U_ccmList[CCMID_cnd].value=1;}//Manual ON Webページp1.htmlのUserSwitchの項目がONになっている時にCCMのcnd.xXXに0を出力する． 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.htmlのUserSwitchの項目がAUTOでかつ、InAirTempの値が正常に受信できており、InAirTempの値が設定値を下回った時にcnd.xXXに1を出力する．それ以外ではcnd.xXXに0を出力する．
void UserEveryLoop(){ } | 必要に応じて内部を記述．空でも関数は必要．
void loop(){ UECSloop(); } void setup(){ UECSsetup(); } | これはこのまま記述する．

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