です。

 

前回の続きです。

学習リモコンの リモコン本体プログラムの紹介です。

1.状態表示機能

2.WIFI接続、送信、受信機能

3.送信データ生成機能

4.受信データ解析機能

5.赤外線データ生成機能

6.赤外線発信機能

7.赤外線学習、データ化機能

3.送信データ生成機能

    学習した赤外線データを送信データ文字列に変換

  データが長いので数回に分けて、送信する、その数回分を生成する

 

void TB_SET() {
VALTBSTR = "";
VALTBEND = "0";
CONT1 = 0;
CONT2 = 0;
char buffer [33];
String S = "";
const char*P;
while (CONT1 < 20) {
CONT2 = CONT1 + CONT3;
//**数字ー文字変換
P = ltoa(TIME_JI[CONT2],buffer,10);
S = String(P);
char buffer [33];
String S1 = "";
const char*P1;
//**数字ー文字変換
P1 = ltoa(CONT2,buffer,10);
S1 = String(P1);
//**文字連結 JI + CONT + DDATA + * と連結
if (CONT2 < 100) {S1 = "0" + S1;}
if (CONT2 < 10) {S1 = "0" + S1;}
S1 = "JI" + S1 + "=";
VALTBSTR = VALTBSTR + S1 + S + "*";

if (TIME_JI[CONT2] == 0) {CONT1 = 20;
TBKAI = "16";
VALTBEND = "9";
}

CONT1++;
}
}

 

 

4.受信データ解析機能

  受信したボタン番号により目的の処理を実行する、該当しなければ、ループする

 

void loop() {
if (READBTN3 == "81") {
SLEAP = READBTN3;
READBTN3 = "00";
}
if (SLEAPCNT == 450) {SLEAP = "00";}
if (READBTN3 > "00" && READBTN3 < "30") {READBTN3 = "00";}
if (READBTN3 == "99") {READBTN3 = "00";}
if (data.val == 9999) {SUB_POLING();} //ボタンデータポーリング
if (READBTN3 > "60" && READBTN3 < "80"){SUB_GAKUSYU();} //学習機能
if (READBTN3 > "00" && READBTN3 < "30") {SUB_HASIN();} //リモコン発信
if (READBTN3 == "99") {SUB_EPROMCRE();}
//BTN99(EPROM初期化指示用にVALに0000セット
if (data.val != 9999 && READBTN3 == "00") {
server.handleClient();
//**DBG Serial.println("WAITE.....");
delay(1000);
}

 

5.赤外線データ生成機能

    

//********************************発信準備********************************
**********************************
void SEND_ORG() {
CONT = 0;
STAT_TIM = micros();
NOW_TIM = micros();
LAST_TIM = 0;
digitalWrite(12, LOW); //**赤外線LED
}
//********************************発信開始********************************
**************************************
void SEND_STA() {
CONT = 0;
//******300回までで 時間が0以上でループ********
while (CONT < 301 && TIME_JI[CONT] > 0) {
if (TIME_LH[CONT] == 0) SEND_L();
//***Lの時間だけL発信
if (TIME_LH[CONT] == 1) SEND_H();
//***Hの時間だけH発信
CONT++;
}
}
//*******************************時間だけH発信***************************
****************************************
void SEND_H() {
NOW_TIM = micros();
LAST_TIM = NOW_TIM + TIME_JI[CONT];
while (LAST_TIM > NOW_TIM) {    NOW_TIMがLAST_TIMになるまで点灯
F38K(); //**38KHz で点滅    実際は赤外線、出っ放しではなく、38KHzで点滅させる
NOW_TIM = micros();
CONT1++;
}

}
//*******************************時間だけL発信****************************
***************************************
void SEND_L() {
// digitalWrite(13,LOW); //**確認用LED
NOW_TIM = micros();
LAST_TIM = NOW_TIM + TIME_JI[CONT];
while (LAST_TIM > NOW_TIM) {
digitalWrite(12,LOW); //**赤外線LED   赤外線をOFFにする
NOW_TIM = micros();

}

}
//******************************搬送波 38KHz付加************************
************************************************
void F38K() {
digitalWrite(12,HIGH); //**赤外線LED
NOW_TIM1 = micros();
LAST_TIM1 = NOW_TIM1 + 10;    38Kzの半分(1/2サイクル分)点灯
while (LAST_TIM1 > NOW_TIM1) {
NOW_TIM1 = micros();
}
digitalWrite(12,LOW); //**赤外線LED
NOW_TIM1 = micros();
LAST_TIM1 = NOW_TIM1 + 10;   38Kzの半分(1/2サイクル分)消灯
while (LAST_TIM1 > NOW_TIM1) {
NOW_TIM1 = micros();
}
}

 

 

 

 

6.赤外線発信機能

  発信開始、終了時の確認でブザー音をつける

 

void SUB_HASIN() {
tone(16, 2750 );
delay(90);
noTone(pinBuzzer);
INP = 1;
SENDR();   赤外線発信ルーチン
END_F = 9;
CONT = 0;
CONT1 = 0;
CONT2 = 0;
DSP_BTN = BTN1;
DSP_READ = "04"; // [ Waiting ]
SB_DSPLAY(); //*カーソル X,Y =0,6から0,7 サイズ=1
tone(16, 2750 );
delay(90);
noTone(pinBuzzer);
}

 

void SENDR() {

SEND_ORG();
//発信準備
SEND_STA();
//発信開始
}

 

7.赤外線学習、データ化機能

 

//***********************学習、発信***************************************
************
//******************************学習データテーブル初期化*******************
*****************************************************
void SB_ORG() {
if (END_F == 9) {
tone(16, 2750 );
digitalWrite(13, HIGH);
STAT_TIM = micros();
LAST_TIM = STAT_TIM + 500000L;
CONT = 0;
while (CONT < 301) {
TIME_LH[CONT] = 0;
TIME_JI[CONT] = 0;
CONT++;
}
//はじめの H から L まち H の時END_F = 9 MOVE ***
if (INPUTDATA == 0){
END_F = 0;
noTone(pinBuzzer);
digitalWrite(13, LOW);
if (digitalRead(14) == 1) {END_F = 9;}
}
}
CONT = 0;

}
//******************************学習データテーブルMOVE*******************
*****************************************************

  1. 赤外線を受光して 受光した 初めの現在時間と 消灯した初めの現在時間を テーブルに記録

 2.消灯時間から受光時間を差し引きして、点灯時間をもとめる(経過時間)

 3.点灯、消灯の経過時間から 点灯している時間、消灯している時間(相対時間)をもとめる

 4.テーブル最大300件分を20件分ごとに、サーバーデータに変換して、送信する

 


// L から H まち  はじめの時間のみ1回 配列にMOVE
void SB_H_MATI() {
if (CONT1 == 0 && INPUTDATA == 0){
TIME_LH[CONT] = 1;
TIME_JI[CONT] = STAT_TIM;
CONT++;
CONT1++;
CONT2 = 0;
}
}
//******************************学習データテーブルMOVE*******************
*****************************************************
// H から L まち  はじめの時間のみ1回 配列にMOVE タイムアウトで END_F = 8
MOVE
void SB_L_MATI() {
if (CONT2 == 0 && INPUTDATA == 1){
TIME_LH[CONT] = 0;
TIME_JI[CONT] = STAT_TIM;
CONT++;
CONT2++;
CONT1 = 0;
}
}
//***************************経過時間TBから相対経過時間TBと間隔時間TBに
計算*************************************************
void SB_KEISAN() {
CONT = 0;
while (CONT < 301) {
TIME_LH1[CONT] = 0;
TIME_JI1[CONT] = 0;
CONT++;
}
CONT = 0;
while (CONT < 301) {
TIME_LH2[CONT] = 0;
TIME_JI2[CONT] = 0;
CONT++;
}
// 間隔時間TB 作成

CONT = 0;
while (CONT < 301) {
if (TIME_JI[CONT + 1] != 0) {
TIME_JI1[CONT] = int(TIME_JI[CONT + 1] - TIME_JI[CONT]);
TIME_LH1[CONT] = int(TIME_LH[CONT]);

}
CONT++;
}
// 相対経過時間TB 作成
CONT = 0;
TIME_JI2[CONT] = TIME_JI1[CONT];
TIME_LH2[CONT] = TIME_LH1[CONT];
CONT = 1;
while (CONT < 301) {
if (TIME_JI1[CONT] != 0) {
TIME_JI2[CONT] = TIME_JI1[CONT - 1] + TIME_JI1[CONT];
TIME_LH2[CONT] = TIME_LH1[CONT];
}
CONT++;
}
CONT = 0;
while (CONT < 301) {
TIME_LH[CONT] = TIME_LH1[CONT];
TIME_JI[CONT] = TIME_JI1[CONT];
CONT++;
}
CONT = 0;
}
//*****************************EEPROM
へ書き込み****************************************************************
*****
//***********************************************************************
*******************************
void SENDR() {

SEND_ORG();
//発信準備
SEND_STA();
//発信開始

digitalWrite(12, LOW); //**赤外線LED

}
//********************************RAMから取出し**************************
****************************************
//-----リモコンデータからテーブルへ MOVE----------------------------------
-------------------
//***********************サーバポーリング 学習データ送信*******************
**********************
void SUB_POLING_GK() {
WiFiClient client;
HTTPClient http;

VALHTTP = "http://www1.kcn.ne.jp/~i-yoshi/syop/SINRIMO02A.cgi?MAIL=" +
VALMAIL + "&PASS=" + VALPASS + "&SEIZO=" + VALSEIZO + "&TBKAI=" +
VALTBKAI + "&TBSTR=" + VALTBSTR + "&TBEND=" + VALTBEND;
if (http.begin(client, VALHTTP)) { // HTTP

// start connection and send HTTP header
int httpCode = http.GET();
// httpCode will be negative on error
if (httpCode > 0) {
// HTTP header has been send and Server response header has been handled

// file found at server
if (httpCode == HTTP_CODE_OK || httpCode ==
HTTP_CODE_MOVED_PERMANENTLY) {
payload = http.getString();

}
} else {

http.errorToString(httpCode).c_str());
}
http.end();
} else {
Serial.printf("[HTTP} Unable to connect\n");
digitalWrite(13, HIGH);
WiFi.disconnect();
WiFi.mode(WIFI_STA);

}

}
//************
スレーブから20個 TIME_JI[CONT]からJI[CONT]へ仮MOVE後、VALTBSTR
にセット*********
void TB_READ0_19() {
TBEND = 0;
TBKAI = "0";
VALTBKAI = TBKAI;
CONT3 = 0;
TB_SET();
tone(16, 2000 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ20_39() {
TBEND = 0;
TBKAI = "1";
VALTBKAI = TBKAI;
CONT3 = 20;
TB_SET();
tone(16, 2200 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ40_59() {
TBEND = 0;
TBKAI = "2";
VALTBKAI = TBKAI;
CONT3 = 40;
TB_SET();
tone(16, 2400 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ60_79() {
TBEND = 0;
TBKAI = "3";
VALTBKAI = TBKAI;
CONT3 = 60;
TB_SET();
tone(16, 2600 );
SUB_POLING_GK();
noTone(pinBuzzer);
}

void TB_READ80_99() {
TBEND = 0;
TBKAI = "4";
VALTBKAI = TBKAI;
CONT3 = 80;
TB_SET();
tone(16, 2800 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ100_119() {
TBEND = 0;
TBKAI = "5";
VALTBKAI = TBKAI;
CONT3 = 100;
TB_SET();
tone(16, 3000 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ120_139() {
TBEND = 0;
TBKAI = "6";
VALTBKAI = TBKAI;
CONT3 = 120;
TB_SET();
tone(16, 3200 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ140_159() {
TBEND = 0;
TBKAI = "7";
VALTBKAI = TBKAI;
CONT3 = 140;
TB_SET();
tone(16, 3400 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ160_179() {
TBEND = 0;
TBKAI = "8";
VALTBKAI = TBKAI;
CONT3 = 160;
TB_SET();
tone(16, 3600 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ180_199() {
TBEND = 0;
TBKAI = "9";

VALTBKAI = TBKAI;
CONT3 = 180;
TB_SET();
tone(16, 3800 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ200_219() {
TBEND = 0;
TBKAI = "10";
VALTBKAI = TBKAI;
CONT3 = 200;
TB_SET();
tone(16, 4000 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ220_239() {
TBEND = 0;
TBKAI = "11";
VALTBKAI = TBKAI;
CONT3 = 220;
TB_SET();
tone(16, 4200 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ240_259() {
TBEND = 0;
TBKAI = "12";
VALTBKAI = TBKAI;
CONT3 = 240;
TB_SET();
tone(16, 4400 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ260_279() {
TBEND = 0;
TBKAI = "13";
VALTBKAI = TBKAI;
CONT3 = 260;
TB_SET();
tone(16, 4600 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ280_299() {
TBEND = 0;
TBKAI = "14";
VALTBKAI = TBKAI;
CONT3 = 280;
TB_SET();

tone(16, 4800 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_READ300_319() {
TBEND = 0;
TBKAI = "15";
VALTBKAI = TBKAI;
CONT3 = 300;
TB_SET();
tone(16, 5000 );
SUB_POLING_GK();
noTone(pinBuzzer);
}
void TB_SET() {
VALTBSTR = "";
VALTBEND = "0";
CONT1 = 0;
CONT2 = 0;
char buffer [33];
String S = "";
const char*P;
while (CONT1 < 20) {
CONT2 = CONT1 + CONT3;
//**数字ー文字変換
P = ltoa(TIME_JI[CONT2],buffer,10);
S = String(P);
char buffer [33];
String S1 = "";
const char*P1;
//**数字ー文字変換
P1 = ltoa(CONT2,buffer,10);
S1 = String(P1);
//**文字連結 JI + CONT + DDATA + * と連結
if (CONT2 < 100) {S1 = "0" + S1;}
if (CONT2 < 10) {S1 = "0" + S1;}
S1 = "JI" + S1 + "=";
VALTBSTR = VALTBSTR + S1 + S + "*";

if (TIME_JI[CONT2] == 0) {CONT1 = 20;
TBKAI = "16";
VALTBEND = "9";
}

CONT1++;
}
}
//**************スレーブ学習分TIME_JI[CONT]からVALTBSTRへMOVEしてポーリ
ング
void RIMO_READ() {
CONT = 0;
CONT1 = 0;
CONT2 = 0;
TBEND = 0;
TBKAI = "99";
//************ 15回に分けてサーバーへ赤外線データ300個をテーブル読込み
if (TBEND == 0 && TBKAI == "99") {TB_READ0_19();}
if (TBEND == 0 && TBKAI == "0") {TB_READ20_39();}
if (TBEND == 0 && TBKAI == "1") {TB_READ40_59();}
if (TBEND == 0 && TBKAI == "2") {TB_READ60_79();}
if (TBEND == 0 && TBKAI == "3") {TB_READ80_99();}
if (TBEND == 0 && TBKAI == "4") {TB_READ100_119();}
if (TBEND == 0 && TBKAI == "5") {TB_READ120_139();}
if (TBEND == 0 && TBKAI == "6") {TB_READ140_159();}
if (TBEND == 0 && TBKAI == "7") {TB_READ160_179();}
if (TBEND == 0 && TBKAI == "8") {TB_READ180_199();}
if (TBEND == 0 && TBKAI == "9") {TB_READ200_219();}
if (TBEND == 0 && TBKAI == "10") {TB_READ220_239();}
if (TBEND == 0 && TBKAI == "11") {TB_READ240_259();}
if (TBEND == 0 && TBKAI == "12") {TB_READ260_279();}
if (TBEND == 0 && TBKAI == "13") {TB_READ280_299();}
if (TBEND == 0 && TBKAI == "14") {TB_READ300_319();}
VALTBEND = "0";
VALTBSTR = "0";
VALTBKAI = "0";
tone(16, 2000 );
delay(200);
noTone(pinBuzzer);
tone(16, 2750 );
delay(200);
noTone(pinBuzzer);
}

 

 

以上が マイコン側のコードです。

機能ごとに、実際稼働してる物を 引用しました。

赤外線の発光や受光を ハードではなく、ソフトで制御しています、利用しているマイコンの処理速度が速いので、できました、処理速度が10分の一 遅いと できなたっかとろです。

 

次回は、サーバー側のweb プログラムで スマホを リモコンのコントローラとして 利用する方法を紹介しましょー。

 

フォローしてね!