6-3-1.Scratch1.4用ESP32-DevKitC環境構築 インターネットあり
ESP32-DevKitC環境構築
Scratch1.4用にESP32-DevKitC環境構築します。
本ページで利用するスケッチはESP32-DevKitCがインターネットに接続でき、時刻同期やIFTTTへアクセスできる必要があります。
ArduinoIDE環境構築
「ESP32-DevKitC」へスケッチ(プログラム)を書き込みにはArduinoIDEを利用します。
環境が準備できていない方はこちらを参照し構築して下さい。
また、必要なライブラリはこちらになりますので構築できていない方がインストールして下さい。
回路と配線
電子回路と配線図は全センサーが利用できるよう5-4「全センサー実装」を利用します。
【ESP32-DevKitCの入出力端子はこちらを参照下さい】
スケッチ(制御ソフトウェア)
Scrachと接続するための制御ソフトウェアは以下の2つとなります。
(1)SketchESP32EnNet.ino
(2)config.h
(3)ifttt_webhooks.ino
(4)irRecvSend.ino
こちら[2019.6.27版]からダウンロードして下さい。
また、IFTTTに関する設定はこちら、Beebotteに関する設定はこちらを参照ください。
(1)SketchESP32Enkaku.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 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 |
// IoT電子工作キット // 6-3-2. Scratch遠隔センサー接続用(インターネット接続あり) // ①ライブラリを読み込み #include <WiFi.h> #include <WiFiClient.h> #include <WiFiClientSecure.h> #include <FS.h> #include <SPIFFS.h> #include <DHT.h> // 「DHT sensor library by Adafruit」を個別にインストール #include <PubSubClient.h> // 「PubSubClient by Nick O'Leary」を個別にインストール #include <ArduinoJson.h> // 「ArduinoJson by Benolt Blanchon 5.13.5」ライブラリを個別にインストール #include "config.h" // ②PubSubClientライブラリでのパケットサイズ、KeepAlive時間を個別で変更 #define MQTT_MAX_PACKET_SIZE 1024 #define MQTT_KEEPALIVE 15 // ③IFTTT/Beebotteサーバ、Port設定 const char *iftttHost = "maker.ifttt.com"; // IFTTT Server const char *mqtthost = "mqtt.beebotte.com"; const int Port = 42001; //ScratchPCのPort番号(変更の必要なし) // ④ピン配置 const byte LED_PIN = 22; // LED緑 const byte IR_R_PIN = 36; // リモコン受信 const byte IR_S_PIN = 23; // リモコン送信 const byte LIGH_SNR = 39; // 照度センサ(A3) const byte TEMP_SNR = 21; // 温・湿度センサ // ⑤グローバル変数 bool ledFlag = true; // LED制御フラグ WiFiClient wifiClient; WiFiClientSecure wifiClientMqtt; // MQTT用 WiFiClientSecure wifiClientHttps; // HTTPS用 unsigned short irData[1500]; PubSubClient mqttClient(mqtthost, 8883, wifiClientMqtt); // ⑥SetUp処理(起動時に最初に処理) void setup(void) { // ⑦Serial/Port設定 Serial.begin(115200); Serial.println ( ); pinMode ( LED_PIN, OUTPUT ); pinMode(IR_S_PIN, OUTPUT); pinMode(IR_R_PIN, INPUT); // ⑧SPIFFS起動 if (!SPIFFS.begin()) { Serial.println(F("SPIFFS Failed")); // Failed mount delay(5000); ESP.restart(); } // ⑨無線Wi-Fi接続 Serial.print ( "Wi-Fi Connectting ." ); WiFi.begin ( ssid, password ); while ( WiFi.status() != WL_CONNECTED ) { ledFlag = !ledFlag; digitalWrite(LED_PIN, ledFlag); delay ( 1000 ); Serial.print ( "." ); } Serial.println ( "" ); Serial.print ( "Wi-Fi Connected! IP address: " ); Serial.println ( WiFi.localIP() ); digitalWrite ( LED_PIN, true ); // ⑩HTTPS用の証明書を設定 wifiClientMqtt.setCACert(beebottle_ca_cert); wifiClientHttps.setCACert(ifttt_ca_cert); // ⑪ScratchPCに接続(接続されるまでループ) while ( true ) { if (wifiClient.connect(Host, Port)) { Serial.print("Scratch PC Connection Success\n"); break; } else { Serial.print("Scratch PC Connecttion Failed\n"); } delay(5000); ESP.restart(); } // ⑫時刻同期(NTP)設定 configTime(9 * 3600L, 0, "ntp.nict.jp", "time.google.com", "ntp.jst.mfeed.ad.jp"); // ⑬Scratch制御「を送る」のプルダウン表示及び、変数利用のためメッセージ送信 sendMessage("broadcast \"LED_ON\" "); sendMessage("broadcast \"LED_OFF\" "); sendMessage("broadcast \"SENSOR_UPDATE\" "); sendMessage("broadcast \"SEND1\" "); sendMessage("broadcast \"SEND2\" "); sendMessage("broadcast \"SEND3\" "); sendMessage("broadcast \"RECV1\" "); sendMessage("broadcast \"RECV2\" "); sendMessage("broadcast \"RECV3\" "); sendMessage("broadcast \"IFTTT_WEBHOOKS\" "); sendMessage("sensor-update \"ONDO\" -50 \"SITUDO\" -1 \"SYODO\" -1 "); delay ( 1000 ); } // ⑭ScratchPCにメッセージ送信 void sendMessage(String sMessage){ // ⑮送信メッセージ作成(最初3ByteのLengthなどを追加して作成) char scmd[128] = {0}; strcpy(scmd+4, sMessage.c_str()); // 4Byte目からコピー scmd[3]=(uint8_t)strlen(scmd+4);// 3Byte目はLength if(0!=strlen(scmd+4)) { // Message長が0で無かったら Serial.print("Send message:"); for(uint32_t i = 0; i < 4 + strlen(scmd + 4); i++) { Serial.print(scmd[i]); } Serial.println(); // ⑯メッセージ送信処理(成功するまでループ) if (wifiClient.write((const uint8_t*)scmd, 4 + strlen(scmd+4))) { Serial.println("Send Message Success"); } else { Serial.println("Send Message Failed"); delay(5000); ESP.restart(); } } delay(150); } // ⑰loop処理(起動中、繰り返し処理) void loop() { // ⑱MQTT状態を確認し接続状態でなかったらMQTT接続処理 if (!mqttClient.connected()) { reconnect(); } mqttClient.loop(); // ⑲メッセージ受信処理(Scratchからのメッセージを受信) uint8_t bufUint[128] = {0}; uint32_t len = wifiClient.readBytes(bufUint, sizeof(bufUint)); if (len > 0) { String rMessage; for(uint32_t i = 4; i < len; i++) { // Length情報を除いて4Byte目から取得 rMessage.concat(String((char)bufUint[i])); } Serial.print("Received:["); Serial.print(rMessage); Serial.print("]\r\n"); // ⑳メッセージ処理 if(rMessage.startsWith("broadcast")){ if(rMessage.indexOf("LED") > -1){ if(rMessage.indexOf("ON") > -1){ Serial.println("LED_ON"); digitalWrite ( LED_PIN, true ); } else if(rMessage.indexOf("OFF") > -1){ Serial.println("LED_OFF"); digitalWrite ( LED_PIN, false ); } } else if(rMessage.indexOf("SENSOR_UPDATE") > -1){ Serial.println("SENSOR_UPDATE"); updateSensor(); } else if(rMessage.indexOf("IFTTT_WEBHOOKS") > -1){ Serial.println("IFTTT_WEBHOOKS"); digitalWrite ( LED_PIN, false ); iftttWebhoos ( ); digitalWrite ( LED_PIN, true ); } else 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 ); } } } delay(1); } // ㉑センサー情報を送信しデータ更新 void updateSensor(){ String updateMessage = makeSensorStr(1); sendMessage(updateMessage); } // ㉒センサー情報取得 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 = "sensor-update \"ONDO\" " + String(int(g_temperature)) + " \"SITUDO\" " + String(int(g_humidity)) + " \"SYODO\" " + 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(2000); 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 |
// ①環境設定 // ####################### 環境に合わせて設定 ####################### // *************** Scratch設定 ************** const char* Host = "192.168.1.5"; //ScratchPCのIPアドレス // **************** Wi-Fi設定 *************** const char *ssid = "##### SSID #####"; const char *password = "### PASSWORD ###"; // *********** IFTTT-WebHooks設定 *********** //const char *iftttEvent = "iotMail";// IFTTT Event const char *iftttEvent = "iotData";// IFTTT Event const char *iftttKey = "##### IFTTT-KEY #####";// IFTTT Key // ************ Beebotte-MQTT設定 *********** const char *clientID = "esp32_001"; const char *channelToken = "### TOKEN ###"; const char *topic = "TestChannel/resource1"; // ################################################################ // ②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 |
// ①赤外線送信処理 void iftttWebhoos () { // ②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!\n"); // ⑦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); } // ⑬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 |
// ①赤外線受信(信号受信 or 30秒間を処理) void 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"); } else { // ⑪信号受信に失敗 Serial.println("setRemocon NG"); } return; // ⑫正常に完了 } // ⑬0,1信号が10個以上ない場合は雑音のため再度ゼロから受信 irCount = 0; } // ⑭処理が15秒以上経過したらタイムアウト if ( millis() - sMilli > 15000 ) { Serial.println("setRemocon T.O."); return; // ⑮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) {}; } |
環境設定
config.hファイル内の設定を環境に合わせて変更し、ESP32-DevKitC本体ににスケッチを書き込みして下さい。
《ScratchパソコンのIPアドレス確認方法》
①左下の「Windowsマーク」と「R」キーを押して、表示された窓に「cmd」を入力しリターン
②コマンドプロンプトに「ipconfig」と入力しIPv4アドレス(ScratchパソコンのIPアドレス)を確認します。