7-3-1.Scratch3.0用ESP32-DevKitC環境構築 インターネットあり
ESP32-DevKitC環境構築
Scratch3.0用にESP32-DevKitC環境構築します。
本ページで利用するスケッチはESP32-DevKitCがインターネットに接続でき、時刻同期やIFTTTへアクセスできる必要があります。
ArduinoIDE環境構築
「ESP32-DevKitC」へスケッチ(プログラム)を書き込みにはArduinoIDEを利用します。
環境が準備できていない方はこちらを参照し構築して下さい。
また、必要なライブラリはこちらになりますので構築できていない方がインストールして下さい。
回路と配線
電子回路と配線図は全センサーが利用できるよう5-4「全センサー実装」を利用します。
【ESP32-DevKitCの入出力端子はこちらを参照下さい】
スケッチ(制御ソフトウェア)
Scrachと接続するための制御ソフトウェアは以下の2つとなります。
(1)Scratch3RemoNet.ino
(2)config.h
(3)ifttt_webhooks.ino
(4)irRecvSend.ino
こちら[2019.7.27版]からダウンロードして下さい。
また、IFTTTに関する設定はこちら、Beebotteに関する設定はこちらを参照ください。
(1)Scratch3RemoNet.ino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
// IoT本格学習キット スマートリモコン // 7-3. Scratch3用プログラム(インターネット接続あり) // ①ライブラリを読み込み #include <WiFi.h> #include <WiFiClientSecure.h> #include <DHT.h> #include <FS.h> #include <SPIFFS.h> #include <ESPAsyncWebServer.h> #include <ArduinoJson.h> // 「ArduinoJson by Benolt Blanchon 5.13.5」ライブラリを個別にインストール #include <PubSubClient.h> // 「PubSubClient by Nick O'Leary」を個別にインストール #include "config.h" // ②PubSubClientライブラリでのパケットサイズ、KeepAlive時間を個別で変更 #define MQTT_MAX_PACKET_SIZE 1024 #define MQTT_KEEPALIVE 15 // ③ピン配置 const byte LED_PIN = 22; // LED緑 const byte IR_R_PIN = 36; // リモコン受信 const byte IR_S_PIN = 23; // リモコン送信 const byte LIGH_SNR = 39; // 照度センサ(A18) const byte TEMP_SNR = 21; // 温・湿度センサ // ④グローバル変数定義 AsyncWebServer server(80); // Port80番 unsigned short irData[1500]; bool ledFlag = true; // LED制御フラグ WiFiClientSecure wifiClientMqtt; // MQTT用 WiFiClientSecure wifiClientHttps; // HTTPS用 PubSubClient mqttClient(mqtthost, 8883, wifiClientMqtt); void setup(void) { // ⑤Serial設定 Serial.begin(115200); Serial.println ( ); // ⑤SPIFFS開始 if (!SPIFFS.begin()) { Serial.println(F("SPIFFS Failed")); // Failed mount delay(5000); ESP.restart(); } // ⑥LED設定 pinMode ( LED_PIN, OUTPUT ); pinMode ( IR_R_PIN, INPUT ); pinMode ( IR_S_PIN, OUTPUT ); pinMode ( LIGH_SNR, INPUT ); // ⑦無線Wi-Fi接続 WiFi.config( ip, gateway, subnet, dnsserver ); WiFi.begin ( ssid, password ); // ⑧Wi-Fi接続処理(接続するまで無限ループ) Serial.print ( "Wi-Fi Connectting ." ); while ( WiFi.status() != WL_CONNECTED ) { // ⑨LEDを1秒毎に点滅する ledFlag = !ledFlag; digitalWrite(LED_PIN, ledFlag); delay ( 1000 ); Serial.print ( "." ); } // ⑩Wi-Fi接続できたのでシリアルモニターにIPアドレス表示 Serial.print ( "Wi-Fi Connected! IP address: " ); Serial.println ( WiFi.localIP() ); digitalWrite ( LED_PIN, true ); // LED点灯(Wi-Fi接続状態) // ⑪HTTPS用の証明書を設定 wifiClientMqtt.setCACert(beebottle_ca_cert); wifiClientHttps.setCACert(ifttt_ca_cert); // ⑫時刻同期(NTP)設定 configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp"); // ⑬WebServerアクセス処理[LED制御] server.on("/led", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println ( "webServer led:" + request->getParam("o")->value() ); String setLedVal = request->getParam("o")->value(); if (setLedVal == "ON") { digitalWrite ( LED_PIN, true ); } else { digitalWrite ( LED_PIN, false ); } // 応答処理 request->send(200, "text/plain", "OK"); }); // ⑭WebServerアクセス処理[センサー情報更新] server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println ( "webServer update" ); // リモコン送信 String sendMsg = makeSensorStr(1); // 応答処理 request->send(200, "application/json", sendMsg); }); // ⑮WebServerアクセス処理[リモコン送信] server.on("/send", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println ( "webServer send:" + request->getParam("n")->value() ); // リモコン送信 String replyResult = "NG"; if ( contRemocon(request->getParam("n")->value()) ){ replyResult = "OK"; } // 応答処理 request->send(200, "text/plain", replyResult); }); // ⑯WebServerアクセス処理[リモコン受信] server.on("/recv", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println ( "webServer recv:" + request->getParam("n")->value() ); // リモコン受信設定 String replyResult = "NG"; if ( setRemocon(request->getParam("n")->value()) ){ replyResult = "OK"; } // 応答処理 Serial.println ( "send recv response." ); request->send(200, "text/plain", replyResult); }); // ⑰WebServerアクセス処理[IFTTT Webhooks] server.on("/ifttt", HTTP_GET, [](AsyncWebServerRequest *request){ Serial.println ( "webServer ifttt:" + request->getParam("j")->value() ); // リモコン受信設定 String replyResult = "NG"; if ( iftttWebhoos(request->getParam("j")->value()) ){ replyResult = "OK"; } // 応答処理 Serial.println ( "send ifttt response." ); request->send(200, "text/plain", replyResult); }); // ⑱WebServerヘッダ設定及び起動 DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); server.begin(); Serial.println ( "Web server started" ); } // ⑲loop処理(起動中、繰り返し処理) void loop(void){ // ⑳MQTT状態を確認し接続状態でなかったらMQTT接続処理 if (!mqttClient.connected()) { reconnect(); } // ㉑MQTT受信処理 mqttClient.loop(); delay(1); } // ㉒センサー情報取得 String makeSensorStr(byte jobType){ String messageS = ""; DHT dht(TEMP_SNR, DHT11); float g_temperature = dht.readTemperature(); float g_humidity = dht.readHumidity(); unsigned short g_light = analogRead(LIGH_SNR) * 100 / 4095; if (jobType == 1) { // Send to Scratch messageS = "{\"t\":" + String(int(g_temperature)) + ",\"h\":" + String(int(g_humidity)) + ",\"l\":" + String(g_light) + "}"; } else if (jobType == 2) { messageS = String(int(g_temperature)) + "_" + String(int(g_humidity)) + "_" + String(g_light); } return messageS; } // ㉓番号情報のみ取得し返答 String getNumStr(String message) { message.replace("broadcast ", ""); message.replace("_", ""); message.replace("\"", ""); message.replace("SEND", ""); message.replace("RECV", ""); return message; } // ㉔MQTT接続処理 void reconnect() { byte tryCount = 0; // ㉕MQTT接続状態までループ処理 while (!mqttClient.connected()) { Serial.println("Attempting MQTT connection..."); // ㉖MQTT設定、接続処理 String username = "token:"; username += channelToken; mqttClient.connect(clientID, username.c_str(), NULL); delay(3000); if (tryCount > 100 ) { ESP.restart(); } tryCount++; } Serial.println("MQTT connected"); // ㉗MQTTメッセージ受信時の処理設定 mqttClient.setCallback(callback); // ㉘MQTTメッセージを受信するTOPICの設定 mqttClient.subscribe(topic); } // ㉙MQTTメッセージ受信時の処理 void callback(char* topic, byte* payload, unsigned int length) { char recvData[MQTT_MAX_PACKET_SIZE]; snprintf(recvData, sizeof(recvData), "%s", payload); Serial.print("Message arrived ["); Serial.print(topic); Serial.println("] "); Serial.println(recvData); // ㉚受信データのJSON形式を解析し変数へ保存 StaticJsonBuffer<MQTT_MAX_PACKET_SIZE> jsonBuffer; JsonObject& jsonBuf = jsonBuffer.parseObject(recvData); // ㉛JSON形式解析が成功しなかったらエラー表示し終了 if (!jsonBuf.success()) { Serial.println("parseObject() failed"); return; } // ㉜受信データ(data)を保存 const char* parsedPayload = jsonBuf["data"]; // ㉝受信データ(data)が存在するか判定 if (parsedPayload != NULL) { Serial.print("payload: "); Serial.println(parsedPayload); // ㉞受信データ(data)に送信リモコン番号 String rMessage = String(parsedPayload); if(rMessage.indexOf("RECV") > -1){ Serial.println("RECV"); digitalWrite ( LED_PIN, false ); setRemocon (getNumStr(rMessage)); digitalWrite ( LED_PIN, true ); } else if(rMessage.indexOf("SEND") > -1){ digitalWrite ( LED_PIN, false ); Serial.println("SEND"); contRemocon (getNumStr(rMessage)); digitalWrite ( LED_PIN, true ); } } } |
(2)config.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 |
// ①環境設定 // ####################### 環境に合わせて設定 ####################### // *************** 本キットのIPアドレス ************** IPAddress ip(192, 168, 1, 123); // IPアドレス(本機が利用するIP) IPAddress gateway(192, 168, 1, 1); // デフォルトゲートウェイ IPAddress subnet(255, 255, 255, 0); // サブネットマスク IPAddress dnsserver(192, 168, 1, 1);// DNSサーバ // **************** Wi-Fi設定 *************** const char *ssid = "##### SSID #####"; const char *password = "### PASSWORD ###"; // *********** IFTTT-WebHooks設定 *********** const char *iftttEvent1 = "iotMail";// IFTTT Event const char *iftttEvent2 = "iotData";// IFTTT Event const char *iftttKey = "##### IFTTT-KEY #####";// IFTTT Key const char *iftttHost = "maker.ifttt.com"; // IFTTT Server // ************ Beebotte-MQTT設定 *********** const char *clientID = "esp32_001"; const char *channelToken = "### TOKEN ###"; const char *topic = "TestChannel/resource1"; const char *mqtthost = "mqtt.beebotte.com"; // ################################################################ // ②IFTTT/Beebotte TLS証明書[2019.5時点データ] const char *ifttt_ca_cert = \ "-----BEGIN CERTIFICATE-----\n" \ "MIIGpzCCBY+gAwIBAgIIW2O1ayPtDEEwDQYJKoZIhvcNAQELBQAwgbQxCzAJBgNV\n" \ "BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRow\n" \ "GAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEtMCsGA1UECxMkaHR0cDovL2NlcnRz\n" \ "LmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMwMQYDVQQDEypHbyBEYWRkeSBTZWN1\n" \ "cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwHhcNMTgwOTA2MTcwMDE1WhcN\n" \ "MjAwOTI4MjIxMzU0WjA5MSEwHwYDVQQLExhEb21haW4gQ29udHJvbCBWYWxpZGF0\n" \ "ZWQxFDASBgNVBAMMCyouaWZ0dHQuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" \ "MIIBCgKCAQEA8c1HRaRBFWER/SG2eXN++ykWLSoCyJ1xcxOXy15Bk57WXGLIBZHn\n" \ "Y8/SN+H1KuUcN40KC35NuGhaQP43cELcBSG/BiYTlFPIAizauX2K9VZh+zWhwkgq\n" \ "y8bJ5+yvZKH5gwqNL248Y4gjwaPeU8o2K1xrFYWSfM/7kFQFul2goWOA3HIn5qE3\n" \ "NUsgxF8uLh2BSuJKQF73WDvM1zE86MIU20M9+PEo/pV5orIPZX/54cAZgXnr+59t\n" \ "KPL14Rl9qqTiptMJC8y2CIqKC9zHBwIwX4uYPOquom1oqAuItWgqAJwtC3z5a20r\n" \ "wbI2eNbDPdbeweT/4RtCjTwKlQuHmzeLbwIDAQABo4IDNTCCAzEwDAYDVR0TAQH/\n" \ "BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDgYDVR0PAQH/BAQD\n" \ "AgWgMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly9jcmwuZ29kYWRkeS5jb20vZ2Rp\n" \ "ZzJzMS04NjUuY3JsMF0GA1UdIARWMFQwSAYLYIZIAYb9bQEHFwEwOTA3BggrBgEF\n" \ "BQcCARYraHR0cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5\n" \ "LzAIBgZngQwBAgEwdgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8v\n" \ "b2NzcC5nb2RhZGR5LmNvbS8wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jZXJ0aWZpY2F0\n" \ "ZXMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS9nZGlnMi5jcnQwHwYDVR0jBBgwFoAU\n" \ "QMK9J47MNIMwojPX+2yz8LQsgM4wIQYDVR0RBBowGIILKi5pZnR0dC5jb22CCWlm\n" \ "dHR0LmNvbTAdBgNVHQ4EFgQUTv/uQ1GFjIW3WdcM3sn8fwtzoKQwggF9BgorBgEE\n" \ "AdZ5AgQCBIIBbQSCAWkBZwB1AKS5CZC0GFgUh7sTosxncAo8NZgE+RvfuON3zQ7I\n" \ "DdwQAAABZa/TxpgAAAQDAEYwRAIgdYZfhny1zdZj9H560jR5UrHgRn3ICcW1InPx\n" \ "zw8neN4CIEWuBSawq4hAhcBLMnfi+PW2OIj2J0WSMGSG9kxmpE4xAHYA7ku9t3XO\n" \ "YLrhQmkfq+GeZqMPfl+wctiDAMR7iXqo/csAAAFlr9PLqwAABAMARzBFAiA5I3ux\n" \ "1COAWE65DzDJUkG1KCdtlFD3XqLhjhozKthb9AIhAKIql04vTpqM5swE5YoO539r\n" \ "IUILnDZREGEYznWgKB13AHYAXqdz+d9WwOe1Nkh90EngMnqRmgyEoRIShBh1loFx\n" \ "RVgAAAFlr9PMhQAABAMARzBFAiBN0mgVDHNItBVC0zu85QRgcdJWmHPkzkp0un6x\n" \ "W6Mc4wIhALjsHONTT0w4kdik30ajXRZO82iTypNiLL+HNMRfsCJjMA0GCSqGSIb3\n" \ "DQEBCwUAA4IBAQBfJREWuoH4U1MIbufLfnkcuj5dfOcwwvCeUUQWibb97Xf0dvG6\n" \ "iGuYkJYLIHsf7d8eH7iHpWw/nJTu7P2XMwj4nohIzE6rxt7Ab/6ma6j/0sV2Vbx4\n" \ "aSloxa/6zXcZ1T/UlQqtD7PLNNcFDJYACQeo8BYzSsCO6HSpltBrbaRYNAvn1Dbo\n" \ "F73XIMqc/K60UGehrMYV/9D0/cTyk6Z6OtLXnUxD9kgYugR06drmQ6a0anJETcCS\n" \ "Bsa/pZc1HMb34v0eOz7UB2Eo0V4Qnng3ulzVajS5crRvO1lR/flg5Pv+YMmucreQ\n" \ "Dy8rstIiWXEa6liRoKEPIg3QDTcL3pfhSXty\n" \ "-----END CERTIFICATE-----\n" \ "-----BEGIN CERTIFICATE-----\n" \ "MIIE0DCCA7igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx\n" \ "EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT\n" \ "EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp\n" \ "ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMxMDUwMzA3\n" \ "MDAwMFowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH\n" \ "EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEtMCsGA1UE\n" \ "CxMkaHR0cDovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMwMQYDVQQD\n" \ "EypHbyBEYWRkeSBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIwggEi\n" \ "MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC54MsQ1K92vdSTYuswZLiBCGzD\n" \ "BNliF44v/z5lz4/OYuY8UhzaFkVLVat4a2ODYpDOD2lsmcgaFItMzEUz6ojcnqOv\n" \ "K/6AYZ15V8TPLvQ/MDxdR/yaFrzDN5ZBUY4RS1T4KL7QjL7wMDge87Am+GZHY23e\n" \ "cSZHjzhHU9FGHbTj3ADqRay9vHHZqm8A29vNMDp5T19MR/gd71vCxJ1gO7GyQ5HY\n" \ "pDNO6rPWJ0+tJYqlxvTV0KaudAVkV4i1RFXULSo6Pvi4vekyCgKUZMQWOlDxSq7n\n" \ "eTOvDCAHf+jfBDnCaQJsY1L6d8EbyHSHyLmTGFBUNUtpTrw700kuH9zB0lL7AgMB\n" \ "AAGjggEaMIIBFjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV\n" \ "HQ4EFgQUQMK9J47MNIMwojPX+2yz8LQsgM4wHwYDVR0jBBgwFoAUOpqFBxBnKLbv\n" \ "9r0FQW4gwZTaD94wNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8v\n" \ "b2NzcC5nb2RhZGR5LmNvbS8wNQYDVR0fBC4wLDAqoCigJoYkaHR0cDovL2NybC5n\n" \ "b2RhZGR5LmNvbS9nZHJvb3QtZzIuY3JsMEYGA1UdIAQ/MD0wOwYEVR0gADAzMDEG\n" \ "CCsGAQUFBwIBFiVodHRwczovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkv\n" \ "MA0GCSqGSIb3DQEBCwUAA4IBAQAIfmyTEMg4uJapkEv/oV9PBO9sPpyIBslQj6Zz\n" \ "91cxG7685C/b+LrTW+C05+Z5Yg4MotdqY3MxtfWoSKQ7CC2iXZDXtHwlTxFWMMS2\n" \ "RJ17LJ3lXubvDGGqv+QqG+6EnriDfcFDzkSnE3ANkR/0yBOtg2DZ2HKocyQetawi\n" \ "DsoXiWJYRBuriSUBAA/NxBti21G00w9RKpv0vHP8ds42pM3Z2Czqrpv1KrKQ0U11\n" \ "GIo/ikGQI31bS/6kA1ibRrLDYGCD+H1QQc7CoZDDu+8CL9IVVO5EFdkKrqeKM+2x\n" \ "LXY2JtwE65/3YR8V3Idv7kaWKK2hJn0KCacuBKONvPi8BDAB\n" \ "-----END CERTIFICATE-----\n" \ ; const char *beebottle_ca_cert = \ "-----BEGIN CERTIFICATE-----\n" \ "MIIFWDCCBECgAwIBAgIQc+iqrz6j/mo1ROEggN1a9TANBgkqhkiG9w0BAQsFADCB\n" \ "kDELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n" \ "A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxNjA0BgNV\n" \ "BAMTLUNPTU9ETyBSU0EgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD\n" \ "QTAeFw0xNDA4MDQwMDAwMDBaFw0xOTA4MDMyMzU5NTlaMFUxITAfBgNVBAsTGERv\n" \ "bWFpbiBDb250cm9sIFZhbGlkYXRlZDEUMBIGA1UECxMLUG9zaXRpdmVTU0wxGjAY\n" \ "BgNVBAMTEW1xdHQuYmVlYm90dGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" \ "MIIBCgKCAQEA1CXVd9uNvtbjwOsBWQJXBSInzP7adEhENtCSvncIli5GaelOBslm\n" \ "XgwPfrorxFItoDtFNvHpuSgORZU01mhzGLSGTP781DpeFhuPlBUr8QvCDnykX8wP\n" \ "siLBJQkU9Ryo5qF2S07ABMimnuBB7E+LAd3PGABEe0PAJd/N1PstDJJEW5fwgJfy\n" \ "eoVM1qL/dKZ10HjwS1e0rxa0oT7oYrv48Vfh76nc83t7ogqUIwBzH6RqPH/OYZ0P\n" \ "K42XcVo2n4G4ljV+I+G7qLd4ltsFK2aXgW2wbj38+Prn/qY4oLMIyrQI7NU+ROwI\n" \ "Vd8Ph1PGlv6ldjTcEGFVfKMusIUkFSb0+wIDAQABo4IB5jCCAeIwHwYDVR0jBBgw\n" \ "FoAUkK9qOpRaC9iQ6hJWc99DtDoo2ucwHQYDVR0OBBYEFIQkJfpBIb+8Fuk9YlvY\n" \ "7brK+30eMA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQG\n" \ "CCsGAQUFBwMBBggrBgEFBQcDAjBQBgNVHSAESTBHMDsGDCsGAQQBsjEBAgEDBDAr\n" \ "MCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8ubmV0L0NQUzAIBgZn\n" \ "gQwBAgEwVAYDVR0fBE0wSzBJoEegRYZDaHR0cDovL2NybC5jb21vZG9jYS5jb20v\n" \ "Q09NT0RPUlNBRG9tYWluVmFsaWRhdGlvblNlY3VyZVNlcnZlckNBLmNybDCBhQYI\n" \ "KwYBBQUHAQEEeTB3ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LmNvbW9kb2NhLmNv\n" \ "bS9DT01PRE9SU0FEb21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCQG\n" \ "CCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wMwYDVR0RBCwwKoIR\n" \ "bXF0dC5iZWVib3R0ZS5jb22CFXd3dy5tcXR0LmJlZWJvdHRlLmNvbTANBgkqhkiG\n" \ "9w0BAQsFAAOCAQEAMi2wfDj1bxWbkUUXP07XP9SA12zYrwUXvf+ft3r4FTFXkEXz\n" \ "dKrGHPfa/Y83ZIU5qJzysHq96kegJ81W0mGDd87zkaVJqWGzGzJHw9+mEfwv2X6+\n" \ "TAvXEMB3ly7KG1iEpALo3oj7ksUbNUy1ArAtdvna9ieVdR5lJN1sQpL76UqN7cS+\n" \ "Af8wq3+ErQkkwz45njQNIGoyOqZ8DhNX/rbUsgwuY+i7mhTMR8heG4t3pfYS6K8A\n" \ "6XiO0i2LHrgQ3KWTnKHGABHQe5ahkE0u8TEWZ5Ut92Uw13FJ+ltolG1F9W/udSeH\n" \ "kT9UpgO0CHEsi3MljGVOk74A2aCUPk7Swfin0w==\n" \ "-----END CERTIFICATE-----\n" \ "-----BEGIN CERTIFICATE-----\n" \ "MIIGCDCCA/CgAwIBAgIQKy5u6tl1NmwUim7bo3yMBzANBgkqhkiG9w0BAQwFADCB\n" \ "hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G\n" \ "A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV\n" \ "BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTQwMjEy\n" \ "MDAwMDAwWhcNMjkwMjExMjM1OTU5WjCBkDELMAkGA1UEBhMCR0IxGzAZBgNVBAgT\n" \ "EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR\n" \ "Q09NT0RPIENBIExpbWl0ZWQxNjA0BgNVBAMTLUNPTU9ETyBSU0EgRG9tYWluIFZh\n" \ "bGlkYXRpb24gU2VjdXJlIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n" \ "ADCCAQoCggEBAI7CAhnhoFmk6zg1jSz9AdDTScBkxwtiBUUWOqigwAwCfx3M28Sh\n" \ "bXcDow+G+eMGnD4LgYqbSRutA776S9uMIO3Vzl5ljj4Nr0zCsLdFXlIvNN5IJGS0\n" \ "Qa4Al/e+Z96e0HqnU4A7fK31llVvl0cKfIWLIpeNs4TgllfQcBhglo/uLQeTnaG6\n" \ "ytHNe+nEKpooIZFNb5JPJaXyejXdJtxGpdCsWTWM/06RQ1A/WZMebFEh7lgUq/51\n" \ "UHg+TLAchhP6a5i84DuUHoVS3AOTJBhuyydRReZw3iVDpA3hSqXttn7IzW3uLh0n\n" \ "c13cRTCAquOyQQuvvUSH2rnlG51/ruWFgqUCAwEAAaOCAWUwggFhMB8GA1UdIwQY\n" \ "MBaAFLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBSQr2o6lFoL2JDqElZz\n" \ "30O0Oija5zAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNV\n" \ "HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGwYDVR0gBBQwEjAGBgRVHSAAMAgG\n" \ "BmeBDAECATBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLmNvbW9kb2NhLmNv\n" \ "bS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDBxBggrBgEFBQcB\n" \ "AQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9E\n" \ "T1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21v\n" \ "ZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIBAE4rdk+SHGI2ibp3wScF9BzWRJ2p\n" \ "mj6q1WZmAT7qSeaiNbz69t2Vjpk1mA42GHWx3d1Qcnyu3HeIzg/3kCDKo2cuH1Z/\n" \ "e+FE6kKVxF0NAVBGFfKBiVlsit2M8RKhjTpCipj4SzR7JzsItG8kO3KdY3RYPBps\n" \ "P0/HEZrIqPW1N+8QRcZs2eBelSaz662jue5/DJpmNXMyYE7l3YphLG5SEXdoltMY\n" \ "dVEVABt0iN3hxzgEQyjpFv3ZBdRdRydg1vs4O2xyopT4Qhrf7W8GjEXCBgCq5Ojc\n" \ "2bXhc3js9iPc0d1sjhqPpepUfJa3w/5Vjo1JXvxku88+vZbrac2/4EjxYoIQ5QxG\n" \ "V/Iz2tDIY+3GH5QFlkoakdH368+PUq4NCNk+qKBR6cGHdNXJ93SrLlP7u3r7l+L4\n" \ "HyaPs9Kg4DdbKDsx5Q5XLVq4rXmsXiBmGqW5prU5wfWYQ//u+aen/e7KJD2AFsQX\n" \ "j4rBYKEMrltDR5FL1ZoXX/nUh8HCjLfn4g8wGTeGrODcQgPmlKidrv0PJFGUzpII\n" \ "0fxQ8ANAe4hZ7Q7drNJ3gjTcBpUC2JD5Leo31Rpg0Gcg19hCC0Wvgmje3WYkN5Ap\n" \ "lBlGGSW4gNfL1IYoakRwJiNiqZ+Gb7+6kHDSVneFeO/qJakXzlByjAA6quPbYzSf\n" \ "+AZxAeKCINT+b72x\n" \ "-----END CERTIFICATE-----\n" \ "-----BEGIN CERTIFICATE-----\n" \ "MIIFdDCCBFygAwIBAgIQJ2buVutJ846r13Ci/ITeIjANBgkqhkiG9w0BAQwFADBv\n" \ "MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk\n" \ "ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF\n" \ "eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow\n" \ "gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\n" \ "BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD\n" \ "VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkq\n" \ "hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkehUktIKVrGsDSTdxc9EZ3SZKzejfSNw\n" \ "AHG8U9/E+ioSj0t/EFa9n3Byt2F/yUsPF6c947AEYe7/EZfH9IY+Cvo+XPmT5jR6\n" \ "2RRr55yzhaCCenavcZDX7P0N+pxs+t+wgvQUfvm+xKYvT3+Zf7X8Z0NyvQwA1onr\n" \ "ayzT7Y+YHBSrfuXjbvzYqOSSJNpDa2K4Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt\n" \ "4Q08RWD8MpZRJ7xnw8outmvqRsfHIKCxH2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIq\n" \ "m1y9TBsoilwie7SrmNnu4FGDwwlGTm0+mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g/\n" \ "vOldxJuvRZnio1oktLqpVj3Pb6r/SVi+8Kj/9Lit6Tf7urj0Czr56ENCHonYhMsT\n" \ "8dm74YlguIwoVqwUHZwK53Hrzw7dPamWoUi9PPevtQ0iTMARgexWO/bTouJbt7IE\n" \ "IlKVgJNp6I5MZfGRAy1wdALqi2cVKWlSArvX31BqVUa/oKMoYX9w0MOiqiwhqkfO\n" \ "KJwGRXa/ghgntNWutMtQ5mv0TIZxMOmm3xaG4Nj/QN370EKIf6MzOi5cHkERgWPO\n" \ "GHFrK+ymircxXDpqR+DDeVnWIBqv8mqYqnK8V0rSS527EPywTEHl7R09XiidnMy/\n" \ "s1Hap0flhFMCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTvA73g\n" \ "JMtUGjAdBgNVHQ4EFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQD\n" \ "AgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1UdHwQ9\n" \ "MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4dGVy\n" \ "bmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6\n" \ "Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAGS/g/FfmoXQ\n" \ "zbihKVcN6Fr30ek+8nYEbvFScLsePP9NDXRqzIGCJdPDoCpdTPW6i6FtxFQJdcfj\n" \ "Jw5dhHk3QBN39bSsHNA7qxcS1u80GH4r6XnTq1dFDK8o+tDb5VCViLvfhVdpfZLY\n" \ "Uspzgb8c8+a4bmYRBbMelC1/kZWSWfFMzqORcUx8Rww7Cxn2obFshj5cqsQugsv5\n" \ "B5a6SE2Q8pTIqXOi6wZ7I53eovNNVZ96YUWYGGjHXkBrI/V5eu+MtWuLt29G9Hvx\n" \ "PUsE2JOAWVrgQSQdso8VYFhH2+9uRv0V9dlfmrPb2LjkQLPNlzmuhbsdjrzch5vR\n" \ "pu/xO28QOG8=\n" \ "-----END CERTIFICATE-----\n" \ "-----BEGIN CERTIFICATE-----\n" \ "MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU\n" \ "MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs\n" \ "IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290\n" \ "MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux\n" \ "FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h\n" \ "bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v\n" \ "dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt\n" \ "H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9\n" \ "uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX\n" \ "mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX\n" \ "a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN\n" \ "E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0\n" \ "WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD\n" \ "VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0\n" \ "Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU\n" \ "cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx\n" \ "IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN\n" \ "AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH\n" \ "YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5\n" \ "6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC\n" \ "Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX\n" \ "c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a\n" \ "mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=\n" \ "-----END CERTIFICATE-----\n" \ ; |
(3)ifttt_webhooks.ino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
// ①IFTTT WEBHOOKS処理 bool iftttWebhoos (String jobType) { String iftttEvent = ""; if (jobType == "MAIL") { iftttEvent = String(iftttEvent1); } else if (jobType == "CLOUD") { iftttEvent = String(iftttEvent2); } else { return false; } // ②URL決定 maker.ifttt.com/trigger/{event}/with/key/{key} String pathUrl = "/trigger/" + String(iftttEvent) + "/with/key/" + String(iftttKey); String json = makeIftttValue(); delay(10); // ③LED消灯(処理中が判別できるように消灯している) digitalWrite(LED_PIN, false);// 処理中はLED消灯 // ④HTTPS接続と結果判定 if (!wifiClientHttps.connect(iftttHost, 443)) { // ⑤HTTPS接続失敗時のシリアルモニタ表示 Serial.println("Connection failed!"); } else { // ⑥HTTPS接続成功時のシリアルモニタ表示 Serial.println("Connected to ifttt! :" + pathUrl ); // ⑦HTTPSデータ送信処理 wifiClientHttps.println("POST https://" + String( iftttHost ) + pathUrl + " HTTP/1.1"); wifiClientHttps.println("Host: " + String(iftttHost) + ":443"); wifiClientHttps.println("Content-Type: application/json"); wifiClientHttps.println("Connection: Keep-Alive"); wifiClientHttps.println("Content-Length: "+ String(json.length())); wifiClientHttps.println(""); wifiClientHttps.println(json); // ⑧HTTPS接続確認 if (wifiClientHttps.connected()) { // ⑨ヘッダの受信表示処理 Serial.println("--- Header ---"); while (1) { String line = wifiClientHttps.readStringUntil('\n'); Serial.println(line); if (line == "\r") { break; // ヘッダの末尾は\r\nのため、\r時に終了 } } // ⑩本文(Body)の受信表示処理 Serial.println("--- Body ---"); while (wifiClientHttps.available()) { char c = wifiClientHttps.read(); Serial.write(c); } } // ⑪HTTPS通信の終了 wifiClientHttps.stop(); } // ⑫終了処理(LED点灯、シリアルモニタ表示) digitalWrite(LED_PIN, true); return true; } // ⑬IFTTT送信データ作成 String makeIftttValue() { String value1 = getTimeStr(); String value2 = makeSensorStr(2); // JobType:2 IFTTT-WebHooks用文字作成 String makeMassage ="{\"value1\":\"" + value1 + "\",\"value2\":\"" + value2 + "\"}"; Serial.println(makeMassage); return makeMassage; } // ⑭時間情報取得 String getTimeStr(){ time_t n = time(NULL); time_t t; struct tm timeInfo; // NTP時刻を格納するオブジェクト getLocalTime(&timeInfo); char s[20]; const char* format = "%04d-%02d-%02d_%02d:%02d:%02d"; getLocalTime(&timeInfo); sprintf(s, format, timeInfo.tm_year + 1900, timeInfo.tm_mon + 1, timeInfo.tm_mday, timeInfo.tm_hour, timeInfo.tm_min, timeInfo.tm_sec); if ( (int)(timeInfo.tm_year + 1900) < 2000) { return "adjust..."; } else { return s; } } |
(4)irRecvSend.ino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
// ①赤外線受信(信号受信 or 15秒間を処理) bool setRemocon (String setNumStr) { // ②利用する変数を宣言 unsigned short irCount = 0; // HIGH,LOWの信号数 uint32_t lastt = 0; // 1つ前の経過時間を保持 uint32_t deltt = 0; // 1つ前の経過時間を保持 uint32_t sMilli; // 本処理の開始時間 uint32_t wMilli; // 赤外線の待ち開始時間 uint32_t sMicro; // 処理の開始時間 uint32_t cMicro; // 現在時間 bool rState = 0; // 赤外線受信モジュールの状態 0:LOW,1:HIGH // ③現在の時間をミリ秒で取得 sMilli = millis(); // ④特定条件(信号受信 or 30秒経過)するまで無限ループ while(1) { // ⑤Ir受信を待つ開始時間を取得 wMilli = millis(); // ⑥反転信号の受信待ち while (digitalRead(IR_R_PIN) == rState) { // ⑦待ち始めて0.5秒以上経過したら if (millis() - wMilli > 500) { // ⑧待ち始めて0.5秒以上経過したら if ( irCount > 10 ) { Serial.println(""); Serial.println("recvOK!"); delay(1); // ⑨ボタン名をEEPROMへ、リモコンデータをファイルへ保存 if (saveIr( (irCount - 1), setNumStr )) { // ⑩正常に終了 Serial.println("setRemocon OK"); return true; // ⑪正常に完了 } else { // ⑫信号受信に失敗 Serial.println("setRemocon NG"); return false; // 失敗終了 } } // ⑬0,1信号が10個以上ない場合は雑音のため再度ゼロから受信 irCount = 0; } // ⑭処理が15秒以上経過したらタイムアウト if ( millis() - sMilli > 15000 ) { Serial.println("setRemocon T.O."); return false; // ⑮15秒経過で失敗終了(受信なし) } } // ⑯信号受信開始時の現在の時間や経過時間を取得 if ( irCount == 0 ) { sMicro = micros(); lastt = 0; irCount++; Serial.print("ir:"); // ⑰信号受信処理開始後の処理(irCountが1以上) } else { // ⑱赤外線受信部の状態変化が最後に変化した時間からの経過時間を計算 cMicro = micros(); deltt = ( (cMicro - sMicro)/ 10 ) - lastt; irData[(irCount - 1 )] = deltt; // ⑲次回経過時間計算のため最後に変化した経過時間を保存 lastt = lastt + deltt; irCount++; Serial.print( deltt ); Serial.print(","); } // ⑳次回While内で状態変化を検知する値を変更 rState = !rState; } } // ㉑ボタン名をEEPROMへ、リモコンデータをファイルへ保存 bool saveIr(unsigned short irLength, String setNumStr){ // ㉒ボタン番号チェック if (setNumStr == "") { return false; } // ㉓リモコン信号を保存するためファイル名を作成(ファイル名はボタン番号) String t_file = "/" + setNumStr; Serial.println( "recvFile:" + t_file); // ㉔ファイルを書き込みモードで開く File fw = SPIFFS.open(t_file.c_str(), "w"); // ㉕リモコン信号の長さを最初に書き込み(最初の行) fw.println( String( irLength, HEX ) ); // ㉖リモコン信号の0,1の時間長さを書き込み(2行目以降) for (int i = 0; i < irLength; i++) { fw.println( String( irData[i], HEX ) ); } // ㉗書き込みが完了したのでファイルを閉じる fw.close(); // ㉘正常に処理が完了したのでtrueを返す return true; } // ㉙赤外線送信処理 bool contRemocon (String setNumStr) { // 送信番号保存 // ㉚変数宣言 unsigned short irCount = 0; // HIGH,LOWの信号数 unsigned long l_now = 0; // 送信開始時間を保持 unsigned long sndt = 0; // 送信開始からの経過時間 // ㉛リモコン信号をファイルから取得(ファイル名はボタン番号) String t_file = "/" + setNumStr; Serial.println( "sendFile:" + t_file); // ㉜ファイルを開く File fr = SPIFFS.open(t_file.c_str(), "r"); // ㉝ファイルを開く if(!fr || fr.isDirectory()){ Serial.println("FileOpen NG"); return false; } // ㉞最初の1行のみ読み出し信号長さ(0,1の数)を取得 String snum = fr.readStringUntil('\n'); // ㉟1行目の文字列を数値型に変換 irCount = strtol(snum.c_str(), NULL, 16); Serial.print( "sendData:" + String(irCount)); // ㊱一旦ファイルから変数irDataに読み出し保存 for (int i = 0; i < irCount; i++) { snum = fr.readStringUntil('\n'); irData[i] = strtol(snum.c_str(), NULL, 16); } fr.close(); // ㊲送信開始時間を取得 l_now = micros(); // ㊳0,1の信号回数分をFor文でループ for (int i = 0; i < irCount; i++) { // ㊴送信開始からの信号終了時間を計算 sndt += irData[i]; do { // ㊵iが偶数なら赤外線ON、奇数ならOFFのまま // キャリア周波数38kHz(約26μSec周期の半分)でON時間で送信 digitalWrite(IR_S_PIN, !(i&1)); microWait(13); // ㊶キャリア周波数38kHz(約26μSec周期の半分)でOFF時間で送信 digitalWrite(IR_S_PIN, 0); microWait(13); // ㊷送信開始からの信号終了時間が超えるまでループ } while (long(l_now + (sndt * 10) - micros()) > 0); } // ㊸正常に終了したので、trueを返答 Serial.println(":End"); return true; } // ㊹マイクロ秒単位で待つ void microWait(signed long waitTime) { unsigned long waitStartMicros = micros(); while (micros() - waitStartMicros < waitTime) {}; } |
環境設定
Scratch3Remocon.inoファイル内には以下の設定を実施しESP32-DevKitCにスケッチを書き込みして下さい。
(1)SSIDとパスワードの設定
以下の行を書き換えて自宅の接続するSSIDとパスワードを設定して下さい。
1 2 |
const char *ssid = "##### SSID #####"; const char *password = "### PASSWORD ###"; |
(2)工作キットのIPアドレス
以下の行を書き換えて工作キットのIPアドレスを設定して下さい。
1 2 3 4 |
IPAddress ip(192, 168, 1, 123); // IPアドレス(本機が利用するIP) IPAddress gateway(192, 168, 1, 1); // デフォルトゲートウェイ IPAddress subnet(255, 255, 255, 0); // サブネットマスク IPAddress dnsserver(192, 168, 1, 1);// DNSサーバ |
【本IPアドレスをScratch3.0で設定する必要があります。】
《IPアドレス設定時の注意事項》
(1)IPアドレスはインターネット上の住所となるため、他キットと重複しないように値を付与してください。
(123を他の端末やキットで利用している場合は124など他の番号をつけてください)
(2)「192.168.1.」の部分は接続するネットワークアドレスと同じ値に設定してください。
(同じネットワークに接続されている端末が192.168.0.xの場合は192.168.0.123など「192.168.0.」の部分は同じものにしてください)