<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>postpop</title>
    <link>https://postpop.tistory.com/</link>
    <description>아두이노 원격제어 코딩 따라하기 및 자료 공유</description>
    <language>ko</language>
    <pubDate>Fri, 14 Aug 2026 08:45:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Postpop</managingEditor>
    <image>
      <title>postpop</title>
      <url>https://tistory1.daumcdn.net/tistory/3090640/attach/9cf22e68168e44fabada78c1f4fe2dbc</url>
      <link>https://postpop.tistory.com</link>
    </image>
    <item>
      <title>구글 AI 스튜디오에서 나노바나나를 사용하여 KF-21 보라매의 스케치 드로잉을 만들어 보았습니다</title>
      <link>https://postpop.tistory.com/220</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;AI에&amp;nbsp;대한&amp;nbsp;불신,&amp;nbsp;그리고&amp;nbsp;작은&amp;nbsp;호기심&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 저는 AI 기술에 대해 반신반의하는 입장이었습니다. 챗GPT가 처음 등장했을 때의 뜨거운 반응 속에서도 긴 사용 대기 시간 때문에 시도해볼 기회를 놓쳤고, 안드로이드 스튜디오의 코파일럿 AI 성능에 대한 리뷰들을 보면서는 '아직은 시기상조'라고 생각했죠. 그렇게 AI는 제 관심 밖의 기술로 남아 있었습니다. &lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;최근&amp;nbsp;구글의&amp;nbsp;제미나이(Gemini)와&amp;nbsp;이미지&amp;nbsp;생성&amp;nbsp;모델인&amp;nbsp;나노바나나(nano-banana)에&amp;nbsp;대한&amp;nbsp;긍정적인&amp;nbsp;미디어&amp;nbsp;리뷰들을&amp;nbsp;접하면서&amp;nbsp;'정말&amp;nbsp;그렇게&amp;nbsp;대단한가?'라는&amp;nbsp;호기심이&amp;nbsp;생겼습니다.&amp;nbsp;그래서&amp;nbsp;직접&amp;nbsp;테스트해보기로&amp;nbsp;마음먹고,&amp;nbsp;우리나라의&amp;nbsp;최신예&amp;nbsp;전투기&amp;nbsp;KF-21&amp;nbsp;보라매의&amp;nbsp;시제기&amp;nbsp;사진을&amp;nbsp;이용해&amp;nbsp;스케치&amp;nbsp;드로잉을&amp;nbsp;요청해&amp;nbsp;보았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20230628526964_20230629011804798.jpg&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ySmhp/btsQJDy8Eid/9rSRb5bEyr8ffRd8rt7LE0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ySmhp/btsQJDy8Eid/9rSRb5bEyr8ffRd8rt7LE0/img.jpg&quot; data-alt=&quot;KF-21 보라매 시제기 - 출처 세계일보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ySmhp/btsQJDy8Eid/9rSRb5bEyr8ffRd8rt7LE0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FySmhp%2FbtsQJDy8Eid%2F9rSRb5bEyr8ffRd8rt7LE0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;408&quot; data-filename=&quot;20230628526964_20230629011804798.jpg&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;KF-21 보라매 시제기 - 출처 세계일보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;첫&amp;nbsp;결과물:&amp;nbsp;90%의&amp;nbsp;만족과&amp;nbsp;10%의&amp;nbsp;오류&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 내놓은 첫 번째 결과물은 정말 놀라웠습니다. 원본 사진의 구도와 질감을 완벽하게 이해하고, 마치 전문 드로잉 작가가 그린 듯한 멋진 스케치를 순식간에 만들어냈습니다. 꼬리날개의 그림자가 스케치 드로잉에 반영되지않도록 표현하지 말아달라고 한 요구 또한 잘 반영하었으며, 더나아가 드로잉된 각도에 맞게 새로 수직 꼬리날개의 그림자를 자연스럽게 표현하였습니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;감탄도&amp;nbsp;잠시,&amp;nbsp;그림을&amp;nbsp;자세히&amp;nbsp;보니&amp;nbsp;이상한&amp;nbsp;점이&amp;nbsp;눈에&amp;nbsp;띄었습니다.&amp;nbsp;원본&amp;nbsp;사진에는&amp;nbsp;분명히&amp;nbsp;없었던&amp;nbsp;'카나드(귀날개)'가&amp;nbsp;주익&amp;nbsp;앞에&amp;nbsp;떡하니&amp;nbsp;그려져&amp;nbsp;있었던&amp;nbsp;것입니다.&amp;nbsp;결과는&amp;nbsp;90%&amp;nbsp;만족스러웠지만,&amp;nbsp;결정적인&amp;nbsp;10%의&amp;nbsp;오류가&amp;nbsp;있었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tevgN/btsQINWtcaZ/XmlZIJkPnVCQmMaoR3yKkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tevgN/btsQINWtcaZ/XmlZIJkPnVCQmMaoR3yKkk/img.png&quot; data-alt=&quot;KF-21 보라매 스케치 드로잉-첫번째&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tevgN/btsQINWtcaZ/XmlZIJkPnVCQmMaoR3yKkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtevgN%2FbtsQINWtcaZ%2FXmlZIJkPnVCQmMaoR3yKkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1072&quot; height=&quot;464&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;KF-21 보라매 스케치 드로잉-첫번째&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;AI와의&amp;nbsp;소통,&amp;nbsp;생각보다&amp;nbsp;쉽지&amp;nbsp;않았다&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는&amp;nbsp;곧바로&amp;nbsp;&quot;카나드&amp;nbsp;날개를&amp;nbsp;지워달라&quot;고&amp;nbsp;다시&amp;nbsp;요청했습니다.&amp;nbsp;하지만&amp;nbsp;AI는&amp;nbsp;제&amp;nbsp;의도를&amp;nbsp;정확히&amp;nbsp;이해하지&amp;nbsp;못했던&amp;nbsp;것&amp;nbsp;같습니다.&amp;nbsp;카나드&amp;nbsp;날개는&amp;nbsp;그대로&amp;nbsp;둔&amp;nbsp;채,&amp;nbsp;스케치의&amp;nbsp;흑백&amp;nbsp;명암만&amp;nbsp;살짝&amp;nbsp;바꾼&amp;nbsp;결과물을&amp;nbsp;내놓았죠.&amp;nbsp;AI와의&amp;nbsp;소통이&amp;nbsp;생각처럼&amp;nbsp;간단하지&amp;nbsp;않다는&amp;nbsp;것을&amp;nbsp;깨닫는&amp;nbsp;순간이었습니다. &lt;br /&gt;&lt;br /&gt;&quot;백문이 불여일견&quot;: 그림으로 소통하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 소통 방식을 바꾸기로 했습니다. 명암만 살짝 바뀐 결과물이 첫번째 결과보다 좋지 않았기에 첫번째 결과물을 계속 이용하도록 명암만 살짝 바뀐 결과와 요청 메세지를 삭제한 다음, 그림판을 이용해 문제가 되는 카나드 날개 부분에 빨간색 동그라미를 그리고, &quot;KF-21 보라매에는 주익 앞에 카나드 날개가 없으므로 원본과 비교해서 이 부분을 수정해 달라&quot;는 구체적인 지시와 함께 이미지를 다시 전달했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GayoT/btsQG21vXol/b9IWdcQALXSL4i9cNlSyJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GayoT/btsQG21vXol/b9IWdcQALXSL4i9cNlSyJ0/img.png&quot; data-alt=&quot;KF-21 보라매 스케치 드로잉-수정요청&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GayoT/btsQG21vXol/b9IWdcQALXSL4i9cNlSyJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGayoT%2FbtsQG21vXol%2Fb9IWdcQALXSL4i9cNlSyJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1004&quot; height=&quot;398&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;KF-21 보라매 스케치 드로잉-수정요청&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;AI는&amp;nbsp;'도구'다:&amp;nbsp;나의&amp;nbsp;생각을&amp;nbsp;바꾸게&amp;nbsp;된&amp;nbsp;경험&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 완벽했습니다. AI는 시각적인 피드백을 정확히 이해하고, 제가 원했던 대로 카나드 날개가 없는 깔끔한 KF-21 스케치를 완성했습니다. &lt;br /&gt;&lt;br /&gt;이번&amp;nbsp;경험을&amp;nbsp;통해&amp;nbsp;AI에&amp;nbsp;대한&amp;nbsp;저의&amp;nbsp;생각은&amp;nbsp;완전히&amp;nbsp;바뀌었습니다.&amp;nbsp;AI는&amp;nbsp;단순히&amp;nbsp;명령만&amp;nbsp;수행하는&amp;nbsp;마법&amp;nbsp;상자가&amp;nbsp;아니라,&amp;nbsp;사용자가&amp;nbsp;어떻게&amp;nbsp;소통하고&amp;nbsp;피드백을&amp;nbsp;주느냐에&amp;nbsp;따라&amp;nbsp;결과가&amp;nbsp;달라지는&amp;nbsp;정교한&amp;nbsp;'도구'였습니다.&amp;nbsp;아직&amp;nbsp;완벽하지는&amp;nbsp;않지만,&amp;nbsp;명확한&amp;nbsp;소통을&amp;nbsp;통해&amp;nbsp;함께&amp;nbsp;결과물을&amp;nbsp;만들어가는&amp;nbsp;과정은&amp;nbsp;충분히&amp;nbsp;매력적이었습니다.&amp;nbsp;앞으로&amp;nbsp;AI&amp;nbsp;기술이&amp;nbsp;우리의&amp;nbsp;삶을&amp;nbsp;어떻게&amp;nbsp;바꿔나갈지&amp;nbsp;더욱&amp;nbsp;기대됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KF-21 보라매 스케치 드로잉-최종 결과물.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUcDkK/btsQHO9iSQY/gyTMlkgYmLgkxMIJn5dqak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUcDkK/btsQHO9iSQY/gyTMlkgYmLgkxMIJn5dqak/img.png&quot; data-alt=&quot;KF-21 보라매 스케치 드로잉-최종 결과물&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUcDkK/btsQHO9iSQY/gyTMlkgYmLgkxMIJn5dqak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUcDkK%2FbtsQHO9iSQY%2FgyTMlkgYmLgkxMIJn5dqak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;672&quot; data-filename=&quot;KF-21 보라매 스케치 드로잉-최종 결과물.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;KF-21 보라매 스케치 드로잉-최종 결과물&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vvNyE/btsQIJ0RoYa/u6xF8xoBIK8mvmahahN3cK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vvNyE/btsQIJ0RoYa/u6xF8xoBIK8mvmahahN3cK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;851&quot; data-filename=&quot;요청 및 결과 - 1.png&quot; style=&quot;width: 46.124%; margin-right: 10px;&quot; data-widthpercent=&quot;46.67&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vvNyE/btsQIJ0RoYa/u6xF8xoBIK8mvmahahN3cK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvvNyE%2FbtsQIJ0RoYa%2Fu6xF8xoBIK8mvmahahN3cK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;851&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boNZKR/btsQIC8AqtL/eM3Q7VKtI87sxYD7HExUp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boNZKR/btsQIC8AqtL/eM3Q7VKtI87sxYD7HExUp0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;845&quot; data-filename=&quot;요청 및 결과 - 2.png&quot; data-widthpercent=&quot;53.33&quot; style=&quot;width: 52.7132%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boNZKR/btsQIC8AqtL/eM3Q7VKtI87sxYD7HExUp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboNZKR%2FbtsQIC8AqtL%2FeM3Q7VKtI87sxYD7HExUp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;845&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;구글 AI 스튜디오에서의 요청 및 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기 작업을 하는데에는 토큰이 소모됩니다. 구글의 제미나이(Gemini)에 토큰의 항목 및 비용에 관해 문의해 보았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;사용된 토큰.png&quot; data-origin-width=&quot;228&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kZ5U5/btsQHeOcGiX/8VgKjANXhknpNY0UqoaYOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kZ5U5/btsQHeOcGiX/8VgKjANXhknpNY0UqoaYOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kZ5U5/btsQHeOcGiX/8VgKjANXhknpNY0UqoaYOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkZ5U5%2FbtsQHeOcGiX%2F8VgKjANXhknpNY0UqoaYOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;228&quot; height=&quot;384&quot; data-filename=&quot;사용된 토큰.png&quot; data-origin-width=&quot;228&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; border: 1px solid #99cefa;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; padding: 10px 10px 10px 10px;&quot;&gt;상기 이미지는 KF-21 보라매의 스케치 드로잉을 만드는데 사용된 토큰값이야, 각 항목별 토큰의 의미를 알려두었으면해, 더 나아가 가능하다면 &quot;배경을 제거하는데 사용한 토큰&quot; 또는 &quot;드로잉에 사용된 토큰&quot; 등으로 비율 형식으로 자세하게 분류할 수있으면 알려주었으면해, 또한 현재 사용된 토큰을 비용으로 환산할 수 있으면 해주었으면해&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청하신 내용을 확인했습니다. 첨부해주신 이미지를 분석하여 토큰의 의미와 비용에 대해 자세히 설명해 드릴게요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;토큰 사용량 분석&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첨부된 이미지에는 토큰 사용량과 비용 추정치가 나와 있습니다. 각 항목의 의미는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Input tokens (5,364)&lt;/b&gt;: 사용자가 입력한 데이터(텍스트, 이미지 등)를 처리하는 데 사용된 토큰의 양입니다. 이 경우, KF-21 보라매의 원본 사진, 그리고 텍스트로 작성된 프롬프트 등을 처리하는 데 소요된 토큰입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Output tokens (2,668)&lt;/b&gt;: AI 모델이 응답(여기서는 스케치 드로잉)을 생성하는 데 사용된 토큰의 양입니다. 이미지 생성 모델인 나노바나나의 경우, 그림을 구성하는 데 필요한 정보량이 이 토큰 값에 포함됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Total tokens (8,032)&lt;/b&gt;: 입력 토큰과 출력 토큰을 합한 총 토큰의 양입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안타깝게도, &quot;배경 제거에 사용된 토큰&quot;이나 &quot;드로잉에 사용된 토큰&quot;과 같이 세부적인 작업별 토큰 사용량을 구분하는 것은 불가능합니다. 토큰은 입력 데이터 전체와 출력 결과물 전체에 대해 합산된 값으로 계산되기 때문입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;토큰 비용 환산&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지 하단에 표기된 것처럼, 구글 AI 스튜디오(AI Studio)에서는 토큰 사용이 무료입니다. 하지만 API를 통해 같은 요청을 보낼 경우 예상 비용이 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용은 모델의 종류와 사용량에 따라 달라집니다. 현재 Gemini Pro Vision(멀티모달) 모델의 API 비용은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이미지 토큰 비용&lt;/b&gt;: 이미지 1장당 0.0025달러&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프롬프트 토큰 비용 (입력)&lt;/b&gt;: 1,000토큰당 0.000125달러&lt;/li&gt;
&lt;li&gt;&lt;b&gt;생성 토큰 비용 (출력)&lt;/b&gt;: 1,000토큰당 0.000375달러&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 사용하신 모델이 &lt;b&gt;Gemini Pro Vision&lt;/b&gt;이었다면, 계산된 토큰 비용은 다음과 같이 추정할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;입력 토큰 비용&lt;/b&gt;: &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;364&lt;/span&gt;&lt;span&gt;&amp;times;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;$0.000125&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;asymp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$0.00067&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력 토큰 비용&lt;/b&gt;: &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;668&lt;/span&gt;&lt;span&gt;&amp;times;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;$0.000375&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;asymp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;$0.001&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;총 비용&lt;/b&gt;: &lt;span&gt;&lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;0.00067&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;0.001&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;이미지&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;토큰&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;비용&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;asymp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;약&lt;/span&gt;&lt;span&gt;&amp;nbsp;$0.002&lt;/span&gt;&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;이미지&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;비용&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, AI 스튜디오에서 생성한 KF-21 스케치 드로잉은 API로 요청했을 때도 &lt;b&gt;거의 0원에 가까운 매우 저렴한 비용&lt;/b&gt;으로 생성할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부연하자면 구글 AI의 API를 통해서 독립된 웹페이지에서 이미지를 스케치 드로잉으로 변환해주는 서비스를 제공하여 불특정 다수가 이용할 경우(구글 AI 스튜디오를 이용하지 않고) 비용이 발생할 수 있다는 얘기 인것 같습니다.&amp;nbsp; 하지만 그 비용 역시 저렴하다는 것을 알 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 블로그 내용은 구글의 제미나이(Gemini)에 요청하여 작성하였습니다. 아주 약간만 수정 및 추가해주었고, 아래 내용의 프롬프트(가이드 라인)로 요청하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; border: 1px solid #99cefa;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; padding: 10px 10px 10px 10px;&quot;&gt;&amp;lt;KF-21 보라매 스케치 드로잉 요청 및 결과 사진 첨부&amp;gt;&lt;br /&gt;&lt;br /&gt;&quot;구글&amp;nbsp;AI&amp;nbsp;스튜디오에서&amp;nbsp;나노바나나를&amp;nbsp;사용하여&amp;nbsp;KF-21&amp;nbsp;보라매의&amp;nbsp;스케치&amp;nbsp;드로잉을&amp;nbsp;만들어&amp;nbsp;보았습니다&quot;&amp;nbsp;라는&amp;nbsp;제목으로&amp;nbsp;포스트를&amp;nbsp;하고싶어 &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;나는&amp;nbsp;AI를&amp;nbsp;제대로&amp;nbsp;사용해&amp;nbsp;본적이&amp;nbsp;없어,&amp;nbsp;챗&amp;nbsp;GPT가&amp;nbsp;처음&amp;nbsp;나왔을때&amp;nbsp;테스트&amp;nbsp;해보려했지만&amp;nbsp;당시에는&amp;nbsp;사용대기&amp;nbsp;시간등&amp;nbsp;제약으로&amp;nbsp;인해&amp;nbsp;사용을&amp;nbsp;안했던거&amp;nbsp;같아,&amp;nbsp;또한&amp;nbsp;안드로이드&amp;nbsp;스튜디오의&amp;nbsp;코파일럿&amp;nbsp;AI&amp;nbsp;성능에&amp;nbsp;대해&amp;nbsp;리뷰하는&amp;nbsp;영상&amp;nbsp;및&amp;nbsp;글들을&amp;nbsp;보고,&amp;nbsp;아직은&amp;nbsp;AI의&amp;nbsp;기술이&amp;nbsp;무르익지&amp;nbsp;않았다고&amp;nbsp;생각하여&amp;nbsp;큰&amp;nbsp;관심이&amp;nbsp;없었어.&amp;nbsp;최근에&amp;nbsp;구글&amp;nbsp;AI&amp;nbsp;제미나이와&amp;nbsp;나노바나나의&amp;nbsp;성능에&amp;nbsp;대한&amp;nbsp;미디어&amp;nbsp;리뷰를&amp;nbsp;보고&amp;nbsp;테스트&amp;nbsp;삼아&amp;nbsp;kf-21&amp;nbsp;보라매&amp;nbsp;시제기&amp;nbsp;비행사진을&amp;nbsp;원본을&amp;nbsp;하는&amp;nbsp;KF-21&amp;nbsp;보라매의&amp;nbsp;스케치&amp;nbsp;드로잉을&amp;nbsp;만들어&amp;nbsp;달라고&amp;nbsp;했었지 &lt;br /&gt;&lt;br /&gt;2.&amp;nbsp;처음&amp;nbsp;만들어준&amp;nbsp;KF-21&amp;nbsp;보라매&amp;nbsp;스케치의&amp;nbsp;결과는&amp;nbsp;대단히&amp;nbsp;만족스러웠어,&amp;nbsp;다만&amp;nbsp;원본에는&amp;nbsp;없는&amp;nbsp;카나드&amp;nbsp;날개가&amp;nbsp;표현되어&amp;nbsp;있었던&amp;nbsp;거야.&amp;nbsp;그래서&amp;nbsp;카나드&amp;nbsp;날개를&amp;nbsp;지워달라고&amp;nbsp;요청했어&amp;nbsp;하지만&amp;nbsp;카나드&amp;nbsp;날개를&amp;nbsp;잘&amp;nbsp;이해하지&amp;nbsp;못했었나봐&amp;nbsp;같은&amp;nbsp;스케치의&amp;nbsp;흑백&amp;nbsp;명암만&amp;nbsp;약간&amp;nbsp;변경되었더군. &lt;br /&gt;&lt;br /&gt;3.&amp;nbsp;좀더&amp;nbsp;자세히&amp;nbsp;의사를&amp;nbsp;전달하기&amp;nbsp;위해&amp;nbsp;그림판으로&amp;nbsp;해당&amp;nbsp;부분을&amp;nbsp;빨간색&amp;nbsp;동그라미로&amp;nbsp;지정하고&amp;nbsp;kf-21&amp;nbsp;보라매에는&amp;nbsp;주익&amp;nbsp;앞에&amp;nbsp;카나드&amp;nbsp;날개가&amp;nbsp;없으므로&amp;nbsp;원본과&amp;nbsp;비교해서&amp;nbsp;수정해달라고&amp;nbsp;했지 &lt;br /&gt;&lt;br /&gt;4.&amp;nbsp;정말&amp;nbsp;잘&amp;nbsp;수정된거&amp;nbsp;같아&amp;nbsp; &lt;br /&gt;&lt;br /&gt;위의&amp;nbsp;내용으로&amp;nbsp;글을&amp;nbsp;작성해&amp;nbsp;주었으면해&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KF-21 보라매가 노을 지는 하늘을 비행하는 스케치 드로잉.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNiytI/btsQH7nsdmG/Kj8N5o03CB6CBKRnJY1600/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNiytI/btsQH7nsdmG/Kj8N5o03CB6CBKRnJY1600/img.png&quot; data-alt=&quot;KF-21 보라매가 노을 지는 하늘을 비행하는 스케치 드로잉 - 제미나이_이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNiytI/btsQH7nsdmG/Kj8N5o03CB6CBKRnJY1600/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNiytI%2FbtsQH7nsdmG%2FKj8N5o03CB6CBKRnJY1600%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;672&quot; data-filename=&quot;KF-21 보라매가 노을 지는 하늘을 비행하는 스케치 드로잉.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;KF-21 보라매가 노을 지는 하늘을 비행하는 스케치 드로잉 - 제미나이_이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <category>구글 ai 스튜디오</category>
      <category>나노바나나</category>
      <category>제미나이</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/220</guid>
      <comments>https://postpop.tistory.com/220#entry220comment</comments>
      <pubDate>Mon, 22 Sep 2025 03:06:11 +0900</pubDate>
    </item>
    <item>
      <title>전기자전거 배터리팩 병렬연결</title>
      <link>https://postpop.tistory.com/219</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;전기자전거 변환키트를 사용하여 전기자전거로 개조한 자전거의 배터리 용량이 작아 배터리 용량을 키울 필요가 생겼습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카카오 T픽커, 우리 동네 딜리버리 앱을 통한 배달 알바에 전기자전거를 사용하는데 장시간 하거나 오르막이 많은 경우에는 배터리 두 개를 사용하게 됩니다. 중간에 배터리 교체를 한번 해야 하는데 상당히 번거롭습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보유한 배터리 팩을 병렬 연결하여 사용하기로 하고 처음에는 병렬연결 케이블만 있으면 될 거라고 생각하여 케이블을 구입했으나 인터넷에 검색해 보니 배터리 팩 간의 전압차에서 발생하는 전류이동 등의 여러 안전상 문제 때문에 스위칭 방식의 듀얼 배터리 전원공급 어댑터를 사용하기로 하였습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XT60 배터리 병렬연결 케이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_opnlaEk&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_opnlaEk&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750256241732&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;https://www.aliexpress.com/item/1005006853589194.html?aff_fcid=67ff17c2c77740d8809a8a666ebb9d51-1750256238986-01004-_opnlaEk&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_opnlaEk&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_opnlaEk&amp;amp;aff_trace_key=67ff17c2c77740d8809a8a666ebb9d51-1750256238986-01004-_opnlaEk&amp;amp;terminal_id=1f42f68a1ceb45cdb464ceba85717316&amp;amp;afSmartRedirect=y&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_opnlaEk&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006853589194.html?aff_fcid=67ff17c2c77740d8809a8a666ebb9d51-1750256238986-01004-_opnlaEk&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_opnlaEk&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_opnlaEk&amp;amp;aff_trace_key=67ff17c2c77740d8809a8a666ebb9d51-1750256238986-01004-_opnlaEk&amp;amp;terminal_id=1f42f68a1ceb45cdb464ceba85717316&amp;amp;afSmartRedirect=y&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_opnlaEk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_opnlaEk&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https://www.aliexpress.com/item/1005006853589194.html?aff_fcid=67ff17c2c77740d8809a8a666ebb9d51-1750256238986-01004-_opnlaEk&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_opnlaEk&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_opnlaEk&amp;amp;aff_trace_key=67ff17c2c77740d8809a8a666ebb9d51-1750256238986-01004-_opnlaEk&amp;amp;terminal_id=1f42f68a1ceb45cdb464ceba85717316&amp;amp;afSmartRedirect=y&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위칭 방식의 듀얼 배터리 전원공급 어댑터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_omLAJve&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_omLAJve&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750256332728&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;https://www.aliexpress.com/item/1005004038980957.html?aff_fcid=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_omLAJve&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_omLAJve&amp;amp;aff_trace_key=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;terminal_id=672924968258416a8b6f680dadc561c7&amp;amp;afSmartRedirect=y&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_omLAJve&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005004038980957.html?aff_fcid=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_omLAJve&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_omLAJve&amp;amp;aff_trace_key=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;terminal_id=672924968258416a8b6f680dadc561c7&amp;amp;afSmartRedirect=y&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_omLAJve&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_omLAJve&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https://www.aliexpress.com/item/1005004038980957.html?aff_fcid=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_omLAJve&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_omLAJve&amp;amp;aff_trace_key=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;terminal_id=672924968258416a8b6f680dadc561c7&amp;amp;afSmartRedirect=y&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 어댑터는 연결된 배터리 팩의 전압차를 확인하고 전압이 높은 것부터 사용하여 전원을 공급하도록 제어를 해줍니다. 두 배터리의 전압차가 같아지게 되면 번갈아 사용하여 전원을 공급하게 되는데 이게 상당한 장점이 있습니다. 모터를 사용할 때 배터리에는 전압강하가 발생하게 됩니다. 모터 컨트롤러에는 일정 이하로 전압이 떨어질 경우 작동을 멈추도록 설정되어 있는데 어댑터가 배터리를 번갈아 사용하게 되므로 전압강하가 절반으로 줄어들게 되어 병렬연결 없이 배터리를 교체하여 사용할 때 보다 더 오래 사용할 수 있게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20250618_213151.jpg&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VooyQ/btsOGaAAwNF/gem8rOu4YS1QW7r2fb8Qrk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VooyQ/btsOGaAAwNF/gem8rOu4YS1QW7r2fb8Qrk/img.jpg&quot; data-alt=&quot;배터리 보관용 가방 / 배터리 병렬연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VooyQ/btsOGaAAwNF/gem8rOu4YS1QW7r2fb8Qrk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVooyQ%2FbtsOGaAAwNF%2Fgem8rOu4YS1QW7r2fb8Qrk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;1260&quot; data-filename=&quot;20250618_213151.jpg&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;배터리 보관용 가방 / 배터리 병렬연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfvWXy/btsOGZ5ZW9V/UUN1OQh3lnMeKVlSEjShW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfvWXy/btsOGZ5ZW9V/UUN1OQh3lnMeKVlSEjShW1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1260&quot; data-filename=&quot;20250618_213133.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfvWXy/btsOGZ5ZW9V/UUN1OQh3lnMeKVlSEjShW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfvWXy%2FbtsOGZ5ZW9V%2FUUN1OQh3lnMeKVlSEjShW1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN8ZTt/btsOF4mGfgP/XcGUBFonxdCSVSVwUkJJzk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN8ZTt/btsOF4mGfgP/XcGUBFonxdCSVSVwUkJJzk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1260&quot; data-filename=&quot;20250618_213244.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN8ZTt/btsOF4mGfgP/XcGUBFonxdCSVSVwUkJJzk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN8ZTt%2FbtsOF4mGfgP%2FXcGUBFonxdCSVSVwUkJJzk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bom0rm/btsOGLUw0qc/q7T9N6whSRSMwziz8irsqk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bom0rm/btsOGLUw0qc/q7T9N6whSRSMwziz8irsqk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1260&quot; data-filename=&quot;20250618_213253.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bom0rm/btsOGLUw0qc/q7T9N6whSRSMwziz8irsqk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbom0rm%2FbtsOGLUw0qc%2Fq7T9N6whSRSMwziz8irsqk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MQP0L/btsOFPQPopV/ec0EZC165ycFTGxXr26KNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MQP0L/btsOFPQPopV/ec0EZC165ycFTGxXr26KNk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;2240&quot; data-filename=&quot;20250618_213038.jpg&quot; style=&quot;width: 35.5814%; margin-right: 10px;&quot; data-widthpercent=&quot;36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MQP0L/btsOFPQPopV/ec0EZC165ycFTGxXr26KNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMQP0L%2FbtsOFPQPopV%2Fec0EZC165ycFTGxXr26KNk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;2240&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwJDvz/btsOHDnN6zH/xbePWZkpglQi86Br41976K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwJDvz/btsOHDnN6zH/xbePWZkpglQi86Br41976K/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1260&quot; data-filename=&quot;20250618_213057.jpg&quot; style=&quot;width: 63.2558%;&quot; data-widthpercent=&quot;64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwJDvz/btsOHDnN6zH/xbePWZkpglQi86Br41976K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwJDvz%2FbtsOHDnN6zH%2FxbePWZkpglQi86Br41976K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;배터리 전원공급 스위치/컨트롤러 연결 잭/충전용 dc잭 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제작에 사용된 물품&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배터리팩 2개: 36V 리듐 배터리 팩, 18650 10S3P 100AH&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_ombokLQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_ombokLQ&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750258711111&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;2024 Upgrade 10S3P 36V 100000mAh 36v Electric Scooter Battery Pack 18650 Lithium M365 Electric Scooter 36v Battery Scooter&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_ombokLQ&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005008100930802.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_ombokLQ&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=f2d6cab53702480cad8b539a12644465-1750258705255-06854-_ombokLQ&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&amp;amp;aff_short_key=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/3e1TA/hyY8Vetqgq/lwRs2nzEskRrCFX6Tazx51/img.jpg?width=886&amp;amp;height=886&amp;amp;face=0_0_886_886&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_ombokLQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_ombokLQ&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/3e1TA/hyY8Vetqgq/lwRs2nzEskRrCFX6Tazx51/img.jpg?width=886&amp;amp;height=886&amp;amp;face=0_0_886_886');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2024 Upgrade 10S3P 36V 100000mAh 36v Electric Scooter Battery Pack 18650 Lithium M365 Electric Scooter 36v Battery Scooter&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위칭 방식의 듀얼 배터리 전원공급 어댑터: 컨트롤러의 사용 전류가 맥스 13A이므로 20A XT60 옵션으로 구매하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_omLAJve&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_omLAJve&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750259442978&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;https://www.aliexpress.com/item/1005004038980957.html?aff_fcid=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_omLAJve&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_omLAJve&amp;amp;aff_trace_key=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;terminal_id=672924968258416a8b6f680dadc561c7&amp;amp;afSmartRedirect=y&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_omLAJve&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005004038980957.html?aff_fcid=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_omLAJve&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_omLAJve&amp;amp;aff_trace_key=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;terminal_id=672924968258416a8b6f680dadc561c7&amp;amp;afSmartRedirect=y&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_omLAJve&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_omLAJve&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https://www.aliexpress.com/item/1005004038980957.html?aff_fcid=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_omLAJve&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_omLAJve&amp;amp;aff_trace_key=51a19d40d09849e79bfcc6c92e2f5c6e-1750256329788-00031-_omLAJve&amp;amp;terminal_id=672924968258416a8b6f680dadc561c7&amp;amp;afSmartRedirect=y&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전원 스위치: 컨트롤러의 전원 잭과 배터리팩 연결 시 발생하는 스파크를 방지하기 위한 스위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_olN32Mg&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_olN32Mg&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750258910065&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;DaierTek 3PCS Rocker Switch DPST 40A 12VDC 4 Pin 2 Position Switch ON Off Toggle Switch 30A 250VAC 120V T125 KCD2 KCD4 Rocker - &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_olN32Mg&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005814871991.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_olN32Mg&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=a61d59e5537e4c70aadef348322347c7-1750258904434-05610-_olN32Mg&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&amp;amp;aff_short_key=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BWSOF/hyY7ZBjkRJ/oF3Fn1obvihAMFopzWcPT1/img.jpg?width=1538&amp;amp;height=1538&amp;amp;face=0_0_1538_1538&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_olN32Mg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_olN32Mg&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BWSOF/hyY7ZBjkRJ/oF3Fn1obvihAMFopzWcPT1/img.jpg?width=1538&amp;amp;height=1538&amp;amp;face=0_0_1538_1538');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;DaierTek 3PCS Rocker Switch DPST 40A 12VDC 4 Pin 2 Position Switch ON Off Toggle Switch 30A 250VAC 120V T125 KCD2 KCD4 Rocker -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전원 연결 컨버터 케이블: 컨트롤러 전원 커넥터(PP30)와 배터리 팩 전원커넥터(XT60)를 연결시켜 주는 컨버터 케이블, 컨버터 케이블의 빨간색 선 중간을 잘라&amp;nbsp; 전원스위치에 연결해 주었습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oooGIXO&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_oooGIXO&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750259201927&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Ebike Battery Cable Adapter PP30 To XT60 Battery Connector Ebike Battery Cable Electric Bicycle MTB Mountain Road Bike Parts - A&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_oooGIXO&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007153169279.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_oooGIXO&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=215b4fb50e0649e88e35b323ac8ef694-1750259194747-06101-_oooGIXO&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&amp;amp;aff_short_key=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xH0TE/hyY79qnQlc/2ENVXQeZUZ3nAbXxfQFFb0/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oooGIXO&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_oooGIXO&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xH0TE/hyY79qnQlc/2ENVXQeZUZ3nAbXxfQFFb0/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ebike Battery Cable Adapter PP30 To XT60 Battery Connector Ebike Battery Cable Electric Bicycle MTB Mountain Road Bike Parts - A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치 연결 터미널 단자 키트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_okSJXWg&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_okSJXWg&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750259647136&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Box Insulated Male Female Wire Connector 2.8/4.8/6.3mm Electrical Crimp Terminals Termin Spade Connectors Assorted Kit 270PCS - &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_okSJXWg&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005128682713.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_okSJXWg&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=1641a95edec74fd5aec578df944eb437-1750259641608-05399-_okSJXWg&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&amp;amp;aff_short_key=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cDIViE/hyY8TAXfBD/KKrW8TUkAPo5GvfpuQ6Wpk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_okSJXWg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_okSJXWg&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cDIViE/hyY8TAXfBD/KKrW8TUkAPo5GvfpuQ6Wpk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Box Insulated Male Female Wire Connector 2.8/4.8/6.3mm Electrical Crimp Terminals Termin Spade Connectors Assorted Kit 270PCS -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수축튜브: 164PCS NO BOX&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_onOpOda&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_onOpOda&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750259694661&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Thermoresistant Tube heat shrink tubing kit, Termoretractil Heat shrink tube Assorted Pack diy insulation for cables shrink wrap&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_onOpOda&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005188307524.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_onOpOda&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=145d81faabef407a9438b2309bab3981-1750259689564-00248-_onOpOda&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&amp;amp;aff_short_key=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vcvWJ/hyY8LiDXXr/uvv5PsBs9RvMWKhH0efLD0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_onOpOda&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_onOpOda&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vcvWJ/hyY8LiDXXr/uvv5PsBs9RvMWKhH0efLD0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Thermoresistant Tube heat shrink tubing kit, Termoretractil Heat shrink tube Assorted Pack diy insulation for cables shrink wrap&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병렬연결 배터리팩 보관용 가방: 플레이 스테이션 포털 콘솔 용 보호 EVA 보관 케이스를 구매하여 고무재질의 플레이 스테이션 포털 콘솔에 맞게 성형된 받침을 칼로 잘라 제거하여 사용하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oEqVwnW&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_oEqVwnW&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750259788002&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;https://www.aliexpress.com/item/1005006282331732.html?aff_fcid=524c96015217441fb3186fb0e34490d1-1750259784556-02593-_oEqVwnW&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_oEqVwnW&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_oEqVwnW&amp;amp;aff_trace_key=524c96015217441fb3186fb0e34490d1-1750259784556-02593-_oEqVwnW&amp;amp;terminal_id=817f30d98ab24a9388a7deca082963b3&amp;amp;afSmartRedirect=y&quot; data-og-description=&quot;&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_oEqVwnW&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006282331732.html?aff_fcid=524c96015217441fb3186fb0e34490d1-1750259784556-02593-_oEqVwnW&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_oEqVwnW&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_oEqVwnW&amp;amp;aff_trace_key=524c96015217441fb3186fb0e34490d1-1750259784556-02593-_oEqVwnW&amp;amp;terminal_id=817f30d98ab24a9388a7deca082963b3&amp;amp;afSmartRedirect=y&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oEqVwnW&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_oEqVwnW&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;https://www.aliexpress.com/item/1005006282331732.html?aff_fcid=524c96015217441fb3186fb0e34490d1-1750259784556-02593-_oEqVwnW&amp;amp;tt=CPS_NORMAL&amp;amp;aff_fsk=_oEqVwnW&amp;amp;aff_platform=shareComponent-detail&amp;amp;sk=_oEqVwnW&amp;amp;aff_trace_key=524c96015217441fb3186fb0e34490d1-1750259784556-02593-_oEqVwnW&amp;amp;terminal_id=817f30d98ab24a9388a7deca082963b3&amp;amp;afSmartRedirect=y&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기타 사용 물품: 글루건, 배터리팩 포장용 완충재, A4서류 비닐 파일 케이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VwJwM/btsOHCoRtHi/N41ho9Uc5agwrC3pzQJMGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VwJwM/btsOHCoRtHi/N41ho9Uc5agwrC3pzQJMGk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1260&quot; data-filename=&quot;20250618_212803.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VwJwM/btsOHCoRtHi/N41ho9Uc5agwrC3pzQJMGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVwJwM%2FbtsOHCoRtHi%2FN41ho9Uc5agwrC3pzQJMGk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eNLrg2/btsOGOcBfsG/ZSNTIRhgoiVk5gpj2MuGrK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eNLrg2/btsOGOcBfsG/ZSNTIRhgoiVk5gpj2MuGrK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1260&quot; data-filename=&quot;20250618_212700.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eNLrg2/btsOGOcBfsG/ZSNTIRhgoiVk5gpj2MuGrK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeNLrg2%2FbtsOGOcBfsG%2FZSNTIRhgoiVk5gpj2MuGrK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XFGIm/btsOIqVNO5K/e6YcblSq4PJCJ58kvcXqZ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XFGIm/btsOIqVNO5K/e6YcblSq4PJCJ58kvcXqZ1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1260&quot; data-filename=&quot;20250618_212649.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XFGIm/btsOIqVNO5K/e6YcblSq4PJCJ58kvcXqZ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXFGIm%2FbtsOIqVNO5K%2Fe6YcblSq4PJCJ58kvcXqZ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1680&quot; height=&quot;1260&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;병렬연결 배터리팩 장착&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배터리팩 장착 케이스 제작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A4 클리어 파일 20매/40매 내부비닐 추가/제거 가능용(자전거)을 배터리팩 크기에 맞게 구부리서 케이스를 만들어주고 고정은 다이소에서 판매하는 찍찍이 테이브를 이용하여 고정해 주었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병렬연결 후 약 한 달간 사용하였으며 이상 없이 사용 중입니다. 배터리 충전은 가방외부에 노출시킨 DC연결잭에 각각 충전용 어댑터를 연결하여 충전합니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>알찬 정보</category>
      <category>배터리팩 병렬연결</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/219</guid>
      <comments>https://postpop.tistory.com/219#entry219comment</comments>
      <pubDate>Thu, 19 Jun 2025 00:33:12 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 - 피에조 부저 멜로디 - 로제_브루노마스 아파트</title>
      <link>https://postpop.tistory.com/218</link>
      <description>&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;037&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/037.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/037.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;블랙핑크 로제와 브루노마스의 협업곡인 'APT.(아파트)'의 피에조부저 멜로디 코드입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_로제_브루노마스 아파트.png&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;2888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bthw54/btsK2wl0IzV/YB35tLkgifXD6EQuhULQ9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bthw54/btsK2wl0IzV/YB35tLkgifXD6EQuhULQ9k/img.png&quot; data-alt=&quot;로제 &amp;amp;amp; 브루노마스 아파트 - 피에조부저 악보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bthw54/btsK2wl0IzV/YB35tLkgifXD6EQuhULQ9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbthw54%2FbtsK2wl0IzV%2FYB35tLkgifXD6EQuhULQ9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;2888&quot; data-filename=&quot;edited_로제_브루노마스 아파트.png&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;2888&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로제 &amp;amp; 브루노마스 아파트 - 피에조부저 악보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;!-- 3.본문 배너1 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/p9Xfv/btsK1UHL2Xx/mdtq9qL16a6RV3Ml461qEk/ROSE_Bruno_Mars_APT.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ROSE_Bruno_Mars_APT.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1732888448827&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 코드 설명 https://postpop.tistory.com/98

// 12화음 이름 정의
typedef enum {
  NOTE_C, NOTE_Cs, NOTE_D, NOTE_Eb, NOTE_E, NOTE_F, NOTE_Fs, NOTE_G, NOTE_Gs, 
  NOTE_A, NOTE_Bb, NOTE_B, NOTE_MAX
} note_t;

// 화음별 피에조 부저 진동수 정의 및 옥타브에 따른 값 변경 함수
double ledcWriteNote(note_t note, uint8_t octave){
  const uint16_t noteFrequencyBase[12] = {
  //  1      2      3      4      5      6     7       8     9       10    11      12
  //  C      C#     D      Eb     E      F     F#      G     G#      A     Bb      B
     4186,  4435,  4699,  4978,  5274,  5588,  5920,  6272,  6645,  7040,  7459,  7902
  };
  if(octave &amp;gt; 8 || note &amp;gt;= NOTE_MAX){
    return 0;
  }
  double noteFreq =  (double)noteFrequencyBase[note] / (double)(1 &amp;lt;&amp;lt; (8-octave));
  return noteFreq;
}

// ---------------------------------------------------------------------- ROSE &amp;amp; Bruno Mars 'APT'
uint8_t Tempo = 149;
float tempoRatio = float(Tempo)/60.0;
uint8_t KeySign = 3;
uint8_t octaveTemp = 4;
float beatTime = 4/4;

const note_t Mnote[] PROGMEM= {
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_C,
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_C,
NOTE_E,NOTE_E,NOTE_C,NOTE_E,NOTE_E,NOTE_C,NOTE_E,NOTE_E,NOTE_MAX,NOTE_E,NOTE_MAX,NOTE_C,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_C,
NOTE_E,NOTE_C,NOTE_E,NOTE_E,NOTE_C,NOTE_E,NOTE_E,NOTE_C,NOTE_E,NOTE_MAX,NOTE_C,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_C,NOTE_D,NOTE_MAX,NOTE_E,NOTE_MAX,
NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_D,NOTE_D,NOTE_E,NOTE_F,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_F,NOTE_F,NOTE_F,NOTE_E,NOTE_G,
NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_D,NOTE_D,NOTE_E,NOTE_F,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_E,NOTE_B,NOTE_E,NOTE_D,NOTE_E,
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_C,
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_C,
NOTE_E,NOTE_E,NOTE_D,NOTE_E,NOTE_E,NOTE_E,NOTE_D,NOTE_E,NOTE_D,NOTE_E,NOTE_C,NOTE_E,NOTE_MAX,NOTE_D,NOTE_E,NOTE_E,NOTE_D,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_E,
NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_C,NOTE_E,NOTE_MAX,NOTE_E,NOTE_MAX,NOTE_D,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_C,NOTE_D,NOTE_MAX,NOTE_E,NOTE_MAX,
NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_D,NOTE_D,NOTE_E,NOTE_F,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_F,NOTE_F,NOTE_F,NOTE_E,NOTE_G,
NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_D,NOTE_D,NOTE_E,NOTE_F,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_E,NOTE_B,NOTE_E,NOTE_D,NOTE_E,
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_C,
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_C,
NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,
NOTE_C,NOTE_C,NOTE_B,NOTE_MAX,NOTE_C,NOTE_C,NOTE_B,NOTE_MAX,NOTE_B,NOTE_B,NOTE_B,NOTE_G,NOTE_B,NOTE_MAX,NOTE_MAX,NOTE_G,NOTE_MAX,
NOTE_C,NOTE_B,NOTE_C,NOTE_B,NOTE_C,NOTE_C,NOTE_MAX,NOTE_C,NOTE_B,NOTE_MAX,NOTE_B,NOTE_B,NOTE_B,NOTE_G,NOTE_B,NOTE_MAX,NOTE_MAX,NOTE_G,NOTE_MAX,
NOTE_C,NOTE_C,NOTE_B,NOTE_MAX,NOTE_C,NOTE_C,NOTE_B,NOTE_MAX,NOTE_B,NOTE_B,NOTE_B,NOTE_G,NOTE_B,NOTE_MAX,NOTE_MAX,NOTE_G,NOTE_MAX,
NOTE_C,NOTE_B,NOTE_C,NOTE_B,NOTE_C,NOTE_C,NOTE_MAX,NOTE_C,NOTE_B,NOTE_MAX,NOTE_B,NOTE_B,NOTE_B,NOTE_MAX,NOTE_A,NOTE_MAX,NOTE_A,NOTE_MAX,NOTE_A,NOTE_MAX,NOTE_A,NOTE_MAX,NOTE_A,
NOTE_B,NOTE_B,NOTE_B,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_D,NOTE_D,NOTE_E,NOTE_F,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_F,NOTE_F,NOTE_F,NOTE_E,NOTE_G,
NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_D,NOTE_D,NOTE_E,NOTE_F,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_E,NOTE_B,NOTE_E,NOTE_D,NOTE_E,
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_E,NOTE_B,NOTE_E,NOTE_D,NOTE_E,
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_E,NOTE_B,NOTE_E,NOTE_D,NOTE_E,
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_E,NOTE_B,NOTE_E,NOTE_D,NOTE_E,
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_G,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_C,
};

const uint8_t Moct[] PROGMEM= {
3,3,3,3,3,4,3,3,3,3,3,4,3,3,3,3,3,4,3,0,3,4,3,4,
3,3,3,3,3,4,3,3,3,3,3,4,3,3,3,3,3,4,3,0,3,4,3,4,
4,4,4,4,4,4,4,4,0,4,0,4,4,4,4,4,4,4,4,4,4,0,4,5,4,5,
4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,0,4,0,
4,4,4,0,4,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,
4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
3,3,3,3,3,4,3,3,3,3,3,4,3,3,3,3,3,4,3,0,3,4,3,4,
3,3,3,3,3,4,3,3,3,3,3,4,3,3,3,3,3,4,3,0,3,4,3,4,
4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,3,4,3,4,
4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,0,4,0,
4,4,4,0,4,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,
4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
3,3,3,3,3,4,3,3,3,3,3,4,3,3,3,3,3,4,3,0,3,4,3,4,
3,3,3,3,3,4,3,3,3,3,3,4,3,3,3,3,3,4,3,0,3,4,3,4,
2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,4,5,4,5,4,5,4,5,4,5,4,5,5,5,5,5,
5,5,4,0,5,5,4,0,4,4,4,4,4,0,4,4,0,
5,4,5,4,5,5,0,5,4,0,4,4,4,4,4,0,5,4,0,
5,5,4,0,5,5,4,0,4,4,4,4,4,0,4,4,0,
5,4,5,4,5,5,0,5,4,0,4,4,4,0,4,0,4,0,4,0,4,0,4,
4,4,4,0,4,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,
4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
3,3,3,3,3,4,3,3,3,3,3,4,3,3,3,3,3,5,5,5,5,5,
3,3,3,3,3,4,3,3,3,3,3,4,3,3,3,3,3,5,5,5,5,5,
3,3,3,3,3,4,3,3,3,3,3,4,3,3,3,3,3,5,5,5,5,5,
3,3,3,3,3,4,3,3,3,3,3,4,3,3,3,3,3,4,4,4,3,4,3,4,
0,
};

const uint8_t localKey[] PROGMEM= {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,
};

const uint8_t Mdur[] PROGMEM= {
16,
4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,
4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,
2,2,4,2,2,4,2,2,2,2,4,4,2,2,2,2,2,2,2,2,4,2,2,2,2,4,
4,4,2,2,4,2,2,2,2,4,4,2,2,2,2,2,2,2,2,4,2,2,2,2,4,
4,2,2,2,2,2,2,4,4,4,4,4,2,2,2,2,2,2,4,4,8,
4,2,2,2,2,2,2,4,4,4,4,4,2,2,2,2,4,4,4,4,4,
4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,
4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,
2,2,2,2,2,2,2,2,2,2,2,2,8,2,2,2,2,2,2,2,2,4,2,2,2,2,4,
4,4,4,4,2,2,2,2,4,4,4,2,2,2,2,2,2,4,2,2,2,2,4,
4,2,2,2,2,2,2,4,4,4,4,4,2,2,2,2,2,2,4,4,8,
4,2,2,2,2,2,2,4,4,4,4,4,2,2,2,2,4,4,4,4,4,
4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,
4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
4,2,2,4,4,2,2,2,2,2,2,2,2,12,2,2,16,
2,2,2,2,2,2,2,2,4,2,2,2,2,2,2,12,2,2,16,
4,2,2,4,4,2,2,2,2,2,2,2,2,12,2,2,16,
2,2,2,2,2,2,2,2,4,2,2,2,2,4,4,2,2,4,4,2,2,4,8,
4,2,2,2,2,2,2,4,4,4,4,4,2,2,2,2,2,2,4,4,8,
4,2,2,2,2,2,2,4,4,4,4,4,2,2,2,2,4,4,4,4,4,
4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,4,4,4,4,
4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,4,4,4,4,
4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,4,4,4,4,
4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,4,2,2,2,2,4,
};
// ----------------------------------------------------------------------

uint8_t noteNum = 0;

note_t keySignature(note_t note) {
  if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 0) {
    if (KeySign == 1) { 
      if (note == NOTE_B) note = NOTE_Bb;
    } else if (KeySign == 2) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
    } else if (KeySign == 3) {
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
    } else if (KeySign == 4) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
    } else if (KeySign == 5) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
    } else if (KeySign == 6) {
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
    } else if (KeySign == 7) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
      else if (note == NOTE_F) note = NOTE_E;
    } else if (KeySign == 8) { 
      if (note == NOTE_F) note = NOTE_Fs;
    } else if (KeySign == 9) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
    } else if (KeySign == 10) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
    } else if (KeySign == 11) { 
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
    } else if (KeySign == 12) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
    } else if (KeySign == 13) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_F;
    } else if (KeySign == 14) { 
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_F;
      else if (note == NOTE_B) { note = NOTE_C; octaveTemp += 1; }
    }
  }
  else { // 1. natural
    if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 2) { // 2. b
      if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_F) note = NOTE_E;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_B) note = NOTE_Bb;
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 3) { // 2. #
      if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_E) note = NOTE_F;
      else if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_B) { note = NOTE_C; octaveTemp += 1; }
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 4) { // 4. bb
      if (note == NOTE_C) { note = NOTE_Bb; octaveTemp -= 1; }
      else if (note == NOTE_D) note = NOTE_C;
      else if (note == NOTE_E) note = NOTE_D;
      else if (note == NOTE_F) note = NOTE_Eb;
      else if (note == NOTE_G) note = NOTE_F;
      else if (note == NOTE_A) note = NOTE_G;
      else if (note == NOTE_B) note = NOTE_A;
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 5) { // 5. ##
      if (note == NOTE_C) note = NOTE_D;
      else if (note == NOTE_D) note = NOTE_E;
      else if (note == NOTE_E) note = NOTE_Fs;
      else if (note == NOTE_F) note = NOTE_G;
      else if (note == NOTE_G) note = NOTE_A;
      else if (note == NOTE_A) note = NOTE_B;
      else if (note == NOTE_B) { note = NOTE_Cs; octaveTemp += 1; }
    }
  }
  return note;
}
// ----------------------------------------------------------------------

int beepPin = 10;

void setup() {
  Serial.begin(9600);
}

bool beepMelody = false;
unsigned long int beepTime = 0;

// 시리얼 모니터에서 0을 입력하면 멜로디 재생
// 0을 한번더 입력하면 멜로디 정지

void loop() {
  if(Serial.available() &amp;gt; 0){
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if (temp == &quot;0&quot;) {
      beepMelody = !beepMelody;
      noteNum = 0; beepTime = 0;
      if (!beepMelody) noTone(beepPin);  
    }
  }
  if (beepMelody) {
    if (millis() - beepTime &amp;gt;= pgm_read_byte(&amp;amp;Mdur[noteNum])*(1000/(4*tempoRatio))) {
      beepTime = millis();
      noTone(beepPin);
      octaveTemp = pgm_read_byte(&amp;amp;Moct[noteNum]);
      note_t KeyNote = keySignature(pgm_read_word(&amp;amp;Mnote[noteNum]));
      tone(beepPin, ledcWriteNote(KeyNote, octaveTemp));  // ledcWriteNote(uint8_t channel, note_t note, uint8_t octaveTemp);
      noteNum++;
      if (noteNum == sizeof(Mdur)) { // 초기화
        noTone(beepPin);  
        noteNum = 0; 
        beepMelody = false;
      }
    }
  } 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;참조한 악보 영상&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=5IxlJ-5k4UA&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=5IxlJ-5k4UA&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=5IxlJ-5k4UA&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/emxols/hyXDbKeMnR/26OZGYl8ylhTWVnKqCs4jK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/r2XDq/hyXDeGWxXZ/0yZwGy64OF0Rjjy4pw11nK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;ROSE(로제) &amp;amp; Bruno Mars &quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/5IxlJ-5k4UA&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;감사합니다.&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;038&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/038.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/038.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;city-6931092_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MmjJA/btsK25g3aIj/x0EOaBFjbMvsHBQweJEhU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MmjJA/btsK25g3aIj/x0EOaBFjbMvsHBQweJEhU1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MmjJA/btsK25g3aIj/x0EOaBFjbMvsHBQweJEhU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMmjJA%2FbtsK25g3aIj%2Fx0EOaBFjbMvsHBQweJEhU1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;853&quot; data-filename=&quot;city-6931092_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사진 - 픽사베이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/Piezo Buzzer</category>
      <category>로제</category>
      <category>멜로디</category>
      <category>브루노마스</category>
      <category>아두이노</category>
      <category>아파트</category>
      <category>피에조부저</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/218</guid>
      <comments>https://postpop.tistory.com/218#entry218comment</comments>
      <pubDate>Fri, 29 Nov 2024 23:01:22 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 - 피에조 부저 멜로디 - 아틀란티스 소녀</title>
      <link>https://postpop.tistory.com/217</link>
      <description>&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;036&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/036.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/036.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아틀란티스 소녀 피에조부저 멜로디 코드입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_아틀란티스 소녀 - 보아.png&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;2873&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHd6NF/btsK2xry9uL/0ZZQGidRHb33gMaYsbMXYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHd6NF/btsK2xry9uL/0ZZQGidRHb33gMaYsbMXYk/img.png&quot; data-alt=&quot;아틀란티스 소녀 피에조 부저용 악보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHd6NF/btsK2xry9uL/0ZZQGidRHb33gMaYsbMXYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHd6NF%2FbtsK2xry9uL%2F0ZZQGidRHb33gMaYsbMXYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;2873&quot; data-filename=&quot;edited_아틀란티스 소녀 - 보아.png&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;2873&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아틀란티스 소녀 피에조 부저용 악보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 3.본문 배너1 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8269928309278636&quot; data-ad-slot=&quot;3647290720&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cqRVt8/btsJPn5ZkZG/lzzPyTAt9swkQddQ2Uk4V1/melody_Atlantis_Princess.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;melody_Atlantis_Princess.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727608194577&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 코드 설명 https://postpop.tistory.com/98

// 12화음 이름 정의
typedef enum {
  NOTE_C, NOTE_Cs, NOTE_D, NOTE_Eb, NOTE_E, NOTE_F, NOTE_Fs, NOTE_G, NOTE_Gs, 
  NOTE_A, NOTE_Bb, NOTE_B, NOTE_MAX
} note_t;

// 화음별 피에조 부저 진동수 정의 및 옥타브에 따른 값 변경 함수
double ledcWriteNote(note_t note, uint8_t octave){
  const uint16_t noteFrequencyBase[12] = {
  //  1      2      3      4      5      6     7       8     9       10    11      12
  //  C      C#     D      Eb     E      F     F#      G     G#      A     Bb      B
     4186,  4435,  4699,  4978,  5274,  5588,  5920,  6272,  6645,  7040,  7459,  7902
  };
  if(octave &amp;gt; 8 || note &amp;gt;= NOTE_MAX){
    return 0;
  }
  double noteFreq =  (double)noteFrequencyBase[note] / (double)(1 &amp;lt;&amp;lt; (8-octave));
  return noteFreq;
}

// ---------------------------------------------------------------------- 보아 - 아틀란티스 소녀
uint8_t Tempo = 110;
float tempoRatio = float(Tempo)/60.0;
uint8_t KeySign = 1;
uint8_t octaveTemp = 4;
float beatTime = 4/4;

const note_t Mnote[] PROGMEM= {
NOTE_MAX,NOTE_A,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_D,NOTE_F,NOTE_D,NOTE_F,NOTE_MAX,NOTE_G,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_D,NOTE_F,NOTE_G,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_B,NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_F,
NOTE_MAX,NOTE_A,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_D,NOTE_F,NOTE_D,NOTE_F,NOTE_MAX,NOTE_G,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_G,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_B,NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_F,
NOTE_MAX,NOTE_A,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_D,NOTE_F,NOTE_D,NOTE_F,NOTE_MAX,NOTE_G,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_D,NOTE_F,NOTE_F,NOTE_G,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_F,NOTE_B,NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_F,
NOTE_MAX,NOTE_A,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_D,NOTE_F,NOTE_D,NOTE_F,NOTE_MAX,NOTE_G,NOTE_G,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_F,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_B,NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_F,
NOTE_MAX,NOTE_A,NOTE_G,NOTE_G,NOTE_F,NOTE_A,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_B,NOTE_B,NOTE_G,NOTE_F,NOTE_F,NOTE_F,NOTE_A,NOTE_C,NOTE_C,NOTE_D,NOTE_MAX,NOTE_C,NOTE_C,
NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_D,NOTE_F,NOTE_D,NOTE_F,NOTE_D,NOTE_A,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_MAX,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_A,NOTE_G,NOTE_G,NOTE_F,NOTE_A,NOTE_C,NOTE_C,NOTE_D,NOTE_C,NOTE_C,
NOTE_MAX,NOTE_G,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_D,NOTE_C,NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_B,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_F,NOTE_MAX,
NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_D,NOTE_C,NOTE_A,NOTE_B,NOTE_A,NOTE_B,NOTE_A,NOTE_G,NOTE_F,NOTE_F,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_C,NOTE_D,NOTE_F,
NOTE_F,NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_MAX,NOTE_A,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_D,NOTE_F,NOTE_D,NOTE_F,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_D,
NOTE_F,NOTE_G,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_B,NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_F,NOTE_MAX,NOTE_A,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_D,NOTE_F,NOTE_D,NOTE_F,NOTE_MAX,NOTE_G,NOTE_G,NOTE_MAX,NOTE_E,NOTE_E,
NOTE_E,NOTE_E,NOTE_F,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_B,NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_F,NOTE_MAX,NOTE_A,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_A,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_MAX,
NOTE_MAX,NOTE_C,NOTE_B,NOTE_B,NOTE_G,NOTE_F,NOTE_F,NOTE_F,NOTE_A,NOTE_C,NOTE_C,NOTE_D,NOTE_C,NOTE_C,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_D,NOTE_F,NOTE_D,NOTE_F,NOTE_MAX,NOTE_D,NOTE_A,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_MAX,
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_A,NOTE_G,NOTE_G,NOTE_F,NOTE_A,NOTE_C,NOTE_C,NOTE_D,NOTE_C,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_G,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_D,NOTE_C,
NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_B,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_D,NOTE_C,
NOTE_A,NOTE_B,NOTE_A,NOTE_B,NOTE_A,NOTE_G,NOTE_F,NOTE_F,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_C,NOTE_D,NOTE_F,NOTE_F,NOTE_G,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_D,NOTE_C,
NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_B,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_D,NOTE_C,
NOTE_A,NOTE_B,NOTE_A,NOTE_B,NOTE_A,NOTE_G,NOTE_F,NOTE_F,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_C,NOTE_D,NOTE_F,NOTE_F,NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_G,NOTE_F,NOTE_G,NOTE_F,
NOTE_MAX,NOTE_MAX,NOTE_B,NOTE_A,NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_A,NOTE_A,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_G,NOTE_A,NOTE_G,NOTE_A,NOTE_G,NOTE_MAX,
NOTE_F,NOTE_F,NOTE_G,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_B,NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_A,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_A,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_MAX,
NOTE_MAX,NOTE_C,NOTE_B,NOTE_B,NOTE_G,NOTE_F,NOTE_F,NOTE_F,NOTE_A,NOTE_C,NOTE_C,NOTE_D,NOTE_C,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_D,NOTE_F,NOTE_D,NOTE_F,NOTE_F,NOTE_D,NOTE_A,NOTE_G,NOTE_G,NOTE_MAX,NOTE_F,NOTE_F,NOTE_MAX,NOTE_G,NOTE_A,NOTE_MAX,
NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_A,NOTE_G,NOTE_G,NOTE_F,NOTE_A,NOTE_C,NOTE_C,NOTE_D,NOTE_C,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_MAX,NOTE_MAX,NOTE_G,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,
NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_D,NOTE_C,NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_B,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,
NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_D,NOTE_C,NOTE_A,NOTE_B,NOTE_A,NOTE_B,NOTE_A,NOTE_G,NOTE_F,NOTE_F,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_C,NOTE_D,NOTE_F,NOTE_F,NOTE_G,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,
NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_D,NOTE_C,NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_B,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_F,NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,
NOTE_MAX,NOTE_G,NOTE_A,NOTE_F,NOTE_MAX,NOTE_D,NOTE_C,NOTE_A,NOTE_B,NOTE_A,NOTE_B,NOTE_A,NOTE_G,NOTE_F,NOTE_F,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_C,NOTE_C,NOTE_D,NOTE_F,NOTE_F,NOTE_MAX,
};

const uint8_t Moct[] PROGMEM= {
4,4,4,4,4,4,0,4,4,4,4,0,4,4,0,4,4,4,4,4,4,0,4,4,4,4,4,4,4,0,4,
4,4,4,4,4,4,0,4,4,4,4,0,4,4,0,4,4,4,4,0,4,4,4,4,4,4,4,0,4,
4,4,4,4,4,4,0,4,4,4,4,0,4,4,0,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,
4,4,4,4,4,4,0,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,0,4,
4,4,4,4,4,4,4,4,0,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,0,5,5,
5,5,4,4,4,4,4,4,4,4,4,0,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,
4,4,4,4,0,4,4,4,4,4,4,4,0,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,
4,4,4,0,4,4,4,0,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,4,4,4,
4,4,4,4,0,4,0,4,4,4,4,4,4,4,0,4,4,4,4,0,4,4,4,4,4,4,
4,4,4,0,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,0,4,4,4,4,0,4,4,0,4,4,
4,4,4,4,0,4,4,4,4,4,4,4,0,4,4,4,4,4,0,4,4,4,4,0,4,4,0,4,4,4,
4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,4,4,4,4,4,0,4,4,4,4,0,4,4,0,4,4,4,
4,4,4,4,4,4,4,4,4,5,5,5,5,5,0,5,4,4,4,0,4,4,4,0,4,4,4,0,4,4,
0,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,4,0,4,4,4,0,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,5,4,4,4,4,4,4,4,0,4,4,4,0,4,4,4,0,4,4,
0,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,0,4,4,4,0,4,4,4,0,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,5,4,4,4,4,4,4,4,0,4,4,4,4,4,
0,4,4,4,0,4,5,0,4,5,4,4,4,4,4,4,4,4,4,4,4,4,0,
4,4,4,4,0,4,4,4,4,4,4,4,0,4,0,4,4,4,4,0,4,4,4,4,0,4,4,0,4,4,4,
4,4,4,4,4,4,4,4,4,5,5,5,5,5,0,5,5,4,4,4,4,4,4,4,4,4,4,0,4,4,0,4,4,4,
4,4,4,4,4,4,4,4,4,5,5,5,5,5,0,0,5,5,4,4,4,0,4,4,4,
0,4,4,4,0,4,4,0,4,4,0,4,4,4,4,4,4,0,4,4,4,4,0,4,4,4,
0,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,4,4,4,4,4,4,4,0,4,4,4,
0,4,4,4,0,4,4,0,4,4,0,4,4,4,4,4,4,4,4,4,4,4,0,4,4,4,
0,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,4,4,4,4,4,
0,
};

const uint8_t localKey[] PROGMEM= {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,
2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,
};

const uint8_t Mdur[] PROGMEM= {
16,
4,2,2,2,1,1,2,2,2,1,1,1,2,1,4,2,1,1,2,4,2,4,4,3,1,3,1,3,1,2,2,
4,2,2,2,1,1,2,2,2,1,1,1,2,1,4,4,2,4,2,4,4,3,1,3,1,3,1,2,2,
4,2,2,2,1,1,2,2,2,1,1,1,2,1,4,2,1,1,2,2,2,2,4,2,1,1,3,1,3,1,3,1,2,2,
4,2,2,2,1,1,2,2,2,1,1,2,2,4,2,1,1,2,2,2,2,4,4,3,1,3,1,3,1,2,2,
8,1,1,4,2,2,1,1,1,1,2,1,1,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,
4,2,1,1,1,1,4,2,2,1,1,1,1,2,1,1,2,4,2,2,2,2,2,2,2,2,2,2,2,2,2,6,
4,1,1,2,4,1,1,2,2,2,2,2,4,2,2,4,2,2,4,2,2,2,2,2,1,1,4,4,
4,2,2,4,1,1,2,2,2,2,2,4,2,2,3,1,3,1,3,1,2,2,2,2,2,2,4,1,1,2,
8,4,2,2,2,2,4,8,4,2,2,2,1,1,2,2,2,1,1,1,2,1,4,2,1,1,
2,4,2,4,2,2,3,1,3,1,3,1,2,2,4,2,2,2,1,1,2,2,2,1,1,1,2,1,6,1,1,
2,2,2,2,4,4,3,1,3,1,3,1,2,2,8,1,1,2,2,2,2,1,1,1,1,2,1,1,2,4,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,1,1,1,1,2,2,2,2,1,1,1,1,2,1,1,2,4,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,1,1,2,4,1,1,2,2,2,2,2,4,2,2,
4,2,2,4,2,2,2,2,2,1,1,4,4,4,2,2,4,1,1,2,2,2,2,2,4,2,2,
3,1,3,1,3,1,2,2,2,2,2,2,4,1,1,2,4,1,1,2,4,1,1,2,2,2,2,2,4,2,2,
4,2,2,4,2,2,2,2,2,1,1,4,4,4,2,2,4,1,1,2,2,2,2,2,4,2,2,
3,1,3,1,3,1,2,2,2,2,2,2,4,1,1,2,8,4,2,2,8,4,1,1,1,1,
8,4,2,2,4,2,2,8,4,1,1,2,2,1,1,2,2,2,2,1,1,2,8,
2,2,2,2,4,4,3,1,3,1,3,1,2,2,4,4,1,1,2,2,2,2,1,1,1,1,2,1,1,2,4,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,2,1,1,1,1,2,2,2,2,1,1,1,1,2,1,1,2,4,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,12,4,4,1,1,2,4,1,1,2,
2,2,2,2,4,2,2,4,2,2,4,2,2,2,2,2,2,4,4,4,2,2,4,1,1,2,
2,2,2,2,4,2,2,3,1,3,1,3,1,2,2,2,2,2,2,4,1,1,2,4,1,1,2,4,1,1,2,
2,2,2,2,4,2,2,4,2,2,4,2,2,2,2,2,1,1,8,4,2,2,4,1,1,2,
2,2,2,2,4,2,2,3,1,3,1,3,1,2,2,2,2,2,2,4,1,1,2,12,4,
};
// ----------------------------------------------------------------------

uint8_t noteNum = 0;

note_t keySignature(note_t note) {
  if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 0) {
    if (KeySign == 1) { 
      if (note == NOTE_B) note = NOTE_Bb;
    } else if (KeySign == 2) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
    } else if (KeySign == 3) {
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
    } else if (KeySign == 4) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
    } else if (KeySign == 5) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
    } else if (KeySign == 6) {
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
    } else if (KeySign == 7) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
      else if (note == NOTE_F) note = NOTE_E;
    } else if (KeySign == 8) { 
      if (note == NOTE_F) note = NOTE_Fs;
    } else if (KeySign == 9) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
    } else if (KeySign == 10) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
    } else if (KeySign == 11) { 
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
    } else if (KeySign == 12) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
    } else if (KeySign == 13) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_F;
    } else if (KeySign == 14) { 
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_F;
      else if (note == NOTE_B) { note = NOTE_C; octaveTemp += 1; }
    }
  }
  else { // 1. natural
    if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 2) { // 2. b
      if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_F) note = NOTE_E;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_B) note = NOTE_Bb;
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 3) { // 2. #
      if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_E) note = NOTE_F;
      else if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_B) { note = NOTE_C; octaveTemp += 1; }
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 4) { // 4. bb
      if (note == NOTE_C) { note = NOTE_Bb; octaveTemp -= 1; }
      else if (note == NOTE_D) note = NOTE_C;
      else if (note == NOTE_E) note = NOTE_D;
      else if (note == NOTE_F) note = NOTE_Eb;
      else if (note == NOTE_G) note = NOTE_F;
      else if (note == NOTE_A) note = NOTE_G;
      else if (note == NOTE_B) note = NOTE_A;
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 5) { // 5. ##
      if (note == NOTE_C) note = NOTE_D;
      else if (note == NOTE_D) note = NOTE_E;
      else if (note == NOTE_E) note = NOTE_Fs;
      else if (note == NOTE_F) note = NOTE_G;
      else if (note == NOTE_G) note = NOTE_A;
      else if (note == NOTE_A) note = NOTE_B;
      else if (note == NOTE_B) { note = NOTE_Cs; octaveTemp += 1; }
    }
  }
  return note;
}
// ----------------------------------------------------------------------

int beepPin = 10;

void setup() {
  Serial.begin(9600);
}

bool beepMelody = false;
unsigned long int beepTime = 0;

// 시리얼 모니터에서 0을 입력하면 멜로디 재생
// 0을 한번더 입력하면 멜로디 정지

void loop() {
  if(Serial.available() &amp;gt; 0){
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if (temp == &quot;0&quot;) {
      beepMelody = !beepMelody;
      noteNum = 0; beepTime = 0;
      if (!beepMelody) noTone(beepPin);  
    }
  }
  if (beepMelody) {
    if (millis() - beepTime &amp;gt;= pgm_read_byte(&amp;amp;Mdur[noteNum])*(1000/(4*tempoRatio))) {
      beepTime = millis();
      noTone(beepPin);
      octaveTemp = pgm_read_byte(&amp;amp;Moct[noteNum]);
      note_t KeyNote = keySignature(pgm_read_word(&amp;amp;Mnote[noteNum]));
      tone(beepPin, ledcWriteNote(KeyNote, octaveTemp));  // ledcWriteNote(uint8_t channel, note_t note, uint8_t octaveTemp);
      noteNum++;
      if (noteNum == sizeof(Mdur)) { // 초기화
        noTone(beepPin);  
        noteNum = 0; 
        beepMelody = false;
      }
    }
  } 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;참조한 악보 영상&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=PsDC67Lwkj4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=PsDC67Lwkj4&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=PsDC67Lwkj4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bauU4G/hyXaFKpPHO/H2kf8TOIZ5NOGN5F5Of9h0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;보아 - 아틸란티스 소녀 MR&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PsDC67Lwkj4&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;niniz&quot; data-emoticon-name=&quot;010&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/010.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/niniz/large/010.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blueberries-3460423_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PXxIn/btsJQdIa1wl/vzufXajJ2zPJX4XbassFxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PXxIn/btsJQdIa1wl/vzufXajJ2zPJX4XbassFxk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PXxIn/btsJQdIa1wl/vzufXajJ2zPJX4XbassFxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPXxIn%2FbtsJQdIa1wl%2FvzufXajJ2zPJX4XbassFxk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;853&quot; data-filename=&quot;blueberries-3460423_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사진 - 픽사베이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/Piezo Buzzer</category>
      <category>멜로디</category>
      <category>아두이노</category>
      <category>아틀란티스 소녀</category>
      <category>피에조부저</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/217</guid>
      <comments>https://postpop.tistory.com/217#entry217comment</comments>
      <pubDate>Sun, 29 Sep 2024 20:13:56 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 - 피에조 부저 멜로디 - 조덕배 꿈에</title>
      <link>https://postpop.tistory.com/216</link>
      <description>&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;006&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/006.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/006.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;조덕배 '꿈에' 피에조부저 멜로디 코드입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_조덕배_꿈에.png&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;2873&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wu5dO/btsK19Y3yEK/bhkmT0fYz3K9EgL1tsQrb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wu5dO/btsK19Y3yEK/bhkmT0fYz3K9EgL1tsQrb1/img.png&quot; data-alt=&quot;조덕배 '꿈에' 피에조부저용 악보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wu5dO/btsK19Y3yEK/bhkmT0fYz3K9EgL1tsQrb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwu5dO%2FbtsK19Y3yEK%2FbhkmT0fYz3K9EgL1tsQrb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;2873&quot; data-filename=&quot;edited_조덕배_꿈에.png&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;2873&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;조덕배 '꿈에' 피에조부저용 악보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/tqcz8/btsJPTo5raI/0WvfzQJkYkDKiRI86j9Cr1/melody_dream-JO.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;melody_dream-JO.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 3.본문 배너1 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8269928309278636&quot; data-ad-slot=&quot;3647290720&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1727440060751&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 코드 설명 https://postpop.tistory.com/98

// 12화음 이름 정의
typedef enum {
  NOTE_C, NOTE_Cs, NOTE_D, NOTE_Eb, NOTE_E, NOTE_F, NOTE_Fs, NOTE_G, NOTE_Gs, 
  NOTE_A, NOTE_Bb, NOTE_B, NOTE_MAX
} note_t;

// 화음별 피에조 부저 진동수 정의 및 옥타브에 따른 값 변경 함수
double ledcWriteNote(note_t note, uint8_t octave){
  const uint16_t noteFrequencyBase[12] = {
  //  1      2      3      4      5      6     7       8     9       10    11      12
  //  C      C#     D      Eb     E      F     F#      G     G#      A     Bb      B
     4186,  4435,  4699,  4978,  5274,  5588,  5920,  6272,  6645,  7040,  7459,  7902
  };
  if(octave &amp;gt; 8 || note &amp;gt;= NOTE_MAX){
    return 0;
  }
  double noteFreq =  (double)noteFrequencyBase[note] / (double)(1 &amp;lt;&amp;lt; (8-octave));
  return noteFreq;
}

// ---------------------------------------------------------------------- 조덕배 꿈에
uint8_t Tempo = 70;
float tempoRatio = float(Tempo)/60.0;
uint8_t KeySign = 9;
uint8_t octaveTemp = 4;
float beatTime = 4/4;

const note_t Mnote[] PROGMEM= {
NOTE_D,NOTE_F,NOTE_A,NOTE_E,NOTE_MAX,NOTE_F,NOTE_A,NOTE_D,NOTE_F,NOTE_MAX,NOTE_D,NOTE_F,NOTE_A,NOTE_E,NOTE_MAX,NOTE_A,NOTE_D,NOTE_F,NOTE_A,NOTE_MAX,NOTE_MAX,NOTE_F,
NOTE_A,NOTE_MAX,NOTE_A,NOTE_B,NOTE_C,NOTE_MAX,NOTE_C,NOTE_C,NOTE_B,NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_G,NOTE_F,
NOTE_G,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_F,NOTE_G,NOTE_MAX,NOTE_E,NOTE_D,NOTE_C,NOTE_D,
NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_G,NOTE_A,NOTE_B,NOTE_A,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_F,
NOTE_G,NOTE_A,NOTE_G,NOTE_MAX,NOTE_C,NOTE_D,NOTE_D,NOTE_MAX,NOTE_F,
NOTE_A,NOTE_MAX,NOTE_F,NOTE_G,NOTE_A,NOTE_B,NOTE_C,NOTE_MAX,NOTE_A,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_B,NOTE_B,
NOTE_C,NOTE_B,NOTE_B,NOTE_MAX,NOTE_A,NOTE_A,NOTE_G,NOTE_F,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_G,
NOTE_A,NOTE_E,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_F,NOTE_G,NOTE_B,NOTE_MAX,NOTE_A,NOTE_A,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_F,
NOTE_G,NOTE_MAX,NOTE_G,NOTE_F,NOTE_E,NOTE_C,NOTE_D,NOTE_E,NOTE_D,NOTE_MAX,NOTE_F,
NOTE_A,NOTE_MAX,NOTE_F,NOTE_F,NOTE_G,NOTE_A,NOTE_B,NOTE_C,NOTE_MAX,NOTE_A,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_B,NOTE_B,
NOTE_C,NOTE_B,NOTE_B,NOTE_MAX,NOTE_A,NOTE_A,NOTE_G,NOTE_F,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_G,
NOTE_A,NOTE_E,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_E,NOTE_G,NOTE_G,NOTE_B,NOTE_A,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_F,
NOTE_G,NOTE_MAX,NOTE_G,NOTE_F,NOTE_E,NOTE_C,NOTE_D,NOTE_E,NOTE_D,NOTE_MAX,NOTE_E,NOTE_F,
NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_E,NOTE_C,NOTE_A,NOTE_F,NOTE_MAX,NOTE_E,NOTE_D,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_D,NOTE_C,NOTE_B,NOTE_D,
NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_G,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_C,NOTE_B,NOTE_A,NOTE_C,
NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_E,NOTE_E,NOTE_E,NOTE_MAX,NOTE_D,NOTE_MAX,NOTE_MAX,NOTE_D,NOTE_B,NOTE_B,NOTE_B,NOTE_B,
NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_C,NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_F,
NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_E,NOTE_E,NOTE_E,NOTE_MAX,NOTE_D,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_D,NOTE_C,NOTE_B,NOTE_D,
NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_F,NOTE_F,NOTE_A,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_C,NOTE_B,NOTE_A,NOTE_C,
NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_MAX,NOTE_D,NOTE_D,NOTE_MAX,NOTE_MAX,NOTE_D,NOTE_B,NOTE_B,NOTE_B,NOTE_B,
NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_C,NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_F,
NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_C,NOTE_A,NOTE_C,NOTE_B,NOTE_MAX,
NOTE_MAX,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_A,NOTE_MAX,NOTE_MAX,NOTE_A,NOTE_B,
NOTE_C,NOTE_MAX,NOTE_B,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_G,NOTE_F,
NOTE_E,NOTE_F,NOTE_G,NOTE_E,NOTE_D,NOTE_C,NOTE_D,NOTE_A,NOTE_A,NOTE_MAX,
NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_A,NOTE_B,NOTE_A,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_F,NOTE_G,NOTE_A,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_C,
NOTE_D,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_F,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_E,NOTE_C,NOTE_A,NOTE_F,NOTE_MAX,NOTE_E,NOTE_D,
NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_D,NOTE_C,NOTE_B,NOTE_D,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_A,NOTE_A,NOTE_A,
NOTE_MAX,NOTE_G,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_C,NOTE_B,NOTE_A,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_E,NOTE_E,NOTE_E,
NOTE_MAX,NOTE_D,NOTE_MAX,NOTE_MAX,NOTE_D,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_C,NOTE_B,NOTE_A,
NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_E,NOTE_E,NOTE_E,
NOTE_MAX,NOTE_D,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_D,NOTE_C,NOTE_B,NOTE_D,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_F,NOTE_F,NOTE_A,NOTE_MAX,
NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_C,NOTE_B,NOTE_A,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_E,
NOTE_MAX,NOTE_D,NOTE_D,NOTE_MAX,NOTE_MAX,NOTE_D,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_C,NOTE_B,NOTE_A,
NOTE_A,NOTE_G,NOTE_F,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_F,NOTE_C,NOTE_A,
NOTE_C,NOTE_B,NOTE_MAX,NOTE_MAX,
};

const uint8_t Moct[] PROGMEM= {
3,3,3,4,0,3,3,4,4,0,3,3,3,4,0,3,4,4,4,0,3,4,
4,4,4,4,5,5,5,5,4,4,4,4,4,4,4,
4,4,4,4,4,0,4,4,4,4,0,5,5,5,5,
4,4,4,0,0,4,4,4,4,4,0,0,4,4,
4,4,4,0,4,4,4,4,4,
4,4,4,4,4,4,5,0,4,4,0,4,4,4,
5,4,4,0,4,4,4,4,4,4,0,4,4,4,4,
4,4,0,4,4,4,4,4,0,4,4,0,4,4,4,
4,0,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,5,0,4,4,0,4,4,4,
5,4,4,0,4,4,4,4,4,4,0,4,4,4,4,
4,4,0,4,4,4,4,4,4,4,0,4,4,4,
4,0,4,4,4,4,4,4,4,4,4,4,
4,4,0,4,4,4,3,4,0,4,4,0,4,4,5,5,4,5,
0,4,4,4,4,4,0,4,4,0,4,4,5,4,4,5,
0,4,4,4,4,4,0,4,0,4,4,4,4,4,4,
0,4,5,5,4,4,4,4,4,4,0,4,4,4,4,4,
0,4,5,5,5,5,0,5,0,4,4,5,5,4,5,
0,4,4,4,4,4,0,4,4,4,4,0,4,4,5,4,4,5,
0,4,4,4,4,4,0,4,4,0,4,4,4,4,4,4,
0,4,5,5,4,4,4,4,4,4,0,4,4,4,4,4,
0,4,4,5,4,5,4,0,
4,4,4,4,4,4,4,0,4,4,4,
5,0,4,4,4,4,4,4,4,4,4,0,4,4,4,
4,4,4,5,5,5,5,4,4,0,
4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,0,4,4,
4,4,4,4,4,4,4,0,4,4,4,3,4,0,4,4,
0,4,4,5,5,4,5,0,4,4,4,4,4,
0,4,4,0,4,4,5,4,4,5,0,4,4,4,4,4,
0,4,0,4,4,4,4,4,4,0,4,5,5,4,4,
4,4,4,4,0,4,4,4,4,4,0,4,5,5,5,5,
0,5,0,4,4,5,5,4,5,0,4,4,4,4,4,0,
4,4,4,4,0,4,4,5,4,4,5,0,4,4,4,4,4,
0,4,4,0,4,4,4,4,4,4,0,4,5,5,4,4,
4,4,4,4,0,4,4,4,4,4,0,4,4,5,4,
5,4,0,4,
0,
};

const uint8_t localKey[] PROGMEM= {
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,3,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,
1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,
0,0,0,0,
0,
};

const uint8_t Mdur[] PROGMEM= {
16,
1,1,1,1,4,1,1,1,1,4,1,1,1,1,4,1,1,1,1,2,1,1,
12,2,1,1,6,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,8,3,2,1,1,4,3,1,2,2,
2,1,1,4,6,1,1,2,1,1,4,6,1,1,
2,1,1,4,6,2,12,3,1,
8,2,1,1,2,1,1,1,2,1,8,2,1,1,
2,1,1,2,2,1,3,2,1,1,12,1,1,1,1,
1,3,4,3,1,2,1,1,2,1,1,8,2,1,1,
4,1,2,1,3,1,2,2,12,3,1,
8,1,1,1,1,2,1,1,1,2,1,8,2,1,1,
2,1,1,2,2,1,3,2,1,1,12,1,1,1,1,
1,3,4,3,1,1,1,2,1,3,8,2,1,1,
4,1,2,1,3,1,2,2,12,2,1,1,
1,3,1,2,1,2,1,1,2,1,1,8,3,1,1,1,1,1,
8,3,1,2,1,1,2,1,1,4,3,1,1,1,1,1,
8,3,1,2,1,1,3,1,6,1,1,1,1,1,1,
8,1,2,1,2,2,1,1,1,1,6,1,1,2,1,1,
8,3,1,2,1,1,3,1,6,1,1,1,1,1,1,
8,1,2,1,1,2,1,1,1,1,1,4,3,1,1,1,1,1,
8,3,1,2,1,1,2,1,1,6,1,1,1,1,1,1,
8,1,2,1,2,2,1,1,1,1,6,1,1,2,1,1,
8,3,1,2,2,3,1,12,
12,1,2,1,1,1,2,8,2,1,1,
8,2,2,1,1,2,1,1,1,1,2,6,1,2,1,
1,1,8,4,1,1,2,1,1,12,
2,1,1,1,1,1,1,1,3,1,1,1,1,1,3,8,2,2,
8,4,2,1,1,1,3,1,2,1,2,1,1,2,1,1,
8,3,1,1,1,1,1,8,3,1,2,1,1,
2,1,1,4,3,1,1,1,1,1,8,3,1,2,1,1,
3,1,6,1,1,1,1,1,1,8,1,2,1,2,2,
1,1,1,1,6,1,1,2,1,1,8,3,1,2,1,1,
3,1,6,1,1,1,1,1,1,8,1,2,1,1,2,1,
1,1,1,1,4,3,1,1,1,1,1,8,3,1,2,1,1,
2,1,1,6,1,1,1,1,1,1,8,1,2,1,2,2,
1,1,1,1,6,1,1,2,1,1,8,3,1,2,2,
3,1,12,16,
};
// ----------------------------------------------------------------------

uint8_t noteNum = 0;

note_t keySignature(note_t note) {
  if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 0) {
    if (KeySign == 1) { 
      if (note == NOTE_B) note = NOTE_Bb;
    } else if (KeySign == 2) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
    } else if (KeySign == 3) {
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
    } else if (KeySign == 4) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
    } else if (KeySign == 5) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
    } else if (KeySign == 6) {
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
    } else if (KeySign == 7) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
      else if (note == NOTE_F) note = NOTE_E;
    } else if (KeySign == 8) { 
      if (note == NOTE_F) note = NOTE_Fs;
    } else if (KeySign == 9) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
    } else if (KeySign == 10) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
    } else if (KeySign == 11) { 
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
    } else if (KeySign == 12) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
    } else if (KeySign == 13) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_F;
    } else if (KeySign == 14) { 
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_F;
      else if (note == NOTE_B) { note = NOTE_C; octaveTemp += 1; }
    }
  }
  else { // 1. natural
    if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 2) { // 2. b
      if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_F) note = NOTE_E;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_B) note = NOTE_Bb;
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 3) { // 2. #
      if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_E) note = NOTE_F;
      else if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_B) { note = NOTE_C; octaveTemp += 1; }
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 4) { // 4. bb
      if (note == NOTE_C) { note = NOTE_Bb; octaveTemp -= 1; }
      else if (note == NOTE_D) note = NOTE_C;
      else if (note == NOTE_E) note = NOTE_D;
      else if (note == NOTE_F) note = NOTE_Eb;
      else if (note == NOTE_G) note = NOTE_F;
      else if (note == NOTE_A) note = NOTE_G;
      else if (note == NOTE_B) note = NOTE_A;
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 5) { // 5. ##
      if (note == NOTE_C) note = NOTE_D;
      else if (note == NOTE_D) note = NOTE_E;
      else if (note == NOTE_E) note = NOTE_Fs;
      else if (note == NOTE_F) note = NOTE_G;
      else if (note == NOTE_G) note = NOTE_A;
      else if (note == NOTE_A) note = NOTE_B;
      else if (note == NOTE_B) { note = NOTE_Cs; octaveTemp += 1; }
    }
  }
  return note;
}
// ----------------------------------------------------------------------

int beepPin = 10;

void setup() {
  Serial.begin(9600);
}

bool beepMelody = false;
unsigned long int beepTime = 0;

// 시리얼 모니터에서 0을 입력하면 멜로디 재생
// 0을 한번더 입력하면 멜로디 정지

void loop() {
  if(Serial.available() &amp;gt; 0){
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if (temp == &quot;0&quot;) {
      beepMelody = !beepMelody;
      noteNum = 0; beepTime = 0;
      if (!beepMelody) noTone(beepPin);  
    }
  }
  if (beepMelody) {
    if (millis() - beepTime &amp;gt;= pgm_read_byte(&amp;amp;Mdur[noteNum])*(1000/(4*tempoRatio))) {
      beepTime = millis();
      noTone(beepPin);
      octaveTemp = pgm_read_byte(&amp;amp;Moct[noteNum]);
      note_t KeyNote = keySignature(pgm_read_word(&amp;amp;Mnote[noteNum]));
      tone(beepPin, ledcWriteNote(KeyNote, octaveTemp));  // ledcWriteNote(uint8_t channel, note_t note, uint8_t octaveTemp);
      noteNum++;
      if (noteNum == sizeof(Mdur)) { // 초기화
        noTone(beepPin);  
        noteNum = 0; 
        beepMelody = false;
      }
    }
  } 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;*참조악보*&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/Lt8VeR-FjxI?feature=shared&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/Lt8VeR-FjxI?feature=shared&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=Lt8VeR-FjxI&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bI0U9L/hyXayYzr3y/fGPNu9BkmXB9X1HhyPbNw0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;조덕배 - 꿈에 MR&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Lt8VeR-FjxI&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;019&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/019.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;raspberries-7313700_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;848&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WevE3/btsJPcC5BaZ/uC9bKcPOmZszQOed249iH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WevE3/btsJPcC5BaZ/uC9bKcPOmZszQOed249iH1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WevE3/btsJPcC5BaZ/uC9bKcPOmZszQOed249iH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWevE3%2FbtsJPcC5BaZ%2FuC9bKcPOmZszQOed249iH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;848&quot; data-filename=&quot;raspberries-7313700_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;848&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사진 - 픽사베이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/Piezo Buzzer</category>
      <category>아두이노</category>
      <category>조덕배 꿈에</category>
      <category>피에조부저</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/216</guid>
      <comments>https://postpop.tistory.com/216#entry216comment</comments>
      <pubDate>Fri, 27 Sep 2024 21:30:46 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 - 피에조 부저 멜로디 아기상어</title>
      <link>https://postpop.tistory.com/215</link>
      <description>&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아두이노 우노, 피에조 부저를 이용한 아기상어 멜로디 코드와 악보입니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_아기상어_악보.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;2155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ecqEMv/btsJrHa6nZd/584tgaHDkPppoMgxSL0ezk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ecqEMv/btsJrHa6nZd/584tgaHDkPppoMgxSL0ezk/img.png&quot; data-alt=&quot;아기상어 악보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ecqEMv/btsJrHa6nZd/584tgaHDkPppoMgxSL0ezk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FecqEMv%2FbtsJrHa6nZd%2F584tgaHDkPppoMgxSL0ezk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;2155&quot; data-filename=&quot;edited_아기상어_악보.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;2155&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아기상어 악보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 3.본문 배너1 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8269928309278636&quot; data-ad-slot=&quot;3647290720&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bvaBdZ/btsJrm6ggO1/U5TjqKRARX4PGXRXXSvhek/melody_babyshark.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;melody_babyshark.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1725443179812&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 코드 설명 https://postpop.tistory.com/98

// 12화음 이름 정의
typedef enum {
  NOTE_C, NOTE_Cs, NOTE_D, NOTE_Eb, NOTE_E, NOTE_F, NOTE_Fs, NOTE_G, NOTE_Gs, 
  NOTE_A, NOTE_Bb, NOTE_B, NOTE_MAX
} note_t;

// 화음별 피에조 부저 진동수 정의 및 옥타브에 따른 값 변경 함수
double ledcWriteNote(note_t note, uint8_t octave){
  const uint16_t noteFrequencyBase[12] = {
  //  1      2      3      4      5      6     7       8     9       10    11      12
  //  C      C#     D      Eb     E      F     F#      G     G#      A     Bb      B
     4186,  4435,  4699,  4978,  5274,  5588,  5920,  6272,  6645,  7040,  7459,  7902
  };
  if(octave &amp;gt; 8 || note &amp;gt;= NOTE_MAX){
    return 0;
  }
  double noteFreq =  (double)noteFrequencyBase[note] / (double)(1 &amp;lt;&amp;lt; (8-octave));
  return noteFreq;
}

// ---------------------------------------------------------------------- 아기상어
uint8_t Tempo = 120;
float tempoRatio = float(Tempo)/60.0;
uint8_t KeySign = 0;
uint8_t octaveTemp = 4;
float beatTime = 4/4;

const note_t Mnote[] PROGMEM= {
NOTE_D,NOTE_E,NOTE_D,NOTE_E,NOTE_D,NOTE_E,NOTE_D,NOTE_E,NOTE_D,NOTE_E,NOTE_D,NOTE_E,NOTE_D,NOTE_E,NOTE_D,NOTE_E,
NOTE_G,NOTE_F,NOTE_G,NOTE_A,NOTE_G,NOTE_F,NOTE_D,NOTE_F,NOTE_G,NOTE_F,NOTE_G,NOTE_A,NOTE_G,NOTE_F,NOTE_D,NOTE_F,NOTE_G,NOTE_F,NOTE_G,NOTE_A,NOTE_G,NOTE_F,NOTE_D,NOTE_F,NOTE_A,NOTE_MAX,NOTE_MAX,NOTE_D,NOTE_E,
NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_D,NOTE_E,
NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_D,NOTE_E,
NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_D,NOTE_D,NOTE_E,
NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_D,NOTE_E,
NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_D,NOTE_E,
NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_D,NOTE_E,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_MAX,NOTE_MAX,NOTE_D,NOTE_F,
NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_E,NOTE_F,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_E,NOTE_F,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_G,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_F,
NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_E,NOTE_F,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_E,NOTE_F,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_G,NOTE_MAX,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_F,
NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_E,NOTE_F,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_E,NOTE_F,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_B,NOTE_MAX,NOTE_B,NOTE_B,NOTE_B,NOTE_B,NOTE_A,NOTE_E,NOTE_F,NOTE_MAX,NOTE_E,NOTE_F,NOTE_A,NOTE_MAX,NOTE_MAX,
};

const uint8_t Moct[] PROGMEM= {
3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5,
4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,4,4,0,4,4,4,4,4,4,4,0,4,4,4,4,4,
0,
};

const uint8_t localKey[] PROGMEM= {
0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,
0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,3,0,
2,0,2,2,2,0,2,2,2,0,2,0,2,2,2,0,2,2,2,0,2,0,2,2,2,0,2,2,2,2,0,0,0,0,2,0,
2,0,2,2,2,0,2,2,2,0,2,0,2,2,2,0,2,2,2,0,2,0,2,2,2,0,2,2,2,2,0,0,0,0,2,0,
2,0,2,2,2,0,2,2,2,0,2,0,2,2,2,0,2,2,2,0,2,0,2,2,2,0,2,2,2,2,2,2,0,0,2,0,2,0,0,
0,
};

const uint8_t Mdur[] PROGMEM= {
16,
8,8,8,8,4,4,4,4,2,2,2,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,4,4,
2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,4,4,2,2,
2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,4,4,2,2,
2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,4,2,2,2,2,
2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,4,4,2,2,
2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,4,4,2,2,
2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,4,4,2,2,
2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,4,4,2,2,
2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,4,4,2,2,
2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,4,
};
// ----------------------------------------------------------------------

uint8_t noteNum = 0;

note_t keySignature(note_t note) {
  if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 0) {
    if (KeySign == 1) { 
      if (note == NOTE_B) note = NOTE_Bb;
    } else if (KeySign == 2) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
    } else if (KeySign == 3) {
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
    } else if (KeySign == 4) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
    } else if (KeySign == 5) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
    } else if (KeySign == 6) {
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
    } else if (KeySign == 7) { 
      if (note == NOTE_B) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
      else if (note == NOTE_F) note = NOTE_E;
    } else if (KeySign == 8) { 
      if (note == NOTE_F) note = NOTE_Fs;
    } else if (KeySign == 9) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
    } else if (KeySign == 10) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
    } else if (KeySign == 11) { 
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
    } else if (KeySign == 12) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
    } else if (KeySign == 13) {
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_F;
    } else if (KeySign == 14) { 
      if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_E) note = NOTE_F;
      else if (note == NOTE_B) { note = NOTE_C; octaveTemp += 1; }
    }
  }
  else { // 1. natural
    if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 2) { // 2. b
      if (note == NOTE_C) { note = NOTE_B; octaveTemp -= 1; }
      else if (note == NOTE_D) note = NOTE_Cs;
      else if (note == NOTE_E) note = NOTE_Eb;
      else if (note == NOTE_F) note = NOTE_E;
      else if (note == NOTE_G) note = NOTE_Fs;
      else if (note == NOTE_A) note = NOTE_Gs;
      else if (note == NOTE_B) note = NOTE_Bb;
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 3) { // 2. #
      if (note == NOTE_C) note = NOTE_Cs;
      else if (note == NOTE_D) note = NOTE_Eb;
      else if (note == NOTE_E) note = NOTE_F;
      else if (note == NOTE_F) note = NOTE_Fs;
      else if (note == NOTE_G) note = NOTE_Gs;
      else if (note == NOTE_A) note = NOTE_Bb;
      else if (note == NOTE_B) { note = NOTE_C; octaveTemp += 1; }
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 4) { // 4. bb
      if (note == NOTE_C) { note = NOTE_Bb; octaveTemp -= 1; }
      else if (note == NOTE_D) note = NOTE_C;
      else if (note == NOTE_E) note = NOTE_D;
      else if (note == NOTE_F) note = NOTE_Eb;
      else if (note == NOTE_G) note = NOTE_F;
      else if (note == NOTE_A) note = NOTE_G;
      else if (note == NOTE_B) note = NOTE_A;
    }
    else if (pgm_read_byte(&amp;amp;localKey[noteNum]) == 5) { // 5. ##
      if (note == NOTE_C) note = NOTE_D;
      else if (note == NOTE_D) note = NOTE_E;
      else if (note == NOTE_E) note = NOTE_Fs;
      else if (note == NOTE_F) note = NOTE_G;
      else if (note == NOTE_G) note = NOTE_A;
      else if (note == NOTE_A) note = NOTE_B;
      else if (note == NOTE_B) { note = NOTE_Cs; octaveTemp += 1; }
    }
  }
  return note;
}
// ----------------------------------------------------------------------

int beepPin = 10;

void setup() {
  Serial.begin(9600);
}

bool beepMelody = false;
unsigned long int beepTime = 0;

// 시리얼 모니터에서 0을 입력하면 멜로디 재생
// 0을 한번더 입력하면 멜로디 정지

void loop() {
  if(Serial.available() &amp;gt; 0){
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if (temp == &quot;0&quot;) {
      beepMelody = !beepMelody;
      noteNum = 0; beepTime = 0;
      if (!beepMelody) noTone(beepPin);  
    }
  }
  if (beepMelody) {
    if (millis() - beepTime &amp;gt;= pgm_read_byte(&amp;amp;Mdur[noteNum])*(1000/(4*tempoRatio))) {
      beepTime = millis();
      noTone(beepPin);
      octaveTemp = pgm_read_byte(&amp;amp;Moct[noteNum]);
      note_t KeyNote = keySignature(pgm_read_word(&amp;amp;Mnote[noteNum]));
      tone(beepPin, ledcWriteNote(KeyNote, octaveTemp));  // ledcWriteNote(uint8_t channel, note_t note, uint8_t octaveTemp);
      noteNum++;
      if (noteNum == sizeof(Mdur)) { // 초기화
        noTone(beepPin);  
        noteNum = 0; 
        beepMelody = false;
      }
    }
  } 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;028&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/028.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/028.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;fresh-fruits-2305192_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;719&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rdikL/btsJqfNOPRR/fghkhMV9K83k6UhwKcFTfk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rdikL/btsJqfNOPRR/fghkhMV9K83k6UhwKcFTfk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rdikL/btsJqfNOPRR/fghkhMV9K83k6UhwKcFTfk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrdikL%2FbtsJqfNOPRR%2FfghkhMV9K83k6UhwKcFTfk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;719&quot; data-filename=&quot;fresh-fruits-2305192_1280.jpg&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;719&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사진 - 픽사베이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/Piezo Buzzer</category>
      <category>아기상어</category>
      <category>아두이노</category>
      <category>피에조부저</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/215</guid>
      <comments>https://postpop.tistory.com/215#entry215comment</comments>
      <pubDate>Wed, 4 Sep 2024 18:52:20 +0900</pubDate>
    </item>
    <item>
      <title>미니벨로 자전거를 전기자전거 변환키트를 이용하여 전기자전거로 만들어 보았습니다.</title>
      <link>https://postpop.tistory.com/212</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자전거를 전기 자전거로 개조하기 위해서는 브러쉬리스 모터가 장착된 림, 전기자전거 컨트롤러, 컨트롤 LCD, 전용 브레이크 레버, 모터 스로틀, PAS 센서 등이 필요합니다. 별도로 구매하려면 호환성 여부등 확인할 수 있는 방법이 별로 없기에 변환키트를 구입하는 게 좋은 방법입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구입한 변환키트는 350W/36V/16인치 휠셋으로 36V 리튬이온 배터리 팩(별도 구매)으로 구동할 수 있습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;변환키트구매.jpg&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3gMUa/btsJlV2PQGo/QSJP7UsmFN3mZDBPkvaYW0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3gMUa/btsJlV2PQGo/QSJP7UsmFN3mZDBPkvaYW0/img.jpg&quot; data-alt=&quot;LCD S866 칼라 디스플레이/모터구동 전압 36V/모터 출력 350W/16인치 휠사이즈&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3gMUa/btsJlV2PQGo/QSJP7UsmFN3mZDBPkvaYW0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3gMUa%2FbtsJlV2PQGo%2FQSJP7UsmFN3mZDBPkvaYW0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;389&quot; data-filename=&quot;변환키트구매.jpg&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LCD S866 칼라 디스플레이/모터구동 전압 36V/모터 출력 350W/16인치 휠사이즈&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전기자전거 변환키트 구매 사이트에서는 보통 구성설정(디스플레이 종류, PAS 센서 유무, 스로틀 타입 등 선택)과 작동전압, 모터 출력, 바퀴사이즈를 선택할 수 있습니다. 작동전압 36V와 48V선택 시에는 배터리 팩 가격 및 크기, 크기에 따르는 배터리 장착 위치, 배터리 케이스 또는 거치방법, 모터 구동 시 전압강하 등을 고려해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;36V 배터리 팩은 48V보다 저렴하고 크기가 적당하다고 판단했습니다. 전압강하에서는 48V 배터리가 강하폭이 조금 더 작아 유리합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 개조하고자 하는 자전거와 호환성 여부를 확인해야 합니다.&amp;nbsp;대표적으로 자전거&amp;nbsp;프레임&amp;nbsp;포크의&amp;nbsp;바퀴고정&amp;nbsp;방법이&amp;nbsp;개방형&amp;nbsp;드롭아웃&amp;nbsp;프레임인지&amp;nbsp;볼트&amp;nbsp;고정식인지&amp;nbsp;또는&amp;nbsp;QR방식인지를&amp;nbsp;파악하고&amp;nbsp;그에&amp;nbsp;맞는&amp;nbsp;모터허브를&amp;nbsp;제공하는&amp;nbsp;판매&amp;nbsp;사이트에서&amp;nbsp;구입해야&amp;nbsp;합니다.&amp;nbsp;개조하고자 하는 닥터바이크 F-16은 개방형 드롭아웃 프레임입니다. 또한 변속기어 스크라켓 장착방식도 확인해야 합니다. F-16은 프리휠 고정 방식입니다. 따라서 구입하고자 하는 모터허브의 변속기어 스프라켓 장착타입 역시 이와 일치해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구입 시 가격: $112.25&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운송비: &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;$&lt;/span&gt;25.26&lt;/p&gt;
&lt;figure id=&quot;og_1725057891122&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;250W-500W Electric Bicycle Conversion Kit 36V48V Rear Rotate Wheel Hub Motor Electric Bicycle kit 16-29inch700C Rear Drop 135mm &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DloYJEB&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006105550948.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DloYJEB&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=ab8126249a3342c585cfe940c4f803b6-1725057886943-05683-_DloYJEB&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yATdI/hyWV6CjcHJ/10a4EPMfp7VHrC2HLIzMQK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DloYJEB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DloYJEB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yATdI/hyWV6CjcHJ/10a4EPMfp7VHrC2HLIzMQK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;250W-500W Electric Bicycle Conversion Kit 36V48V Rear Rotate Wheel Hub Motor Electric Bicycle kit 16-29inch700C Rear Drop 135mm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▲ 상기 물품은 판매중지되었네요. 16인치 바퀴용 제품을 판매하는 업체가 많이 줄었습니다.&amp;nbsp; 20인치 부터는 많습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16인치 비슷한 물품&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_ooznUUP&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_ooznUUP&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731227579537&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Brushless Gear DC Electric Bike Hub Motor Kit, Bicycle Front Wheel, DIY, 16 Inch, 48V, 36V, 24V, 350W - AliExpress 18&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_ooznUUP&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007219251552.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_ooznUUP&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=9d76d04f5e374588a8e1b0a33d4f6947-1731227575109-05807-_ooznUUP&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/euj8qH/hyXsTXxKh5/3k0kE9eO5ou1unp1yXbF80/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_ooznUUP&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_ooznUUP&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/euj8qH/hyXsTXxKh5/3k0kE9eO5ou1unp1yXbF80/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Brushless Gear DC Electric Bike Hub Motor Kit, Bicycle Front Wheel, DIY, 16 Inch, 48V, 36V, 24V, 350W - AliExpress 18&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ ※&amp;nbsp; ※ 전기자전거로 개조하는 것보다는 전기자전거 자체를 사는게 더욱 저렴할 것 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배터리 용량에 따라 가격차이가 나며 비싼만큼 오래 탑니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자전거 및 개조 키트 구입, 악세서리, 운송비로 50만원 이상 소요되었으며 개조에 걸리는 시간등 노동력을 생각하면 적당한 가격의 전기자전거를 구매하는게 나을 것 같다는 생각입니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oERiF3t&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_oERiF3t&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731228500567&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;400W Ebike 35km/h 48V 30AH Removable Battery Electric Bike Multi-Shock Absorption City Commuter Foldable Adult Electric Bicycle &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_oERiF3t&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006608083759.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_oERiF3t&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=5a9c711c41b0492b8e5436e6fb3ec648-1731228344322-02425-_oERiF3t&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/J9dH7/hyXwninpwx/kLcOn0jRjVfG7IPBkzJwwk/img.jpg?width=1600&amp;amp;height=1600&amp;amp;face=0_0_1600_1600&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oERiF3t&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_oERiF3t&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/J9dH7/hyXwninpwx/kLcOn0jRjVfG7IPBkzJwwk/img.jpg?width=1600&amp;amp;height=1600&amp;amp;face=0_0_1600_1600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;400W Ebike 35km/h 48V 30AH Removable Battery Electric Bike Multi-Shock Absorption City Commuter Foldable Adult Electric Bicycle&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ebike&amp;nbsp;탈착식&amp;nbsp;배터리&amp;nbsp;전기&amp;nbsp;자전거,&amp;nbsp;멀티&amp;nbsp;충격&amp;nbsp;흡수,&amp;nbsp;도시&amp;nbsp;통근자&amp;nbsp;접이식&amp;nbsp;성인&amp;nbsp;전기&amp;nbsp;자전거,&amp;nbsp;400W,&amp;nbsp;35&amp;nbsp;km/h,&amp;nbsp;48V,&amp;nbsp;30AH&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oovNaLV&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_oovNaLV&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731228561601&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;ZPW Ebike K100 400W 48V 30AH Electric bike Adult Fat Tire Folding Electric Bicycle City Commuter Electric Bike Urban Ebike - Ali&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_oovNaLV&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007585194746.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_oovNaLV&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=6bd412563f85432690e3125f45907ffe-1731228556900-03231-_oovNaLV&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tsMGB/hyXwhPZdmw/P7lxJAjY1HB2pAExtxKauk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oovNaLV&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_oovNaLV&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tsMGB/hyXwhPZdmw/P7lxJAjY1HB2pAExtxKauk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ZPW Ebike K100 400W 48V 30AH Electric bike Adult Fat Tire Folding Electric Bicycle City Commuter Electric Bike Urban Ebike - Ali&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;ZPW 전기 자전거 K100 400W 48V 30AH 성인용 팻 타이어 접이식 전기 자전거, 도시 통근 전기 자전거, 도시 전기 자전거&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 36V 배터리 팩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배터리 팩 구입 시 우선 고려한 사항은 배터리 사이즈와 그에 따르는 보관방법 및 적당한 케이스를 선택할 수 있는가였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: left;&quot;&gt;배터리 팩 크기: 290&amp;nbsp;*&amp;nbsp;68&amp;nbsp;*&amp;nbsp;40&amp;nbsp;mm(&amp;plusmn;3mm)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: left;&quot;&gt;용량:36V/100Ah(간단히 계산하면 10A로 10시간 사용가능 - 실사용 시간은 이런 식으로 계산되지 않습니다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가적으로 고려할 사항으로 배터리와 전기자전거 컨트롤러와의 연결 방식(커넥터)의 선택입니다. 구입한 전기자전거 변환키트의 컨트롤러는 배터리 연결부의 커넥터로 PP30을 사용하고 있습니다. 하지만 PP30 커넥터로 구성된 배터리 팩을 찾을 수 없었습니다. PP30과 배터리 팩에서 제공하는 커넥터의 종류에 대응하는 전원 커넥터 변환 케이블이 있는지 확인한 후에 XT60+DC잭 옵션을 선택했습니다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;전원&lt;/span&gt;&amp;nbsp;커넥터 변환 케이블은 XT60-PP30 구성입니다. XT60 커넥터는 전기자전거 컨트롤러에 변환 케이블을 통해 연결되고 DC잭은 배터리 충전기와 연결되어 전기를 충전하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;컨트롤러_배선_커넥터.jpg&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJNDkA/btsJnuikYHS/nmGej5jzddbOlMbKQBn321/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJNDkA/btsJnuikYHS/nmGej5jzddbOlMbKQBn321/img.jpg&quot; data-alt=&quot;전기자전거 컨트롤러 커넥터 구성 - 잘못 연결되지 않도록 커넥터 종류 또는 암/수 등으로 구분되어 있습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJNDkA/btsJnuikYHS/nmGej5jzddbOlMbKQBn321/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJNDkA%2FbtsJnuikYHS%2FnmGej5jzddbOlMbKQBn321%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;561&quot; data-filename=&quot;컨트롤러_배선_커넥터.jpg&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전기자전거 컨트롤러 커넥터 구성 - 잘못 연결되지 않도록 커넥터 종류 또는 암/수 등으로 구분되어 있습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;배터리 구입.jpg&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8VrIu/btsJl5qKJq5/sDZcYVTzjsEkYCsKaIbkD0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8VrIu/btsJl5qKJq5/sDZcYVTzjsEkYCsKaIbkD0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8VrIu/btsJl5qKJq5/sDZcYVTzjsEkYCsKaIbkD0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8VrIu%2FbtsJl5qKJq5%2FsDZcYVTzjsEkYCsKaIbkD0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1219&quot; height=&quot;389&quot; data-filename=&quot;배터리 구입.jpg&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구입 시 가격: $40.25&lt;/p&gt;
&lt;figure id=&quot;og_1725058118433&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;10S3P 100Ah 18650 Rechargeable Lithium Battery Pack 36V Power Modified Bicycle Scooter Electric Vehicle with BMS+charger - AliEx&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DF2yZmB&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007153184354.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DF2yZmB&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=cb810613b56e4692ab72e61507559314-1725058113283-06206-_DF2yZmB&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nrxA4/hyWV2mk3xQ/1lTg99ftagnYnZKKE8yqEk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DF2yZmB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DF2yZmB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nrxA4/hyWV2mk3xQ/1lTg99ftagnYnZKKE8yqEk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;10S3P 100Ah 18650 Rechargeable Lithium Battery Pack 36V Power Modified Bicycle Scooter Electric Vehicle with BMS+charger - AliEx&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 무료배송이고 DHL을 이용한다는데 도착 예정일 보다 빠르게 왔습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 사양의 더 저렴한 배터리를 구입했었으나 배송사고가 발생해서 환불받은 적이 있습니다. 구입 시 배송추적 된다고 했으나 배송정보가 입력되지 않고 있었으며 며칠뒤 상품을 알리에서 내렸고 그 뒤로는 업체가 사라졌습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아직 환불 신청 유예일이 남아 있었으나 배송정보가 입력되지 않았고 업체까지 사라졌으므로 내주문 -&amp;gt; 고객센터 -&amp;gt; 채팅상담에서 요청한 정보 입력 후 환불 처리하였습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 3.본문 배너1 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ XT60-PP30 구성 전원&amp;nbsp;커넥터 변환 케이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구입 시 가격: $5.22&lt;/p&gt;
&lt;figure id=&quot;og_1725061437979&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Ebike Battery Cable Adapter PP30 To XT60 Battery Connector Ebike Battery Cable Electric Bicycle MTB Mountain Road Bike Parts - A&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DDEc5BZ&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007191085462.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DDEc5BZ&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=b8843fc413454efd92107a1b0fc0f2a2-1725061432011-05804-_DDEc5BZ&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/7B7ce/hyWV54uvnB/OV1Ji9XTozHm2HOTnPWMr0/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDEc5BZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DDEc5BZ&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/7B7ce/hyWV54uvnB/OV1Ji9XTozHm2HOTnPWMr0/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ebike Battery Cable Adapter PP30 To XT60 Battery Connector Ebike Battery Cable Electric Bicycle MTB Mountain Road Bike Parts - A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 컨트롤러 및 배터리 보관용 자전거 트라이앵글 방수 하드 케이스(삼각백)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용량 2.5L 더블 집 모델(B67)을 구입하였습니다. 배터리 팩을 약간 기울인 상태에서 빡빡하게 들어갑니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이즈: 약 &lt;span style=&quot;color: #222222; text-align: left;&quot;&gt;290 * 90 * 100 mm&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #222222; text-align: left;&quot;&gt;구입 시 가격: $13.69&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;방수 가방.jpg&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/raEdc/btsJm4j7Tyg/y8UUKpN10Zbw5kQOE8Bya0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/raEdc/btsJm4j7Tyg/y8UUKpN10Zbw5kQOE8Bya0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/raEdc/btsJm4j7Tyg/y8UUKpN10Zbw5kQOE8Bya0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FraEdc%2FbtsJm4j7Tyg%2Fy8UUKpN10Zbw5kQOE8Bya0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;302&quot; data-filename=&quot;방수 가방.jpg&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1725062720430&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;ROCKBROS Hard Shell Bicycle Bag MTB Road Bike Bag Carbon Pattern Waterproof Top Tube Bag Cycling Saddle Bag 1.5L High Capacity -&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DluLimb&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005004370145603.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DluLimb&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=94f76899ad3b4d08b89ad3e031cc54b4-1725062695060-04631-_DluLimb&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JEfYt/hyWVRyoXO7/wOUlC6GeLZ30r7YpIv65rk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DluLimb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DluLimb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JEfYt/hyWVRyoXO7/wOUlC6GeLZ30r7YpIv65rk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ROCKBROS Hard Shell Bicycle Bag MTB Road Bike Bag Carbon Pattern Waterproof Top Tube Bag Cycling Saddle Bag 1.5L High Capacity -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전기자전거 변환키트 수령 및 개봉&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16인치 모터 허브는 충격 방지를 위해 스티로폼으로 보호되어 있으며 각종 전기용품은 별도의 박스에 포장되어 도착했습니다. 추가로 사은품과 컨트롤러 케이스가 포함되어 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCn4Z6/btsJmnExG4C/x5IOFI1mDkPX6zHGzMiGT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCn4Z6/btsJmnExG4C/x5IOFI1mDkPX6zHGzMiGT1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240802_201407.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCn4Z6/btsJmnExG4C/x5IOFI1mDkPX6zHGzMiGT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCn4Z6%2FbtsJmnExG4C%2Fx5IOFI1mDkPX6zHGzMiGT1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4QtGY/btsJmAXTXlq/p53OeLNhNPqCMPKNwXcqy0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4QtGY/btsJmAXTXlq/p53OeLNhNPqCMPKNwXcqy0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240802_201543.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4QtGY/btsJmAXTXlq/p53OeLNhNPqCMPKNwXcqy0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4QtGY%2FbtsJmAXTXlq%2Fp53OeLNhNPqCMPKNwXcqy0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDmrdk/btsJlxA5e8R/bbkMGyckO3XA6Kkr480bBK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDmrdk/btsJlxA5e8R/bbkMGyckO3XA6Kkr480bBK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240802_201945.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDmrdk/btsJlxA5e8R/bbkMGyckO3XA6Kkr480bBK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDmrdk%2FbtsJlxA5e8R%2FbbkMGyckO3XA6Kkr480bBK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;배송 박스/내부 포장/패킹 리스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZW2dS/btsJm27HepS/XAHFrtJWsxQls3OTvjEOxK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZW2dS/btsJm27HepS/XAHFrtJWsxQls3OTvjEOxK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240802_201901.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZW2dS/btsJm27HepS/XAHFrtJWsxQls3OTvjEOxK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZW2dS%2FbtsJm27HepS%2FXAHFrtJWsxQls3OTvjEOxK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIBu9l/btsJmJtFvIn/qF5Ly66FZ8L37OvD1dPYxK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIBu9l/btsJmJtFvIn/qF5Ly66FZ8L37OvD1dPYxK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240802_201927.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIBu9l/btsJmJtFvIn/qF5Ly66FZ8L37OvD1dPYxK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIBu9l%2FbtsJmJtFvIn%2FqF5Ly66FZ8L37OvD1dPYxK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/euQJSj/btsJmucw1kn/UH0EUam4cf3Nkv5KqPcPe0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/euQJSj/btsJmucw1kn/UH0EUam4cf3Nkv5KqPcPe0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240802_202218.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/euQJSj/btsJmucw1kn/UH0EUam4cf3Nkv5KqPcPe0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeuQJSj%2FbtsJmucw1kn%2FUH0EUam4cf3Nkv5KqPcPe0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;모터 허브 보관 상태/사은품, 부품상자/부품상자:컨트롤박스, 브레이크핸들, PAS센서, 스로틀, 모터용 방수 연장 케이블, 브레이크 디스크, S866&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;모터 허브의 림 상태 확인 및 림 테이프 부착&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;림 안쪽을 한 바퀴 살펴보면 스포크(바퀴 살) 장착용 구멍들이 뚫려 있습니다. 그 구멍에 튀어나온 비드가 있다면 비드를 제거해 주어야 합니다. 비드가 바람이 들어간 튜브를 손상시켜 펑크를 유발할 수 있습니다. 한 군데를 발견하여 다이소에서 구입한 2,000원짜리 줄로 제거해 주었습니다. 또한 스포크 장착용 구멍들에 튜브가 손상되지 않도록 림테이프를 붙여줍니다. 미리 구매한 림테이프가 없으므로 매직 스카치테이프 작은 것으로 두 바퀴 둘러주고 튜브 밸브용 구멍은 뚫어 주었습니다. 운이 좋게도 매직 스카치테이프 폭이 구입한 16인치 모터허브의 림 내측 홀 라인 폭과 딱 맞아떨어집니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi0mOb/btsJmvJesb6/jrKRqRmXOeLRrcc7JK1dSK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi0mOb/btsJmvJesb6/jrKRqRmXOeLRrcc7JK1dSK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240825_012442.jpg&quot; style=&quot;width: 31.559%; margin-right: 10px;&quot; data-widthpercent=&quot;32.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi0mOb/btsJmvJesb6/jrKRqRmXOeLRrcc7JK1dSK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi0mOb%2FbtsJmvJesb6%2FjrKRqRmXOeLRrcc7JK1dSK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFes53/btsJmAjlDoY/AyLVEFkbc88qUhtuK4F5Kk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFes53/btsJmAjlDoY/AyLVEFkbc88qUhtuK4F5Kk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;352&quot; data-filename=&quot;resized_20240825_114132.jpg&quot; style=&quot;width: 34.5565%; margin-right: 10px;&quot; data-widthpercent=&quot;35.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFes53/btsJmAjlDoY/AyLVEFkbc88qUhtuK4F5Kk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFes53%2FbtsJmAjlDoY%2FAyLVEFkbc88qUhtuK4F5Kk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;514&quot; height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAgSiT/btsJmfNq71t/PQxEVMpOWkuqfpi33z7oB1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAgSiT/btsJmfNq71t/PQxEVMpOWkuqfpi33z7oB1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240825_012353.jpg&quot; style=&quot;width: 31.559%;&quot; data-widthpercent=&quot;32.31&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAgSiT/btsJmfNq71t/PQxEVMpOWkuqfpi33z7oB1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAgSiT%2FbtsJmfNq71t%2FPQxEVMpOWkuqfpi33z7oB1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;림 테이프 부착 및 밸브 구멍/디스크 브레이크 브라켓/디스크 브레이크 장착&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;디스크 브레이크 장착&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;닥터 바이크 F-16의 순정 디스크 브레이크와 제공된 브레이크 디스크는 외경은 같지만 고정부의 나사 구멍 위치가 달라 호환되지 않으므로 미리 제공된 디스크를 장착해 줍니다. 이때 모터 허브에 부착되어 있는 브레이크 디스크 설치용 브래킷은 제거를 하고 장착하여야 합니다. 뒷바퀴 교환 시 자전거 프레임에 장착된 브레이크 몸통과 간섭하여 바퀴가 들어가지 않게 됩니다. 저는 현장에서 브래킷을 제거하고 브레이크 디스크를 다시 장착해 주어야만 했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_resized_20240825_033751.jpg&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bekVjp/btsJmu4D9vS/ie7Kd4emQy5VTrjFkQqBKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bekVjp/btsJmu4D9vS/ie7Kd4emQy5VTrjFkQqBKK/img.png&quot; data-alt=&quot;스페이스 브라켓 제거후 장착된 디스크 브레이크&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bekVjp/btsJmu4D9vS/ie7Kd4emQy5VTrjFkQqBKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbekVjp%2FbtsJmu4D9vS%2Fie7Kd4emQy5VTrjFkQqBKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;317&quot; data-filename=&quot;edited_resized_20240825_033751.jpg&quot; data-origin-width=&quot;1255&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스페이스 브라켓 제거후 장착된 디스크 브레이크&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/207&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;▶&lt;/a&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://postpop.tistory.com/207&quot;&gt;▶&lt;/a&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://postpop.tistory.com/207&quot;&gt;▶&lt;/a&gt;&lt;a href=&quot;https://postpop.tistory.com/207&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; 개조에 사용된 미니벨로 - 닥터바이크 F16 구입 및 개봉기(16인치 접이식자전거)&lt;/a&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전기자전거 개조 준비&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;준비물:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 몽키 스패너(뒷바퀴 고정용 16MM 너트 / 프리휠 스프라켓 탈부착)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 자전거 구입 시 제공한 육각렌치(브레이크 패드 고정 볼트/브레이크 핸들 등 풀기 및 잠그기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 다이소용 작은 드라이버 셋(스크루 및 육각렌치 - 스로틀 및 S866 설치 시 사용)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 프리휠 스프라켓 분리 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 크랭크암 분리 도구(PAS센서를 설치하려면 분리해야 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 타이어 바람 넣는 휴대용 에어 펌프&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 변환키트 부품(브레이크 핸들, 스로틀, S866, PAS 센서, 컨트롤러, 16인치 모터 허브)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. PAS 센서 부착용 순간접착제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 배터리 팩/전원 커넥터 변환 케이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. 배터리/컨트롤러 보관용 가방&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. 있다면 전동 임팩/14MM 복스알(크레크암 고정 볼트 제거에 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. 케이블 고정용 집타이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. 칼 또는 니퍼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. 실란트/슈레더 밸브 코어 제거 도구(실란트 주입 시 사용)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_resized_20240825_021754.jpg&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;1290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DLntg/btsJmLrv9rx/iogodK16yhPSBk5uP8kr2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DLntg/btsJmLrv9rx/iogodK16yhPSBk5uP8kr2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DLntg/btsJmLrv9rx/iogodK16yhPSBk5uP8kr2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDLntg%2FbtsJmLrv9rx%2FiogodK16yhPSBk5uP8kr2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1380&quot; height=&quot;1290&quot; data-filename=&quot;edited_resized_20240825_021754.jpg&quot; data-origin-width=&quot;1380&quot; data-origin-height=&quot;1290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;F-16 프레임에서 뒷바퀴 탈거&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자전거 변속기어를 6단 제일 작은 기어로 위치해 주고 자전거를 뒤집어 세워놓습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양쪽 16MM 너트를 풀어주고 드롭아웃 슬롯을 따라 뒤로 당겨 뽑아 줍니다. 드롭아웃 슬롯에서 바퀴가 빠져나오면 6단 기어에서 체인을 벗겨주고 완전히 분리하면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F2TbT/btsJnoiiBdS/d3d8ukQbEXTiN4qllgROk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F2TbT/btsJnoiiBdS/d3d8ukQbEXTiN4qllgROk0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_022316.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F2TbT/btsJnoiiBdS/d3d8ukQbEXTiN4qllgROk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF2TbT%2FbtsJnoiiBdS%2Fd3d8ukQbEXTiN4qllgROk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z3Xe9/btsJm5i5VTQ/DIpFzkly49fI84PEMfwAKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z3Xe9/btsJm5i5VTQ/DIpFzkly49fI84PEMfwAKK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_022201.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z3Xe9/btsJm5i5VTQ/DIpFzkly49fI84PEMfwAKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ3Xe9%2FbtsJm5i5VTQ%2FDIpFzkly49fI84PEMfwAKK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FeZrE/btsJnMXpPAU/C1Ioa4RopWHnNDYTEbd1l1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FeZrE/btsJnMXpPAU/C1Ioa4RopWHnNDYTEbd1l1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_022221.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FeZrE/btsJnMXpPAU/C1Ioa4RopWHnNDYTEbd1l1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFeZrE%2FbtsJnMXpPAU%2FC1Ioa4RopWHnNDYTEbd1l1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;6단에서 자전거 뒤집어 세워놓기/기어측 너트/브레이크측 너트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coU65X/btsJlHRfJ4X/jaBJBw8ZlWc5DeEcrmqBVk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coU65X/btsJlHRfJ4X/jaBJBw8ZlWc5DeEcrmqBVk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_022839.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coU65X/btsJlHRfJ4X/jaBJBw8ZlWc5DeEcrmqBVk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoU65X%2FbtsJlHRfJ4X%2FjaBJBw8ZlWc5DeEcrmqBVk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yZpNl/btsJlxaa8oM/6sdYGG1BthkrXP4xGeWkZ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yZpNl/btsJlxaa8oM/6sdYGG1BthkrXP4xGeWkZ1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_022825.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yZpNl/btsJlxaa8oM/6sdYGG1BthkrXP4xGeWkZ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyZpNl%2FbtsJlxaa8oM%2F6sdYGG1BthkrXP4xGeWkZ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHW3eP/btsJmnLjUfV/dteKKUgSlhEyGlKcBZTVN1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHW3eP/btsJmnLjUfV/dteKKUgSlhEyGlKcBZTVN1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_022757.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHW3eP/btsJmnLjUfV/dteKKUgSlhEyGlKcBZTVN1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHW3eP%2FbtsJmnLjUfV%2FdteKKUgSlhEyGlKcBZTVN1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;기어측 너트 제거/브레이크측 너트제거1, 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 4.본문배너2 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;기어 스프라켓 및 타이어 분리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이어 및 튜브를 분리하기 전에 기어 스프라켓을 먼저 분리하는 게 몽키 스페너에 힘을 주는데 용이합니다. 저는 타이어와 튜브를 먼저 제거하고 스프라켓 분리 작업을 해주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ulcrh/btsJnvIo58W/ltK5AQI8N4gG9gRVcFuiy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ulcrh/btsJnvIo58W/ltK5AQI8N4gG9gRVcFuiy0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1399&quot; data-origin-height=&quot;1019&quot; data-filename=&quot;edited_resized_20240825_030112.jpg&quot; style=&quot;width: 33.1924%; margin-right: 10px;&quot; data-widthpercent=&quot;33.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ulcrh/btsJnvIo58W/ltK5AQI8N4gG9gRVcFuiy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fulcrh%2FbtsJnvIo58W%2FltK5AQI8N4gG9gRVcFuiy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1399&quot; height=&quot;1019&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mccJx/btsJnoijBdb/KmTWR9K9NtEAkKcPXEw8w1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mccJx/btsJnoijBdb/KmTWR9K9NtEAkKcPXEw8w1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240825_030134.jpg&quot; style=&quot;width: 32.241%; margin-right: 10px;&quot; data-widthpercent=&quot;33.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mccJx/btsJnoijBdb/KmTWR9K9NtEAkKcPXEw8w1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmccJx%2FbtsJnoijBdb%2FKmTWR9K9NtEAkKcPXEw8w1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBOWvI/btsJmL6ayh6/4pKVUK9AN0dSrjEef6qNWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBOWvI/btsJmL6ayh6/4pKVUK9AN0dSrjEef6qNWK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240825_030324.jpg&quot; style=&quot;width: 32.241%;&quot; data-widthpercent=&quot;33.01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBOWvI/btsJmL6ayh6/4pKVUK9AN0dSrjEef6qNWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBOWvI%2FbtsJmL6ayh6%2F4pKVUK9AN0dSrjEef6qNWK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;스프라켓 분리 전/분리도구 삽입/스프라켓 분리 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프라켓 분리도구를 사진과 같이 삽입해 준 뒤에 몽키 스페너를 끼우고 반시계 방향으로 풀어줍니다. 단단히 잠겨있기 때문에 그냥 손 힘만으로는 풀 수 없고 바퀴를 세운 상태에서 반시계 방향으로 돌아가도록 몽키 스페너를 발로 밟아 주어야 힘이 제대로 들어가면서 풀리게 됩니다. 이때 바퀴를 세운 상태에서 잘 고정해 주어야 하는데 타이어가 장착되어 있다면 좀 더 수월할 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 프리휠 스프라켓 분리도구에 따라 분리에 실패할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리휠 스프라켓 분리도구만 구입한 뒤 크랭크암 분리도구를 구매하기 위해 프리휠 스프라켓 분리도구가 포함된 일반적인 분리도구 세트를 추가로 구매하였습니다. 처음에는 분리도구 세트에 포함된 프리휠 스프라켓 분리도구를 사용하여 프리휠 스프라켓 분리를 시도하였으나 그 도구가 미세하게 작아 정상적으로 분리시키지 못하고 헛돌게(빠가 납니다) 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분리도구가 한 개만 있었다면 애매한 상태에서 작업이 중단될 뻔했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;resized_20240825_113526.jpg&quot; data-origin-width=&quot;1389&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bomKZo/btsJm63k3qi/QbkmW1k5YnyW9tQm12yjwk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bomKZo/btsJm63k3qi/QbkmW1k5YnyW9tQm12yjwk/img.jpg&quot; data-alt=&quot;정상적인 분리도구 / 약간 작은 분리도구&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bomKZo/btsJm63k3qi/QbkmW1k5YnyW9tQm12yjwk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbomKZo%2FbtsJm63k3qi%2FQbkmW1k5YnyW9tQm12yjwk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;312&quot; data-filename=&quot;resized_20240825_113526.jpg&quot; data-origin-width=&quot;1389&quot; data-origin-height=&quot;722&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;정상적인 분리도구 / 약간 작은 분리도구&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 타이어를 제거해 줍니다. 타이어 제거 방법은 아래 링크해 놓은 동영상을 참조하시기 바랍니다. 하지만 동영상 처럼 되지 않아 주걱 역할을 하는 도구를 이용하여 타이어의 한쪽을 빼내고 난 뒤 튜브를 빼내는 도중에 튜브의 바람이 완전히 빠지지 않은 상태였다는 것을 알게 되었습니다. 아마도 튜브의 바람이 완전히 빠지지 않아서 동영상 처럼 되지 않았을 수 있습니다. 슈레더 밸브의 경우 밸브 안에 있는 핀을 눌러주면 바람이 빠집니다. 적당한 도구가 없어 에어펌프의 연결부를 꽂아놓고 레버로 잠그지 않은 상태에서 눌러서 바람을 뺏었습니다. 어쨌든 튜브를 빼내기 위해서는 튜브 내의 바람을 완전히 빼내어야 합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;모터허브에 타이어 및 스프라켓 장착&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빼낸 타이어와 튜브를 모터 허브에 장착해 줍니다. 타이어 제거 방법의 역순으로 해주면 됩니다. 꼼꼼하게 타이어를 주물러 주어 안에 있는 튜브의 위치가 잘 자리 잡도록 해주고 바람을 넣어줍니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 모터허브의 보호용 캡과 고정용 너트 및 와샤를 모두 제거해 줍니다. 스프라켓 쪽에는 모터 컨트롤 케이블이 나사 안쪽을 통과하여 설치되어 있으므로 케이블이 손상되지 않도록 빼내어 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_20240825_012437.jpg&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;755&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zyZwf/btsJn8eUB5J/hEJ9uaBTDgKFttdrxoHwnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zyZwf/btsJn8eUB5J/hEJ9uaBTDgKFttdrxoHwnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zyZwf/btsJn8eUB5J/hEJ9uaBTDgKFttdrxoHwnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzyZwf%2FbtsJn8eUB5J%2FhEJ9uaBTDgKFttdrxoHwnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;382&quot; data-filename=&quot;edited_20240825_012437.jpg&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;755&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;순정 바퀴에서 분리한 스프라켓의 중심홀에 먼저 모터 컨트롤 케이블을 끼워 넣고 스프라켓을 모터 허브의 스프라켓 장착부에 시계방향으로 돌려 장착합니다. 장착할 때는 몽키스패너를 이용하여 손 힘만으로 단단하게 장착해도 됩니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;뒷바퀴 드롭아웃 슬롯에 모터 허브 장착&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모터 허브를 장착할 때 많은 시간이 소요되었습니다. 첫 번째로 브레이크 디스크가 자전거 프레임에 달린 브레이크 패드 사이로 잘 들어가는지 여부와 두 번째로 드롭아웃 슬롯에 잘 들어가는지에서 어려움이 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 브레이크 디스크의 스페이스 브래킷을 제거하지 않은 상태에서 작업을 했었습니다. 이 브래킷을 제거해야 된다는 것을 깨달을 때까지 넣었다 뺏다를 반복하는 중에 시간이 소요(브레이크 패드에 걸려 드롭아웃 슬롯 근처도 못 감)되었으며 허브 축에 끼워 넣는 와샤의 구성을 결정하는 데에도 시간이 소요되었습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업체 측 예시를 살펴보면 자전거 프레임의 바퀴장착부(포크)의 폭에 따라 일반 와샤와 스톱퍼 와샤를 조합해서 장착하고 있습니다. 여기에 더불어 디스크 브레이크가 패드 사이에 안착하도록 조합해야 합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;업체측 예시.jpg&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tnpkp/btsJm5cnvaZ/cZL9gcnI6ioiXVR15Fs0Lk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tnpkp/btsJm5cnvaZ/cZL9gcnI6ioiXVR15Fs0Lk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tnpkp/btsJm5cnvaZ/cZL9gcnI6ioiXVR15Fs0Lk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTnpkp%2FbtsJm5cnvaZ%2FcZL9gcnI6ioiXVR15Fs0Lk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;419&quot; data-filename=&quot;업체측 예시.jpg&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 브레이크 패드가 조금이나마 움직일 수 있도록 고정 나사를 풀어주어 장착 시 브레이크 디스크가 패드 사이에 잘 들어가도록 여유를 확보해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_resized_20240826_132401.jpg&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1073&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9lc2R/btsJnZvFhtn/NjpIsTfkoh4w7HhJKufGk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9lc2R/btsJnZvFhtn/NjpIsTfkoh4w7HhJKufGk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9lc2R/btsJnZvFhtn/NjpIsTfkoh4w7HhJKufGk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9lc2R%2FbtsJnZvFhtn%2FNjpIsTfkoh4w7HhJKufGk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;373&quot; data-filename=&quot;edited_resized_20240826_132401.jpg&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1073&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업체는 얇은 와샤 1개, 두꺼운 와샤 1개, 스톱퍼 와샤 2개를 제공하고 있습니다. 포크의 드롭아웃 슬롯 안에 들어가야 할 와샤의 설치 구성은 아래와 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;드롭아웃 슬롯 - &lt;span style=&quot;color: #ee2323;&quot;&gt;두꺼운 와샤&lt;/span&gt; - 기어 스프라켓 - 모터허브 - 브레이크 디스크 - &lt;span style=&quot;color: #ee2323;&quot;&gt;얇은 와샤 - 스토퍼와샤&lt;/span&gt; - 드롭아웃 슬롯&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UYZ5Y/btsJnLRNzbc/jVREP7qBb2BGcVpklbyqNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UYZ5Y/btsJnLRNzbc/jVREP7qBb2BGcVpklbyqNk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_045424.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UYZ5Y/btsJnLRNzbc/jVREP7qBb2BGcVpklbyqNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUYZ5Y%2FbtsJnLRNzbc%2FjVREP7qBb2BGcVpklbyqNk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rrhsb/btsJngxZtlN/rYEKzPSDrfBttn1JVzkz71/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rrhsb/btsJngxZtlN/rYEKzPSDrfBttn1JVzkz71/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_045430.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rrhsb/btsJngxZtlN/rYEKzPSDrfBttn1JVzkz71/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRrhsb%2FbtsJngxZtlN%2FrYEKzPSDrfBttn1JVzkz71%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tpBtF/btsJnGXm2tb/XP9uMOQUzNcVCRhZpAoqf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tpBtF/btsJnGXm2tb/XP9uMOQUzNcVCRhZpAoqf1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_045607.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tpBtF/btsJnGXm2tb/XP9uMOQUzNcVCRhZpAoqf1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtpBtF%2FbtsJnGXm2tb%2FXP9uMOQUzNcVCRhZpAoqf1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;두꺼운 와샤/앏은와샤+스토퍼와샤/드롭아웃 슬롯에 장착된 스토퍼 와샤&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 뒷바퀴 장착 시 유의 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 자전거 체인을 6단 기어에 먼저 걸어놓고 끼워 넣으세요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 모터 컨트롤 케이블이 전방을 향하도록 하고 끼워 넣으세요. 상기 사진의 두꺼운 와샤 예시 사진처럼 컨트롤 케이블이 나오는 부분의 꺾어질 수 있도록 파인 U자홈이 보여서는 안 됩니다. 힘들게 끼워 넣었는데 다시 작업해야 했습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 5.본문배너3 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 모터허브 끼워 넣는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 자전거 체인을 먼저 걸고 브레이크 디스크가 패드 사이에 들어간 상태에서 최대한 드롭아웃 슬롯에 가깝게 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 모터 컨트롤 케이블이 전방으로 꺾이도록 위치시키면서 허브축의 평평한 면과 드롭아웃 슬롯이 최대한 평행하도록 위치시킵니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;스프라켓 쪽의 드롭아웃 슬롯에 두꺼운 와샤가 살짝 거치도록 끼워 넣고 브레이크 패드 쪽을 보면 스토퍼 와샤가 드롭아웃 슬롯에 걸려있는 것을 볼 수 있습니다. 포크를 바깥으로 벌려주면서 스토퍼 와샤를 밀어 넣습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 스프라켓 쪽 포크 역시 바깥으로 벌려주면서 드롭아웃 슬롯에 걸쳐있는 와샤를 완전히 밀어 넣어줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 얘기하자면 포크를 바깥으로 벌려주면서 뒷바퀴를 장착해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장착이 되면 순정 바퀴가 있던 위치보다는 덜 들어가게 됩니다. 모터 허브 축이 더 두껍습니다. 스프라켓 쪽 축은 더 이상 앞으로 움직이지 않게 된 상태입니다. 따라서 바퀴가 자전거 센터축과 일치하도록 브레이크 디스크 쪽 축을 앞뒤로 살짝씩 조절해 줍니다. 일치가 되었으면 고정용 너트를 채워줍니다. 이제 스프라켓 쪽 드롭아웃 슬롯 바깥쪽에 스토퍼 와샤를 끼워주고 고정용 너트를 채워주면 됩니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_resized_20240825_045556.jpg&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnborB/btsJnYcrBN4/uslO47RjnYfIzKmNstxVcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnborB/btsJnYcrBN4/uslO47RjnYfIzKmNstxVcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnborB/btsJnYcrBN4/uslO47RjnYfIzKmNstxVcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnborB%2FbtsJnYcrBN4%2FuslO47RjnYfIzKmNstxVcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;396&quot; data-filename=&quot;edited_resized_20240825_045556.jpg&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 와샤의 조합은 제공되는 와샤만을 사용하여 교체할 경우에 이렇게 해야 합니다. 다만 별도의 두께별 와샤가 있다면 포크를 바깥으로 벌리지 않고도 브레이크 디스크와 패드 간의 간섭이 없는 상태로 손쉽게 체결할 수 있을 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PAS 센서 장착&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PAS 센서를 장착하기 위해서는 크랭크암을 분리해야 합니다. 우선 크랭크암 볼트 캡을 제거하고 M14 소켓을 이용하여 고정용 볼트를 풀어줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MUh9T/btsJnio9VRt/ww2HYeXY7KEGos3OTjeBF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MUh9T/btsJnio9VRt/ww2HYeXY7KEGos3OTjeBF0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;562&quot; data-filename=&quot;크랭크암.png&quot; style=&quot;width: 65.2509%; margin-right: 10px;&quot; data-widthpercent=&quot;66.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MUh9T/btsJnio9VRt/ww2HYeXY7KEGos3OTjeBF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMUh9T%2FbtsJnio9VRt%2Fww2HYeXY7KEGos3OTjeBF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1113&quot; height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vKr2k/btsJmMD2b7f/ND9WiPykAbckFONl771PRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vKr2k/btsJmMD2b7f/ND9WiPykAbckFONl771PRK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;929&quot; data-filename=&quot;edited_resized_20240825_113854.jpg&quot; style=&quot;width: 33.5863%;&quot; data-widthpercent=&quot;33.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vKr2k/btsJmMD2b7f/ND9WiPykAbckFONl771PRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvKr2k%2FbtsJmMD2b7f%2FND9WiPykAbckFONl771PRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;947&quot; height=&quot;929&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;크랭크암 볼트 캡/고정용 볼트/크랭크암 제거툴에 있는 M14소켓, M14 복스알&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사진의 크랭크암 제거툴의 검은색 소켓 안의 은색 심이 최대한 안쪽으로 들어가도록 은색 M14 소켓 부분을 반시계방향으로 돌려줍니다. 검은색 소켓 안의 심이 최대한 안쪽으로 들어간 상태에서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;상기 가운데 사진에 보이는 나사산에 최대한 채워 줍니다. 몽키 스패너를 사용하면 좋습니다. 이제 은색 M14 소켓 부분을 시계 방향으로 돌려주면 들어가 있던 은색 심이 툴 안에서 나오면서 페달축에 압력을 가하고 그 압력으로 인해 페달축에 고정되어 있는 크랭크암이 분리되도록 해줍니다.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_resized_20240825_113742.jpg&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;1155&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sSg5u/btsJml7R2XL/KLVd2t5WkZcVyzIYlce441/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sSg5u/btsJml7R2XL/KLVd2t5WkZcVyzIYlce441/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sSg5u/btsJml7R2XL/KLVd2t5WkZcVyzIYlce441/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsSg5u%2FbtsJml7R2XL%2FKLVd2t5WkZcVyzIYlce441%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;358&quot; data-filename=&quot;edited_resized_20240825_113742.jpg&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;1155&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크랭크암이 분리되면 자전거 프레임의 페달축 고정부(PAS 센서 부착 부위)와 PAS 센서의 접합부에 순간접착제를 발라서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;아래 사진처럼 PAS 센서를 부착해 줍니다. 부착 후에 안쪽 경계면에도 보강을 위해 접착제를 추가로 발라줍니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGTZ4/btsJmffNv4s/aPqCkWU8uVgbJXxsIW7c71/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGTZ4/btsJmffNv4s/aPqCkWU8uVgbJXxsIW7c71/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_060310.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGTZ4/btsJmffNv4s/aPqCkWU8uVgbJXxsIW7c71/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGTZ4%2FbtsJmffNv4s%2FaPqCkWU8uVgbJXxsIW7c71%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf0ILF/btsJnNPD2TM/pIVg407WOa8eSGITumLuWK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf0ILF/btsJnNPD2TM/pIVg407WOa8eSGITumLuWK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_060317.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf0ILF/btsJnNPD2TM/pIVg407WOa8eSGITumLuWK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf0ILF%2FbtsJnNPD2TM%2FpIVg407WOa8eSGITumLuWK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;순간접착제 이용 PAS센서 부착/보강&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 아래 사진처럼 마그네틱 휠을 끼워 넣어 주고 크랭크암을 부착해 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9NZER/btsJmvbxDKH/0pdSgWHkHiCoIIgSdSVFp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9NZER/btsJmvbxDKH/0pdSgWHkHiCoIIgSdSVFp1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_060351.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9NZER/btsJmvbxDKH/0pdSgWHkHiCoIIgSdSVFp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9NZER%2FbtsJmvbxDKH%2F0pdSgWHkHiCoIIgSdSVFp1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LoElZ/btsJnaSd41V/yD8oG5h6SPDuWMyUW1JoAK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LoElZ/btsJnaSd41V/yD8oG5h6SPDuWMyUW1JoAK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_060401.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LoElZ/btsJnaSd41V/yD8oG5h6SPDuWMyUW1JoAK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLoElZ%2FbtsJnaSd41V%2FyD8oG5h6SPDuWMyUW1JoAK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Di1SV/btsJmBvRDub/l1F1LIKDyzoKqvffFmSTV1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Di1SV/btsJmBvRDub/l1F1LIKDyzoKqvffFmSTV1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_060633.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Di1SV/btsJmBvRDub/l1F1LIKDyzoKqvffFmSTV1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDi1SV%2FbtsJmBvRDub%2Fl1F1LIKDyzoKqvffFmSTV1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;마그네틱 휠 부착 방향(화살표) / PAS 센서와 마그네틱 휠 간격 / 크랭크암 부착 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자전거 거치대 장착&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 브레이크 쪽 드롭아웃 슬롯에는 자전거 거치대가 장착되어 있었습니다. 자전거 거치대는 순정 바퀴축에 끼울 수 있도록 구멍이 뚫려있고 또한 가로로 보이는 드롭아웃 슬롯 웨이에 맞춰져 움직이지 않은 상태에서 고정용 너트에 의해 축과 함께 고정되도록 되어 있습니다. 하지만 모터 허브의 축이 순정 바퀴축보다 두껍습니다. 또한 모터 허브를 장착할 때 스토퍼 와샤를 사용하여 드롭아웃 슬롯 웨이가 막히게 됩니다. 이는 자전거 거치대의 드롭아웃 슬롯 웨이에 맞춰지도록 되어 있는 거치대 고정부 형상과 스토퍼 와샤 간의 간섭을 발생시키고 단단하게 조이지 못하게 합니다. 자전거 거치대를 장착하기 위해서는 거치대의 구멍을 넓혀야 하고 간섭이 발생되는 고정부 형상을 제거해 주어야 단단하게 고정할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zlVFt/btsJmowNZRt/QONY5BmxZ0DGGeoYY2CTY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zlVFt/btsJmowNZRt/QONY5BmxZ0DGGeoYY2CTY0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_095737.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zlVFt/btsJmowNZRt/QONY5BmxZ0DGGeoYY2CTY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzlVFt%2FbtsJmowNZRt%2FQONY5BmxZ0DGGeoYY2CTY0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8HM6u/btsJl4Mlbkm/xsh1fwVqBFpKgToKHg6dv1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8HM6u/btsJl4Mlbkm/xsh1fwVqBFpKgToKHg6dv1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_105331.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8HM6u/btsJl4Mlbkm/xsh1fwVqBFpKgToKHg6dv1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8HM6u%2FbtsJl4Mlbkm%2Fxsh1fwVqBFpKgToKHg6dv1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6Efo/btsJl55vm5V/EbqdUiqkPEcwdjYtpAY37k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6Efo/btsJl55vm5V/EbqdUiqkPEcwdjYtpAY37k/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_105341.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6Efo/btsJl55vm5V/EbqdUiqkPEcwdjYtpAY37k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6Efo%2FbtsJl55vm5V%2FEbqdUiqkPEcwdjYtpAY37k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;뒷바퀴 축이 두꺼워 자전거 거치대 장착 불가 / 거치대 구멍 넓혀 줌 / 드롭아웃 슬롭웨이 맞춤 형상 한쪽 제거&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbFKwI/btsJnopcPib/XZL63nRDDiNvUAIKoVKnn0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbFKwI/btsJnopcPib/XZL63nRDDiNvUAIKoVKnn0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_105359.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbFKwI/btsJnopcPib/XZL63nRDDiNvUAIKoVKnn0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbFKwI%2FbtsJnopcPib%2FXZL63nRDDiNvUAIKoVKnn0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpTRYf/btsJnNvplsJ/Hdrr1fFN3Lx0KhIRTqhMb1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpTRYf/btsJnNvplsJ/Hdrr1fFN3Lx0KhIRTqhMb1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_105428.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpTRYf/btsJnNvplsJ/Hdrr1fFN3Lx0KhIRTqhMb1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpTRYf%2FbtsJnNvplsJ%2FHdrr1fFN3Lx0KhIRTqhMb1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TyhbW/btsJnK6u0Cj/rhzBksfMa25piPLoopdyfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TyhbW/btsJnK6u0Cj/rhzBksfMa25piPLoopdyfK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240825_105610.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TyhbW/btsJnK6u0Cj/rhzBksfMa25piPLoopdyfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTyhbW%2FbtsJnK6u0Cj%2FrhzBksfMa25piPLoopdyfK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;거치대 장착 전 / 거치대 장착 / 너트 체결 고정 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 6.본문배너4 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;브레이크 핸들 교체 및 컨트롤러 배선&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브레이크 핸들을 교체하기 위해서는 핸들바의 고무 손잡이를 빼내어야 합니다. 잘 안 빠지는데 돌리면서 빼면 그나마 수월합니다. 손잡이가 빠졌다면 변속기를 빼냅니다. 다음으로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;앞바퀴와 뒷바퀴의 브레이크 와이어 고정 볼트를 풀어 브레이크를 느슨하게 해 줍니다. 느슨한 상태에서 &lt;span&gt;브레이크를 잡으면 보이는 브레이크 와이어 걸이에서 와이어 멈치를 제거해 줍니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coEF9L/btsJl6pWv7T/PlSMpFLYqiTEenVOrQItYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coEF9L/btsJl6pWv7T/PlSMpFLYqiTEenVOrQItYK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;828&quot; data-filename=&quot;edited_20240826_130905.jpg&quot; style=&quot;width: 21.9747%; margin-right: 10px;&quot; data-widthpercent=&quot;22.5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coEF9L/btsJl6pWv7T/PlSMpFLYqiTEenVOrQItYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoEF9L%2FbtsJl6pWv7T%2FPlSMpFLYqiTEenVOrQItYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;516&quot; height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgJBLS/btsJlyfOfUL/rPFaHQPlCwmdgcBEVy3iQ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgJBLS/btsJlyfOfUL/rPFaHQPlCwmdgcBEVy3iQ0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot; data-filename=&quot;resized_20240831_1731461.jpg&quot; style=&quot;width: 47.0155%; margin-right: 10px;&quot; data-widthpercent=&quot;48.13&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgJBLS/btsJlyfOfUL/rPFaHQPlCwmdgcBEVy3iQ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgJBLS%2FbtsJlyfOfUL%2FrPFaHQPlCwmdgcBEVy3iQ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BfBO5/btsJlytpF7S/qbIT1s0IA8nxu2KfBQme0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BfBO5/btsJlytpF7S/qbIT1s0IA8nxu2KfBQme0k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;1292&quot; data-filename=&quot;edited_resized_20240831_173233.jpg&quot; style=&quot;width: 28.6842%;&quot; data-widthpercent=&quot;29.37&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BfBO5/btsJlytpF7S/qbIT1s0IA8nxu2KfBQme0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBfBO5%2FbtsJlytpF7S%2FqbIT1s0IA8nxu2KfBQme0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1051&quot; height=&quot;1292&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;브레이크 고정 볼트 / 브레이크 와이어 걸이 / 브레이크 핸들 홈 일치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와이어 장력 조절 나사를 상기 사진과 같이 브레이크 핸들 홈과 일치하도록 정렬한 뒤 브레이크 와이어를 홈 사이로 빼내어줍니다. 브레이크 와이어는 그대로 사용할 것이므로 그대로 놓아두고 브레이크 핸들을 핸들바에서 빼내어 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각해 둔 핸들바 구성요소 위치에 따라 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;엄지 스로틀, S866 디스플레이, 기어 변속기, 전기자전거 변환키트에서 제공하는 브레이크 핸들을 적당한 위치에 장착합니다.&lt;span&gt; 모든 구성품이 제자리에 위치했다면 브레이크&lt;/span&gt;&lt;/span&gt; 와이어를 와이어 걸이에 걸어준 뒤 장력조절 나사를 모두 잠가 줍니다. 핸들 두 개를 모두 완료했으면 앞서 풀어놓았던 브레이크 와이어 고정볼트를 잠가주는데 브레이크 와이어를 적당한 힘으로 당겨주면서 잠가줍니다. 고무 손잡이도 다시 끼워주어 마무리합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브레이크 핸들의 컨트롤러 연결용 전선 두 개와 엄지 스로틀 제어 전선 한 개 S866 제어전선 한 개 해서 모두 4개의 전선을 기존 브레이크/변속기 와이어와 간섭이 생기지 않도록 한꺼번에 잘 묶어 놓습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러와 배터리를 장치할 수 있는 방수 트라이앵글 하드 케이스를 짐받이 아래 설치해 주고 케이스의 지퍼 끝단에 뚫려있는 구멍으로 4개의 전선과 PAS 센서 전선을 넣어줍니다. 가방을 통과한 전선을 아래 사진처럼 컨트롤러에 연결해 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨트롤러의 커넥터들은 잘못 연결되지 않도록 커넥터 종류 또는 암/수 등으로 잘 구분되어 있습니다. 모터 허브 연결용 방수잭은 컨트롤러를 케이스에 넣고 케이스의 구멍을 통해 우측으로 빼줍니다. 빼낸 연결잭을 모터 허브에서 나온 방수잭과 화살표가 일치하도록 끼워줍니다. 안으로 깊게 끼워주어야 합니다. 꽉 연결이 되지 않으면 S866에서 E 07 에러를 표시하게 됩니다. 거리가 짧기 때문에 변환 키트에 포함되어 온 모터 제어용 방수 연장 케이블은 사용하지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_resized_20240828_160036.jpg&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;1334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpaCG4/btsJnupgTUD/PE18WFIgd0z3idPmVTe0U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpaCG4/btsJnupgTUD/PE18WFIgd0z3idPmVTe0U0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpaCG4/btsJnupgTUD/PE18WFIgd0z3idPmVTe0U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpaCG4%2FbtsJnupgTUD%2FPE18WFIgd0z3idPmVTe0U0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;487&quot; data-filename=&quot;edited_resized_20240828_160036.jpg&quot; data-origin-width=&quot;1644&quot; data-origin-height=&quot;1334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vUwXi/btsJnjaCnYY/pFowc6DIU1ZQGqGLd6tAEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vUwXi/btsJnjaCnYY/pFowc6DIU1ZQGqGLd6tAEK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;1446&quot; data-filename=&quot;edited_20240825_071951.jpg&quot; style=&quot;width: 37.2277%; margin-right: 10px;&quot; data-widthpercent=&quot;37.67&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vUwXi/btsJnjaCnYY/pFowc6DIU1ZQGqGLd6tAEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvUwXi%2FbtsJnjaCnYY%2FpFowc6DIU1ZQGqGLd6tAEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1165&quot; height=&quot;1446&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJPd1m/btsJoqmntMo/uufBWLxEzTdCLwRV6kQekK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJPd1m/btsJoqmntMo/uufBWLxEzTdCLwRV6kQekK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot; data-filename=&quot;20240831_065752.jpg&quot; style=&quot;width: 61.6095%;&quot; data-widthpercent=&quot;62.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJPd1m/btsJoqmntMo/uufBWLxEzTdCLwRV6kQekK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJPd1m%2FbtsJoqmntMo%2FuufBWLxEzTdCLwRV6kQekK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;컨트롤러 방수잭과 모터허브 방수잭 연결 / 모터 제어선 연결 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IkvLB/btsJmBW1qYP/hvC8r6kX4V21mHUkbPWG9k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IkvLB/btsJmBW1qYP/hvC8r6kX4V21mHUkbPWG9k/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240826_114116.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IkvLB/btsJmBW1qYP/hvC8r6kX4V21mHUkbPWG9k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIkvLB%2FbtsJmBW1qYP%2FhvC8r6kX4V21mHUkbPWG9k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SAQGO/btsJnGC9d9U/MsogXhfayTO2svyKuKjcg0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SAQGO/btsJnGC9d9U/MsogXhfayTO2svyKuKjcg0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240826_114127.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SAQGO/btsJnGC9d9U/MsogXhfayTO2svyKuKjcg0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSAQGO%2FbtsJnGC9d9U%2FMsogXhfayTO2svyKuKjcg0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfUmje/btsJl4ZMsvK/UjvgjB3RBGXzyQUbFmsqa0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfUmje/btsJl4ZMsvK/UjvgjB3RBGXzyQUbFmsqa0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240826_114038.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfUmje/btsJl4ZMsvK/UjvgjB3RBGXzyQUbFmsqa0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfUmje%2FbtsJl4ZMsvK%2FUjvgjB3RBGXzyQUbFmsqa0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;방수 케이스에 컨트롤러 / 배터리 팩 장착 예&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;변속기 세팅&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒷바퀴를 모터 허브로 교체하면 스프라켓의 위치가 순정보다 대략 체인 폭만큼 자전거 프레임 포크와 더 가까워집니다. 순정 뒷바퀴에서의 6단 기어 위치가 모터 허브에서는 5단 기어 위치가 되고 1단으로 변경할 경우 1단 기어를 넘어가 체인이 빠지게 됩니다.&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y5I0P/btsJlXNnbwC/rHpGKDkq0Cqw2excwdGSd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y5I0P/btsJlXNnbwC/rHpGKDkq0Cqw2excwdGSd0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1109&quot; data-filename=&quot;edited_resized_20240826_112025.jpg&quot; style=&quot;width: 31.5142%; margin-right: 10px;&quot; data-widthpercent=&quot;32.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y5I0P/btsJlXNnbwC/rHpGKDkq0Cqw2excwdGSd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy5I0P%2FbtsJlXNnbwC%2FrHpGKDkq0Cqw2excwdGSd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1109&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tw1js/btsJnhKBaK1/W74bD1shnw9pf7kmL1giGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tw1js/btsJnhKBaK1/W74bD1shnw9pf7kmL1giGk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240826_110356.jpg&quot; style=&quot;width: 32.3885%; margin-right: 10px;&quot; data-widthpercent=&quot;33.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tw1js/btsJnhKBaK1/W74bD1shnw9pf7kmL1giGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTw1js%2FbtsJnhKBaK1%2FW74bD1shnw9pf7kmL1giGk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m01qZ/btsJmbxR3AG/nluBfKlkaaACHwWZl84Mk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m01qZ/btsJmbxR3AG/nluBfKlkaaACHwWZl84Mk1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1467&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;edited_resized_20240826_110257.jpg&quot; style=&quot;width: 33.7718%;&quot; data-widthpercent=&quot;34.58&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m01qZ/btsJmbxR3AG/nluBfKlkaaACHwWZl84Mk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm01qZ%2FbtsJmbxR3AG%2FnluBfKlkaaACHwWZl84Mk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1467&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;변속 레버 6단 설정 / 체인은 5단 기어에 물림 / 뒷 변속기 조절 볼트 왼쪽 L 오른쪽 H&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 기어 변속 핸들을 6단(현재는 5단) H에 위치시킵니다. 다음으로 변속기 몸체 아래에 있는 와이어 고정 너트를 풀어 장력을 없애줍니다. 이 상태에서 오른쪽 2번 하이 리미트 나사를 반시계 방향으로 풀어주면 뒷변속기 풀리가 6단 기어 쪽으로 움직이게 됩니다. 6단 기어에 맞게 풀리가 위치했다면 페달을 돌려 체인이 6단에 물리게 해 줍니다. 체인이 6단에 물렸을 때 풀리와 일직선이 되도록 나사를 조이거나 풀어줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b404gc/btsJmlGZKh2/aFVxVCF5Hag5ADyFk5S8f1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b404gc/btsJmlGZKh2/aFVxVCF5Hag5ADyFk5S8f1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240826_111932.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b404gc/btsJmlGZKh2/aFVxVCF5Hag5ADyFk5S8f1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb404gc%2FbtsJmlGZKh2%2FaFVxVCF5Hag5ADyFk5S8f1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2VzBu/btsJmenK8oX/jBkfnjZA4a2IxHc5YmjzyK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2VzBu/btsJmenK8oX/jBkfnjZA4a2IxHc5YmjzyK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240826_110809.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2VzBu/btsJmenK8oX/jBkfnjZA4a2IxHc5YmjzyK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2VzBu%2FbtsJmenK8oX%2FjBkfnjZA4a2IxHc5YmjzyK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;하이 리미트 나사 조정 / 6단 기어와 풀리가 일직선인 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1단을 조정하기 위해서는 왼쪽 L(3.L 로우 리미트) 나사를 조정해 주어야 합니다. 우선 기어가 저단으로 이동하도록 뒷변속기 몸체를 밀어주면서 페달을 돌립니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mvyL2/btsJnIgLf7N/yb5IEWCW8ysOM3EhMHSse1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mvyL2/btsJnIgLf7N/yb5IEWCW8ysOM3EhMHSse1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240826_111643.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mvyL2/btsJnIgLf7N/yb5IEWCW8ysOM3EhMHSse1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmvyL2%2FbtsJnIgLf7N%2Fyb5IEWCW8ysOM3EhMHSse1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPlTz4/btsJmy68qYa/KnLI8XI446Px2O5krwXeuk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPlTz4/btsJmy68qYa/KnLI8XI446Px2O5krwXeuk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240826_112326.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPlTz4/btsJmy68qYa/KnLI8XI446Px2O5krwXeuk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPlTz4%2FbtsJmy68qYa%2FKnLI8XI446Px2O5krwXeuk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmB6mL/btsJnJ0U8Cf/5rMqyRU467P9lCTuVOz530/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmB6mL/btsJnJ0U8Cf/5rMqyRU467P9lCTuVOz530/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240826_113659.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmB6mL/btsJnJ0U8Cf/5rMqyRU467P9lCTuVOz530/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmB6mL%2FbtsJnJ0U8Cf%2F5rMqyRU467P9lCTuVOz530%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1단 기어와 풀리가 일직선으로 됐을 때 풀리가 더 이상 안쪽으로 들어가지 않도록 L 리미트 나사를 조여줍니다. 리미트 세팅은 완료되었습니다. 이제 밀어주고 있던 풀리몸체를 천천히 놓으면서 페달을 돌려 다시 6단으로 이동합니다. 이동한 후에 4번 와이어 장력 조절 너트를 잠가줍니다. 변속기 와이어를 약간 당기면서 1번 와이어 고정너트를 잠가줍니다. 페달을 돌리면서 변속기 레버를 변경해 봅니다. 만약 레버가 원하는 위치에 까지 가지 않는다면 4번 와이어 장력 조절 너트를 풀어주거나 1번 와이어 너트를 이용해서 와이어 장력을 수동으로 조절해 주면 변속기 레버의 이동 위치를 조절할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 7.본문배너5 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6단에서 체인과 짐받이 고정 볼트 간섭 수정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순정 뒷바퀴에서는 추가로 설치한 짐받이의 고정용 브래킷이 체인과 간섭이 발생하지 않았으나 모터 허브로 교체하면서 포크와 6단 기어에 물린 체인과의 거리가 가까워짐에 따라 포크에 장착된 짐받이 고정용 브래킷과 체인과의 간섭이 발생하였습니다. 간섭을 해소하기 위해 고정위치와 양면으로 된 짐받이 고정용 브래킷을 한 면만 사용하여 고정하게 되었습니다. 하중 지지는 충분합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.짐받이 포크 체결 위치2.jpg&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJNgqV/btsJnFRRpf4/Xob9kfZjzVxfAaWJJZw2A0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJNgqV/btsJnFRRpf4/Xob9kfZjzVxfAaWJJZw2A0/img.jpg&quot; data-alt=&quot;순정 뒷바퀴에서 짐받이 고정용 브라켓 위치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJNgqV/btsJnFRRpf4/Xob9kfZjzVxfAaWJJZw2A0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJNgqV%2FbtsJnFRRpf4%2FXob9kfZjzVxfAaWJJZw2A0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;375&quot; data-filename=&quot;1.짐받이 포크 체결 위치2.jpg&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순정 뒷바퀴에서 짐받이 고정용 브라켓 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Au0uL/btsJooB6ypJ/7EiOHVskmsQ0Tldii8zWb0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Au0uL/btsJooB6ypJ/7EiOHVskmsQ0Tldii8zWb0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240831_065731.jpg&quot; style=&quot;width: 38.1198%; margin-right: 10px;&quot; data-widthpercent=&quot;39.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Au0uL/btsJooB6ypJ/7EiOHVskmsQ0Tldii8zWb0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAu0uL%2FbtsJooB6ypJ%2F7EiOHVskmsQ0Tldii8zWb0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqMpov/btsJmw9vK9v/3yX8oadttiRTlFlflACpu0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqMpov/btsJmw9vK9v/3yX8oadttiRTlFlflACpu0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;1919&quot; data-filename=&quot;resized_20240831_070749.jpg&quot; style=&quot;width: 21.4349%; margin-right: 10px;&quot; data-widthpercent=&quot;21.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqMpov/btsJmw9vK9v/3yX8oadttiRTlFlflACpu0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqMpov%2FbtsJmw9vK9v%2F3yX8oadttiRTlFlflACpu0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;1919&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beKLzP/btsJn53LcXF/Fj956YPYJSt1kvT7FCwBsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beKLzP/btsJn53LcXF/Fj956YPYJSt1kvT7FCwBsk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_20240831_065752.jpg&quot; style=&quot;width: 38.1198%;&quot; data-widthpercent=&quot;39.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beKLzP/btsJn53LcXF/Fj956YPYJSt1kvT7FCwBsk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeKLzP%2FbtsJn53LcXF%2FFj956YPYJSt1kvT7FCwBsk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;모터 허브 뒷바퀴에서 물받이 고정위치로 변경 / 브라켓 한면만 사용 / 위치 변화에 따라 약간 어긋난 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;resized_20240826_124619.jpg&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Mfe2k/btsJm3TlcTW/6SCKZmsoQhuzrQkUjeg5Lk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Mfe2k/btsJm3TlcTW/6SCKZmsoQhuzrQkUjeg5Lk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Mfe2k/btsJm3TlcTW/6SCKZmsoQhuzrQkUjeg5Lk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMfe2k%2FbtsJm3TlcTW%2F6SCKZmsoQhuzrQkUjeg5Lk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot; data-filename=&quot;resized_20240826_124619.jpg&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;전기자전거 시험 운행 및 S866 세팅&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/mTvQT/btsJmNQHdd9/05SS4ztyhbO5JL6kmqNOx0/S866_MANUAL.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;S866_MANUAL.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.72MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배터리를 연결하고 PAS 센서 및 스로틀로 시험운행 해 보았습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정지 중 PAS 2단계에서 페달을 밟으면 자전거가 앞으로 튀어나가는 것을 느낄 수 있습니다. 페달이 약 반바퀴 돌아갔을 때 모터가 작동하는 것 같습니다. 정지 중 PAS5단계에서 페달을 밟으면 앞바퀴가 약간 들리면서 나갑니다. PAS 센서로 작동할 때 속도에 따라 토크를 5단 속도까지 서서히 올리는 게 아니라 페달이 밟히고 있다고 인식이 되면 현재 속도와 상관없이 바로 5단 토크를 주는 것 같습니다. 급발진과 비슷하게 됩니다. 정지상태에서는 저단부터 출발해서 속도에 따라 한 단씩 올려가면서 타야 합니다.&amp;nbsp; 스로틀은 단수에 따라 속도가 잘 적용됩니다. 3단에서의 풀 스로틀시 약 시속 18KM이고 5단에서 약 시속 25KM입니다. 모터 토크는 넘쳐나므로 바퀴사이즈에 따라 최고 속도는 더 나올 것입니다. 하지만 16인치 미니벨로에서 25KM 속도로 달리고 싶지는 않을 것입니다. 상당히 빠르다고 느끼는 속도는 18KM 3단이었습니다. 우선 닥터바이크 F-16으로 페달링 해서 낼 수 있는 최고 속도는 약 18KM입니다. 18KM가 되면 6단에서 페달이 헛돌게 됩니다. 더 속도를 내기 위해서는 앞기어를 더 큰 것으로 교체해야 할 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 기본 컨트롤러 세팅값(공장 설정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;P01:&amp;nbsp;2(S866&amp;nbsp;백라이트&amp;nbsp;밝기)&amp;nbsp; &lt;br /&gt;P02: 0(거리 단위 KM/마일) &lt;br /&gt;P03:&amp;nbsp;36(배터리&amp;nbsp;전압) &lt;br /&gt;P04:&amp;nbsp;10(10분 동안&amp;nbsp;작동&amp;nbsp;없으면&amp;nbsp;S866&amp;nbsp;꺼짐) &lt;br /&gt;P05: 5(5단계 PAS 모드/스로틀 단계, 3:3단계, 9:9단계)&amp;nbsp; &lt;br /&gt;P06:&amp;nbsp;16(바퀴사이즈-인치) &lt;br /&gt;P07: 1(기본값 1:홀센서 있는 경우)&lt;br /&gt;P08: 100(100: 제한해제) &lt;br /&gt;P09:&amp;nbsp;0(정지&amp;nbsp;상태에서&amp;nbsp;스로틀/PAS&amp;nbsp;사용) &lt;br /&gt;P10: 2(드라이브 모드, 2:스로틀/PAS 동시 사용, 1:스로틀만 0:PAS만) &lt;br /&gt;P11: 1(1~5, 부스트(모터 작동) 딜레이, 1: 노딜레이) &lt;br /&gt;P12: 5(1~5, 부스트(모터 작동) 강도: 출발 시 모터 출력 세기, 0:스로틀 비활성화 5:컨트롤러 최대 성능)&amp;nbsp;&lt;br /&gt;P13: 8(PAS 마그네틱 개수)&lt;br /&gt;P14: 13(전류 한계값)&lt;br /&gt;P15:&amp;nbsp;31.0(고정됨,&amp;nbsp;컨트롤러&amp;nbsp;언더&amp;nbsp;볼트(DC30+-5)/&amp;nbsp;배터리(28V-42V)&amp;nbsp;보호&amp;nbsp;볼트) &lt;br /&gt;P16:&amp;nbsp;+&amp;nbsp;버튼&amp;nbsp;5초 동안&amp;nbsp;누르기&amp;nbsp;-&amp;gt;&amp;nbsp;총 거리&amp;nbsp;초기화 &lt;br /&gt;P17: 0(쿠르즈 기능 사용유무, 1:풀 스로틀 유지 시 일정시간 후 자동 세팅, 브레이크 잡으면 해제, 0:사용 안 함) &lt;br /&gt;P18:&amp;nbsp;100(속도&amp;nbsp;안 맞을&amp;nbsp;때&amp;nbsp;조정&amp;nbsp;비율&amp;nbsp;설정) &lt;br /&gt;P19:&amp;nbsp;1(시스템&amp;nbsp;시작 시&amp;nbsp;PAS단계&amp;nbsp;0,&amp;nbsp;1:&amp;nbsp;시작 시&amp;nbsp;PAS&amp;nbsp;단계 1) &lt;br /&gt;P20:&amp;nbsp;0(프로토콜&amp;nbsp;넘버 2&amp;nbsp;사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;PAS에&amp;nbsp;대한&amp;nbsp;생각&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장거리를 꾸준하게 달릴 경우 단계별로 PAS를 올리게 됨으로 유용할 것입니다(9단이 배터리 절약에 유리).&amp;nbsp; &lt;br /&gt;시내에서 가다 서다 반복할 경우에는 PAS가 고단인 상태이고 정지상태에서 페달링을 하게 되면 넘쳐나는 토크로 인해 자전거가 갑자기 앞으로 튀어나가는 것을 경험하게 됩니다.&amp;nbsp; &lt;br /&gt;정지 시에는 PAS가 고단이었다면 오토바이(시티 100)처럼 저단으로 변경해 주어야 안전합니다. 오토바이(시티 100)의 경우 정지 중 고단(토크가 딸림)에서 출발 시 앞으로 튀어나가지 않습니다.&amp;nbsp; &lt;br /&gt;따라서&amp;nbsp;PAS를&amp;nbsp;끄고&amp;nbsp;필요할&amp;nbsp;때마다&amp;nbsp;스로틀로&amp;nbsp;조절하는 게&amp;nbsp;더&amp;nbsp;안전하게&amp;nbsp;느껴집니다.&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;쿠르즈 기능은 풀 스로틀 유지 시 일정시간 후 자동 세팅되며 잘 작동합니다. 하지만 배터리 전력 소비가 감당되지 않을 것입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;스로틀 테스트 및 브레이크 작동 시 스로틀 정지 테스트&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/QoC7kI7_Vv8&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;PAS 테스트&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/c0XrW4Njgxo&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;배터리 팩과 컨트롤러 전원선 XT60 커넥터 연결 시 스파크 발생&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지극히 정상적인 현상이라고 합니다. 컨트롤러에는 기동용 콘덴서가 있고 짧은 시간 동안에 방전됩니다. 배터리를 연결하기 전에는 콘덴서가 텅 빈 상태에서 커넥터의 접촉단자가 미세하게 닫는 순간 콘덴서에서 큰 전류를 빨아들이게 되고 이때 접촉된 접촉단자의&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;좁은 면적 때문에 &lt;/span&gt;저항이 급격히 올라가 열이 발생하고 스파크가 생기게 된다고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 한번 연결한 뒤 다시 커넥터를 뽑았다 연결하면 콘덴서가 방전되기 전이므로 큰 전류를 필요로 하지 않아 스파크가 발생하지 않게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스파크를 줄이는 방법으로는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 최초 접촉 면적을 넓게 하여 급격한 저항의 발생을 억제하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1-1. 커넥터를 빠르게 꼽는다.(미세하게 효과 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2-1. 별도의 스위치를 통해 순간적으로 넓은 접촉면을 갖도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 프리차징 회로를 구성하여 저전류로 콘덴서를 천천히 충전한 뒤 메인 커넥터를 연결하거나 프리차징 회로가 포함된 안티 스파크 커넥터를 사용하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리차징 회로는 1W 30옴 저항이 필요하다고 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vzt7I/btsJlX0VxB3/ypnROe6OlVEX3AAjbw9FWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vzt7I/btsJlX0VxB3/ypnROe6OlVEX3AAjbw9FWk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;701&quot; data-filename=&quot;edited_20240826_220637.jpg&quot; style=&quot;width: 30.5171%; margin-right: 10px;&quot; data-widthpercent=&quot;31.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vzt7I/btsJlX0VxB3/ypnROe6OlVEX3AAjbw9FWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvzt7I%2FbtsJlX0VxB3%2FypnROe6OlVEX3AAjbw9FWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;882&quot; height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dx4Ypf/btsJnjuUOSh/orwDGiQAhW9aiK2OZHTiI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dx4Ypf/btsJnjuUOSh/orwDGiQAhW9aiK2OZHTiI1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;742&quot; data-filename=&quot;edited_20240828_035333.jpg&quot; style=&quot;width: 30.5306%; margin-right: 10px;&quot; data-widthpercent=&quot;31.26&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dx4Ypf/btsJnjuUOSh/orwDGiQAhW9aiK2OZHTiI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdx4Ypf%2FbtsJnjuUOSh%2ForwDGiQAhW9aiK2OZHTiI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;934&quot; height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ7PEK/btsJnYcAPxX/vbZTaV2mhVIUetK5EB3se1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ7PEK/btsJnYcAPxX/vbZTaV2mhVIUetK5EB3se1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1720&quot; data-origin-height=&quot;1139&quot; data-filename=&quot;edited_resized_20240828_160223.jpg&quot; style=&quot;width: 36.6267%;&quot; data-widthpercent=&quot;37.5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ7PEK/btsJnYcAPxX/vbZTaV2mhVIUetK5EB3se1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ7PEK%2FbtsJnYcAPxX%2FvbZTaV2mhVIUetK5EB3se1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1720&quot; height=&quot;1139&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;배터리 잭 스파크 자국 / 16A 250VAC 스위치 / 커넥터 변환 케이블에 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;36V 배터리의 경우 큰 문제없이 사용할 수 있다고는 하나 커넥터에 스파크 자국이 남아 해결해 보기로 합니다.&amp;nbsp;우선 전기제품에서 나온 16A 250 VAC 스위치를 이용하여 온/오프 스위치로 사용하기로 하고 전원 커넥터 변환 케이블에 설치해 주었습니다. 장점으로는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;스위치를 끔으로써&lt;span&gt; &lt;/span&gt;&lt;/span&gt;대기전류 소모를 줄일 수 있으며 스파크가 발생하더라도 스위치에서 발행하고 문제가 발생하더라도 좀 더 저렴한 스위치를 교체해 주면 해결될 것입니다. 주문한&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;온-오프-온&lt;span&gt; 스위치가 도착하면 프리차징 회로를 구성하여 연결할 생각입니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 8.본문배너6 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KCD3 16A 250 AVC 온-오프-온 전원스위치&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1725159109220&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;1PCS KCD3 Rocker Switch ON-OFF ON-OFF-ON 2 Position 3Pins Electrical equipment With Light Power Switch 16A 250V / 20A 125V AC - &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DdTS8dZ&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005681017616.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DdTS8dZ&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=1a260bc0b2ed4903a5c429d20407b181-1725159104816-02235-_DdTS8dZ&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b6NJH1/hyWV3Z5q2v/prtt7NBeykaOVfwewZN8V1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdTS8dZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DdTS8dZ&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b6NJH1/hyWV3Z5q2v/prtt7NBeykaOVfwewZN8V1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1PCS KCD3 Rocker Switch ON-OFF ON-OFF-ON 2 Position 3Pins Electrical equipment With Light Power Switch 16A 250V / 20A 125V AC -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1W 30옴 저항&lt;/p&gt;
&lt;figure id=&quot;og_1725159171380&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;20pcs 1W Metal Film Resistor 2.4 2.7 3 24 27 30 240 270 300 R K Ohm  0.27ohm 1% Five-color Ring Resistance 2R4 2R7 3R 2.4K 2.7K &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DdDuMIL&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006393331095.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DdDuMIL&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=a40b8f69238e4f50b86195e92c22afb2-1725159166891-03014-_DdDuMIL&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkcrv4/hyWVYYNCr4/UH0iyymVUQno189LPyhL8K/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdDuMIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DdDuMIL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkcrv4/hyWVYYNCr4/UH0iyymVUQno189LPyhL8K/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;20pcs 1W Metal Film Resistor 2.4 2.7 3 24 27 30 240 270 300 R K Ohm 0.27ohm 1% Five-color Ring Resistance 2R4 2R7 3R 2.4K 2.7K&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbvCdr/btsJsZqIcWV/93mUzMSfzzn3sXi1gi9Xkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbvCdr/btsJsZqIcWV/93mUzMSfzzn3sXi1gi9Xkk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;479&quot; data-filename=&quot;edited_20240905_162348 사본.jpg&quot; style=&quot;width: 41.0017%; margin-right: 10px;&quot; data-widthpercent=&quot;41.98&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbvCdr/btsJsZqIcWV/93mUzMSfzzn3sXi1gi9Xkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbvCdr%2FbtsJsZqIcWV%2F93mUzMSfzzn3sXi1gi9Xkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhLSfW/btsJubpVvC0/70HPRkpy7WaIlnAwyIKFOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhLSfW/btsJubpVvC0/70HPRkpy7WaIlnAwyIKFOK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;549&quot; data-filename=&quot;edited_20240905_225219 사본.jpg&quot; style=&quot;width: 33.7825%; margin-right: 10px;&quot; data-widthpercent=&quot;34.59&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhLSfW/btsJubpVvC0/70HPRkpy7WaIlnAwyIKFOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhLSfW%2FbtsJubpVvC0%2F70HPRkpy7WaIlnAwyIKFOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;967&quot; height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/scyRs/btsJuZa8JQx/kYzR3w4CSy0fCVCZHfD2z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/scyRs/btsJuZa8JQx/kYzR3w4CSy0fCVCZHfD2z0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;858&quot; data-filename=&quot;edited_20240905_225820 사본.jpg&quot; style=&quot;width: 22.8902%;&quot; data-widthpercent=&quot;23.43&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/scyRs/btsJuZa8JQx/kYzR3w4CSy0fCVCZHfD2z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FscyRs%2FbtsJuZa8JQx%2FkYzR3w4CSy0fCVCZHfD2z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;임시스위치 / 스위치 교체 및 1W 30옴 저항 연결 / 마무리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스위치의 위치를 버튼표시 ⚊에 위치하면 1번과 2번이 연결됩니다. 버튼표시 ⚌에 위치하면 2번과 3번이 연결됩니다. 처음에는 1번과 3번을 뒤바뀌게 연결시켜 놓고 프리차징 회로가 아닌 배터리에 직접 연결됐다고 생각하여 작동을 시켰습니다. 스로틀을 올릴 때마다 모터가 움찔하면서 배터리 게이지가 출렁입니다. 모터가 컨트롤러의 콘덴서의 전력을 소비하면 배터리 게이지가 빈상태가 되고 프리차징 회로에서 천천히 충전되면서 배터리 게이지가 다시 차는 게 보입니다.&amp;nbsp; 따라서 S866의 배터리 게이지는 배터리팩의 남은 전력을 보여주는 것이 아니라 컨트롤러의 콘덴서의 전력량을 표시한다는 것을 알게 되었습니다. 또한 여러 번 테스트하다 보니 1W 30옴 저항이 타버렸다는 걸 알게 되었습니다. 상기 사진의 연결 상태에서는 ⚊ 표시일 때 프리차징이 됩니다. ⚌ 표시일 때 정상적인 배터리팩 연결이 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전기자전거 풀 스로틀 테스트 중 셧다운 발생&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;S866 디스플레이에 배터리 전압이 36V(배터리 약 50% 남은 상태)로 표시된 상태였고(배터리 3칸) 최대 전류값 13 암페어로 설정되었을 때 풀 스로틀시 셧다운되었습니다. 이때는 모터가 작동할 때 전압강하가 발생한다는 생각을 하지 못해 배터리 볼트가 36V이고 배터리 칸이 3칸으로 표시되어 있어 전력은 충분하다고 생각했었습니다. 일정 시간 지난 뒤 배터리 재연결시 작동했으나 이때 또 풀스로틀 테스트를 함으로써 다시 셧다운 되었고 한 번 더 셧다운을 반복한 뒤에는 다시 작동되지 않았습니다. 이후 배터리를 충전시켰습니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;▶ 셧다운&amp;nbsp;추정&amp;nbsp;원인 &lt;br /&gt;1. BMS(BATTERY MANAGEMENT SYSTEM)에 의해 셧다운 &lt;br /&gt;&amp;nbsp; &amp;nbsp; 풀 스로틀시 배터리 팩의 특정셀이 BMS 설정값(예 2.9V) 이하로 떨어지는 경우 BMS에 의해 셧다운. &lt;br /&gt;2. 컨트롤러 P15값(31V) 이하로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;전압강하가 발행하여&lt;span&gt; &lt;/span&gt;&lt;/span&gt;이에 따라 셧다운.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 배터리 전압이 36V 이하인 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 작동 시에도 배터리 팩의 전압이 36V이하가 되면 셧다운 됩니다. 셧다운 됐을 때 멀티미터로 측정한 배터리팩 아웃 볼트는 35.9V였습니다. 배터리 팩을 완충하면 42.2V가 됩니다. 42V에서 36V로 전력이 소모될 때까지 사용할 수 있습니다. 현재의 배터리 팩의 용량이 부족한 느낌이 듭니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xw5vc/btsJm6WGFOO/wmzs8gzbkr5yzFUnZ0RlNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xw5vc/btsJm6WGFOO/wmzs8gzbkr5yzFUnZ0RlNk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;225&quot; data-filename=&quot;20240831_065714.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xw5vc/btsJm6WGFOO/wmzs8gzbkr5yzFUnZ0RlNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxw5vc%2FbtsJm6WGFOO%2Fwmzs8gzbkr5yzFUnZ0RlNk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bihFk4/btsJn7N4fdP/xQo17eaRCERDDj9wjxKe2K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bihFk4/btsJn7N4fdP/xQo17eaRCERDDj9wjxKe2K/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;225&quot; data-filename=&quot;20240831_065658.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bihFk4/btsJn7N4fdP/xQo17eaRCERDDj9wjxKe2K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbihFk4%2FbtsJn7N4fdP%2FxQo17eaRCERDDj9wjxKe2K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uwKd1/btsJoqUgzXD/I3DuwFkBuJ1O6IoJUQq440/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uwKd1/btsJoqUgzXD/I3DuwFkBuJ1O6IoJUQq440/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;225&quot; data-filename=&quot;20240831_065706.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uwKd1/btsJoqUgzXD/I3DuwFkBuJ1O6IoJUQq440/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuwKd1%2FbtsJoqUgzXD%2FI3DuwFkBuJ1O6IoJUQq440%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;디스플레이 모드: 이동 거리 표시 / 측정 전압 표시 / 운행 시간 표시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 전압강하 테스트(측정 전압 표시 모드)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전류 한계값 10A로 세팅하고 언덕에서 풀스로틀시(로드 시) 약 4.5V 전압강하(39V -&amp;gt; 34.5V) 발생하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속도 기준으로 PAS 저단에서 전압강하 더 많이 발생하는 것 같습니다. 즉 스로틀 강도에 따라 토크가 많이 발생하고 전압강하도 많이 되는 것 같습니다.&amp;nbsp;&lt;br /&gt;- PAS 3단에서 풀 스로틀시 속도 약 18KM 약 4.5V 전압강하&lt;br /&gt;- PAS 5단에서 절반 스로틀시 약 18KM 약 2.5~3V 전압강하&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ 수정 컨트롤러 세팅값&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;P01: 3(S866 백라이트 밝기)&amp;nbsp;&lt;br /&gt;P02: 0(거리 단위 KM/마일)&lt;br /&gt;P03:&amp;nbsp;36(배터리&amp;nbsp;전압)&lt;br /&gt;P04:&amp;nbsp;10(10분 동안&amp;nbsp;작동&amp;nbsp;없으면&amp;nbsp;S866&amp;nbsp;꺼짐)&lt;br /&gt;P05: 5(5단계 PAS 모드/스로틀 단계, 3:3단계, 9:9단계)&amp;nbsp;&lt;br /&gt;P06:&amp;nbsp;16(바퀴사이즈-인치)&lt;br /&gt;P07: 1(기본값 1:홀센서 있는 경우)&lt;br /&gt;P08: &lt;span style=&quot;color: #ee2323;&quot;&gt;25&lt;/span&gt;(제한 속도 25km, 100: 제한해제)&lt;br /&gt;P09:&amp;nbsp;0(정지&amp;nbsp;상태에서&amp;nbsp;스로틀/PAS&amp;nbsp;사용)&lt;br /&gt;P10: &lt;span style=&quot;color: #ee2323;&quot;&gt;1&lt;/span&gt;(드라이브 모드, 2:스로틀/PAS 동시 사용, 1:스로틀만 0:PAS만)&lt;br /&gt;P11: &lt;span style=&quot;color: #ee2323;&quot;&gt;1&lt;/span&gt;(1~5, 부스트(모터 작동) 딜레이, 1: 노딜레이)&lt;br /&gt;P12: &lt;span style=&quot;color: #ee2323;&quot;&gt;1&lt;/span&gt;(1~5, 부스트(모터 작동) 강도: 출발 시 모터 출력 세기, 0:스로틀 비활성화 5:컨트롤러 최대 성능)&amp;nbsp;&lt;br /&gt;P13: 8(PAS 마그네틱 개수)&lt;br /&gt;P14: &lt;span style=&quot;color: #ee2323;&quot;&gt;10&lt;/span&gt;(전류 한계값)&lt;br /&gt;P15:&amp;nbsp;31.0(고정됨,&amp;nbsp;컨트롤러&amp;nbsp;언더&amp;nbsp;볼트(DC30+-5)/&amp;nbsp;배터리(28V-42V)&amp;nbsp;보호&amp;nbsp;볼트)&lt;br /&gt;P16:&amp;nbsp;+&amp;nbsp;버튼&amp;nbsp;5초 동안&amp;nbsp;누르기&amp;nbsp;-&amp;gt;&amp;nbsp;총 거리&amp;nbsp;초기화&lt;br /&gt;P17: 0(쿠르즈 기능 사용유무, 1:풀 스로틀 유지 시 일정시간 후 자동 세팅, 브레이크 잡으면 해제, 0:사용 안 함)&lt;br /&gt;P18:&amp;nbsp;100(속도&amp;nbsp;안 맞을&amp;nbsp;때&amp;nbsp;조정&amp;nbsp;비율&amp;nbsp;설정)&lt;br /&gt;P19:&amp;nbsp;1(시스템&amp;nbsp;시작 시&amp;nbsp;PAS단계&amp;nbsp;0,&amp;nbsp;1:&amp;nbsp;시작 시&amp;nbsp;PAS&amp;nbsp;단계 1)&lt;br /&gt;P20:&amp;nbsp;0(프로토콜&amp;nbsp;넘버 2&amp;nbsp;사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 8.본문배너7 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;S866 LCD에서 제어할 수 있는 헤드라이트 장착&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구입한 36V LED 헤드라이트는 경적이 포함되어 있습니다. 따라서 제어 커넥터가 3 핀입니다. 하지만 S866은 단지 헤드라이트만 제어하므로 2 핀이고 두 핀 모두 암 커넥터입니다. LED 헤드라이트의 3핀 암커넥터를 2핀 수커넥터로 변경한 뒤 S866 커넥터에 연결해 주었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doRYVW/btsJtcjo4VM/DG8Ro1dQfRgs7QMk5fEdPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doRYVW/btsJtcjo4VM/DG8Ro1dQfRgs7QMk5fEdPk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;589&quot; data-filename=&quot;헤드라이트전원.jpg&quot; style=&quot;width: 34.4184%; margin-right: 10px;&quot; data-widthpercent=&quot;35.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doRYVW/btsJtcjo4VM/DG8Ro1dQfRgs7QMk5fEdPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoRYVW%2FbtsJtcjo4VM%2FDG8Ro1dQfRgs7QMk5fEdPk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;870&quot; height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kPWY2/btsJue1Aybt/04FW85RmAJwq6Zp92q4Y8k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kPWY2/btsJue1Aybt/04FW85RmAJwq6Zp92q4Y8k/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;352&quot; data-origin-height=&quot;455&quot; data-filename=&quot;2핀변경.jpg&quot; style=&quot;width: 18.0268%; margin-right: 10px;&quot; data-widthpercent=&quot;18.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kPWY2/btsJue1Aybt/04FW85RmAJwq6Zp92q4Y8k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkPWY2%2FbtsJue1Aybt%2F04FW85RmAJwq6Zp92q4Y8k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;352&quot; height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAlsoW/btsJvdOaaf4/4azE0sEJYpn6VL2sBKYY80/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAlsoW/btsJvdOaaf4/4azE0sEJYpn6VL2sBKYY80/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;407&quot; data-filename=&quot;S866헤드라이트전원.jpg&quot; style=&quot;width: 45.2292%;&quot; data-widthpercent=&quot;46.3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAlsoW/btsJvdOaaf4/4azE0sEJYpn6VL2sBKYY80/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAlsoW%2FbtsJvdOaaf4%2F4azE0sEJYpn6VL2sBKYY80%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;790&quot; height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;LED 헤드라이트 3핀 암 커넥터 / 2핀 수커넥터로 변경 / S866 헤드라이트 커넥터 - 36V 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eoy7Y7/btsJtgMO4sx/7goDYQ3karGIvTmociGZJk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eoy7Y7/btsJtgMO4sx/7goDYQ3karGIvTmociGZJk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot; data-filename=&quot;20240906_153557 사본.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eoy7Y7/btsJtgMO4sx/7goDYQ3karGIvTmociGZJk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feoy7Y7%2FbtsJtgMO4sx%2F7goDYQ3karGIvTmociGZJk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biJAqz/btsJt1hdu9Z/oIcKWlKgShWsKdQt8fLYD1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biJAqz/btsJt1hdu9Z/oIcKWlKgShWsKdQt8fLYD1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot; data-filename=&quot;20240906_153607 사본.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biJAqz/btsJt1hdu9Z/oIcKWlKgShWsKdQt8fLYD1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiJAqz%2FbtsJt1hdu9Z%2FoIcKWlKgShWsKdQt8fLYD1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuBfxe/btsJub4TW7e/dQ3JUvoT94ci24uKR9Hi11/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuBfxe/btsJub4TW7e/dQ3JUvoT94ci24uKR9Hi11/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1440&quot; data-filename=&quot;20240906_153429 사본.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuBfxe/btsJub4TW7e/dQ3JUvoT94ci24uKR9Hi11/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuBfxe%2FbtsJub4TW7e%2FdQ3JUvoT94ci24uKR9Hi11%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;+ 버튼을 5초간 누르면 켜지고 꺼집니다(헤드라이트 온 표시) / 헤드라이트 온 / 장착 사진&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1725614164061&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;2 in 1 Scooter Horn Headlight Durable Waterproof Motorcycle Electric Bike Front Light Lamp Electric Scooters Accessories 48-80V &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dc9HZSn&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006974727389.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dc9HZSn&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=c37e41e1ef354fde896e3d748d1955d4-1725614158710-01973-_Dc9HZSn&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JuSZG/hyWZlZ90XM/XOIklv8HsvBALpEluLOG20/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dc9HZSn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dc9HZSn&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JuSZG/hyWZlZ90XM/XOIklv8HsvBALpEluLOG20/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2 in 1 Scooter Horn Headlight Durable Waterproof Motorcycle Electric Bike Front Light Lamp Electric Scooters Accessories 48-80V&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;무선 후미등 KS-SF31 장착&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무선으로 제어할 수 있는 충전식 후미등을 장착하였습니다. 가속도 센서로 속도가 줄어들 경우 자동차의 브레이크등처럼 밝게 표시됩니다. 좌/우 깜빡이를 표시할 수 있습니다. 경적/도난 방지기능도 있습니다. 도난 방지는 락을 걸어놓았을 때 속도 변화를 감지하면 경고음이 울리는 방식 같습니다. 기본적으로 사운드 소리가 너무 크게 설정되어 있으므로 사운드 크기를 작게 줄여주는 게 좋을 것 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_20240906_165622.jpg&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KspuT/btsJt6QkIj2/4bSHCcmZK1IwJK2gxkinH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KspuT/btsJt6QkIj2/4bSHCcmZK1IwJK2gxkinH1/img.png&quot; data-alt=&quot;무선 후미등 KS-SF31 장착 모습&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KspuT/btsJt6QkIj2/4bSHCcmZK1IwJK2gxkinH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKspuT%2FbtsJt6QkIj2%2F4bSHCcmZK1IwJK2gxkinH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;464&quot; data-filename=&quot;edited_20240906_165622.jpg&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;무선 후미등 KS-SF31 장착 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1725615958502&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Camaroca Wireless Bicycle Alarm Rear Tail Light With Turn Signal IP65 Waterproof Remote Control USB Bike Brake Sensor Taillight &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Ddwv8pt&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006744627769.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Ddwv8pt&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=92c3725c392e45eb8de145f3de8c7c44-1725615954578-02692-_Ddwv8pt&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/h76Dp/hyWZj88CSh/RhrTNOquZTkMKSL2ccf9L0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Ddwv8pt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Ddwv8pt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/h76Dp/hyWZj88CSh/RhrTNOquZTkMKSL2ccf9L0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Camaroca Wireless Bicycle Alarm Rear Tail Light With Turn Signal IP65 Waterproof Remote Control USB Bike Brake Sensor Taillight&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전기 자전거로 변환하기 위해 꼭 보아야 할 동영상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 타이어 튜브 교체 참조 영상&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/AziM7fuNxxI&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 전기자전거 변환키트 설치 참조 영상&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/cq7OyAWHvo8&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 프리휠 스프라켓 분리 참조 영상&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/L21ET256Iac&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ KT-8C PAS SENSOR 설치 참조 영상&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ISLNoOocoxo&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ LCD 디스플레이 S866 사용 및 설정 참조 영상&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/hSbDzuEtqrI&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 변속기 재설정 참조 영상&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/oAEluULkDh4&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알찬 정보</category>
      <category>s866</category>
      <category>전기자전거</category>
      <category>전기자전거 개조</category>
      <category>전기자전거 변환키트</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/212</guid>
      <comments>https://postpop.tistory.com/212#entry212comment</comments>
      <pubDate>Sun, 1 Sep 2024 14:07:00 +0900</pubDate>
    </item>
    <item>
      <title>ESP32 - 온도 습도 센서 AHT20 예제, I2C 통신</title>
      <link>https://postpop.tistory.com/211</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AHT20은 아두이노 환경에서 사용할 수 있는 디지털 온도 및 습도 센서입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AHT20 특징:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작동&amp;nbsp;전압:&amp;nbsp;2.2&amp;nbsp;-&amp;nbsp;5.5&amp;nbsp;V &lt;br /&gt;작동&amp;nbsp;온도:&amp;nbsp;-40&amp;nbsp;&amp;deg;C&amp;nbsp;~&amp;nbsp;85&amp;nbsp;&amp;deg;C &lt;br /&gt;습도&amp;nbsp;정확도:&amp;nbsp;일반적인&amp;nbsp;&amp;plusmn;&amp;nbsp;2% &lt;br /&gt;습도&amp;nbsp;해상도:&amp;nbsp;0.024% &lt;br /&gt;온도&amp;nbsp;정확도:&amp;nbsp;일반적인&amp;nbsp;&amp;plusmn;&amp;nbsp;0.3&amp;nbsp;&amp;deg;&amp;nbsp;C &lt;br /&gt;온도&amp;nbsp;해상도:&amp;nbsp;일반적인&amp;nbsp;0.01&amp;nbsp;&amp;deg;C &lt;br /&gt;&lt;br /&gt;AHT1x와&amp;nbsp;AHT2x&amp;nbsp;차이점: &lt;br /&gt;-&amp;nbsp;AHT1x&amp;nbsp;작동전압:&amp;nbsp;1.8&amp;nbsp;-&amp;nbsp;3.6V &lt;br /&gt;-&amp;nbsp;AHT1x&amp;nbsp;작동전압:&amp;nbsp;2.2&amp;nbsp;-&amp;nbsp;5.5V &lt;br /&gt;-&amp;nbsp;AHT2x&amp;nbsp;체크섬&amp;nbsp;지원(CRC)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/prCcO/btsIZyAplPI/kJ3tbPrIPKV3ajApwSVuVk/Data%20Sheet%20AHT20.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Data Sheet AHT20.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.45MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32와 AHT20 연결방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VIN -&amp;gt; 3.3V&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SCL -&amp;gt; GPIO17&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDA -&amp;gt; GPIO5&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ESP32_AHT20 연결.png&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;795&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpT5kR/btsI0fHahGF/q8zcBPsKJJ2FAzygHvconK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpT5kR/btsI0fHahGF/q8zcBPsKJJ2FAzygHvconK/img.png&quot; data-alt=&quot;VIN-3.3V/GND-GND/SCL-GPIO17/SDA-GPIO5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpT5kR/btsI0fHahGF/q8zcBPsKJJ2FAzygHvconK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpT5kR%2FbtsI0fHahGF%2Fq8zcBPsKJJ2FAzygHvconK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;324&quot; data-filename=&quot;ESP32_AHT20 연결.png&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;795&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;VIN-3.3V/GND-GND/SCL-GPIO17/SDA-GPIO5&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ZkPL1/btsI0C9GuUJ/AyY65uZ2tZngxqFFNmrNfk/ESP32_AHT20.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_AHT20.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1723291047570&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdint.h&amp;gt;
#include &amp;lt;math.h&amp;gt;
#include &amp;lt;Arduino.h&amp;gt;
#include &amp;lt;Wire.h&amp;gt;

#define I2C_SDA 5
#define I2C_SCL 17
#define AHT20_ADD 0x38 // The device's I2C address is either 0x38 or 0x39.

const uint8_t eSensorCalibrateCmd[3]  PROGMEM = {0xE1, 0x08, 0x00};
const uint8_t eSensorMeasureCmd[3]    PROGMEM = {0xAC, 0x33, 0x00};

bool AHT20_begin() {
  Wire.setPins(I2C_SDA, I2C_SCL);
  //Serial.println(F(&quot;setPins&quot;));
  Wire.begin(); 
  //Serial.println(F(&quot;Wire.begin&quot;));
  Wire.beginTransmission(AHT20_ADD);
  //Serial.println(F(&quot;AHT20_ADD&quot;));
  Wire.write(eSensorCalibrateCmd, 3);
  //Serial.println(F(&quot;command&quot;));
  Wire.endTransmission();
  delay(100);
  Wire.requestFrom(AHT20_ADD, 1);
  unsigned char result = 0;
  result = Wire.read();
  if((result&amp;amp;0x68) == 0x08) { 
    Serial.println(&quot;Init AHT10/20 Sucess.&quot;); 
    return true; 
  } else { 
    Serial.println(&quot;Init AHT10/20 Failure.&quot;); 
    return false; 
  } 
}

uint8_t vTaskCount = 0;
DRAM_ATTR float temp_i2c = 0;
DRAM_ATTR float reh_i2c = 0;

// Specify the constants for water vapor and barometric pressure.
#define WATER_VAPOR 17.62f
#define BAROMETRIC_PRESSURE 243.5f

float GetDewPoint(float humidity, float temperature) {
  // Calculate the intermediate value 'gamma'
  float gamma = log(humidity / 100) + WATER_VAPOR * temperature / (BAROMETRIC_PRESSURE + temperature);
  // Calculate dew point in Celsius
  float dewPoint = BAROMETRIC_PRESSURE * gamma / (WATER_VAPOR - gamma);
  return dewPoint;
}

void readAHT20sensor() { // IRAM_ATTR 
  unsigned long result, temp[6] = { 255, };
  Wire.beginTransmission(AHT20_ADD);
  Wire.write(eSensorMeasureCmd, 3);
  Wire.endTransmission(); 
  vTaskDelay(40);  // 최소 35mil 필요 -&amp;gt; 연결 환경에 따라 조절
  vTaskCount += 2; // vTaskDelay 40밀리초 반영
  Wire.requestFrom(AHT20_ADD, 6); 
  uint8_t outCount = 0; bool ok = false;
  while(temp[0] == 255) {  
    for(unsigned char i = 0; i &amp;lt; 6; i++) { temp[i] = Wire.read(); }  //temp[0] = Wire.read();
    if (!bitRead(temp[0], 7)) { ok = true; break; } // If the status bit [Bit7] is 0, it means that the data can be read normally
    else { temp[0] = 255; } //return ok; }
    outCount++; if (outCount &amp;gt; 60) { break; }
    Wire.requestFrom(AHT20_ADD, 6); 
    vTaskDelay(1); 
  }
  if (ok) { // {status, RH, RH, RH+T, T, T, CRC*}, *CRC for AHT2x only
    result = ((temp[1] &amp;lt;&amp;lt; 16) | (temp[2] &amp;lt;&amp;lt; 8) | temp[3]) &amp;gt;&amp;gt; 4;
    reh_i2c = float(result) * 100 / 1048576;
    Serial.print(&quot;Humi: &quot;); Serial.println(reh_i2c);
    result = ((temp[3] &amp;amp; 0x0F) &amp;lt;&amp;lt; 16) | (temp[4] &amp;lt;&amp;lt; 8) | temp[5];
    temp_i2c = ((200 * float(result)) / 1048576) - 50;
    Serial.print(&quot;Temp: &quot;); Serial.println(temp_i2c);
    Serial.print(&quot;DewPoint: &quot;); Serial.println(GetDewPoint(reh_i2c, temp_i2c));
  }
}

void SENSOR(void *pvParameters) { // esp32 example FreeRTOS
  (void) pvParameters;
  for (;;) {
    if (vTaskCount &amp;gt;= 25) { //0.5초
      vTaskCount = 0;
      readAHT20sensor(); 
    }
    vTaskDelay(20); 
    vTaskCount++;
  }
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(1000);
  bool AHTOK = AHT20_begin();
  if (!AHTOK) { delay(10); AHTOK = AHT20_begin(); }
  if (AHTOK) {
    readAHT20sensor(); 
  }
  xTaskCreate(SENSOR, &quot;SENSOR&quot;, 4096, NULL, 1, NULL); // Priority 0 being the lowest.
}

void loop() {
  // put your main code here, to run repeatedly:

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;시리얼모니터 출력.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ac7eM/btsI0L6nI8Q/PwgbgwkAXOu9SUb9oJO6e0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ac7eM/btsI0L6nI8Q/PwgbgwkAXOu9SUb9oJO6e0/img.png&quot; data-alt=&quot;시리얼 모니터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ac7eM/btsI0L6nI8Q/PwgbgwkAXOu9SUb9oJO6e0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAc7eM%2FbtsI0L6nI8Q%2FPwgbgwkAXOu9SUb9oJO6e0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;544&quot; data-filename=&quot;시리얼모니터 출력.png&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시리얼 모니터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 라이브러리: &lt;a href=&quot;https://github.com/enjoyneering/AHTxx&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/enjoyneering/AHTxx&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 코드 내용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I2C 핀맵 설정: ESP32 GPIO 번호 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#define&amp;nbsp;I2C_SDA&amp;nbsp;5 &lt;br /&gt;#define&amp;nbsp;I2C_SCL&amp;nbsp;17&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32 FreeRTOS의 xTask 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I2C를 이용하여 AHT20센서와 통신을 하기위해서 반드시 응답 대기 시간이 필요하게 됩니다. 응답 대기 시간으로 아두이노의 delay()함수를 사용하지 않기 위해서는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;xTask를 설정하고 vTaskDelay를 사용해야 합니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;xTask&lt;span&gt; 할당 메모리는 4096 또는 2048등으로 변경하실 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DBK9uAr&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DBK9uAr&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723292068260&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;AHT10 AHT20 AHT21 High Precision Digital Temperature and Humidity Sensor Measurement Module I2C Communication Replace SHT20 - Al&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DBK9uAr&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006691022402.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DBK9uAr&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=7f8bdefdc72b4e8b9f51ad7545aecce5-1723280665849-06457-_DBK9uAr&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/p0RIB/hyWKEl38BV/kYfirWHho4Qx2MSel5CEFK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DBK9uAr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DBK9uAr&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/p0RIB/hyWKEl38BV/kYfirWHho4Qx2MSel5CEFK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;AHT10 AHT20 AHT21 High Precision Digital Temperature and Humidity Sensor Measurement Module I2C Communication Replace SHT20 - Al&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AHT20_size.png&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/epLlcn/btsI1ToRzrj/3nfsyjZEybNcFaHVoOReVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/epLlcn/btsI1ToRzrj/3nfsyjZEybNcFaHVoOReVK/img.png&quot; data-alt=&quot;AHT20 센서 모듈 상세&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/epLlcn/btsI1ToRzrj/3nfsyjZEybNcFaHVoOReVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FepLlcn%2FbtsI1ToRzrj%2F3nfsyjZEybNcFaHVoOReVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;321&quot; data-filename=&quot;AHT20_size.png&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AHT20 센서 모듈 상세&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino</category>
      <category>aht20</category>
      <category>esp32</category>
      <category>아두이노</category>
      <category>온도/습도 센서</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/211</guid>
      <comments>https://postpop.tistory.com/211#entry211comment</comments>
      <pubDate>Sat, 10 Aug 2024 21:20:47 +0900</pubDate>
    </item>
    <item>
      <title>미니벨로 자전거 용품 링크 모음</title>
      <link>https://postpop.tistory.com/210</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;서브루나&amp;nbsp;200W&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.11st.co.kr/products/6805220363&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.11st.co.kr/products/6805220363&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768443089&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[11번가] 서브루나 미니벨로 접이식 자전거 경량 가벼운 미니 폴딩 20인치 시마노 7단&quot; data-og-description=&quot;자전거&amp;gt;자전거&amp;gt;미니벨로&amp;gt;접이식 미니벨로, 가격 : 274,000원&quot; data-og-host=&quot;www.11st.co.kr&quot; data-og-source-url=&quot;https://www.11st.co.kr/products/6805220363&quot; data-og-url=&quot;https://www.11st.co.kr/products/6805220363&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b3xWyQ/hyWGUixNOq/ZWV1EPU7IvfVs6sgRj5bU0/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/dkAZ9r/hyWKE6a8wy/27bWsOhhIGxlGvvQeA6uTk/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/flom5/hyWGUQmyr6/nXWq7rJgAVXexQOCr4P6k0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://www.11st.co.kr/products/6805220363&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.11st.co.kr/products/6805220363&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b3xWyQ/hyWGUixNOq/ZWV1EPU7IvfVs6sgRj5bU0/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/dkAZ9r/hyWKE6a8wy/27bWsOhhIGxlGvvQeA6uTk/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/flom5/hyWGUQmyr6/nXWq7rJgAVXexQOCr4P6k0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[11번가] 서브루나 미니벨로 접이식 자전거 경량 가벼운 미니 폴딩 20인치 시마노 7단&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자전거&amp;gt;자전거&amp;gt;미니벨로&amp;gt;접이식 미니벨로, 가격 : 274,000원&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.11st.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키후&amp;nbsp;폰드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://link.coupang.com/a/bL1sGk&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://link.coupang.com/a/bL1sGk&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768481899&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;키후 폰드 미니벨로 자전거 40.64cm 경량미니벨로 접이식자전거 7단 - 자전거용품 | 쿠팡&quot; data-og-description=&quot;쿠팡에서 키후 폰드 미니벨로 자전거 40.64cm 경량미니벨로 접이식자전거 7단 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 자전거용품 제품도 바로 쿠팡에서 확인할 수 있습니다.&quot; data-og-host=&quot;www.coupang.com&quot; data-og-source-url=&quot;https://link.coupang.com/a/bL1sGk&quot; data-og-url=&quot;https://www.coupang.com/vp/products/6579119227?vendorItemId=null&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zhKVE/hyWGUixNSE/CUApL1AHYPO0fkx7ZekKJ1/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492,https://scrap.kakaocdn.net/dn/ujJDt/hyWG0bZrsC/JB0R8kiojPqU7PItMNpxIk/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230&quot;&gt;&lt;a href=&quot;https://link.coupang.com/a/bL1sGk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://link.coupang.com/a/bL1sGk&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zhKVE/hyWGUixNSE/CUApL1AHYPO0fkx7ZekKJ1/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492,https://scrap.kakaocdn.net/dn/ujJDt/hyWG0bZrsC/JB0R8kiojPqU7PItMNpxIk/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;키후 폰드 미니벨로 자전거 40.64cm 경량미니벨로 접이식자전거 7단 - 자전거용품 | 쿠팡&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;쿠팡에서 키후 폰드 미니벨로 자전거 40.64cm 경량미니벨로 접이식자전거 7단 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 자전거용품 제품도 바로 쿠팡에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.coupang.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;알리익스프레스&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 닥터바이크&amp;nbsp;F16&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.aliexpress.com/item/1005006917962971.html?spm=a2g0o.order_list.order_list_main.145.21ef140fS7ePwv&amp;amp;gatewayAdapt=glo2kor&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.aliexpress.com/item/1005006917962971.html?spm=a2g0o.order_list.order_list_main.145.21ef140fS7ePwv&amp;amp;gatewayAdapt=glo2kor&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768535021&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;닥터바이크 미니벨로 자전거 16인치 6단 스틸프레임 접이식자전거 F-16 - AliExpress 18&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;ko.aliexpress.com&quot; data-og-source-url=&quot;https://ko.aliexpress.com/item/1005006917962971.html?spm=a2g0o.order_list.order_list_main.145.21ef140fS7ePwv&amp;amp;gatewayAdapt=glo2kor&quot; data-og-url=&quot;https://ko.aliexpress.com/item/1005006917962971.html?src=ibdm_d03p0558e02r02&amp;amp;sk=&amp;amp;aff_platform=&amp;amp;aff_trace_key=&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rTEuB/hyWGSSy2S6/0kAPNBEXYf77scTcebrRHk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://ko.aliexpress.com/item/1005006917962971.html?spm=a2g0o.order_list.order_list_main.145.21ef140fS7ePwv&amp;amp;gatewayAdapt=glo2kor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.aliexpress.com/item/1005006917962971.html?spm=a2g0o.order_list.order_list_main.145.21ef140fS7ePwv&amp;amp;gatewayAdapt=glo2kor&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rTEuB/hyWGSSy2S6/0kAPNBEXYf77scTcebrRHk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;닥터바이크 미니벨로 자전거 16인치 6단 스틸프레임 접이식자전거 F-16 - AliExpress 18&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 물받이 및 짐받이 기본 장착 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;16인치 미니벨로&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DlgtwDd&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DlgtwDd&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1726638813588&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Cross Life New Student Bicycle Variable Speed Disc Brake Children's Mini Bicycle Adult Travel Folding Shock-absorbing Bicycle - &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DlgtwDd&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007096104725.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DlgtwDd&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=c3a83be0d89940cba259a0c1066ba68f-1726638809161-08222-_DlgtwDd&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZI23S/hyW6DSWqgM/Kcithr0GkAXYg072A16lb0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DlgtwDd&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DlgtwDd&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZI23S/hyW6DSWqgM/Kcithr0GkAXYg072A16lb0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Cross Life New Student Bicycle Variable Speed Disc Brake Children's Mini Bicycle Adult Travel Folding Shock-absorbing Bicycle -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;▶&lt;span&gt; 16인치 전기자전거 개조 키트&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_ooznUUP&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_ooznUUP&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731229016255&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Brushless Gear DC Electric Bike Hub Motor Kit, Bicycle Front Wheel, DIY, 16 Inch, 48V, 36V, 24V, 350W - AliExpress 18&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_ooznUUP&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007219251552.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_ooznUUP&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=9d76d04f5e374588a8e1b0a33d4f6947-1731227575109-05807-_ooznUUP&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/euj8qH/hyXsTXxKh5/3k0kE9eO5ou1unp1yXbF80/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_ooznUUP&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_ooznUUP&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/euj8qH/hyXsTXxKh5/3k0kE9eO5ou1unp1yXbF80/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Brushless Gear DC Electric Bike Hub Motor Kit, Bicycle Front Wheel, DIY, 16 Inch, 48V, 36V, 24V, 350W - AliExpress 18&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;▶&lt;span&gt;&amp;nbsp;전기자전거&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oERiF3t&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_oERiF3t&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731229025941&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;400W Ebike 35km/h 48V 30AH Removable Battery Electric Bike Multi-Shock Absorption City Commuter Foldable Adult Electric Bicycle &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_oERiF3t&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006608083759.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_oERiF3t&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=5a9c711c41b0492b8e5436e6fb3ec648-1731228344322-02425-_oERiF3t&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/J9dH7/hyXwninpwx/kLcOn0jRjVfG7IPBkzJwwk/img.jpg?width=1600&amp;amp;height=1600&amp;amp;face=0_0_1600_1600&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oERiF3t&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_oERiF3t&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/J9dH7/hyXwninpwx/kLcOn0jRjVfG7IPBkzJwwk/img.jpg?width=1600&amp;amp;height=1600&amp;amp;face=0_0_1600_1600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;400W Ebike 35km/h 48V 30AH Removable Battery Electric Bike Multi-Shock Absorption City Commuter Foldable Adult Electric Bicycle&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oovNaLV&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_oovNaLV&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731229035686&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;ZPW Ebike K100 400W 48V 30AH Electric bike Adult Fat Tire Folding Electric Bicycle City Commuter Electric Bike Urban Ebike - Ali&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_oovNaLV&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007585194746.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_oovNaLV&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=6bd412563f85432690e3125f45907ffe-1731228556900-03231-_oovNaLV&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tsMGB/hyXwhPZdmw/P7lxJAjY1HB2pAExtxKauk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oovNaLV&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_oovNaLV&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tsMGB/hyXwhPZdmw/P7lxJAjY1HB2pAExtxKauk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ZPW Ebike K100 400W 48V 30AH Electric bike Adult Fat Tire Folding Electric Bicycle City Commuter Electric Bike Urban Ebike - Ali&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 옥타&amp;nbsp;BB&amp;nbsp;타입&amp;nbsp;어댑터가&amp;nbsp;포함된&amp;nbsp;크랭크암&amp;nbsp;분리&amp;nbsp;도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DBDmYix&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DBDmYix&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768604979&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;1Pc Bicycle Crankset Puller Crank Arm Puller Remover Bike Tools MTB Mountain Crank Extractor Bicycle Carbon Steel Repair Tool - &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DBDmYix&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006664430932.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DBDmYix&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=c40b3a1708ad451fbed3c3468b407ca9-1722768600278-04593-_DBDmYix&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ijdAG/hyWKD0vDGs/mWvX0ac4h2FKke6XNXqAy1/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DBDmYix&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DBDmYix&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ijdAG/hyWKD0vDGs/mWvX0ac4h2FKke6XNXqAy1/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1Pc Bicycle Crankset Puller Crank Arm Puller Remover Bike Tools MTB Mountain Crank Extractor Bicycle Carbon Steel Repair Tool -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 일반적인 크랭크암 분리도구 세트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dl8YrGb&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_Dl8YrGb&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768657242&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bike Tool Kit 6 Pcs Professional Bicycle Repair Tools for Mountain Bike with 3-in-1 Cassette Remover Wrench Chain Breaker - AliE&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dl8YrGb&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006482042083.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dl8YrGb&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=5958644d30f846f4a711e61920f8abd3-1722768653553-07652-_Dl8YrGb&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XRNAj/hyWKyrlC37/kTeTpkuTPJ88Zd8Eh0oYS0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dl8YrGb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dl8YrGb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XRNAj/hyWKyrlC37/kTeTpkuTPJ88Zd8Eh0oYS0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bike Tool Kit 6 Pcs Professional Bicycle Repair Tools for Mountain Bike with 3-in-1 Cassette Remover Wrench Chain Breaker - AliE&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;프리휠 스프라켓 분리도구 1개&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;크랭크암 분리도구 1셋(14mm 복스알)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;체인 브레이커(체인 교체용) 1개&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;페달축(Bottom Bracket) 분리도구 1개&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;바큇살(스포크) 장력 조절 렌치 1개&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;카세트 타입 스프라켓 리무버툴 1개&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;● 자전거 도구 세트에 포함된 프리휠 스프라켓 분리도구는 미세하게 작아 정상적으로 분리시키지 못하고 헛돌게(빠가 납니다) 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; ● 크랭크암 분리도구는 잘 작동합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; ● 나머지 도구는 사용해 보지 않았습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ 프리휠 스프라켓 분리도구&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DEfmiET&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DEfmiET&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724580956918&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bike Rear Cassette Cog Remover Bicycle Repair Tool Freewheel Socket Black ToolBicycle Cassette Crank Wheel Removal Tool - AliExp&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DEfmiET&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005915115601.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DEfmiET&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=a3e71f8b5b044ad08c28f0f71dc7d28f-1724580953188-00424-_DEfmiET&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cmCaxT/hyWSd2VF2C/y1HxFYkUiA6dHJAZ6c5rAK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DEfmiET&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DEfmiET&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cmCaxT/hyWSd2VF2C/y1HxFYkUiA6dHJAZ6c5rAK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bike Rear Cassette Cog Remover Bicycle Repair Tool Freewheel Socket Black ToolBicycle Cassette Crank Wheel Removal Tool - AliExp&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; ● 정상적으로 분리 시킵니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶전동 임팩용 복스알(크랭크암 분리시 14mm 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDjgUzt&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DDjgUzt&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1725672443006&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;6mm-19mm Impact Socket Magnetic Nut Screwdriver 1/4 Hex Key Set Drill Bit Adapter for Power Drills Impact Drivers Socket Kit - A&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DDjgUzt&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005004802948085.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DDjgUzt&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=1742b693377c4bc387fca59496edcf93-1725672439578-03737-_DDjgUzt&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bn6mKj/hyWZgEGMO2/w4IKFwXvjTwoiCKhyELTDk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDjgUzt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DDjgUzt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bn6mKj/hyWZgEGMO2/w4IKFwXvjTwoiCKhyELTDk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;6mm-19mm Impact Socket Magnetic Nut Screwdriver 1/4 Hex Key Set Drill Bit Adapter for Power Drills Impact Drivers Socket Kit - A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;▶ 16인치 바퀴용 머드가드(물받이)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DkAvdoF&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DkAvdoF&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768707709&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Folding Bike Mudguard Set Unbreakable Bicycle Accessories Mud Guard For 14 Inch 20 Inch Universal Bike Mudguard Kit Hardware - A&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DkAvdoF&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005002081545403.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DkAvdoF&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=a191215510264d5b875d2defedb78a0a-1722768703381-08888-_DkAvdoF&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cSiF9S/hyWKCgeHGY/sDZ5xyWnlXUK7bya3CTRg0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DkAvdoF&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DkAvdoF&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cSiF9S/hyWKCgeHGY/sDZ5xyWnlXUK7bya3CTRg0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Folding Bike Mudguard Set Unbreakable Bicycle Accessories Mud Guard For 14 Inch 20 Inch Universal Bike Mudguard Kit Hardware - A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 안장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmzclmR&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DmzclmR&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768737238&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bike Saddle Silicone Cushion Cycling Seat PU Leather Surface Silica Filled Gel TimeTrial Comfortable Shockproof Bicycle Saddle -&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DmzclmR&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005038516522.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DmzclmR&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=e6a88095a5b747b3905638d1bf79598d-1722768733515-05471-_DmzclmR&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KBT2m/hyWKu3Aqmm/IbmGitYVkusgw5wGlCTy9k/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmzclmR&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DmzclmR&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KBT2m/hyWKu3Aqmm/IbmGitYVkusgw5wGlCTy9k/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bike Saddle Silicone Cushion Cycling Seat PU Leather Surface Silica Filled Gel TimeTrial Comfortable Shockproof Bicycle Saddle -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 안장 서스펜션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmvxWSL&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DmvxWSL&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768753168&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bicycle Saddle Suspension Device For MTB Mountain Road Bike Shocks Mount Alloy Spring Steel Shock Absorber Comfort Cycling Parts&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DmvxWSL&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006513555820.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DmvxWSL&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=62333a200dd146c98317f9e3561b9fa3-1722768749971-08848-_DmvxWSL&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bx1xvx/hyWGQtFNRs/AUUdb2xZkQSEUXuch000D1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmvxWSL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DmvxWSL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bx1xvx/hyWGQtFNRs/AUUdb2xZkQSEUXuch000D1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bicycle Saddle Suspension Device For MTB Mountain Road Bike Shocks Mount Alloy Spring Steel Shock Absorber Comfort Cycling Parts&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; 1달 사용후 부러졌습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 자물쇠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dn4bqtv&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_Dn4bqtv&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768770070&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bicycle 5 Digit Code Cable Lock 1200mm*12mm Anti-theft Bike Password Lock Bike Security Steel Cable Cycling Lock Bike Parts - Al&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dn4bqtv&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005981444852.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dn4bqtv&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=afb2d52ffae24b5d876e5bb48984ba42-1722768765911-06374-_Dn4bqtv&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgpSp6/hyWKBVVT7X/zpkWzQGasd8PEnLCD7UEO0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dn4bqtv&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dn4bqtv&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgpSp6/hyWKBVVT7X/zpkWzQGasd8PEnLCD7UEO0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bicycle 5 Digit Code Cable Lock 1200mm*12mm Anti-theft Bike Password Lock Bike Security Steel Cable Cycling Lock Bike Parts - Al&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 핸들바 익스텐션 브래킷&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Ddlg0pt&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_Ddlg0pt&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768788460&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;20cm Bicycle Handlebar Extended Bracket Bike Mount Bar Computer Holder Support Rack Alloy Stand Double Frame Bicycle Clip - AliE&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Ddlg0pt&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007288561674.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Ddlg0pt&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=b88ac6ca080a47d4b119a7b961d2aa56-1722768785163-07663-_Ddlg0pt&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tHpwk/hyWGV2OeKe/QQHzutipeem0msztWeUGVK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Ddlg0pt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Ddlg0pt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tHpwk/hyWGV2OeKe/QQHzutipeem0msztWeUGVK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;20cm Bicycle Handlebar Extended Bracket Bike Mount Bar Computer Holder Support Rack Alloy Stand Double Frame Bicycle Clip - AliE&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 휴대폰 거치대&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DldazFZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DldazFZ&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768816503&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;New Mobile Support for the Car Phone Holder Live Streaming Stands Motorcycle Mountain Bike Electric Bike Universal Fixed Frame -&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DldazFZ&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005898842523.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DldazFZ&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=b491bc8b195c47a39249664f0fd08b6c-1722768811177-09929-_DldazFZ&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/C5bT9/hyWKBn449q/mpGb3weU2aYV76x6qgqvd0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DldazFZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DldazFZ&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/C5bT9/hyWKBn449q/mpGb3weU2aYV76x6qgqvd0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;New Mobile Support for the Car Phone Holder Live Streaming Stands Motorcycle Mountain Bike Electric Bike Universal Fixed Frame -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 벨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DCplobV&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DCplobV&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768834678&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;New Stainless Bicycle Bell Ring MTB Cycling Horn Bike Handlebar Bell Crisp Sound Horn for Bicycle Safety Bike Accessories - AliE&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DCplobV&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005863666562.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DCplobV&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=00c2681bcbff49b3938d053af9984d03-1722768829681-00386-_DCplobV&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sbCQG/hyWGXsPvti/T1pRRL6eulfbY6ggud2Hw0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DCplobV&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DCplobV&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sbCQG/hyWGXsPvti/T1pRRL6eulfbY6ggud2Hw0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;New Stainless Bicycle Bell Ring MTB Cycling Horn Bike Handlebar Bell Crisp Sound Horn for Bicycle Safety Bike Accessories - AliE&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 핸들바 자전거 백미러&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdM1Yb5&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DdM1Yb5&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768849704&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bicycle 1PC Rear View Convex Mirror Handlebar Drop Bar Mount Acrylic Lens Back Sight Reflector Light Weight - AliExpress 18&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DdM1Yb5&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005038752030.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DdM1Yb5&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=56f6f27d56c843f8a6b1539fe16cc612-1722768845334-07158-_DdM1Yb5&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIzPVT/hyWGP2BRcr/KFEZ8WkQuR9DhXhdJ1YYKk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdM1Yb5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DdM1Yb5&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIzPVT/hyWGP2BRcr/KFEZ8WkQuR9DhXhdJ1YYKk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bicycle 1PC Rear View Convex Mirror Handlebar Drop Bar Mount Acrylic Lens Back Sight Reflector Light Weight - AliExpress 18&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 휴대용 에어펌프&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdoU6v1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DdoU6v1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768866717&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Xunting Bike Pump Portable Mini Cycling Hand Air Pump High Pressure Ball MTB Road Bicycle Tire Inflator Schrader Presta Valve - &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DdoU6v1&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006030128416.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DdoU6v1&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=2704374ebe934bf59b8fff10b1234346-1722768861977-08057-_DdoU6v1&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Q54E1/hyWGQ8iwJj/m78SMQn0O4bBPkfJQMkIT1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdoU6v1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DdoU6v1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Q54E1/hyWGQ8iwJj/m78SMQn0O4bBPkfJQMkIT1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Xunting Bike Pump Portable Mini Cycling Hand Air Pump High Pressure Ball MTB Road Bicycle Tire Inflator Schrader Presta Valve -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 압력계가 있는 휴대용 에어펌프&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dl8oymb&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_Dl8oymb&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768895156&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bike Pump Mini Portable Bicycle Foot Pump with Pressure Gauge Accessories Fits Presta &amp;amp; Schrader Valve Bicycle Air Pump - AliExp&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dl8oymb&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005003092750739.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dl8oymb&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=26330d151fcb4708a6fd9f1144c93ed7-1722768890732-01265-_Dl8oymb&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bc4Lcc/hyWGQNYN0O/STvie3yq3z7hKCzzrsW8K1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=432_464_653_706&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dl8oymb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dl8oymb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bc4Lcc/hyWGQNYN0O/STvie3yq3z7hKCzzrsW8K1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=432_464_653_706');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bike Pump Mini Portable Bicycle Foot Pump with Pressure Gauge Accessories Fits Presta &amp;amp; Schrader Valve Bicycle Air Pump - AliExp&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 뒷바퀴용 짐받이(뒤포크)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DnedgxH&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DnedgxH&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768912021&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Quick Release Adjustable Bike Bicycle Cargo Rack Bike Rear Rack MTB Road Bicycle Bike Cargo Luggage Carrier Rack with Mudguard -&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DnedgxH&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007268176954.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DnedgxH&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=480e3398db6b47c3b8596abdec6e9cdc-1722768907125-03226-_DnedgxH&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bZTuC0/hyWKzjuWnm/xZstgT7dgkK9UXfgNgEyHk/img.jpg?width=1601&amp;amp;height=1601&amp;amp;face=0_0_1601_1601&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DnedgxH&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DnedgxH&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bZTuC0/hyWKzjuWnm/xZstgT7dgkK9UXfgNgEyHk/img.jpg?width=1601&amp;amp;height=1601&amp;amp;face=0_0_1601_1601');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Quick Release Adjustable Bike Bicycle Cargo Rack Bike Rear Rack MTB Road Bicycle Bike Cargo Luggage Carrier Rack with Mudguard -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 배송실패 -&amp;gt; 환불 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DCoSZEj&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DCoSZEj&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723110761410&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Mountain Bike Carrier With Reflective Plate Riding Equipment Quick Disassembly Aluminum Alloy Bicycle Rear Shelf Bicycle Parts -&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DCoSZEj&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007100058126.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DCoSZEj&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=1ee25f06225a47d6a6de0f232724c197-1723110756892-02988-_DCoSZEj&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0ipRs/hyWKxUuHY2/g1Q6IBN2SaWwXehU4OvlhK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DCoSZEj&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DCoSZEj&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0ipRs/hyWKxUuHY2/g1Q6IBN2SaWwXehU4OvlhK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Mountain Bike Carrier With Reflective Plate Riding Equipment Quick Disassembly Aluminum Alloy Bicycle Rear Shelf Bicycle Parts -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;● 닥터바이크 F16에 장착&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 접이식 페달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDUWfEr&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DDUWfEr&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722768930500&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Mountain Road Bike Pedal Universal Bicycle Pedal Footboard with Reflector Riding Accessories for Folding eBike Electric Vehicle &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DDUWfEr&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006495291175.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DDUWfEr&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=ca00c6d5ff8f43a7a70070f1218b5089-1722768925516-01090-_DDUWfEr&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/DFIkt/hyWKKL6k0N/c5pdHGkIDWVe1uyqW53zN0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDUWfEr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DDUWfEr&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/DFIkt/hyWKKL6k0N/c5pdHGkIDWVe1uyqW53zN0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Mountain Road Bike Pedal Universal Bicycle Pedal Footboard with Reflector Riding Accessories for Folding eBike Electric Vehicle&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 배송실패 -&amp;gt; 환불 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 짐 고정용 화물 네트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DkJGIcn&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DkJGIcn&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722770664522&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Motorcycle Cargo Net High Elastic Double Layer Motorcycle Net for Helmet Storage 10&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DkJGIcn&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006044522025.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DkJGIcn&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=31a8396c20ab471f9f6657cc2b82adeb-1722770656498-00184-_DkJGIcn&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DkJGIcn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DkJGIcn&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Motorcycle Cargo Net High Elastic Double Layer Motorcycle Net for Helmet Storage 10&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DeqoGzv&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DeqoGzv&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722770686441&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;40x40cm Reflection Motorcycle Cargo Net Motorcycle ATV Luggage storage organizer Net - AliExpress 201355758&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DeqoGzv&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006296898106.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DeqoGzv&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=c1bfc43009224c1c9d390e14090939c2-1722770678579-00443-_DeqoGzv&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DeqoGzv&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DeqoGzv&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;40x40cm Reflection Motorcycle Cargo Net Motorcycle ATV Luggage storage organizer Net - AliExpress 201355758&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 체인 청소 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DFHdiZp&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DFHdiZp&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722770643180&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;ThinkRider Portable Bicycle Chain Cleaner Bike Brushes Scrubber Wash Tool Mountain Cycling Cleaning Kit Outdoor Accessory - AliE&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DFHdiZp&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006070145735.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DFHdiZp&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=1aaf2c2c38e4400f951f888203a0ace7-1722770635266-09930-_DFHdiZp&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1TMu4/hyWG2OoE56/g3YpIgZfvGEvgrpkUXMOn0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DFHdiZp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DFHdiZp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1TMu4/hyWG2OoE56/g3YpIgZfvGEvgrpkUXMOn0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ThinkRider Portable Bicycle Chain Cleaner Bike Brushes Scrubber Wash Tool Mountain Cycling Cleaning Kit Outdoor Accessory - AliE&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 물병 거치대 어댑터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmItXJZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DmItXJZ&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771020041&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bicycle Water Bottle Holder Adapter Adjustable Non-slip Bike Bottle Cage Mounting Base Bottle Cage Adjuster Cycling Accessories &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DmItXJZ&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006247397905.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DmItXJZ&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=847d57b3f69643f098c45a09d51dfecd-1722771014790-04355-_DmItXJZ&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beQmoI/hyWKGiCUut/vNeAC87JD0QQ2YdjZNCkEk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmItXJZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DmItXJZ&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beQmoI/hyWKGiCUut/vNeAC87JD0QQ2YdjZNCkEk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bicycle Water Bottle Holder Adapter Adjustable Non-slip Bike Bottle Cage Mounting Base Bottle Cage Adjuster Cycling Accessories&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거용 장갑&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DFw7YAb&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DFw7YAb&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1725671935367&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Outdoor MTB Cycling Gloves Full Finger Touchscreen Breathable Anti-sweat Shockproof Motorcycle Gloves Men Hiking Mountaineering &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DFw7YAb&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006033534605.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DFw7YAb&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=abca7c362306482a90a0ff7ebb537500-1725671931456-06716-_DFw7YAb&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/csknlm/hyWZllHYKk/ajVB4WZ0gR1BfVZcVjVnoK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DFw7YAb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DFw7YAb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/csknlm/hyWZllHYKk/ajVB4WZ0gR1BfVZcVjVnoK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Outdoor MTB Cycling Gloves Full Finger Touchscreen Breathable Anti-sweat Shockproof Motorcycle Gloves Men Hiking Mountaineering&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거용 장갑(겨울용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oF2S8Ll&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_oF2S8Ll&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730812918181&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Ski Gloves Grab Velvet Touch Screen Gloves Autumn and Winter Warm Plus Velvet Cold Proof Waterproof Outdoor Riding Model - AliEx&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_oF2S8Ll&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005271466002.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_oF2S8Ll&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=dc095eb30a444bca9eb77b2b5fb80d87-1730812911834-03711-_oF2S8Ll&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/i1Qq5/hyXsQZYEbn/ANNEwnHtR4Pko8J2n46LOk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oF2S8Ll&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_oF2S8Ll&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/i1Qq5/hyXsQZYEbn/ANNEwnHtR4Pko8J2n46LOk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ski Gloves Grab Velvet Touch Screen Gloves Autumn and Winter Warm Plus Velvet Cold Proof Waterproof Outdoor Riding Model - AliEx&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 귀마개 대용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_omEznCb&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_omEznCb&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730812983762&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Adjustable Sleeping Mask Blackout Ear Muffs For Sleeping Relaxing Noise Cancellation - AliExpress 30&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_omEznCb&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007408007456.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_omEznCb&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=123ecb7e78fe4b03ae19ef5d278dc5a3-1730812976494-09098-_omEznCb&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LdqsP/hyXs0VMegl/VXh4atYQazsb0zYlcLh5D1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_omEznCb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_omEznCb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LdqsP/hyXs0VMegl/VXh4atYQazsb0zYlcLh5D1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Adjustable Sleeping Mask Blackout Ear Muffs For Sleeping Relaxing Noise Cancellation - AliExpress 30&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 손잡이 방풍 커버&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_omOALZN&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_omOALZN&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730813097886&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Motorcycle Scooter Thick Warm Handlebar Muff Grip Handle Bar Muff Rainproof Riding Protective Winter Warmer Thermal Cover Gloves&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_omOALZN&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007792611730.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_omOALZN&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=43d8c1da298f43d4a602f23efd8b0505-1730813092121-03405-_omOALZN&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/SaZSe/hyXsYp7XFO/WcSkubyuHImN3otEvRXo90/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_omOALZN&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_omOALZN&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/SaZSe/hyXsYp7XFO/WcSkubyuHImN3otEvRXo90/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Motorcycle Scooter Thick Warm Handlebar Muff Grip Handle Bar Muff Rainproof Riding Protective Winter Warmer Thermal Cover Gloves&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 보조배터리 히팅 패드(장갑 또는 방풍커버에 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_omaNshh&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_omaNshh&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730813160195&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;USB Electric Heating Pad For Gloves 5V USB Gloves Heated Pad 2 in1 Warming heating pad Carbon fiber heating cloth for Winter - A&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_omaNshh&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007629013289.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_omaNshh&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=9f4d885580fb4095841c69c5386c6bbd-1730813154528-04695-_omaNshh&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bhotiS/hyXs2Z9gtq/SmnsDRI1C9ufXPITm5dVKK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_omaNshh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_omaNshh&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bhotiS/hyXs2Z9gtq/SmnsDRI1C9ufXPITm5dVKK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;USB Electric Heating Pad For Gloves 5V USB Gloves Heated Pad 2 in1 Warming heating pad Carbon fiber heating cloth for Winter - A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 디스크 브레이크 패드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oEJjDhl&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_oEJjDhl&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730813216900&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;BUCKLOS Semi-Metal Brake Pads Mountain Bike Hydraulic Disc Brake Pads for SHIMANO B01S B05S MTB Road Bicycle Cycling Brake Part &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_oEJjDhl&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007347708638.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_oEJjDhl&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=906a8bd7974f4568859378c89fb5265d-1730813211463-04385-_oEJjDhl&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/p43k9/hyXsY4LkJ3/kLKXchyxEkSGmLsTHTCRrK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oEJjDhl&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_oEJjDhl&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/p43k9/hyXsY4LkJ3/kLKXchyxEkSGmLsTHTCRrK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;BUCKLOS Semi-Metal Brake Pads Mountain Bike Hydraulic Disc Brake Pads for SHIMANO B01S B05S MTB Road Bicycle Cycling Brake Part&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 손전등 고정용 브라켓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dko1bKP&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_Dko1bKP&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771145758&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bike Flashlight Holder Bicycle Mounting Bracket Flashlight Holder 360&amp;deg; Rotation Torch Clip for Cycling Riding - AliExpress 2013&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dko1bKP&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006022688253.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dko1bKP&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=fbcfcc0483ed41e9915b2f23b4ed63c0-1722771140590-06745-_Dko1bKP&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buAYNE/hyWKBIom7U/Wy0Xze9ynxox2Po3wQ2Hk1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dko1bKP&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dko1bKP&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buAYNE/hyWKBIom7U/Wy0Xze9ynxox2Po3wQ2Hk1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bike Flashlight Holder Bicycle Mounting Bracket Flashlight Holder 360&amp;deg; Rotation Torch Clip for Cycling Riding - AliExpress 2013&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶자전거 헬멧&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DntaOCB&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DntaOCB&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722772031528&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Ultralight Cycling Helmet Hat Bicycle Racing Equipments Scooter Bike Safety Cap Integrally-Molded Hard Hats Cover Protection - A&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DntaOCB&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006194715616.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DntaOCB&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=5590494c62724e94b9d59491eb43884a-1722772025722-07101-_DntaOCB&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/33uaM/hyWGVoceBk/J8Kdl6odlvKoOrFeU1Kuk1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DntaOCB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DntaOCB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/33uaM/hyWGVoceBk/J8Kdl6odlvKoOrFeU1Kuk1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ultralight Cycling Helmet Hat Bicycle Racing Equipments Scooter Bike Safety Cap Integrally-Molded Hard Hats Cover Protection - A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 배송실패 -&amp;gt; 환불 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DFnpjyL&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DFnpjyL&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1725672019386&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bicycle Safety Helmet 3C Certified Lightweight Men's And Women's Adult Electric Bicycle Motorcycle Half Helmet With Goggles - Al&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DFnpjyL&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007532358213.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DFnpjyL&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=3731c54410d74fca8fd3316a213c1682-1725672015348-05769-_DFnpjyL&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cBj968/hyWZhjjuC4/j3G4H4z5T6C2lOTmf9eiv0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DFnpjyL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DFnpjyL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cBj968/hyWZhjjuC4/j3G4H4z5T6C2lOTmf9eiv0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bicycle Safety Helmet 3C Certified Lightweight Men's And Women's Adult Electric Bicycle Motorcycle Half Helmet With Goggles - Al&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;● 구매 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 무게 측정용 휴대용 저울&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dkp1zVz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_Dkp1zVz&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771088726&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Portable Scale Digital LCD Display 110lb/50kg Electronic Luggage Hanging Suitcase Travel Weighs Baggage Bag Weight Balance - Ali&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dkp1zVz&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005004753948635.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dkp1zVz&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=4fdf1c5fd9aa49fc994cf461a6cf1241-1722771083332-03274-_Dkp1zVz&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MXlGA/hyWG28IVB9/kuYtBgbjpPYKdgD1k7M9b1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dkp1zVz&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dkp1zVz&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MXlGA/hyWG28IVB9/kuYtBgbjpPYKdgD1k7M9b1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Portable Scale Digital LCD Display 110lb/50kg Electronic Luggage Hanging Suitcase Travel Weighs Baggage Bag Weight Balance - Ali&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 크로스 바디 가방&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dk3a8jV&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_Dk3a8jV&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771328277&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Japanese Harajuku Reflective Chest Bag Women and Men Waist Bag Collage Student Crossbody Bags Purses and Handbags - AliExpress 1&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dk3a8jV&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007003768439.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dk3a8jV&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=772b136505e64007a68d68ef218d7f04-1722771322020-03149-_Dk3a8jV&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4SzLL/hyWKJNbDrV/1WnrfZYW6cIhXrLMEbVZB1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dk3a8jV&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dk3a8jV&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4SzLL/hyWKJNbDrV/1WnrfZYW6cIhXrLMEbVZB1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Japanese Harajuku Reflective Chest Bag Women and Men Waist Bag Collage Student Crossbody Bags Purses and Handbags - AliExpress 1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 보냉가방 30리터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmMOWe3&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DmMOWe3&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771387183&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;30L Refrigerator Bag Soft Large 36 Cans Insulated Cooler Backpack Thermal Isothermal Fridge Travel Beach Ice Beer Backpack - Ali&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DmMOWe3&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007039313211.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DmMOWe3&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=607f3300b59643eab144dc0f6d289dcb-1722771382944-04954-_DmMOWe3&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/oxlFb/hyWKxTxgJt/qIIkjD7ZCy25NdePCPkmlk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmMOWe3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DmMOWe3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/oxlFb/hyWKxTxgJt/qIIkjD7ZCy25NdePCPkmlk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;30L Refrigerator Bag Soft Large 36 Cans Insulated Cooler Backpack Thermal Isothermal Fridge Travel Beach Ice Beer Backpack - Ali&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 휴대폰 케이스 (보조 배터리 장착용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DBuTW2j&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DBuTW2j&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771422949&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Vertical Nylon Cell Phone Belt Clip Holster Stonego Carrying Pouch Card Holder - AliExpress 509&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DBuTW2j&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006466659007.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DBuTW2j&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=da3574331b774dedb3d0894a4746fd61-1722771416362-09114-_DBuTW2j&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgwgkT/hyWKEd3cqt/LeF9GTiGleFkPdnEr1eLIK/img.jpg?width=2000&amp;amp;height=2000&amp;amp;face=0_0_2000_2000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DBuTW2j&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DBuTW2j&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgwgkT/hyWKEd3cqt/LeF9GTiGleFkPdnEr1eLIK/img.jpg?width=2000&amp;amp;height=2000&amp;amp;face=0_0_2000_2000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Vertical Nylon Cell Phone Belt Clip Holster Stonego Carrying Pouch Card Holder - AliExpress 509&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 슈레더 밸브 코어 리무버&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dex7VTZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_Dex7VTZ&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771803816&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Universal Tire Valve Core Stems Remover Screwdriver Auto Truck Bicycle Wheel Repair Tool Dual Use Car Accessories Tire Remover -&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dex7VTZ&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005641954973.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dex7VTZ&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=2561a8de802944ddbac5a795f5d0fdb4-1722771798107-08700-_Dex7VTZ&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xHxpz/hyWGParj03/zvGVbU0aJFUcUbShT99S50/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dex7VTZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dex7VTZ&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xHxpz/hyWGParj03/zvGVbU0aJFUcUbShT99S50/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Universal Tire Valve Core Stems Remover Screwdriver Auto Truck Bicycle Wheel Repair Tool Dual Use Car Accessories Tire Remover -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 배송실패 -&amp;gt; 환불 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DeTZHsX&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DeTZHsX&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723113538865&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;4 In 1 French American Valve Wrench Aluminum Alloy Presta / Schrader Valve Core Disassembly Installation Tools for MTB Road Bike&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DeTZHsX&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007184035520.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DeTZHsX&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=31b140c7144d49f8914026e5acf088d9-1723113533145-08351-_DeTZHsX&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GzBdF/hyWKBQaYUs/LYUQWQX7IuYrnwMjk2g120/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DeTZHsX&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DeTZHsX&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GzBdF/hyWKBQaYUs/LYUQWQX7IuYrnwMjk2g120/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;4 In 1 French American Valve Wrench Aluminum Alloy Presta / Schrader Valve Core Disassembly Installation Tools for MTB Road Bike&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;● 구매완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 타이어 튜브 실란트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DCCnVAn&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DCCnVAn&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771966363&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;400ML Bicycle Motorcycle Tire Self-rehydration Effective Fast Mountain Bike Tire Repair Fluid Tire Sealant Sealing Machine - Ali&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DCCnVAn&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006613539912.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DCCnVAn&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=6d607308dd094ad2b14fb79de0c9a8bc-1722771961750-00792-_DCCnVAn&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dWJCG2/hyWKFYlbLE/kDDlcTZuxIB1lEZ14y7v10/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DCCnVAn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DCCnVAn&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dWJCG2/hyWKFYlbLE/kDDlcTZuxIB1lEZ14y7v10/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;400ML Bicycle Motorcycle Tire Self-rehydration Effective Fast Mountain Bike Tire Repair Fluid Tire Sealant Sealing Machine - Ali&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 배송실패 -&amp;gt; 환불 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DcgdnF5&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DcgdnF5&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723114682033&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;400ML Bicycle Motorcycle Tire Self-rehydration Effective Fast Mountain Bike Tire Repair Fluid Tire Sealant Sealing Machine - Ali&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DcgdnF5&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006902735340.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DcgdnF5&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=99468b2fbb024f15abc8e3db6ad5823a-1723114678576-05326-_DcgdnF5&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/YEiGy/hyWKx75vqw/md4gQyTbSNmCpLZ1H5xgZK/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DcgdnF5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DcgdnF5&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/YEiGy/hyWKx75vqw/md4gQyTbSNmCpLZ1H5xgZK/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;400ML Bicycle Motorcycle Tire Self-rehydration Effective Fast Mountain Bike Tire Repair Fluid Tire Sealant Sealing Machine - Ali&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;● 구매완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; ▶ 자전거 그리스&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DlAr3CF&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DlAr3CF&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771757753&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;LEBYCLE Bike Bicycle Grease Lubricant MTB Bike Oil for Hub Bottom Bracket Headset Fork Flywheel Ball Bearing Grease - AliExpress&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DlAr3CF&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006713545703.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DlAr3CF&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=485469d167b64656bc7f3f08477130c7-1722771754154-07412-_DlAr3CF&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkQhng/hyWKG3ZTxI/AhUcmUKIWTBISTsngVbtfk/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DlAr3CF&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DlAr3CF&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkQhng/hyWKG3ZTxI/AhUcmUKIWTBISTsngVbtfk/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;LEBYCLE Bike Bicycle Grease Lubricant MTB Bike Oil for Hub Bottom Bracket Headset Fork Flywheel Ball Bearing Grease - AliExpress&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 배송실패 -&amp;gt; 환불 완료 ==&amp;gt; 다이소에서 판매함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거&amp;nbsp;체인&amp;nbsp;건조&amp;nbsp;윤활유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdYK4Vv&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DdYK4Vv&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771851239&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;60ML Bicycle Chain Lubricant Dry Lube Chain Oil Long-Lasting Bike Chain Oil Waxy Maintenance Oil Squirt MTB Road Bike Accessorie&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DdYK4Vv&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007225695156.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DdYK4Vv&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=0910c6ac22d742719263906e12a94f71-1722771847173-08371-_DdYK4Vv&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bSLzXK/hyWG3s2kAq/NgsdSClqzpsqGGV9tMnoM0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdYK4Vv&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DdYK4Vv&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bSLzXK/hyWG3s2kAq/NgsdSClqzpsqGGV9tMnoM0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;60ML Bicycle Chain Lubricant Dry Lube Chain Oil Long-Lasting Bike Chain Oil Waxy Maintenance Oil Squirt MTB Road Bike Accessorie&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 배송실패 -&amp;gt; 환불 완료 ==&amp;gt; 다이소에서 판매함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;▶&lt;/span&gt; 전기자전거 변환 키트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DloYJEB&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DloYJEB&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771519592&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;250W-500W Electric Bicycle Conversion Kit 36V48V Rear Rotate Wheel Hub Motor Electric Bicycle kit 16-29inch700C Rear Drop 135mm &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DloYJEB&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006105550948.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DloYJEB&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=247f399e37074a31a0cf7203ccad54a7-1722771514432-04430-_DloYJEB&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dSBg80/hyWGYZzuja/UtaIT1Pjpt25Hdy5GUBzNk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DloYJEB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DloYJEB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dSBg80/hyWGYZzuja/UtaIT1Pjpt25Hdy5GUBzNk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;250W-500W Electric Bicycle Conversion Kit 36V48V Rear Rotate Wheel Hub Motor Electric Bicycle kit 16-29inch700C Rear Drop 135mm&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;▶&lt;/span&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;전기자전거 개조용 36V&lt;/span&gt; 리듐이온 배터리 팩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oCXVUvz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_oCXVUvz&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1730187495265&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;36V 100000mAh 18650 Rechargeable Lithium Battery Pack 10S3P Power Modified Bicycle Scooter Electric Vehicle with BMS+charger - A&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_oCXVUvz&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007325434642.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_oCXVUvz&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=56d8fedd4e774563ae9f163a7d8bdf1e-1730187491360-07602-_oCXVUvz&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKpdLT/hyXpz4I6V9/FVAFW3lDoY26SpyMl6KAhK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_oCXVUvz&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_oCXVUvz&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKpdLT/hyXpz4I6V9/FVAFW3lDoY26SpyMl6KAhK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;36V 100000mAh 18650 Rechargeable Lithium Battery Pack 10S3P Power Modified Bicycle Scooter Electric Vehicle with BMS+charger - A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DF2yZmB&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DF2yZmB&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1722771483673&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;10S3P 100Ah 18650 Rechargeable Lithium Battery Pack 36V Power Modified Bicycle Scooter Electric Vehicle with BMS+charger - AliEx&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DF2yZmB&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007153184354.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DF2yZmB&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=a2982f3913bb486799e9fff75a597dbc-1722771478357-09429-_DF2yZmB&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vMQgx/hyWKIncYa3/JHhTyfhzUObJGFQWQNy6V0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DF2yZmB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DF2yZmB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vMQgx/hyWKIncYa3/JHhTyfhzUObJGFQWQNy6V0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;10S3P 100Ah 18650 Rechargeable Lithium Battery Pack 36V Power Modified Bicycle Scooter Electric Vehicle with BMS+charger - AliEx&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;● 구매완료 - 현재 한국배송 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좀더 저렴한 배터리팩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DCF3hDz&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DCF3hDz&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1725672270190&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;10S3P 36V 100Ah 18650 Rechargeable Lithium Battery Pack 1000W Power Modified Bicycle electric scooter Vehicle with BMS - AliExpr&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DCF3hDz&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006204968403.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DCF3hDz&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=72b2ffaf2cd04160be167eb5a3f3683c-1725672169161-08271-_DCF3hDz&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dKLDEh/hyWZbJ9ikx/zQTKKGKKGcNvgp7bi99ka1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DCF3hDz&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DCF3hDz&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dKLDEh/hyWZbJ9ikx/zQTKKGKKGcNvgp7bi99ka1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;10S3P 36V 100Ah 18650 Rechargeable Lithium Battery Pack 1000W Power Modified Bicycle electric scooter Vehicle with BMS - AliExpr&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;▶&lt;/span&gt; 전기자전거 변환 키트와 배터리 연결용 커넥터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDEc5BZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DDEc5BZ&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1723270456027&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Ebike Battery Cable Adapter PP30 To XT60 Battery Connector Ebike Battery Cable Electric Bicycle MTB Mountain Road Bike Parts - A&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DDEc5BZ&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007191085462.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DDEc5BZ&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=34ab13555f32468390eaa341dde892e7-1723270451252-04857-_DDEc5BZ&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JgWx7/hyWOhpbwkB/ZKkX88kL4gvqKtTI8nQYt1/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDEc5BZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DDEc5BZ&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JgWx7/hyWOhpbwkB/ZKkX88kL4gvqKtTI8nQYt1/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ebike Battery Cable Adapter PP30 To XT60 Battery Connector Ebike Battery Cable Electric Bicycle MTB Mountain Road Bike Parts - A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;▶&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;전기자전거용 경적 겸용 헤드라이트(S866 디스플레이의 헤드라이트 커넥터에 연결)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dc9HZSn&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_Dc9HZSn&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724716201774&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;2 in 1 Scooter Horn Headlight Durable Waterproof Motorcycle Electric Bike Front Light Lamp Electric Scooters Accessories 48-80V &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dc9HZSn&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006974727389.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dc9HZSn&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=0bc2a34b7fe240fd946e8d35b312e84c-1724716197659-08347-_Dc9HZSn&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/P33Xv/hyWSk834jp/2Zjxkrj9W46dsigVBUL051/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dc9HZSn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dc9HZSn&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/P33Xv/hyWSk834jp/2Zjxkrj9W46dsigVBUL051/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;2 in 1 Scooter Horn Headlight Durable Waterproof Motorcycle Electric Bike Front Light Lamp Electric Scooters Accessories 48-80V&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;▶ KS-SF31 충전식 무선 후방 경고등&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Ddwv8pt&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_Ddwv8pt&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724716223281&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Camaroca Wireless Bicycle Alarm Rear Tail Light With Turn Signal IP65 Waterproof Remote Control USB Bike Brake Sensor Taillight &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Ddwv8pt&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006744627769.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Ddwv8pt&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=b0a682c658a44655adf18e65a5df2819-1724716219517-01709-_Ddwv8pt&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tItxf/hyWSfmpSjN/xPJDiQHfeUvKBFEK2DF2C1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Ddwv8pt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Ddwv8pt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tItxf/hyWSfmpSjN/xPJDiQHfeUvKBFEK2DF2C1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Camaroca Wireless Bicycle Alarm Rear Tail Light With Turn Signal IP65 Waterproof Remote Control USB Bike Brake Sensor Taillight&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;▶&lt;/span&gt; 3극 토글스위치 온-오프-온 한 개 살때(프리차징/배터리 커넥터 스파크 방지용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmNVcK7&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DmNVcK7&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724919522545&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Switch 3 Pin Position Kcd | Kcd3 3 Pins Rocker Switch | 2 Electrical Switches Kcd - 1pcs - Aliexpress&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DmNVcK7&quot; data-og-url=&quot;https://www.aliexpress.com/item/4000847897284.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DmNVcK7&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=d4797b78c3ad4bc1a6bc911dcbb2f5a8-1724919517714-00240-_DmNVcK7&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/csNYTe/hyWV4xg3gy/J7ASMmtkZrbkSCaKK5DOb1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmNVcK7&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DmNVcK7&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/csNYTe/hyWV4xg3gy/J7ASMmtkZrbkSCaKK5DOb1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Switch 3 Pin Position Kcd | Kcd3 3 Pins Rocker Switch | 2 Electrical Switches Kcd - 1pcs - Aliexpress&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러개 살때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdTS8dZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DdTS8dZ&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724919545070&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;1PCS KCD3 Rocker Switch ON-OFF ON-OFF-ON 2 Position 3Pins Electrical equipment With Light Power Switch 16A 250V / 20A 125V AC - &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DdTS8dZ&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005681017616.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DdTS8dZ&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=d14a6f72bb3247bd90c5159efbad5d3a-1724919540991-06442-_DdTS8dZ&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dwxPXG/hyWVTvJL51/RNRzdm1KEcdCIzkk1KVk40/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdTS8dZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DdTS8dZ&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dwxPXG/hyWVTvJL51/RNRzdm1KEcdCIzkk1KVk40/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1PCS KCD3 Rocker Switch ON-OFF ON-OFF-ON 2 Position 3Pins Electrical equipment With Light Power Switch 16A 250V / 20A 125V AC -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;▶프리차징 서킷용 1W 30옴 저항&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdDuMIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DdDuMIL&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724919829888&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;20pcs 1W Metal Film Resistor 2.4 2.7 3 24 27 30 240 270 300 R K Ohm  0.27ohm 1% Five-color Ring Resistance 2R4 2R7 3R 2.4K 2.7K &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DdDuMIL&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006393331095.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DdDuMIL&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=9b417d8fa1a649a4a4b14f5113945f7c-1724919825604-02377-_DdDuMIL&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vlfvL/hyWV6PqVZI/PSUQ6wXJUVqGK6rHT0lB51/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdDuMIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DdDuMIL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vlfvL/hyWV6PqVZI/PSUQ6wXJUVqGK6rHT0lB51/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;20pcs 1W Metal Film Resistor 2.4 2.7 3 24 27 30 240 270 300 R K Ohm 0.27ohm 1% Five-color Ring Resistance 2R4 2R7 3R 2.4K 2.7K&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;▶ 기타&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DFi9L1l&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DFi9L1l&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724919871985&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Thermoresistant Tube heat shrink tubing kit, Termoretractil Heat shrink tube Assorted Pack diy insulation for cables shrink wrap&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DFi9L1l&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005188307524.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DFi9L1l&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=7a87175bfe0e4f63ba8c488689879487-1724919867926-05068-_DFi9L1l&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkQ6Sp/hyWVUnTjgB/M9Q3V2Z0thYnAOOlmQMZkk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DFi9L1l&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DFi9L1l&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkQ6Sp/hyWVUnTjgB/M9Q3V2Z0thYnAOOlmQMZkk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Thermoresistant Tube heat shrink tubing kit, Termoretractil Heat shrink tube Assorted Pack diy insulation for cables shrink wrap&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDEJEGB&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DDEJEGB&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724919454312&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Box Insulated Male Female Wire Connector 2.8/4.8/6.3mm Electrical Crimp Terminals Termin Spade Connectors Assorted Kit 270PCS - &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DDEJEGB&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005128682713.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DDEJEGB&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=6c245acbe2794528ac3fac416ff287a4-1724919448063-02956-_DDEJEGB&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bepiym/hyWVZCIWFb/WTLWuhojVYUKX6Jsi9OZU1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDEJEGB&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DDEJEGB&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bepiym/hyWVZCIWFb/WTLWuhojVYUKX6Jsi9OZU1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Box Insulated Male Female Wire Connector 2.8/4.8/6.3mm Electrical Crimp Terminals Termin Spade Connectors Assorted Kit 270PCS -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DFdnhX1&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DFdnhX1&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724920361925&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;200/320Pcs 10 in 1 Terminals Non-Insulated Ring Fork U-Type Brass Terminals Assortment Kit Cable Wire Connector Crimp Spade - Al&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DFdnhX1&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006463960912.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DFdnhX1&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=7921542d80ed425ca4777aa4ef2144a3-1724920355845-06313-_DFdnhX1&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b08nRh/hyWV2sGlbw/k08QTGwJ9kse4ItSlLNOkK/img.jpg?width=1500&amp;amp;height=1500&amp;amp;face=0_0_1500_1500&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DFdnhX1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DFdnhX1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b08nRh/hyWV2sGlbw/k08QTGwJ9kse4ItSlLNOkK/img.jpg?width=1500&amp;amp;height=1500&amp;amp;face=0_0_1500_1500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;200/320Pcs 10 in 1 Terminals Non-Insulated Ring Fork U-Type Brass Terminals Assortment Kit Cable Wire Connector Crimp Spade - Al&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDToB2X&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DDToB2X&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724920385339&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;1/10pieces/set Male Female Bullet Connectors Plugs XT60 For RC Lipo Battery Waterproof Electrical Connector Wire Cab - AliExpres&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DDToB2X&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007103438736.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DDToB2X&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=158172b9610d4c26a14e65a314794719-1724920381762-02582-_DDToB2X&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dGFrDj/hyWVTidRqT/bwSwK9vfKM5caLhwG8pgbk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDToB2X&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DDToB2X&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dGFrDj/hyWVTidRqT/bwSwK9vfKM5caLhwG8pgbk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1/10pieces/set Male Female Bullet Connectors Plugs XT60 For RC Lipo Battery Waterproof Electrical Connector Wire Cab - AliExpres&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DB2KMCP&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DB2KMCP&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724920419463&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;5 Pairs 30 Amp Power Pole Red Black Connectors For Anderson Style Plugs Marine Power Connector Copper Terminals - AliExpress 13&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DB2KMCP&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006226713116.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DB2KMCP&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=2875914f15874c71a11237e83f9f2e45-1724920415747-06218-_DB2KMCP&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Euwb0/hyWV6aO48m/he47rTaF5haOKbtz2h4iw1/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DB2KMCP&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DB2KMCP&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Euwb0/hyWV6aO48m/he47rTaF5haOKbtz2h4iw1/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;5 Pairs 30 Amp Power Pole Red Black Connectors For Anderson Style Plugs Marine Power Connector Copper Terminals - AliExpress 13&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdElSnh&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DdElSnh&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1725672790256&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;TZT AHT10 High Precision Digital Temperature and Humidity Sensor Measurement Module I2C Communication Replace DHT11 SHT20 AM2302&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DdElSnh&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005630775595.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DdElSnh&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=f65d7ab2c50e42fb9fdeb232d5a051fe-1725672786414-02838-_DdElSnh&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ek9bz/hyWZfeI6Xp/kPINpyNkIdlSSr8aG4zGYk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdElSnh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DdElSnh&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ek9bz/hyWZfeI6Xp/kPINpyNkIdlSSr8aG4zGYk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;TZT AHT10 High Precision Digital Temperature and Humidity Sensor Measurement Module I2C Communication Replace DHT11 SHT20 AM2302&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DBK9uAr&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_DBK9uAr&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1725672809478&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;AHT10 AHT20 AHT21 High Precision Digital Temperature and Humidity Sensor Measurement Module I2C Communication Replace SHT20 - Al&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DBK9uAr&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006691022402.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DBK9uAr&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=11e76a77f9d94b0ba4357fde894811d6-1725672806144-03235-_DBK9uAr&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/z2Vhv/hyWZaEuUm1/bna93AD91zewIh6SmVs17k/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DBK9uAr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DBK9uAr&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/z2Vhv/hyWZaEuUm1/bna93AD91zewIh6SmVs17k/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;AHT10 AHT20 AHT21 High Precision Digital Temperature and Humidity Sensor Measurement Module I2C Communication Replace SHT20 - Al&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알찬 정보</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/210</guid>
      <comments>https://postpop.tistory.com/210#entry210comment</comments>
      <pubDate>Sun, 4 Aug 2024 20:53:08 +0900</pubDate>
    </item>
    <item>
      <title>K패스-동백에 가입해 보았습니다.</title>
      <link>https://postpop.tistory.com/208</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;하나은행 동백패스.jpg&quot; data-origin-width=&quot;283&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baLQjo/btsITgMb8HJ/SvTpG2eFX9taZpsLksfpUK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baLQjo/btsITgMb8HJ/SvTpG2eFX9taZpsLksfpUK/img.jpg&quot; data-alt=&quot;하나은행 동백전 카드/패스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baLQjo/btsITgMb8HJ/SvTpG2eFX9taZpsLksfpUK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaLQjo%2FbtsITgMb8HJ%2FSvTpG2eFX9taZpsLksfpUK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;283&quot; height=&quot;178&quot; data-filename=&quot;하나은행 동백패스.jpg&quot; data-origin-width=&quot;283&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하나은행 동백전 카드/패스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;8월 1일부터 부산시의 동백패스가 K패스와 통합해 운용된다고 합니다.&amp;nbsp;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나은행&amp;nbsp;동백패스를&amp;nbsp;사용하고&amp;nbsp;있습니다.&amp;nbsp; 동백패스는&amp;nbsp;최소&amp;nbsp;대중교통&amp;nbsp;사용액이&amp;nbsp;4만5000원을 넘어선&amp;nbsp;구간부터&amp;nbsp;최대&amp;nbsp;4만5천원&amp;nbsp;한도까지&amp;nbsp;환급받을 수&amp;nbsp;있습니다.&amp;nbsp; &lt;br /&gt;만약 60,000원을 사용했다면&amp;nbsp;1만5000원을&amp;nbsp;환급받게&amp;nbsp;됩니다.&amp;nbsp;하지만&amp;nbsp;4만5000원이&amp;nbsp;초과(1600원&amp;nbsp;기준&amp;nbsp;29회부터)되지&amp;nbsp;않으면&amp;nbsp;환급받을&amp;nbsp;금액은&amp;nbsp;없습니다.&amp;nbsp; &lt;br /&gt;K패스는&amp;nbsp;15회 이상&amp;nbsp;대중교통을&amp;nbsp;사용하고&amp;nbsp;60회의&amp;nbsp;구간에서&amp;nbsp;일반&amp;nbsp;이용자는&amp;nbsp;20%,&amp;nbsp;청년(19&amp;sim;34세)은&amp;nbsp;30%,&amp;nbsp;저소득층은&amp;nbsp;53%&amp;nbsp;환급률로&amp;nbsp;차등&amp;nbsp;환급해 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;일반인 기준 월간 대중교통 이용요금 총액이 5만6000원을 넘어서면 동백패스가 환급액이 더 많고 그 이하 이용자는 K패스가 적용되는 식이다. 청년(19~34세)은 총액 6만4000원 이상 사용할 경우는 동백패스, 그 이하는 K패스 적용을 받게 된다. 저소득층은 전 구간 K패스 적용이 더 유리하다. 동백패스로 환급을 받을 때는 이용월의 다음 달 15일 동백전 정책지원금으로 환급된다. K패스로 환급받는 달은 카드사별로 정해진 환급일에 계좌로 입금되며 선불형 동백전 교통카드는 충전금으로 지급된다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;K패스-동백이 시행됨으로써 동백패스 이용자는 사용액이 4만5000원 미만인 경우에도 K패스의 환급기준인 15회를 초과하게 되면 K패스 환급혜택을 받을 수 있게 됩니다. 더불어&amp;nbsp;동백패스와&amp;nbsp;K패스&amp;nbsp;환급액&amp;nbsp;중&amp;nbsp;더&amp;nbsp;높은&amp;nbsp;금액을&amp;nbsp;자동으로&amp;nbsp;환급받을&amp;nbsp;수&amp;nbsp;있으므로&amp;nbsp;부산시&amp;nbsp;동백패스를&amp;nbsp;이용하고&amp;nbsp;있다면&amp;nbsp;가입하지&amp;nbsp;않을&amp;nbsp;이유가&amp;nbsp;없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;동백패스 K패스 환급혜택 비교.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;895&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfgduc/btsIS7vbanA/YgbxXeRekGNKko31SJY140/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfgduc/btsIS7vbanA/YgbxXeRekGNKko31SJY140/img.png&quot; data-alt=&quot;동백패스 K패스 환급혜택 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfgduc/btsIS7vbanA/YgbxXeRekGNKko31SJY140/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfgduc%2FbtsIS7vbanA%2FYgbxXeRekGNKko31SJY140%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;611&quot; data-filename=&quot;동백패스 K패스 환급혜택 비교.png&quot; data-origin-width=&quot;733&quot; data-origin-height=&quot;895&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동백패스 K패스 환급혜택 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;K패스-동백 교통비 환급 예시.png&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;1025&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AOAWV/btsISH4HotB/PmUYa7FLyWwYgZ1UdGhjFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AOAWV/btsISH4HotB/PmUYa7FLyWwYgZ1UdGhjFK/img.png&quot; data-alt=&quot;K패스-동백 교통비 환급 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AOAWV/btsISH4HotB/PmUYa7FLyWwYgZ1UdGhjFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAOAWV%2FbtsISH4HotB%2FPmUYa7FLyWwYgZ1UdGhjFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;699&quot; data-filename=&quot;K패스-동백 교통비 환급 예시.png&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;1025&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;K패스-동백 교통비 환급 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 기존 K패스 이용자는 8월 7일부터 동백전 카드로 변경할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;K패스-동백 서비스 가입하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;K패스-동백 서비스 가입은 동백패스를 발급받은 상태에서 진행하셔야 합니다. 동백패스가 없다면 우선 부산은행 또는 하나은행에서 동백전 카드/패스를 발급받으시고 동백전 앱에도 가입하시기 바랍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 동백전앱에 실행하고 K패스-동백 시행 배너를 클릭합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uvjsT/btsIRYMzlh3/S1XtlpBNJbDwoTBaQ4K4MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uvjsT/btsIRYMzlh3/S1XtlpBNJbDwoTBaQ4K4MK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;494&quot; data-filename=&quot;1.K패스-동백 배너.png&quot; style=&quot;width: 41.0832%; margin-right: 10px;&quot; data-widthpercent=&quot;41.57&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uvjsT/btsIRYMzlh3/S1XtlpBNJbDwoTBaQ4K4MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuvjsT%2FbtsIRYMzlh3%2FS1XtlpBNJbDwoTBaQ4K4MK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byPus8/btsIUBoplHW/SQ4LQEiqUFFUKugWh9YKB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byPus8/btsIUBoplHW/SQ4LQEiqUFFUKugWh9YKB0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;350&quot; data-filename=&quot;2.자세히보기.png&quot; style=&quot;width: 57.754%;&quot; data-widthpercent=&quot;58.43&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byPus8/btsIUBoplHW/SQ4LQEiqUFFUKugWh9YKB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyPus8%2FbtsIUBoplHW%2FSQ4LQEiqUFFUKugWh9YKB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;K패스-동백 배너 클릭 / 자세히 보기 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. K패스앱 바로가기 클릭 후 설치를 해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CEu7J/btsIRx2NyVl/pfy3diH7qSkwDRjOyYEvK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CEu7J/btsIRx2NyVl/pfy3diH7qSkwDRjOyYEvK1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;3.K패스 앱바로가기.png&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CEu7J/btsIRx2NyVl/pfy3diH7qSkwDRjOyYEvK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCEu7J%2FbtsIRx2NyVl%2Fpfy3diH7qSkwDRjOyYEvK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5rqCO/btsIUle4qrb/oqQwI9ED6ZHFlzuYIH0T4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5rqCO/btsIUle4qrb/oqQwI9ED6ZHFlzuYIH0T4k/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;4.K패스앱 설치.png&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5rqCO/btsIUle4qrb/oqQwI9ED6ZHFlzuYIH0T4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5rqCO%2FbtsIUle4qrb%2FoqQwI9ED6ZHFlzuYIH0T4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEQTXq/btsIS6XrXsn/MfY9NZLcvzsoMXOqO5V2Q1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEQTXq/btsIS6XrXsn/MfY9NZLcvzsoMXOqO5V2Q1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;5.K패스앱 열기.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEQTXq/btsIS6XrXsn/MfY9NZLcvzsoMXOqO5V2Q1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEQTXq%2FbtsIS6XrXsn%2FMfY9NZLcvzsoMXOqO5V2Q1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 3.본문 배너1 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;3647290720&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. K패스 앱을 열고 우측 상단의 더 보기 버튼을 클릭하여 가입하기 화면으로 이동합니다. 회원가입을 클릭한 뒤 발급받은 동백전 카드(동백패스 가입 필수) 번호를 입력하고 카드유효성체크를 클릭합니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pdWmG/btsIUtqoXKu/UZI77jdCdx7MBzTXtA9tU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pdWmG/btsIUtqoXKu/UZI77jdCdx7MBzTXtA9tU0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;6.회원가입화면 이동.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pdWmG/btsIUtqoXKu/UZI77jdCdx7MBzTXtA9tU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpdWmG%2FbtsIUtqoXKu%2FUZI77jdCdx7MBzTXtA9tU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mrPQp/btsITDHi39D/kHdkTuPZ8KfgdyinkUVG81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mrPQp/btsITDHi39D/kHdkTuPZ8KfgdyinkUVG81/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;7.회원가입클릭.png&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mrPQp/btsITDHi39D/kHdkTuPZ8KfgdyinkUVG81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmrPQp%2FbtsITDHi39D%2FkHdkTuPZ8KfgdyinkUVG81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2DkfH/btsISWHh75z/yYqFpyWqIR8R9c1rOSXNO0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2DkfH/btsISWHh75z/yYqFpyWqIR8R9c1rOSXNO0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;8.카드번호입력 및 유효성체크.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2DkfH/btsISWHh75z/yYqFpyWqIR8R9c1rOSXNO0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2DkfH%2FbtsISWHh75z%2FyYqFpyWqIR8R9c1rOSXNO0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 개인정보 제3자 제공 동의 체크박스가 표시됩니다. 체크박스를 클릭 후 동의 내용을 읽으신 뒤 동의를 클릭하면 체크박스가 체크됩니다. 카드 유효성체크 버튼을 다시 클릭합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWXB60/btsITt5IPEu/k3hheNo0c8fhyBVibVukjK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWXB60/btsITt5IPEu/k3hheNo0c8fhyBVibVukjK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;9.개인정보제공동의.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWXB60/btsITt5IPEu/k3hheNo0c8fhyBVibVukjK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWXB60%2FbtsITt5IPEu%2Fk3hheNo0c8fhyBVibVukjK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JQGd6/btsIUAbYxhW/50idUMJAEGiYx5tG9AG391/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JQGd6/btsIUAbYxhW/50idUMJAEGiYx5tG9AG391/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;10.동의.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JQGd6/btsIUAbYxhW/50idUMJAEGiYx5tG9AG391/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJQGd6%2FbtsIUAbYxhW%2F50idUMJAEGiYx5tG9AG391%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDxAro/btsIS9mmVmW/ifmdtJHuQte1IJKy8FQeF0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDxAro/btsIS9mmVmW/ifmdtJHuQte1IJKy8FQeF0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;11.카드유효성체크.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDxAro/btsIS9mmVmW/ifmdtJHuQte1IJKy8FQeF0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDxAro%2FbtsIS9mmVmW%2FifmdtJHuQte1IJKy8FQeF0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 동백전/동백패스에 가입되어 있다면 &quot;사용 가능한 카드입니다. &quot;라는 메시지가 표시됩니다. 확인 및 다음을 클릭합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약관동의 화면에서 모두 동의에 체크하고 다음을 클릭합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oGr8u/btsIUtcVbZ0/iC6zGOyOMVpabXeQM93zbK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oGr8u/btsIUtcVbZ0/iC6zGOyOMVpabXeQM93zbK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;12.사용가능한카드.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oGr8u/btsIUtcVbZ0/iC6zGOyOMVpabXeQM93zbK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoGr8u%2FbtsIUtcVbZ0%2FiC6zGOyOMVpabXeQM93zbK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jo7QU/btsIUfMJFTo/RkuWByzwEyxx1LLOFdj0i0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jo7QU/btsIUfMJFTo/RkuWByzwEyxx1LLOFdj0i0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;13.약관동의이동.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jo7QU/btsIUfMJFTo/RkuWByzwEyxx1LLOFdj0i0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJo7QU%2FbtsIUfMJFTo%2FRkuWByzwEyxx1LLOFdj0i0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw25mB/btsISe2O0qE/fwVuuBBr7pCADD04d9tbQ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw25mB/btsISe2O0qE/fwVuuBBr7pCADD04d9tbQ0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;14.약관동의.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw25mB/btsISe2O0qE/fwVuuBBr7pCADD04d9tbQ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw25mB%2FbtsISe2O0qE%2FfwVuuBBr7pCADD04d9tbQ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 본인확인을 해주면 주소지 검증에 필요한 정보를 입력하고 주소지검증 버튼을 클릭합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFjKdd/btsISK8brxx/HKMnv1ssECYiM3CEHGPqd1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFjKdd/btsISK8brxx/HKMnv1ssECYiM3CEHGPqd1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;15.본인확인.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFjKdd/btsISK8brxx/HKMnv1ssECYiM3CEHGPqd1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFjKdd%2FbtsISK8brxx%2FHKMnv1ssECYiM3CEHGPqd1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Zue2/btsIUu3Yp0k/nPFVfKTAarjUf8Sow21AQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Zue2/btsIUu3Yp0k/nPFVfKTAarjUf8Sow21AQ1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;16.주소지검증.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Zue2/btsIUu3Yp0k/nPFVfKTAarjUf8Sow21AQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Zue2%2FbtsIUu3Yp0k%2FnPFVfKTAarjUf8Sow21AQ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DqJTW/btsISdbL0lV/JYUqSRKLMMGp5bXZWQ6xS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DqJTW/btsISdbL0lV/JYUqSRKLMMGp5bXZWQ6xS1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;17.검증완료.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DqJTW/btsISdbL0lV/JYUqSRKLMMGp5bXZWQ6xS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDqJTW%2FbtsISdbL0lV%2FJYUqSRKLMMGp5bXZWQ6xS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 주소지 검증이 완료되면 가입정보 입력화면으로 이동합니다. 아이디 중복확인을 하고 나머지 입력을 완료해 줍니다. 가입완료 되어 로그인을 하면 K패스앱 MY페이지를 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2whvC/btsIUA4bvdK/UyeK6wkh6iPqkZcOzfqBQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2whvC/btsIUA4bvdK/UyeK6wkh6iPqkZcOzfqBQk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;18.가입정보 입력화면.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2whvC/btsIUA4bvdK/UyeK6wkh6iPqkZcOzfqBQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2whvC%2FbtsIUA4bvdK%2FUyeK6wkh6iPqkZcOzfqBQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baRok7/btsIUtKKxch/YCzumtyyYKgTXrmHhLBpF1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baRok7/btsIUtKKxch/YCzumtyyYKgTXrmHhLBpF1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;19.가입완료.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baRok7/btsIUtKKxch/YCzumtyyYKgTXrmHhLBpF1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaRok7%2FbtsIUtKKxch%2FYCzumtyyYKgTXrmHhLBpF1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WwDH6/btsISbZnDey/EltB0jzltqOXXkKgLUieTk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WwDH6/btsISbZnDey/EltB0jzltqOXXkKgLUieTk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;1055&quot; data-filename=&quot;20.로그인화면.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WwDH6/btsISbZnDey/EltB0jzltqOXXkKgLUieTk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWwDH6%2FbtsISbZnDey%2FEltB0jzltqOXXkKgLUieTk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;1055&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부산시 대중교통 요금이 꾸준히 인상되고 있는 이때에 동백패스/K패스의 이용은 필수입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알찬 정보</category>
      <category>K패스</category>
      <category>동백패스</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/208</guid>
      <comments>https://postpop.tistory.com/208#entry208comment</comments>
      <pubDate>Fri, 2 Aug 2024 17:03:21 +0900</pubDate>
    </item>
    <item>
      <title>미니벨로 - 닥터바이크 F16 구입 및 개봉기(16인치 접이식자전거)</title>
      <link>https://postpop.tistory.com/207</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아르바이트로&amp;nbsp;카카오&amp;nbsp;T픽커와&amp;nbsp;쿠팡이츠&amp;nbsp;배달&amp;nbsp;파트너의&amp;nbsp;도보배송을&amp;nbsp;해보고자&amp;nbsp;자전거를&amp;nbsp;구입하기로&amp;nbsp;하였습니다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;순수하게&amp;nbsp;뚜벅이로 할&amp;nbsp;경우&amp;nbsp;소요시간과&amp;nbsp;육체피로를&amp;nbsp;감당하기&amp;nbsp;어렵다고&amp;nbsp;생각했으며&amp;nbsp;자전거의&amp;nbsp;보관&amp;nbsp;및&amp;nbsp;이동의&amp;nbsp;편의성을&amp;nbsp;고려하여&amp;nbsp;접이식&amp;nbsp;및&amp;nbsp;바퀴&amp;nbsp;사이즈&amp;nbsp;20인치&amp;nbsp;이하&amp;nbsp;모델이&amp;nbsp;적당하다고&amp;nbsp;판단하였습니다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;자전거&amp;nbsp;구입 시&amp;nbsp;고려사항 &lt;br /&gt;-&amp;nbsp;일단&amp;nbsp;저렴할&amp;nbsp;것 &lt;br /&gt;-&amp;nbsp;접이식&amp;nbsp;일&amp;nbsp;것 &lt;br /&gt;-&amp;nbsp;바퀴&amp;nbsp;사이즈&amp;nbsp;20&amp;nbsp;~&amp;nbsp;14인치&amp;nbsp;사이일&amp;nbsp;것 &lt;br /&gt;-&amp;nbsp;속도&amp;nbsp;조절이&amp;nbsp;가능할&amp;nbsp;것 &lt;br /&gt;- 바퀴 물받이(머드가드) &amp;nbsp;및&amp;nbsp;짐을&amp;nbsp;실을 수&amp;nbsp;있는&amp;nbsp;뒤포크가&amp;nbsp;있을 것 &lt;br /&gt;&lt;br /&gt;우선&amp;nbsp;바퀴&amp;nbsp;크기&amp;nbsp;20인치와&amp;nbsp;16인치&amp;nbsp;사이에서&amp;nbsp;고민을&amp;nbsp;하게&amp;nbsp;됩니다.&amp;nbsp;14인치의&amp;nbsp;경우&amp;nbsp;승차감&amp;nbsp;및&amp;nbsp;돌발적인&amp;nbsp;장애물을&amp;nbsp;극복하기에는&amp;nbsp;너무&amp;nbsp;작다고&amp;nbsp;판단하여&amp;nbsp;제외했습니다. &lt;br /&gt;20인치는&amp;nbsp;선택할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;제품이&amp;nbsp;16인치에&amp;nbsp;비해&amp;nbsp;좀&amp;nbsp;더&amp;nbsp;많습니다.&amp;nbsp;대신&amp;nbsp;부피와&amp;nbsp;무게가&amp;nbsp;좀&amp;nbsp;더&amp;nbsp;나가게&amp;nbsp;됩니다.&amp;nbsp;무게는&amp;nbsp;프레임&amp;nbsp;재질에&amp;nbsp;따른&amp;nbsp;고가의&amp;nbsp;제품의&amp;nbsp;경우&amp;nbsp;16인치&amp;nbsp;보다&amp;nbsp;가벼울&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;여러&amp;nbsp;제품들을&amp;nbsp;검색해 본&amp;nbsp;뒤에&amp;nbsp;20인치&amp;nbsp;서브루나&amp;nbsp;200W와&amp;nbsp;16인치&amp;nbsp;키후&amp;nbsp;폰드가&amp;nbsp;가장&amp;nbsp;마음에&amp;nbsp;들었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서브루나 200W 스펙&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임 : 알루미늄/스틸 &lt;br /&gt;무게 : 약 11kg &lt;br /&gt;바퀴 : 51cm(20인치) &lt;br /&gt;기어 : 시마노&amp;nbsp;7단 &lt;br /&gt;제동방식 : V형브레이크 &lt;br /&gt;* 바퀴 물받이(머드가드) &amp;nbsp;및&amp;nbsp;짐을&amp;nbsp;실을 수&amp;nbsp;있는&amp;nbsp;뒤포크가&amp;nbsp;없습니다.&amp;nbsp; &lt;br /&gt;최저가: 274,000원(반조립)&lt;/p&gt;
&lt;figure id=&quot;og_1721854092066&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[11번가] 서브루나 미니벨로 접이식 자전거 경량 가벼운 미니 폴딩 20인치 시마노 7단&quot; data-og-description=&quot;자전거&amp;gt;자전거&amp;gt;미니벨로&amp;gt;접이식 미니벨로, 가격 : 274,000원&quot; data-og-host=&quot;www.11st.co.kr&quot; data-og-source-url=&quot;https://www.11st.co.kr/products/6805220363&quot; data-og-url=&quot;https://www.11st.co.kr/products/6805220363&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cfS76d/hyWCBiENYx/IRAAL80XbhIgCQZHCFnOzK/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/pwKWf/hyWGQLYwFX/hcPOlZqqBUKnP4iKJl1eB0/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/cFkEMg/hyWCJ8PHre/CwxtiiRXZ7K98f76C8ECqK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://www.11st.co.kr/products/6805220363&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.11st.co.kr/products/6805220363&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cfS76d/hyWCBiENYx/IRAAL80XbhIgCQZHCFnOzK/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/pwKWf/hyWGQLYwFX/hcPOlZqqBUKnP4iKJl1eB0/img.jpg?width=600&amp;amp;height=600&amp;amp;face=0_0_600_600,https://scrap.kakaocdn.net/dn/cFkEMg/hyWCJ8PHre/CwxtiiRXZ7K98f76C8ECqK/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[11번가] 서브루나 미니벨로 접이식 자전거 경량 가벼운 미니 폴딩 20인치 시마노 7단&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자전거&amp;gt;자전거&amp;gt;미니벨로&amp;gt;접이식 미니벨로, 가격 : 274,000원&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.11st.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;키후 폰드 스펙&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임 : 하이템강/스틸&lt;br /&gt;무게 : 12.5kg&lt;br /&gt;바퀴 : 41cm(16인치)&lt;br /&gt;기어 : 7단&lt;br /&gt;제동방식 : V형브레이크&lt;br /&gt;특징:&amp;nbsp;브롬톤&amp;nbsp;방식이&amp;nbsp;아닌&amp;nbsp;미니벨로 중&amp;nbsp;휠베이스가&amp;nbsp;가장&amp;nbsp;길다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;브롬톤 미니벨로.png&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c76ezc/btsIUCoDFpM/d6Ab5k0mWhk8wkABKjpam1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c76ezc/btsIUCoDFpM/d6Ab5k0mWhk8wkABKjpam1/img.png&quot; data-alt=&quot;브롬톤 미니벨로 접히는 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c76ezc/btsIUCoDFpM/d6Ab5k0mWhk8wkABKjpam1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc76ezc%2FbtsIUCoDFpM%2Fd6Ab5k0mWhk8wkABKjpam1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;278&quot; data-filename=&quot;브롬톤 미니벨로.png&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;브롬톤 미니벨로 접히는 방식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;키후 폰드.png&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DwlgK/btsIUzFqs9s/gTjU8QPdEKYfyrFPuQ5KEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DwlgK/btsIUzFqs9s/gTjU8QPdEKYfyrFPuQ5KEK/img.png&quot; data-alt=&quot;키후 폰드 접히는 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DwlgK/btsIUzFqs9s/gTjU8QPdEKYfyrFPuQ5KEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDwlgK%2FbtsIUzFqs9s%2FgTjU8QPdEKYfyrFPuQ5KEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;980&quot; height=&quot;408&quot; data-filename=&quot;키후 폰드.png&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;키후 폰드 접히는 방식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최저가: 340,200원(거의 완조립)&lt;/p&gt;
&lt;figure id=&quot;og_1722508804820&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;키후 폰드 미니벨로 자전거 40.64cm 경량미니벨로 접이식자전거 7단 - 자전거용품 | 쿠팡&quot; data-og-description=&quot;쿠팡에서 키후 폰드 미니벨로 자전거 40.64cm 경량미니벨로 접이식자전거 7단 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 자전거용품 제품도 바로 쿠팡에서 확인할 수 있습니다.&quot; data-og-host=&quot;www.coupang.com&quot; data-og-source-url=&quot;https://link.coupang.com/a/bL1sGk&quot; data-og-url=&quot;https://www.coupang.com/vp/products/6579119227?vendorItemId=null&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/GG7pE/hyWG1auw8h/tKi0w4wNYQ8HGaQv3dhAR1/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492,https://scrap.kakaocdn.net/dn/cts8RH/hyWKxZTsFT/QSXHz2O877c7b4VG2rPmX0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230&quot;&gt;&lt;a href=&quot;https://link.coupang.com/a/bL1sGk&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://link.coupang.com/a/bL1sGk&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/GG7pE/hyWG1auw8h/tKi0w4wNYQ8HGaQv3dhAR1/img.jpg?width=492&amp;amp;height=492&amp;amp;face=0_0_492_492,https://scrap.kakaocdn.net/dn/cts8RH/hyWKxZTsFT/QSXHz2O877c7b4VG2rPmX0/img.jpg?width=230&amp;amp;height=230&amp;amp;face=0_0_230_230');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;키후 폰드 미니벨로 자전거 40.64cm 경량미니벨로 접이식자전거 7단 - 자전거용품 | 쿠팡&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;쿠팡에서 키후 폰드 미니벨로 자전거 40.64cm 경량미니벨로 접이식자전거 7단 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 자전거용품 제품도 바로 쿠팡에서 확인할 수 있습니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.coupang.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16인치를 구매하기로 합니다. 저가 제품을 구매할 예정이므로 프레임 재질은 철로 되어있을 것입니다. 그럼에도 무게가 15kg 이하일 것으로 생각했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;검색해 본 16인치 미니벨로 중 키후 폰드가 가장 마음에 들었습니다. 400만 원대 브롬톤과 비슷한 &lt;span&gt;휠베이스로 조정성능이 좋을 것으로 생각되고 물받이 및 짐을 실을 수 있는 뒤포크가 있어 더욱 마음에 듭니다. 16인치 미니벨로는 물받이 및 짐을 실을 수 있는 뒤포크가 없는 제품들이 대다수입니다.&amp;nbsp; 특히 물받이는 맑은 날에만 자전거 라이딩을 할 것이 아니라면 꼭 필요합니다. 물받이 없는 자전거로 물기 있는 도로를 지나가면 등에 흙탕물 세례를 받게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;키후 폰트는 가격을 제외한 모든 고려사항에 적합합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 하지만 34만 원대 금액을 투자해야 하기에 망설여집니다. 거의 구입할 뻔했습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;여기서 자전거 펑크 대비책이 필요하다는 생각이 듭니다. 예전과 다르게 요즘은 자전거 수리점 찾기가 쉽지 않습니다.&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;우선 펑크 수리하는 방법을 검색해 봅니다.&lt;span&gt; 음.. 바퀴를 자전거 프레임 포크에서 분리를 해야 하고 타이어를 림에서 분리, 튜브를 빼내고 펑크패치를 이용하여 수리... 패치도 구입해야 하고.... 아...&amp;nbsp; 다시 펑크 대비책에 대해 검색해 봅니다. 자전거 바퀴 종류에는 클린처, 튜블러, 튜블리스가 있다는 것을 알게 됩니다. 클린처 타입은 일반적인 보통의 자전거에 사용되며 림(자전거휠)/튜브/타이어로 구성되어 있습니다. 튜블러는 원형으로 된 통타이어가 림에 부착된 일체형 바퀴이고 튜블리스는 클린처에서 튜브가 제외된 바퀴를 얘기합니다. 그중 튜블리스 바퀴의 펑크 대책 중 하나로 실란트를 사용한다는 것을 알게 됩니다. 튜블리스 타이어 안에 실란트를 채워 놓으면 일정 크기 이하의 펑크가 났을 경우 실란트가 나오면서 굳어 펑크를 방지한다는 것입니다. 요즘에는 클린처 타입의 튜브에도 사용할 수 있다고 합니다. 실란트를 구입하기로 합니다. 하지만 실란트를 채워 넣으려면 튜브 밸브 타입에 따라 도구가 필요할 수도 있다고 합니다. 음... 실란트/도구 구입비가 추가되어야 합니다. 추가로 구입해야 하는 구성품이 있는지 생각해 봅니다. 타이어 바람(공기)은 시간이 지나면 빠지므로 바람을 넣기 위한 휴대용 에어 펌프, 자전거 벨, 체인용 건조 윤활유 등이 필요하겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;바퀴 물받이와 짐을 실을 수 있는 뒤포크는 별도로 구매해 장착하기로 하고 다시 가장 저렴한 가격을 기준으로 16인치 접이식 자전거를 검색해 봅니다. 추 후 전기자전거 변환키트 구입비(대략 25만 원)도 고려합니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 3.본문 배너1 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8269928309278636&quot; data-ad-slot=&quot;3647290720&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;닥터바이크 F16 스펙&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임 : 스틸&lt;br /&gt;무게 : 약 12kg&lt;br /&gt;바퀴 : 41cm(16인치)&lt;br /&gt;기어 : 6단&lt;br /&gt;제동방식 : 디스크형 브레이크&lt;br /&gt;* 바퀴 물받이(머드가드) &amp;nbsp;및&amp;nbsp;짐을&amp;nbsp;실을 수&amp;nbsp;있는&amp;nbsp;뒤포크가&amp;nbsp;없습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;최저가:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 114,240원(미조립) - 환율에 따라 변동&lt;/p&gt;
&lt;figure id=&quot;og_1721857289587&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;닥터바이크 미니벨로 자전거 16인치 6단 스틸프레임 접이식자전거 F-16 - AliExpress 18&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;ko.aliexpress.com&quot; data-og-source-url=&quot;https://ko.aliexpress.com/item/1005006917962971.html?spm=a2g0o.order_list.order_list_main.145.21ef140fS7ePwv&amp;amp;gatewayAdapt=glo2kor&quot; data-og-url=&quot;https://ko.aliexpress.com/item/1005006917962971.html?src=ibdm_d03p0558e02r02&amp;amp;sk=&amp;amp;aff_platform=&amp;amp;aff_trace_key=&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mHHoj/hyWCMEuKMT/NOCKWn5dTbQvkkz8vxYI11/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://ko.aliexpress.com/item/1005006917962971.html?spm=a2g0o.order_list.order_list_main.145.21ef140fS7ePwv&amp;amp;gatewayAdapt=glo2kor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.aliexpress.com/item/1005006917962971.html?spm=a2g0o.order_list.order_list_main.145.21ef140fS7ePwv&amp;amp;gatewayAdapt=glo2kor&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mHHoj/hyWCMEuKMT/NOCKWn5dTbQvkkz8vxYI11/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;닥터바이크 미니벨로 자전거 16인치 6단 스틸프레임 접이식자전거 F-16 - AliExpress 18&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 알리에서 구매하지만 배송지가 국내라서 비교적 운송이 빠릅니다. 경동택배 약 3일 소요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;닥터바이크 F16을 구입하기로 결정합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;바퀴 물받이와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;짐을 실을 수 있는 뒤포크를 검색합니다. 대부분의 물받이와 뒤포크는 자전거 프레임 구조 또는 전용 장착홀 유무에 따라 장착 가능여부가 결정됩니다. 인터넷에서 닥터바이크 F16에 대한 세부 사이즈를 확인하기 위해 검색해 보았지만 관련 자료가 없습니다. 구입 페이지 사진상으로 보기에는 뒤포크/물받이 장착홀이 있는 거 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;닥터바이크 F16을 구입했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;알리 닥터바이크 F16.png&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MYnqM/btsIUjpj5mv/acgwKeI8Ns9PMQK9nuguN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MYnqM/btsIUjpj5mv/acgwKeI8Ns9PMQK9nuguN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MYnqM/btsIUjpj5mv/acgwKeI8Ns9PMQK9nuguN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMYnqM%2FbtsIUjpj5mv%2FacgwKeI8Ns9PMQK9nuguN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1065&quot; height=&quot;561&quot; data-filename=&quot;알리 닥터바이크 F16.png&quot; data-origin-width=&quot;1065&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물품은 경동택배를 통해 3일 만에 도착했습니다. 경동택배는 배송정보 업데이트가 실시간으로 되지 않는 것 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배송정보가 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;영업소 집하에서&lt;span&gt; 멈춰있길래 카카오톡에서 '닥터바이크' 검색 후 배송상태 확인 요청 중에 물품이 도착하였습니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_경동택배 운송정보.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oXmTE/btsIV87YTuS/hLW00BPyBM6NGSq1igRs9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oXmTE/btsIV87YTuS/hLW00BPyBM6NGSq1igRs9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oXmTE/btsIV87YTuS/hLW00BPyBM6NGSq1igRs9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoXmTE%2FbtsIV87YTuS%2FhLW00BPyBM6NGSq1igRs9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;422&quot; data-filename=&quot;edited_경동택배 운송정보.png&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전날 비가 와서 박스가 물에 약간 젖어 있지만 배송 상태는 양호합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCbyx1/btsIVJ8pK0j/KM6Kfsh6m3M1acjtbA1k3k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCbyx1/btsIVJ8pK0j/KM6Kfsh6m3M1acjtbA1k3k/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;f16박스.jpg&quot; width=&quot;400&quot; height=&quot;300&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCbyx1/btsIVJ8pK0j/KM6Kfsh6m3M1acjtbA1k3k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCbyx1%2FbtsIVJ8pK0j%2FKM6Kfsh6m3M1acjtbA1k3k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPr3L4/btsIWFqHsA9/ptOVwIuJUwLV4Agzb6dkHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPr3L4/btsIWFqHsA9/ptOVwIuJUwLV4Agzb6dkHk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;f16박스1.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPr3L4/btsIWFqHsA9/ptOVwIuJUwLV4Agzb6dkHk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPr3L4%2FbtsIWFqHsA9%2FptOVwIuJUwLV4Agzb6dkHk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;F16 구성품: 자전거 본체(핸들, 바퀴, 브레이크 등이 조립된 상태), 안장, 페달, 반사판, 조립용 도구, 설명서 등이 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;F16 구성품.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/INoEN/btsIUltTEAf/JPhywyPYIaurHGjmbMdzTK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/INoEN/btsIUltTEAf/JPhywyPYIaurHGjmbMdzTK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/INoEN/btsIUltTEAf/JPhywyPYIaurHGjmbMdzTK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FINoEN%2FbtsIUltTEAf%2FJPhywyPYIaurHGjmbMdzTK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot; data-filename=&quot;F16 구성품.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뽁뽁이등 포장 상태를 제거하고 펼쳐보았습니다. 안장과 페달만 설치하면 바로 운행 가능할 것처럼 보입니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타이어 바람은 빠져 있는 상태입니다. 음.... 예상을 못했습니다. 알리에서 휴대용 펌프를 주문해 놨는데 도착하는데 시간이 걸립니다. 다이소 가서 3000원짜리 휴대용 펌프를 추가로 구매해야겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;f16 펼친상태.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OBLG7/btsIUy7AsBD/HmDRPnp63oPtYBvuIUXwVk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OBLG7/btsIUy7AsBD/HmDRPnp63oPtYBvuIUXwVk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OBLG7/btsIUy7AsBD/HmDRPnp63oPtYBvuIUXwVk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOBLG7%2FbtsIUy7AsBD%2FHmDRPnp63oPtYBvuIUXwVk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot; data-filename=&quot;f16 펼친상태.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 상태에서 크랭크를 돌려 브레이크 세팅 상태를 확인해 봅니다. 세팅이 잘되어 있습니다. 바퀴 회전 시 브레이크 패드의 마찰음 없이 잘 돌아가고 브레이킹 성능도 아주 좋습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;브레이크 세팅 상태.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PXLLo/btsIUUJkNHy/P2BQ6vBkZYHgreD9qbh6Kk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PXLLo/btsIUUJkNHy/P2BQ6vBkZYHgreD9qbh6Kk/img.jpg&quot; data-alt=&quot;브레이크 디스크와 패드 사이의 유격 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PXLLo/btsIUUJkNHy/P2BQ6vBkZYHgreD9qbh6Kk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPXLLo%2FbtsIUUJkNHy%2FP2BQ6vBkZYHgreD9qbh6Kk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot; data-filename=&quot;브레이크 세팅 상태.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;브레이크 디스크와 패드 사이의 유격 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;F16 세팅 순서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 포장에 용이하도록 위쪽으로 설치된 브레이크 레버와 속도 변속기를 제자리에 위치시킵니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 안장을 설치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 페달을 장착합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 퀵 릴리스 레버의 조임력을 조절합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 4.본문배너2 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8269928309278636&quot; data-ad-slot=&quot;9606701598&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 브레이크 레버와 속도 변속기 위치 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브레이크 레버는 동봉된 육각렌치를 사용하여 조임 볼트를 풀어주고 원하는 위치로 회전시키면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속도 변속기의 경우 육각렌치/십자나사 드라이버로 구성된 도구를 이용하여 변속 표시 기준마크 근처의 십자나사를 풀어주어야 회전시킬 수 있습니다.&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VMyTr/btsIUzSXTRu/hfkEqmVQ5YowOLPeGeaqck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VMyTr/btsIUzSXTRu/hfkEqmVQ5YowOLPeGeaqck/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;569&quot; data-filename=&quot;브레이크 핸들나사.png&quot; style=&quot;width: 49.7082%; margin-right: 10px;&quot; data-widthpercent=&quot;50.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VMyTr/btsIUzSXTRu/hfkEqmVQ5YowOLPeGeaqck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVMyTr%2FbtsIUzSXTRu%2FhfkEqmVQ5YowOLPeGeaqck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2B0Jg/btsIVKztCdA/Xoh4jSpchGnOTsSFqdgxM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2B0Jg/btsIVKztCdA/Xoh4jSpchGnOTsSFqdgxM0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;562&quot; data-filename=&quot;속도변속기 나사.png&quot; style=&quot;width: 49.129%;&quot; data-widthpercent=&quot;49.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2B0Jg/btsIVKztCdA/Xoh4jSpchGnOTsSFqdgxM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2B0Jg%2FbtsIVKztCdA%2FXoh4jSpchGnOTsSFqdgxM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;브레이크 / 속도 변속기 위치 조절 나사&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;▶&lt;span&gt; &lt;/span&gt;&lt;/span&gt;퀵 릴리스 레버 조임력 조절&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;퀵 릴리스 레버가 젖혀진 상태에서 레버가 움직이지 않게 잡은 상태에서 고정용 너트를 시계방향으로 조여주면 퀵 릴리스 레버가 닫혔을 때 조임력이 강해집니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;퀵릴리스 조임력 조정.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uk0iW/btsIUjbLCcv/n96SFGxTwNiXoyQlsLrkpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uk0iW/btsIUjbLCcv/n96SFGxTwNiXoyQlsLrkpk/img.png&quot; data-alt=&quot;퀵릴리스 레버 / 고정용 너트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uk0iW/btsIUjbLCcv/n96SFGxTwNiXoyQlsLrkpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuk0iW%2FbtsIUjbLCcv%2Fn96SFGxTwNiXoyQlsLrkpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;299&quot; data-filename=&quot;퀵릴리스 조임력 조정.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;퀵릴리스 레버 / 고정용 너트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;▶&lt;/span&gt;&amp;nbsp;세팅 완료 후 접은 상태&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk5ith/btsIWGpChNI/yV6DHvLvBiSh6eLOeFuKlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk5ith/btsIWGpChNI/yV6DHvLvBiSh6eLOeFuKlK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1201&quot; data-origin-height=&quot;959&quot; data-filename=&quot;edited_resized_20240725_152610.jpg&quot; style=&quot;width: 53.9561%; margin-right: 10px;&quot; data-widthpercent=&quot;54.59&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk5ith/btsIWGpChNI/yV6DHvLvBiSh6eLOeFuKlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk5ith%2FbtsIWGpChNI%2FyV6DHvLvBiSh6eLOeFuKlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1201&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wIF9b/btsITCpkEhX/yW4dkb4lMKbpixY4xuKyTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wIF9b/btsITCpkEhX/yW4dkb4lMKbpixY4xuKyTK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;999&quot; data-origin-height=&quot;959&quot; data-filename=&quot;edited_resized_20240725_152620.jpg&quot; style=&quot;width: 44.8811%;&quot; data-widthpercent=&quot;45.41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wIF9b/btsITCpkEhX/yW4dkb4lMKbpixY4xuKyTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwIF9b%2FbtsITCpkEhX%2FyW4dkb4lMKbpixY4xuKyTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;999&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시험 운행을 위해 다이소에서 휴대용 자전거펌프를 구입했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZRPMf/btsIUEmswM5/1OlW1z7YWg9ZvcLTyKkHn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZRPMf/btsIUEmswM5/1OlW1z7YWg9ZvcLTyKkHn1/img.png&quot; style=&quot;width: 39.8561%; margin-right: 10px;&quot; data-widthpercent=&quot;40.32&quot; data-filename=&quot;다이소 효대용 자전거 펌프.png&quot; data-origin-height=&quot;469&quot; data-origin-width=&quot;590&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZRPMf/btsIUEmswM5/1OlW1z7YWg9ZvcLTyKkHn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZRPMf%2FbtsIUEmswM5%2F1OlW1z7YWg9ZvcLTyKkHn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;590&quot; height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brh9wV/btsIVK7khaS/WNs3DatDWB4vnznmuksaOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brh9wV/btsIVK7khaS/WNs3DatDWB4vnznmuksaOk/img.png&quot; style=&quot;width: 58.9812%;&quot; data-widthpercent=&quot;59.68&quot; data-filename=&quot;다이소 휴대용펌프 구성.png&quot; data-origin-height=&quot;412&quot; data-origin-width=&quot;767&quot; data-is-animation=&quot;false&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brh9wV/btsIVK7khaS/WNs3DatDWB4vnznmuksaOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbrh9wV%2FbtsIVK7khaS%2FWNs3DatDWB4vnznmuksaOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;767&quot; height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;제품 이미지 / 구성품&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;제품 사진상 표시된 공기주입 예시가 슈레더 타입의 튜브에 공기를 주입하는 모습입니다. 슈레더 타입의 밸브에 펌프의 슈레더 밸브용 홀을 끼워 넣고 레버를 위로 올리면 슈레더 밸브 코어를 누르면서 바람을 주입할 수 있는 상태가 됩니다. 이때 밸브를 단단하게 잡아주는 것이 아니므로 직각 상태를 유지해야 바람이 세지 않고 잘 들어갑니다.&amp;nbsp; 바퀴 사이즈가 작기 때문에 바람이 금방 들어가지만 어느 정도 공기가 들어가고 압력이 상승한 뒤에는 체결부에서 바람이 세는 소리가 나면서 더 이상 주입하기가 힘듭니다. 또한 16인치 바퀴의 사이즈가 작아 휠 구조물 때문에 올바른 위치에서 휴대용 펌프의 고정용 레버를 올리기가 쉽지 않습니다. 우선 넣을 수 있는 만큼 넣어줍니다. 충분하지는 않은 것 같으나 운행하는데 지장은 없습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시험운행 후 앞바퀴가 약간 틀어져 있는 걸 확인하고 센터를 조정해 주었습니다. 핸들바를 접으면 보이는 앞바퀴 포크부의&amp;nbsp; 육각 나사를 풀고 원하는 위치로 조정해 줍니다. 핸들바를 수평으로 했을 때 직진하는지 확인하면서 조정을 해 줍니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앞바퀴 조정.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lcThE/btsIVjoACWC/c4vCKnDKz0R43S5nQOwQG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lcThE/btsIVjoACWC/c4vCKnDKz0R43S5nQOwQG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lcThE/btsIVjoACWC/c4vCKnDKz0R43S5nQOwQG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlcThE%2FbtsIVjoACWC%2Fc4vCKnDKz0R43S5nQOwQG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;600&quot; data-filename=&quot;앞바퀴 조정.png&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;F16 주요부 스펙 및 사진&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;resized_20240725_115233.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzhJFh/btsIUBQNrhb/5Mbo4FyXnyWHx9Rrcpwu3K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzhJFh/btsIUBQNrhb/5Mbo4FyXnyWHx9Rrcpwu3K/img.jpg&quot; data-alt=&quot;개방형 드롭아웃 프레임, 솔리드 액슬/프리휠 방식 6단 스프라켓, 사이구안 뒤 변속기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzhJFh/btsIUBQNrhb/5Mbo4FyXnyWHx9Rrcpwu3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzhJFh%2FbtsIUBQNrhb%2F5Mbo4FyXnyWHx9Rrcpwu3K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot; data-filename=&quot;resized_20240725_115233.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개방형 드롭아웃 프레임, 솔리드 액슬/프리휠 방식 6단 스프라켓, 사이구안 뒤 변속기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gju07/btsITUDpDa7/S6UFCAP5qekIxK8XpkDJK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gju07/btsITUDpDa7/S6UFCAP5qekIxK8XpkDJK1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;496&quot; data-origin-height=&quot;386&quot; data-filename=&quot;드롭아웃프레임.png&quot; style=&quot;width: 49.8137%; margin-right: 10px;&quot; data-widthpercent=&quot;50.4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gju07/btsITUDpDa7/S6UFCAP5qekIxK8XpkDJK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGju07%2FbtsITUDpDa7%2FS6UFCAP5qekIxK8XpkDJK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;496&quot; height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NZp3u/btsITC3ZYF8/Fy8udRyydvxQR3Ya31yQwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NZp3u/btsITC3ZYF8/Fy8udRyydvxQR3Ya31yQwk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;514&quot; data-filename=&quot;프리휠 방식.png&quot; style=&quot;width: 49.0235%;&quot; data-widthpercent=&quot;49.6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NZp3u/btsITC3ZYF8/Fy8udRyydvxQR3Ya31yQwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNZp3u%2FbtsITC3ZYF8%2FFy8udRyydvxQR3Ya31yQwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;개방형 드롭아웃 프레임 / 프리휠 방식 솔리드 액슬 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;물받이 장착부.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfiXUy/btsITV94bdb/Pjj8CuIN2FLLS4ggyVLlk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfiXUy/btsITV94bdb/Pjj8CuIN2FLLS4ggyVLlk1/img.jpg&quot; data-alt=&quot;뒤바퀴 물받이(머드가드) 고정 홀 및 위치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfiXUy/btsITV94bdb/Pjj8CuIN2FLLS4ggyVLlk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfiXUy%2FbtsITV94bdb%2FPjj8CuIN2FLLS4ggyVLlk1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot; data-filename=&quot;물받이 장착부.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;뒤바퀴 물받이(머드가드) 고정 홀 및 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;크랭크암 캡&amp;amp;amp;고정볼트.png&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAuEjy/btsIVK0z4qA/9jxJoLg5uq5iCQofT9Pa00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAuEjy/btsIVK0z4qA/9jxJoLg5uq5iCQofT9Pa00/img.png&quot; data-alt=&quot;크랭크암 캡 / 크랭크암 고정용 M8 6각 볼트(14mm 소켓으로 풀 수 있음)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAuEjy/btsIVK0z4qA/9jxJoLg5uq5iCQofT9Pa00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAuEjy%2FbtsIVK0z4qA%2F9jxJoLg5uq5iCQofT9Pa00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1113&quot; height=&quot;562&quot; data-filename=&quot;크랭크암 캡&amp;amp;고정볼트.png&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;크랭크암 캡 / 크랭크암 고정용 M8 6각 볼트(14mm 소켓으로 풀 수 있음)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1KxF9/btsIUi4ZmtX/vuHp8itiSnzmk6EHHNyCb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1KxF9/btsIUi4ZmtX/vuHp8itiSnzmk6EHHNyCb1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;593&quot; data-origin-height=&quot;679&quot; data-filename=&quot;사각BB타입.png&quot; style=&quot;width: 39.6816%; margin-right: 10px;&quot; data-widthpercent=&quot;40.15&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1KxF9/btsIUi4ZmtX/vuHp8itiSnzmk6EHHNyCb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1KxF9%2FbtsIUi4ZmtX%2FvuHp8itiSnzmk6EHHNyCb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;593&quot; height=&quot;679&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWjZk7/btsIWC1OAKz/mkvehXXq7PBotG2VEwuoyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWjZk7/btsIWC1OAKz/mkvehXXq7PBotG2VEwuoyK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;669&quot; data-filename=&quot;사각BB.png&quot; style=&quot;width: 59.1556%;&quot; data-widthpercent=&quot;59.85&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWjZk7/btsIWC1OAKz/mkvehXXq7PBotG2VEwuoyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWjZk7%2FbtsIWC1OAKz%2FmkvehXXq7PBotG2VEwuoyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;871&quot; height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;사각타입 페달축(Bottom Bracket/BB) / 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 옥타타입 페달축(옥타 BB 타입)인 경우 크랭크암 분리도구에 전용 어댑터가 필요합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_크랭크암 분리 공구 옥타 BB 어댑터.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNsPcC/btsIUBJ1zQR/DShp8RTphKiQ924VByNcd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNsPcC/btsIUBJ1zQR/DShp8RTphKiQ924VByNcd1/img.png&quot; data-alt=&quot;크랭크암 분리 도구 / 옥타 BB 타입 어댑터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNsPcC/btsIUBJ1zQR/DShp8RTphKiQ924VByNcd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNsPcC%2FbtsIUBJ1zQR%2FDShp8RTphKiQ924VByNcd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;416&quot; height=&quot;338&quot; data-filename=&quot;edited_크랭크암 분리 공구 옥타 BB 어댑터.png&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;크랭크암 분리 도구 / 옥타 BB 타입 어댑터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전기 자전거 개조 시 PAS 센서를 부착하기 위해서는 크랭크암을 분리해야 합니다. 또한 크랭크암 분리를 위해서는 전용도구가 필요합니다. 전기자전거 개조를 할 때 필요하다고 판단하여 상기의 분리 도구를 구입했습니다. 하지만 물품을 받고 나서 뭔가 이상하다고 느낍니다. 크랭크암 고정용 나사를 풀 수 있는 복스알이 없다는 것을 알게 됩니다. 상기의 분리 도구는 옥타 BB 타입 어댑터가 포함되어 있는 도구였으며 크랭크암 고정용 볼트가 육각렌치 타입일 때 사용하는 것입니다. 크랭크암을 분리하는 데는 문제가 없으나 구입한 닥터바이크의 F16 접이식 자전거에 사용된 크랭크암 고정용 6각 볼트를 풀 수 있는 복스알이 빠져있습니다. 잘못주문 했습니다. 보유하고 있는 자전거의 크랭크 고정용 볼트가 육각렌치 타입이고 BB가 옥타 타입일 경우 어댑터가 포함된 이 도구를 구입하면 문제없이 사용하실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722374443400&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;1Pc Bicycle Crankset Puller Crank Arm Puller Remover Bike Tools MTB Mountain Crank Extractor Bicycle Carbon Steel Repair Tool - &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DBDmYix&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006664430932.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DBDmYix&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=f805173083fd47c2ac7ce7a56b14450b-1722374437142-01846-_DBDmYix&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ddeDLt/hyWGO2XivP/PweAHcXOiX2J8vGKKFxCi1/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DBDmYix&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DBDmYix&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ddeDLt/hyWGO2XivP/PweAHcXOiX2J8vGKKFxCi1/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1Pc Bicycle Crankset Puller Crank Arm Puller Remover Bike Tools MTB Mountain Crank Extractor Bicycle Carbon Steel Repair Tool -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크랭크암 고정용 6각 볼트는 규격상 14mm 소켓을 사용하면 되지만 크랭크암의 분리도구 체결 나사산의 직경이 약 20mm이므로 일반적으로 사용하는 14mm 복스알은 외경이 20mm를 초과하여 사용할 수 없습니다. 즉 전용 복스알이 필요하다는 것을 알게 됩니다. 다시 14mm 복스알이 포함된 크랭크암 분리도구를 찾아보고 주문하였습니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722374564725&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bike Tool Kit 6 Pcs Professional Bicycle Repair Tools for Mountain Bike with 3-in-1 Cassette Remover Wrench Chain Breaker - AliE&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dl8YrGb&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006482042083.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dl8YrGb&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=8b826aef88db414e843de8e29052b3cd-1722374559599-00672-_Dl8YrGb&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dAULch/hyWG21d2Bh/3ax1o2VHjIW3lyFVGfWWo1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dl8YrGb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dl8YrGb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dAULch/hyWG21d2Bh/3ax1o2VHjIW3lyFVGfWWo1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bike Tool Kit 6 Pcs Professional Bicycle Repair Tools for Mountain Bike with 3-in-1 Cassette Remover Wrench Chain Breaker - AliE&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리휠 스프라켓 분리도구 1개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크랭크암 분리도구 1셋(14mm 복스알)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;체인 브레이커(체인 교체용) 1개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페달축(Bottom Bracket) 분리도구 1개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바큇살(스포크) 장력 조절 렌치 1개&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카세트 타입 스프라켓 리무버툴 1개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 5.본문배너3 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8269928309278636&quot; data-ad-slot=&quot;5927891592&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전동임팩에 사용할 복스알을 구매했습니다. 다행히도 M14 소켓이 크랭크암에 잘 들어가 전동임팩으로 고정볼트를 손쉽게 분리할 수 있었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nhk1r/btsJmuqjekJ/VFnQBCXF3XwqAmGEanafW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nhk1r/btsJmuqjekJ/VFnQBCXF3XwqAmGEanafW1/img.png&quot; width=&quot;300&quot; height=&quot;284&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;996&quot; data-filename=&quot;edited_resized_20240825_113854.jpg&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;32.18&quot; style=&quot;width: 31.4338%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nhk1r/btsJmuqjekJ/VFnQBCXF3XwqAmGEanafW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNhk1r%2FbtsJmuqjekJ%2FVFnQBCXF3XwqAmGEanafW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1051&quot; height=&quot;996&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TGPSG/btsJnJzV8Qu/FDQonKxHzFvirzbPHgzMYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TGPSG/btsJnJzV8Qu/FDQonKxHzFvirzbPHgzMYk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;922&quot; data-filename=&quot;edited_20240901_064439.jpg&quot; style=&quot;width: 33.0843%; margin-right: 10px;&quot; data-widthpercent=&quot;33.87&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TGPSG/btsJnJzV8Qu/FDQonKxHzFvirzbPHgzMYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTGPSG%2FbtsJnJzV8Qu%2FFDQonKxHzFvirzbPHgzMYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;922&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oAb1Q/btsJmGqnFxa/ySH2V2e4wWZk7ytZQFZAq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oAb1Q/btsJmGqnFxa/ySH2V2e4wWZk7ytZQFZAq0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;920&quot; data-filename=&quot;edited_20240901_064524.jpg&quot; style=&quot;width: 33.1563%;&quot; data-widthpercent=&quot;33.95&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oAb1Q/btsJmGqnFxa/ySH2V2e4wWZk7ytZQFZAq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoAb1Q%2FbtsJmGqnFxa%2FySH2V2e4wWZk7ytZQFZAq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;920&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;크랭크암 분리도구에 있는 M14소켓 및 복스알 / 분리도구 M14소켓 외경 19.72mm / M14 전동임팩 복스알 외경 19.64mm&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1725100529833&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;6mm-19mm Impact Socket Magnetic Nut Screwdriver 1/4 Hex Key Set Drill Bit Adapter for Power Drills Impact Drivers Socket Kit - A&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DDjgUzt&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005004802948085.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DDjgUzt&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=2512a125e5e44b959306d2a782f09e3a-1725100427471-08186-_DDjgUzt&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cTIbO1/hyWVXMhalW/7zzHbnlvvUIvDT2yh7gYRk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DDjgUzt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DDjgUzt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cTIbO1/hyWVXMhalW/7zzHbnlvvUIvDT2yh7gYRk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;6mm-19mm Impact Socket Magnetic Nut Screwdriver 1/4 Hex Key Set Drill Bit Adapter for Power Drills Impact Drivers Socket Kit - A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;바퀴 물받이(머드가드) 장착하기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHpOGF/btsIViJYiOg/42fLYveJfcPwaJTMtiN9t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHpOGF/btsIViJYiOg/42fLYveJfcPwaJTMtiN9t1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;573&quot; data-origin-height=&quot;524&quot; data-filename=&quot;물받이 구성품.png&quot; data-widthpercent=&quot;46.88&quot; style=&quot;width: 46.3392%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHpOGF/btsIViJYiOg/42fLYveJfcPwaJTMtiN9t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHpOGF%2FbtsIViJYiOg%2F42fLYveJfcPwaJTMtiN9t1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yXHmC/btsIUmGlz8o/V4aPQQXlqKzMVSRhhLy9r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yXHmC/btsIUmGlz8o/V4aPQQXlqKzMVSRhhLy9r1/img.png&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;762&quot; data-is-animation=&quot;false&quot; data-filename=&quot;물받이 장착.png&quot; data-widthpercent=&quot;53.12&quot; style=&quot;width: 52.498%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yXHmC/btsIUmGlz8o/V4aPQQXlqKzMVSRhhLy9r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyXHmC%2FbtsIUmGlz8o%2FV4aPQQXlqKzMVSRhhLy9r1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;물받이 구성품 / 장착후 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;▶&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;앞바퀴 장착&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞바퀴 포크의 센터 측 전용홀에 물받이를 장착하는 것은 어렵지 않습니다. 뒷바퀴와 다르게 장착하려는 위치의 작업공간이 간섭 없이 F16 구입 시 동봉된 도구를 사용하기에 충분하여 긴 육각렌치 나사를 전용홀에 끼우고 와샤와 너트를 체결해 주면 됩니다. 하지만 앞바퀴의 양측면에 고정하려 할 때 디스크 브레이크가 장착된 왼쪽에서 고정홀 위치와 간섭이 발생하게 됩니다. 이때는 고정용 바가 브레이크 몸체 부분에서 위쪽으로 약간 휘어져 들어가도록 절곡 해주고 브레이크 구동부에 걸리지 않도록 고정용 바를 먼저 브레이크 몸체의 틈사이로 끼워 넣은 상태에서 고정용 홀에 나사와 너트를 이용하여 고정시켜야 합니다. 그다음에 물받이에 장착된 플라스틱 홀(상기 이미지 원형)에 고정용 바를 끼워줘야 합니다. 또한 브레이크 디스크와 앞바퀴 포크의 물받이용 고정홀 사이의 폭이 좁기 때문에 와샤와 너트를 동시에 채결하기가 어렵습니다. 이때는 와샤를 포기하고 너트만 채결해 줍니다. 디스크 브레이크가 없는 오른쪽도 왼쪽과 비슷하게 고정용 바를 절곡 하여 물받이가 틀어지지 않도록 해줍니다. 왼쪽은 공간도 넉넉하고 간섭도 없기 때문에 손쉽게 고정시킬 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGmoaV/btsIWhDA7Rf/IxT2KjXloaR9eFpYAx2Yg0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGmoaV/btsIWhDA7Rf/IxT2KjXloaR9eFpYAx2Yg0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;resized_20240730_121424.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGmoaV/btsIWhDA7Rf/IxT2KjXloaR9eFpYAx2Yg0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGmoaV%2FbtsIWhDA7Rf%2FIxT2KjXloaR9eFpYAx2Yg0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xWS2P/btsIUEtgjZi/yXMqgGkn5ew3FkKKikBSh0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xWS2P/btsIUEtgjZi/yXMqgGkn5ew3FkKKikBSh0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;resized_20240730_121430.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xWS2P/btsIUEtgjZi/yXMqgGkn5ew3FkKKikBSh0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxWS2P%2FbtsIUEtgjZi%2FyXMqgGkn5ew3FkKKikBSh0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;앞 바퀴 센터측 물받이 고정 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGqFGJ/btsIV87YTvl/5cwmHbRoToDAH8OMxgJcmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGqFGJ/btsIV87YTvl/5cwmHbRoToDAH8OMxgJcmk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;resized_20240730_121406.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGqFGJ/btsIV87YTvl/5cwmHbRoToDAH8OMxgJcmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGqFGJ%2FbtsIV87YTvl%2F5cwmHbRoToDAH8OMxgJcmk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oNfpy/btsIUxVbicT/GvkENEM4wQTDfSYDU0kfm1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oNfpy/btsIUxVbicT/GvkENEM4wQTDfSYDU0kfm1/img.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-is-animation=&quot;false&quot; data-filename=&quot;resized_20240730_121414.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oNfpy/btsIUxVbicT/GvkENEM4wQTDfSYDU0kfm1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoNfpy%2FbtsIUxVbicT%2FGvkENEM4wQTDfSYDU0kfm1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;앞바퀴 왼쪽부분 / 오른쪽 부분 고정 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 뒷바퀴 장착&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒷바퀴 센터 측 물받이 고정용 홀과 뒷바퀴 물받이 고정핀의 위치는 적당히 잘 맞습니다. 다만 동봉된 너트가 풀림 방지용 록타이트가 도포된 상태라 손으로 돌려서 고정하기가 힘듭니다. 공구를 이용해서 고정해야 하는데 프레임의 구조상 F16 구입 시 동봉된 도구(육각렌치와 십자드라이버가 결합된 도구)로는 고정하기가 쉽지 않았습니다. 별도의 적합한 육각렌치와 너트에 맞는 스패너가 있다면 체결할 수 있습니다. 현재 있는 도구만으로는 고정하기 힘들다고 판단하고 이 구조에서 고정시킬 수 있는 다른 부품에 사용되는 육각 나사와 사각 너트를 이용하여 고정시켰습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxkmY6/btsIWFqHsK4/FzVNJ8VKJySiXtVGYDHGuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxkmY6/btsIWFqHsK4/FzVNJ8VKJySiXtVGYDHGuK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;resized_20240730_121340.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxkmY6/btsIWFqHsK4/FzVNJ8VKJySiXtVGYDHGuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxkmY6%2FbtsIWFqHsK4%2FFzVNJ8VKJySiXtVGYDHGuK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKdU1O/btsIUCPFMQ0/gMrK9WrkjjjVvWy7SylAwK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKdU1O/btsIUCPFMQ0/gMrK9WrkjjjVvWy7SylAwK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;resized_20240730_121326.jpg&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKdU1O/btsIUCPFMQ0/gMrK9WrkjjjVvWy7SylAwK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKdU1O%2FbtsIUCPFMQ0%2FgMrK9WrkjjjVvWy7SylAwK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒷바퀴의 양측면 고정 시 변속기 기어가 있는 오른쪽 부분은 기어와 체인의 간섭으로 왼쪽 보다 한 단계 위에 위치한 홀에 고정해 주어야 합니다. 왼쪽은 쉽게 고정할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfoyOs/btsIVLd69aM/OQgBFCafmPzSImwokeU5V0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfoyOs/btsIVLd69aM/OQgBFCafmPzSImwokeU5V0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;뒷바퀴 왼쪽.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfoyOs/btsIVLd69aM/OQgBFCafmPzSImwokeU5V0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfoyOs%2FbtsIVLd69aM%2FOQgBFCafmPzSImwokeU5V0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyiUHS/btsIVKM2DNM/NmTkqrD5xz8zHqChDPyQGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyiUHS/btsIVKM2DNM/NmTkqrD5xz8zHqChDPyQGk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;뒷바퀴 오른쪽.jpg&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyiUHS/btsIVKM2DNM/NmTkqrD5xz8zHqChDPyQGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyiUHS%2FbtsIVKM2DNM%2FNmTkqrD5xz8zHqChDPyQGk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;뒷바퀴 왼쪽 고정 위치 / 오른쪽 고정 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722374157835&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Folding Bike Mudguard Set Unbreakable Bicycle Accessories Mud Guard For 14 Inch 20 Inch Universal Bike Mudguard Kit Hardware - A&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DkAvdoF&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005002081545403.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DkAvdoF&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=54fa19ced01844b3b0a53d058d95b8d0-1722374151624-05767-_DkAvdoF&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HEgo4/hyWG1HZvq6/2tNyYHRi1KjQhLPEkNSNd0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DkAvdoF&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DkAvdoF&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HEgo4/hyWG1HZvq6/2tNyYHRi1KjQhLPEkNSNd0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Folding Bike Mudguard Set Unbreakable Bicycle Accessories Mud Guard For 14 Inch 20 Inch Universal Bike Mudguard Kit Hardware - A&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;F16 미니벨로 사이즈 측정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 전체 길이: 약 125cm&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qMwKE/btsIUzMcsfi/MKprbdaKwR34r9haRj1Z10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qMwKE/btsIUzMcsfi/MKprbdaKwR34r9haRj1Z10/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;998&quot; data-filename=&quot;edited_resized_20240731_055157.jpg&quot; data-widthpercent=&quot;24.48&quot; style=&quot;width: 24.1933%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qMwKE/btsIUzMcsfi/MKprbdaKwR34r9haRj1Z10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqMwKE%2FbtsIUzMcsfi%2FMKprbdaKwR34r9haRj1Z10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;706&quot; height=&quot;998&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BrnwF/btsIViDcIHT/B5CsDf60NEbMy3TxKQuEqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BrnwF/btsIViDcIHT/B5CsDf60NEbMy3TxKQuEqk/img.png&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;586&quot; data-is-animation=&quot;false&quot; data-filename=&quot;edited_resized_20240731_055406.jpg&quot; style=&quot;width: 74.6439%;&quot; data-widthpercent=&quot;75.52&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BrnwF/btsIViDcIHT/B5CsDf60NEbMy3TxKQuEqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBrnwF%2FbtsIViDcIHT%2FB5CsDf60NEbMy3TxKQuEqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;전체길이 / 스쿠터와 길이 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 휠베이스: 약 88cm&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_resized_20240731_054242.jpg&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DZCZJ/btsITVhTMvC/gNMwEhTMLKwckj4205SrKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DZCZJ/btsITVhTMvC/gNMwEhTMLKwckj4205SrKk/img.png&quot; data-alt=&quot;휠베이스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DZCZJ/btsITVhTMvC/gNMwEhTMLKwckj4205SrKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDZCZJ%2FbtsITVhTMvC%2FgNMwEhTMLKwckj4205SrKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;617&quot; data-filename=&quot;edited_resized_20240731_054242.jpg&quot; data-origin-width=&quot;695&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;휠베이스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 바퀴높이: 약 39cm&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_resized_20240731_054338.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXPqU0/btsIVlzWRn6/1dy7eXEr3jSoWE6y8trii1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXPqU0/btsIVlzWRn6/1dy7eXEr3jSoWE6y8trii1/img.png&quot; data-alt=&quot;바퀴높이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXPqU0/btsIVlzWRn6/1dy7eXEr3jSoWE6y8trii1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXPqU0%2FbtsIVlzWRn6%2F1dy7eXEr3jSoWE6y8trii1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;643&quot; data-filename=&quot;edited_resized_20240731_054338.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바퀴높이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 앞바퀴 포크와 안장사이의 메인프레임 길이: 약 44cm&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_resized_20240731_054426.jpg&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;836&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWq6Nk/btsIVlNsOqF/5KAUScl3nz0yQH4O29XYc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWq6Nk/btsIVlNsOqF/5KAUScl3nz0yQH4O29XYc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWq6Nk/btsIVlNsOqF/5KAUScl3nz0yQH4O29XYc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWq6Nk%2FbtsIVlNsOqF%2F5KAUScl3nz0yQH4O29XYc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1054&quot; height=&quot;836&quot; data-filename=&quot;edited_resized_20240731_054426.jpg&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;836&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 신장 165cm 기준 현재 세팅에서의 핸들바와 안장사이의 거리: 약 36cm&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_resized_20240731_054405.jpg&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz4xFS/btsIUw9NBh6/XP9i7MnCzN2ImWklnTj1yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz4xFS/btsIUw9NBh6/XP9i7MnCzN2ImWklnTj1yK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz4xFS/btsIUw9NBh6/XP9i7MnCzN2ImWklnTj1yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz4xFS%2FbtsIUw9NBh6%2FXP9i7MnCzN2ImWklnTj1yK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;887&quot; height=&quot;429&quot; data-filename=&quot;edited_resized_20240731_054405.jpg&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;▶&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;신장 165cm 기준&lt;/span&gt;&amp;nbsp;현재 세팅에서의 핸들바 높이: 92cm&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_resized_20240731_054507.jpg&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;1141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEJCPz/btsITCXbqgH/vkMvNKBbwkpov77tr84LuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEJCPz/btsITCXbqgH/vkMvNKBbwkpov77tr84LuK/img.png&quot; data-alt=&quot;핸들바 높이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEJCPz/btsITCXbqgH/vkMvNKBbwkpov77tr84LuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEJCPz%2FbtsITCXbqgH%2FvkMvNKBbwkpov77tr84LuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;682&quot; data-filename=&quot;edited_edited_resized_20240731_054507.jpg&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;1141&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;핸들바 높이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;▶&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;신장 165cm 기준&lt;span&gt; &lt;/span&gt;&lt;/span&gt;현재 세팅에서의 안장 높이: 76cm&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_resized_20240731_054520.jpg&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;1279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SDi1B/btsITBKNWtL/vkOdiM45j4vFcsERLqc9N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SDi1B/btsITBKNWtL/vkOdiM45j4vFcsERLqc9N0/img.png&quot; data-alt=&quot;안장 높이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SDi1B/btsITBKNWtL/vkOdiM45j4vFcsERLqc9N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSDi1B%2FbtsITBKNWtL%2FvkOdiM45j4vFcsERLqc9N0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;667&quot; data-filename=&quot;edited_resized_20240731_054520.jpg&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;1279&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;안장 높이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 6.본문배너4 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8269928309278636&quot; data-ad-slot=&quot;8253257324&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기타 액세서리 추가 및 교체&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;자전거 튜닝.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CkDCi/btsIWhcwC7Q/hYHBBZU8TgZu7kOUNSnaU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CkDCi/btsIWhcwC7Q/hYHBBZU8TgZu7kOUNSnaU1/img.jpg&quot; data-alt=&quot;악세사리 추가 및 교체 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CkDCi/btsIWhcwC7Q/hYHBBZU8TgZu7kOUNSnaU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCkDCi%2FbtsIWhcwC7Q%2FhYHBBZU8TgZu7kOUNSnaU1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot; data-filename=&quot;자전거 튜닝.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;악세사리 추가 및 교체 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byuIdl/btsIWllF2iL/AlDSfrY7wHJLZ3NeOQXHmK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byuIdl/btsIWllF2iL/AlDSfrY7wHJLZ3NeOQXHmK/img.jpg&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-is-animation=&quot;false&quot; data-filename=&quot;안장1.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byuIdl/btsIWllF2iL/AlDSfrY7wHJLZ3NeOQXHmK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyuIdl%2FbtsIWllF2iL%2FAlDSfrY7wHJLZ3NeOQXHmK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SjTQQ/btsITB40toY/Th5lS3yHhcCNRF8nkXdhu1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SjTQQ/btsITB40toY/Th5lS3yHhcCNRF8nkXdhu1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;안장.jpg&quot; data-widthpercent=&quot;50&quot; style=&quot;width: 49.4186%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SjTQQ/btsITB40toY/Th5lS3yHhcCNRF8nkXdhu1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSjTQQ%2FbtsITB40toY%2FTh5lS3yHhcCNRF8nkXdhu1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;안장 / 서스펜션 / 열쇠&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 안장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순정 안장도 상태와 쿠션이 괜찮습니다. 하지만 좀 더 착석감이 좋을 거 같고 노면 충격을 덜 받고자 교체했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722386755257&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bike Saddle Silicone Cushion Cycling Seat PU Leather Surface Silica Filled Gel TimeTrial Comfortable Shockproof Bicycle Saddle -&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DmzclmR&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005038516522.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DmzclmR&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=9a544e2069b04dd89aab46af4654af85-1722386749467-03950-_DmzclmR&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dpziq9/hyWGU3dY2X/5Qqqk4304z65R4nMEzIdkK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmzclmR&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DmzclmR&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dpziq9/hyWGU3dY2X/5Qqqk4304z65R4nMEzIdkK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bike Saddle Silicone Cushion Cycling Seat PU Leather Surface Silica Filled Gel TimeTrial Comfortable Shockproof Bicycle Saddle -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ &lt;s&gt;자전거 안장 서스펜션&lt;/s&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;노면 충격을 완화시키고자 교체했고 상당히 효과가 있습니다. 서스펜션 고정 위치나 서스펜션 위의 안장 고정 위치에 따라 울렁거림을 느낄 실 수 있습니다. 현재의 세팅이 적당하다고 생각됩니다.&lt;/s&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722386990687&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bicycle Saddle Suspension Device For MTB Mountain Road Bike Shocks Mount Alloy Spring Steel Shock Absorber Comfort Cycling Parts&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DmvxWSL&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006513555820.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DmvxWSL&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=b09b8a792c0941c18cc9c1e00b0fd145-1722386985943-06700-_DmvxWSL&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/A8fqE/hyWGXZW7SP/NQoZrvPZ3EIyIbzkQo15W0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmvxWSL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DmvxWSL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/A8fqE/hyWGXZW7SP/NQoZrvPZ3EIyIbzkQo15W0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bicycle Saddle Suspension Device For MTB Mountain Road Bike Shocks Mount Alloy Spring Steel Shock Absorber Comfort Cycling Parts&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yYxNV/btsIWE6oUbB/0bRbSt7nOIIgtjfgSxpPG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yYxNV/btsIWE6oUbB/0bRbSt7nOIIgtjfgSxpPG1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;안장서스펜션1.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yYxNV/btsIWE6oUbB/0bRbSt7nOIIgtjfgSxpPG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyYxNV%2FbtsIWE6oUbB%2F0bRbSt7nOIIgtjfgSxpPG1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dT409v/btsIUl1HdnG/kYWVKy0HN2H2MtFrSY8uok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dT409v/btsIUl1HdnG/kYWVKy0HN2H2MtFrSY8uok/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;959&quot; data-filename=&quot;안장서스펜션2.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dT409v/btsIUl1HdnG/kYWVKy0HN2H2MtFrSY8uok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdT409v%2FbtsIUl1HdnG%2FkYWVKy0HN2H2MtFrSY8uok%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;959&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;안장 서스펜션 고정부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 1달정도 사용후 파손되었습니다. 추천하지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 디스크 브레이크 패드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_op40sDb&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://s.click.aliexpress.com/e/_op40sDb&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742477371943&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;1-10 Pack MTB Bike Resin Semi-Metallic Disc Brake Pads Sport Bicycle Accessories for BB8 NOVELA YINXING BOLIDS FOREVIR - AliExpr&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_op40sDb&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007019116386.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_op40sDb&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=c5d63150089b44e8a9571204179dc957-1742477366539-00521-_op40sDb&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&amp;amp;aff_short_key=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JMqGd/hyYr1GH3bd/woGqLbLOPCFxYc8FemgTa1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_op40sDb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_op40sDb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JMqGd/hyYr1GH3bd/woGqLbLOPCFxYc8FemgTa1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;1-10 Pack MTB Bike Resin Semi-Metallic Disc Brake Pads Sport Bicycle Accessories for BB8 NOVELA YINXING BOLIDS FOREVIR - AliExpr&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;닥터바이크 F16에 사용된 디스크 브레이크 패드는 원형입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 자물쇠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안장포스트에 고정할 수 있는 브래킷이 포함되어 있고 브래킷에 고정할 수 있는 걸쇠가 장착되어 있어 구입했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722393227998&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bicycle 5 Digit Code Cable Lock 1200mm*12mm Anti-theft Bike Password Lock Bike Security Steel Cable Cycling Lock Bike Parts - Al&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dn4bqtv&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005981444852.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dn4bqtv&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=11cfa46dc28747018eaba6841aecb58a-1722388355975-03817-_Dn4bqtv&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fty77/hyWGTccEUJ/KgR26iHebz7b5kp0rxUWP0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dn4bqtv&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dn4bqtv&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fty77/hyWGTccEUJ/KgR26iHebz7b5kp0rxUWP0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bicycle 5 Digit Code Cable Lock 1200mm*12mm Anti-theft Bike Password Lock Bike Security Steel Cable Cycling Lock Bike Parts - Al&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CFbw3/btsIUVIiDDL/siW5bYe0shKkVCZsCy1FEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CFbw3/btsIUVIiDDL/siW5bYe0shKkVCZsCy1FEK/img.png&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;650&quot; data-is-animation=&quot;false&quot; data-filename=&quot;익스텐션바악세사리.png&quot; style=&quot;width: 53.8617%; margin-right: 10px;&quot; data-widthpercent=&quot;54.5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CFbw3/btsIUVIiDDL/siW5bYe0shKkVCZsCy1FEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCFbw3%2FbtsIUVIiDDL%2FsiW5bYe0shKkVCZsCy1FEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1269&quot; height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3ml8z/btsIUAxBNcw/TwMxE25yRUA8NTAqklvuXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3ml8z/btsIUAxBNcw/TwMxE25yRUA8NTAqklvuXK/img.png&quot; data-origin-width=&quot;1133&quot; data-origin-height=&quot;695&quot; data-is-animation=&quot;false&quot; data-filename=&quot;익스텐션바악세사리1.png&quot; style=&quot;width: 44.9756%;&quot; data-widthpercent=&quot;45.5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3ml8z/btsIUAxBNcw/TwMxE25yRUA8NTAqklvuXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3ml8z%2FbtsIUAxBNcw%2FTwMxE25yRUA8NTAqklvuXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1133&quot; height=&quot;695&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;자전거 백미러 / 익스텐션 브라켓 / 휴대폰 거치대 / 벨 링&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 핸들바 익스텐션 브래킷&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;휴대폰 거치대를 고정하기 위해 구입하였습니다. 크기와 모양이 상당히 마음에 듭니다. 핸들바에 휴대폰 거치대를 장착할 경우 핸들바와 시선과의 거리가 짧아져 아래로 내려봐야 되고 핸들바와 안장사이의 공간에 거치대가 튀어나오게 되어 걸리적거릴 거 같아 구매하였습니다. 휴대폰 거치대를 장착한 뒤 거치대 끝단이 핸들바에 일치하게 위치하여 만족하며 사용 중입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722387164910&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;20cm Bicycle Handlebar Extended Bracket Bike Mount Bar Computer Holder Support Rack Alloy Stand Double Frame Bicycle Clip - AliE&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Ddlg0pt&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007288561674.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Ddlg0pt&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=2f31cd3195c046089f9ece433f12a1f1-1722387158785-05587-_Ddlg0pt&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hqVH3/hyWGPnktll/rzZ6wlqRlKpaAiSRnuaXEk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Ddlg0pt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Ddlg0pt&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hqVH3/hyWGPnktll/rzZ6wlqRlKpaAiSRnuaXEk/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;20cm Bicycle Handlebar Extended Bracket Bike Mount Bar Computer Holder Support Rack Alloy Stand Double Frame Bicycle Clip - AliE&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 휴대폰 거치대&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배송용 앱과 지도를 편하게 확인할 수 있도록 구매하였습니다. 스프링식으로 구동되며 중간에 튀어나온 바를 엄지와 검지로 동시에 오므리면 거치대의 고정 핀이 확장되면서 스프링을 늘려줍니다. 휴대폰을 놓을 때 가운데 버튼이 눌려지면 늘어난 스프링이 줄어들면서 고정 핀이 오므라들어 핸드폰을 고정하게 됩니다. 이러한 동작이 막힘없이 잘 이루어집니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722387899128&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;New Mobile Support for the Car Phone Holder Live Streaming Stands Motorcycle Mountain Bike Electric Bike Universal Fixed Frame -&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DldazFZ&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005898842523.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DldazFZ&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=b00eef2a5fb04349855a8cd25af8abfb-1722387894520-00620-_DldazFZ&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/k5cbt/hyWGV18r8A/E0x27XvZJV1dGPDrmMrI90/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DldazFZ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DldazFZ&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/k5cbt/hyWGV18r8A/E0x27XvZJV1dGPDrmMrI90/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;New Mobile Support for the Car Phone Holder Live Streaming Stands Motorcycle Mountain Bike Electric Bike Universal Fixed Frame -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dribUc/btsIUMq4KxZ/nhs3ig0FndkzExh3zDBLR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dribUc/btsIUMq4KxZ/nhs3ig0FndkzExh3zDBLR0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;646&quot; data-filename=&quot;휴대폰거치.png&quot; style=&quot;width: 51.7472%; margin-right: 10px;&quot; data-widthpercent=&quot;52.36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dribUc/btsIUMq4KxZ/nhs3ig0FndkzExh3zDBLR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdribUc%2FbtsIUMq4KxZ%2Fnhs3ig0FndkzExh3zDBLR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sk6Kg/btsITurnjOU/vGnwmbARmoJXXqEma38dNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sk6Kg/btsITurnjOU/vGnwmbARmoJXXqEma38dNk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;717&quot; data-filename=&quot;링벨.png&quot; style=&quot;width: 47.09%;&quot; data-widthpercent=&quot;47.64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sk6Kg/btsITurnjOU/vGnwmbARmoJXXqEma38dNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSk6Kg%2FbtsITurnjOU%2FvGnwmbARmoJXXqEma38dNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;717&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;휴대폰 거치대 / 벨 링&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 자전거 벨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;스테인리스 자전거 벨 링입니다. 청하 한 소리가 납니다. 띵~~&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722388129109&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;New Stainless Bicycle Bell Ring MTB Cycling Horn Bike Handlebar Bell Crisp Sound Horn for Bicycle Safety Bike Accessories - AliE&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DCplobV&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005863666562.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DCplobV&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=fe0e6d573f76421fa251111553a96a3a-1722388124327-07288-_DCplobV&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dBqjZf/hyWGZwIdAj/pk6hGea5b7LgiCZgtXqo6k/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DCplobV&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DCplobV&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dBqjZf/hyWGZwIdAj/pk6hGea5b7LgiCZgtXqo6k/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;New Stainless Bicycle Bell Ring MTB Cycling Horn Bike Handlebar Bell Crisp Sound Horn for Bicycle Safety Bike Accessories - AliE&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 7.본문배너5 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8269928309278636&quot; data-ad-slot=&quot;5172369234&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 핸들바 자전거 백미러&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핸들바 튜브에 장착할 수 있는 백미러입니다. 튜브에 장착해야 하므로 핸들바 그립의 막힌 부분을 잘라내고 장착을 해줍니다. 백미러의 위치는 튜브에 장착된 상태에서 스로틀 레버처럼 앞뒤로 움직여지고 미러의 위치도 거의 자유롭게 조절이 됩니다. 볼록거울 형식입니다. 다만 거울이 너무 작고 피사체의 거리가 멀게 보인다는 게 단점이라면 단점일 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722388886280&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bicycle 1PC Rear View Convex Mirror Handlebar Drop Bar Mount Acrylic Lens Back Sight Reflector Light Weight - AliExpress 18&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DdM1Yb5&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005005038752030.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DdM1Yb5&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=daa612788aaf4c158081f037e770de09-1722388882862-00520-_DdM1Yb5&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/q4hup/hyWG1872WC/O8GswQK5UKKLOpvkcf6pM1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdM1Yb5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DdM1Yb5&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/q4hup/hyWG1872WC/O8GswQK5UKKLOpvkcf6pM1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bicycle 1PC Rear View Convex Mirror Handlebar Drop Bar Mount Acrylic Lens Back Sight Reflector Light Weight - AliExpress 18&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;자전거 백미러.png&quot; data-origin-width=&quot;1745&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VbRVR/btsIVb5emES/WKfcogyyENQSy15ZyKcJ61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VbRVR/btsIVb5emES/WKfcogyyENQSy15ZyKcJ61/img.png&quot; data-alt=&quot;자전거 백미러&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VbRVR/btsIVb5emES/WKfcogyyENQSy15ZyKcJ61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVbRVR%2FbtsIVb5emES%2FWKfcogyyENQSy15ZyKcJ61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1745&quot; height=&quot;503&quot; data-filename=&quot;자전거 백미러.png&quot; data-origin-width=&quot;1745&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자전거 백미러&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 휴대용 에어펌프&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;슈레더 / 프레스타 / 던롭 밸브에 사용할 수 있다고 합니다. 던롭 어댑터 없이 프레스타 주입구에서 공통으로 사용할 수 있다고 하는데 어댑터 없이 어떻게 던롭에서 넣을 수 있는지는 사용해보지 않아서 모르겠습니다. 구성품으로 풍선용 노즐 등이 포함되어 있으며 앞서 구입한 다이소 휴대용 에어펌프와 다르게 밸브 연결부가 몸체에서 연장선으로 나와 있어 밸브연결성이 좋고 발로 밟을 수 있으므로 힘이 많이 들어가 상대적으로 고압으로 넣을 수 있습니다. 또한 공기주입 방식은 튜브 밸브에 고정하는 방법이 다이소 휴대용 에어펌프와는 반대로 레버를 세운 상태에서 튜브 밸브에 꽃은 다음에 레버를 눕히면 주입구가 밸브에 고정되고 바람이 넣어지게 됩니다. 다이소 휴대용 에어펌프에서 발생했던 일정 압력 이상으로 바람을 넣었을 때 바람이 새는 증상은 나오지 않았습니다. 다만 압력 게이지가 없어 현재 공기압이 얼마인지 알 수 없고 계속 밟아도 어느 순간부터는 더 이상 들어가지 않는 것 같이 느껴집니다(밟는데 무게감 증가가 없어짐).&amp;nbsp; 다만 펌프의 구조상 다이소 휴대용 에어펌프보다는 좋은 것 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;resized_휴대용펌프.jpg&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QpNq5/btsJgCuuFXw/kHVnrWkd0kLvOrQhKL2Rwk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QpNq5/btsJgCuuFXw/kHVnrWkd0kLvOrQhKL2Rwk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QpNq5/btsJgCuuFXw/kHVnrWkd0kLvOrQhKL2Rwk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQpNq5%2FbtsJgCuuFXw%2FkHVnrWkd0kLvOrQhKL2Rwk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;225&quot; data-filename=&quot;resized_휴대용펌프.jpg&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722397198734&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Xunting Bike Pump Portable Mini Cycling Hand Air Pump High Pressure Ball MTB Road Bicycle Tire Inflator Schrader Presta Valve - &quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DdoU6v1&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006030128416.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DdoU6v1&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=3d098f6247c54139be29b7bfc418e70a-1722397193960-06818-_DdoU6v1&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dWbPtH/hyWGTDjIvd/mZ8ROpLwlW012KKk5roUR1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DdoU6v1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DdoU6v1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dWbPtH/hyWGTDjIvd/mZ8ROpLwlW012KKk5roUR1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Xunting Bike Pump Portable Mini Cycling Hand Air Pump High Pressure Ball MTB Road Bicycle Tire Inflator Schrader Presta Valve -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 다시 구입한다면 게이지 있는 펌프를 구입해야겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1722397843355&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Bike Pump Mini Portable Bicycle Foot Pump with Pressure Gauge Accessories Fits Presta &amp;amp; Schrader Valve Bicycle Air Pump - AliExp&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_Dl8oymb&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005003092750739.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_Dl8oymb&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=516c52dfc4b742fe8f27f2f15f4ff893-1722397836413-03140-_Dl8oymb&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgJJPA/hyWG3y9f2n/NoZWvB0Qk2IK5eBHUQ0zM1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=432_464_653_706&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_Dl8oymb&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_Dl8oymb&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgJJPA/hyWG3y9f2n/NoZWvB0Qk2IK5eBHUQ0zM1/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=432_464_653_706');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Bike Pump Mini Portable Bicycle Foot Pump with Pressure Gauge Accessories Fits Presta &amp;amp; Schrader Valve Bicycle Air Pump - AliExp&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;알리익스프레스 배달사고 후 환불&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;뒷바퀴용 짐받이(뒤포크)를 포함한 주문 9건의 패키지가 도착했습니다. &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;하지만 실제 온 물품은 깨진 LED램프, 장난감 같은 손상된 손목시계, 안의 부품이 덜그럭 거리는 전자파 측정기, 알 수 없는 오일류 제품, 유일하게 정상적으로 배송된 자전거 프리휠 제거용 소켓 등이었습니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;수령해야할 물품.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1068&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r3AD3/btsJeOa2LOR/Hq2rfXFQBwdiATADAw60KK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r3AD3/btsJeOa2LOR/Hq2rfXFQBwdiATADAw60KK/img.jpg&quot; data-alt=&quot;누락된 물품들&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r3AD3/btsJeOa2LOR/Hq2rfXFQBwdiATADAw60KK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr3AD3%2FbtsJeOa2LOR%2FHq2rfXFQBwdiATADAw60KK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1068&quot; data-filename=&quot;수령해야할 물품.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1068&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;누락된 물품들&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;바로 프리휠 소켓을 제외한 나머지 물품에 대해 환불신청을 해줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;환불신청 시 사진(운송장 반드시 포함) 업로드 및 환불 내용을 첨부하게 되어 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmV9W/btsJfMXD1b3/WuCIRDrJ3oPHFmyOooocf0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmV9W/btsJfMXD1b3/WuCIRDrJ3oPHFmyOooocf0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;운송장.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmV9W/btsJfMXD1b3/WuCIRDrJ3oPHFmyOooocf0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqmV9W%2FbtsJfMXD1b3%2FWuCIRDrJ3oPHFmyOooocf0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BUBnJ/btsJd5q6URd/5ArwdBKHRbkSrHlGzUP3K0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BUBnJ/btsJd5q6URd/5ArwdBKHRbkSrHlGzUP3K0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;운송물품.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BUBnJ/btsJd5q6URd/5ArwdBKHRbkSrHlGzUP3K0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBUBnJ%2FbtsJd5q6URd%2F5ArwdBKHRbkSrHlGzUP3K0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T8ItI/btsJekVRfrq/GzyTIVIsYPzbNrGcQroCc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T8ItI/btsJekVRfrq/GzyTIVIsYPzbNrGcQroCc1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;깨진 LED램프.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T8ItI/btsJekVRfrq/GzyTIVIsYPzbNrGcQroCc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT8ItI%2FbtsJekVRfrq%2FGzyTIVIsYPzbNrGcQroCc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;운송장/배송물품/깨진 LED램프&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDTw2s/btsJgfLZxOA/I8ytMRFIIS32tbHJkitO3K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDTw2s/btsJgfLZxOA/I8ytMRFIIS32tbHJkitO3K/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;망가진 전자파측정기.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDTw2s/btsJgfLZxOA/I8ytMRFIIS32tbHJkitO3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDTw2s%2FbtsJgfLZxOA%2FI8ytMRFIIS32tbHJkitO3K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HoAdP/btsJfOVsyR6/i4a9EHeRRqa50kq5FkYKA0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HoAdP/btsJfOVsyR6/i4a9EHeRRqa50kq5FkYKA0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;알수없는 오일류.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HoAdP/btsJfOVsyR6/i4a9EHeRRqa50kq5FkYKA0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHoAdP%2FbtsJfOVsyR6%2Fi4a9EHeRRqa50kq5FkYKA0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2EXJL/btsJemMS39H/tAAk7AkkKnP1Rpa1cSGJKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2EXJL/btsJemMS39H/tAAk7AkkKnP1Rpa1cSGJKK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;포장상태.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2EXJL/btsJemMS39H/tAAk7AkkKnP1Rpa1cSGJKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2EXJL%2FbtsJemMS39H%2FtAAk7AkkKnP1Rpa1cSGJKK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;망가진 전자파 측정기/버클이 없는 장남감 같은 시계/알수없는 오일류/포장상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상세내용에 아래와 같이 적어주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp; &amp;nbsp;아&amp;nbsp; &amp;nbsp; 래&amp;nbsp; -&lt;br /&gt;Choice&amp;nbsp;주문&amp;nbsp;9건 &lt;br /&gt;운송장번호:&amp;nbsp;593132827143 &lt;br /&gt;1.&amp;nbsp;자전거&amp;nbsp;타이어&amp;nbsp;실란트 &lt;br /&gt;2.&amp;nbsp;사이클링&amp;nbsp;헬멧 &lt;br /&gt;3.&amp;nbsp;자전거&amp;nbsp;체인&amp;nbsp;윤활유 &lt;br /&gt;4.&amp;nbsp;타이어&amp;nbsp;밸브&amp;nbsp;코어&amp;nbsp;스템&amp;nbsp;리무버 &lt;br /&gt;5.&amp;nbsp;바이크&amp;nbsp;물병&amp;nbsp;거치대 &lt;br /&gt;6.&amp;nbsp;자전거&amp;nbsp;그리스&amp;nbsp;윤활제 &lt;br /&gt;7.&amp;nbsp;자전거&amp;nbsp;화물&amp;nbsp;캐리어 &lt;br /&gt;8.&amp;nbsp;자전거&amp;nbsp;페달 &lt;br /&gt;9.&amp;nbsp;프리휠&amp;nbsp;소켓 &lt;br /&gt;&lt;br /&gt;9번 물품만 받았습니다.&amp;nbsp; &lt;br /&gt;1~8번&amp;nbsp;물품&amp;nbsp;누락되어&amp;nbsp;있습니다. &lt;br /&gt;택배&amp;nbsp;포장에&amp;nbsp;알 수&amp;nbsp;없는&amp;nbsp;망가진&amp;nbsp;물품이&amp;nbsp;포함되어&amp;nbsp;보내졌습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-------------------------------------------------------------------------------------------&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2~3일 후 8건 모두 환불 결정되었으며 2~3일 후 결제했던 카드로 모두 환불되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반송을 대비하여 물품을 보관하고 있었으나 환불완료 시까지 반송 요청이 오지 않았습니다. 쓰레기 처리한 것 같습니다. 알리익스프레스 이용하면서 쓰레기 물품이 보낸 진 이런 경우는 처음이네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1, 4, 7번 물품만 업체 및 물품 변경하여 다시 주문했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자전거 화물 캐리어는 퀵 릴리스가 달린 제품을 주문했었는데 만약 그 물건이 왔었다면 뒷바퀴 포크 쪽 고정이 어려워 장착하지 못했을 것으로 생각됩니다. 다시 주문한 퀵 릴리즈가 없는 제품도 닥터바이크 F-16의 뒷바퀴 포크의 두께와 폭이 넓어 정상적인 방법으로는 장착이 불가능했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;!-- 8.본문배너6 --&gt;
&lt;p&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8269928309278636&quot; data-ad-slot=&quot;4789225853&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;&lt;/p&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 뒷바퀴용 짐받이(뒤포크)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뒤포크 평평한 부분의 간섭이 없는 홀에 아래 사진과 같이 체결합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EGqhc/btsJfQz8BMW/HjnR9HDnaFBwB1ZCVSBxvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EGqhc/btsJfQz8BMW/HjnR9HDnaFBwB1ZCVSBxvk/img.png&quot; width=&quot;500&quot; height=&quot;667&quot; data-origin-width=&quot;2250&quot; data-origin-height=&quot;2195&quot; data-filename=&quot;edited_1.짐받이 포크 체결 위치.jpg&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;27.76&quot; style=&quot;width: 27.1172%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EGqhc/btsJfQz8BMW/HjnR9HDnaFBwB1ZCVSBxvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEGqhc%2FbtsJfQz8BMW%2FHjnR9HDnaFBwB1ZCVSBxvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2250&quot; height=&quot;2195&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zzQTz/btsJhaYtPNk/TYdMR3piFgjhIPzXsoUua0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zzQTz/btsJhaYtPNk/TYdMR3piFgjhIPzXsoUua0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;1.짐받이 포크 체결 위치1.jpg&quot; style=&quot;width: 35.2786%; margin-right: 10px;&quot; data-widthpercent=&quot;36.12&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zzQTz/btsJhaYtPNk/TYdMR3piFgjhIPzXsoUua0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzzQTz%2FbtsJhaYtPNk%2FTYdMR3piFgjhIPzXsoUua0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oy998/btsJfnryrle/SYuEEwayK71lowkCtm22S0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oy998/btsJfnryrle/SYuEEwayK71lowkCtm22S0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;1.짐받이 포크 체결 위치2.jpg&quot; style=&quot;width: 35.2786%;&quot; data-widthpercent=&quot;36.12&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oy998/btsJfnryrle/SYuEEwayK71lowkCtm22S0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foy998%2FbtsJfnryrle%2FSYuEEwayK71lowkCtm22S0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;디스크 브레이크 부분 뒤포크(왼쪽)/변속 기어부 뒤포크(오른쪽)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배송 시 세팅된 볼트 체결상태로는 포크 체결부의 긴 볼트 때문에 브레이크 디스크 및 변속 기어(스프라켓)와 간섭이 발생하게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;볼트 구성.png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JlN3E/btsJgHbpgHS/N3qiqTkY4DG5m3ezq9MSYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JlN3E/btsJgHbpgHS/N3qiqTkY4DG5m3ezq9MSYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JlN3E/btsJgHbpgHS/N3qiqTkY4DG5m3ezq9MSYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJlN3E%2FbtsJgHbpgHS%2FN3qiqTkY4DG5m3ezq9MSYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;866&quot; height=&quot;743&quot; data-filename=&quot;볼트 구성.png&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가이드용 중간길이 볼트와 가장 짧은 볼트를 이용하여 체결하여야 간섭 없이 설치할 수 있습니다. 가장 짧은 볼트는 하단에 중간길이 볼트는 상단에 사용합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qnEMP/btsJfRyYGV3/lSc2D47GcAGot7K5PlSepK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qnEMP/btsJfRyYGV3/lSc2D47GcAGot7K5PlSepK/img.jpg&quot; data-origin-width=&quot;4032&quot; data-origin-height=&quot;3024&quot; data-is-animation=&quot;false&quot; data-filename=&quot;2.가장짧은볼트.jpg&quot; style=&quot;width: 63.2558%; margin-right: 10px;&quot; data-widthpercent=&quot;64&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qnEMP/btsJfRyYGV3/lSc2D47GcAGot7K5PlSepK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqnEMP%2FbtsJfRyYGV3%2FlSc2D47GcAGot7K5PlSepK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4032&quot; height=&quot;3024&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qZLef/btsJe7P9H7B/KsgkkMhQEQ6S4AkOiDV2U0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qZLef/btsJe7P9H7B/KsgkkMhQEQ6S4AkOiDV2U0/img.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-is-animation=&quot;false&quot; data-filename=&quot;3.포크상단체결.jpg&quot; style=&quot;width: 35.5814%;&quot; data-widthpercent=&quot;36&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qZLef/btsJe7P9H7B/KsgkkMhQEQ6S4AkOiDV2U0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqZLef%2FbtsJe7P9H7B%2FKsgkkMhQEQ6S4AkOiDV2U0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;하단 짧은 볼트 사용/상단 중간길이 볼트 사용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfzcPg/btsJfDOrJG4/2raAeApYF60zJIkfCnAp7k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfzcPg/btsJfDOrJG4/2raAeApYF60zJIkfCnAp7k/img.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-is-animation=&quot;false&quot; data-filename=&quot;4.포크상단간격.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfzcPg/btsJfDOrJG4/2raAeApYF60zJIkfCnAp7k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfzcPg%2FbtsJfDOrJG4%2F2raAeApYF60zJIkfCnAp7k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/twP9i/btsJfDOrJrP/C9hIaeeByZLCBc2DLM6Tk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/twP9i/btsJfDOrJrP/C9hIaeeByZLCBc2DLM6Tk0/img.jpg&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot; data-is-animation=&quot;false&quot; data-filename=&quot;5.포크상단 옆모습.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/twP9i/btsJfDOrJrP/C9hIaeeByZLCBc2DLM6Tk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtwP9i%2FbtsJfDOrJrP%2FC9hIaeeByZLCBc2DLM6Tk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3024&quot; height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;상단 디스크 브레이크와의 간격&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br32EA/btsJg3d2yUW/2nRf5SdVT9FBOhw90qLAok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br32EA/btsJg3d2yUW/2nRf5SdVT9FBOhw90qLAok/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_짐받이1.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br32EA/btsJg3d2yUW/2nRf5SdVT9FBOhw90qLAok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr32EA%2FbtsJg3d2yUW%2F2nRf5SdVT9FBOhw90qLAok%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/255Et/btsJfUI7MoN/HLeY9UnzKEI3WFkvIL92bk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/255Et/btsJfUI7MoN/HLeY9UnzKEI3WFkvIL92bk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_짐받이2.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/255Et/btsJfUI7MoN/HLeY9UnzKEI3WFkvIL92bk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F255Et%2FbtsJfUI7MoN%2FHLeY9UnzKEI3WFkvIL92bk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;짐받이 설치 모습&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B2P8J/btsJfRr8E5v/pBcfsJko17DVNoLr4uxNvK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B2P8J/btsJfRr8E5v/pBcfsJko17DVNoLr4uxNvK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_짐받이3.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B2P8J/btsJfRr8E5v/pBcfsJko17DVNoLr4uxNvK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB2P8J%2FbtsJfRr8E5v%2FpBcfsJko17DVNoLr4uxNvK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmTHps/btsJhbJOsQC/p0iov3K0Xe7zgRysc6bmBk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmTHps/btsJhbJOsQC/p0iov3K0Xe7zgRysc6bmBk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_짐받이4.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmTHps/btsJhbJOsQC/p0iov3K0Xe7zgRysc6bmBk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmTHps%2FbtsJhbJOsQC%2Fp0iov3K0Xe7zgRysc6bmBk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RVIpC/btsJhnDeEJ0/s1HtG2xZZKVaJU2QOQbIw0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RVIpC/btsJhnDeEJ0/s1HtG2xZZKVaJU2QOQbIw0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_짐받이5.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RVIpC/btsJhnDeEJ0/s1HtG2xZZKVaJU2QOQbIw0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRVIpC%2FbtsJhnDeEJ0%2Fs1HtG2xZZKVaJU2QOQbIw0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;다이소 폴딩박스 장착&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1724662147327&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Mountain Bike Carrier With Reflective Plate Riding Equipment Quick Disassembly Aluminum Alloy Bicycle Rear Shelf Bicycle Parts -&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DCoSZEj&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007100058126.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DCoSZEj&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=b75fcfc25f4c4709891e9c12805de578-1724662143230-02892-_DCoSZEj&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beBLyI/hyWVZPD8no/Yzqz2nf3mxRueHedkFyLx0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DCoSZEj&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DCoSZEj&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beBLyI/hyWVZPD8no/Yzqz2nf3mxRueHedkFyLx0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Mountain Bike Carrier With Reflective Plate Riding Equipment Quick Disassembly Aluminum Alloy Bicycle Rear Shelf Bicycle Parts -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;▶&lt;span&gt; &lt;/span&gt;&lt;/span&gt;자전거 튜브에 사용할 수 있는 실란트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실라트는 전기자전거 변환 키트를 이용하여 전기자전거로 변환완료한 후 마지막에 앞/뒤 바퀴에 주입하였습니다. 구입한 실란트는 일단 냄새가 나지 않습니다. 내용물은 점액질 액체에 타이어 조각 같은 검은색 물질이 섞여 있는 형태입니다. 실란트에 대해 검색해 본 영상에서는 냄새가 나고 흰색 액체로 되어 있어 펑크 발생 시 하얀색으로 표시가 나는 것을 보았습니다. 이 실란트는 첨가된 검은색 물질이 펑크 부위를 메꿔주는 방식이 아닌가 생각해 봅니다. 별도로 테스트를 안 해봐서 정확히 알 수는 없습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주입방법은 슈레더 밸브 코어를 제거한 뒤 밸브를 3시 또는 8시 방향으로 위치시킵니다. 실란트 병에 동봉된 주입용 튜브를 밸브에 끼우고 적당한 위치(밸브보다 높게)에서 병을 눌러서 주입합니다. 주입하는 중간에 아직 실란트가 남아 있는데 더 이상 주입이 안 되는 상황이 생겼습니다. 검은색 첨가물이 유독 뭉쳤던 부분이 병 안의 주입구를 막았던 거 같습니다. 주입 전에 용액을 흔들라고 했는데 흔들지 않고 바로 주입해서 그런 것 같습니다. 자전거는 바퀴 하나당 200ML가 적당하다고 합니다. 한 병으로 앞/뒤 바퀴 모두 넣을 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzTSoN/btsJgSX2oul/WxxS4skTDfL34FTYkKtxe0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzTSoN/btsJgSX2oul/WxxS4skTDfL34FTYkKtxe0/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_실란트1.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzTSoN/btsJgSX2oul/WxxS4skTDfL34FTYkKtxe0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzTSoN%2FbtsJgSX2oul%2FWxxS4skTDfL34FTYkKtxe0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT3k5o/btsJge1F53y/l4x6KYShNEyPTt8FDtRpX1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT3k5o/btsJge1F53y/l4x6KYShNEyPTt8FDtRpX1/img.jpg&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-is-animation=&quot;false&quot; data-filename=&quot;resized_실란트2.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT3k5o/btsJge1F53y/l4x6KYShNEyPTt8FDtRpX1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT3k5o%2FbtsJge1F53y%2Fl4x6KYShNEyPTt8FDtRpX1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRMRGP/btsJhnJ21I9/5eCiMYMO8JbZQjRnFKISS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRMRGP/btsJhnJ21I9/5eCiMYMO8JbZQjRnFKISS1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_실란트3.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRMRGP/btsJhnJ21I9/5eCiMYMO8JbZQjRnFKISS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRMRGP%2FbtsJhnJ21I9%2F5eCiMYMO8JbZQjRnFKISS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;실란트 주입 준비/슈레더 밸브 코어 제거/실란트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckS08S/btsJgKy7wBw/eIYutvqfddX2oNYDliqlYk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckS08S/btsJgKy7wBw/eIYutvqfddX2oNYDliqlYk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_실란트4.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckS08S/btsJgKy7wBw/eIYutvqfddX2oNYDliqlYk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckS08S%2FbtsJgKy7wBw%2FeIYutvqfddX2oNYDliqlYk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rQGJ9/btsJg9eaZzv/OKM9oZLKafF0q0InP3d0A1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rQGJ9/btsJg9eaZzv/OKM9oZLKafF0q0InP3d0A1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_실란트5.jpg&quot; style=&quot;width: 32.5581%; margin-right: 10px;&quot; data-widthpercent=&quot;33.33&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rQGJ9/btsJg9eaZzv/OKM9oZLKafF0q0InP3d0A1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrQGJ9%2FbtsJg9eaZzv%2FOKM9oZLKafF0q0InP3d0A1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nAHCY/btsJfndZvWE/zAhAjto1HKEXGDJDqgsfKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nAHCY/btsJfndZvWE/zAhAjto1HKEXGDJDqgsfKk/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1439&quot; data-filename=&quot;resized_실란트6.jpg&quot; style=&quot;width: 32.5581%;&quot; data-widthpercent=&quot;33.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nAHCY/btsJfndZvWE/zAhAjto1HKEXGDJDqgsfKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnAHCY%2FbtsJfndZvWE%2FzAhAjto1HKEXGDJDqgsfKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1439&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;실란트 튜브연결/주입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1724583727696&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;400ML Bicycle Motorcycle Tire Self-rehydration Effective Fast Mountain Bike Tire Repair Fluid Tire Sealant Sealing Machine - Ali&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DcgdnF5&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005006902735340.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DcgdnF5&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=0f0e0058fd04442ebdd3bd939565765a-1724583723471-01653-_DcgdnF5&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ke2sq/hyWVWZxw4y/5bwX7W8fLT7lV0zYpTljQk/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DcgdnF5&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DcgdnF5&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ke2sq/hyWVWZxw4y/5bwX7W8fLT7lV0zYpTljQk/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;400ML Bicycle Motorcycle Tire Self-rehydration Effective Fast Mountain Bike Tire Repair Fluid Tire Sealant Sealing Machine - Ali&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;▶ 슈레더 밸브 코어 리무버&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724583709518&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;4 In 1 French American Valve Wrench Aluminum Alloy Presta / Schrader Valve Core Disassembly Installation Tools for MTB Road Bike&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DeTZHsX&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005007184035520.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DeTZHsX&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=6a441d78c9a34770b13633a5d44f08e6-1724583705017-04630-_DeTZHsX&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JBQSJ/hyWSi4fyiT/3W867CzaFbnM7r7npTzWgk/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DeTZHsX&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DeTZHsX&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JBQSJ/hyWSi4fyiT/3W867CzaFbnM7r7npTzWgk/img.jpg?width=1001&amp;amp;height=1001&amp;amp;face=0_0_1001_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;4 In 1 French American Valve Wrench Aluminum Alloy Presta / Schrader Valve Core Disassembly Installation Tools for MTB Road Bike&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알찬 정보</category>
      <category>16인치 바퀴</category>
      <category>F16</category>
      <category>닥터바이크</category>
      <category>미니벨로</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/207</guid>
      <comments>https://postpop.tistory.com/207#entry207comment</comments>
      <pubDate>Wed, 31 Jul 2024 14:05:07 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 와이파이 연결 도우미 앱</title>
      <link>https://postpop.tistory.com/201</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;MCUWiFi_graphic_image.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ejl34/btsDs3klge6/0nOQIhEqk4PEhbPO1wd3M1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ejl34/btsDs3klge6/0nOQIhEqk4PEhbPO1wd3M1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ejl34/btsDs3klge6/0nOQIhEqk4PEhbPO1wd3M1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEjl34%2FbtsDs3klge6%2F0nOQIhEqk4PEhbPO1wd3M1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;500&quot; data-filename=&quot;MCUWiFi_graphic_image.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1705451089343&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MCUWiFi - Google Play 앱&quot; data-og-description=&quot;스마트폰에서 아두이노 웹서버에 연결하기 위한 앱&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&amp;amp;hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Z9qXB/hyU5QOKVrE/bpzvFyCdjrb9sLTwQgq5o0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bqGT7E/hyU5Pvxelp/hMJ4APQq0Fdz0r6K0sJ4NK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/rYb4x/hyU5PbdO6D/IK7eummhbQKcjEg2UlWMuK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Z9qXB/hyU5QOKVrE/bpzvFyCdjrb9sLTwQgq5o0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bqGT7E/hyU5Pvxelp/hMJ4APQq0Fdz0r6K0sJ4NK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/rYb4x/hyU5PbdO6D/IK7eummhbQKcjEg2UlWMuK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MCUWiFi - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스마트폰에서 아두이노 웹서버에 연결하기 위한 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특징:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 스마트폰에서 아두이노 웹서버에 연결할 때 에러 메시지 출력 및 연결 가이드 제시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 아두이노 웹서버의 html 페이지 연결 시 스마트폰의 웹브라우저 대신 앱 내부 웹 뷰어를 통해 연결 및 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 앱 실행 전 스마트폰의 와이파이 실행 유무에 따라 앱 종료 시 와이파이 설정 페이지 이동&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** 아두이노 웹 서버에 html 페이지 및 연결 응답 코드가 설정되어 있어야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 설치 후 &quot;내 기기 위치에 액세스&quot;를 허용해야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;283&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m8gFZ/btsDuRKIdOd/bjKkCS55jJv7NkZURVit01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m8gFZ/btsDuRKIdOd/bjKkCS55jJv7NkZURVit01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m8gFZ/btsDuRKIdOd/bjKkCS55jJv7NkZURVit01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm8gFZ%2FbtsDuRKIdOd%2FbjKkCS55jJv7NkZURVit01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;283&quot; height=&quot;145&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;283&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 앱 실행 화면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2-1.jpg&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOLyRD/btsDqNJkjEj/JCppBy7ycJdSB9ejIfnf60/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOLyRD/btsDqNJkjEj/JCppBy7ycJdSB9ejIfnf60/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOLyRD/btsDqNJkjEj/JCppBy7ycJdSB9ejIfnf60/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOLyRD%2FbtsDqNJkjEj%2FJCppBy7ycJdSB9ejIfnf60%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;658&quot; data-filename=&quot;2-1.jpg&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &quot;SSID:&quot;를 클릭하면 앱에 설정된 액세스 포인트 주소를 확인하고 아두이노에 설정된 액세스 포인트 주소값이 상이한 경우 해당 주소로 변경할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3-1.jpg&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oe1Wz/btsDrhKbC0Y/VdRUBg1rY5hEO7X1GjGKSK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oe1Wz/btsDrhKbC0Y/VdRUBg1rY5hEO7X1GjGKSK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oe1Wz/btsDrhKbC0Y/VdRUBg1rY5hEO7X1GjGKSK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foe1Wz%2FbtsDrhKbC0Y%2FVdRUBg1rY5hEO7X1GjGKSK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;658&quot; data-filename=&quot;3-1.jpg&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 연결 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3-1. 와이파이 아이콘을 클릭합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3-1.png&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPsZcB/btsDxlEETPk/OF6oSCp3DpIDlEKZx4uwt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPsZcB/btsDxlEETPk/OF6oSCp3DpIDlEKZx4uwt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPsZcB/btsDxlEETPk/OF6oSCp3DpIDlEKZx4uwt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPsZcB%2FbtsDxlEETPk%2FOF6oSCp3DpIDlEKZx4uwt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;319&quot; height=&quot;97&quot; data-filename=&quot;3-1.png&quot; data-origin-width=&quot;319&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3-2. 와이파이 설정화면에서 와이파이를 켜고 검색된 목록에서 아두이노 서버를 선택합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 안드로이드 버전에 따라 다르게 출력되는&amp;nbsp; &quot;인터넷 연결 확실치 않음&quot; 메시지에 대한 응답으로 &quot;다른 네트워크&quot;를 클릭하거나 &quot;인터넷 연결 유지&quot; 또는 &quot;한 번만 연결&quot; 또는 &quot;항상 연결&quot;중 하나를 선택합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 &quot;모바일 데이터로 전환&quot;을 선택한 경우에는 아두이노 서버에 연결할 수 없게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3-2.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bml1Fp/btsDrgLkT7m/BKKj4YbrCudK5nkxzLANSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bml1Fp/btsDrgLkT7m/BKKj4YbrCudK5nkxzLANSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bml1Fp/btsDrgLkT7m/BKKj4YbrCudK5nkxzLANSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbml1Fp%2FbtsDrgLkT7m%2FBKKj4YbrCudK5nkxzLANSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;242&quot; data-filename=&quot;3-2.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3-21.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKULj7/btsDxT17ul9/BqW219QZ2GhIwWCNYeWkS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKULj7/btsDxT17ul9/BqW219QZ2GhIwWCNYeWkS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKULj7/btsDxT17ul9/BqW219QZ2GhIwWCNYeWkS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKULj7%2FbtsDxT17ul9%2FBqW219QZ2GhIwWCNYeWkS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;465&quot; data-filename=&quot;3-21.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노 서버(인터넷 연결 확실치 않음)의 선택이 완료되면 스마트폰 하단의 뒤로 가기 버튼을 클릭합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3-22.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIPgjW/btsDsZPW8X5/kaRfpnJ5iVDdEQfSaCLexk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIPgjW/btsDsZPW8X5/kaRfpnJ5iVDdEQfSaCLexk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIPgjW/btsDsZPW8X5/kaRfpnJ5iVDdEQfSaCLexk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIPgjW%2FbtsDsZPW8X5%2FkaRfpnJ5iVDdEQfSaCLexk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;43&quot; data-filename=&quot;3-22.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;43&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 아두이노 장치에 연결되면 설정된 액세스 포인트에 연결하고 html 페이지를 표시합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6-1.jpg&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfVl8O/btsDp9sB8M8/C147nMRTy2XoSJ4leU9BfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfVl8O/btsDp9sB8M8/C147nMRTy2XoSJ4leU9BfK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfVl8O/btsDp9sB8M8/C147nMRTy2XoSJ4leU9BfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfVl8O%2FbtsDp9sB8M8%2FC147nMRTy2XoSJ4leU9BfK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;658&quot; data-filename=&quot;6-1.jpg&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 아두이노 장치가 와이파이 공유기에 연결되어 있고 아두이노 장치가 와이파이 공유기로부터 할당받은 아이피 주소를 알고 있는 경우 스마트폰을 와이파이 공유기에 연결하여 아두이노 장치의 아두이노 웹서의 html페이지를&amp;nbsp; 표시합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kz8s6/btsDqPf8CZ8/tOTkkRkz7nRFwxTZo2gjY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kz8s6/btsDqPf8CZ8/tOTkkRkz7nRFwxTZo2gjY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kz8s6/btsDqPf8CZ8/tOTkkRkz7nRFwxTZo2gjY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkz8s6%2FbtsDqPf8CZ8%2FtOTkkRkz7nRFwxTZo2gjY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;322&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5-1. 스마트폰이 와이파이 공유기에 연결된 경우 표시되는 아이피 주소 입력창에 아두이노 서버의 주소를 입력하고 &quot;Confirm&quot;을 클릭합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5-1.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drD9Jb/btsDwC7K25b/QeRyKf0USx0KaOZEZRkwl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drD9Jb/btsDwC7K25b/QeRyKf0USx0KaOZEZRkwl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drD9Jb/btsDwC7K25b/QeRyKf0USx0KaOZEZRkwl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrD9Jb%2FbtsDwC7K25b%2FQeRyKf0USx0KaOZEZRkwl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;98&quot; data-filename=&quot;5-1.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9-1.jpg&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sBYwg/btsDuTBI2HO/t0TJwrFdPehfktukp8qvT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sBYwg/btsDuTBI2HO/t0TJwrFdPehfktukp8qvT1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sBYwg/btsDuTBI2HO/t0TJwrFdPehfktukp8qvT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsBYwg%2FbtsDuTBI2HO%2Ft0TJwrFdPehfktukp8qvT1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;658&quot; data-filename=&quot;9-1.jpg&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;658&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노 웹서버에 정상적으로 연결된 경우에는 연결 방식 및 주소값이 저장되고 앱 종료 후 재 실행 시 저장된 값이 반영되어 빠르게 아두이노 html 페이이지에 연결할 수 있게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주소에 &quot;/&quot; 문자를 사용하여 페이지로 직접 이동할 수 있습니다.&amp;nbsp; 예) 192.168.0.5/ip&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년 1월 29일 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이동버튼의 모양 변경 및 방문기록 확인 버튼을 추가했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HqxGQ/btsEbFbh8dU/KDLMfZLhr0T1tlrKZGhnEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HqxGQ/btsEbFbh8dU/KDLMfZLhr0T1tlrKZGhnEK/img.png&quot; data-alt=&quot;이동버튼 변경 / 방문 기록 버튼 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HqxGQ/btsEbFbh8dU/KDLMfZLhr0T1tlrKZGhnEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHqxGQ%2FbtsEbFbh8dU%2FKDLMfZLhr0T1tlrKZGhnEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;71&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이동버튼 변경 / 방문 기록 버튼 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHh6KH/btsEa94LZRU/Q1OTxyJDulrJbWmHAFalpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHh6KH/btsEa94LZRU/Q1OTxyJDulrJbWmHAFalpk/img.png&quot; data-alt=&quot;삼점 클릭시 방문기록 표시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHh6KH/btsEa94LZRU/Q1OTxyJDulrJbWmHAFalpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHh6KH%2FbtsEa94LZRU%2FQ1OTxyJDulrJbWmHAFalpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;427&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;삼점 클릭시 방문기록 표시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삼 점을 클릭하면 방문기록을 확인할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방문기록은 주소 입력창에서 입력하거나 방문기록의 주소를 클릭하여 웹페이지로 이동시 정상적으로 웹페이지가 로드된 경우를 기준으로 가장 최근 기록이 맨 위에 위치합니다. 중복된 기록은 삭제됩니다. 총 15개의 개수를 저장하며 초과되는 기록은 오래된 순서인 아래쪽부터 삭제됩니다. 방문기록의 주소를 클릭 시 해당 주소로 이동합니다. 인터넷 공유기에 연결된 경우 일반 사이트 웹페이지 연결 시 naver.com 또는 google.com의 형식으로 입력하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 종료 후 앱 실행 시 방문기록이 있는 경우 가장 최근의 방문기록으로 연결을 시도합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/p0C6njyAu5M&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노 테스트 코드는 아래 포스트에서 참조할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - 아두이노 - ESP01 와이파이 매니저, soft AP이용 공유기 연결용 아이디와 비밀번호 설정하기, wifimanager&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/93&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - 아두이노 - ESP01 웹서버를 이용하여 웹페이지에서 디지털핀 원격제어, WiFiEsp.h&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/198&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - ESP32 CAM 화질 테스트 및 온보드 LED 플래시 라이트 제어하기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino</category>
      <category>ARDUINO WIFI</category>
      <category>MCU WIFI</category>
      <category>아두이노 웹 브라우저</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/201</guid>
      <comments>https://postpop.tistory.com/201#entry201comment</comments>
      <pubDate>Mon, 15 Jan 2024 15:33:51 +0900</pubDate>
    </item>
    <item>
      <title>심플 LED 전광판 프로그램(PC, 스마트폰, 패드)</title>
      <link>https://postpop.tistory.com/199</link>
      <description>&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;심플 LED 전광판 프로그램(PC, 스마트폰, 패드)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터, 스마트폰, 패드에 사용할 수 있는 HTML로 구동되는 전광판 효과 프로그램입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도의 프로그램 없이 &quot;크롬/파이어폭스&quot; 등 웹브라우저에서 작동됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주요 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 메시지 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 글자 크기 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 배경/글자 색상 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 정지글 / 왼쪽에서 오른쪽 스크롤 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 스크롤 속도 조정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 전체화면 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/umj3CJedXcI&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/umj3CJedXcI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/umj3CJedXcI&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MpNzz/btszi41WhCh/qo9Iaf8tKIfImjlttRXjt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MpNzz/btszi41WhCh/qo9Iaf8tKIfImjlttRXjt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MpNzz/btszi41WhCh/qo9Iaf8tKIfImjlttRXjt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMpNzz%2Fbtszi41WhCh%2Fqo9Iaf8tKIfImjlttRXjt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1464&quot; height=&quot;295&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1464&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메뉴설명&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m1.png&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/waoZy/btszb2QrCI7/NRIei382M3oXK96KbYbF30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/waoZy/btszb2QrCI7/NRIei382M3oXK96KbYbF30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/waoZy/btszb2QrCI7/NRIei382M3oXK96KbYbF30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwaoZy%2Fbtszb2QrCI7%2FNRIei382M3oXK96KbYbF30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;45&quot; data-filename=&quot;m1.png&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지: 출력하고자 하는 메시지를 입력합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m2.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCAyrR/btszb3aMs0J/gkC83vhAHhpv7kOaylfcL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCAyrR/btszb3aMs0J/gkC83vhAHhpv7kOaylfcL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCAyrR/btszb3aMs0J/gkC83vhAHhpv7kOaylfcL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCAyrR%2Fbtszb3aMs0J%2FgkC83vhAHhpv7kOaylfcL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;572&quot; height=&quot;45&quot; data-filename=&quot;m2.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폰트크기: 슬라이드 바를 이용하여 글자크기를 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m3.png&quot; data-origin-width=&quot;90&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmNZs5/btszcp5R7NJ/FogSpRbCMjB26Ngr35vlZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmNZs5/btszcp5R7NJ/FogSpRbCMjB26Ngr35vlZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmNZs5/btszcp5R7NJ/FogSpRbCMjB26Ngr35vlZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmNZs5%2Fbtszcp5R7NJ%2FFogSpRbCMjB26Ngr35vlZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;90&quot; height=&quot;45&quot; data-filename=&quot;m3.png&quot; data-origin-width=&quot;90&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배경: 배경색상을 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m50.png&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI1M2w/btsy9NGx4Vu/WKbkuI2MLQjSrltUHIRup0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI1M2w/btsy9NGx4Vu/WKbkuI2MLQjSrltUHIRup0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI1M2w/btsy9NGx4Vu/WKbkuI2MLQjSrltUHIRup0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI1M2w%2Fbtsy9NGx4Vu%2FWKbkuI2MLQjSrltUHIRup0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;175&quot; height=&quot;45&quot; data-filename=&quot;m50.png&quot; data-origin-width=&quot;175&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글자: 글자색상을 설정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m50-1.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdCP9S/btszcJb2db3/brT6UBKGNTztrGIfOUiv71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdCP9S/btszcJb2db3/brT6UBKGNTztrGIfOUiv71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdCP9S/btszcJb2db3/brT6UBKGNTztrGIfOUiv71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdCP9S%2FbtszcJb2db3%2FbrT6UBKGNTztrGIfOUiv71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1241&quot; height=&quot;196&quot; data-filename=&quot;m50-1.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m5.png&quot; data-origin-width=&quot;89&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o3pSV/btsy9Q4hBQf/ERdHgQ35D5zQ35YWZkv7G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o3pSV/btsy9Q4hBQf/ERdHgQ35D5zQ35YWZkv7G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o3pSV/btsy9Q4hBQf/ERdHgQ35D5zQ35YWZkv7G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo3pSV%2Fbtsy9Q4hBQf%2FERdHgQ35D5zQ35YWZkv7G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;89&quot; height=&quot;45&quot; data-filename=&quot;m5.png&quot; data-origin-width=&quot;89&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변색: 글자색이 자동으로 변경됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m5-1.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vJPGa/btszbjrDmCo/SYuxruVzKCBF51s4lKoA1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vJPGa/btszbjrDmCo/SYuxruVzKCBF51s4lKoA1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vJPGa/btszbjrDmCo/SYuxruVzKCBF51s4lKoA1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvJPGa%2FbtszbjrDmCo%2FSYuxruVzKCBF51s4lKoA1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1241&quot; height=&quot;196&quot; data-filename=&quot;m5-1.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m5_1.png&quot; data-origin-width=&quot;89&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crBJ1i/btszbWiBQ8w/HT7xXf8vJK0fNZixy1UNmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crBJ1i/btszbWiBQ8w/HT7xXf8vJK0fNZixy1UNmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crBJ1i/btszbWiBQ8w/HT7xXf8vJK0fNZixy1UNmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrBJ1i%2FbtszbWiBQ8w%2FHT7xXf8vJK0fNZixy1UNmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;89&quot; height=&quot;45&quot; data-filename=&quot;m5_1.png&quot; data-origin-width=&quot;89&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무지개A: 글자색이 무지개 그라데이션 색상으로 변경됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m5_1-1.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nqFS8/btsy9UyPFzS/1CuwGpqKPtVQfGJLUqL1Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nqFS8/btsy9UyPFzS/1CuwGpqKPtVQfGJLUqL1Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nqFS8/btsy9UyPFzS/1CuwGpqKPtVQfGJLUqL1Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnqFS8%2Fbtsy9UyPFzS%2F1CuwGpqKPtVQfGJLUqL1Q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1241&quot; height=&quot;196&quot; data-filename=&quot;m5_1-1.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m5_2.png&quot; data-origin-width=&quot;89&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oka82/btsy8bBpFSJ/kdcLSz3Xrqa1qFSH6b9gDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oka82/btsy8bBpFSJ/kdcLSz3Xrqa1qFSH6b9gDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oka82/btsy8bBpFSJ/kdcLSz3Xrqa1qFSH6b9gDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foka82%2Fbtsy8bBpFSJ%2FkdcLSz3Xrqa1qFSH6b9gDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;89&quot; height=&quot;45&quot; data-filename=&quot;m5_2.png&quot; data-origin-width=&quot;89&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무지개B: 무지개 그라데이션 색상이 오른쪽에서 왼쪽으로 이동합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m5_2-1.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5zKqK/btszcro782W/fI7VCg6ZvgTw3kHH1P2nvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5zKqK/btszcro782W/fI7VCg6ZvgTw3kHH1P2nvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5zKqK/btszcro782W/fI7VCg6ZvgTw3kHH1P2nvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5zKqK%2Fbtszcro782W%2FfI7VCg6ZvgTw3kHH1P2nvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1241&quot; height=&quot;196&quot; data-filename=&quot;m5_2-1.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m5_4.png&quot; data-origin-width=&quot;174&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qjI2A/btszcG0G9LS/Qs19UUKo1jQlGKFIAAjxik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qjI2A/btszcG0G9LS/Qs19UUKo1jQlGKFIAAjxik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qjI2A/btszcG0G9LS/Qs19UUKo1jQlGKFIAAjxik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqjI2A%2FbtszcG0G9LS%2FQs19UUKo1jQlGKFIAAjxik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;174&quot; height=&quot;45&quot; data-filename=&quot;m5_4.png&quot; data-origin-width=&quot;174&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무지개C: 메시지 배경색상을 무지개 그라데이션으로 변경됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m5_4-1.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;196&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbB600/btszcIjTx5q/M1r8JHvzLX7ITkkKURxpIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbB600/btszcIjTx5q/M1r8JHvzLX7ITkkKURxpIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbB600/btszcIjTx5q/M1r8JHvzLX7ITkkKURxpIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbB600%2FbtszcIjTx5q%2FM1r8JHvzLX7ITkkKURxpIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1241&quot; height=&quot;196&quot; data-filename=&quot;m5_4-1.png&quot; data-origin-width=&quot;1241&quot; data-origin-height=&quot;196&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m6.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RoHXh/btsy9f4ntXl/uCEqKXlpJzlCYqPV5555w1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RoHXh/btsy9f4ntXl/uCEqKXlpJzlCYqPV5555w1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RoHXh/btsy9f4ntXl/uCEqKXlpJzlCYqPV5555w1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRoHXh%2Fbtsy9f4ntXl%2FuCEqKXlpJzlCYqPV5555w1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;45&quot; data-filename=&quot;m6.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측여백: 슬라이드 바를 사용하여 정지글의 메시지의 왼쪽여백을 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크롤 시에는 해당값이 적용되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m7.png&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9AHE8/btszbTzrpow/rmAjkKeqY5kktkNQuGI0k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9AHE8/btszbTzrpow/rmAjkKeqY5kktkNQuGI0k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9AHE8/btszbTzrpow/rmAjkKeqY5kktkNQuGI0k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9AHE8%2FbtszbTzrpow%2FrmAjkKeqY5kktkNQuGI0k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;45&quot; data-filename=&quot;m7.png&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측여백: 슬라이드 바를 사용하여 메시지의 오른쪽여백을 설정합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;줄간격: 메시지줄의 높이를 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m8.png&quot; data-origin-width=&quot;43&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boOTut/btsy8siw8Fn/GWx5QrIx24F0LW7UxZNDgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boOTut/btsy8siw8Fn/GWx5QrIx24F0LW7UxZNDgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boOTut/btsy8siw8Fn/GWx5QrIx24F0LW7UxZNDgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboOTut%2Fbtsy8siw8Fn%2FGWx5QrIx24F0LW7UxZNDgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;43&quot; height=&quot;45&quot; data-filename=&quot;m8.png&quot; data-origin-width=&quot;43&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;줄 바꿈 체크 박스: 메시지의 길이가 오른쪽 여백보다 큰 경우 줄 바꿈 하는 기능을 설정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크롤 시에는 해당값이 적용되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m9.png&quot; data-origin-width=&quot;49&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/borfgY/btszbN0lL0U/2ZQmagLU1i8WKepKbsODAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/borfgY/btszbN0lL0U/2ZQmagLU1i8WKepKbsODAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/borfgY/btszbN0lL0U/2ZQmagLU1i8WKepKbsODAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FborfgY%2FbtszbN0lL0U%2F2ZQmagLU1i8WKepKbsODAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;49&quot; height=&quot;45&quot; data-filename=&quot;m9.png&quot; data-origin-width=&quot;49&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AL / AC: 메시지의 왼쪽 / 가운데 정렬을 설정합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크롤 시에는 해당값이 적용되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m10.png&quot; data-origin-width=&quot;48&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGbtlB/btszbVKMgOr/nNsEM1wwAWgviZWrotFw51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGbtlB/btszbVKMgOr/nNsEM1wwAWgviZWrotFw51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGbtlB/btszbVKMgOr/nNsEM1wwAWgviZWrotFw51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGbtlB%2FbtszbVKMgOr%2FnNsEM1wwAWgviZWrotFw51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;48&quot; height=&quot;45&quot; data-filename=&quot;m10.png&quot; data-origin-width=&quot;48&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;&amp;lt;: 왼쪽에서 오른쪽으로 메시지를 스크롤합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m11.png&quot; data-origin-width=&quot;48&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2c2W1/btsy9S8TMQT/IKiXkFZqaA0MqGwutgQ6w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2c2W1/btsy9S8TMQT/IKiXkFZqaA0MqGwutgQ6w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2c2W1/btsy9S8TMQT/IKiXkFZqaA0MqGwutgQ6w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2c2W1%2Fbtsy9S8TMQT%2FIKiXkFZqaA0MqGwutgQ6w0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;48&quot; height=&quot;45&quot; data-filename=&quot;m11.png&quot; data-origin-width=&quot;48&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;■: 스크롤 중인 메시지를 스크롤 전의 상태로 정지시킵니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m12.png&quot; data-origin-width=&quot;52&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oqiTW/btsy9UFA7v0/3T8qQzXVcMYSqbILIpJMU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oqiTW/btsy9UFA7v0/3T8qQzXVcMYSqbILIpJMU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oqiTW/btsy9UFA7v0/3T8qQzXVcMYSqbILIpJMU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoqiTW%2Fbtsy9UFA7v0%2F3T8qQzXVcMYSqbILIpJMU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;52&quot; height=&quot;45&quot; data-filename=&quot;m12.png&quot; data-origin-width=&quot;52&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⭮ : 프로그램을 초기화시킵니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m13.png&quot; data-origin-width=&quot;55&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGxiPv/btszbT7g8lB/z2mpVjBejFPgs36cRc9G7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGxiPv/btszbT7g8lB/z2mpVjBejFPgs36cRc9G7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGxiPv/btszbT7g8lB/z2mpVjBejFPgs36cRc9G7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGxiPv%2FbtszbT7g8lB%2Fz2mpVjBejFPgs36cRc9G7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;55&quot; height=&quot;45&quot; data-filename=&quot;m13.png&quot; data-origin-width=&quot;55&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;↹ : 전체화면을 설정하거나 해제합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m14.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qRLpI/btszb3hxzVw/BGylR9SZgz48BCdFVITkVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qRLpI/btszb3hxzVw/BGylR9SZgz48BCdFVITkVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qRLpI/btszb3hxzVw/BGylR9SZgz48BCdFVITkVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqRLpI%2Fbtszb3hxzVw%2FBGylR9SZgz48BCdFVITkVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;45&quot; data-filename=&quot;m14.png&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속도: 슬라이드 바로 스크롤 속도를 조정합니다. 낮은 값일수록 빠르게 이동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m15.png&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GRM1V/btszbSHkdzt/cnTaUbJNyiDjWK1Arcx6hK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GRM1V/btszbSHkdzt/cnTaUbJNyiDjWK1Arcx6hK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GRM1V/btszbSHkdzt/cnTaUbJNyiDjWK1Arcx6hK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGRM1V%2FbtszbSHkdzt%2FcnTaUbJNyiDjWK1Arcx6hK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;45&quot; data-filename=&quot;m15.png&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여백: 슬라이드 바로 메시지 영역의 위/아래 여백을 조정합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m16.png&quot; data-origin-width=&quot;55&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZnO1x/btszbRBDNEp/V0Jp59rFaASvuiRE8Xg68K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZnO1x/btszbRBDNEp/V0Jp59rFaASvuiRE8Xg68K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZnO1x/btszbRBDNEp/V0Jp59rFaASvuiRE8Xg68K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZnO1x%2FbtszbRBDNEp%2FV0Jp59rFaASvuiRE8Xg68K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;55&quot; height=&quot;45&quot; data-filename=&quot;m16.png&quot; data-origin-width=&quot;55&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⇡ / ⇣ : 버튼 위쪽 메뉴를 접거나 펼칩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;m17.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;45&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmAouT/btsy8dTxevg/dKODkcoKcmGOkWDlNv6hGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmAouT/btsy8dTxevg/dKODkcoKcmGOkWDlNv6hGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmAouT/btsy8dTxevg/dKODkcoKcmGOkWDlNv6hGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmAouT%2Fbtsy8dTxevg%2FdKODkcoKcmGOkWDlNv6hGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;46&quot; height=&quot;45&quot; data-filename=&quot;m17.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;45&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⇈ / ⇊ : 모든 메뉴를 접거나 펼칩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접기시 화면 꺼짐 방지 기능활성화됩니다. 스마트폰의 화면 자동 꺼짐시간이 10분 이상으로 설정되어 있어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;펼칠때 화면 꺼짐 방지 기능이 해제됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 3.본문 배너1 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;3647290720&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빠른 사용방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 전체화면 버튼을 클릭하여 전체화면으로 변경합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 메시지를 입력합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.&amp;nbsp;슬라이드바를&amp;nbsp;이용하여&amp;nbsp;글자의&amp;nbsp;크기를&amp;nbsp;조정합니다.&amp;nbsp; &lt;br /&gt;4.&amp;nbsp;변경된&amp;nbsp;메시지&amp;nbsp;및&amp;nbsp;글자&amp;nbsp;크기에&amp;nbsp;맞게&amp;nbsp;가로&amp;nbsp;여백을&amp;nbsp;조정합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 접기( ⇡ ) 버튼을 클릭하여 상기 설정 메뉴를 숨깁니다.&amp;nbsp; &lt;br /&gt;7.&amp;nbsp;스크롤&amp;nbsp;속도를&amp;nbsp;조정합니다.&amp;nbsp; &lt;br /&gt;8. 상하 여백을 조정하여 메시지의 수직 위치를 조정합니다.&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. 모두접기 (&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; ⇈ &lt;/span&gt;&amp;nbsp;)&lt;/span&gt; 버튼을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;클릭하여&lt;span&gt; 메뉴를 숨깁니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** 화면 자동 꺼짐 시간을 10분으로 설정해야 화면이 자동으로 꺼지지 않습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;d1.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ6gfZ/btszjtaf6of/kG8nLDM1Ewk176ZMiSPPq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ6gfZ/btszjtaf6of/kG8nLDM1Ewk176ZMiSPPq1/img.png&quot; data-alt=&quot;설정 &amp;amp;gt; 디스플레이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ6gfZ/btszjtaf6of/kG8nLDM1Ewk176ZMiSPPq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ6gfZ%2Fbtszjtaf6of%2FkG8nLDM1Ewk176ZMiSPPq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;248&quot; data-filename=&quot;d1.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설정 &amp;gt; 디스플레이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;d2.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x5UrZ/btszj5NG34b/aR99tHvyoPSkFtQr9J2w51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x5UrZ/btszj5NG34b/aR99tHvyoPSkFtQr9J2w51/img.png&quot; data-alt=&quot;디스플레이 &amp;amp;gt; 화면 자동 꺼짐 시간&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x5UrZ/btszj5NG34b/aR99tHvyoPSkFtQr9J2w51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx5UrZ%2Fbtszj5NG34b%2FaR99tHvyoPSkFtQr9J2w51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;253&quot; data-filename=&quot;d2.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;253&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;디스플레이 &amp;gt; 화면 자동 꺼짐 시간&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;d3.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r4rRo/btszk9IIm9E/xtpK7kYHj1ITBz2HkukXh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r4rRo/btszk9IIm9E/xtpK7kYHj1ITBz2HkukXh0/img.png&quot; data-alt=&quot;화면 자동 꺼짐 시간 : 10분&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r4rRo/btszk9IIm9E/xtpK7kYHj1ITBz2HkukXh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr4rRo%2Fbtszk9IIm9E%2FxtpK7kYHj1ITBz2HkukXh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;426&quot; data-filename=&quot;d3.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;화면 자동 꺼짐 시간 : 10분&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/mBFkV/btszlGGlCIZ/9AzOsGISixw8iuItgXkSp1/scroll_text.html?attach=1&amp;amp;knm=tfile.html&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;scroll_text.html&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.02MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※ 첨부파일 재배포 금지&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1698238477054&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!--
*  2023-10-28
*  https://postpop.tistory.com/199
--&amp;gt;

&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot;&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
    :root {
      --bgc: #000000;
      --txc: #ffffff;
      --dpc: #000000;
      --Pwdt: 1400px;
      --nPwdt: -1400px;
      --xPwdt: -14000px;
      --fontsz: 200px;
      --talign: left;
      --speed: ;
      --Lheight: 200px;
      --height: auto;
      --margin: 0px 0px 0px 0px;
      --padding: 0px 0px 0px 0px;
      --wrap: ;
      --Lpding: 0;
      --CvarA: ;
      --CvarB: ;
      --CvarC: ;
      --CvarD: ;
    }
    body {
      background-color: var(--bgc);
      color: #ffffff;
    }
    div {
      white-space: normal;
    }
    p {
      color: var(--txc);
    }
    @keyframes scroll-animation{
      0%{
        left: 0;
      }
      100%{
        left: var(--nPwdt); /* 텍스트 width와 동일 */
      }
    }
    @keyframes rainbow-animation {
      to {
        background-position: 1000vh;
      }
    }
    @keyframes Color{
      0%{ color:#A0D468; }
      20%{ color:#4FC1E9; } 
      40%{ color:#FFCE54; } 
      60%{ color:#FC6E51; } 
      80%{ color:#ED5565; } 
      100%{ color:#AC92EC; }
    }
    .scroll-text{
      background-image: var(--CvarD);
      width: 100%;
      overflow: hidden;
    }
    .track{
      position: relative;
      height: 80%;
      width: var(--xPwdt);
      animation: var(--speed);
      white-space: var(--wrap);
    }
    .track p{
      float: left;
      width: var(--Pwdt);
      height: var(--height);
      font-size: var(--fontsz);
      text-align: var(--talign); 
      line-height : var(--Lheight); 
      overflow: hidden;
      margin: var(--margin);
      padding: var(--padding);
      background-image: var(--CvarA);
      -webkit-background-clip: text;
      -webkit-text-fill-color: var(--CvarB);
      animation: var(--CvarC); 
    }
    .button {
      background-color: #555555; 
      border: none;
      color: white;
      text-align: center;
      text-decoration: none;
      display: inline-block;
      font-size: 16px;
      cursor: pointer;
      width:auto;
    }
    .absolute {
      display: block;
      position: absolute;
      top: 0px;
      right: 0;
      width: 30px;
      height: 23px; 
    }
    .video {
      display: block;
      position: absolute;
      top: -150px;
      right: 0px;
    }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;script&amp;gt;
var cEffect = 0;
var r = document.querySelector(':root');

function bgc_set(Color) { r.style.setProperty('--bgc', Color);}

//function dp_set(Color) { r.style.setProperty('--dpc', Color); }

function txc_set(Color) { r.style.setProperty('--txc', Color); }

function fsize_set() {
  var f = document.getElementById(&quot;BS&quot;).value;
  var fz = (f*10)+'px';
  r.style.setProperty('--fontsz', fz);
}

function speed_set() {
  var s = document.getElementById(&quot;SO&quot;).value;
  var fs = 'scroll-animation '+s+'s linear infinite';
  r.style.setProperty('--speed', fs);
}

function setDwidth() {
  var v = document.getElementById(&quot;BO&quot;).value;
  var p = (v*100)+'px'
  var n = '-'+(v*100)+'px'
  var x = (v*1000)+'px'
  r.style.setProperty('--Pwdt', p);
  r.style.setProperty('--nPwdt', n);
  r.style.setProperty('--xPwdt', x);
}

function changeMsg() {
  document.getElementById('mm0').innerHTML = document.getElementById(&quot;T0&quot;).value;
  document.getElementById('mm1').innerHTML = document.getElementById(&quot;T0&quot;).value;
  document.getElementById('mm2').innerHTML = document.getElementById(&quot;T0&quot;).value;
}

function doDp(id){
  var con=document.getElementById(id);
  if (con.style.display=='none'){con.style.display='block'; document.getElementById('OPCI').innerHTML='&amp;amp;#8673';}
  else { con.style.display='none';document.getElementById('OPCI').innerHTML='&amp;amp;#8675';}
}

function requestFullScreen(element) {
  var requestMethod = element.requestFullScreen || element.webkitRequestFullScreen || element.mozRequestFullScreen || element.msRequestFullScreen;
  if (requestMethod) { // Native full screen.
    requestMethod.call(element);
  } else if (typeof window.ActiveXObject !== &quot;undefined&quot;) { // Older IE.
    var wscript = new ActiveXObject(&quot;WScript.Shell&quot;);
    if (wscript !== null) {
      wscript.SendKeys(&quot;{F11}&quot;);
    }
  }
}

function cancelFullScreen() {
  var el = document;
  var requestMethod = el.cancelFullScreen||el.webkitCancelFullScreen||el.mozCancelFullScreen||el.exitFullscreen||el.webkitExitFullscreen;
  if (requestMethod) { // cancel full screen.
    requestMethod.call(el);
  } else if (typeof window.ActiveXObject !== &quot;undefined&quot;) { // Older IE.
    var wscript = new ActiveXObject(&quot;WScript.Shell&quot;);
    if (wscript !== null) {
      wscript.SendKeys(&quot;{F11}&quot;);
    }
  }
}

var elem = document.body; // Make the body go full screen.
var full = false;

function fullScreenToggle() {
  if (full) {
    cancelFullScreen();
    full = false;
    var con=document.getElementById('Div8');
    if (con.style.display=='none'){con.style.display='block';document.getElementById('OPCI').innerHTML='&amp;amp;#8673';}
  } else {
    requestFullScreen(elem);
    full = true;
  }
}

var padLeft = 0;
var magTop = 0;
var padTop = 0;

function paddingLeft() {
  padLeft = document.getElementById(&quot;LO&quot;).value*10;
  var pv = padTop+'px 0px 0px '+padLeft+'px';
  r.style.setProperty('--padding', pv)
}

function scroll_set() {
  var pv = padTop+'px 0px 0px 0px';
  r.style.setProperty('--padding', pv); 
  document.getElementById(&quot;LO&quot;).value=0;
  document.getElementById(&quot;LT&quot;).value=0;
  r.style.setProperty('--talign', 'left');
}

function changeMrg() {
  var p = document.getElementById(&quot;MO&quot;).value;
  if (p &amp;lt; 10) { 
    magTop = (p*10)-110; //padTop = magTop;
    var pv = magTop+'px 0px 0px 0px';
    r.style.setProperty('--margin', pv); 
    pv = '0px 0px 0px '+padLeft+'px'; //pv = padTop+'px 0px 0px '+padLeft+'px';
    r.style.setProperty('--padding', pv)
  } else { 
    var pv = '0px 0px 0px 0px';
    r.style.setProperty('--margin', pv); 
    padTop = (p-10)*10;
    var pv = padTop+'px 0px '+(padTop*2)+'px '+padLeft+'px'; //var pv = padTop+'px 0px 0px '+padLeft+'px';
    r.style.setProperty('--padding', pv);  
  }
}

var txAlign = 0;

function align_set() {
  if (txAlign) {
    r.style.setProperty('--talign', 'left');
    document.getElementById('ALS').innerHTML='AL';
    txAlign = 0;
  } else {
    r.style.setProperty('--talign', 'center');
    document.getElementById('ALS').innerHTML='AC';
    txAlign = 1;
  }
}

function stop_set() {
  changeMrg();
  r.style.setProperty('--speed', '');
  document.getElementById(&quot;LO&quot;).value=padLeft/10;
  document.getElementById(&quot;LT&quot;).value=padLeft/10;
  if (txAlign) {r.style.setProperty('--talign', 'center');}
  else {r.style.setProperty('--talign', 'left');}
}

function lineFeed() {
  var con=document.getElementById('CH').checked;
  if (con){r.style.setProperty('--wrap', ''); }
  else {r.style.setProperty('--wrap', 'nowrap'); }
}

function lineHeight() { 
  var lh = document.getElementById(&quot;BS&quot;).value*document.getElementById(&quot;HO&quot;).value+'px';
  r.style.setProperty('--Lheight', lh); 
}

function lineFeed_off() { r.style.setProperty('--wrap', 'nowrap'); }

var allFold = fasle;

function all_fold() {
  if (allFold) {
    document.getElementById('Div9').style.display='block';
    document.getElementById('AOFF').innerHTML='&amp;amp;#8648';
    allFold = false;
    clearInterval(nIntervId);
  } else {
    document.getElementById('Div9').style.display='none';
    document.getElementById('AOFF').innerHTML='&amp;amp;#8650';
    allFold = true;
    nIntervId=setInterval(autoPlay, 570000);
  }
}

function color_effect() {
  if (cEffect==0) {
    r.style.setProperty('--CvarC', 'Color 4s linear infinite');
    document.getElementById('CE').innerHTML='변색';
    cEffect = 1;
  } else if (cEffect==1) {
    r.style.setProperty('--CvarA', 'linear-gradient(to right, red,orange,yellow,green,blue,indigo,violet, red)');
    r.style.setProperty('--CvarB', 'transparent');
    document.getElementById('CE').innerHTML='무지개A';
    cEffect = 2;
  } else if (cEffect==2) {
    r.style.setProperty('--CvarA', 'linear-gradient(to right, red,orange,yellow,green,blue,indigo,violet, red)');
    r.style.setProperty('--CvarB', 'transparent');
    r.style.setProperty('--CvarC', 'rainbow-animation 35s linear infinite');
    document.getElementById('CE').innerHTML='무지개B';
    cEffect = 3;
  } else if (cEffect==3) {
    r.style.setProperty('--CvarA', '');
    r.style.setProperty('--CvarB', '');
    r.style.setProperty('--CvarC', '');
    r.style.setProperty('--CvarD', 'linear-gradient(to right, red,orange,yellow,green,blue,indigo,violet, red)');
    document.getElementById('CE').innerHTML='무지개C';
    cEffect = 4;
  } else {
    r.style.setProperty('--CvarA', '');
    r.style.setProperty('--CvarB', '');
    r.style.setProperty('--CvarC', '');
    r.style.setProperty('--CvarD', '');
    document.getElementById('CE').innerHTML='단색';
    cEffect = 0;
  }
}
&amp;lt;/script&amp;gt;  

&amp;lt;div id='Div9'style='display:block;margin: 0px 0px 10px 0px'&amp;gt;
&amp;lt;div id='Div8'style='margin: 0px 0px 4px 0px;display:block'&amp;gt;
&amp;lt;div style='margin: 0px 0px 4px 0px'&amp;gt;
메시지: &amp;lt;input type='text'style='width:19%'id='T0'value='SCROLL TEXT'oninput='changeMsg()'&amp;gt; 폰트크기: &amp;lt;output id='BS'name='BS'&amp;gt;20&amp;lt;/output&amp;gt;&amp;lt;input style='width:22%;height:10px;'type='range'min='10'max='70'value='20'oninput='document.getElementById(&quot;BS&quot;).value=value;fsize_set();lineHeight()'&amp;gt; 배경: &amp;lt;input style='width:40px;'type='color'name='CD'value='#000000'onchange='bgc_set(value)'&amp;gt; 글자: &amp;lt;input style='width:40px;'type='color'name='CT'value='#ffffff'onchange='txc_set(value)'&amp;gt; &amp;lt;button class=&quot;button&quot;style='width:80px;height:23px'id='CE'onclick='color_effect()'&amp;gt;단색&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
좌측:&amp;lt;span style='display:inline-block;width:18px;'&amp;gt;&amp;lt;output id='LO'&amp;gt;0&amp;lt;/output&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;input style='width:10%;height:10px;'type='range'id='LT'min='0'max='20'value='0'oninput='document.getElementById(&quot;LO&quot;).value=value;paddingLeft()'&amp;gt; 우측:&amp;lt;span style='display:inline-block;width:18px;'&amp;gt;&amp;lt;output id='BO'&amp;gt;14&amp;lt;/output&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;input style='width:22%;height:10px;'type='range'min='0'max='100'value='14'oninput='document.getElementById(&quot;BO&quot;).value=value;setDwidth()'&amp;gt; 줄간격:&amp;lt;span style='display:inline-block;width:18px;'&amp;gt;&amp;lt;output id='HO'&amp;gt;10&amp;lt;/output&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;input style='width:8%;height:10px;'type='range'min='8'max='20'value='10'oninput='document.getElementById(&quot;HO&quot;).value=value;lineHeight()'&amp;gt; &amp;lt;input style='width:auto;'type='checkbox'id='CH'onclick='lineFeed()'checked&amp;gt;&amp;amp;#8649  &amp;lt;button class=&quot;button&quot;style='width:40px;height:23px'id='ALS'onclick='align_set()'&amp;gt;AL&amp;lt;/button&amp;gt; &amp;lt;button class=&quot;button&quot;style='width:40px;height:23px'onclick='scroll_set();lineFeed_off();setDwidth();speed_set()'&amp;gt;&amp;lt;&amp;lt;&amp;lt;/button&amp;gt; &amp;lt;button class=&quot;button&quot;style='width:40px;height:23px'onclick='lineFeed();stop_set()'&amp;gt;&amp;amp;#9724&amp;lt;/button&amp;gt; &amp;lt;button class=&quot;button&quot;style='width:40px;height:23px'onclick='location.reload()'&amp;gt;&amp;amp;#8635&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;button class=&quot;button&quot;style='width:40px;height:23px'onclick='fullScreenToggle();'&amp;gt;&amp;amp;#8633&amp;lt;/button&amp;gt; 속도:&amp;lt;span style='display:inline-block;width:18px;'&amp;gt;&amp;lt;output id='SO'name='SO'&amp;gt;20&amp;lt;/output&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;input style='width:25%;height:10px;'type='range'name='SF'min='2'max='20'value='20'oninput='document.getElementById(&quot;SO&quot;).value=value;speed_set()'&amp;gt; 여백:&amp;lt;span style='display:inline-block;width:18px;'&amp;gt;&amp;lt;output id='MO'name='MO'&amp;gt;10&amp;lt;/output&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;input style='width:40%;height:10px;'type='range'name='MF'min='0'max='40'value='10'oninput='document.getElementById(&quot;MO&quot;).value=value;changeMrg()'&amp;gt; &amp;lt;button class=&quot;button&quot;style='width:40px;height:23px'id='OPCI'onclick='doDp(&quot;Div8&quot;)'&amp;gt;&amp;amp;#8673&amp;lt;/button&amp;gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;scroll-text&quot;&amp;gt;
  &amp;lt;div id=&quot;box&quot;class=&quot;track&quot;&amp;gt;
  &amp;lt;p id='mm0'&amp;gt;SCROLL TEXT&amp;lt;/p&amp;gt;
  &amp;lt;p id='mm1'&amp;gt;SCROLL TEXT&amp;lt;/p&amp;gt;
  &amp;lt;p id='mm2'&amp;gt;SCROLL TEXT&amp;lt;/p&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&quot;absolute&quot;&amp;gt;
 &amp;lt;button class=&quot;button&quot;style='width:30px;height:23px'id='AOFF'onclick='all_fold();requestWakeLock()'&amp;gt;&amp;amp;#8648&amp;lt;/button&amp;gt;
&amp;lt;/div&amp;gt;

&amp;lt;div class=&quot;video&quot;&amp;gt;
&amp;lt;video id = &quot;myVideoObject&quot; controls&amp;gt;
&amp;lt;source src=&quot;data:video/webm;base64,GkXfowEAAAAAAAAfQoaBAUL3gQFC8oEEQvOBCEKChHdlYm1Ch4EEQoWBAhhTgGcBAAAAAAAVkhFNm3RALE27i1OrhBVJqWZTrIHfTbuMU6uEFlSua1OsggEwTbuMU6uEHFO7a1OsghV17AEAAAAAAACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmAQAAAAAAAEUq17GDD0JATYCNTGF2ZjU1LjMzLjEwMFdBjUxhdmY1NS4zMy4xMDBzpJBlrrXf3DCDVB8KcgbMpcr+RImIQJBgAAAAAAAWVK5rAQAAAAAAD++uAQAAAAAAADLXgQFzxYEBnIEAIrWcg3VuZIaFVl9WUDiDgQEj44OEAmJaAOABAAAAAAAABrCBsLqBkK4BAAAAAAAPq9eBAnPFgQKcgQAitZyDdW5khohBX1ZPUkJJU4OBAuEBAAAAAAAAEZ+BArWIQOdwAAAAAABiZIEgY6JPbwIeVgF2b3JiaXMAAAAAAoC7AAAAAAAAgLUBAAAAAAC4AQN2b3JiaXMtAAAAWGlwaC5PcmcgbGliVm9yYmlzIEkgMjAxMDExMDEgKFNjaGF1ZmVudWdnZXQpAQAAABUAAABlbmNvZGVyPUxhdmM1NS41Mi4xMDIBBXZvcmJpcyVCQ1YBAEAAACRzGCpGpXMWhBAaQlAZ4xxCzmvsGUJMEYIcMkxbyyVzkCGkoEKIWyiB0JBVAABAAACHQXgUhIpBCCGEJT1YkoMnPQghhIg5eBSEaUEIIYQQQgghhBBCCCGERTlokoMnQQgdhOMwOAyD5Tj4HIRFOVgQgydB6CCED0K4moOsOQghhCQ1SFCDBjnoHITCLCiKgsQwuBaEBDUojILkMMjUgwtCiJqDSTX4GoRnQXgWhGlBCCGEJEFIkIMGQcgYhEZBWJKDBjm4FITLQagahCo5CB+EIDRkFQCQAACgoiiKoigKEBqyCgDIAAAQQFEUx3EcyZEcybEcCwgNWQUAAAEACAAAoEiKpEiO5EiSJFmSJVmSJVmS5omqLMuyLMuyLMsyEBqyCgBIAABQUQxFcRQHCA1ZBQBkAAAIoDiKpViKpWiK54iOCISGrAIAgAAABAAAEDRDUzxHlETPVFXXtm3btm3btm3btm3btm1blmUZCA1ZBQBAAAAQ0mlmqQaIMAMZBkJDVgEACAAAgBGKMMSA0JBVAABAAACAGEoOogmtOd+c46BZDppKsTkdnEi1eZKbirk555xzzsnmnDHOOeecopxZDJoJrTnnnMSgWQqaCa0555wnsXnQmiqtOeeccc7pYJwRxjnnnCateZCajbU555wFrWmOmkuxOeecSLl5UptLtTnnnHPOOeecc84555zqxekcnBPOOeecqL25lpvQxTnnnE/G6d6cEM4555xzzjnnnHPOOeecIDRkFQAABABAEIaNYdwpCNLnaCBGEWIaMulB9+gwCRqDnELq0ehopJQ6CCWVcVJKJwgNWQUAAAIAQAghhRRSSCGFFFJIIYUUYoghhhhyyimnoIJKKqmooowyyyyzzDLLLLPMOuyssw47DDHEEEMrrcRSU2011lhr7jnnmoO0VlprrbVSSimllFIKQkNWAQAgAAAEQgYZZJBRSCGFFGKIKaeccgoqqIDQkFUAACAAgAAAAABP8hzRER3RER3RER3RER3R8RzPESVREiVREi3TMjXTU0VVdWXXlnVZt31b2IVd933d933d+HVhWJZlWZZlWZZlWZZlWZZlWZYgNGQVAAACAAAghBBCSCGFFFJIKcYYc8w56CSUEAgNWQUAAAIACAAAAHAUR3EcyZEcSbIkS9IkzdIsT/M0TxM9URRF0zRV0RVdUTdtUTZl0zVdUzZdVVZtV5ZtW7Z125dl2/d93/d93/d93/d93/d9XQdCQ1YBABIAADqSIymSIimS4ziOJElAaMgqAEAGAEAAAIriKI7jOJIkSZIlaZJneZaomZrpmZ4qqkBoyCoAABAAQAAAAAAAAIqmeIqpeIqoeI7oiJJomZaoqZoryqbsuq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq7ruq4LhIasAgAkAAB0JEdyJEdSJEVSJEdygNCQVQCADACAAAAcwzEkRXIsy9I0T/M0TxM90RM901NFV3SB0JBVAAAgAIAAAAAAAAAMybAUy9EcTRIl1VItVVMt1VJF1VNVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVN0zRNEwgNWQkAkAEAkBBTLS3GmgmLJGLSaqugYwxS7KWxSCpntbfKMYUYtV4ah5RREHupJGOKQcwtpNApJq3WVEKFFKSYYyoVUg5SIDRkhQAQmgHgcBxAsixAsiwAAAAAAAAAkDQN0DwPsDQPAAAAAAAAACRNAyxPAzTPAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA0jRA8zxA8zwAAAAAAAAA0DwP8DwR8EQRAAAAAAAAACzPAzTRAzxRBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABA0jRA8zxA8zwAAAAAAAAAsDwP8EQR0DwRAAAAAAAAACzPAzxRBDzRAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAEOAAABBgIRQasiIAiBMAcEgSJAmSBM0DSJYFTYOmwTQBkmVB06BpME0AAAAAAAAAAAAAJE2DpkHTIIoASdOgadA0iCIAAAAAAAAAAAAAkqZB06BpEEWApGnQNGgaRBEAAAAAAAAAAAAAzzQhihBFmCbAM02IIkQRpgkAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAGHAAAAgwoQwUGrIiAIgTAHA4imUBAIDjOJYFAACO41gWAABYliWKAABgWZooAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAYcAAACDChDBQashIAiAIAcCiKZQHHsSzgOJYFJMmyAJYF0DyApgFEEQAIAAAocAAACLBBU2JxgEJDVgIAUQAABsWxLE0TRZKkaZoniiRJ0zxPFGma53meacLzPM80IYqiaJoQRVE0TZimaaoqME1VFQAAUOAAABBgg6bE4gCFhqwEAEICAByKYlma5nmeJ4qmqZokSdM8TxRF0TRNU1VJkqZ5niiKommapqqyLE3zPFEURdNUVVWFpnmeKIqiaaqq6sLzPE8URdE0VdV14XmeJ4qiaJqq6roQRVE0TdNUTVV1XSCKpmmaqqqqrgtETxRNU1Vd13WB54miaaqqq7ouEE3TVFVVdV1ZBpimaaqq68oyQFVV1XVdV5YBqqqqruu6sgxQVdd1XVmWZQCu67qyLMsCAAAOHAAAAoygk4wqi7DRhAsPQKEhKwKAKAAAwBimFFPKMCYhpBAaxiSEFEImJaXSUqogpFJSKRWEVEoqJaOUUmopVRBSKamUCkIqJZVSAADYgQMA2IGFUGjISgAgDwCAMEYpxhhzTiKkFGPOOScRUoox55yTSjHmnHPOSSkZc8w556SUzjnnnHNSSuacc845KaVzzjnnnJRSSuecc05KKSWEzkEnpZTSOeecEwAAVOAAABBgo8jmBCNBhYasBABSAQAMjmNZmuZ5omialiRpmud5niiapiZJmuZ5nieKqsnzPE8URdE0VZXneZ4oiqJpqirXFUXTNE1VVV2yLIqmaZqq6rowTdNUVdd1XZimaaqq67oubFtVVdV1ZRm2raqq6rqyDFzXdWXZloEsu67s2rIAAPAEBwCgAhtWRzgpGgssNGQlAJABAEAYg5BCCCFlEEIKIYSUUggJAAAYcAAACDChDBQashIASAUAAIyx1lprrbXWQGettdZaa62AzFprrbXWWmuttdZaa6211lJrrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmuttdZaa6211lprrbXWWmstpZRSSimllFJKKaWUUkoppZRSSgUA+lU4APg/2LA6wknRWGChISsBgHAAAMAYpRhzDEIppVQIMeacdFRai7FCiDHnJKTUWmzFc85BKCGV1mIsnnMOQikpxVZjUSmEUlJKLbZYi0qho5JSSq3VWIwxqaTWWoutxmKMSSm01FqLMRYjbE2ptdhqq7EYY2sqLbQYY4zFCF9kbC2m2moNxggjWywt1VprMMYY3VuLpbaaizE++NpSLDHWXAAAd4MDAESCjTOsJJ0VjgYXGrISAAgJACAQUooxxhhzzjnnpFKMOeaccw5CCKFUijHGnHMOQgghlIwx5pxzEEIIIYRSSsaccxBCCCGEkFLqnHMQQgghhBBKKZ1zDkIIIYQQQimlgxBCCCGEEEoopaQUQgghhBBCCKmklEIIIYRSQighlZRSCCGEEEIpJaSUUgohhFJCCKGElFJKKYUQQgillJJSSimlEkoJJYQSUikppRRKCCGUUkpKKaVUSgmhhBJKKSWllFJKIYQQSikFAAAcOAAABBhBJxlVFmGjCRcegEJDVgIAZAAAkKKUUiktRYIipRikGEtGFXNQWoqocgxSzalSziDmJJaIMYSUk1Qy5hRCDELqHHVMKQYtlRhCxhik2HJLoXMOAAAAQQCAgJAAAAMEBTMAwOAA4XMQdAIERxsAgCBEZohEw0JweFAJEBFTAUBigkIuAFRYXKRdXECXAS7o4q4DIQQhCEEsDqCABByccMMTb3jCDU7QKSp1IAAAAAAADADwAACQXAAREdHMYWRobHB0eHyAhIiMkAgAAAAAABcAfAAAJCVAREQ0cxgZGhscHR4fICEiIyQBAIAAAgAAAAAggAAEBAQAAAAAAAIAAAAEBB9DtnUBAAAAAAAEPueBAKOFggAAgACjzoEAA4BwBwCdASqwAJAAAEcIhYWIhYSIAgIABhwJ7kPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99YAD+/6tQgKOFggADgAqjhYIAD4AOo4WCACSADqOZgQArADECAAEQEAAYABhYL/QACIBDmAYAAKOFggA6gA6jhYIAT4AOo5mBAFMAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAGSADqOFggB6gA6jmYEAewAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIAj4AOo5mBAKMAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAKSADqOFggC6gA6jmYEAywAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIAz4AOo4WCAOSADqOZgQDzADECAAEQEAAYABhYL/QACIBDmAYAAKOFggD6gA6jhYIBD4AOo5iBARsAEQIAARAQFGAAYWC/0AAiAQ5gGACjhYIBJIAOo4WCATqADqOZgQFDADECAAEQEAAYABhYL/QACIBDmAYAAKOFggFPgA6jhYIBZIAOo5mBAWsAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAXqADqOFggGPgA6jmYEBkwAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIBpIAOo4WCAbqADqOZgQG7ADECAAEQEAAYABhYL/QACIBDmAYAAKOFggHPgA6jmYEB4wAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIB5IAOo4WCAfqADqOZgQILADECAAEQEAAYABhYL/QACIBDmAYAAKOFggIPgA6jhYICJIAOo5mBAjMAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAjqADqOFggJPgA6jmYECWwAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYICZIAOo4WCAnqADqOZgQKDADECAAEQEAAYABhYL/QACIBDmAYAAKOFggKPgA6jhYICpIAOo5mBAqsAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCArqADqOFggLPgA6jmIEC0wARAgABEBAUYABhYL/QACIBDmAYAKOFggLkgA6jhYIC+oAOo5mBAvsAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCAw+ADqOZgQMjADECAAEQEAAYABhYL/QACIBDmAYAAKOFggMkgA6jhYIDOoAOo5mBA0sAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCA0+ADqOFggNkgA6jmYEDcwAxAgABEBAAGAAYWC/0AAiAQ5gGAACjhYIDeoAOo4WCA4+ADqOZgQObADECAAEQEAAYABhYL/QACIBDmAYAAKOFggOkgA6jhYIDuoAOo5mBA8MAMQIAARAQABgAGFgv9AAIgEOYBgAAo4WCA8+ADqOFggPkgA6jhYID+oAOo4WCBA+ADhxTu2sBAAAAAAAAEbuPs4EDt4r3gQHxghEr8IEK&quot; type=&quot;video/webm&quot;&amp;gt;
&amp;lt;source src=&quot;data:video/mp4;base64,AAAAHGZ0eXBNNFYgAAACAGlzb21pc28yYXZjMQAAAAhmcmVlAAAGF21kYXTeBAAAbGliZmFhYyAxLjI4AABCAJMgBDIARwAAArEGBf//rdxF6b3m2Ui3lizYINkj7u94MjY0IC0gY29yZSAxNDIgcjIgOTU2YzhkOCAtIEguMjY0L01QRUctNCBBVkMgY29kZWMgLSBDb3B5bGVmdCAyMDAzLTIwMTQgLSBodHRwOi8vd3d3LnZpZGVvbGFuLm9yZy94MjY0Lmh0bWwgLSBvcHRpb25zOiBjYWJhYz0wIHJlZj0zIGRlYmxvY2s9MTowOjAgYW5hbHlzZT0weDE6MHgxMTEgbWU9aGV4IHN1Ym1lPTcgcHN5PTEgcHN5X3JkPTEuMDA6MC4wMCBtaXhlZF9yZWY9MSBtZV9yYW5nZT0xNiBjaHJvbWFfbWU9MSB0cmVsbGlzPTEgOHg4ZGN0PTAgY3FtPTAgZGVhZHpvbmU9MjEsMTEgZmFzdF9wc2tpcD0xIGNocm9tYV9xcF9vZmZzZXQ9LTIgdGhyZWFkcz02IGxvb2thaGVhZF90aHJlYWRzPTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9jb21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MCB3ZWlnaHRwPTAga2V5aW50PTI1MCBrZXlpbnRfbWluPTI1IHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhlYWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02OSBxcHN0ZXA9NCB2YnZfbWF4cmF0ZT03NjggdmJ2X2J1ZnNpemU9MzAwMCBjcmZfbWF4PTAuMCBuYWxfaHJkPW5vbmUgZmlsbGVyPTAgaXBfcmF0aW89MS40MCBhcT0xOjEuMDAAgAAAAFZliIQL8mKAAKvMnJycnJycnJycnXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXiEASZACGQAjgCEASZACGQAjgAAAAAdBmjgX4GSAIQBJkAIZACOAAAAAB0GaVAX4GSAhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGagC/AySEASZACGQAjgAAAAAZBmqAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZrAL8DJIQBJkAIZACOAAAAABkGa4C/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmwAvwMkhAEmQAhkAI4AAAAAGQZsgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGbQC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm2AvwMkhAEmQAhkAI4AAAAAGQZuAL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGboC/AySEASZACGQAjgAAAAAZBm8AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZvgL8DJIQBJkAIZACOAAAAABkGaAC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmiAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZpAL8DJIQBJkAIZACOAAAAABkGaYC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBmoAvwMkhAEmQAhkAI4AAAAAGQZqgL8DJIQBJkAIZACOAIQBJkAIZACOAAAAABkGawC/AySEASZACGQAjgAAAAAZBmuAvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZsAL8DJIQBJkAIZACOAAAAABkGbIC/AySEASZACGQAjgCEASZACGQAjgAAAAAZBm0AvwMkhAEmQAhkAI4AhAEmQAhkAI4AAAAAGQZtgL8DJIQBJkAIZACOAAAAABkGbgCvAySEASZACGQAjgCEASZACGQAjgAAAAAZBm6AnwMkhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AhAEmQAhkAI4AAAAhubW9vdgAAAGxtdmhkAAAAAAAAAAAAAAAAAAAD6AAABDcAAQAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAzB0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAABAAAAAAAAA+kAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAALAAAACQAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAPpAAAAAAABAAAAAAKobWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAB1MAAAdU5VxAAAAAAALWhkbHIAAAAAAAAAAHZpZGUAAAAAAAAAAAAAAABWaWRlb0hhbmRsZXIAAAACU21pbmYAAAAUdm1oZAAAAAEAAAAAAAAAAAAAACRkaW5mAAAAHGRyZWYAAAAAAAAAAQAAAAx1cmwgAAAAAQAAAhNzdGJsAAAAr3N0c2QAAAAAAAAAAQAAAJ9hdmMxAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAALAAkABIAAAASAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGP//AAAALWF2Y0MBQsAN/+EAFWdCwA3ZAsTsBEAAAPpAADqYA8UKkgEABWjLg8sgAAAAHHV1aWRraEDyXyRPxbo5pRvPAyPzAAAAAAAAABhzdHRzAAAAAAAAAAEAAAAeAAAD6QAAABRzdHNzAAAAAAAAAAEAAAABAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAABAAAAAQAAAIxzdHN6AAAAAAAAAAAAAAAeAAADDwAAAAsAAAALAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAACgAAAAoAAAAKAAAAiHN0Y28AAAAAAAAAHgAAAEYAAANnAAADewAAA5gAAAO0AAADxwAAA+MAAAP2AAAEEgAABCUAAARBAAAEXQAABHAAAASMAAAEnwAABLsAAATOAAAE6gAABQYAAAUZAAAFNQAABUgAAAVkAAAFdwAABZMAAAWmAAAFwgAABd4AAAXxAAAGDQAABGh0cmFrAAAAXHRraGQAAAADAAAAAAAAAAAAAAACAAAAAAAABDcAAAAAAAAAAAAAAAEBAAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAkZWR0cwAAABxlbHN0AAAAAAAAAAEAAAQkAAADcAABAAAAAAPgbWRpYQAAACBtZGhkAAAAAAAAAAAAAAAAAAC7gAAAykBVxAAAAAAALWhkbHIAAAAAAAAAAHNvdW4AAAAAAAAAAAAAAABTb3VuZEhhbmRsZXIAAAADi21pbmYAAAAQc21oZAAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybCAAAAABAAADT3N0YmwAAABnc3RzZAAAAAAAAAABAAAAV21wNGEAAAAAAAAAAQAAAAAAAAAAAAIAEAAAAAC7gAAAAAAAM2VzZHMAAAAAA4CAgCIAAgAEgICAFEAVBbjYAAu4AAAADcoFgICAAhGQBoCAgAECAAAAIHN0dHMAAAAAAAAAAgAAADIAAAQAAAAAAQAAAkAAAAFUc3RzYwAAAAAAAAAbAAAAAQAAAAEAAAABAAAAAgAAAAIAAAABAAAAAwAAAAEAAAABAAAABAAAAAIAAAABAAAABgAAAAEAAAABAAAABwAAAAIAAAABAAAACAAAAAEAAAABAAAACQAAAAIAAAABAAAACgAAAAEAAAABAAAACwAAAAIAAAABAAAADQAAAAEAAAABAAAADgAAAAIAAAABAAAADwAAAAEAAAABAAAAEAAAAAIAAAABAAAAEQAAAAEAAAABAAAAEgAAAAIAAAABAAAAFAAAAAEAAAABAAAAFQAAAAIAAAABAAAAFgAAAAEAAAABAAAAFwAAAAIAAAABAAAAGAAAAAEAAAABAAAAGQAAAAIAAAABAAAAGgAAAAEAAAABAAAAGwAAAAIAAAABAAAAHQAAAAEAAAABAAAAHgAAAAIAAAABAAAAHwAAAAQAAAABAAAA4HN0c3oAAAAAAAAAAAAAADMAAAAaAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAAAJAAAACQAAAAkAAACMc3RjbwAAAAAAAAAfAAAALAAAA1UAAANyAAADhgAAA6IAAAO+AAAD0QAAA+0AAAQAAAAEHAAABC8AAARLAAAEZwAABHoAAASWAAAEqQAABMUAAATYAAAE9AAABRAAAAUjAAAFPwAABVIAAAVuAAAFgQAABZ0AAAWwAAAFzAAABegAAAX7AAAGFwAAAGJ1ZHRhAAAAWm1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAALWlsc3QAAAAlqXRvbwAAAB1kYXRhAAAAAQAAAABMYXZmNTUuMzMuMTAw&quot; type=&quot;video/mp4&quot;&amp;gt;
&amp;lt;/video&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
let nIntervId;
function autoPause() {
  myVideoObject.pause();
}
function autoPlay() {
  myVideoObject.play();
  setTimeout(autoPause, 100);
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/199</guid>
      <comments>https://postpop.tistory.com/199#entry199comment</comments>
      <pubDate>Wed, 25 Oct 2023 21:59:22 +0900</pubDate>
    </item>
    <item>
      <title>ESP32 CAM 화질 테스트 및 온보드 LED 플래시 라이트 제어하기</title>
      <link>https://postpop.tistory.com/198</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ESP32 CAM 개발보드.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yFV6V/btrYzkeA604/GAwd69eQNkkZ5kZhYRrPMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yFV6V/btrYzkeA604/GAwd69eQNkkZ5kZhYRrPMk/img.png&quot; data-alt=&quot;ESP32 CAM &amp;amp;amp; LED 플래시 라이트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yFV6V/btrYzkeA604/GAwd69eQNkkZ5kZhYRrPMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyFV6V%2FbtrYzkeA604%2FGAwd69eQNkkZ5kZhYRrPMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;298&quot; data-filename=&quot;ESP32 CAM 개발보드.png&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ESP32 CAM &amp;amp; LED 플래시 라이트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32 CAM은 와이파이와 블루투스 연결을 내장한 ESP32 칩셋을 사용하는 아두이노에서 사용할 수 있는 웹캠 개발보드입니다. 무선으로 영상을 수신할 수 있는 웹캠을 구현할 수 있으며 추가적인 코딩을 통해 여러 기능(와이파이를 통한 원격제어)들을 넣을 수도 있을 것입니다. &lt;br /&gt;&lt;br /&gt;다만 만원 미만의 금액으로 무선 웹캠을 구현할 수 있다는 장점은 있지만 그 가격만큼 영상의 품질이나 성능은 크게 기대하지 않는 게 좋겠습니다. 또한 발열이 상당한 것으로 보아 ESP32 칩셋의 성능 한계까지 사용하고 있는 게 아닌가 생각합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 스펙을 살펴보겠습니다.&lt;br /&gt;- ESP 32S 칩셋: 저전력 듀얼 코어 32 비트 cpu, 내장 520 KB SRAM, 와이파이 및 블루투스, 기타 ESP32 칩셋의 기능&lt;br /&gt;- 온보드 8MB PSRAM (4MB 사용가능) : 이미지 버퍼용&lt;br /&gt;- 온보드 플래시 라이트&lt;br /&gt;- OV2640 및 OV7670 카메라 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.ESP32_CAM_SET.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rBbt2/btrWU8AZvs7/gfKUwLZho2V34KMc3duBU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rBbt2/btrWU8AZvs7/gfKUwLZho2V34KMc3duBU0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rBbt2/btrWU8AZvs7/gfKUwLZho2V34KMc3duBU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrBbt2%2FbtrWU8AZvs7%2FgfKUwLZho2V34KMc3duBU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;279&quot; data-filename=&quot;2.ESP32_CAM_SET.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 카메라 연결 방법&lt;br /&gt;아래 그림처럼 리본 케이블 커넥터(FPC)의 클립을 위로 올립니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.CLIP.jpg&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN2kfw/btrW2tqu5Ja/iJipk3kxdsdcAZjDSqSh6K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN2kfw/btrW2tqu5Ja/iJipk3kxdsdcAZjDSqSh6K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN2kfw/btrW2tqu5Ja/iJipk3kxdsdcAZjDSqSh6K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN2kfw%2FbtrW2tqu5Ja%2FiJipk3kxdsdcAZjDSqSh6K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;237&quot; data-filename=&quot;3.CLIP.jpg&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;카메라의 리본 케이블을 슬롯에 넣은 뒤 클립을 눌러서 닫으면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRe9NS/btrW1PmRFbB/yY6KFQvvamqs07h4kvJx5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRe9NS/btrW1PmRFbB/yY6KFQvvamqs07h4kvJx5k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRe9NS/btrW1PmRFbB/yY6KFQvvamqs07h4kvJx5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRe9NS%2FbtrW1PmRFbB%2FyY6KFQvvamqs07h4kvJx5k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;347&quot; data-filename=&quot;4.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구입처: 알리익스프레스&lt;/p&gt;
&lt;figure id=&quot;og_1722405691441&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;product&quot; data-og-title=&quot;Micro USB CH340G ESP32-CAM ESP32-CAM-MB WiFi Bluetooth Module with OV2640 Camera + IPEX Antenna For Smart Home IOT Development -&quot; data-og-description=&quot;Smarter Shopping, Better Living! Aliexpress.com&quot; data-og-host=&quot;www.aliexpress.com&quot; data-og-source-url=&quot;https://s.click.aliexpress.com/e/_DmMgi5v&quot; data-og-url=&quot;https://www.aliexpress.com/item/1005001725669156.html?src=ibdm_d03p0558e02r02&amp;amp;sk=_DmMgi5v&amp;amp;aff_platform=shareComponent-detail&amp;amp;aff_trace_key=e315ea4f332e46f18ed93c377dd4030c-1722405543535-08795-_DmMgi5v&amp;amp;af=&amp;amp;cv=&amp;amp;cn=&amp;amp;dp=&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lP57Y/hyWG19cArf/tnJYkc6Bf2cUgUrIUco5C0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000&quot;&gt;&lt;a href=&quot;https://s.click.aliexpress.com/e/_DmMgi5v&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://s.click.aliexpress.com/e/_DmMgi5v&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lP57Y/hyWG19cArf/tnJYkc6Bf2cUgUrIUco5C0/img.jpg?width=1000&amp;amp;height=1000&amp;amp;face=0_0_1000_1000');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Micro USB CH340G ESP32-CAM ESP32-CAM-MB WiFi Bluetooth Module with OV2640 Camera + IPEX Antenna For Smart Home IOT Development -&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Smarter Shopping, Better Living! Aliexpress.com&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.aliexpress.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32 CAM를 구동하기 위한 스케치를 업로드하기 위해서는 아두이노 IDE에 ESP32용 아두이노 코어가 설치되어 있어야 합니다. 설치방법은 아래 포스트를 참조하시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/15&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - ESP32의 특징 및 아두이노 IDE에 ESP32 사용 환경 설치하기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스케치 업로드는 ESP32 CAM 전용 업로드 보드를 사용하였습니다. 업로드 보드가 없다면 USB UART 보드(시리얼 컨버터)를 사용해서 업로드해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; esp32 arduino core version 1.0.6을 기준으로 설명되었습니다. &lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;esp32 arduino core version 2.0.xx에 대한 변경된 사항을 추가로 설명합니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;▶ 구동 스케치 업로드 &lt;br /&gt;아두이노 IDE에서 파일 =&amp;gt; 예제 =&amp;gt; ESP32 =&amp;gt; Camera =&amp;gt; CameraWebServer를 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;camera webserver.png&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r9n9q/btrWZXemtmv/dHQ95a9j8sHllKkQo0yaxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r9n9q/btrWZXemtmv/dHQ95a9j8sHllKkQo0yaxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r9n9q/btrWZXemtmv/dHQ95a9j8sHllKkQo0yaxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr9n9q%2FbtrWZXemtmv%2FdHQ95a9j8sHllKkQo0yaxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;764&quot; height=&quot;680&quot; data-filename=&quot;camera webserver.png&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제코드에 설정된 &quot;CAMERA_MODEL_WROVER_KIT&quot;를 &quot;CAMERA_MODEL_AI_THINKER&quot;로 변경해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1674515369374&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Select camera model
//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
//#define CAMERA_MODEL_ESP_EYE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
//#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
//#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
//#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
#define CAMERA_MODEL_AI_THINKER // Has PSRAM
//#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;ESP32 CAM에 와이파이를 통해 연결하는 방법으로는 공유기를 통해 접속하는 방법과 공유기가 없는 환경에서 와이파이 AP에 직접 접속하는 두 가지 방법이 있습니다. 예제 코드는 공유기를 통해서만 연결할 수 있도록 코딩되어 있습니다. 사용하는 공유기의 아이디와 비밀번호를 입력해 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1674515442510&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const char* ssid = &quot;skynet&quot;;       // 사용하고 있는 공유기 아이디
const char* password = &quot;skynet00&quot;; // 사용하고 있는 공유기 비밀번호&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 3.본문 배너1 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;3647290720&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노 IDE에서 툴 =&amp;gt; 보드 =&amp;gt; ESP32 Arduino =&amp;gt; ESP32 Wrover Module을 선택합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wrover.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxrnEe/btrWSvKp7l1/fQzcnWHBfUvzU48beB3Hr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxrnEe/btrWSvKp7l1/fQzcnWHBfUvzU48beB3Hr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxrnEe/btrWSvKp7l1/fQzcnWHBfUvzU48beB3Hr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxrnEe%2FbtrWSvKp7l1%2FfQzcnWHBfUvzU48beB3Hr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;680&quot; data-filename=&quot;wrover.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로 툴 =&amp;gt; 보드 =&amp;gt; Partiion Scheme =&amp;gt; Huge APP (3MB No OTA/1MB SPIFFS) 선택하고 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;ESP32 CAM이 연결된 포트를 선택&lt;/span&gt;한 뒤 스케치를 업로드합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;** esp32 arduino core version 2.0.xx에서는 Flash Mode: &quot;DIO&quot;를 선택해야합니다. QIO에서는 assert failed: do_core_init startup.c:328 (flash_ret == ESP_OK)에러가 발생됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;huge.png&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTFBPi/btrWZXyHoeo/UNHpWO70ECWI86bkcPZhK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTFBPi/btrWZXyHoeo/UNHpWO70ECWI86bkcPZhK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTFBPi/btrWZXyHoeo/UNHpWO70ECWI86bkcPZhK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTFBPi%2FbtrWZXyHoeo%2FUNHpWO70ECWI86bkcPZhK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;893&quot; height=&quot;683&quot; data-filename=&quot;huge.png&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_ip.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfk6zA/btrWSvwUiaw/2AJ5bonOyEnrpCdbMArI11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfk6zA/btrWSvwUiaw/2AJ5bonOyEnrpCdbMArI11/img.png&quot; data-alt=&quot;공유기로부터 IP주소 192.168.1.9를 할당 받음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfk6zA/btrWSvwUiaw/2AJ5bonOyEnrpCdbMArI11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfk6zA%2FbtrWSvwUiaw%2F2AJ5bonOyEnrpCdbMArI11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;444&quot; data-filename=&quot;edited_ip.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공유기로부터 IP주소 192.168.1.9를 할당 받음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 공유기를 통해 ESP32 CAM의 영상 받기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷 공유기에 연결된 컴퓨터에서 웹브라우저를 열고 시리얼 모니터에 표시된 공유기로부터 할당받은 ESP32 CAM의 IP주소를 입력해 줍니다. 그러면 Toggle OV2640 settings라는 설정창 페이지가 로드되는데 맨 아래 &quot;Start Stream&quot; 버튼을 클릭하면 영상 스트림이 시작되고 영상이 표시됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ ESP32 캠 옵션 설정 &lt;br /&gt;&quot;☰ Toggle OV2640 settings&quot;를 클릭하면 옵션 설정창을 펼치고 닫을 수 있습니다. 설정창에서는 해상도와 밝기, 명도, 채도등을 설정할 수 있으며 안면 인식 기능은 정상 작동하지 않았습니다. 화면 해상도 CIF(400x296) 이하에서 안면 인식 기능을 활성화시키면 &quot;CORRUPT HEAP: Bad head at 0x3ffe25dc. Expected 0xabba1234 got 0x00000008&quot; 메모리 오류와 함께 ESP32 CAM이 리부팅되는 오류가 발생하여 확인할 수 없었습니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ OV2640 카메라 해상도별 화질&lt;br /&gt;카메라가 움직일 경우 딜레이와 잔상 현상이 있으며 해상도를 CIF 이상으로 설정할 경우 와이파이를 통한 초당 전송 프레임이 급격히 감소합니다.&lt;br /&gt;&lt;br /&gt;지원 해상도 &lt;br /&gt;UXGA(1600x1200) : 약 8 fps &lt;br /&gt;SXGA(1280x1024) : 약 15 fps &lt;br /&gt;XGA(1024x768) : 약 19 fps &lt;br /&gt;SVGA(800x600) : 약 25 fps &lt;br /&gt;VGA(640x480) : 약 37 fps &lt;br /&gt;CIF(400x296) : 약 47 fps &lt;br /&gt;QVGA(320x240) : 약 50 fps &lt;br /&gt;HQVGA(240x176) : 약 50 fps &lt;br /&gt;QQVGA(160x120) : 약 52 fps &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. QQVGA(160x120)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R1_QQVGA.jpg&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wYQjD/btrWYMc40H8/HWKFfJkI3matBnEcmJdvdK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wYQjD/btrWYMc40H8/HWKFfJkI3matBnEcmJdvdK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wYQjD/btrWYMc40H8/HWKFfJkI3matBnEcmJdvdK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwYQjD%2FbtrWYMc40H8%2FHWKFfJkI3matBnEcmJdvdK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;538&quot; height=&quot;138&quot; data-filename=&quot;R1_QQVGA.jpg&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. HQVGA(240x176)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R3_HQVGA.jpg&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xMbNN/btrWWtkAayf/KpKMQyhsEWpQntwu42ikMk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xMbNN/btrWWtkAayf/KpKMQyhsEWpQntwu42ikMk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xMbNN/btrWWtkAayf/KpKMQyhsEWpQntwu42ikMk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxMbNN%2FbtrWWtkAayf%2FKpKMQyhsEWpQntwu42ikMk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;218&quot; data-filename=&quot;R3_HQVGA.jpg&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. QVGA(320x240)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R4_QVGA.jpg&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctaf1g/btrWRQBkLOu/lgUbNyJc3VdvgERoVpOPO1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctaf1g/btrWRQBkLOu/lgUbNyJc3VdvgERoVpOPO1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctaf1g/btrWRQBkLOu/lgUbNyJc3VdvgERoVpOPO1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fctaf1g%2FbtrWRQBkLOu%2FlgUbNyJc3VdvgERoVpOPO1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;278&quot; data-filename=&quot;R4_QVGA.jpg&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. CIF(400x296)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R5_CIF.jpg&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBWpso/btrWX5jty8t/sYkjfgkLPHRG6ex46PinHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBWpso/btrWX5jty8t/sYkjfgkLPHRG6ex46PinHk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBWpso/btrWX5jty8t/sYkjfgkLPHRG6ex46PinHk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBWpso%2FbtrWX5jty8t%2FsYkjfgkLPHRG6ex46PinHk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;278&quot; data-filename=&quot;R5_CIF.jpg&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. VGA(640x480)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R6_VGA.jpg&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vTkOd/btrWTKAA7Pl/rfCii79oQ408CTUYrts3Q1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vTkOd/btrWTKAA7Pl/rfCii79oQ408CTUYrts3Q1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vTkOd/btrWTKAA7Pl/rfCii79oQ408CTUYrts3Q1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvTkOd%2FbtrWTKAA7Pl%2FrfCii79oQ408CTUYrts3Q1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;776&quot; height=&quot;335&quot; data-filename=&quot;R6_VGA.jpg&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. SVGA(800x600)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R7_SVGA.jpg&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XOpNz/btrWR8ocsF6/xC74lG61vbK3TUsvaSpze0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XOpNz/btrWR8ocsF6/xC74lG61vbK3TUsvaSpze0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XOpNz/btrWR8ocsF6/xC74lG61vbK3TUsvaSpze0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXOpNz%2FbtrWR8ocsF6%2FxC74lG61vbK3TUsvaSpze0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;855&quot; height=&quot;356&quot; data-filename=&quot;R7_SVGA.jpg&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. XGA(1024x768)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R8_XGA.jpg&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eu4vdY/btrWR7Qk5kh/JtQzbnSgorJTpkpAIa925K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eu4vdY/btrWR7Qk5kh/JtQzbnSgorJTpkpAIa925K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eu4vdY/btrWR7Qk5kh/JtQzbnSgorJTpkpAIa925K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feu4vdY%2FbtrWR7Qk5kh%2FJtQzbnSgorJTpkpAIa925K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1014&quot; height=&quot;518&quot; data-filename=&quot;R8_XGA.jpg&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. SXGA(1280x1024)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R9_SXGA.jpg&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/viZUA/btrWVJ2dps4/EzePTgQetf8eRUphyyXi31/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/viZUA/btrWVJ2dps4/EzePTgQetf8eRUphyyXi31/img.jpg&quot; data-alt=&quot;온보드 플래시 꺼짐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/viZUA/btrWVJ2dps4/EzePTgQetf8eRUphyyXi31/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FviZUA%2FbtrWVJ2dps4%2FEzePTgQetf8eRUphyyXi31%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1175&quot; height=&quot;636&quot; data-filename=&quot;R9_SXGA.jpg&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;온보드 플래시 꺼짐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R9_SXGA_FLASH.jpg&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N38sg/btrWRRfUZ1g/1G7hNAIgMjaIkdUFiIKXOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N38sg/btrWRRfUZ1g/1G7hNAIgMjaIkdUFiIKXOk/img.jpg&quot; data-alt=&quot;온보드 플래시 켜짐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N38sg/btrWRRfUZ1g/1G7hNAIgMjaIkdUFiIKXOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN38sg%2FbtrWRRfUZ1g%2F1G7hNAIgMjaIkdUFiIKXOk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1174&quot; height=&quot;636&quot; data-filename=&quot;R9_SXGA_FLASH.jpg&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;온보드 플래시 켜짐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. UXGA(1600x1200)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R10_UXGA.jpg&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;807&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIx5jD/btrWU8udQnp/LUMlOAnvEsU8CsCbHmm3Hk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIx5jD/btrWU8udQnp/LUMlOAnvEsU8CsCbHmm3Hk/img.jpg&quot; data-alt=&quot;온보드 플래시 꺼짐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIx5jD/btrWU8udQnp/LUMlOAnvEsU8CsCbHmm3Hk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIx5jD%2FbtrWU8udQnp%2FLUMlOAnvEsU8CsCbHmm3Hk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;807&quot; data-filename=&quot;R10_UXGA.jpg&quot; data-origin-width=&quot;1400&quot; data-origin-height=&quot;807&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;온보드 플래시 꺼짐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;R10_UXGA_FLASH.jpg&quot; data-origin-width=&quot;1401&quot; data-origin-height=&quot;808&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKSjo3/btrWXiJ38Tn/gK77YHen7aAsXHY4MMxvs1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKSjo3/btrWXiJ38Tn/gK77YHen7aAsXHY4MMxvs1/img.jpg&quot; data-alt=&quot;온보드 플래시 켜짐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKSjo3/btrWXiJ38Tn/gK77YHen7aAsXHY4MMxvs1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKSjo3%2FbtrWXiJ38Tn%2FgK77YHen7aAsXHY4MMxvs1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1401&quot; height=&quot;808&quot; data-filename=&quot;R10_UXGA_FLASH.jpg&quot; data-origin-width=&quot;1401&quot; data-origin-height=&quot;808&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;온보드 플래시 켜짐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공유기 없는 환경에서 휴대폰으로 ESP32 CAM에 연결하는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ACCESS POINT 설정 코드를 추가해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1674523689753&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;WiFiAP.h&amp;gt; // esp32 arduino core version 2.0.xx에서는 반드시 포함되어야합니다. 

const char* ssidAP = &quot;ESP_CAM&quot;;
const char* passAP = &quot;&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 4.본문배너2 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;9606701598&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setup() 함수에 ACCESS POINT 실행 코드를 반영해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1674523761225&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;WiFi.mode(WIFI_AP_STA);                // 와이파이 모드 설정 (AP + STA)
if (passAP == &quot;&quot;) WiFi.softAP(ssidAP); // 비밀번호 설정 유무
else WiFi.softAP(ssidAP, passAP);
Serial.println(WiFi.softAPIP());       // AP 주소 시리얼 모니터 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스케치 업로드 후 AP주소 확인; ESP32의 ACCESS POINT 기본 주소는 별도로 수정하지 않으면 항상 192.168.4.1입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AP.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctgAqO/btrWU7IQ8hL/KdB9pOlX8BtKmpbirxyjJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctgAqO/btrWU7IQ8hL/KdB9pOlX8BtKmpbirxyjJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctgAqO/btrWU7IQ8hL/KdB9pOlX8BtKmpbirxyjJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctgAqO%2FbtrWU7IQ8hL%2FKdB9pOlX8BtKmpbirxyjJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;251&quot; data-filename=&quot;AP.png&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;휴대폰의 와이파이 설정에서 ESP CAM 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;와이파이설정1.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DHxTt/btrW371Tj3c/RkavClrkSjoEPZVxZU32j1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DHxTt/btrW371Tj3c/RkavClrkSjoEPZVxZU32j1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DHxTt/btrW371Tj3c/RkavClrkSjoEPZVxZU32j1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDHxTt%2FbtrW371Tj3c%2FRkavClrkSjoEPZVxZU32j1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;275&quot; data-filename=&quot;와이파이설정1.jpg&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;휴대폰의 웹브라우저에서 AP주소 192.168.4.1을 입력해 주면 Toggle OV2640 settings 페이지에 들어갈 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 페이지에 스트림 실행용 아이콘 추가 및 ESP32 CAM 온보드 &lt;span&gt;LED&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;플래시를 제어하는 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;esp32 arduino core version 1.0.6의 예제 스케치를 기준으로 설명되었습니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Toggle OV2640 settings 웹페이지 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32 CAM의 설정용 웹페이지인 Toggle OV2640 settings는 기본값이 설정창을 펼치도록 되어있습니다. PC에서는 창이 넓어 영상과 동시에 확인할 수 있지만 휴대폰에서는 설정창이 화면의 대부분을 차지하여 불편합니다. 따라서 설정창이 닫힌 상태가 기본값이 되도록 변경해 주고 설정창이 닫힌 상태에서도 영상을 스트림 하도록 아이콘을 추가해 주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 온보드 &lt;span&gt;LED&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;플래시를 제어할 수 있도록 아이콘을 추가해 주었습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* SD카드를 사용하여 영상 저장용 블랙박스로 사용하는 경우 온보드 &lt;span&gt;LED&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;플래시를 제어하지 못합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ORIGIN_OPTION.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5h7hG/btrWR8hvqoY/rTZUuUByvr5v55emnFg7lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5h7hG/btrWR8hvqoY/rTZUuUByvr5v55emnFg7lk/img.png&quot; data-alt=&quot;연결시 설정창이 펼쳐진 상태의 원본&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5h7hG/btrWR8hvqoY/rTZUuUByvr5v55emnFg7lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5h7hG%2FbtrWR8hvqoY%2FrTZUuUByvr5v55emnFg7lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;106&quot; data-filename=&quot;ORIGIN_OPTION.png&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;연결시 설정창이 펼쳐진 상태의 원본&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;MODIFIED_OPTION.png&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJffOp/btrWTK1IgSR/XXg6SiGpWsmikIBZXQApuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJffOp/btrWTK1IgSR/XXg6SiGpWsmikIBZXQApuk/img.png&quot; data-alt=&quot;연결시 설정창이 닫힌상태와 스트림 / 플래시 아이콘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJffOp/btrWTK1IgSR/XXg6SiGpWsmikIBZXQApuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJffOp%2FbtrWTK1IgSR%2FXXg6SiGpWsmikIBZXQApuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;317&quot; height=&quot;39&quot; data-filename=&quot;MODIFIED_OPTION.png&quot; data-origin-width=&quot;317&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;연결시 설정창이 닫힌상태와 스트림 / 플래시 아이콘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/19SKlTz1O2g&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/19SKlTz1O2g&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/19SKlTz1O2g&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;※&amp;nbsp;Toggle OV2640 settings&lt;span&gt; 수정 방법&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ Toggle OV2640 settings 웹페이지용 GZIP 압축 데이터 풀기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Toggle OV2640 settings 웹페이지는 예제 스케치의 camera_index.h 파일 안의 &quot;index_ov2640_html_gz&quot; 배열에 GZIP압축 데이터로 코딩되어 있습니다. 이 압축된 데이터는 웹브라우저에 내장된 압축해제 코드에 의해 풀리고 일반 HTML로 표시됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;참조 사이트&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://robotzero.one/esp32-cam-custom-html/&quot;&gt;https://robotzero.one/esp32-cam-custom-html/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1675758268483&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Editing the ESP32-CAM Camera Web Server HTML &amp;ndash; Robot Zero One&quot; data-og-description=&quot;An easy way to edit or add HTML in the source of the ESP-WHO camera web server example Using the CyberChef online tool makes it easy to convert from your own HTML to the Gzipped Hex format found in the the index_html_gz variable in the code for Arduino and&quot; data-og-host=&quot;robotzero.one&quot; data-og-source-url=&quot;https://robotzero.one/esp32-cam-custom-html/&quot; data-og-url=&quot;https://robotzero.one/esp32-cam-custom-html/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bI6Q59/hyRwEEVBOB/HKeYk4rhSTkZKyDw0kiTmK/img.jpg?width=960&amp;amp;height=576&amp;amp;face=0_0_960_576,https://scrap.kakaocdn.net/dn/cPbvHY/hyRxPEOIcD/XFdh5CMXEInI0aFvkoNnbk/img.jpg?width=960&amp;amp;height=576&amp;amp;face=0_0_960_576,https://scrap.kakaocdn.net/dn/bpssWY/hyRxZHrTui/sPfgIMks5L5DwfTJJ9W31K/img.jpg?width=960&amp;amp;height=576&amp;amp;face=0_0_960_576&quot;&gt;&lt;a href=&quot;https://robotzero.one/esp32-cam-custom-html/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://robotzero.one/esp32-cam-custom-html/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bI6Q59/hyRwEEVBOB/HKeYk4rhSTkZKyDw0kiTmK/img.jpg?width=960&amp;amp;height=576&amp;amp;face=0_0_960_576,https://scrap.kakaocdn.net/dn/cPbvHY/hyRxPEOIcD/XFdh5CMXEInI0aFvkoNnbk/img.jpg?width=960&amp;amp;height=576&amp;amp;face=0_0_960_576,https://scrap.kakaocdn.net/dn/bpssWY/hyRxZHrTui/sPfgIMks5L5DwfTJJ9W31K/img.jpg?width=960&amp;amp;height=576&amp;amp;face=0_0_960_576');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Editing the ESP32-CAM Camera Web Server HTML &amp;ndash; Robot Zero One&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;An easy way to edit or add HTML in the source of the ESP-WHO camera web server example Using the CyberChef online tool makes it easy to convert from your own HTML to the Gzipped Hex format found in the the index_html_gz variable in the code for Arduino and&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;robotzero.one&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 압축을 풀기 위해서는 웹기반 압축프로그램인 &lt;a href=&quot;https://gchq.github.io/CyberChef/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CyberChef online tool&lt;/a&gt;을 사용해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ZIP_SEARCH.jpg&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSQulD/btrWSvwX0qY/mj0YAFpUHeKKwypvyvm1Z0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSQulD/btrWSvwX0qY/mj0YAFpUHeKKwypvyvm1Z0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSQulD/btrWSvwX0qY/mj0YAFpUHeKKwypvyvm1Z0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSQulD%2FbtrWSvwX0qY%2Fmj0YAFpUHeKKwypvyvm1Z0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;959&quot; height=&quot;206&quot; data-filename=&quot;ZIP_SEARCH.jpg&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램의 검색창에서 Find / Replace를 검색하고 해당 툴을 Recipe 창으로 드래그합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ZIP_SEARCH1.jpg&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/docFoM/btrWSvReBDi/HE3p1xhjgESqd2UGKeqNqk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/docFoM/btrWSvReBDi/HE3p1xhjgESqd2UGKeqNqk/img.jpg&quot; data-alt=&quot;Find / Replace 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/docFoM/btrWSvReBDi/HE3p1xhjgESqd2UGKeqNqk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdocFoM%2FbtrWSvReBDi%2FHE3p1xhjgESqd2UGKeqNqk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;956&quot; height=&quot;263&quot; data-filename=&quot;ZIP_SEARCH1.jpg&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Find / Replace 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ZIP_SEARCH2.jpg&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ma8Lu/btrWWtEXCQM/RN3Wco5w9BM4zExS70IVA1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ma8Lu/btrWWtEXCQM/RN3Wco5w9BM4zExS70IVA1/img.jpg&quot; data-alt=&quot;Find / Replace 툴 드래그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ma8Lu/btrWWtEXCQM/RN3Wco5w9BM4zExS70IVA1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMa8Lu%2FbtrWWtEXCQM%2FRN3Wco5w9BM4zExS70IVA1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;961&quot; height=&quot;366&quot; data-filename=&quot;ZIP_SEARCH2.jpg&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Find / Replace 툴 드래그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 Remove whitespace와 From Hex, Gunzip를 검색하여 드래그 한 뒤 아래 그림처럼 설정해 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.jpg&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7geVd/btsDLsXF03y/a80CgR4rUnKhQmK2uIdYi0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7geVd/btsDLsXF03y/a80CgR4rUnKhQmK2uIdYi0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7geVd/btsDLsXF03y/a80CgR4rUnKhQmK2uIdYi0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7geVd%2FbtsDLsXF03y%2Fa80CgR4rUnKhQmK2uIdYi0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;577&quot; data-filename=&quot;img.jpg&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 그림처럼 Input 창에 GZIP압축 데이터를 붙여 넣기 해주면 Output 창에 HTML 코드가 출력됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;932&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bu8cE7/btsDJBnxNha/4xLio2VujzB4cVPqjXonz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bu8cE7/btsDJBnxNha/4xLio2VujzB4cVPqjXonz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bu8cE7/btsDJBnxNha/4xLio2VujzB4cVPqjXonz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbu8cE7%2FbtsDJBnxNha%2F4xLio2VujzB4cVPqjXonz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;932&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;932&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Toggle OV2640 settings 웹페이지 소스코드를 확보했으니 추가하고자 하는 아이콘 및 기능을 수정해 줍니다. 수정된 소스코드를 GZIP 데이터로 압축한 뒤 &quot;index_ov2640_html_gz&quot; 배열에 데이터를 코딩하면 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▶&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Toggle OV2640 settings 페이지 HTML 코드 수정&lt;/p&gt;
&lt;pre id=&quot;code_1675758360533&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;
        &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width,initial-scale=1&quot;&amp;gt;
        &amp;lt;title&amp;gt;ESP32 OV2460&amp;lt;/title&amp;gt;
        &amp;lt;style&amp;gt;
            body {
                font-family: Arial,Helvetica,sans-serif;
                background: #181818;
                color: #EFEFEF;
                font-size: 16px
            }

            h2 {
                font-size: 18px
            }

            section.main {
                display: flex
            }

            #menu,section.main {
                flex-direction: column
            }

            #menu {
                display: none;
                flex-wrap: nowrap;
                min-width: 340px;
                background: #363636;
                padding: 8px;
                border-radius: 4px;
                margin-top: -10px;
                margin-right: 10px;
            }

            #content {
                display: flex;
                flex-wrap: wrap;
                align-items: stretch
            }

            figure {
                padding: 0px;
                margin: 0;
                -webkit-margin-before: 0;
                margin-block-start: 0;
                -webkit-margin-after: 0;
                margin-block-end: 0;
                -webkit-margin-start: 0;
                margin-inline-start: 0;
                -webkit-margin-end: 0;
                margin-inline-end: 0
            }

            figure img {
                display: block;
                width: 100%;
                height: auto;
                border-radius: 4px;
                margin-top: 8px;
            }

            @media (min-width: 800px) and (orientation:landscape) {
                #content {
                    display:flex;
                    flex-wrap: nowrap;
                    align-items: stretch
                }

                figure img {
                    display: block;
                    max-width: 100%;
                    max-height: calc(100vh - 40px);
                    width: auto;
                    height: auto
                }

                figure {
                    padding: 0 0 0 0px;
                    margin: 0;
                    -webkit-margin-before: 0;
                    margin-block-start: 0;
                    -webkit-margin-after: 0;
                    margin-block-end: 0;
                    -webkit-margin-start: 0;
                    margin-inline-start: 0;
                    -webkit-margin-end: 0;
                    margin-inline-end: 0
                }
            }

            section#buttons {
                display: flex;
                flex-wrap: nowrap;
                justify-content: space-between
            }

            #nav-toggle {
                cursor: pointer;
                display: block
            }

            #toggle-str {
                cursor: pointer;
                display: block
            }

            #toggle-fls { /* 플래시 아이콘 스타일 추가 */ 
                cursor: pointer;
                display: block
            }

            #nav-toggle-cb {
                outline: 0;
                opacity: 0;
                width: 0;
                height: 0
            }

            #nav-toggle-cb:checked+#menu {
                display: flex
            }

            .input-group {
                display: flex;
                flex-wrap: nowrap;
                line-height: 22px;
                margin: 5px 0
            }

            .input-group&amp;gt;label {
                display: inline-block;
                padding-right: 10px;
                min-width: 47%
            }

            .input-group input,.input-group select {
                flex-grow: 1
            }

            .range-max,.range-min {
                display: inline-block;
                padding: 0 5px
            }

            .left { /* div 플로팅 스타일 추가 */
                float: left;
            }

            button {
                display: block;
                margin: 5px;
                padding: 0 12px;
                border: 0;
                line-height: 28px;
                cursor: pointer;
                color: #fff;
                background: #ff3034;
                border-radius: 5px;
                font-size: 16px;
                outline: 0
            }

            button:hover {
                background: #ff494d
            }

            button:active {
                background: #f21c21
            }

            button.disabled {
                cursor: default;
                background: #a0a0a0
            }

            input[type=range] {
                -webkit-appearance: none;
                width: 100%;
                height: 22px;
                background: #363636;
                cursor: pointer;
                margin: 0
            }

            input[type=range]:focus {
                outline: 0
            }

            input[type=range]::-webkit-slider-runnable-track {
                width: 100%;
                height: 2px;
                cursor: pointer;
                background: #EFEFEF;
                border-radius: 0;
                border: 0 solid #EFEFEF
            }

            input[type=range]::-webkit-slider-thumb {
                border: 1px solid rgba(0,0,30,0);
                height: 22px;
                width: 22px;
                border-radius: 50px;
                background: #ff3034;
                cursor: pointer;
                -webkit-appearance: none;
                margin-top: -11.5px
            }

            input[type=range]:focus::-webkit-slider-runnable-track {
                background: #EFEFEF
            }

            input[type=range]::-moz-range-track {
                width: 100%;
                height: 2px;
                cursor: pointer;
                background: #EFEFEF;
                border-radius: 0;
                border: 0 solid #EFEFEF
            }

            input[type=range]::-moz-range-thumb {
                border: 1px solid rgba(0,0,30,0);
                height: 22px;
                width: 22px;
                border-radius: 50px;
                background: #ff3034;
                cursor: pointer
            }

            input[type=range]::-ms-track {
                width: 100%;
                height: 2px;
                cursor: pointer;
                background: 0 0;
                border-color: transparent;
                color: transparent
            }

            input[type=range]::-ms-fill-lower {
                background: #EFEFEF;
                border: 0 solid #EFEFEF;
                border-radius: 0
            }

            input[type=range]::-ms-fill-upper {
                background: #EFEFEF;
                border: 0 solid #EFEFEF;
                border-radius: 0
            }

            input[type=range]::-ms-thumb {
                border: 1px solid rgba(0,0,30,0);
                height: 22px;
                width: 22px;
                border-radius: 50px;
                background: #ff3034;
                cursor: pointer;
                height: 2px
            }

            input[type=range]:focus::-ms-fill-lower {
                background: #EFEFEF
            }

            input[type=range]:focus::-ms-fill-upper {
                background: #363636
            }

            .switch {
                display: block;
                position: relative;
                line-height: 22px;
                font-size: 16px;
                height: 22px
            }

            .switch input {
                outline: 0;
                opacity: 0;
                width: 0;
                height: 0
            }

            .slider {
                width: 50px;
                height: 22px;
                border-radius: 22px;
                cursor: pointer;
                background-color: grey
            }

            .slider,.slider:before {
                display: inline-block;
                transition: .4s
            }

            .slider:before {
                position: relative;
                content: &quot;&quot;;
                border-radius: 50%;
                height: 16px;
                width: 16px;
                left: 4px;
                top: 3px;
                background-color: #fff
            }

            input:checked+.slider {
                background-color: #ff3034
            }

            input:checked+.slider:before {
                -webkit-transform: translateX(26px);
                transform: translateX(26px)
            }

            select {
                border: 1px solid #363636;
                font-size: 14px;
                height: 22px;
                outline: 0;
                border-radius: 5px
            }

            .image-container {
                position: relative;
                min-width: 160px
            }

            .close {
                position: absolute;
                right: 5px;
                top: 5px;
                background: #ff3034;
                width: 16px;
                height: 16px;
                border-radius: 100px;
                color: #fff;
                text-align: center;
                line-height: 18px;
                cursor: pointer
            }

            .hidden {
                display: none
            }

        &amp;lt;/style&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;section class=&quot;main&quot;&amp;gt;
            &amp;lt;div id=&quot;logo&quot;&amp;gt; &amp;lt;!-- div 카메라 및 플래시 아이콘 추가 --&amp;gt; 
                &amp;lt;div class=&quot;left&quot;&amp;gt;&amp;lt;label for=&quot;nav-toggle-cb&quot; id=&quot;nav-toggle&quot;&amp;gt;&amp;amp;#9776;&amp;amp;nbsp;&amp;amp;nbsp;Toggle OV2640 settings&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;/label&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;left&quot;&amp;gt;&amp;lt;label id=&quot;toggle-str&quot;&amp;gt;&amp;amp;#128247&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;/label&amp;gt;&amp;lt;/div&amp;gt;
                &amp;lt;div class=&quot;left&quot;&amp;gt;&amp;lt;input id=&quot;fls&quot; type=&quot;checkbox&quot; class=&quot;default-action hidden&quot; checked=&quot;unchecked&quot;&amp;gt;&amp;lt;label for=&quot;fls&quot; id=&quot;toggle-fls&quot;&amp;gt;&amp;amp;#128294&amp;amp;nbsp;&amp;lt;/label&amp;gt;&amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div id=&quot;content&quot;&amp;gt;
                &amp;lt;div id=&quot;sidebar&quot;&amp;gt;
                    &amp;lt;input type=&quot;checkbox&quot; id=&quot;nav-toggle-cb&quot;&amp;gt;
                    &amp;lt;nav id=&quot;menu&quot;&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;framesize-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;framesize&quot;&amp;gt;Resolution&amp;lt;/label&amp;gt;
                            &amp;lt;select id=&quot;framesize&quot; class=&quot;default-action&quot;&amp;gt;
                                &amp;lt;option value=&quot;10&quot;&amp;gt;UXGA(1600x1200)&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;9&quot;&amp;gt;SXGA(1280x1024)&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;8&quot;&amp;gt;XGA(1024x768)&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;7&quot;&amp;gt;SVGA(800x600)&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;6&quot;&amp;gt;VGA(640x480)&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;5&quot; selected=&quot;selected&quot;&amp;gt;CIF(400x296)&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;4&quot;&amp;gt;QVGA(320x240)&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;3&quot;&amp;gt;HQVGA(240x176)&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;0&quot;&amp;gt;QQVGA(160x120)&amp;lt;/option&amp;gt;
                            &amp;lt;/select&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;quality-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;quality&quot;&amp;gt;Quality&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;range-min&quot;&amp;gt;10&amp;lt;/div&amp;gt;
                            &amp;lt;input type=&quot;range&quot; id=&quot;quality&quot; min=&quot;10&quot; max=&quot;63&quot; value=&quot;10&quot; class=&quot;default-action&quot;&amp;gt;
                            &amp;lt;div class=&quot;range-max&quot;&amp;gt;63&amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;brightness-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;brightness&quot;&amp;gt;Brightness&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;range-min&quot;&amp;gt;-2&amp;lt;/div&amp;gt;
                            &amp;lt;input type=&quot;range&quot; id=&quot;brightness&quot; min=&quot;-2&quot; max=&quot;2&quot; value=&quot;0&quot; class=&quot;default-action&quot;&amp;gt;
                            &amp;lt;div class=&quot;range-max&quot;&amp;gt;2&amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;contrast-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;contrast&quot;&amp;gt;Contrast&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;range-min&quot;&amp;gt;-2&amp;lt;/div&amp;gt;
                            &amp;lt;input type=&quot;range&quot; id=&quot;contrast&quot; min=&quot;-2&quot; max=&quot;2&quot; value=&quot;0&quot; class=&quot;default-action&quot;&amp;gt;
                            &amp;lt;div class=&quot;range-max&quot;&amp;gt;2&amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;saturation-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;saturation&quot;&amp;gt;Saturation&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;range-min&quot;&amp;gt;-2&amp;lt;/div&amp;gt;
                            &amp;lt;input type=&quot;range&quot; id=&quot;saturation&quot; min=&quot;-2&quot; max=&quot;2&quot; value=&quot;0&quot; class=&quot;default-action&quot;&amp;gt;
                            &amp;lt;div class=&quot;range-max&quot;&amp;gt;2&amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;special_effect-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;special_effect&quot;&amp;gt;Special Effect&amp;lt;/label&amp;gt;
                            &amp;lt;select id=&quot;special_effect&quot; class=&quot;default-action&quot;&amp;gt;
                                &amp;lt;option value=&quot;0&quot; selected=&quot;selected&quot;&amp;gt;No Effect&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;1&quot;&amp;gt;Negative&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;2&quot;&amp;gt;Grayscale&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;3&quot;&amp;gt;Red Tint&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;4&quot;&amp;gt;Green Tint&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;5&quot;&amp;gt;Blue Tint&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;6&quot;&amp;gt;Sepia&amp;lt;/option&amp;gt;
                            &amp;lt;/select&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;awb-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;awb&quot;&amp;gt;AWB&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;awb&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot; checked=&quot;checked&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;awb&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;awb_gain-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;awb_gain&quot;&amp;gt;AWB Gain&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;awb_gain&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot; checked=&quot;checked&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;awb_gain&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;wb_mode-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;wb_mode&quot;&amp;gt;WB Mode&amp;lt;/label&amp;gt;
                            &amp;lt;select id=&quot;wb_mode&quot; class=&quot;default-action&quot;&amp;gt;
                                &amp;lt;option value=&quot;0&quot; selected=&quot;selected&quot;&amp;gt;Auto&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;1&quot;&amp;gt;Sunny&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;2&quot;&amp;gt;Cloudy&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;3&quot;&amp;gt;Office&amp;lt;/option&amp;gt;
                                &amp;lt;option value=&quot;4&quot;&amp;gt;Home&amp;lt;/option&amp;gt;
                            &amp;lt;/select&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;aec-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;aec&quot;&amp;gt;AEC SENSOR&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;aec&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot; checked=&quot;checked&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;aec&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;aec2-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;aec2&quot;&amp;gt;AEC DSP&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;aec2&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot; checked=&quot;checked&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;aec2&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;ae_level-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;ae_level&quot;&amp;gt;AE Level&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;range-min&quot;&amp;gt;-2&amp;lt;/div&amp;gt;
                            &amp;lt;input type=&quot;range&quot; id=&quot;ae_level&quot; min=&quot;-2&quot; max=&quot;2&quot; value=&quot;0&quot; class=&quot;default-action&quot;&amp;gt;
                            &amp;lt;div class=&quot;range-max&quot;&amp;gt;2&amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;aec_value-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;aec_value&quot;&amp;gt;Exposure&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;range-min&quot;&amp;gt;0&amp;lt;/div&amp;gt;
                            &amp;lt;input type=&quot;range&quot; id=&quot;aec_value&quot; min=&quot;0&quot; max=&quot;1200&quot; value=&quot;204&quot; class=&quot;default-action&quot;&amp;gt;
                            &amp;lt;div class=&quot;range-max&quot;&amp;gt;1200&amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;agc-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;agc&quot;&amp;gt;AGC&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;agc&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot; checked=&quot;checked&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;agc&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group hidden&quot; id=&quot;agc_gain-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;agc_gain&quot;&amp;gt;Gain&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;range-min&quot;&amp;gt;1x&amp;lt;/div&amp;gt;
                            &amp;lt;input type=&quot;range&quot; id=&quot;agc_gain&quot; min=&quot;0&quot; max=&quot;30&quot; value=&quot;5&quot; class=&quot;default-action&quot;&amp;gt;
                            &amp;lt;div class=&quot;range-max&quot;&amp;gt;31x&amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;gainceiling-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;gainceiling&quot;&amp;gt;Gain Ceiling&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;range-min&quot;&amp;gt;2x&amp;lt;/div&amp;gt;
                            &amp;lt;input type=&quot;range&quot; id=&quot;gainceiling&quot; min=&quot;0&quot; max=&quot;6&quot; value=&quot;0&quot; class=&quot;default-action&quot;&amp;gt;
                            &amp;lt;div class=&quot;range-max&quot;&amp;gt;128x&amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;bpc-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;bpc&quot;&amp;gt;BPC&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;bpc&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;bpc&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;wpc-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;wpc&quot;&amp;gt;WPC&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;wpc&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot; checked=&quot;checked&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;wpc&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;raw_gma-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;raw_gma&quot;&amp;gt;Raw GMA&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;raw_gma&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot; checked=&quot;checked&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;raw_gma&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;lenc-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;lenc&quot;&amp;gt;Lens Correction&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;lenc&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot; checked=&quot;checked&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;lenc&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;hmirror-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;hmirror&quot;&amp;gt;H-Mirror&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;hmirror&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot; checked=&quot;checked&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;hmirror&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;vflip-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;vflip&quot;&amp;gt;V-Flip&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;vflip&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot; checked=&quot;checked&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;vflip&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;dcw-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;dcw&quot;&amp;gt;DCW (Downsize EN)&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;dcw&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot; checked=&quot;checked&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;dcw&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;colorbar-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;colorbar&quot;&amp;gt;Color Bar&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;colorbar&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;colorbar&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;face_detect-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;face_detect&quot;&amp;gt;Face Detection&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;face_detect&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;face_detect&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;div class=&quot;input-group&quot; id=&quot;face_recognize-group&quot;&amp;gt;
                            &amp;lt;label for=&quot;face_recognize&quot;&amp;gt;Face Recognition&amp;lt;/label&amp;gt;
                            &amp;lt;div class=&quot;switch&quot;&amp;gt;
                                &amp;lt;input id=&quot;face_recognize&quot; type=&quot;checkbox&quot; class=&quot;default-action&quot;&amp;gt;
                                &amp;lt;label class=&quot;slider&quot; for=&quot;face_recognize&quot;&amp;gt;&amp;lt;/label&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                        &amp;lt;section id=&quot;buttons&quot;&amp;gt;
                            &amp;lt;button id=&quot;get-still&quot;&amp;gt;Get Still&amp;lt;/button&amp;gt;
                            &amp;lt;button id=&quot;toggle-stream&quot;&amp;gt;Start Stream&amp;lt;/button&amp;gt;
                            &amp;lt;button id=&quot;face_enroll&quot; class=&quot;disabled&quot; disabled=&quot;disabled&quot;&amp;gt;Enroll Face&amp;lt;/button&amp;gt;
                        &amp;lt;/section&amp;gt;
                    &amp;lt;/nav&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;figure&amp;gt;
                    &amp;lt;div id=&quot;stream-container&quot; class=&quot;image-container hidden&quot;&amp;gt;
                        &amp;lt;div class=&quot;close&quot; id=&quot;close-stream&quot;&amp;gt;X&amp;lt;/div&amp;gt;
                        &amp;lt;img id=&quot;stream&quot; src=&quot;&quot;&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/figure&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/section&amp;gt;
        &amp;lt;script&amp;gt;
document.addEventListener('DOMContentLoaded', function (event) {
  var baseHost = document.location.origin
  var streamUrl = baseHost + ':81'

  const hide = el =&amp;gt; {
    el.classList.add('hidden')
  }
  const show = el =&amp;gt; {
    el.classList.remove('hidden')
  }

  const disable = el =&amp;gt; {
    el.classList.add('disabled')
    el.disabled = true
  }

  const enable = el =&amp;gt; {
    el.classList.remove('disabled')
    el.disabled = false
  }

  const updateValue = (el, value, updateRemote) =&amp;gt; {
    updateRemote = updateRemote == null ? true : updateRemote
    let initialValue
    if (el.type === 'checkbox') {
      initialValue = el.checked
      value = !!value
      el.checked = value
    } else {
      initialValue = el.value
      el.value = value
    }

    if (updateRemote &amp;amp;&amp;amp; initialValue !== value) {
      updateConfig(el);
    } else if(!updateRemote){
      if(el.id === &quot;aec&quot;){
        value ? hide(exposure) : show(exposure)
      } else if(el.id === &quot;agc&quot;){
        if (value) {
          show(gainCeiling)
          hide(agcGain)
        } else {
          hide(gainCeiling)
          show(agcGain)
        }
      } else if(el.id === &quot;awb_gain&quot;){
        value ? show(wb) : hide(wb)
      } else if(el.id === &quot;face_recognize&quot;){
        value ? enable(enrollButton) : disable(enrollButton)
      }
    }
  }

  function updateConfig (el) {
    let value
    switch (el.type) {
      case 'checkbox':
        value = el.checked ? 1 : 0
        break
      case 'range':
      case 'select-one':
        value = el.value
        break
      case 'button':
      case 'submit':
        value = '1'
        break
      default:
        return
    }

    const query = `${baseHost}/control?var=${el.id}&amp;amp;val=${value}`

    fetch(query)
      .then(response =&amp;gt; {
        console.log(`request to ${query} finished, status: ${response.status}`)
      })
  }

  document
    .querySelectorAll('.close')
    .forEach(el =&amp;gt; {
      el.onclick = () =&amp;gt; {
        hide(el.parentNode)
      }
    })

  // read initial values
  fetch(`${baseHost}/status`)
    .then(function (response) {
      return response.json()
    })
    .then(function (state) {
      document
        .querySelectorAll('.default-action')
        .forEach(el =&amp;gt; {
          updateValue(el, state[el.id], false)
        })
    })

  const view = document.getElementById('stream')
  const viewContainer = document.getElementById('stream-container')
  const stillButton = document.getElementById('get-still')
  const streamButton = document.getElementById('toggle-stream')
  const enrollButton = document.getElementById('face_enroll')
  const closeButton = document.getElementById('close-stream')
  const cameraButton = document.getElementById('toggle-str')
  const flashButton = document.getElementById('toggle-fls')

  const stopStream = () =&amp;gt; {
    window.stop();
    streamButton.innerHTML = 'Start Stream'
    cameraButton.innerHTML = '&amp;amp;#128247&amp;amp;nbsp;&amp;amp;nbsp;'  //스트림 시 카메라 아이콘 변경 추가 --&amp;gt; 
  }

  const startStream = () =&amp;gt; {
    view.src = `${streamUrl}/stream`
    show(viewContainer)
    streamButton.innerHTML = 'Stop Stream'
    cameraButton.innerHTML = '&amp;amp;#128248&amp;amp;nbsp;&amp;amp;nbsp;'  //스트림 시 카메라 아이콘 변경 추가 --&amp;gt; 
  }

  // Attach actions to buttons
  stillButton.onclick = () =&amp;gt; {
    stopStream()
    view.src = `${baseHost}/capture?_cb=${Date.now()}`
    show(viewContainer)
  }

  closeButton.onclick = () =&amp;gt; {
    stopStream()
    hide(viewContainer)
  }

  cameraButton.onclick = () =&amp;gt; { // 카메라 아이콘 작동 코드 추가 --&amp;gt; 
    const streamEnabled = streamButton.innerHTML === 'Stop Stream'
    if (streamEnabled) {
      stopStream()
      hide(viewContainer)
    } else {
      startStream()
    }
  }

  flashButton.onclick = () =&amp;gt; { // 플래시 아이콘 작동 코드 추가 --&amp;gt; 
    const flsOn = document.getElementById('fls')
    const is_checked = flsOn.checked;
    if (is_checked) { flashButton.innerHTML = '&amp;amp;#128262' }
    else { flashButton.innerHTML = '&amp;amp;#128294&amp;amp;nbsp;' } 
  }

  streamButton.onclick = () =&amp;gt; {
    const streamEnabled = streamButton.innerHTML === 'Stop Stream'
    if (streamEnabled) {
      stopStream()
    } else {
      startStream()
    }
  }

  enrollButton.onclick = () =&amp;gt; {
    updateConfig(enrollButton)
  }

  // Attach default on change action
  document
    .querySelectorAll('.default-action')
    .forEach(el =&amp;gt; {
      el.onchange = () =&amp;gt; updateConfig(el)
    })

  // Custom actions
  // Gain
  const agc = document.getElementById('agc')
  const agcGain = document.getElementById('agc_gain-group')
  const gainCeiling = document.getElementById('gainceiling-group')
  agc.onchange = () =&amp;gt; {
    updateConfig(agc)
    if (agc.checked) {
      show(gainCeiling)
      hide(agcGain)
    } else {
      hide(gainCeiling)
      show(agcGain)
    }
  }

  // Exposure
  const aec = document.getElementById('aec')
  const exposure = document.getElementById('aec_value-group')
  aec.onchange = () =&amp;gt; {
    updateConfig(aec)
    aec.checked ? hide(exposure) : show(exposure)
  }

  // AWB
  const awb = document.getElementById('awb_gain')
  const wb = document.getElementById('wb_mode-group')
  awb.onchange = () =&amp;gt; {
    updateConfig(awb)
    awb.checked ? show(wb) : hide(wb)
  }

  // Detection and framesize
  const detect = document.getElementById('face_detect')
  const recognize = document.getElementById('face_recognize')
  const framesize = document.getElementById('framesize')

  framesize.onchange = () =&amp;gt; {
    updateConfig(framesize)
    if (framesize.value &amp;gt; 5) {
      updateValue(detect, false)
      updateValue(recognize, false)
    }
  }

  detect.onchange = () =&amp;gt; {
    if (framesize.value &amp;gt; 5) {
      alert(&quot;Please select CIF or lower resolution before enabling this feature!&quot;);
      updateValue(detect, false)
      return;
    }
    updateConfig(detect)
    if (!detect.checked) {
      disable(enrollButton)
      updateValue(recognize, false)
    }
  }

  recognize.onchange = () =&amp;gt; {
    if (framesize.value &amp;gt; 5) {
      alert(&quot;Please select CIF or lower resolution before enabling this feature!&quot;);
      updateValue(recognize, false)
      return;
    }
    updateConfig(recognize)
    if (recognize.checked) {
      enable(enrollButton)
      updateValue(detect, true)
    } else {
      disable(enrollButton)
    }
  }
})

        &amp;lt;/script&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 소스코드를 GZIP 데이터로 압축하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;압축하는 방법은 CyberChef online tool 프로그램에서 Gzip와 To Hex, split, URL Decode를 검색하여 드래그한 뒤 아래 그림처럼 설정해 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gzip.jpg&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;595&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NVsAz/btrWRWhdkdZ/y1qmfKWQLM6TrWkdKAutWk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NVsAz/btrWRWhdkdZ/y1qmfKWQLM6TrWkdKAutWk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NVsAz/btrWRWhdkdZ/y1qmfKWQLM6TrWkdKAutWk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNVsAz%2FbtrWRWhdkdZ%2Fy1qmfKWQLM6TrWkdKAutWk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;515&quot; data-filename=&quot;gzip.jpg&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;595&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;아래 그림처럼 Input 창에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;수정한 HTML 소스코드를 붙여 넣기 해주면 Output 창에 압축된 데이터가 출력됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 콤마 다음부터 마지막까지 드래그 한 뒤 복사하고 &quot;index_ov2640_html_gz&quot; 배열에 데이터를 붙여 넣기 합니다. 추가로 &quot;index_ov2640_html_gz&quot; 배열의 크기를 확인한 뒤 index_ov2640_html_gz_len 메크로 값을 수정해 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 소스코드 크기: 29,601바이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- GZIP으로 압축 후 크기: 4,552바이트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gzip.png&quot; data-origin-width=&quot;1921&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bttF44/btrWRRmLBtG/TpYrcCE3aPDkGKV1aFYfc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bttF44/btrWRRmLBtG/TpYrcCE3aPDkGKV1aFYfc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bttF44/btrWRRmLBtG/TpYrcCE3aPDkGKV1aFYfc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbttF44%2FbtrWRRmLBtG%2FTpYrcCE3aPDkGKV1aFYfc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1921&quot; height=&quot;937&quot; data-filename=&quot;gzip.png&quot; data-origin-width=&quot;1921&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최종 수정한 데이터 파일: 수정한 스케치는 맨 아래에서 다운로드할 수 있습니다.&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1674528464773&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define index_ov2640_html_gz_len 4552
const uint8_t index_ov2640_html_gz[] = {
 0x1f,0x8b,0x08,0x08,0x17,0xdf,0xcc,0x63,0x00,0xff,0x69,0x6e,0x64,0x65,0x78,0x2e,0x68,0x74,0x6d,
 0x6c,0x2e,0x67,0x7a,0x00,0xe5,0x5d,0x7b,0x73,0xda,0xc6,0xd7,0xfe,0xbf,0x9f,0x42,0x51,0xd2,0x98,
 0x4c,0x0d,0x06,0x4c,0x1c,0x87,0xda,0xe4,0x4d,0x1c,0x27,0xe9,0x4c,0x6e,0x8d,0x7b,0x9b,0xe9,0x74,
 0x1c,0x21,0xad,0x40,0x8d,0x90,0xa8,0x24,0x8c,0xdd,0x4c,0xbe,0xfb,0xef,0xd9,0x8b,0xa4,0x95,0x58,
 0xdd,0x20,0x81,0xbc,0x29,0xcc,0x80,0x90,0xf6,0x9c,0x3d,0xf7,0x3d,0x7b,0xe5,0xe4,0x96,0xe5,0x9b,
 0xd1,0xcd,0x9c,0x68,0xd3,0x68,0xe6,0x8e,0xbe,0x3b,0xe1,0x5f,0x1a,0x5e,0x27,0x53,0x62,0x58,0xfc,
 0x92,0xfd,0x9c,0x91,0xc8,0xd0,0xcc,0xa9,0x11,0x84,0x24,0x3a,0xd5,0x17,0x91,0xdd,0x3e,0xd6,0xf3,
 0x8f,0x3d,0x63,0x46,0x4e,0xf5,0x2b,0x87,0x2c,0xe7,0x7e,0x10,0xe9,0x9a,0xe9,0x7b,0x11,0xf1,0x50,
 0x7c,0xe9,0x58,0xd1,0xf4,0xd4,0x22,0x57,0x8e,0x49,0xda,0xec,0xc7,0xbe,0xe3,0x39,0x91,0x63,0xb8,
 0xed,0xd0,0x34,0x5c,0x72,0xda,0x93,0x71,0x45,0x4e,0xe4,0x92,0xd1,0xf9,0xc5,0xdb,0xc3,0xbe,0xf6,
 0xe6,0xb7,0xfe,0xe0,0xa8,0x7b,0x72,0xc0,0xef,0xa5,0x65,0xc2,0xe8,0x46,0xfe,0x4d,0x5f,0x63,0xdf,
 0xba,0xd1,0x3e,0x66,0x6e,0xd1,0x97,0x0d,0x22,0xda,0xb6,0x31,0x73,0xdc,0x9b,0xa1,0xf6,0x38,0x40,
 0x9d,0xfb,0x2f,0x88,0x7b,0x45,0x22,0xc7,0x34,0xf6,0x43,0xc3,0x0b,0xdb,0x21,0x09,0x1c,0xfb,0xc7,
 0x15,0xc0,0xb1,0x61,0x7e,0x98,0x04,0xfe,0xc2,0xb3,0x86,0xda,0xed,0xde,0x31,0x7d,0xaf,0x16,0x32,
 0x7d,0xd7,0x0f,0xf0,0xfc,0xfc,0x19,0x7d,0xaf,0x3e,0x67,0xb5,0x87,0xce,0xbf,0x64,0xa8,0xf5,0x8e,
 0xe6,0xd7,0x99,0xe7,0x9f,0xbe,0xcb,0xfc,0x9c,0xf6,0x8b,0xa8,0x17,0xf0,0xc7,0xe5,0xf0,0x21,0x31,
 0x23,0xc7,0xf7,0x3a,0x33,0xc3,0xf1,0x14,0x98,0x2c,0x27,0x9c,0xbb,0x06,0x64,0x60,0xbb,0xa4,0x14,
 0xcf,0xed,0x19,0xf1,0x16,0xfb,0x15,0xd8,0x28,0x92,0xb6,0xe5,0x04,0xbc,0xd4,0x90,0xca,0x61,0x31,
 0xf3,0x2a,0xd1,0x96,0xd1,0xe5,0xf9,0x1e,0x51,0x08,0x90,0x56,0xb4,0x0c,0x8c,0x39,0x2d,0x40,0xbf,
 0x57,0x8b,0xcc,0x1c,0x8f,0x1b,0xd5,0x50,0x3b,0x1c,0x74,0xe7,0xd7,0x15,0xaa,0x3c,0x3c,0xa2,0xef,
 0xd5,0x42,0x73,0xc3,0xb2,0x1c,0x6f,0x32,0xd4,0x20,0x67,0x05,0x0a,0x3f,0xb0,0x48,0xd0,0x0e,0x0c,
 0xcb,0x59,0x84,0x43,0x6d,0xa0,0x2a,0x33,0x33,0x82,0x09,0x68,0x89,0x7c,0x10,0xdb,0xee,0x29,0x29,
 0x11,0x45,0x02,0x67,0x32,0x8d,0xa0,0xd2,0x95,0x32,0x79,0xa1,0x09,0x17,0xaa,0xd2,0x67,0xa9,0xdc,
 0xd4,0x52,0x33,0x5c,0x67,0xe2,0xb5,0x9d,0x88,0xcc,0xc0,0x4e,0x18,0x05,0x24,0x32,0xa7,0x65,0xa4,
 0xd8,0xce,0x64,0x11,0x10,0x05,0x21,0x89,0xdc,0x4a,0x18,0xc6,0xc3,0xd5,0x47,0xed,0x25,0x19,0x7f,
 0x70,0xa2,0xb6,0x90,0xc9,0x98,0xd8,0x7e,0x00,0x3b,0x57,0x94,0x8c,0x4b,0xb8,0xbe,0xf9,0xa1,0x1d,
 0x46,0x46,0x00,0xd9,0x55,0x23,0x34,0xec,0x88,0xc0,0x37,0xab,0xf0,0x11,0x6a,0x15,0xd5,0xd8,0x8a,
 0xab,0x15,0x05,0x1c,0xcf,0x75,0x3c,0x52,0x9f,0xbc,0xa2,0x7a,0xb3,0xe8,0x78,0xa9,0x1a,0x8a,0x71,
 0x66,0x93,0x32,0x2b,0x61,0xbc,0xae,0x56,0x26,0xfc,0xa6,0xd7,0xed,0x7e,0xbf,0xfa,0x70,0x4a,0xb8,
 0x99,0x1a,0x8b,0xc8,0xdf,0xdc,0x23,0x56,0xdc,0x2a,0xc7,0xc7,0xff,0xcd,0x88,0xe5,0x18,0x5a,0x4b,
 0x72,0xe7,0xe3,0x2e,0x6c,0xea,0x9e,0x66,0x78,0x96,0xd6,0xf2,0x03,0x07,0x8e,0x60,0xb0,0x70,0xe3,
 0xe2,0x0e,0x1a,0x8e,0x39,0xb9,0xa7,0x60,0xb9,0xc4,0x67,0x64,0x89,0xa8,0xdd,0xa6,0x66,0xc8,0xa9,
 0xe5,0x40,0x0a,0x1e,0x2b,0xf5,0x55,0x47,0x67,0x5c,0xb0,0x20,0xb1,0x4c,0x77,0x71,0xa1,0x58,0x87,
 0x68,0x66,0xcd,0x16,0x8a,0x5e,0x4d,0xb5,0xb6,0x46,0xa3,0xe4,0x3d,0x35,0x8c,0x40,0xaa,0x56,0x79,
 0xde,0x28,0x1a,0xb0,0xab,0x66,0x35,0x8d,0x1d,0xfc,0xad,0xb2,0xa1,0x8a,0x28,0xd2,0x2c,0x92,0x34,
 0x88,0x26,0x8d,0x22,0x4a,0xed,0xa8,0xd2,0x28,0xb2,0x34,0x89,0x2e,0x0d,0x22,0x4c,0xad,0x28,0xc3,
 0xd5,0x59,0x9d,0x6f,0xdc,0x1e,0x2f,0xa2,0xc8,0xf7,0xc2,0x8d,0x9a,0xa8,0x22,0x3f,0xfb,0x7b,0x11,
 0x46,0x8e,0x7d,0xd3,0x16,0x2e,0x0d,0x3f,0x9b,0x1b,0x48,0x21,0xc7,0x24,0x5a,0x12,0x52,0x9e,0x6e,
 0x78,0xc6,0x15,0xe2,0xce,0x64,0xe2,0xaa,0x6c,0xcf,0x5c,0x04,0x21,0xcd,0xdb,0xe6,0xbe,0x03,0xc4,
 0xc1,0x6a,0xc5,0x59,0x1f,0x2c,0xad,0x88,0x57,0x02,0xcd,0x04,0xdb,0xa9,0xc8,0x76,0x55,0xb2,0xfe,
 0x9c,0x15,0xa5,0xa2,0x6b,0x9b,0x63,0x45,0x5d,0xfe,0x22,0xa2,0x56,0xa3,0xb4,0x2d,0x1f,0x0a,0x72,
 0x22,0x54,0xa3,0x78,0x26,0x62,0x8b,0xe2,0x49,0x1c,0x54,0x4a,0x1b,0xba,0x2c,0x5d,0x43,0x73,0x4a,
 0xcc,0x0f,0xc4,0xfa,0xa1,0x32,0xb1,0xac,0x4a,0x78,0x3b,0x8e,0x37,0x5f,0x44,0x6d,0x9a,0x20,0xce,
 0xbf,0x88,0x15,0x33,0x17,0x8b,0x59,0xec,0xf7,0xcb,0xd2,0xa4,0xfb,0xf3,0xeb,0x72,0x21,0xc8,0xc4,
 0x8e,0x5c,0x63,0x4c,0xdc,0x32,0x92,0x85,0x7b,0x17,0x34,0x24,0x22,0xfa,0x16,0x67,0xa3,0xb9,0xec,
 0x7a,0xf0,0xe0,0xfb,0xda,0x72,0x64,0xd7,0xfb,0x99,0x5b,0x21,0x71,0x11,0x32,0x8a,0x3a,0x13,0x28,
 0xb3,0x04,0x0d,0xa5,0x15,0x04,0x86,0x37,0x21,0x88,0x6e,0xd7,0xfb,0xf1,0x65,0x79,0x57,0xa7,0x16,
 0xfb,0xb4,0xf1,0x81,0xd8,0x4b,0x2b,0x76,0x89,0xad,0x26,0xdc,0x37,0x20,0x38,0xfa,0xb4,0x34,0xb5,
 0xe1,0x21,0x72,0x8d,0xf4,0x4c,0x32,0x8b,0x52,0xfa,0x7b,0x4a,0xa3,0xe2,0x19,0x9a,0xd2,0xe1,0xb2,
 0x26,0xa9,0xec,0xf1,0x54,0x46,0x94,0xb8,0xef,0x6b,0xdb,0x55,0xbd,0x67,0xdb,0x3e,0xec,0x1e,0x0e,
 0x2a,0x53,0x48,0x25,0x97,0xb9,0x1e,0xb4,0x22,0xe2,0x24,0xd1,0xa8,0x5a,0x05,0xc3,0xa9,0x7f,0x45,
 0x54,0x71,0x3a,0x47,0xee,0xe0,0xe1,0xc0,0xaa,0x81,0xcd,0x40,0x0b,0x78,0xa5,0x6a,0x5f,0xb2,0xe8,
 0xfa,0x3d,0xb3,0x5f,0x6a,0xd8,0x1c,0x5d,0x07,0xd6,0x60,0x8c,0x5d,0x62,0x95,0x84,0x77,0x8b,0xd8,
 0xc6,0xc2,0xcd,0x59,0xdb,0x4a,0x8d,0x46,0x97,0xbe,0xcb,0x6a,0x64,0x7e,0xf9,0x27,0x1d,0xfa,0x39,
 0x65,0x9e,0xf4,0x97,0xa2,0xce,0x38,0x9b,0x30,0xe6,0x73,0x62,0xa0,0x94,0x09,0x19,0xab,0x3b,0xe9,
 0xb5,0x7a,0x11,0xea,0xc0,0x57,0xab,0x6b,0x5e,0x69,0x8a,0x49,0x7e,0xd8,0x88,0xe7,0xa1,0xed,0x9b,
 0x0b,0x55,0x63,0x5a,0xcf,0xa4,0x56,0xf1,0x0d,0x63,0x91,0x85,0xae,0xc3,0x0c,0x7b,0xe1,0x79,0x54,
 0xa3,0xed,0x28,0x00,0x9b,0x8a,0x8a,0xea,0x09,0x6e,0x2d,0xef,0xcc,0x08,0xb6,0x68,0x78,0x2a,0xe7,
 0x80,0x8a,0x40,0x91,0xc4,0x10,0x2d,0xf4,0xc1,0x54,0x8c,0x6a,0x33,0xb9,0x44,0xd3,0xc5,0x4c,0x95,
 0x58,0xc4,0x95,0xf5,0xd0,0x0a,0xf2,0xea,0x82,0xc9,0xd8,0x68,0x75,0xf7,0xbb,0xfb,0x87,0xf8,0x50,
 0x74,0x59,0xca,0x8d,0x4b,0x88,0xb7,0xc0,0xf2,0x72,0xc1,0xa7,0x7a,0xe4,0xa8,0x28,0x8c,0x55,0xea,
 0xa2,0xbe,0x27,0x65,0x87,0x90,0x7a,0x9d,0x8a,0x86,0xa9,0xc0,0xa4,0x9b,0x1b,0xa2,0xc2,0x5a,0x9a,
 0xaa,0x78,0xe6,0xff,0x0b,0x61,0xd2,0x56,0xf9,0x3f,0x6f,0xed,0x92,0x28,0xbe,0x69,0x4b,0x6f,0x2c,
 0x97,0x70,0xd7,0xb6,0x81,0x31,0x86,0x42,0xf9,0x88,0x7c,0x06,0x14,0x7a,0xe8,0x66,0x06,0xe8,0x6f,
 0x16,0xe6,0x3c,0x52,0x99,0x35,0x64,0x60,0x3b,0xae,0xdb,0x76,0xfd,0x65,0x75,0x26,0x52,0x6e,0xc9,
 0x2b,0x76,0x5a,0x6d,0xf2,0xeb,0x52,0xbb,0x40,0xe4,0xfa,0x7f,0x41,0xed,0x7f,0xad,0x69,0x91,0x5c,
 0x63,0xbd,0x86,0x62,0x0d,0x7b,0xdc,0xac,0xa2,0x5a,0xa6,0xc4,0x33,0xc1,0xd2,0x3e,0x59,0xb8,0x74,
 0x30,0xe2,0xba,0x46,0xa7,0x6a,0xee,0x87,0x98,0x7b,0xa4,0xb3,0x56,0x01,0x71,0x31,0xa0,0x7c,0xa5,
 0x68,0x87,0x6b,0x74,0xd9,0x2b,0x3b,0x26,0x32,0x78,0x1d,0x4e,0x98,0xe8,0xbe,0x9e,0xe1,0x96,0x0e,
 0xcf,0x1d,0x8a,0x63,0xb5,0xda,0xac,0x2b,0xd2,0xfd,0xac,0x67,0xa8,0x0b,0x35,0x88,0xe8,0x71,0xd0,
 0x9e,0x04,0xe4,0xa6,0x06,0x33,0xfb,0xe2,0x7b,0xc8,0x87,0x88,0xd7,0x1f,0x3b,0x60,0x0d,0x80,0xb0,
 0xa2,0xce,0x20,0xac,0x51,0x75,0x71,0x95,0x75,0xec,0x31,0x19,0x00,0xd5,0xf5,0x1a,0xe1,0xa6,0xa4,
 0x09,0x55,0x9b,0x6a,0xdc,0xfa,0x2a,0x1f,0xd2,0xe1,0x8d,0x82,0xf9,0x1d,0x96,0xa7,0x1e,0x96,0x47,
 0xb7,0x58,0x45,0x74,0x9c,0xa0,0x32,0x72,0x24,0xa3,0x7a,0xc5,0xd6,0xa7,0xc4,0x4c,0xa3,0x67,0x63,
 0xe4,0xc5,0x2a,0x89,0xd3,0x67,0xa6,0x66,0x94,0x99,0x89,0x26,0x1f,0xea,0x21,0x7f,0xb4,0xfa,0x10,
 0x93,0xa2,0xc1,0x28,0x29,0x5c,0x3e,0x8e,0x5e,0x30,0x2c,0xb6,0xda,0x64,0x15,0x76,0x90,0xe5,0x58,
 0xa4,0x54,0x54,0xb9,0x57,0x96,0x45,0x98,0xd5,0x31,0x9a,0xf2,0x31,0xc0,0x99,0x81,0xb4,0x97,0x9a,
 0x2b,0x16,0x0e,0x28,0xf5,0x57,0xc7,0xdc,0xa5,0x41,0xc7,0xde,0x11,0xc2,0x4c,0x69,0x95,0xa6,0xeb,
 0x87,0xe5,0x7e,0x65,0x8c,0x21,0xbf,0x45,0xa4,0xa8,0x48,0x0c,0x7d,0x2a,0x47,0x9e,0x98,0x71,0x2b,
 0x9f,0xd4,0x6a,0xba,0x4b,0x7d,0xaa,0xdc,0x1d,0x73,0x32,0x47,0x52,0xac,0x0c,0x93,0x65,0xe3,0x6f,
 0x11,0xb9,0x46,0x7f,0x93,0x4e,0x51,0x62,0xee,0x0f,0x91,0x43,0x15,0x46,0x33,0x8d,0x1c,0x5d,0x5e,
 0xb2,0x51,0xc2,0xdf,0x99,0x3a,0x96,0x45,0x4a,0x47,0x39,0x69,0x9f,0xb7,0x08,0xc5,0xc9,0x81,0xb4,
 0xa6,0xe7,0xe4,0x20,0x5d,0x7e,0x74,0x42,0x17,0xf6,0xc8,0x4b,0x7f,0xf8,0xbc,0x93,0x66,0xba,0x46,
 0x18,0x9e,0xea,0x74,0x81,0x8a,0xb4,0x7a,0x88,0x15,0xb1,0x9c,0x2b,0xcd,0xb1,0x4e,0x75,0xd7,0x9f,
 0xf8,0xb9,0x67,0xc9,0x73,0x01,0x4e,0x83,0x9b,0x3e,0x3a,0xe1,0x23,0xe9,0x70,0xde,0x53,0x3d,0x33,
 0xcb,0xa0,0x33,0x3c,0xe9,0x2d,0x7d,0x74,0xf7,0xf6,0xc3,0x07,0x0f,0x8e,0x7e,0xbc,0xeb,0x8d,0xc3,
 0xb9,0xf8,0xfc,0x85,0x4f,0x33,0x61,0xad,0xd2,0xd1,0x00,0x39,0x2e,0x89,0x22,0x0c,0xcb,0x86,0x72,
 0x09,0xfe,0x79,0x72,0xc0,0xaa,0x19,0x9d,0x1c,0x80,0x80,0x06,0x64,0x51,0x12,0xd2,0x59,0x26,0x4a,
 0x42,0xaf,0x7f,0xdc,0x1f,0x3c,0xd8,0x0c,0x37,0x4f,0x37,0x28,0x6e,0xcc,0x28,0xe9,0x1a,0x4b,0xd9,
 0x74,0x16,0x21,0xc7,0xfe,0x35,0x16,0x6f,0xf1,0xc2,0x62,0xc0,0xb1,0x4d,0x87,0x3a,0x21,0x74,0xae,
 0x63,0x3c,0xe5,0x91,0x14,0x2b,0xc1,0x3c,0x71,0x99,0x15,0x22,0x43,0x29,0xd1,0x4d,0x7f,0x0b,0xba,
 0x1f,0x0e,0x2a,0x29,0x56,0xdd,0x8a,0x75,0x2a,0x5a,0xc2,0x22,0xb5,0xd2,0x22,0x21,0x82,0xfb,0xd8,
 0x80,0xa0,0x94,0x33,0x9f,0x82,0xf1,0x3c,0xbf,0x59,0x3d,0x53,0xd5,0x17,0x80,0xa3,0x10,0x2b,0x4c,
 0xa7,0x9d,0x0a,0xca,0xe4,0x25,0x2e,0xcd,0x82,0xf0,0x8a,0xec,0x00,0x4b,0xe5,0x68,0xbc,0x16,0x37,
 0x8b,0xd1,0x30,0x54,0xb2,0x60,0x63,0x48,0x7d,0xf4,0x8e,0xb0,0xa8,0x06,0xb5,0xc4,0xa2,0x2c,0xc7,
 0x22,0x1a,0x9a,0x4c,0xfd,0x05,0x7a,0xae,0x20,0x88,0xa1,0xf3,0xe7,0xcc,0x22,0xae,0x0c,0x77,0x01,
 0x41,0xf6,0xba,0xfa,0xe8,0xd7,0x3f,0x9e,0x3f,0x6e,0x21,0x5e,0x77,0xaf,0x7b,0xfd,0x6e,0xf7,0xde,
 0xc9,0x01,0x2f,0xd2,0x18,0xd7,0x43,0x7d,0x74,0xc1,0x50,0xf5,0x8f,0x81,0xaa,0xdb,0x1f,0xac,0x8f,
 0x0a,0x8b,0x14,0x19,0x26,0x20,0xb9,0x7e,0x70,0x74,0xbc,0x3e,0xa2,0x07,0xa0,0xe9,0x37,0x60,0xc2,
 0x92,0x94,0x6b,0x70,0xb8,0x3e,0xa2,0x23,0x7d,0x44,0xf1,0x20,0x52,0x5c,0x0f,0x8e,0x37,0xc0,0x73,
 0x5f,0x17,0x99,0x03,0xf5,0xc2,0xf8,0x4a,0x1f,0x9d,0xfd,0xf4,0xac,0x35,0x00,0x8d,0xfd,0x87,0x47,
 0xeb,0xe3,0x1e,0xe8,0xa3,0x9f,0x29,0x91,0x87,0x7d,0x20,0x1a,0x6c,0x40,0xe4,0xa1,0x3e,0x7a,0xc1,
 0x30,0x01,0xcb,0x75,0xef,0xc1,0x06,0x24,0xc1,0xbc,0x7e,0x66,0x98,0x60,0x5f,0xd4,0xbc,0x6a,0x62,
 0x42,0xab,0xc2,0x44,0x53,0xe2,0xa7,0xea,0x80,0x59,0xcb,0x8d,0xff,0x59,0xa0,0x85,0x8d,0x6e,0x1a,
 0x3b,0xb1,0x80,0x03,0x4b,0xfc,0xa2,0x9e,0xff,0x4a,0x94,0x24,0xb3,0x9f,0xfa,0xa8,0x87,0xd5,0xb1,
 0xa5,0x1c,0xac,0xc4,0x3c,0x06,0x9c,0x61,0x40,0xa7,0x09,0x17,0xf3,0x61,0xba,0x66,0x08,0x36,0x7a,
 0xa8,0x4b,0x7e,0xbd,0x56,0x88,0x50,0x50,0x6b,0x5c,0xeb,0xa3,0xa3,0xc3,0x2a,0x79,0x6f,0xa0,0x8e,
 0x31,0xcb,0xe6,0x3c,0x12,0x86,0x8d,0x35,0x92,0x82,0xea,0xa3,0x27,0xc9,0xf5,0x26,0x7a,0x69,0xf7,
 0x37,0xd0,0x8b,0x44,0x0e,0x57,0x4d,0xbb,0x2f,0x54,0x83,0xef,0xc4,0x23,0x3e,0xa7,0x62,0xaa,0xa8,
 0xdd,0x44,0x2f,0xb4,0xc9,0x0e,0x8c,0x30,0xbe,0x57,0x5f,0x2b,0x31,0x20,0xc2,0x9a,0xb8,0xda,0x99,
 0x46,0x12,0x52,0xbe,0x01,0x7d,0x84,0x46,0xb4,0x08,0xd8,0x4a,0xca,0xc6,0x1a,0x49,0x41,0xd1,0x1e,
 0x26,0xd7,0x3b,0xd3,0x8a,0x44,0xce,0xb7,0xa0,0x97,0x39,0x31,0xb1,0x3f,0xe1,0x92,0xd8,0x36,0x9a,
 0xac,0xe6,0xba,0xc9,0x80,0x43,0x3f,0xfc,0xb7,0x76,0xce,0x7e,0x37,0xce,0x11,0x73,0xe8,0x3e,0x57,
 0xa2,0x08,0x75,0xa8,0xf2,0x96,0xd7,0x7e,0x42,0xe7,0x9a,0x19,0x02,0xf6,0x90,0xbc,0x26,0x13,0x36,
 0xa0,0xb0,0x36,0x8e,0xbe,0x3e,0x7a,0x1e,0x18,0x37,0x6c,0x53,0xca,0x26,0x49,0xcf,0x3b,0x2c,0xe2,
 0xf8,0x05,0x3d,0xe6,0x4d,0x32,0xb0,0xe7,0x01,0x96,0x38,0x6e,0x86,0xe5,0x3e,0x1a,0x33,0x5c,0x6c,
 0x86,0x04,0x09,0xeb,0x05,0x99,0x3b,0xc6,0xd7,0x90,0x70,0x19,0xcb,0x71,0x63,0xb7,0x00,0x8c,0x3e,
 0x7a,0xfc,0xfb,0x93,0xc6,0x41,0x8a,0x0f,0xcb,0xd7,0xb1,0xf0,0xb4,0x2b,0x4d,0x2b,0xab,0xd7,0x95,
 0x96,0xfa,0xd0,0x49,0x0f,0xba,0xba,0x26,0xce,0x57,0x4c,0x20,0x1b,0xc5,0xd4,0x25,0x36,0xeb,0xf1,
 0xf8,0xe5,0x22,0x18,0x88,0xb8,0x9c,0x60,0x40,0x66,0x1d,0x25,0x31,0x40,0xa6,0x29,0xed,0x39,0xae,
 0xb6,0xa5,0x2e,0x5e,0xed,0xce,0x74,0x26,0xb8,0xde,0xb5,0xe2,0x40,0xc8,0xcc,0xb7,0x9a,0x0f,0x47,
 0x08,0x38,0x7d,0x04,0xad,0xbd,0xc2,0x45,0xe3,0x56,0x26,0x46,0xf0,0x85,0x9b,0x97,0xc7,0xd8,0xad,
 0xb0,0x49,0xcb,0x72,0x81,0x05,0x34,0xe8,0xa6,0xad,0xdf,0xac,0x9c,0xb9,0xfe,0xc2,0x5a,0x1f,0x03,
 0xda,0x94,0x37,0xb6,0x8d,0xed,0x93,0x9b,0xb4,0x28,0x2f,0xfc,0x59,0x4d,0xf8,0x2f,0x1c,0xc5,0x89,
 0xd9,0x3c,0x40,0x10,0x13,0x5a,0x3c,0x3f,0xd3,0x2e,0xce,0x5f,0x5f,0xbc,0x79,0xb7,0x9d,0xe8,0x80,
 0x3a,0x77,0x14,0x18,0x28,0xb7,0x3b,0x0f,0xe6,0xc4,0xec,0xaf,0xa3,0x27,0x58,0x3b,0x55,0xd4,0xd3,
 0x8b,0xb7,0xdb,0xd2,0x12,0x92,0xfd,0x5d,0xa9,0x09,0xcc,0xee,0x5e,0x4f,0x97,0x2e,0xb9,0x22,0xee,
 0x1a,0xba,0xe2,0x80,0x54,0x5f,0xda,0x4b,0x7a,0xb5,0xb3,0x8e,0x5c,0x42,0xca,0x37,0xd0,0x8d,0x83,
 0x55,0x5c,0x32,0xa2,0xd7,0x71,0x1e,0x0e,0xa9,0x8f,0xce,0xaf,0x31,0x7d,0x89,0x8d,0x73,0x9b,0x68,
 0x64,0x93,0x91,0xc1,0x94,0x14,0xae,0x91,0x78,0x68,0x90,0x8e,0xec,0x27,0x3a,0xe9,0x77,0x07,0x9f,
 0x55,0x2b,0x14,0xf9,0x97,0x54,0xcc,0x64,0x8d,0x76,0x67,0x42,0xdb,0x9d,0xe7,0x67,0xdb,0x09,0x65,
 0xa8,0x6c,0x47,0x91,0x8c,0xb2,0xb9,0xbb,0x40,0x96,0xcc,0x2b,0x0a,0x29,0xac,0xd9,0x89,0x10,0x80,
 0xe8,0x3b,0xaf,0xd3,0x81,0x90,0x07,0xd5,0xaf,0x37,0x71,0x9d,0x98,0x8c,0xac,0xe7,0x1c,0xa6,0x7e,
 0x83,0xb9,0x9b,0xcf,0xe8,0x35,0x87,0x95,0xd4,0x6e,0xe2,0x34,0x94,0x13,0x93,0x38,0x58,0x2b,0x30,
 0x69,0xac,0x10,0x09,0x96,0xeb,0x44,0x3b,0xe3,0xbf,0x36,0xd1,0x4d,0x7f,0x13,0xdd,0xc8,0x14,0x65,
 0xd5,0x73,0xf4,0x85,0x5a,0x1a,0x4c,0x62,0x7e,0x49,0xf5,0x8c,0xe7,0xcd,0x63,0x1a,0x60,0x30,0x30,
 0xf4,0x76,0x3b,0x31,0x8d,0x56,0x56,0x33,0xa6,0x6d,0x14,0xc1,0x18,0x53,0x3b,0xef,0x46,0xaf,0xa1,
 0x0d,0xc0,0xa0,0xfb,0xbc,0x25,0x6d,0xd0,0xca,0x76,0xd3,0xc2,0x30,0x36,0x77,0xad,0x9f,0xc0,0x58,
 0x5e,0x4e,0x66,0x46,0x63,0x1d,0x09,0x38,0x0c,0xec,0x1a,0x4b,0xed,0xf9,0xab,0xc7,0x5b,0xd1,0x55,
 0x5c,0xe9,0x6e,0xf4,0x95,0xb0,0xbc,0x6b,0x9d,0xb9,0xc4,0x6b,0xee,0x54,0x14,0x48,0x1f,0xbd,0x24,
 0x38,0x97,0xe0,0xcc,0x0f,0xc4,0x31,0x45,0x5b,0xd1,0x1a,0xab,0x79,0x37,0x2a,0xe3,0x4c,0xef,0x5a,
 0x5f,0xd3,0x99,0x13,0x04,0x7e,0xd0,0x58,0x65,0x02,0x0e,0xc3,0x54,0xed,0x57,0xec,0x6a,0x2b,0xea,
 0x8a,0x6b,0xdd,0x8d,0xc6,0x12,0x9e,0x77,0xad,0xb4,0x2b,0xdb,0x75,0xe6,0x8d,0x55,0xc6,0xa0,0xb0,
 0x9e,0xa9,0xfd,0x0c,0xdf,0x5b,0x51,0x17,0xaf,0x71,0x37,0xca,0x12,0xdc,0xee,0x5a,0x55,0x96,0xb9,
 0x6c,0xac,0x28,0xc0,0xe8,0xa3,0xa7,0x67,0xbf,0x6b,0xad,0xa7,0xfe,0x12,0x1b,0x17,0xfe,0x25,0xda,
 0xf9,0x6b,0x2c,0xa1,0xda,0x82,0xc6,0x68,0xd5,0xbb,0xd1,0x17,0x63,0x7a,0xd7,0xda,0x62,0x8b,0xb4,
 0xb1,0x18,0x75,0x8d,0xb5,0x2f,0x1c,0x90,0xae,0x7d,0xc1,0x95,0xf6,0xc4,0xd8,0x4e,0x40,0x4c,0xea,
 0xdd,0x46,0xd2,0x9e,0x32,0xb9,0x6b,0x3d,0xd9,0x38,0x57,0xe8,0xd2,0x22,0xd1,0x3a,0x0b,0x2f,0x24,
 0x58,0x7d,0xf4,0x0c,0x3f,0xb4,0xa7,0xec,0xc7,0xb6,0x52,0x0e,0xb9,0xfe,0x6d,0x68,0x2d,0xc3,0xef,
 0x57,0xa1,0x38,0x24,0x78,0xfe,0xc4,0x5b,0x6b,0x3d,0x75,0x06,0x5c,0xa8,0xef,0x1d,0xff,0xbd,0x5d,
 0x05,0xa6,0x44,0x6c,0x4d,0x87,0x12,0xdf,0xdb,0x50,0x63,0xbc,0x73,0x83,0x0d,0x0b,0xf0,0x53,0xc3,
 0xaa,0x34,0x25,0x4e,0xce,0x61,0x43,0x37,0x04,0x5b,0x9c,0x22,0xec,0x20,0xc5,0x50,0x12,0x89,0xb4,
 0x0b,0x7a,0x79,0x72,0xc0,0x0b,0xd4,0xc7,0x92,0xee,0xa3,0x20,0xc6,0x0c,0xf3,0xba,0xf4,0x3c,0x35,
 0xe0,0xa2,0xbf,0x9a,0x23,0x63,0x42,0x24,0x5e,0xe0,0x83,0xa8,0x44,0x49,0xe2,0x10,0x17,0x9d,0x6e,
 0x7b,0x61,0x57,0xd2,0xbd,0xd1,0x39,0x2b,0xac,0x51,0x2b,0xab,0xae,0x8e,0xce,0xc2,0x32,0x89,0x15,
 0xec,0x44,0x38,0xc0,0x56,0x04,0xc5,0x36,0x88,0x82,0x1d,0x20,0xfc,0x20,0xbe,0x02,0x54,0xc9,0xd6,
 0x09,0x26,0x89,0x74,0xff,0x56,0xc2,0x56,0x7e,0x5f,0x97,0x18,0xb0,0xad,0xe7,0xb4,0x6c,0x87,0x96,
 0x68,0x0f,0xe9,0x65,0x22,0xfe,0x3f,0xaa,0x4c,0x86,0x9e,0x92,0x98,0xd2,0x85,0xb9,0xfd,0xc0,0x3c,
 0xd5,0x8b,0x76,0x66,0x14,0x30,0x7e,0xa0,0xe2,0x3c,0x57,0x58,0x21,0xea,0x93,0xd0,0x0c,0x9c,0x39,
 0xa6,0xc0,0x71,0x46,0xf2,0x02,0x9b,0x3d,0xa2,0x0e,0xce,0x5b,0x3a,0xbf,0xc2,0xc5,0x4b,0x27,0xc4,
 0x16,0x14,0x12,0xb4,0xf6,0x9e,0xbe,0x79,0x45,0x57,0xa6,0xd2,0x7b,0xbe,0x61,0x11,0x6b,0x6f,0x5f,
 0xb3,0xb1,0x23,0x86,0x59,0x79,0x0b,0xf3,0x59,0x5e,0xc4,0x4f,0xa8,0xbc,0x32,0x02,0x6c,0x1a,0x0b,
 0xc9,0x0b,0x3f,0x8c,0xb4,0x53,0x2d,0xc1,0x88,0xcd,0xa5,0x6c,0xf5,0x62,0x07,0xa7,0x5b,0xe2,0xdc,
 0x0f,0x51,0x92,0x33,0xfb,0x6b,0xe0,0xa2,0x68,0x02,0xf5,0x83,0xb6,0x37,0x3c,0xee,0xed,0xd1,0x0d,
 0x53,0xd0,0x02,0x6e,0x40,0x03,0x04,0x05,0xe0,0xdf,0xa7,0x23,0xb1,0xe9,0x8a,0xb8,0xd8,0x0c,0x07,
 0x89,0x53,0x02,0x29,0xb5,0xad,0x3d,0xae,0xa6,0x3d,0xba,0x01,0x91,0x1e,0xe6,0xc7,0x21,0xc3,0xa9,
 0xbf,0x2c,0x83,0x0c,0xc8,0x0c,0xc7,0x24,0xe5,0x80,0x13,0x68,0x61,0xcc,0x95,0x55,0xc7,0x46,0xcf,
 0xe0,0x59,0x81,0xe4,0x7c,0xa3,0x53,0x6c,0x90,0x5c,0xd0,0x9d,0x60,0x12,0x5a,0xc2,0x0e,0x28,0xa9,
 0x43,0x56,0x29,0x62,0xdb,0x70,0xc3,0x1c,0xe6,0xc5,0xdc,0xc2,0x4e,0xcc,0xdf,0xe8,0xe0,0x2e,0x0a,
 0xb4,0x88,0xbb,0xcf,0x47,0x7a,0xf7,0xc5,0x93,0x77,0xc0,0x1b,0xe1,0x28,0xd1,0xa4,0x56,0xf9,0x36,
 0x20,0xb2,0x3f,0x4f,0x35,0x6f,0x01,0x0f,0x7e,0xc4,0x58,0xd0,0x86,0x99,0xa7,0x0c,0xda,0x45,0x70,
 0x12,0xa7,0x5b,0xb3,0x3a,0xd9,0x4d,0xc7,0xa6,0x15,0x77,0xd8,0x59,0xdb,0xa7,0xc0,0xb1,0x17,0x07,
 0xf7,0xbd,0xf4,0x08,0x53,0x19,0x88,0xc9,0xa1,0x23,0xd2,0x60,0xf1,0x9c,0x11,0x8d,0x07,0xb7,0x6e,
 0xb1,0x2b,0x71,0x37,0x2d,0x86,0x47,0xe9,0x83,0x4f,0x78,0x20,0xed,0x8a,0x5c,0xc5,0x9d,0xc3,0x11,
 0x23,0x97,0x30,0xf0,0xbd,0x79,0x94,0xf2,0x8c,0x04,0xee,0xde,0xcd,0x62,0xbb,0x05,0x76,0x18,0x54,
 0xca,0x09,0x2f,0x0f,0xcf,0x80,0xe7,0x81,0x6d,0xb1,0x57,0x56,0x90,0xe4,0xd8,0xad,0x5b,0x19,0xc1,
 0x27,0x34,0xda,0x54,0x44,0xd8,0xe6,0x4a,0x05,0xc4,0x96,0x40,0x24,0x8f,0x62,0xe6,0x1f,0x31,0xab,
 0x6f,0x11,0x31,0x39,0x7a,0x0f,0xf2,0xa7,0xc6,0x9c,0xde,0x10,0xe5,0xd3,0xaa,0x64,0x8c,0x98,0xe3,
 0x92,0x30,0x52,0xc6,0x72,0x74,0xb3,0xed,0xb8,0x14,0x1f,0x9d,0x26,0x10,0x53,0x15,0xf2,0xde,0x5d,
 0x56,0x39,0xd0,0xd0,0xa9,0x8c,0xf4,0x7e,0x4e,0xd4,0x49,0xc1,0x02,0x24,0xac,0x82,0x55,0x24,0xa5,
 0x94,0xc7,0xeb,0xc4,0x14,0x02,0x61,0xe8,0x96,0x63,0x2a,0x0a,0x56,0x2b,0x2e,0xcb,0x50,0xe5,0xda,
 0x7d,0x05,0x42,0xee,0x88,0x2d,0xde,0xac,0x3d,0x61,0x4d,0x14,0x45,0x2e,0x7c,0x2c,0x7b,0x3f,0xae,
 0x49,0x18,0x8c,0x30,0x9a,0x24,0x04,0xca,0x76,0x40,0xed,0x3f,0x96,0x34,0x75,0x91,0xd4,0xd0,0xc4,
 0xf1,0x07,0xb1,0x7f,0xa4,0xea,0x30,0x11,0xfb,0x24,0x4f,0x19,0xe6,0x48,0x95,0x5d,0x04,0x74,0xf7,
 0x40,0x64,0x7a,0xa0,0xc1,0x18,0x21,0x34,0x3e,0xe5,0x92,0xe3,0x61,0x73,0x32,0x09,0x12,0x7e,0x8f,
 0xaf,0x72,0x6a,0x63,0x5b,0xaa,0x1a,0xbb,0xec,0x24,0x2a,0x9c,0xbc,0x05,0xcf,0x23,0x5d,0x8c,0x67,
 0x4e,0xa4,0x40,0xb8,0x87,0xf0,0xad,0xc2,0x25,0xf2,0xba,0x14,0x00,0x67,0x09,0x2f,0x02,0x7e,0xbc,
 0xa9,0xf0,0x42,0x1e,0xc9,0xfe,0x59,0x90,0xe0,0x06,0x88,0xde,0xdf,0xf9,0x18,0xb7,0x0b,0x9f,0x0e,
 0xd8,0xce,0x04,0xdf,0x7d,0x84,0x96,0xe3,0xf4,0xce,0x47,0xa6,0xea,0x4f,0x77,0x51,0x25,0x7e,0xb0,
 0x8a,0x3f,0xbd,0xe7,0x28,0x6c,0x7a,0x40,0x71,0x8b,0xa1,0x88,0xf5,0xd6,0x89,0xa6,0xc4,0x6b,0x05,
 0x24,0x9c,0x03,0x3d,0x28,0x8c,0x03,0x60,0x5c,0xa3,0xef,0x12,0x34,0x51,0x93,0xd6,0xfb,0x80,0x00,
 0x0e,0x04,0x44,0xbe,0x76,0xe7,0x23,0x43,0xf1,0x09,0x07,0xfb,0x7a,0x4e,0x38,0x25,0xd6,0x3e,0xda,
 0x2b,0x2c,0xc3,0xc7,0x3e,0xe5,0x3b,0x1f,0x63,0x54,0x1d,0x7e,0xeb,0xd3,0xfb,0xc4,0x42,0x92,0x46,
 0x24,0x6e,0xfb,0xd8,0x83,0x0e,0xc3,0x75,0xc1,0xb4,0xe0,0x07,0x8f,0x5d,0xb7,0xb5,0xc7,0xb7,0x73,
 0x8b,0xd8,0xde,0x41,0xae,0x7a,0x6e,0x80,0x6c,0xb9,0x51,0x60,0xf1,0xca,0xf7,0x4c,0xd7,0xc1,0x49,
 0x42,0x08,0xe8,0x52,0xe4,0x4e,0x7c,0x0f,0x25,0xf8,0xf1,0x3c,0xaf,0xb1,0xb8,0x30,0x67,0xa6,0xf7,
 0x28,0x19,0x07,0x07,0x90,0xb2,0x61,0xc5,0xa1,0x8c,0xeb,0x88,0x9e,0xe3,0xc0,0xc5,0x94,0x91,0x30,
 0x67,0x46,0xf0,0xc2,0x65,0x96,0xb6,0xf2,0x31,0xcb,0xa9,0xd9,0x72,0xed,0xe1,0x4b,0xc8,0xe2,0xef,
 0xd0,0xf7,0x5a,0x1c,0x98,0x89,0x61,0x15,0x07,0xad,0x40,0x42,0x90,0x11,0x51,0x91,0x98,0xb2,0x9d,
 0x01,0x21,0xaf,0x12,0x99,0xa5,0x71,0x99,0x85,0x6d,0xd6,0x0c,0xb2,0x7a,0xff,0x64,0x26,0xf3,0x17,
 0x32,0x17,0xda,0x74,0x4a,0x11,0x29,0x21,0x39,0x69,0x49,0xe9,0x5f,0x3b,0xc8,0xe9,0x0b,0x52,0xf2,
 0x73,0x97,0xd0,0xcb,0x27,0x37,0x3f,0xa1,0xc9,0xe7,0x89,0x0b,0xa3,0x25,0x05,0xa0,0x09,0x12,0xcf,
 0x19,0x2b,0x21,0xd3,0xfc,0x52,0xc2,0xc1,0x72,0x7e,0x1e,0x6f,0xca,0x30,0x24,0xdd,0x83,0x0c,0x28,
 0xc5,0x5a,0x0d,0x9b,0xe9,0x14,0x48,0xf0,0x72,0xac,0x2b,0x83,0x97,0xfa,0x01,0x12,0x34,0x33,0xe4,
 0x6a,0x60,0x39,0x23,0x96,0xa1,0xb1,0x43,0x37,0x30,0x9a,0xd0,0x2e,0x01,0xdb,0x48,0x9a,0xa6,0xb5,
 0x61,0xb1,0x39,0x1b,0xb0,0x92,0xd4,0xfc,0x39,0xef,0x11,0xe5,0xbc,0x6b,0xe9,0x78,0x96,0xbf,0x84,
 0x6f,0xfb,0xf3,0x96,0x68,0xd3,0x65,0x09,0xe3,0xb0,0x57,0x68,0xee,0xc5,0x2f,0xaf,0x5e,0xd2,0x58,
 0x27,0xf7,0xac,0x78,0xd8,0x93,0x39,0xca,0x96,0x55,0x6d,0x68,0xa7,0x30,0x52,0x12,0xc7,0x0e,0xbe,
 0x56,0x52,0x45,0x6d,0xac,0x83,0x7e,0x01,0x8f,0x8b,0x49,0xee,0x4c,0xdd,0x96,0x5e,0xbe,0xe7,0x74,
 0xd2,0x56,0x32,0x63,0x8d,0xdc,0xba,0xcb,0xe8,0xf7,0xe7,0xcd,0xc8,0x3f,0x56,0x92,0x8f,0x40,0xf3,
 0x38,0x8a,0xe0,0x8f,0x1a,0xf7,0xd4,0x90,0x06,0x51,0xd1,0xfb,0xc5,0x63,0xc9,0xba,0x0b,0x62,0x5a,
 0xaa,0x0e,0x11,0x44,0xb2,0x0c,0x4b,0x0d,0x81,0x31,0x47,0xe0,0x21,0x8f,0x2e,0xcd,0x31,0x62,0xff,
 0x53,0xb8,0x76,0x07,0x27,0x12,0xb7,0xee,0xa1,0x01,0x28,0x16,0x01,0x17,0x71,0x6a,0xa9,0x75,0x89,
 0x60,0x51,0xb6,0x00,0x9b,0x2c,0x28,0x35,0x3a,0xd9,0x3d,0xcf,0x59,0xbe,0x41,0xb3,0xd7,0x22,0x65,
 0xd0,0x7c,0x79,0x45,0x1d,0x34,0x7d,0xcb,0x20,0x48,0xe3,0xe7,0x0a,0xb1,0x45,0xe4,0xae,0xe4,0x6e,
 0x92,0x95,0xc5,0x11,0x3b,0x49,0x6a,0x52,0x97,0x2a,0x65,0x0a,0xce,0xf4,0xa6,0x3c,0x58,0x30,0x6f,
 0x4b,0x01,0x9c,0xf0,0x32,0x4d,0xe0,0x19,0x74,0x9c,0xd4,0x70,0x17,0xa3,0x8c,0xa6,0x65,0xc0,0x65,
 0x86,0x14,0x85,0x21,0x1e,0xf5,0xf7,0x44,0x53,0xc7,0x79,0xab,0x2a,0x1f,0x1f,0xc8,0x00,0x28,0x2d,
 0xe6,0x36,0xa3,0x8a,0xaf,0x42,0x87,0xf5,0x35,0x25,0x47,0xed,0x02,0xda,0xb3,0x1d,0x94,0x5c,0x46,
 0x9b,0x73,0x5b,0xd1,0xd0,0x6a,0xf4,0xc8,0x91,0x29,0xcd,0x21,0x85,0x23,0xd7,0xc9,0x65,0x94,0x8d,
 0x74,0x69,0x52,0xc3,0x6b,0x88,0xa9,0xcd,0x77,0xa4,0xb2,0x09,0xcc,0x19,0x4e,0xc7,0xf7,0x67,0x71,
 0x5c,0xe1,0xf7,0x68,0xaf,0x22,0x09,0x9a,0xe8,0x65,0x94,0x59,0x22,0x1e,0x4b,0x6d,0x86,0xe8,0x92,
 0x54,0x00,0x48,0x2b,0xf3,0x24,0x58,0xa9,0xab,0x53,0xda,0x46,0xe7,0xd7,0x92,0x31,0x14,0xc0,0xba,
 0xca,0xb9,0x42,0x4f,0x28,0xc7,0x05,0x40,0xcd,0x86,0x02,0xa5,0x2e,0x11,0x1b,0x45,0x41,0xdf,0x6d,
 0xb5,0xdf,0x96,0xb3,0xa6,0xa2,0xfe,0xda,0x6a,0x5f,0x2d,0xb1,0x32,0xc8,0x3a,0x5e,0xa3,0x9b,0x8a,
 0x90,0x94,0xcb,0x9b,0xc8,0xf2,0x8e,0xfb,0xac,0x15,0x10,0xf2,0x52,0x62,0x2e,0x2e,0x52,0x53,0x5c,
 0x44,0x88,0x8b,0x02,0xa4,0xdd,0xa4,0xea,0x0e,0x74,0x62,0xff,0xbf,0x3f,0x49,0x39,0x5b,0x8e,0x4b,
 0xe9,0x14,0x1d,0x54,0x89,0xbd,0x72,0x80,0xcc,0x7e,0x23,0xce,0xd6,0x72,0x5c,0x8f,0xad,0xb8,0x83,
 0x4b,0x01,0x52,0xb6,0xd4,0xdd,0xe0,0x98,0x95,0x64,0x3e,0x86,0xfd,0x97,0x4c,0x72,0xfa,0x49,0x3a,
 0xa6,0xc5,0x9e,0x57,0xa6,0x78,0xbc,0x98,0xc4,0x64,0xd2,0x91,0xae,0x04,0x4d,0x4a,0xca,0x59,0x5a,
 0x4c,0x47,0x29,0x74,0x5c,0x88,0xa7,0x68,0xc9,0xcf,0x5a,0xc2,0x4a,0x4a,0xa7,0x8e,0x93,0x22,0xe0,
 0xdd,0xd2,0x91,0x76,0x3f,0x3f,0x70,0xc3,0x3b,0x08,0x9c,0xd9,0x5c,0xb7,0x40,0x2e,0x90,0xb0,0x94,
 0x29,0x93,0x38,0x08,0x87,0x2f,0x22,0xb3,0x92,0x14,0xec,0xc0,0x0d,0xa2,0x96,0xfe,0xd6,0x25,0xb4,
 0x53,0x2d,0x76,0x8c,0xe1,0x74,0x13,0x0d,0x73,0xa1,0xfc,0xac,0x4a,0x74,0xb0,0xc4,0xf9,0x37,0x9a,
 0x38,0xc8,0x8d,0x0d,0x5d,0xd0,0x18,0x14,0x4d,0x9d,0x10,0x3d,0x39,0xba,0x3b,0x9c,0xdc,0xd2,0x93,
 0xb3,0xda,0x2a,0xd9,0xe3,0x5d,0x37,0x31,0x5c,0xb5,0x2a,0x4e,0x0e,0x93,0xca,0xf2,0x96,0xe0,0x71,
 0x25,0x10,0x95,0x0d,0x96,0x34,0x10,0x61,0xf2,0xf8,0xab,0x95,0xa2,0x9a,0x81,0x4a,0x41,0x26,0x60,
 0xa9,0x2c,0x53,0x5e,0x57,0xa4,0xa9,0x1a,0x91,0x2a,0xd1,0x28,0x1d,0x98,0x55,0x46,0xf9,0x62,0xad,
 0x70,0x89,0xf3,0x86,0x35,0x99,0x10,0x10,0xc3,0xff,0xfc,0x17,0x3f,0x84,0x0c,0xe7,0x92,0xd1,0x7f,
 0x48,0xfc,0x1f,0xb5,0x05,0x32,0xc6,0x38,0x71,0x00,0x00
};&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 수정된 Toggle OV2640 settings 페이지의 플래시 코드에 맞게 &lt;span&gt;LED&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;플래시 제어용 코드 추가하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ ESP32 CAM 개발보드의 GPIO 명세&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_ESP32_CAM_GPIO.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLcCYE/btrWVKfPjcp/HImzowCX96Be4bSuWRkpL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLcCYE/btrWVKfPjcp/HImzowCX96Be4bSuWRkpL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLcCYE/btrWVKfPjcp/HImzowCX96Be4bSuWRkpL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLcCYE%2FbtrWVKfPjcp%2FHImzowCX96Be4bSuWRkpL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;440&quot; data-filename=&quot;edited_edited_ESP32_CAM_GPIO.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전원 관련&lt;br /&gt;5V : 전원 입력&lt;br /&gt;3.3V: 3.3V 전원 출력(3.3V 전원을 사용하는 센서등 모듈에 전원공급. ex.DFPlayer)&lt;br /&gt;GND: 접지(그라운드)&lt;br /&gt;&lt;br /&gt;- GPIO0&amp;nbsp; &amp;nbsp; FLASH 업로드 모드(접지연결 시), 일반모드(접지 해제 시): 입/출력(디지털/아날로그) 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시리얼통신&lt;br /&gt;GPIO1&amp;nbsp; &amp;nbsp; U0TXD(UART 전송 핀)&lt;br /&gt;GPIO3&amp;nbsp; &amp;nbsp; UORXD(UART 수신 핀)&lt;br /&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 5.본문배너3 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;5927891592&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;br /&gt;- SD 카드&lt;br /&gt;GPIO2&amp;nbsp; &amp;nbsp; Data0 핀 (RTC &amp;amp; ADC 지원)&lt;br /&gt;GPIO4&amp;nbsp; &amp;nbsp; Data1 핀 (RTC &amp;amp; ADC 지원), 플래시 라이트 겸용&lt;br /&gt;GPIO12&amp;nbsp; Data2 핀 (RTC &amp;amp; ADC 지원)&lt;br /&gt;GPIO13&amp;nbsp; Data3 핀 (RTC &amp;amp; ADC 지원)&lt;br /&gt;GPIO14&amp;nbsp; CLK (RTC &amp;amp; ADC 지원)&lt;br /&gt;GPIO15&amp;nbsp; CMD (RTC &amp;amp; ADC 지원)&lt;br /&gt;* SD 카드를 사용하지 않는 경우 디지털 입력/출력, 아날로그 입력/출력에 사용가능.&lt;br /&gt;* SD 카드를 사용하는 경우 플래시 라이트를 제어할 수 없음.&lt;br /&gt;* 아날로그 입력은 와이파이가 작동 중 일경우 사용불가(입력값이 4095로 판독됨).&lt;br /&gt;-&amp;gt; ESP32의 아날로그 채널 ADC2는 와이파이 드라이버와 공유되어 있습니다.&lt;br /&gt;ADC2_CH0 (GPIO 4)&lt;br /&gt;ADC2_CH1 (GPIO 0)&lt;br /&gt;ADC2_CH2 (GPIO 2)&lt;br /&gt;ADC2_CH3 (GPIO 15)&lt;br /&gt;ADC2_CH4 (GPIO 13)&lt;br /&gt;ADC2_CH5 (GPIO 12)&lt;br /&gt;ADC2_CH6 (GPIO 14)&lt;br /&gt;ADC2_CH7 (GPIO 27)&lt;br /&gt;ADC2_CH8 (GPIO 25)&lt;br /&gt;ADC2_CH9 (GPIO 26)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ setup() 함수에 LED 플래시에 할당된 핀 모드 설정&lt;/p&gt;
&lt;pre id=&quot;code_1674531109045&quot; class=&quot;arduino&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pinMode(4, OUTPUT); // onboard flash light&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 온보드 &lt;span&gt;LED&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;플래시 제어용 플래그 설정&lt;/p&gt;
&lt;pre id=&quot;code_1674531109046&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static bool flashL = false;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ esp_err_t cmd_handler() 함수에 플래시 제어용 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1674531109046&quot; class=&quot;arduino&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    else if(!strcmp(variable, &quot;fls&quot;)) {
      flashL = !flashL;
      if (flashL) digitalWrite(4, HIGH);   
      else digitalWrite(4, LOW);  
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶ 웹페이지에 ESP32 CAM의 현재 상태를 반영하는 esp_err_t status_handler() 함수에 플래시 상태 코드 추가&lt;/p&gt;
&lt;pre id=&quot;code_1674531109046&quot; class=&quot;lisp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    p+=sprintf(p, &quot;\&quot;fls\&quot;:%u&quot;, flashL);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CameraWebServer_modi_esp32_1_0_6.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cjkN1G/btsDASpLFne/1IzvaHgKstvf9dUoELHIk0/CameraWebServer_modi_esp32_1_0_6.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;CameraWebServer_modi_esp32_1_0_6.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.02MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지 응답 코드가 있는 아두이노 와이파이 제어에서 사용할 수 있는 연결 도우미 앱입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1705451944417&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MCUWiFi - Google Play 앱&quot; data-og-description=&quot;스마트폰에서 아두이노 웹서버에 연결하기 위한 앱&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&amp;amp;hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Z9qXB/hyU5QOKVrE/bpzvFyCdjrb9sLTwQgq5o0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bqGT7E/hyU5Pvxelp/hMJ4APQq0Fdz0r6K0sJ4NK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/rYb4x/hyU5PbdO6D/IK7eummhbQKcjEg2UlWMuK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Z9qXB/hyU5QOKVrE/bpzvFyCdjrb9sLTwQgq5o0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bqGT7E/hyU5Pvxelp/hMJ4APQq0Fdz0r6K0sJ4NK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/rYb4x/hyU5PbdO6D/IK7eummhbQKcjEg2UlWMuK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MCUWiFi - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스마트폰에서 아두이노 웹서버에 연결하기 위한 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;특징:&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 스마트폰에서 아두이노 웹서버에 연결할 때 에러 메세지 출력 및 연결 가이드 제시&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 아두이노 웹서버의 html 페이지 연결시 스마트폰의 웹브라우저 대신 앱 내부 웹 뷰어를 통해 연결 및 표시&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 앱 실행전 스마트폰의 와이파이 실행 유무에 따라 앱 종료시 와이파이 설정 페이지 이동&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 설명은 아래 포스트를 참조하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/201&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - 아두이노 와이파이 연결 도우미 앱&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MCU WiFi앱을 통해 ESP32 CAM에 연결하기 위해서는 &lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;아두이노 코어 버전 2.0.xx&lt;/span&gt;&lt;/b&gt;에서 스케치를 업로드 해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.0.6버전에서 업로드한 ESP32 CAM에 와이파이를 통해 연결할 경우 &quot;Header fields are too long for server to interpret&quot;라는 메세지만 표시됩니다. 이 메세지의 의미는 ESP32 아두이노 코어의 와이파이 설정값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;CONFIG_HTTPD_MAX_REQ_HDR_LEN = 512&quot;에 의해 정의된 512바이트를 초과한 헤더값이 들어온 경우 ESP32 웹서버에서 헤더값을 해석하지 못했다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 헤더 예 -&amp;gt; 이 헤더의 총길이가 512바이트를 초과하면 1.0.6 버전의 ESP32 웹서버는 에러 메세지를 출력합니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;GET /stream HTTP/1.1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;Host: xxx.xxx.x.xxx:8000&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;Connection: keep-alive&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;Upgrade-Insecure-Requests: 1&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;User-Agent: Mozilla/5.0 (Linux; Android 8.1.0; Pixel Build/OPM1.171019.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome 78.0.3904.96 Mobile Safari/537.36&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;X-Requested-With: com.snc.test.webview2&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;Accept-Encoding: gzip, deflate&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;Accept-Language: en-US,en;q=0.9&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.0.xx 버전의 와이파이 설정값이 1024바이트로 변경되어 정상적으로 연결 및 작동됩니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/p0C6njyAu5M&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino</category>
      <category>ESP32 CAM</category>
      <category>esp32 camera</category>
      <category>esp32 html</category>
      <category>esp32 wifi</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/198</guid>
      <comments>https://postpop.tistory.com/198#entry198comment</comments>
      <pubDate>Tue, 24 Jan 2023 12:55:08 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 - 피에조 부저 멜로디 BTS (방탄소년단) - Butter</title>
      <link>https://postpop.tistory.com/197</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;방탄소년단 버터의 멜로디를 아두이노 피에조 부저를 이용하여 재생하는 코드입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노 우노 / NodeMcu / ESP32 DevKit용 예제 스케치입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_piezo_uno.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8zZ3j/btrWCUCK585/VDd1LXQ864xMA5WF9As9y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8zZ3j/btrWCUCK585/VDd1LXQ864xMA5WF9As9y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8zZ3j/btrWCUCK585/VDd1LXQ864xMA5WF9As9y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8zZ3j%2FbtrWCUCK585%2FVDd1LXQ864xMA5WF9As9y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;354&quot; data-filename=&quot;edited_edited_piezo_uno.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;방탄소년단-Butter.png&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;6824&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/maxA3/btsK1sSAnEd/jDjgsXHxFuXmQc4BtSnn20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/maxA3/btsK1sSAnEd/jDjgsXHxFuXmQc4BtSnn20/img.png&quot; data-alt=&quot;방탄소년단 Butter 피에조부저 악보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/maxA3/btsK1sSAnEd/jDjgsXHxFuXmQc4BtSnn20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmaxA3%2FbtsK1sSAnEd%2FjDjgsXHxFuXmQc4BtSnn20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1866&quot; height=&quot;6824&quot; data-filename=&quot;방탄소년단-Butter.png&quot; data-origin-width=&quot;1866&quot; data-origin-height=&quot;6824&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;방탄소년단 Butter 피에조부저 악보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;!-- 3.본문 배너1 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bWV55k/btrUnJQ6LK6/rrYtHSaVzAYkQsl7f4bO11/Uno_bts_butter.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Uno_bts_butter.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/oXx82/btrUoMmi0rY/4K6taxUDNQXOZ274poFzD1/nodeMcu_bts_butter.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;nodeMcu_bts_butter.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cNMyYd/btrUl6T6cur/oIK92WRZCYBDI8LF9KFaM1/esp32_melody_butter.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;esp32_melody_butter.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1671762259588&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t Tempo = 110;
float tempoRatio = float(Tempo)/60.0;
uint8_t KeySign = 4;
uint8_t octaveTemp = 4;
// float beatTime = 4/4; // 박자표 - 멜로디 코드에서는 사용하지 않는다.(Simple Melody 앱만 사용)

const note_t Mnote[] PROGMEM= {
NOTE_G,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_A,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_C,NOTE_C,NOTE_C,
NOTE_MAX,NOTE_D,NOTE_E,NOTE_A,NOTE_A,NOTE_A,NOTE_C,NOTE_MAX,NOTE_G,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_MAX,
NOTE_G,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_C,NOTE_C,NOTE_MAX,NOTE_D,NOTE_E,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_A,
NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_MAX,NOTE_E,NOTE_E,NOTE_A,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_A,NOTE_E,NOTE_F,NOTE_A,NOTE_B,NOTE_E,NOTE_E,NOTE_C,NOTE_E,NOTE_C,NOTE_E,
NOTE_C,NOTE_B,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_E,NOTE_E,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_D,NOTE_C,NOTE_MAX,NOTE_C,NOTE_B,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_E,
NOTE_E,NOTE_F,NOTE_A,NOTE_B,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_MAX,NOTE_C,NOTE_B,NOTE_A,NOTE_A,NOTE_F,NOTE_E,NOTE_F,NOTE_C,NOTE_MAX,NOTE_C,NOTE_B,NOTE_A,NOTE_A,NOTE_A,NOTE_B,NOTE_MAX,NOTE_MAX,
NOTE_C,NOTE_B,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_E,NOTE_E,NOTE_C,NOTE_MAX,NOTE_E,NOTE_F,NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_C,NOTE_G,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_G,
NOTE_MAX,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_A,NOTE_A,NOTE_A,NOTE_G,NOTE_E,NOTE_D,NOTE_C,NOTE_A,NOTE_MAX,
NOTE_G,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_A,NOTE_A,NOTE_G,NOTE_MAX,NOTE_G,NOTE_G,NOTE_F,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_E,NOTE_C,NOTE_MAX,NOTE_B,
NOTE_MAX,NOTE_C,NOTE_E,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_A,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_MAX,NOTE_E,NOTE_E,NOTE_A,
NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_E,NOTE_MAX,NOTE_E,NOTE_E,NOTE_E,NOTE_A,NOTE_E,NOTE_F,NOTE_A,NOTE_B,NOTE_E,NOTE_E,NOTE_C,NOTE_E,NOTE_C,NOTE_E,NOTE_C,NOTE_B,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_E,
NOTE_E,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_D,NOTE_C,NOTE_MAX,NOTE_C,NOTE_B,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_E,NOTE_E,NOTE_F,NOTE_A,NOTE_B,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_C,
NOTE_MAX,NOTE_C,NOTE_B,NOTE_A,NOTE_A,NOTE_F,NOTE_E,NOTE_F,NOTE_C,NOTE_MAX,NOTE_C,NOTE_B,NOTE_A,NOTE_A,NOTE_A,NOTE_B,NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_B,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_E,
NOTE_E,NOTE_C,NOTE_MAX,NOTE_E,NOTE_F,NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_C,NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_F,NOTE_A,NOTE_B,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_A,NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_E,NOTE_A,NOTE_B,NOTE_MAX,NOTE_F,NOTE_G,NOTE_F,NOTE_E,
NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_F,NOTE_A,NOTE_B,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_A,NOTE_MAX,NOTE_A,NOTE_B,NOTE_E,NOTE_F,NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_C,NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_F,NOTE_A,NOTE_B,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_A,
NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_F,NOTE_A,NOTE_B,NOTE_MAX,NOTE_F,NOTE_G,NOTE_F,NOTE_E,NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_F,NOTE_A,NOTE_B,NOTE_MAX,NOTE_B,NOTE_C,NOTE_B,NOTE_A,NOTE_B,NOTE_E,NOTE_F,NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_C,
NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_B,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_F,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_B,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_A,
NOTE_MAX,NOTE_F,NOTE_A,NOTE_MAX,NOTE_A,NOTE_MAX,NOTE_C,NOTE_B,NOTE_MAX,NOTE_B,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_B,NOTE_B,NOTE_B,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_F,
NOTE_MAX,NOTE_B,NOTE_B,NOTE_A,NOTE_A,NOTE_B,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_A,NOTE_E,NOTE_F,NOTE_A,NOTE_A,NOTE_B,NOTE_C,NOTE_MAX,NOTE_E,NOTE_E,NOTE_C,NOTE_B,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_E,
NOTE_E,NOTE_C,NOTE_MAX,NOTE_C,NOTE_C,NOTE_MAX,NOTE_C,NOTE_B,NOTE_MAX,NOTE_A,NOTE_B,NOTE_C,NOTE_B,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_E,NOTE_E,NOTE_F,NOTE_A,NOTE_B,NOTE_C,NOTE_MAX,NOTE_MAX,NOTE_C,
NOTE_MAX,NOTE_C,NOTE_B,NOTE_A,NOTE_A,NOTE_F,NOTE_E,NOTE_F,NOTE_C,NOTE_MAX,NOTE_C,NOTE_B,NOTE_A,NOTE_A,NOTE_A,NOTE_B,NOTE_MAX,NOTE_MAX,NOTE_C,NOTE_B,NOTE_MAX,NOTE_A,NOTE_G,NOTE_F,NOTE_MAX,NOTE_E,
NOTE_E,NOTE_C,NOTE_MAX,NOTE_E,NOTE_F,NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_C,NOTE_B,NOTE_A,NOTE_MAX,NOTE_B,NOTE_A,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_E,NOTE_B,NOTE_MAX,NOTE_C,NOTE_MAX,
NOTE_B,NOTE_A,NOTE_MAX,NOTE_C,NOTE_B,NOTE_MAX,NOTE_A,NOTE_A,NOTE_A,NOTE_E,NOTE_B,NOTE_MAX,NOTE_A,NOTE_MAX,NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_D,NOTE_D,NOTE_C,NOTE_B,NOTE_D,NOTE_MAX,
NOTE_B,NOTE_A,NOTE_A,NOTE_G,NOTE_D,NOTE_D,NOTE_C,NOTE_B,NOTE_C,NOTE_MAX,NOTE_B,NOTE_A,NOTE_A,NOTE_E,NOTE_A,NOTE_G,NOTE_E,NOTE_E,NOTE_E,NOTE_F,NOTE_MAX,NOTE_A,NOTE_B,NOTE_MAX,NOTE_C,
};

const uint8_t Moct[] PROGMEM= {
4,4,4,4,4,3,3,4,0,4,4,4,4,4,4,4,3,4,4,4,4,4,4,4,4,
0,4,4,3,3,3,5,3,4,4,4,4,4,3,4,0,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,0,4,4,3,3,3,4,4,4,4,4,4,4,0,4,4,4,3,
3,4,4,4,4,0,4,4,4,4,4,4,4,4,0,4,4,4,3,4,4,4,4,5,4,4,4,4,4,
5,4,0,4,4,4,0,4,4,4,4,4,5,5,5,5,5,4,0,4,4,4,0,4,
4,4,4,4,5,5,5,5,0,5,4,4,4,4,4,4,5,0,5,4,4,4,4,4,4,4,
5,4,0,4,4,4,0,4,4,4,4,4,4,4,4,4,4,5,4,4,4,4,4,4,4,
0,4,4,4,4,4,4,4,4,3,4,4,4,4,4,4,3,4,0,4,4,4,4,4,4,4,4,4,3,3,
4,4,4,4,4,3,3,4,0,4,4,4,4,4,4,4,4,3,4,4,4,4,4,3,
0,4,4,3,3,3,4,4,4,4,4,4,4,0,4,4,4,3,3,4,4,4,4,0,4,4,4,
4,4,4,4,4,0,4,4,4,3,4,4,4,4,5,4,4,4,4,4,5,4,0,4,4,4,0,4,
4,4,4,4,5,5,5,5,5,4,0,4,4,4,0,4,4,4,4,4,5,5,5,5,
0,5,4,4,4,4,4,4,5,0,5,4,4,4,4,4,4,4,5,4,0,4,4,4,0,4,
4,4,4,4,4,4,4,4,4,5,5,4,4,4,4,4,4,4,4,5,4,4,4,4,4,4,4,4,4,4,5,5,5,5,
5,4,4,4,4,4,4,4,4,5,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,6,5,5,
5,5,5,5,5,5,5,5,6,6,6,6,6,5,5,5,5,5,5,5,5,6,5,5,5,5,5,5,5,5,5,6,
6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,5,6,6,5,0,5,5,5,0,5,
5,5,5,6,6,0,6,5,0,5,5,6,5,0,5,5,5,0,5,5,5,5,5,6,6,6,6,
0,6,5,5,5,5,5,5,6,0,6,5,5,5,5,5,5,5,6,5,0,5,5,5,0,5,
5,5,5,5,5,5,5,5,5,6,5,5,0,5,5,0,5,5,5,6,5,0,6,6,
5,5,0,6,5,0,5,5,5,6,5,0,5,5,5,5,5,5,6,6,6,5,6,0,
5,5,5,5,6,6,6,5,6,0,5,5,5,6,5,5,5,5,5,5,5,5,5,5,6,
0,
};

const uint8_t localKey[] PROGMEM= {
2,0,0,0,0,0,0,2,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,2,2,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,
0,2,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,2,2,0,0,0,2,0,0,0,0,0,
2,0,0,0,0,0,0,2,0,2,2,0,0,0,0,0,0,0,2,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,
};

const uint8_t Mdur[] PROGMEM= {
16,
4,4,1,1,2,2,1,1,1,1,2,2,2,1,1,2,4,4,4,1,1,2,2,1,1,
1,1,2,2,2,2,2,4,4,4,1,1,2,3,1,1,1,2,2,2,1,1,2,4,
4,4,1,1,2,3,1,1,1,2,2,2,2,2,4,2,2,2,1,1,1,1,2,2,2,
2,2,2,1,1,1,1,2,4,2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,2,
3,1,1,3,3,1,1,3,1,1,2,2,1,1,4,4,3,1,1,3,3,1,1,3,
1,1,2,3,1,4,3,1,1,1,2,2,2,4,1,2,1,1,1,2,2,2,1,1,2,4,
3,1,1,3,3,1,1,3,1,1,2,1,1,2,1,1,2,4,4,4,1,1,2,3,1,
1,1,2,2,2,1,1,2,2,2,4,4,1,1,2,1,2,1,1,1,2,2,2,1,1,1,1,1,1,2,
4,4,1,1,2,2,1,1,1,1,2,2,2,1,1,2,2,2,4,4,2,2,3,1,
1,1,2,2,2,2,2,4,2,2,2,1,1,1,1,2,2,2,2,2,2,1,1,1,1,2,4,
2,2,2,1,1,1,1,2,2,2,2,2,2,2,2,1,1,1,1,2,3,1,1,3,3,1,1,3,
1,1,2,2,1,1,4,4,3,1,1,3,3,1,1,3,1,1,2,3,1,4,3,1,
1,1,2,2,2,4,1,2,1,1,1,2,2,2,1,1,2,4,3,1,1,3,3,1,1,3,
1,1,2,1,1,2,1,1,2,4,2,1,1,3,1,1,1,2,1,1,1,1,2,1,1,3,1,1,1,2,1,1,1,1,
2,1,1,3,1,1,1,2,1,1,1,1,2,1,1,1,1,2,1,1,2,4,2,1,1,3,1,1,1,2,1,1,1,1,
2,1,1,3,1,1,1,2,1,1,1,1,2,1,1,3,1,1,1,2,1,1,1,1,4,1,1,2,1,1,2,4,
2,2,2,1,1,2,1,1,2,2,4,1,1,2,1,1,1,1,2,2,4,1,1,1,1,1,1,1,1,2,2,
2,1,1,2,2,2,2,4,4,2,2,1,1,1,1,2,2,2,1,1,2,2,1,1,1,1,2,2,
2,2,1,1,1,1,1,1,1,1,2,2,1,1,2,1,1,2,2,2,4,3,1,1,3,3,1,1,3,
1,1,2,3,1,1,2,1,1,1,2,3,1,1,3,3,1,1,3,1,1,2,3,1,4,3,1,
1,1,2,2,2,4,1,2,1,1,1,2,2,2,1,1,2,4,3,1,1,3,3,1,1,3,
1,1,2,1,1,2,1,1,2,4,2,2,4,2,2,4,2,2,2,1,1,2,2,4,
2,2,4,2,2,4,2,2,2,1,1,2,2,4,1,1,1,1,2,1,1,2,2,4,
1,1,1,1,2,1,1,2,2,4,2,2,4,4,4,2,1,1,1,1,2,1,1,2,4,
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2023년 2월 7일 업데이트 파일&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cJZaJy/btrYqJ7fqRC/vzdbr13Emwon1opicjroQk/esp32_melody_butter_update.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;esp32_melody_butter_update.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bQrQmq/btrYlyMuJco/TUhsmViWOE6nsmooicoh8k/nodeMcu_bts_butter_update.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;nodeMcu_bts_butter_update.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Yd8Wi/btrYmzqNdwG/CZfwv3Xm6t5ksbkp86FSpk/Uno_bts_butter_update.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Uno_bts_butter_update.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/1BuKugzsEFs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/1BuKugzsEFs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/1BuKugzsEFs&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자막에 설명 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/onkxA5WYSqc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/onkxA5WYSqc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/onkxA5WYSqc&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/HcTFH/btrUnKiYFbX/pHjMelksT4QzTIrKXNkO90/butter.note?attach=1&amp;amp;knm=tfile.note&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;butter.note&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/98&quot;&gt;[arduino] - 아두이노/ESP32 - 피에조 부저, 악보를 보고 동요 멜로디 코딩하기(동요 겨울밤, 다람쥐, 옹달샘, 작은별)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/99&quot;&gt;[arduino] - arduino - Simple Melody 이용 피에조 부저 멜로디 코딩하기, Esp01, EEPROM&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/103&quot;&gt;[arduino] - 아두이노 - 피에조 부저 멜로디 BTS DNA&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/104&quot;&gt;[arduino] - 아두이노 - 피에조 부저 멜로디 Hwasa Maria&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/105&quot;&gt;[Arduino] - 아두이노 - 피에조 부저 멜로디 BTS Dynamite&lt;/a&gt;&lt;/p&gt;</description>
      <category>Arduino/Piezo Buzzer</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/197</guid>
      <comments>https://postpop.tistory.com/197#entry197comment</comments>
      <pubDate>Fri, 23 Dec 2022 11:27:24 +0900</pubDate>
    </item>
    <item>
      <title>ESP32 BLE remote control with ADUPAD</title>
      <link>https://postpop.tistory.com/196</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUPAD application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VckmQ/btrSI80bc1S/ycoyDNVmojPgasBMKXRKek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VckmQ/btrSI80bc1S/ycoyDNVmojPgasBMKXRKek/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VckmQ/btrSI80bc1S/ycoyDNVmojPgasBMKXRKek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVckmQ%2FbtrSI80bc1S%2FycoyDNVmojPgasBMKXRKek%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;868&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237522224&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUPAD - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&amp;amp;hl=ko&amp;amp;gl=JP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUPAD - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Basic code for remote control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Set BLE library for the Bluetooth component of ESP32&lt;/p&gt;
&lt;pre id=&quot;code_1670172484348&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;BLEDevice.h&amp;gt;
#include &amp;lt;BLEServer.h&amp;gt;
#include &amp;lt;BLEUtils.h&amp;gt;
#include &amp;lt;BLE2902.h&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Library function to Inform if the bluetooth component of ESP32 has BLE connection or not&lt;/p&gt;
&lt;pre id=&quot;code_1670173180029&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyServerCallbacks: public BLEServerCallbacks {
  void onConnect(BLEServer* pServer) {
    deviceConnected = true;
    Serial.println(F(&quot;connected&quot;));
  };
  void onDisconnect(BLEServer* pServer) {
    deviceConnected = false;
    pServer-&amp;gt;startAdvertising(); // restart advertising
    Serial.println(F(&quot;start advertising&quot;));
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Library function to receive data through ESP32's BLE connection&lt;/p&gt;
&lt;pre id=&quot;code_1670173459356&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyCallbacks: public BLECharacteristicCallbacks {
  void onWrite(BLECharacteristic *pCharacteristic) {
    rxValue = pCharacteristic-&amp;gt;getValue();
//    if (rxValue.length() &amp;gt; 0) { // output the received data to Serial Monitor
//      for (int i = 0; i &amp;lt; rxValue.length(); i++) {
//        Serial.print(i); Serial.print(&quot;: &quot;); Serial.println(rxValue[i], HEX);
//      }
//    }
    rx_received = true;
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- BLE name and UUID settings&lt;/p&gt;
&lt;pre id=&quot;code_1670173693076&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define btName &quot;ESP32ble&quot;
#define SERVICE_UUID           &quot;6E400001-B5A3-F393-E0A9-E50E24DCCA9E&quot; 
#define CHARACTERISTIC_UUID_RX &quot;6E400002-B5A3-F393-E0A9-E50E24DCCA9E&quot;
#define CHARACTERISTIC_UUID_TX &quot;6E400003-B5A3-F393-E0A9-E50E24DCCA9E&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- setup&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1670173724196&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setup() {
  Serial.begin(115200);
  BLEDevice::init(btName);  //(&quot;ESP32&quot;);// Create the BLE Device
  pServer = BLEDevice::createServer();  // Create the BLE Server
  pServer-&amp;gt;setCallbacks(new MyServerCallbacks());
  BLEService *pService = pServer-&amp;gt;createService(SERVICE_UUID);  // Create the BLE Service
  pTxCharacteristic = pService-&amp;gt;createCharacteristic (  // Create a BLE Characteristic
                      CHARACTERISTIC_UUID_TX,
                      BLECharacteristic::PROPERTY_NOTIFY
                    );
  pTxCharacteristic-&amp;gt;addDescriptor(new BLE2902());
  BLECharacteristic * pRxCharacteristic = pService-&amp;gt;createCharacteristic (
                                          CHARACTERISTIC_UUID_RX,
                                          BLECharacteristic::PROPERTY_WRITE
                                        );
  pRxCharacteristic-&amp;gt;setCallbacks(new MyCallbacks());
  pService-&amp;gt;start();  // Start the service
  pServer-&amp;gt;getAdvertising()-&amp;gt;start();  // Start advertising
  Serial.println(F(&quot;Waiting a client connection to notify...&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1670173796348&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool gotData = false;

void loop() {
  if (rx_received == true) { // when incomming data from BLE
    for (int i = 0; i &amp;lt; rxValue.length(); i++) Serial.print(rxValue[i]); // Output data of BLE to the serial monitor.
    Serial.println(); 
    gotData = true; // the flag for response
    rx_received = false;
  } else {
    if (gotData) {  // if response
      char temp [21];
      String setVal = &quot;&quot;;
      setVal += char(0xF4);      // protocol header of text for ADUPAD with BLE
      setVal += &quot;Hello World &quot;;
      setVal += random(100,200); // the message for sending
      setVal += char(0xF1);      // protocol footer of text for ADUPAD with BLE
      setVal += '\0';            // end character for sending, pTxCharacteristic-&amp;gt;setValue(temp);
      Serial.println(setVal);    // Output the message to the serial monitor.
      if (setVal.length() &amp;lt;= 21) { // convert String to array of Char
        for (int i = 0; i &amp;lt; setVal.length(); i++) temp[i] = setVal[i];
      }
      pTxCharacteristic-&amp;gt;setValue(temp); 
      pTxCharacteristic-&amp;gt;notify();
      gotData = false;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_BLE_BASIC.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/BbxgM/btrSIRdkCe7/cYcoIcffCpkOUu6AOCOPok/ESP32_BLE_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_BLE_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ESP32_BLE_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32ble.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ALU4A/btrSJxSYnVO/H2mZhAfExg7jMO00roqhFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ALU4A/btrSJxSYnVO/H2mZhAfExg7jMO00roqhFk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ALU4A/btrSJxSYnVO/H2mZhAfExg7jMO00roqhFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FALU4A%2FbtrSJxSYnVO%2FH2mZhAfExg7jMO00roqhFk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorESP32ble.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;connecting to BLE of ESP32 on the ADUPAD app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Bluetooth 4.0 Search and Connection in the App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth icon in the app and select Bluetooth 4.0 in Select Ver.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth button and select the BLE of ESP32.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectESP32BLEADUPAD.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oubtq/btrSJZawws7/exkg1Jhxg6ccpgSd04ezZk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oubtq/btrSJZawws7/exkg1Jhxg6ccpgSd04ezZk/img.jpg&quot; data-alt=&quot;Select ESP32ble&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oubtq/btrSJZawws7/exkg1Jhxg6ccpgSd04ezZk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foubtq%2FbtrSJZawws7%2Fexkg1Jhxg6ccpgSd04ezZk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;290&quot; data-filename=&quot;connectESP32BLEADUPAD.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Select ESP32ble&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32bleRESadupad.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejuDcX/btrSJyxAaqf/diLBDC8vLbgajM4lBgx5v0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejuDcX/btrSJyxAaqf/diLBDC8vLbgajM4lBgx5v0/img.jpg&quot; data-alt=&quot;received data &amp;quot;%%F8connect&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejuDcX/btrSJyxAaqf/diLBDC8vLbgajM4lBgx5v0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejuDcX%2FbtrSJyxAaqf%2FdiLBDC8vLbgajM4lBgx5v0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorESP32bleRESadupad.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data &quot;%%F8connect&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseESP32BLEADUPAD.jpg&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFRBdM/btrSSLPkOIW/0vW2o4r8pdB6ZbkoiOAfkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFRBdM/btrSSLPkOIW/0vW2o4r8pdB6ZbkoiOAfkK/img.jpg&quot; data-alt=&quot;connected to ESP32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFRBdM/btrSSLPkOIW/0vW2o4r8pdB6ZbkoiOAfkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFRBdM%2FbtrSSLPkOIW%2F0vW2o4r8pdB6ZbkoiOAfkK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;269&quot; height=&quot;96&quot; data-filename=&quot;responseESP32BLEADUPAD.jpg&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;connected to ESP32&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※&amp;nbsp;If&amp;nbsp;a&amp;nbsp;Bluetooth&amp;nbsp;device&amp;nbsp;is&amp;nbsp;registered&amp;nbsp;using&amp;nbsp;the&amp;nbsp;same&amp;nbsp;device&amp;nbsp;for&amp;nbsp;Bluetooth&amp;nbsp;Classic&amp;nbsp;connection,&amp;nbsp;the&amp;nbsp;registered&amp;nbsp;device&amp;nbsp;must&amp;nbsp;be&amp;nbsp;removed&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;by&amp;nbsp;BLE&amp;nbsp;from&amp;nbsp;the&amp;nbsp;app.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;If&amp;nbsp;the&amp;nbsp;device&amp;nbsp;has&amp;nbsp;registered,&amp;nbsp;it&amp;nbsp;will&amp;nbsp;interfere&amp;nbsp;with&amp;nbsp;the&amp;nbsp;BLE&amp;nbsp;connection&amp;nbsp;and&amp;nbsp;the&amp;nbsp;device&amp;nbsp;will&amp;nbsp;not&amp;nbsp;respond&amp;nbsp;to&amp;nbsp;BLE&amp;nbsp;connection&amp;nbsp;requests&amp;nbsp;from&amp;nbsp;the&amp;nbsp;app.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/medWD/btsz1iedtt7/c1BMDXcmSEKGPRGtEKBqWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/medWD/btsz1iedtt7/c1BMDXcmSEKGPRGtEKBqWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/medWD/btsz1iedtt7/c1BMDXcmSEKGPRGtEKBqWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmedWD%2Fbtsz1iedtt7%2Fc1BMDXcmSEKGPRGtEKBqWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;336&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mK7sF/btsz1SsF2eu/kXM153r7loIHzDi7xVWaQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mK7sF/btsz1SsF2eu/kXM153r7loIHzDi7xVWaQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mK7sF/btsz1SsF2eu/kXM153r7loIHzDi7xVWaQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmK7sF%2Fbtsz1SsF2eu%2FkXM153r7loIHzDi7xVWaQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;230&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ElibM/btszZJwqpZS/70d1K54Cd6DKnJjIVfImE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ElibM/btszZJwqpZS/70d1K54Cd6DKnJjIVfImE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ElibM/btszZJwqpZS/70d1K54Cd6DKnJjIVfImE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FElibM%2FbtszZJwqpZS%2F70d1K54Cd6DKnJjIVfImE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;318&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with BLE of ADUPAD applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SerialBT_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqXZ6g/btrSXo7I6uE/JZXrzdCJMz9PZx8IAm435k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqXZ6g/btrSXo7I6uE/JZXrzdCJMz9PZx8IAm435k/img.jpg&quot; data-alt=&quot;ADUPAD app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqXZ6g/btrSXo7I6uE/JZXrzdCJMz9PZx8IAm435k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqXZ6g%2FbtrSXo7I6uE%2FJZXrzdCJMz9PZx8IAm435k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;226&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUPAD app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for BLE in the Arduino sketch according to the protocol header settings in the ADUPAD app.&lt;/p&gt;
&lt;pre id=&quot;code_1669361395965&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD 0xF0
#define joyHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define connectHDstr F(&quot;%%F8&quot;)
#define optionHD 0xF9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUPAD app&lt;/p&gt;
&lt;pre id=&quot;code_1669361477758&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

void BLE_read() {
  if (appConnection) { // If app connection is confirmed
    // Execute code after app connection is confirmed
  } else CheckF8(&quot;&quot;);  // check &quot;%%F8connect&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHDstr(%%F8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + connect&lt;/span&gt;: Transmit the necessary app settings and current Arduino state values through the iniSet() and send_State() functions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + NA&lt;/span&gt;: Change setting values for BT05.&lt;/p&gt;
&lt;pre id=&quot;code_1669361656221&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF8(String temp) {
  if (temp == &quot;&quot;) {
    String hd = connectHDstr; // %%F8
    if (rxValue[0] == hd[0] &amp;amp;&amp;amp; rxValue[1] == hd[1] &amp;amp;&amp;amp; rxValue[2] == hd[2] &amp;amp;&amp;amp; rxValue[3] == hd[3]) {
      for (int i = hd.length(); i &amp;lt; rxValue.length(); i++) {
        if (rxValue[i] != '\n') temp += rxValue[i];
        else break;
      }
      if (temp == F(&quot;connect&quot;)) { delay(100); needAppCheck = false; appConnection = true; iniSet(); send_State(); }
    } else { btDisconnect(); needAppCheck = false; } // disconnect &amp;amp; advertise
  } else {
    if (temp == F(&quot;disconnect&quot;)) appConnection = false; 
    else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); } 
    else Serial.println(temp);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- If &quot;%%F8connect&quot; is not confirmed within disconnectTime after receiving the first data through BLE, the connection is terminated and re-advertise the name of BLE.&lt;/p&gt;
&lt;pre id=&quot;code_1670257351045&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void orderDisconnect() { 
  if (needAppCheck) { 
    if (!appConnection) {
      if (millis() - disconnectTime &amp;gt; 3000) {
        needAppCheck = false;
        btDisconnect();
        Serial.println(F(&quot;enter app check disconnect&quot;));
      }
    } 
  } 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Command the app to click the disconnec button and terminate the connected BLE to ESP32&lt;/p&gt;
&lt;pre id=&quot;code_1670257376905&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void btDisconnect() {
  sendDisconnect();
  delay(10);
  pServer-&amp;gt;disconnect(pServer-&amp;gt;getConnId());
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHDstr(%%F9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669361705149&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(0xF0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669361740877&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF0 + 1byte Num + 0xF1
uint8_t cn = 0;
while (rxValue[cn] == pinHD) {   // need depend on left arrow pad mode 
  if (rxValue[cn+2] == footHD) { // if the third byte is 0xF1
    pin_control(rxValue[cn+1]);  // execute the code with the value of second byte
  }
  cn = cn+3; // index of next 0xF0
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;joyHD(0xF3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669361886692&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF3 + 1byte Num(id) + 2byte Num(heading) + 1byte Num(strength) + 0xF1
if (rxValue[5] == footHD) {        // if the sixth byte is 0xF1
  uint16_t value = rxValue[3];     // Swap third and fourth bytes
  value = value &amp;lt;&amp;lt; 8 | rxValue[2];
  joystick_control(rxValue[1], value, rxValue[4]); // execute the code with values
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669361957437&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){
  pin[1] = pin_val;
  pin[2] = footHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pin, 3);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669361975245&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){
  pin[1] = pin_val;
  pin[2] = echoHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pin, 3);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the Joystick state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669362000421&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) {
  joystick[1] = id;
  joystick[2] = heading;
  joystick[3] = heading &amp;gt;&amp;gt; 8;
  joystick[4] = strength;
  joystick[5] = footHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;joystick, 6);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the Joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669362023716&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendJoyEcho(uint8_t id, uint16_t heading, uint8_t strength) {
  joystick[1] = id;
  joystick[2] = heading;
  joystick[3] = heading &amp;gt;&amp;gt; 8;
  joystick[4] = strength;
  joystick[5] = echoHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;joystick, 6);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text with over the limitation of transmit data length of BLE.&lt;/p&gt;
&lt;pre id=&quot;code_1669362071597&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String str) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 18) {
     repeat = (len/18)+1;
     endLen = (len%18);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = strHD;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 18;
    else ed = endLen;
    for (int i = 1; i &amp;lt; ed+1; i++) {
      temp[i] = str[(r*18)+i-1];
    }
    if (repeat-r &amp;gt; 1) temp[ed+1] = echoHD;
    else temp[ed+1] = footHD;
    temp[ed+2] = '\0';
    pTxCharacteristic-&amp;gt;setValue(temp); 
    pTxCharacteristic-&amp;gt;notify();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1669362147020&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3];
  setVal[0] = connectHD;
  setVal[1] = 0x01;
  setVal[2] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;disconnect02.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kN7kS/btrSUABo16y/ADqQ5Ogf6eoYzi7ig07fHK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kN7kS/btrSUABo16y/ADqQ5Ogf6eoYzi7ig07fHK/img.jpg&quot; data-alt=&quot;Disconnect Button for Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kN7kS/btrSUABo16y/ADqQ5Ogf6eoYzi7ig07fHK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkN7kS%2FbtrSUABo16y%2FADqQ5Ogf6eoYzi7ig07fHK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;45&quot; data-filename=&quot;disconnect02.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button for Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Use when you want to acquire control authority by using the set password for ESP32&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It can be changed to any name through definition of the passName and passNameLen for processing the password in the sketch and the app send datas starting with passName as password value. This is to enhance security.&lt;/p&gt;
&lt;pre id=&quot;code_1670257897338&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define passName F(&quot;PAS:&quot;)
#define pnLength 4

void requestPass(bool val){ // order disconnect to App 
  uint8_t setVal[3+pnLength];
  String temp = passName;
  setVal[0] = connectHD;
  setVal[1] = 0x02;
  if (val) {
    setVal[2] = pnLength;
    for (int i = 0; i&amp;lt;pnLength;i++) setVal[i+3] = temp[i];
    pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3+pnLength); 
  } else {
    setVal[2] = val;
    pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
  }
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbBKV9/btrSUIMS8in/8MuQdwW4QptYb6Bjiobvok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbBKV9/btrSUIMS8in/8MuQdwW4QptYb6Bjiobvok/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbBKV9/btrSUIMS8in/8MuQdwW4QptYb6Bjiobvok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbBKV9%2FbtrSUIMS8in%2F8MuQdwW4QptYb6Bjiobvok%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Response for correct or not through password confirmation&lt;/p&gt;
&lt;pre id=&quot;code_1670257938808&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void responsePass(bool val){ 
  uint8_t setVal[3];
  setVal[0] = connectHD;
  setVal[1] = 0x03;
  setVal[2] = val;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/17Xgd/btrSVIr3V1H/MizabWkkSRDvr7pAUeCFFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/17Xgd/btrSVIr3V1H/MizabWkkSRDvr7pAUeCFFk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/17Xgd/btrSVIr3V1H/MizabWkkSRDvr7pAUeCFFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F17Xgd%2FbtrSVIr3V1H%2FMizabWkkSRDvr7pAUeCFFk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;41&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxFErK/btrSUCspesw/TShezL3v12jr8eIkjRNN90/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxFErK/btrSUCspesw/TShezL3v12jr8eIkjRNN90/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxFErK/btrSUCspesw/TShezL3v12jr8eIkjRNN90/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxFErK%2FbtrSUCspesw%2FTShezL3v12jr8eIkjRNN90%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1669362170956&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void send_message(String str, uint8_t head, uint8_t fn) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 17) {
     repeat = (len/17)+1;
     endLen = (len%17);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = head;
    temp[1] = fn;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 17;
    else ed = endLen;
    for (int i = 2; i &amp;lt; ed+2; i++) {
      temp[i] = str[(r*17)+i-2];
    }
    if (repeat-r &amp;gt; 1) temp[ed+2] = echoHD;
    else temp[ed+2] = footHD;
    temp[ed+3] = '\0';
    pTxCharacteristic-&amp;gt;setValue(temp); 
    pTxCharacteristic-&amp;gt;notify();
  }
}

void sendMessage(String str) {
  send_message(str, connectHD, 0x04);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O3sU0/btrSWxKBxRQ/aIHVQMyVZY65RTS1Qx5ap1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O3sU0/btrSWxKBxRQ/aIHVQMyVZY65RTS1Qx5ap1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O3sU0/btrSWxKBxRQ/aIHVQMyVZY65RTS1Qx5ap1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO3sU0%2FbtrSWxKBxRQ%2FaIHVQMyVZY65RTS1Qx5ap1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. Set the function to continuously transmit the changed value of the Joystick according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** The Gravity Sensor always works in an active Mode.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Joystick Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Joystick Mode&lt;/span&gt;&amp;nbsp;(transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1669362242680&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveJoystick(bool val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x01;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HW1Fe/btrSUCsoWvC/3FoCTiK5wTYcybtM2nbJp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HW1Fe/btrSUCsoWvC/3FoCTiK5wTYcybtM2nbJp1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HW1Fe/btrSUCsoWvC/3FoCTiK5wTYcybtM2nbJp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHW1Fe%2FbtrSUCsoWvC%2F3FoCTiK5wTYcybtM2nbJp1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;98&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Set transmission interval of ACTIVE JOYSTIC MODE. (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669362279172&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoystickInterval(uint16_t val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x02;
  setVal[2] = val;
  setVal[3] = val &amp;gt;&amp;gt; 8;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Set the range where the strength of the joystick becomes 0. (enter a value from 0 to 35)&lt;/p&gt;
&lt;pre id=&quot;code_1669362298436&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x03;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uVMla/btrSVaI7xea/wAXyOUEK7Dn23WffInCNAK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uVMla/btrSVaI7xea/wAXyOUEK7Dn23WffInCNAK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uVMla/btrSVaI7xea/wAXyOUEK7Dn23WffInCNAK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuVMla%2FbtrSVaI7xea%2FwAXyOUEK7Dn23WffInCNAK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;198&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Set whether or not to use a function that converts the Strength value of Joystick or Gravity Sensor into a value between 0 and 10.&lt;/p&gt;
&lt;pre id=&quot;code_1669362336885&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyStrengthAdjust(bool val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x04;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Set the group for the left arrow keypad.&lt;/p&gt;
&lt;pre id=&quot;code_1669362420132&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){   
  if (val == 0 || val &amp;gt; 2) val = 4; 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x05;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUjMoP/btrSPPGkXEH/5EmP2ffzgfi1hQcKKKPb00/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUjMoP/btrSPPGkXEH/5EmP2ffzgfi1hQcKKKPb00/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUjMoP/btrSPPGkXEH/5EmP2ffzgfi1hQcKKKPb00/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUjMoP%2FbtrSPPGkXEH%2F5EmP2ffzgfi1hQcKKKPb00%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;88&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Set the 4-way control of the joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669362467812&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x06;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Set whether or not to display the group button.&lt;/p&gt;
&lt;pre id=&quot;code_1669362487173&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x07;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lxDGU/btrSVavADX7/llGIynB5JoLvdGCWkkPOg1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lxDGU/btrSVavADX7/llGIynB5JoLvdGCWkkPOg1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lxDGU/btrSVavADX7/llGIynB5JoLvdGCWkkPOg1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlxDGU%2FbtrSVavADX7%2FllGIynB5JoLvdGCWkkPOg1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;31&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;149&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhQRXE/btrSQUglrYL/dZ5bNVjj81zDMCg9l4nRIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhQRXE/btrSQUglrYL/dZ5bNVjj81zDMCg9l4nRIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhQRXE/btrSQUglrYL/dZ5bNVjj81zDMCg9l4nRIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhQRXE%2FbtrSQUglrYL%2FdZ5bNVjj81zDMCg9l4nRIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;149&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;149&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMnUSz/btrSYlXhKdF/AWVeXd1Z9a60Ig0roDtmok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMnUSz/btrSYlXhKdF/AWVeXd1Z9a60Ig0roDtmok/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMnUSz/btrSYlXhKdF/AWVeXd1Z9a60Ig0roDtmok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMnUSz%2FbtrSYlXhKdF%2FAWVeXd1Z9a60Ig0roDtmok%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;137&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1669362599292&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2: show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x08;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* BLE is no need to pair with Mobile Phone and the Pin Number of BT05 only used for btween master and slave of BT05.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* If pairing is attempted, an error message is displayed.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m82tT/btrSUcgrdYd/koJkjaj0JjlSSAWm41CZB0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m82tT/btrSUcgrdYd/koJkjaj0JjlSSAWm41CZB0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m82tT/btrSUcgrdYd/koJkjaj0JjlSSAWm41CZB0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm82tT%2FbtrSUcgrdYd%2FkoJkjaj0JjlSSAWm41CZB0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set the activation interval of the gravity sensor and transmission of the tilt value.&lt;/p&gt;
&lt;pre id=&quot;code_1669362673892&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x09;
  setVal[2] = val;
  setVal[3] = val &amp;gt;&amp;gt; 8;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRN9js/btrSU9pSXX1/jgazZwZVZdHLKHGZ2yUBEK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRN9js/btrSU9pSXX1/jgazZwZVZdHLKHGZ2yUBEK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRN9js/btrSU9pSXX1/jgazZwZVZdHLKHGZ2yUBEK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRN9js%2FbtrSU9pSXX1%2FjgazZwZVZdHLKHGZ2yUBEK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;83&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eaoslj/btrSQUUWfyn/1m03dZLBfQoqcG9Yg8TIwk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eaoslj/btrSQUUWfyn/1m03dZLBfQoqcG9Yg8TIwk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eaoslj/btrSQUUWfyn/1m03dZLBfQoqcG9Yg8TIwk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feaoslj%2FbtrSQUUWfyn%2F1m03dZLBfQoqcG9Yg8TIwk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;48&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. Set labels for buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669362711756&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  send_message(str, optionHD, 0x0A);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2KupN/btrSXp6CQVh/mcWUrppf1Ebx128ukpXeKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2KupN/btrSXp6CQVh/mcWUrppf1Ebx128ukpXeKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2KupN/btrSXp6CQVh/mcWUrppf1Ebx128ukpXeKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2KupN%2FbtrSXp6CQVh%2FmcWUrppf1Ebx128ukpXeKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;84&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bttuGy/btrSUTtVVFD/e63miKWFs3JnGNgtee73Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bttuGy/btrSUTtVVFD/e63miKWFs3JnGNgtee73Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bttuGy/btrSUTtVVFD/e63miKWFs3JnGNgtee73Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbttuGy%2FbtrSUTtVVFD%2Fe63miKWFs3JnGNgtee73Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;181&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;181&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. Set the toggle/push properties of the left 4 buttons or 20 buttons of all.&lt;/p&gt;
&lt;pre id=&quot;code_1669362794316&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0000&quot;)          // left pad: up-left-right-down
//F(&quot;00000000001111110000&quot;) // 0000:left, 0000:right, 001111110000:center
void setLeftPadOrAllToggle(String str){ 
  send_message(str, optionHD, 0x0B);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHpvpu/btrSUpNALHe/DIQn96I6moZ0Os3AUclCyK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHpvpu/btrSUpNALHe/DIQn96I6moZ0Os3AUclCyK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHpvpu/btrSUpNALHe/DIQn96I6moZ0Os3AUclCyK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHpvpu%2FbtrSUpNALHe%2FDIQn96I6moZ0Os3AUclCyK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;105&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21. Set the toggle/push properties of the right 4 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669362830268&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;0000&quot;)         // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  send_message(str, optionHD, 0x0C);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22. Set the toggle/push properties of the middle 12 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669362848468&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;000000000000&quot;) // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ // must after setLeftPadMode(uint8_t val)
  send_message(str, optionHD, 0x0D);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;23. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1669362865011&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String str = F(&quot;RAD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; str += ':';
  str += String(selection);
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDV78n/btrSN0ONmaq/JPqA8CBuXYkSF391aSBuGK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDV78n/btrSN0ONmaq/JPqA8CBuXYkSF391aSBuGK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDV78n/btrSN0ONmaq/JPqA8CBuXYkSF391aSBuGK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDV78n%2FbtrSN0ONmaq%2FJPqA8CBuXYkSF391aSBuGK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;24. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669362894363&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String str = F(&quot;CKB:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5RWDl/btrSTyKJDp0/uwaqhl4QH4wWhqzSdTVfl1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5RWDl/btrSTyKJDp0/uwaqhl4QH4wWhqzSdTVfl1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5RWDl/btrSTyKJDp0/uwaqhl4QH4wWhqzSdTVfl1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5RWDl%2FbtrSTyKJDp0%2Fuwaqhl4QH4wWhqzSdTVfl1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;25. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1669362923827&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String str = F(&quot;CHD:&quot;); 
  str = String(id); str += ':'; 
  str += message; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y2lPv/btrSOyxRxKB/dkjB3OVPfdyWHSQxaGIpRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y2lPv/btrSOyxRxKB/dkjB3OVPfdyWHSQxaGIpRK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y2lPv/btrSOyxRxKB/dkjB3OVPfdyWHSQxaGIpRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy2lPv%2FbtrSOyxRxKB%2FdkjB3OVPfdyWHSQxaGIpRK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;26. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1669362955484&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String str = F(&quot;LSD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VpwG2/btrSN2eL79G/l4lqIIQ6nWUqOh6JxxSK0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VpwG2/btrSN2eL79G/l4lqIIQ6nWUqOh6JxxSK0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VpwG2/btrSN2eL79G/l4lqIIQ6nWUqOh6JxxSK0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVpwG2%2FbtrSN2eL79G%2Fl4lqIIQ6nWUqOh6JxxSK0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;294&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;27. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1669362994620&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  String str = F(&quot;STR:&quot;); 
  str += String(id); str += ':'; 
  str += title; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XYf3J/btrSUIGbeZP/681gNbNNWyVjqVInNl3YBk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XYf3J/btrSUIGbeZP/681gNbNNWyVjqVInNl3YBk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XYf3J/btrSUIGbeZP/681gNbNNWyVjqVInNl3YBk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXYf3J%2FbtrSUIGbeZP%2F681gNbNNWyVjqVInNl3YBk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.ESP32_BLE_JOYSTICK.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/CJzSz/btrSWxw4osp/6YsQeFtTSOYuyPV9aduKO1/1.ESP32_BLE_JOYSTICK.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1.ESP32_BLE_JOYSTICK.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/lvEU_xQaV00&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/lvEU_xQaV00&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/lvEU_xQaV00&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1670258326602&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;BLEDevice.h&amp;gt;
#include &amp;lt;BLEServer.h&amp;gt;
#include &amp;lt;BLEUtils.h&amp;gt;
#include &amp;lt;BLE2902.h&amp;gt;

BLEServer *pServer = NULL;
BLECharacteristic * pTxCharacteristic;
bool deviceConnected = false;
bool rx_received = false;      // flag to excute the function when receiving data from BLE
std::string rxValue; // Set global variables to save the received data from BLE

unsigned long int disconnectTime = 0;
bool needAppCheck = false;
bool appConnection = false;

#include &quot;protocol.h&quot;

class MyServerCallbacks: public BLEServerCallbacks {
  void onConnect(BLEServer* pServer) {
    deviceConnected = true;
    disconnectTime = millis(); needAppCheck = true; 
    Serial.println(F(&quot;connected&quot;));
  };
  void onDisconnect(BLEServer* pServer) {
    deviceConnected = false;
    delay(500);
    pServer-&amp;gt;startAdvertising(); // restart advertising
    Serial.println(F(&quot;start advertising&quot;));
  }
};

class MyCallbacks: public BLECharacteristicCallbacks {
  void onWrite(BLECharacteristic *pCharacteristic) {
    rxValue = pCharacteristic-&amp;gt;getValue();
//    if (rxValue.length() &amp;gt; 0) {
//      for (int i = 0; i &amp;lt; rxValue.length(); i++) {
//        Serial.print(i); Serial.print(&quot;: &quot;); Serial.println(rxValue[i], HEX);
//      }
//    }
    rx_received = true;
  }
};

#define btName &quot;ESP32ble&quot;

#define SERVICE_UUID           &quot;6E400001-B5A3-F393-E0A9-E50E24DCCA9E&quot; // UART service UUID
#define CHARACTERISTIC_UUID_RX &quot;6E400002-B5A3-F393-E0A9-E50E24DCCA9E&quot;
#define CHARACTERISTIC_UUID_TX &quot;6E400003-B5A3-F393-E0A9-E50E24DCCA9E&quot;

void setup() {
  Serial.begin(115200);
  
  BLEDevice::init(btName);  //(&quot;ESP32&quot;);// Create the BLE Device
  pServer = BLEDevice::createServer();  // Create the BLE Server
  pServer-&amp;gt;setCallbacks(new MyServerCallbacks());
  BLEService *pService = pServer-&amp;gt;createService(SERVICE_UUID);  // Create the BLE Service
  pTxCharacteristic = pService-&amp;gt;createCharacteristic (  // Create a BLE Characteristic
                      CHARACTERISTIC_UUID_RX,
                      BLECharacteristic::PROPERTY_NOTIFY
                    );
  pTxCharacteristic-&amp;gt;addDescriptor(new BLE2902());
  BLECharacteristic * pRxCharacteristic = pService-&amp;gt;createCharacteristic (
                                          CHARACTERISTIC_UUID_TX,
                                          BLECharacteristic::PROPERTY_WRITE
                                        );
  pRxCharacteristic-&amp;gt;setCallbacks(new MyCallbacks());
  pService-&amp;gt;start();  // Start the service  
  pServer-&amp;gt;getAdvertising()-&amp;gt;start();  // Start advertising
  Serial.println(F(&quot;Waiting a client connection to notify...&quot;));
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(F(&quot;button 1 : on&quot;)); 
                  break;
      case 10: Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 51: Serial.println(F(&quot;button 5 : on&quot;));
                  break;
      case 50: Serial.println(F(&quot;button 5 : off&quot;));
                  break;
      case 61: Serial.println(F(&quot;button 6 : on&quot;));
                  break;
      case 60: Serial.println(F(&quot;button 6 : off&quot;));
                  break;
      case 71: Serial.println(F(&quot;button 7 : on&quot;));
                  break;
      case 70: Serial.println(F(&quot;button 7 : off&quot;));
                  break;
      case 81: Serial.println(F(&quot;button 8 : on&quot;));
                  break;
      case 80: Serial.println(F(&quot;button 8 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(F(&quot;button 10 : on&quot;));
                //uint8_t id, String title, String option
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,tomato,banana,mango&quot;)); 
                  break;
      case 100: Serial.println(F(&quot;button 10 : off&quot;));
                  break;  
      case 111: Serial.println(F(&quot;button 11 : on&quot;));
                  break;
      case 110: Serial.println(F(&quot;button 11 : off&quot;));
                  break;  
      case 121: Serial.println(F(&quot;button 12 : on&quot;));
                  break;
      case 120: Serial.println(F(&quot;button 12 : off&quot;));
                  break;  
      case 131: Serial.println(F(&quot;button 13 : on&quot;));
                  break;  
      case 130: Serial.println(F(&quot;button 13 : off&quot;));
                  break;  
      case 141: Serial.println(F(&quot;button 14 : on&quot;));
                  break;  
      case 140: Serial.println(F(&quot;button 14 : off&quot;));
                  break;  
      case 151: Serial.println(F(&quot;button 15 : on&quot;));
                  break;  
      case 150: Serial.println(F(&quot;button 15 : off&quot;));
                  break;         
      case 161: Serial.println(F(&quot;button 16 : on&quot;));
                  break;
      case 160: Serial.println(F(&quot;button 16 : off&quot;));
                  break;  
      case 171: Serial.println(F(&quot;button 17 : on&quot;));
                  break;
      case 170: Serial.println(F(&quot;button 17 : off&quot;));
                  break;  
      case 181: Serial.println(F(&quot;button 18 : on&quot;));
                  break;  
      case 180: Serial.println(F(&quot;button 18 : off&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : on&quot;));
                  break;  
      case 190: Serial.println(F(&quot;button 19 : off&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : on&quot;));
                  break;  
      case 200: Serial.println(F(&quot;button 20 : off&quot;));
                  break; 
      case 210: Serial.println(F(&quot;button 21 : off&quot;));
                  break;  
      case 220: Serial.println(F(&quot;button 22 : off&quot;));
                  break;          
    }
  }
}

// headingVal = false;
//           Top
//         6  7  0
//          \ | /
//  Left 5 --   -- 1 Right
//          / | \
//         4  3  2
//          Bottom

bool headingVal = true; 

void joystick_control(uint8_t id, uint16_t heading, uint8_t strength) {
  //sendJoyEcho(id, heading, strength); 
  if (id == 0) Serial.print(F(&quot;L: &quot;));
  else if (id == 1) Serial.print(F(&quot;R: &quot;));
  else Serial.print(F(&quot;C: &quot;));
  if (headingVal) {
    Serial.print(heading); Serial.print('/'); Serial.println(strength);
  } else {
    if (heading &amp;lt;= 23) heading = 359;
    int8_t stickDir = (heading-23)/45;  
    Serial.println(stickDir);
  }
}

bool gotEnd = false;
String message = &quot;&quot;;

void BLE_read() {
  if (rx_received == true) {
    if (appConnection) {
      String temp = &quot;&quot;; 
      if (rxValue[0] == joyHD) {          // 0xF3
        if (rxValue[5] == footHD) {       // verification of Received value
          uint16_t value = rxValue[3];
          value = value &amp;lt;&amp;lt; 8 | rxValue[2];
          joystick_control(rxValue[1], value, rxValue[4]); // execute the code with values
        }
      } else if (rxValue[0] == pinHD) {   // 0xF0
        uint8_t cn = 0;
        while (rxValue[cn] == pinHD) {    // need depend on left arrow pad mode 
          if (rxValue[cn+2] == footHD) {  // verification of Received value
            pin_control(rxValue[cn+1]);   // execute the code with values
          }
          cn = cn+3;
        }
      } else {
        String hd = connectHDstr; 
        if (rxValue[0] == hd[0] &amp;amp;&amp;amp; rxValue[1] == hd[1] &amp;amp;&amp;amp; rxValue[2] == hd[2]) {
          for (int i = hd.length(); i &amp;lt; rxValue.length(); i++) {
            if (rxValue[i] != '\n') message += rxValue[i];
            else { gotEnd = true; break; }
          }
          if (gotEnd) {
            if (rxValue[3] == hd[3]) CheckF8(message);
            else CheckF9(message);
            gotEnd = false; message = &quot;&quot;;
          }
        } else {
          for (int i = 0; i &amp;lt; rxValue.length(); i++) Serial.print(rxValue[i]);
        }
      }
    } else CheckF8(&quot;&quot;);
    rx_received = false;
  }
}

void loop() {
  BLE_read();
  orderDisconnect();
  if(Serial.available()) { // if there is data in the serial buffer
    String temp = Serial.readStringUntil('\n'); // option of serial monitor: NEW LINE
    Serial.println(temp);
    if(temp == &quot;1&quot;){   
      
    } else if(temp == &quot;2&quot;){ 
      sendJoyState(0, 45, 10);
    } else if(temp == &quot;3&quot;){ 
      sendJoyEcho(1, 45, 10);
    } else if(temp == &quot;4&quot;){
      setActiveJoystick(true);
    } else if(temp == &quot;5&quot;){
      setActiveJoystick(false);
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1670258376983&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD 0xF0
#define joyHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define connectHDstr F(&quot;%%F8&quot;)
#define optionHD 0xF9

uint8_t pin[] = {pinHD, 0, 0}; //F0, pin state, F1

void sendPinState(uint8_t pin_val){
  pin[1] = pin_val;
  pin[2] = footHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pin, 3);
  pTxCharacteristic-&amp;gt;notify();
}

void sendPinEcho(uint8_t pin_val){
  pin[1] = pin_val;
  pin[2] = echoHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pin, 3);
  pTxCharacteristic-&amp;gt;notify();
}

uint8_t joystick[] = {joyHD, 0, 0, 0, 0, 0}; //F3, slide number, 16bit value, F1

// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) {
  joystick[1] = id;
  joystick[2] = heading;
  joystick[3] = heading &amp;gt;&amp;gt; 8;
  joystick[4] = strength;
  joystick[5] = footHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;joystick, 6);
  pTxCharacteristic-&amp;gt;notify();
}

void sendJoyEcho(uint8_t id, uint16_t heading, uint8_t strength) {
  joystick[1] = id;
  joystick[2] = heading;
  joystick[3] = heading &amp;gt;&amp;gt; 8;
  joystick[4] = strength;
  joystick[5] = echoHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;joystick, 6);
  pTxCharacteristic-&amp;gt;notify();
}

void sendText(String str) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 18) {
     repeat = (len/18)+1;
     endLen = (len%18);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = strHD;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 18;
    else ed = endLen;
    for (int i = 1; i &amp;lt; ed+1; i++) {
      temp[i] = str[(r*18)+i-1];
    }
    if (repeat-r &amp;gt; 1) temp[ed+1] = echoHD;
    else temp[ed+1] = footHD;
    temp[ed+2] = '\0';
    pTxCharacteristic-&amp;gt;setValue(temp); 
    pTxCharacteristic-&amp;gt;notify();
  }
}

///////////////////////////////////////// CONNECTION 
void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3];
  setVal[0] = connectHD;
  setVal[1] = 0x01;
  setVal[2] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
  pTxCharacteristic-&amp;gt;notify();
}

//#define passName F(&quot;PAS:&quot;)
//#define pnLength 4
//
//void requestPass(bool val){ // order disconnect to App 
//  uint8_t setVal[3+pnLength];
//  String temp = passName;
//  setVal[0] = connectHD;
//  setVal[1] = 0x02;
//  if (val) {
//    setVal[2] = pnLength;
//    for (int i = 0; i&amp;lt;pnLength;i++) setVal[i+3] = temp[i];
//    pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3+pnLength); 
//  } else {
//    setVal[2] = val;
//    pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
//  }
//  pTxCharacteristic-&amp;gt;notify();
//}
//
//void responsePass(bool val){ 
//  uint8_t setVal[3];
//  setVal[0] = connectHD;
//  setVal[1] = 0x03;
//  setVal[2] = val;
//  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
//  pTxCharacteristic-&amp;gt;notify();
//}

void send_message(String str, uint8_t head, uint8_t fn) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 17) {
     repeat = (len/17)+1;
     endLen = (len%17);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = head;
    temp[1] = fn;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 17;
    else ed = endLen;
    for (int i = 2; i &amp;lt; ed+2; i++) {
      temp[i] = str[(r*17)+i-2];
    }
    if (repeat-r &amp;gt; 1) temp[ed+2] = echoHD;
    else temp[ed+2] = footHD;
    temp[ed+3] = '\0';
    pTxCharacteristic-&amp;gt;setValue(temp); 
    pTxCharacteristic-&amp;gt;notify();
  }
}

void sendMessage(String str) {
  send_message(str, connectHD, 0x04);
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveJoystick(bool val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x01;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

// SEND SLIDE GET VALUE INTERVAL
void setJoystickInterval(uint16_t val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x02;
  setVal[2] = val;
  setVal[3] = val &amp;gt;&amp;gt; 8;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x03;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

void setJoyStrengthAdjust(bool val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x04;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){   
  if (val == 0 || val &amp;gt; 2) val = 4; 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x05;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x06;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x07;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

// 0: not use, 1: show only name, 2: show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x08;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x09;
  setVal[2] = val;
  setVal[3] = val &amp;gt;&amp;gt; 8;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  send_message(str, optionHD, 0x0A);
}

//F(&quot;0000&quot;)          // left pad: up-left-right-down
void setLeftPadOrAllToggle(String str){ 
  send_message(str, optionHD, 0x0B);
}
// F(&quot;0000&quot;)         // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  send_message(str, optionHD, 0x0C);
}
// F(&quot;000000000000&quot;) // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ // must after setLeftPadMode(uint8_t val)
  send_message(str, optionHD, 0x0D);
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String str = F(&quot;RAD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; str += ':';
  str += String(selection);
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String str = F(&quot;CKB:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String str = F(&quot;CHD:&quot;); 
  str = String(id); str += ':'; 
  str += message; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String str = F(&quot;LSD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  String str = F(&quot;STR:&quot;); 
  str += String(id); str += ':'; 
  str += title; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  setAddButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;)); 
  setJoyWay4(false);
  setActiveJoystick(true); setJoystickInterval(100);
  setJoyStrengthAdjust(true);
  setSSIDLabelMode(0); // btName Label long click function disabled
  //useGravityAndInterval(180);
}

void btDisconnect() {
  sendDisconnect();
  delay(10);
  pServer-&amp;gt;disconnect(pServer-&amp;gt;getConnId());
}

void orderDisconnect() { 
  if (needAppCheck) { 
    if (!appConnection) {
      if (millis() - disconnectTime &amp;gt; 3000) {
        needAppCheck = false;
        btDisconnect();
        Serial.println(F(&quot;enter app check disconnect&quot;));
      }
    } 
  } 
}

void CheckF8(String temp) {
  if (temp == &quot;&quot;) {
    String hd = connectHDstr; 
    if (rxValue[0] == hd[0] &amp;amp;&amp;amp; rxValue[1] == hd[1] &amp;amp;&amp;amp; rxValue[2] == hd[2] &amp;amp;&amp;amp; rxValue[3] == hd[3]) {
      for (int i = hd.length(); i &amp;lt; rxValue.length(); i++) {
        if (rxValue[i] != '\n') temp += rxValue[i];
        else break;
      }
      if (temp == F(&quot;connect&quot;)) { delay(100); needAppCheck = false; appConnection = true; iniSet(); }
    } else { btDisconnect(); needAppCheck = false; }
  } else {
    if (temp == F(&quot;disconnect&quot;)) appConnection = false;  
    else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); } 
    else Serial.println(temp);
  }
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUPAD app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUPAD app settings: label/toggle properties, use of the timer for checkHD(0xF5), Slide Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1670258588950&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  setAddButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;)); 
  setJoyWay4(false);
  setActiveJoystick(true); setJoystickInterval(100); // Active Joystick Mode
  setJoyStrengthAdjust(true);                        // value of Joystick adjusted into 0 ~ 10
  setSSIDLabelMode(0); // not use change the name for blutooth of ESP32
  //useGravityAndInterval(180);  // use or not the Gravity sensor with the interval
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the leftPadMode and menu-related button.&lt;/p&gt;
&lt;pre id=&quot;code_1670258738231&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up DIR&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;)); 
                  break;
      case 10: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left DIR&quot;));
               else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right DIR&quot;));
               else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down DIR&quot;));
               else Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down off&quot;));
               else Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
               //uint8_t id, String title, String option
               dialogList(0, F(&quot;LEFT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(&quot;button 10 : on&quot;);
                //uint8_t id, String title, String option
                dialogList(2, F(&quot;RIGHT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1670258774373&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }         // radio button
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }    // Checkbox
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }    // Select button
  else if (temp.startsWith(F(&quot;LSD&quot;))) {       // List Window
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { leftPadMode = 0; setLeftPadOrAllToggle(F(&quot;0000&quot;)); }
      else if (temp.startsWith(F(&quot;TOG&quot;))) {
        setLeftPadOrAllToggle(F(&quot;1111&quot;)); // set toggle for left button
        dialogList(1, F(&quot;LEFT PAD MODE AT TOGGLE&quot;), F(&quot;SELECT,INDIVIDUAL,TWO GROUP,ONLY ONE&quot;)); // dialog message
      }
    } else if (id == 1) {
      if (temp.startsWith(F(&quot;IND&quot;))) leftPadMode = 1; // independant
      else if (temp.startsWith(F(&quot;TWO&quot;))) leftPadMode = 2; // 2 group: up/down, left/right
      else if (temp.startsWith(F(&quot;ONL&quot;))) leftPadMode = 4; // 4psc button is 1 group
      setLeftPadMode(leftPadMode);
    } else if (id == 2) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { rightPadMode = 0; setRightPadToggle(F(&quot;0000&quot;)); } // set push for right button
      else { rightPadMode = 1; setRightPadToggle(F(&quot;1111&quot;)); }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }       // Input text
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1.ESP32_BLE_JOYSTICK_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Jivfr/btrSYlXien9/Gy53ByK2ImR2RA6xFmBGv0/1-1.ESP32_BLE_JOYSTICK_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1-1.ESP32_BLE_JOYSTICK_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/g9i-kLxp_Sc&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/g9i-kLxp_Sc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/g9i-kLxp_Sc&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Change name for the bluetooth of ESP32 on ADUPAD App&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SZbRU/btrSW58evpq/LGAxdsmwuKZRkokPZkkM0k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SZbRU/btrSW58evpq/LGAxdsmwuKZRkokPZkkM0k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SZbRU/btrSW58evpq/LGAxdsmwuKZRkokPZkkM0k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSZbRU%2FbtrSW58evpq%2FLGAxdsmwuKZRkokPZkkM0k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlueBLEname.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6V1Jd/btrSYmhA9WJ/7SI1YNM2QPTKL9kZAGnei0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6V1Jd/btrSYmhA9WJ/7SI1YNM2QPTKL9kZAGnei0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6V1Jd/btrSYmhA9WJ/7SI1YNM2QPTKL9kZAGnei0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6V1Jd%2FbtrSYmhA9WJ%2F7SI1YNM2QPTKL9kZAGnei0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;129&quot; data-filename=&quot;ssidBlueBLEname.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save the name for the bluetooth of ESP32.&lt;/p&gt;
&lt;pre id=&quot;code_1670258966038&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;SPIFFS.h&quot;  // ESP32 SPIFSPIFFS 라이브러리
char btName[11] = &quot;ESP32&quot;;  // 10 char&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SPIFFS Setting&lt;/p&gt;
&lt;pre id=&quot;code_1670258996108&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool saveConfig() {   // Write NAME
  String value = btName;
  Serial.println(value);
  File configFile = SPIFFS.open(F(&quot;/config.txt&quot;), &quot;w&quot;);
  if (!configFile) {
    Serial.println(F(&quot;Failed to open config file for writing&quot;));
    return false;
  } else {
    configFile.println(value); // save at config.txt including '\n'
    configFile.close();
    return true;
  }
}

bool loadConfig() { // Read NAME
  File configFile = SPIFFS.open(F(&quot;/config.txt&quot;), &quot;r&quot;);
  if (!configFile) {
    Serial.println(F(&quot;Failed to open config file&quot;));
    return false;
  } else {
    String temp = configFile.readStringUntil('\r');
    for (int i = 0; i &amp;lt; temp.length(); i++) btName[i] = temp[i];
    btName[temp.length()] = '\0';
    configFile.close();
    Serial.println(btName);
    return true;
  }
}

void setup() {
    if (SPIFFS.exists(F(&quot;/config.txt&quot;))) loadConfig(); // if there is &quot;/config.txt&quot;, read
    else saveConfig();  // if there is not, save a new config.txt 
}

// SPIFFS initialization code at serial monitor
void loop() {
  if(Serial.available()) { // Serial monitor
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if(temp == &quot;1&quot;){   
      esp_bt_controller_disable();
      Serial.println(F(&quot;format...&quot;));
      SPIFFS.format();
      Serial.println(F(&quot;done. can start upload.&quot;));
      while(1); // stanby for uploading
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Save parsing data for name and remove the data for password and send a message applyed in Arduino.&lt;/p&gt;
&lt;pre id=&quot;code_1670259045581&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void changeBTname(String str) { 
  bool save = false; 
  String temp = str.substring(0, 1);
  bool delPass = temp.toInt(); // if true, there is data for password which is not used in this sketch 
  str.remove(0, 1);
  if (delPass) str.remove(0, 6); // remove pass
  if (str != btName) {
    if (temp != &quot;&quot;) {
      for (int i = 0; i &amp;lt; str.length(); i++) btName[i] = str[i];
      btName[str.length()] = '\0';
      save = true; 
    }
  }
  if (save) {
    saveConfig();
    temp  = F(&quot;&amp;lt;p&amp;gt;NAME:  &quot;);
    temp += btName;
    temp += F(&quot;&amp;lt;/p&amp;gt;Value's Saved.&quot;);
    if (delPass) temp += F(&quot;&amp;lt;br/&amp;gt;Function of Set pass is not provided.&amp;lt;br/&amp;gt;&quot;);
    temp += F(&quot; The module will reboot.&amp;lt;br/&amp;gt;try to reconnect.&quot;);
    sendMessage(temp);
    sendDisconnect(); delay(500); ESP.restart();
  } else {
    temp  = F(&quot;There's no change.&quot;);
    if (delPass) temp += F(&quot;&amp;lt;br/&amp;gt;Function of Set pass is not provided.&quot;);
    sendMessage(temp);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.ESP32_BLE_JOYSTICK_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b53Wca/btrSOyq7AW3/sbiS7HseeWgeT0ksIj4BR1/2.ESP32_BLE_JOYSTICK_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;2.ESP32_BLE_JOYSTICK_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SPIFFS_FORMAT_ESP32.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/nkXqz/btrSW58evSA/hjklrj5oSVdBTsNYNLmcA0/SPIFFS_FORMAT_ESP32.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;SPIFFS_FORMAT_ESP32.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/PIsbEvaD8SM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/PIsbEvaD8SM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PIsbEvaD8SM&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Login&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Obtain control authority using the password for BLE of ESP32.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbjSzD/btrSWxYaG2R/PHbknpaMQT4jfx42yuyLS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbjSzD/btrSWxYaG2R/PHbknpaMQT4jfx42yuyLS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbjSzD/btrSWxYaG2R/PHbknpaMQT4jfx42yuyLS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbjSzD%2FbtrSWxYaG2R%2FPHbknpaMQT4jfx42yuyLS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9tPQg/btrSUBNPGbE/lo2roWNuuvbFwMkl3oa5J0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9tPQg/btrSUBNPGbE/lo2roWNuuvbFwMkl3oa5J0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9tPQg/btrSUBNPGbE/lo2roWNuuvbFwMkl3oa5J0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9tPQg%2FbtrSUBNPGbE%2Flo2roWNuuvbFwMkl3oa5J0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;41&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save the name for the bluetooth of ESP32 and the set password for login.&lt;/p&gt;
&lt;pre id=&quot;code_1670259187853&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char btName[11] = &quot;ESP32&quot;;  // 10 char
char pass[7] = &quot;123456&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Password&amp;nbsp;handling&amp;nbsp;code:&amp;nbsp;response&amp;nbsp;message,&amp;nbsp;input&amp;nbsp;prohibition&amp;nbsp;setting,&amp;nbsp;etc.&lt;/p&gt;
&lt;pre id=&quot;code_1670259252701&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool waitPass = false;
uint8_t passAllow = 5;

#define passWaitTime 120000
#define banResetTime 600000

void banReset() {  // if wrong password is entered 5 times, banned inputting for banResetTime
  if (millis() - disconnectTime &amp;gt; banResetTime) passAllow = 5; 
}

void orderDisconnect() { 
  if (!appConnection) {
    if (millis() - disconnectTime &amp;gt; 3000) { // If &quot;%%F8connect&quot; is not confirmed within disconnectTime after receiving the first data through BLE
      needAppCheck = false;
      btDisconnect();
      Serial.println(F(&quot;enter app check disconnect&quot;));
    }
  } else if (waitPass) { // if there's no input a pass within passWaitTime, terminate the connection
    if (millis() - disconnectTime &amp;gt; passWaitTime) {
      Serial.println(&quot;time over&quot;);
      needAppCheck = false; waitPass = false; appConnection = false; 
      sendMessage(F(&quot;It's disconnected by time expires.&amp;lt;br/&amp;gt;Try to reconnect.&quot;));
      sendDisconnect(); 
    }
  }
}

void CheckF8(String temp) {
  if (temp == &quot;&quot;) {
    String hd = connectHDstr; 
    if (rxValue[0] == hd[0] &amp;amp;&amp;amp; rxValue[1] == hd[1] &amp;amp;&amp;amp; rxValue[2] == hd[2] &amp;amp;&amp;amp; rxValue[3] == hd[3]) {
      for (int i = hd.length(); i &amp;lt; rxValue.length(); i++) {
        if (rxValue[i] != '\n') temp += rxValue[i];
        else break;
      }
      if (waitPass) { 
        if (temp.startsWith(passName)) {
          temp.remove(0, pnLength); bool ok = true;
          if (temp.length() == 6) {
            for (int i = 0; i &amp;lt; 6; i++) { if (temp[i] != pass[i]) { ok = false; break; } }
          }
          if (ok) { passOK = true; waitPass = false; needAppCheck = false; iniSet(); send_State(); }  
          else { passAllow--; disconnectTime = millis(); } // wrong password &amp;amp; timer set
          if (!passAllow) { // if wrong password is entered 5 times
            waitPass = false; appConnection = false; 
            sendMessage(F(&quot;You've got wrong password 5 times.&amp;lt;br/&amp;gt;Try to reconnect 10 Min later.&quot;));
            sendDisconnect(); 
          } else responsePass(ok);
        } else if (temp == F(&quot;connect&quot;)) { requestPass(usePass); disconnectTime = millis(); } // request pass &amp;amp; timer set
        else if (temp == F(&quot;disconnect&quot;)) { waitPass = false; needAppCheck = false; appConnection = false; } 
      } else {
        if (temp == F(&quot;connect&quot;) || temp == F(&quot;autoCon&quot;)) {
          needAppCheck = false; appConnection = true; 
          if (usePass) { 
            delay(100); requestPass(usePass); 
            waitPass = true; needAppCheck = true; disconnectTime = millis(); 
          } else { iniSet(); send_State(); }
        } 
      }
    } else { btDisconnect(); needAppCheck = false; }
  } else {
    if (temp.startsWith(F(&quot;autoCon&quot;))) { needAppCheck = false; } 
    else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; passOK = false; } 
    else if (temp.startsWith(F(&quot;NA&quot;))) { temp.remove(0, 2); changeBTname(temp); }
    else Serial.println(temp);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.ESP32_BLE_JOYSTICK_PASS.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Y9bPj/btrSRQybKmH/kcPky6QG32NrvRnzNfLcZ0/3.ESP32_BLE_JOYSTICK_PASS.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;3.ESP32_BLE_JOYSTICK_PASS.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/Dzpg6swW3Ik&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/Dzpg6swW3Ik&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Dzpg6swW3Ik&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ADUPAD - Arduino wireless remote control PAD application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUPAD</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/196</guid>
      <comments>https://postpop.tistory.com/196#entry196comment</comments>
      <pubDate>Sun, 4 Dec 2022 23:47:04 +0900</pubDate>
    </item>
    <item>
      <title>ESP32 BLE remote control with ADUCON</title>
      <link>https://postpop.tistory.com/195</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUCON application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y0d0K/btrSI9SjSbv/eWuJci9UX4IdHX0nEdghHK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y0d0K/btrSI9SjSbv/eWuJci9UX4IdHX0nEdghHK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y0d0K/btrSI9SjSbv/eWuJci9UX4IdHX0nEdghHK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy0d0K%2FbtrSI9SjSbv%2FeWuJci9UX4IdHX0nEdghHK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;617&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237503813&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUCON - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&amp;amp;hl=ko&amp;amp;gl=KR&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUCON - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Basic code for remote control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Set BLE library for the Bluetooth component of ESP32&lt;/p&gt;
&lt;pre id=&quot;code_1670172484348&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;BLEDevice.h&amp;gt;
#include &amp;lt;BLEServer.h&amp;gt;
#include &amp;lt;BLEUtils.h&amp;gt;
#include &amp;lt;BLE2902.h&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Library function to Inform if the bluetooth component of ESP32 has BLE connection or not&lt;/p&gt;
&lt;pre id=&quot;code_1670173180029&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyServerCallbacks: public BLEServerCallbacks {
  void onConnect(BLEServer* pServer) {
    deviceConnected = true;
    Serial.println(F(&quot;connected&quot;));
  };
  void onDisconnect(BLEServer* pServer) {
    deviceConnected = false;
    pServer-&amp;gt;startAdvertising(); // restart advertising
    Serial.println(F(&quot;start advertising&quot;));
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Library function to receive data through ESP32's BLE connection&lt;/p&gt;
&lt;pre id=&quot;code_1670173459356&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class MyCallbacks: public BLECharacteristicCallbacks {
  void onWrite(BLECharacteristic *pCharacteristic) {
    rxValue = pCharacteristic-&amp;gt;getValue();
//    if (rxValue.length() &amp;gt; 0) { // output the received data to Serial Monitor
//      for (int i = 0; i &amp;lt; rxValue.length(); i++) {
//        Serial.print(i); Serial.print(&quot;: &quot;); Serial.println(rxValue[i], HEX);
//      }
//    }
    rx_received = true;
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- BLE name and UUID settings&lt;/p&gt;
&lt;pre id=&quot;code_1670173693076&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define btName &quot;ESP32ble&quot;
#define SERVICE_UUID           &quot;6E400001-B5A3-F393-E0A9-E50E24DCCA9E&quot; 
#define CHARACTERISTIC_UUID_RX &quot;6E400002-B5A3-F393-E0A9-E50E24DCCA9E&quot;
#define CHARACTERISTIC_UUID_TX &quot;6E400003-B5A3-F393-E0A9-E50E24DCCA9E&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- setup&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1670173724196&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setup() {
  Serial.begin(115200);
  BLEDevice::init(btName);  //(&quot;ESP32&quot;);// Create the BLE Device
  pServer = BLEDevice::createServer();  // Create the BLE Server
  pServer-&amp;gt;setCallbacks(new MyServerCallbacks());
  BLEService *pService = pServer-&amp;gt;createService(SERVICE_UUID);  // Create the BLE Service
  pTxCharacteristic = pService-&amp;gt;createCharacteristic (  // Create a BLE Characteristic
                      CHARACTERISTIC_UUID_TX,
                      BLECharacteristic::PROPERTY_NOTIFY
                    );
  pTxCharacteristic-&amp;gt;addDescriptor(new BLE2902());
  BLECharacteristic * pRxCharacteristic = pService-&amp;gt;createCharacteristic (
                                          CHARACTERISTIC_UUID_RX,
                                          BLECharacteristic::PROPERTY_WRITE
                                        );
  pRxCharacteristic-&amp;gt;setCallbacks(new MyCallbacks());
  pService-&amp;gt;start();  // Start the service
  pServer-&amp;gt;getAdvertising()-&amp;gt;start();  // Start advertising
  Serial.println(F(&quot;Waiting a client connection to notify...&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1670173796348&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool gotData = false;

void loop() {
  if (rx_received == true) { // when incomming data from BLE
    for (int i = 0; i &amp;lt; rxValue.length(); i++) Serial.print(rxValue[i]); // Output data of BLE to the serial monitor.
    Serial.println(); 
    gotData = true; // the flag for response
    rx_received = false;
  } else {
    if (gotData) {  // if response
      char temp [21];
      String setVal = &quot;&quot;;
      setVal += char(0xF4);      // protocol header of text for ADUCON with bluetooth
      setVal += &quot;Hello World &quot;;
      setVal += random(100,200); // the message for sending
      setVal += char(0xF1);      // protocol footer of text for ADUCON with bluetooth
      setVal += '\0';            // end character for sending, pTxCharacteristic-&amp;gt;setValue(temp);
      Serial.println(setVal);    // Output the message to the serial monitor.
      if (setVal.length() &amp;lt;= 21) { // convert String to array of Char
        for (int i = 0; i &amp;lt; setVal.length(); i++) temp[i] = setVal[i];
      }
      pTxCharacteristic-&amp;gt;setValue(temp); 
      pTxCharacteristic-&amp;gt;notify();
      gotData = false;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_BLE_BASIC.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/c7Scx7/btrSJyYCshp/1oSgInC6tqbfeQXtJCcBLk/ESP32_BLE_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_BLE_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ESP32_BLE_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32ble.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JnO3t/btrSOxxiA06/394KJJHmfojtYPO4VUHgxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JnO3t/btrSOxxiA06/394KJJHmfojtYPO4VUHgxk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JnO3t/btrSOxxiA06/394KJJHmfojtYPO4VUHgxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJnO3t%2FbtrSOxxiA06%2F394KJJHmfojtYPO4VUHgxk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorESP32ble.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;connecting to BLE of ESP32 on the ADUCON app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Bluetooth 4.0 Search and Connection in the App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth icon in the app and select Bluetooth 4.0 in Select Ver.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth button and select the BLE of ESP32.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectESP32BLE.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HNSge/btrSOwZslus/fxrsbAyxsUkcHG8xi6RTr1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HNSge/btrSOwZslus/fxrsbAyxsUkcHG8xi6RTr1/img.jpg&quot; data-alt=&quot;Select ESP32ble&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HNSge/btrSOwZslus/fxrsbAyxsUkcHG8xi6RTr1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHNSge%2FbtrSOwZslus%2FfxrsbAyxsUkcHG8xi6RTr1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;430&quot; data-filename=&quot;connectESP32BLE.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Select ESP32ble&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectedESP32BLE.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOpqKv/btrSI8ToWiz/FQW1qK9B8Att8Gc8txHAN1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOpqKv/btrSI8ToWiz/FQW1qK9B8Att8Gc8txHAN1/img.jpg&quot; data-alt=&quot;connected to ESP32ble&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOpqKv/btrSI8ToWiz/FQW1qK9B8Att8Gc8txHAN1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOpqKv%2FbtrSI8ToWiz%2FFQW1qK9B8Att8Gc8txHAN1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;83&quot; data-filename=&quot;connectedESP32BLE.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;connected to ESP32ble&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32bleRESaducon.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QQjoF/btrSOyQvFPC/6oVA4gM4krKjS5ws977RF1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QQjoF/btrSOyQvFPC/6oVA4gM4krKjS5ws977RF1/img.jpg&quot; data-alt=&quot;received data &amp;quot;%%F8connect&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QQjoF/btrSOyQvFPC/6oVA4gM4krKjS5ws977RF1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQQjoF%2FbtrSOyQvFPC%2F6oVA4gM4krKjS5ws977RF1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorESP32bleRESaducon.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data &quot;%%F8connect&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseBLEADUCONesp32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMJ0p5/btrSPRvCE7z/mtRQK4DncrlS6YFx5lyeUk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMJ0p5/btrSPRvCE7z/mtRQK4DncrlS6YFx5lyeUk/img.jpg&quot; data-alt=&quot;response from ESP32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMJ0p5/btrSPRvCE7z/mtRQK4DncrlS6YFx5lyeUk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMJ0p5%2FbtrSPRvCE7z%2FmtRQK4DncrlS6YFx5lyeUk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;97&quot; data-filename=&quot;responseBLEADUCONesp32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;response from ESP32&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※&amp;nbsp;If&amp;nbsp;a&amp;nbsp;Bluetooth&amp;nbsp;device&amp;nbsp;is&amp;nbsp;registered&amp;nbsp;using&amp;nbsp;the&amp;nbsp;same&amp;nbsp;device&amp;nbsp;for&amp;nbsp;Bluetooth&amp;nbsp;Classic&amp;nbsp;connection,&amp;nbsp;the&amp;nbsp;registered&amp;nbsp;device&amp;nbsp;must&amp;nbsp;be&amp;nbsp;removed&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;by&amp;nbsp;BLE&amp;nbsp;from&amp;nbsp;the&amp;nbsp;app. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;If&amp;nbsp;the&amp;nbsp;device&amp;nbsp;has&amp;nbsp;registered,&amp;nbsp;it&amp;nbsp;will&amp;nbsp;interfere&amp;nbsp;with&amp;nbsp;the&amp;nbsp;BLE&amp;nbsp;connection&amp;nbsp;and&amp;nbsp;the&amp;nbsp;device&amp;nbsp;will&amp;nbsp;not&amp;nbsp;respond&amp;nbsp;to&amp;nbsp;BLE&amp;nbsp;connection&amp;nbsp;requests&amp;nbsp;from&amp;nbsp;the&amp;nbsp;app.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uvIOM/btszZI5mS66/Fk7UY3eKncIU5yvcOkOVDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uvIOM/btszZI5mS66/Fk7UY3eKncIU5yvcOkOVDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uvIOM/btszZI5mS66/Fk7UY3eKncIU5yvcOkOVDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuvIOM%2FbtszZI5mS66%2FFk7UY3eKncIU5yvcOkOVDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;336&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xyQGy/btszZIK1zBe/3y8KbejRw5QqwsQPnl9wu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xyQGy/btszZIK1zBe/3y8KbejRw5QqwsQPnl9wu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xyQGy/btszZIK1zBe/3y8KbejRw5QqwsQPnl9wu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxyQGy%2FbtszZIK1zBe%2F3y8KbejRw5QqwsQPnl9wu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;173&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP6ntQ/btsz2luDU7k/hpohpaJYtZDKTzx2YJAmm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP6ntQ/btsz2luDU7k/hpohpaJYtZDKTzx2YJAmm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP6ntQ/btsz2luDU7k/hpohpaJYtZDKTzx2YJAmm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP6ntQ%2Fbtsz2luDU7k%2FhpohpaJYtZDKTzx2YJAmm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;318&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with BLE of ADUCON applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SerialBT_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ejAuio/btrSJlZrQ3C/JgoUUMVpOjODynrL8YrXK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ejAuio/btrSJlZrQ3C/JgoUUMVpOjODynrL8YrXK0/img.jpg&quot; data-alt=&quot;ADUCON app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ejAuio/btrSJlZrQ3C/JgoUUMVpOjODynrL8YrXK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FejAuio%2FbtrSJlZrQ3C%2FJgoUUMVpOjODynrL8YrXK0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;207&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUCON app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for BLE in the Arduino sketch according to the protocol header settings in the ADUCON app.&lt;/p&gt;
&lt;pre id=&quot;code_1669354428665&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD 0xF0
#define pwmHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define connectHDstr F(&quot;%%F8&quot;)
#define optionHD 0xF9

uint8_t pin[] = {pinHD, 0, 0}; //F0, pin state, F1
uint8_t pwm[] = {pwmHD, 0, 0, 0, 0}; //F3, slide number, 16bit value, F1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1669354562318&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

void BLE_read() {
  if (appConnection) { // If app connection is confirmed
    // Execute code after app connection is confirmed
  } else CheckF8(&quot;&quot;);  // check &quot;%%F8connect&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHDstr(%%F8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + connect&lt;/span&gt;: Transmit the necessary app settings and current Arduino state values through the iniSet() and send_State() functions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + NA&lt;/span&gt;: Change setting values for BT05.&lt;/p&gt;
&lt;pre id=&quot;code_1669354809454&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF8(String temp) {
  if (temp == &quot;&quot;) {
    String hd = connectHDstr; // %%F8
    if (rxValue[0] == hd[0] &amp;amp;&amp;amp; rxValue[1] == hd[1] &amp;amp;&amp;amp; rxValue[2] == hd[2] &amp;amp;&amp;amp; rxValue[3] == hd[3]) {
      for (int i = hd.length(); i &amp;lt; rxValue.length(); i++) {
        if (rxValue[i] != '\n') temp += rxValue[i];
        else break;
      }
      if (temp == F(&quot;connect&quot;)) { delay(100); needAppCheck = false; appConnection = true; iniSet(); send_State(); }
    } else { btDisconnect(); needAppCheck = false; } // disconnect &amp;amp; advertise
  } else {
    if (temp == F(&quot;disconnect&quot;)) appConnection = false; 
    else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); } 
    else Serial.println(temp);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- If &quot;%%F8connect&quot; is not confirmed within disconnectTime after receiving the first data through BLE, the connection is terminated and re-advertise the name of BLE.&lt;/p&gt;
&lt;pre id=&quot;code_1670179622665&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void orderDisconnect() { 
  if (needAppCheck) { 
    if (!appConnection) {
      if (millis() - disconnectTime &amp;gt; 3000) {
        needAppCheck = false;
        btDisconnect();
        Serial.println(F(&quot;enter app check disconnect&quot;));
      }
    } 
  } 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Command the app to click the disconnec button and terminate the connected BLE to ESP32&lt;/p&gt;
&lt;pre id=&quot;code_1670179637221&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void btDisconnect() {
  sendDisconnect();
  delay(10);
  pServer-&amp;gt;disconnect(pServer-&amp;gt;getConnId());
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHDstr(%%F9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669355019565&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
  else { // if not
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;)); // set the time if the length of the value is less than 10
    else Serial.println(F(&quot;date/time&quot;)); // current date/time if larger
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(0xF0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669355136469&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF0 + 1byte Num + 0xF1
if (rxValue[2] == footHD) {     // if the third byte is 0xF1
  pin_control(rxValue[1]);      // execute the code with the value of second byte
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;pwmHD(0xF3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669355230117&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF3 + 1byte Num(slide number) + 2byte Num(PWM) + 0xF1
uint8_t cn = 0;
while (rxValue[cn] == pwmHD) {      // 0xF3, Process 3 PWM values of COLOR PICKER
  if (rxValue[cn+4] == footHD) {    // if the fifth byte is 0xF1
    uint16_t value = rxValue[cn+3]; // Swap third and fourth bytes
    value = value &amp;lt;&amp;lt; 8 | rxValue[cn+2];
    pwm_control(rxValue[cn+1], value); // execute the code with values
  }
  cn = cn+5; // index of next 0xF3
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669355407176&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){
  pin[1] = pin_val;
  pin[2] = footHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pin, 3);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669355434805&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){
  pin[1] = pin_val;
  pin[2] = echoHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pin, 3);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the slide state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669355450454&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {
  pwm[1] = slide;
  pwm[2] = pwm_val;
  pwm[3] = pwm_val &amp;gt;&amp;gt; 8;
  pwm[4] = footHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pwm, 5);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the PWM.&lt;/p&gt;
&lt;pre id=&quot;code_1669355470974&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPwmEcho(uint8_t slide, uint16_t pwm_val) {
  pwm[1] = slide;
  pwm[2] = pwm_val;
  pwm[3] = pwm_val &amp;gt;&amp;gt; 8;
  pwm[4] = echoHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pwm, 5);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A code example that reflects the status of the current button and PWM values of Arduino to the app when connected to the ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1669355495789&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void send_iniState() { // CURRENT STATE
  sendPinState(10); 
  sendPinState(21); 
  sendPinState(30); 
  sendPinState(41); 
  sendPinState(50); 
  sendPinState(61); 
  sendPinState(71); 
  sendPinState(80); 
  sendPinState(91); 
  sendPinState(101); 
  sendPinState(110); 
  sendPinState(121); 
  sendPinState(130); 
  sendPinState(141); 
  sendPinState(150); 
  sendPwmSlide(1, 110); 
  sendPwmSlide(2, 120); 
  sendPwmSlide(3, 210); 
  sendPwmSlide(4, 0); 
  sendPwmSlide(5, 0); 
  sendPwmSlide(6, 0);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAL87P/btrSLKjKeJH/Ygvl29fmRdRjTK28HUWXQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAL87P/btrSLKjKeJH/Ygvl29fmRdRjTK28HUWXQ1/img.jpg&quot; data-alt=&quot;Screen reflecting initial state and labels when connecting Arduino&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAL87P/btrSLKjKeJH/Ygvl29fmRdRjTK28HUWXQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAL87P%2FbtrSLKjKeJH%2FYgvl29fmRdRjTK28HUWXQ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;617&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Screen reflecting initial state and labels when connecting Arduino&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text with over the limitation of transmit data length of BLE.&lt;/p&gt;
&lt;pre id=&quot;code_1669355605629&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String str) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 18) {
     repeat = (len/18)+1;
     endLen = (len%18);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = strHD;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 18;
    else ed = endLen;
    for (int i = 1; i &amp;lt; ed+1; i++) {
      temp[i] = str[(r*18)+i-1];
    }
    if (repeat-r &amp;gt; 1) temp[ed+1] = echoHD;
    else temp[ed+1] = footHD;
    temp[ed+2] = '\0';
    pTxCharacteristic-&amp;gt;setValue(temp); 
    pTxCharacteristic-&amp;gt;notify();
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Set to send the date/time of the Android system When connecting, or request the transmission of the date/time if necessary.&lt;/p&gt;
&lt;pre id=&quot;code_1669355632157&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void requstDateTime(){ // order disconnect to App 
  uint8_t setVal[3];
  setVal[0] = connectHD;
  setVal[1] = 0x01;
  setVal[2] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
  pTxCharacteristic-&amp;gt;notify(); 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Use when you want to acquire control authority by using the set password for ESP32&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It can be changed to any name through definition of the passName and passNameLen for processing the password in the sketch and the app send datas starting with passName as password value. This is to enhance security.&lt;/p&gt;
&lt;pre id=&quot;code_1670181591814&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define passName F(&quot;PAS:&quot;)
#define pnLength 4

void requestPass(bool val){ // order disconnect to App 
  uint8_t setVal[3+pnLength];
  String temp = passName;
  setVal[0] = connectHD;
  setVal[1] = 0x02;
  if (val) {
    setVal[2] = pnLength;
    for (int i = 0; i&amp;lt;pnLength;i++) setVal[i+3] = temp[i];
    pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3+pnLength); 
  } else {
    setVal[2] = val;
    pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
  }
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xmMIP/btrSM3wtRci/BOtSSnSOwr37bpCE17VWRk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xmMIP/btrSM3wtRci/BOtSSnSOwr37bpCE17VWRk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xmMIP/btrSM3wtRci/BOtSSnSOwr37bpCE17VWRk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxmMIP%2FbtrSM3wtRci%2FBOtSSnSOwr37bpCE17VWRk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Response for correct or not through password confirmation&lt;/p&gt;
&lt;pre id=&quot;code_1670181646293&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void responsePass(bool val){ 
  uint8_t setVal[3];
  setVal[0] = connectHD;
  setVal[1] = 0x03;
  setVal[2] = val;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWqpqt/btrSIRj590J/YQvHkelKBxHqdYsqQxDHoK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWqpqt/btrSIRj590J/YQvHkelKBxHqdYsqQxDHoK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWqpqt/btrSIRj590J/YQvHkelKBxHqdYsqQxDHoK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWqpqt%2FbtrSIRj590J%2FYQvHkelKBxHqdYsqQxDHoK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;42&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pWacB/btrSLZ19olF/iCGiESUpDwgYzhBJexyNhk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pWacB/btrSLZ19olF/iCGiESUpDwgYzhBJexyNhk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pWacB/btrSLZ19olF/iCGiESUpDwgYzhBJexyNhk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpWacB%2FbtrSLZ19olF%2FiCGiESUpDwgYzhBJexyNhk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1669355670269&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void send_message(String str, uint8_t head, uint8_t fn) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 17) {
     repeat = (len/17)+1;
     endLen = (len%17);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = head;
    temp[1] = fn;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 17;
    else ed = endLen;
    for (int i = 2; i &amp;lt; ed+2; i++) {
      temp[i] = str[(r*17)+i-2];
    }
    if (repeat-r &amp;gt; 1) temp[ed+2] = echoHD;
    else temp[ed+2] = footHD;
    temp[ed+3] = '\0';
    pTxCharacteristic-&amp;gt;setValue(temp); 
    pTxCharacteristic-&amp;gt;notify();
  }
}

void sendMessage(String str) {
  send_message(str, connectHD, 0x04);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c77Fs5/btrSJDS4y4j/koPZkvmFypplFWTZBMM1Wk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c77Fs5/btrSJDS4y4j/koPZkvmFypplFWTZBMM1Wk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c77Fs5/btrSJDS4y4j/koPZkvmFypplFWTZBMM1Wk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc77Fs5%2FbtrSJDS4y4j%2FkoPZkvmFypplFWTZBMM1Wk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1669355993677&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3];
  setVal[0] = connectHD;
  setVal[1] = 0x05;
  setVal[2] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxVoYp/btrSMIzeZbX/Dqf7Au9facle1LoUpSpGDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxVoYp/btrSMIzeZbX/Dqf7Au9facle1LoUpSpGDK/img.png&quot; data-alt=&quot;Disconnect Button for Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxVoYp/btrSMIzeZbX/Dqf7Au9facle1LoUpSpGDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxVoYp%2FbtrSMIzeZbX%2FDqf7Au9facle1LoUpSpGDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;83&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button for Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Set the function to continuously transmit the changed value of the SeekBar (slide bar) according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Slide Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Slide Mode&lt;/span&gt;&amp;nbsp;(transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1669356064869&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveSlide(bool val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x01;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCp2s6/btrSJS3A6ks/kNfEmW64Ct2XH94lHcbVa1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCp2s6/btrSJS3A6ks/kNfEmW64Ct2XH94lHcbVa1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCp2s6/btrSJS3A6ks/kNfEmW64Ct2XH94lHcbVa1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCp2s6%2FbtrSJS3A6ks%2FkNfEmW64Ct2XH94lHcbVa1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;30&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Set transmission interval of ACTIVE SLIDE MODE. (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669356125525&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setSlideInterval(uint16_t val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x02;
  setVal[2] = val;
  setVal[3] = val &amp;gt;&amp;gt; 8;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UxO5Y/btrSJyxBlO0/2GQjvX7667EF0LzmIOZaXk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UxO5Y/btrSJyxBlO0/2GQjvX7667EF0LzmIOZaXk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UxO5Y/btrSJyxBlO0/2GQjvX7667EF0LzmIOZaXk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUxO5Y%2FbtrSJyxBlO0%2F2GQjvX7667EF0LzmIOZaXk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;26&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1669356346308&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2: show name &amp;amp; pass // defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x03;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* BLE is no need to pair with Mobile Phone.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* If pairing is attempted, an error message is displayed.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwYsJ9/btrSISb8H3L/XrBY95Lk8SzcQ25xO3Qso0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwYsJ9/btrSISb8H3L/XrBY95Lk8SzcQ25xO3Qso0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwYsJ9/btrSISb8H3L/XrBY95Lk8SzcQ25xO3Qso0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwYsJ9%2FbtrSISb8H3L%2FXrBY95Lk8SzcQ25xO3Qso0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Display additional push buttons in the main menu area. (it is possible to control only at Arduino)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l16JS/btrSPRJbpfO/hnsez3sFlE8KST6tVl2gx0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l16JS/btrSPRJbpfO/hnsez3sFlE8KST6tVl2gx0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l16JS/btrSPRJbpfO/hnsez3sFlE8KST6tVl2gx0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl16JS%2FbtrSPRJbpfO%2Fhnsez3sFlE8KST6tVl2gx0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;57&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669356870828&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void showDialogMenu(bool val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x04;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Change the main screen to Color Picker / Pwm Nob screen from Arduino. (generally set in the options of the app)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byO5c9/btrSPRCp3pN/kq7w5HvXQoGk604UkDBNwk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byO5c9/btrSPRCp3pN/kq7w5HvXQoGk604UkDBNwk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byO5c9/btrSPRCp3pN/kq7w5HvXQoGk604UkDBNwk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyO5c9%2FbtrSPRCp3pN%2Fkq7w5HvXQoGk604UkDBNwk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;71&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uint8_t: list below&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: Display buttons and SeekBar (slide bar) on the main screen&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Display Color_Picker on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Display Color_Picker and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Display PWM Nob on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4: Display PWM Nob and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;String&lt;/span&gt;: name of the group&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;bool&lt;/span&gt;: Sets whether to display the SeekBar (slide bar) when the main screen buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* true&lt;/span&gt;: SeekBar (slide bar) is also displayed when button is displayed or Pwm Nob is displayed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* false&lt;/span&gt;: SeekBar (slide bar) is not displayed when button is displayed and SeekBar (slide bar) is displayed only when Pwm Nob is displayed&lt;/p&gt;
&lt;pre id=&quot;code_1669356925603&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPMain) { 
  String str = String(val); str += ','; 
  str += group1; str += ','; 
  str += group2; str += ',';
  str += pwmDPMain;
  send_message(str, optionHD, 0x05);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Set the main screen display of the app.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set to 0 or 1 in order depending on whether buttons 1 to 15, SeekBar (slide bar) 1 to 6, text input, and floating buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: hidden 1: visible&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpXp7v/btrSKQRYe4l/KTNhqWE1TzdtDRvCHNr7ik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpXp7v/btrSKQRYe4l/KTNhqWE1TzdtDRvCHNr7ik/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpXp7v/btrSKQRYe4l/KTNhqWE1TzdtDRvCHNr7ik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpXp7v%2FbtrSKQRYe4l%2FKTNhqWE1TzdtDRvCHNr7ik%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;307&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669357000084&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;///////////////////////// SET MAIN DISPLAY
//F(&quot;111111111111111&quot;  // button 1 ~ 15, 0:hide 1:display
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ 
  send_message(str, optionHD, 0x06);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Set labels for buttons and SeekBar.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Label buttons 1 to 15 and SeekBar (slide bar) 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXr4Cj/btrSJaXZ4gG/6KIFZg4381r5HPsu2PLHuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXr4Cj/btrSJaXZ4gG/6KIFZg4381r5HPsu2PLHuK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXr4Cj/btrSJaXZ4gG/6KIFZg4381r5HPsu2PLHuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXr4Cj%2FbtrSJaXZ4gG%2F6KIFZg4381r5HPsu2PLHuK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;286&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669357040356&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;)) // slider 1 ~ 6
void setButtonLabel(String str){ 
  send_message(str, optionHD, 0x07);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set the button's toggle/push properties.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set the button properties to 0 or 1 in order of buttons 1 to 15.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0: Push&lt;/span&gt;&amp;nbsp;1: Toggle&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBu89r/btrSJELgtiB/o6t2JH4lkvSLhcbQtg5OK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBu89r/btrSJELgtiB/o6t2JH4lkvSLhcbQtg5OK1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBu89r/btrSJELgtiB/o6t2JH4lkvSLhcbQtg5OK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBu89r%2FbtrSJELgtiB%2Fo6t2JH4lkvSLhcbQtg5OK1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;340&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669357082572&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  send_message(str, optionHD, 0x08);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. Set the maximum/minimum values of the SeekBar (slide bar).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SeekBar (slide bar) Specifies the maximum/minimum values from 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8pUem/btrSJxSZtT2/uvd9ZokQNVPEhd2lFmrUF1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8pUem/btrSJxSZtT2/uvd9ZokQNVPEhd2lFmrUF1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8pUem/btrSJxSZtT2/uvd9ZokQNVPEhd2lFmrUF1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8pUem%2FbtrSJxSZtT2%2Fuvd9ZokQNVPEhd2lFmrUF1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;249&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669357235971&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  send_message(str, optionHD, 0x09);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. Set the title of the Arduino sketch.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqX4Nb/btrSPPYT9ws/U9NqoUR6ElwKOCkd5mLZ51/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqX4Nb/btrSPPYT9ws/U9NqoUR6ElwKOCkd5mLZ51/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqX4Nb/btrSPPYT9ws/U9NqoUR6ElwKOCkd5mLZ51/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqX4Nb%2FbtrSPPYT9ws%2FU9NqoUR6ElwKOCkd5mLZ51%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;27&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669357321754&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//title: Test Mode
//text: Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;
void setAppTitleMessage(String title, String text){
  String str = title; str += ','; 
  str += text; 
  send_message(str, optionHD, 0x0A);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CuqJ0/btrSIREjqUd/09Ohqxulscj45zhOQPzhT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CuqJ0/btrSIREjqUd/09Ohqxulscj45zhOQPzhT1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CuqJ0/btrSIREjqUd/09Ohqxulscj45zhOQPzhT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCuqJ0%2FbtrSIREjqUd%2F09Ohqxulscj45zhOQPzhT1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;630&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;21. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1669357393330&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String str = F(&quot;RAD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; str += ':';
  str += String(selection);
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSmEkF/btrSL1yUHIj/Xn0i3nUXQc5FTofkJYarp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSmEkF/btrSL1yUHIj/Xn0i3nUXQc5FTofkJYarp1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSmEkF/btrSL1yUHIj/Xn0i3nUXQc5FTofkJYarp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSmEkF%2FbtrSL1yUHIj%2FXn0i3nUXQc5FTofkJYarp1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;22. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669357427171&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String str = F(&quot;CKB:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca4q9X/btrSPRh8gLL/1i0LhS3iYCFGQw0rEoK051/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca4q9X/btrSPRh8gLL/1i0LhS3iYCFGQw0rEoK051/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca4q9X/btrSPRh8gLL/1i0LhS3iYCFGQw0rEoK051/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca4q9X%2FbtrSPRh8gLL%2F1i0LhS3iYCFGQw0rEoK051%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;23. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1669357454468&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String str = F(&quot;CHD:&quot;); 
  str += String(id); str += ':'; 
  str += message; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIQvUq/btrSJlZsjfT/Kt28eC89pbYKN5F6txYDSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIQvUq/btrSJlZsjfT/Kt28eC89pbYKN5F6txYDSk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIQvUq/btrSJlZsjfT/Kt28eC89pbYKN5F6txYDSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIQvUq%2FbtrSJlZsjfT%2FKt28eC89pbYKN5F6txYDSk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;24. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1669357484194&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String str = F(&quot;LSD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W5pon/btrSLJ6fyzP/zqQ84yqnVWCKhGmvYhjEnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W5pon/btrSLJ6fyzP/zqQ84yqnVWCKhGmvYhjEnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W5pon/btrSLJ6fyzP/zqQ84yqnVWCKhGmvYhjEnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW5pon%2FbtrSLJ6fyzP%2FzqQ84yqnVWCKhGmvYhjEnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;294&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;25. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1669357535962&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  String str = F(&quot;STR:&quot;); 
  str += String(id); str += ':'; 
  str += title; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rIgFb/btrSKvtCSuB/hbA9kuH41hXOMFxWcwkIE0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rIgFb/btrSKvtCSuB/hbA9kuH41hXOMFxWcwkIE0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rIgFb/btrSKvtCSuB/hbA9kuH41hXOMFxWcwkIE0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrIgFb%2FbtrSKvtCSuB%2FhbA9kuH41hXOMFxWcwkIE0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_HMI_BLE_CONTROL.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b8qk9P/btrSOyCX9pe/BDIYefy0nKyHSCr3onrcIk/ESP32_HMI_BLE_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_HMI_BLE_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/P1vCF_uNCVU&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/P1vCF_uNCVU&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/P1vCF_uNCVU&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1670182764943&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;BLEDevice.h&amp;gt;
#include &amp;lt;BLEServer.h&amp;gt;
#include &amp;lt;BLEUtils.h&amp;gt;
#include &amp;lt;BLE2902.h&amp;gt;

BLEServer *pServer = NULL;
BLECharacteristic * pTxCharacteristic;
bool deviceConnected = false;
bool rx_received = false;      // flag to excute the function when receiving data from BLE
std::string rxValue; // Set global variables to save the received data from BLE

unsigned long int disconnectTime = 0;
bool needAppCheck = false;
bool appConnection = false;

#include &quot;protocol.h&quot;

class MyServerCallbacks: public BLEServerCallbacks {
  void onConnect(BLEServer* pServer) {
    deviceConnected = true;
    disconnectTime = millis(); needAppCheck = true; 
    Serial.println(F(&quot;connected&quot;));
  };
  void onDisconnect(BLEServer* pServer) {
    deviceConnected = false;
    delay(500);
    pServer-&amp;gt;startAdvertising(); // restart advertising
    Serial.println(F(&quot;start advertising&quot;));
  }
};

class MyCallbacks: public BLECharacteristicCallbacks {
  void onWrite(BLECharacteristic *pCharacteristic) {
    rxValue = pCharacteristic-&amp;gt;getValue();
//    if (rxValue.length() &amp;gt; 0) {
//      for (int i = 0; i &amp;lt; rxValue.length(); i++) {
//        Serial.print(i); Serial.print(&quot;: &quot;); Serial.println(rxValue[i], HEX);
//      }
//    }
    rx_received = true;
  }
};

#define btName &quot;ESP32ble&quot;
#define SERVICE_UUID           &quot;6E400001-B5A3-F393-E0A9-E50E24DCCA9E&quot; 
#define CHARACTERISTIC_UUID_RX &quot;6E400002-B5A3-F393-E0A9-E50E24DCCA9E&quot;
#define CHARACTERISTIC_UUID_TX &quot;6E400003-B5A3-F393-E0A9-E50E24DCCA9E&quot;

void setup() {
  Serial.begin(115200);
  BLEDevice::init(btName);  //(&quot;ESP32&quot;);// Create the BLE Device
  pServer = BLEDevice::createServer();  // Create the BLE Server
  pServer-&amp;gt;setCallbacks(new MyServerCallbacks());
  BLEService *pService = pServer-&amp;gt;createService(SERVICE_UUID);  // Create the BLE Service
  pTxCharacteristic = pService-&amp;gt;createCharacteristic (     // Create a BLE Characteristic
                      CHARACTERISTIC_UUID_TX,
                      BLECharacteristic::PROPERTY_NOTIFY
                    );
  pTxCharacteristic-&amp;gt;addDescriptor(new BLE2902());
  BLECharacteristic * pRxCharacteristic = pService-&amp;gt;createCharacteristic (
                                          CHARACTERISTIC_UUID_RX,
                                          BLECharacteristic::PROPERTY_WRITE
                                        );
  pRxCharacteristic-&amp;gt;setCallbacks(new MyCallbacks());
  pService-&amp;gt;start();                   // Start the service
  pServer-&amp;gt;getAdvertising()-&amp;gt;start();  // Start advertising
  Serial.println(F(&quot;Waiting a client connection to notify...&quot;));
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(F(&quot;button 1 : on&quot;));
               sendPinEcho(value);
               sendText(F(&quot;1: ON&quot;)); 
                  break;
      case 10: Serial.println(F(&quot;button 1 : off&quot;));
               sendText(F(&quot;1: OFF&quot;)); 
               sendPinEcho(value);
                  break;
      case 21: Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 51: Serial.println(F(&quot;button 5 : on&quot;));
                  break;
      case 50: Serial.println(F(&quot;button 5 : off&quot;));
                  break;
      case 61: Serial.println(F(&quot;button 6 : on&quot;));
                  break;
      case 60: Serial.println(F(&quot;button 6 : off&quot;));
                  break;
      case 71: Serial.println(F(&quot;button 7 : on&quot;));
                  break;
      case 70: Serial.println(F(&quot;button 7 : off&quot;));
                  break;
      case 81: Serial.println(F(&quot;button 8 : on&quot;));
                  break;
      case 80: Serial.println(F(&quot;button 8 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(F(&quot;button 10 : on&quot;));
                  break;
      case 100: Serial.println(F(&quot;button 10 : off&quot;));
                  break;  
      case 111: Serial.println(F(&quot;button 11 : on&quot;));
                  break;
      case 110: Serial.println(F(&quot;button 11 : off&quot;));
                  break;  
      case 121: Serial.println(F(&quot;button 12 : on&quot;));
                  break;
      case 120: Serial.println(F(&quot;button 12 : off&quot;));
                  break;                  
      case 131: Serial.println(F(&quot;button 13 : on&quot;));
                  break;  
      case 130: Serial.println(F(&quot;button 13 : off&quot;));
                  break;  
      case 141: Serial.println(F(&quot;button 14 : on&quot;));
                  break;  
      case 140: Serial.println(F(&quot;button 14 : off&quot;));
                  break;  
      case 151: Serial.println(F(&quot;button 15 : on&quot;));
                  break;  
      case 150: Serial.println(F(&quot;button 15 : off&quot;));
                  break;         
      case 161: Serial.println(F(&quot;button 16 : click&quot;));
                  break; 
      case 171: Serial.println(F(&quot;button 17 : click&quot;));
                  break;
      case 181: Serial.println(F(&quot;button 18 : click&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : click&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : click&quot;));
                  break;                 
    }
  }
}

void pwm_control(uint8_t num, uint16_t value) {
  if (num == 1) {  // SeekBar (slide bar) 1
    sendPwmEcho(num, value); 
    Serial.print(F(&quot;pwm1: &quot;)); Serial.println(value);
  } else if (num == 2) { // SeekBar (slide bar) 2
    sendPwmEcho(num, value);
    Serial.print(F(&quot;pwm2: &quot;)); Serial.println(value);
  } else if (num == 3) {  // SeekBar (slide bar) 3
    sendPwmEcho(num, value);
    Serial.print(F(&quot;pwm3: &quot;)); Serial.println(value);
  } else if (num == 4) {  // SeekBar (slide bar) 4
    Serial.print(F(&quot;pwm4: &quot;)); Serial.println(value);
  } else if (num == 5) {  // SeekBar (slide bar) 5
    Serial.print(F(&quot;pwm5: &quot;)); Serial.println(value);
  } else if (num == 6) {  // SeekBar (slide bar) 6
    Serial.print(F(&quot;pwm6: &quot;)); Serial.println(value);
  }
}

bool gotEnd = false;
String message = &quot;&quot;;

void BLE_read() {
  if (rx_received == true) {  
    if (appConnection) {
      String temp = &quot;&quot;; 
      if (rxValue[0] == pwmHD) {
        uint8_t cn = 0;
        while (rxValue[cn] == pwmHD) {   // 0xF3
          if (rxValue[cn+4] == footHD) { // verification of Received value
            uint16_t value = rxValue[cn+3];
            value = value &amp;lt;&amp;lt; 8 | rxValue[cn+2];
            pwm_control(rxValue[cn+1], value); // execute the code with values
          }
          cn = cn+5;
        }
      } else if (rxValue[0] == pinHD) { // 0xF0
        if (rxValue[2] == footHD) {     // verification of Received value
          pin_control(rxValue[1]);      // execute the code with values
        }
      } else {
        String hd = connectHDstr; 
        if (rxValue[0] == hd[0] &amp;amp;&amp;amp; rxValue[1] == hd[1] &amp;amp;&amp;amp; rxValue[2] == hd[2]) {
          for (int i = hd.length(); i &amp;lt; rxValue.length(); i++) {
            if (rxValue[i] != '\n') message += rxValue[i];
            else { gotEnd = true; break; }
          }
          if (gotEnd) {
            if (rxValue[3] == hd[3]) CheckF8(message);
            else CheckF9(message);
            gotEnd = false; message = &quot;&quot;;
          }
        } else {
          for (int i = 0; i &amp;lt; rxValue.length(); i++) Serial.print(rxValue[i]);
        }
      }
    } else CheckF8(&quot;&quot;);
    rx_received = false;
  }
}

void loop() {
  BLE_read();
  orderDisconnect();
  if(Serial.available()) { // if there is data in the serial buffer
    String temp = Serial.readStringUntil('\n'); // option of serial monitor: NEW LINE
    Serial.println(temp);
    if(temp == &quot;on&quot;){    // input serial monitor: &quot;on&quot;
      sendPinState(11);  // button state of the app: on
      sendText(&quot;ON&quot;);
      sendPwmEcho(1, 150);
    } else if(temp == &quot;off&quot;){  // input serial monitor: &quot;off&quot;
      sendPwmEcho(1, 250);     // PWM echo: off
      sendPinState(10); 
      sendText(&quot;OFF&quot;);
    } else if(temp == &quot;1&quot;){   
      
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1670254649521&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD 0xF0
#define pwmHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define connectHDstr F(&quot;%%F8&quot;)
#define optionHD 0xF9

uint8_t pin[] = {pinHD, 0, 0}; //F0, pin state, F1

void sendPinState(uint8_t pin_val){
  pin[1] = pin_val;
  pin[2] = footHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pin, 3);
  pTxCharacteristic-&amp;gt;notify();
}

void sendPinEcho(uint8_t pin_val){
  pin[1] = pin_val;
  pin[2] = echoHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pin, 3);
  pTxCharacteristic-&amp;gt;notify();
}

uint8_t pwm[] = {pwmHD, 0, 0, 0, 0}; //F3, slide number, 16bit value, F1

void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {
  pwm[1] = slide;
  pwm[2] = pwm_val;
  pwm[3] = pwm_val &amp;gt;&amp;gt; 8;
  pwm[4] = footHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pwm, 5);
  pTxCharacteristic-&amp;gt;notify();
}

void sendPwmEcho(uint8_t slide, uint16_t pwm_val) {
  pwm[1] = slide;
  pwm[2] = pwm_val;
  pwm[3] = pwm_val &amp;gt;&amp;gt; 8;
  pwm[4] = echoHD;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;pwm, 5);
  pTxCharacteristic-&amp;gt;notify();
}

void sendText(String str) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 18) {
     repeat = (len/18)+1;
     endLen = (len%18);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = strHD;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 18;
    else ed = endLen;
    for (int i = 1; i &amp;lt; ed+1; i++) {
      temp[i] = str[(r*18)+i-1];
    }
    if (repeat-r &amp;gt; 1) temp[ed+1] = echoHD;
    else temp[ed+1] = footHD;
    temp[ed+2] = '\0';
    pTxCharacteristic-&amp;gt;setValue(temp); 
    pTxCharacteristic-&amp;gt;notify();
  }
}

///////////////////////////////////////// CONNECTION 
void requstDateTime(){ // order disconnect to App 
  uint8_t setVal[3];
  setVal[0] = connectHD;
  setVal[1] = 0x01;
  setVal[2] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
  pTxCharacteristic-&amp;gt;notify(); 
}

//#define passName F(&quot;PAS:&quot;)
//#define pnLength 4
//
//void requestPass(bool val){ // order disconnect to App 
//  uint8_t setVal[3+pnLength];
//  String temp = passName;
//  setVal[0] = connectHD;
//  setVal[1] = 0x02;
//  if (val) {
//    setVal[2] = pnLength;
//    for (int i = 0; i&amp;lt;pnLength;i++) setVal[i+3] = temp[i];
//    pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3+pnLength); 
//  } else {
//    setVal[2] = val;
//    pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
//  }
//  pTxCharacteristic-&amp;gt;notify();
//}
//
//void responsePass(bool val){ 
//  uint8_t setVal[3];
//  setVal[0] = connectHD;
//  setVal[1] = 0x03;
//  setVal[2] = val;
//  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
//  pTxCharacteristic-&amp;gt;notify();
//}

void send_message(String str, uint8_t head, uint8_t fn) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 17) {
     repeat = (len/17)+1;
     endLen = (len%17);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = head;
    temp[1] = fn;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 17;
    else ed = endLen;
    for (int i = 2; i &amp;lt; ed+2; i++) {
      temp[i] = str[(r*17)+i-2];
    }
    if (repeat-r &amp;gt; 1) temp[ed+2] = echoHD;
    else temp[ed+2] = footHD;
    temp[ed+3] = '\0';
    pTxCharacteristic-&amp;gt;setValue(temp); 
    pTxCharacteristic-&amp;gt;notify();
  }
}

void sendMessage(String str) {
  send_message(str, connectHD, 0x04);
}

void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3];
  setVal[0] = connectHD;
  setVal[1] = 0x05;
  setVal[2] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal,3); 
  pTxCharacteristic-&amp;gt;notify();
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveSlide(bool val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x01;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

// SEND SLIDE GET VALUE INTERVAL
void setSlideInterval(uint16_t val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x02;
  setVal[2] = val;
  setVal[3] = val &amp;gt;&amp;gt; 8;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

// 0: not use, 1: show only name, 2: show name &amp;amp; pass // defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x03;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

void showDialogMenu(bool val){ 
  uint8_t setVal[4];
  setVal[0] = optionHD;
  setVal[1] = 0x04;
  setVal[2] = val;
  setVal[3] = 0x00;
  pTxCharacteristic-&amp;gt;setValue((uint8_t*)&amp;amp;setVal, 4);
  pTxCharacteristic-&amp;gt;notify();
}

//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPMain) { 
  String str = String(val); str += ','; 
  str += group1; str += ','; 
  str += group2; str += ',';
  str += pwmDPMain;
  send_message(str, optionHD, 0x05);
}

///////////////////////// SET MAIN DISPLAY
//F(&quot;111111111111111&quot;  // button 1 ~ 15, 0:hide 1:display
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ 
  send_message(str, optionHD, 0x06);
}

//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;)) // slider 1 ~ 6
void setButtonLabel(String str){ 
  send_message(str, optionHD, 0x07);
}

//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  send_message(str, optionHD, 0x08); 
}

//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  send_message(str, optionHD, 0x09);
}

void setAppTitleMessage(String title, String text){
  String str = title; str += ','; 
  str += text; 
  send_message(str, optionHD, 0x0A);
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String str = F(&quot;RAD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; str += ':';
  str += String(selection);
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String str = F(&quot;CKB:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String str = F(&quot;CHD:&quot;); 
  str += String(id); str += ':'; 
  str += message; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String str = F(&quot;LSD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  String str = F(&quot;STR:&quot;); 
  str += String(id); str += ':'; 
  str += title; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  setActiveSlide(true); setSlideInterval(100);
  setSSIDLabelMode(0);
}

// SEND LOCAL STATE AT PRESENT TO APP
void send_State() { // 현재 상태값
  sendPinState(10);
  sendPinState(21);
  sendPinState(30);
  sendPinState(41);
  sendPinState(50);
  sendPinState(61);
  sendPinState(71);
  sendPinState(80);
  sendPinState(91);
  sendPinState(101);
  sendPinState(110);
  sendPinState(121);
  sendPinState(130);
  sendPinState(141);
  sendPinState(150);
  sendPwmSlide(1, 110);
  sendPwmSlide(2, 120);
  sendPwmSlide(3, 210);
  sendPwmSlide(4, 0);
  sendPwmSlide(5, 0);
  sendPwmSlide(6, 0);
}

void btDisconnect() {
  sendDisconnect();
  delay(10);
  pServer-&amp;gt;disconnect(pServer-&amp;gt;getConnId());
}

void orderDisconnect() { 
  if (needAppCheck) { 
    if (!appConnection) {
      if (millis() - disconnectTime &amp;gt; 3000) {
        needAppCheck = false;
        btDisconnect();
        Serial.println(F(&quot;enter app check disconnect&quot;));
      }
    } 
  } 
}

void CheckF8(String temp) {
  if (temp == &quot;&quot;) {
    String hd = connectHDstr; 
    if (rxValue[0] == hd[0] &amp;amp;&amp;amp; rxValue[1] == hd[1] &amp;amp;&amp;amp; rxValue[2] == hd[2] &amp;amp;&amp;amp; rxValue[3] == hd[3]) {
      for (int i = hd.length(); i &amp;lt; rxValue.length(); i++) {
        if (rxValue[i] != '\n') temp += rxValue[i];
        else break;
      }
      if (temp == F(&quot;connect&quot;)) { delay(100); needAppCheck = false; appConnection = true; iniSet(); send_State(); }
    } else { btDisconnect(); needAppCheck = false; }
  } else {
    if (temp == F(&quot;disconnect&quot;)) appConnection = false; 
    else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); } 
    else Serial.println(temp);
  }
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
  else {  
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUCON app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUCON app settings: label/toggle properties, use of the timer for checkHD(0xF5), Slide Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1670255405071&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  setDisplay(F(&quot;111111111111111&quot; // button 1 ~ 15, 0:hide 1:display
               &quot;111111&quot;          // slider 1 ~ 6
               &quot;11&quot;));           // Text Input/Floating Button
  setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); // Set Color Picker and Pwm Nob
  setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,&quot; // set labels
                   &quot;BT12,BT13,BT14,BT15,PW1,PW2,PW3,PW4,PW5,PW6&quot;));
  setButtonToggle(F(&quot;111111111111111&quot;)); // button 1 ~ 15, toggle setting, 0:push 1:toggle
  setMinMax(F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)); // slider 1 ~ 6
  setAppTitleMessage(F(&quot;Test Mode&quot;), // Change title for Arduino code on the app
  F(&quot;Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&quot; //Message
    &quot;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;&quot;
    &quot;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;&quot;));
  setActiveSlide(true); setSlideInterval(100); // Active Slide Mode
  setSSIDLabelMode(0);   // Set the function of the label displaying Wi-Fi connection
  showDialogMenu(true);  // show menu button
  delay(100); // it need to wait flushing sending buffer if the length of data is too long. 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the screen number (pageId).&lt;/p&gt;
&lt;pre id=&quot;code_1670255457504&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (pageId == 4) Serial.println(F(&quot;powor : on&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;));
                  break;
      case 10: if (pageId == 4) Serial.println(F(&quot;powor : off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (pageId == 4) { 
                 Serial.println(F(&quot;motor1 : on&quot;)); 
                 sendPinState(30); 
               } else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (pageId == 4) Serial.println(F(&quot;motor1 : off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (pageId == 4) { 
                 Serial.println(F(&quot;motor2 : on&quot;)); 
                 sendPinState(20); 
               } else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (pageId == 4) Serial.println(F(&quot;motor2 : off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 201: Serial.println(F(&quot;button 20 : click&quot;));
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,Dial_Nob,Color_Picker,Key_Pad,Arrow_Pad,Main&quot;)); // dialog message
                  break;              
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1670255483182&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;Dial&quot;))) {
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(4, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 1; Serial.println(&quot;Dial&quot;);
      } else if (temp.startsWith(F(&quot;Color&quot;))) {
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(2, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 2; Serial.println(&quot;color&quot;);
      } else if (temp.startsWith(F(&quot;Key&quot;))) {
        if (pageId &amp;lt; 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111111111100011111110&quot;)); 
        setButtonToggle(F(&quot;000000000000111&quot;));
        setButtonLabel(F(&quot;1,2,3,4,5,6,7,8,9,*,0,#&quot;));
        pageId = 3;
      } else if (temp.startsWith(F(&quot;Arrow&quot;))) {
        if (pageId &amp;lt; 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111101010101011111111&quot;)); 
        setButtonToggle(F(&quot;111111000000000&quot;));
        setButtonLabel(F(&quot;Power,Motor1,Moror2,BT4,BT5,BT6,7,Up,9,Left,0,Right,0,Down&quot;));
        pageId = 4;
      } else {
        if (pageId &amp;lt;= 2) { setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 0; }
        setDisplay(F(&quot;11111111111111111111111&quot;));
        setButtonToggle(F(&quot;111111111111111&quot;));
        setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15&quot;));
        send_State();
        pageId = 0;
      }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
  else {  
    if (temp.length() &amp;lt; 6) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_HMI_BLE_CONTROL_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bq3LXZ/btrSWxjwi9v/1B3LKINMgaXoPmmlYKbJv0/ESP32_HMI_BLE_CONTROL_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_HMI_BLE_CONTROL_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/O4jbwZ5k8kM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/O4jbwZ5k8kM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/O4jbwZ5k8kM&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Change name for the bluetooth of ESP32 on ADUCON App&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z92aj/btrSSLpRzXP/kPBP2iaAjXL6d1iz1ojMD0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z92aj/btrSSLpRzXP/kPBP2iaAjXL6d1iz1ojMD0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z92aj/btrSSLpRzXP/kPBP2iaAjXL6d1iz1ojMD0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz92aj%2FbtrSSLpRzXP%2FkPBP2iaAjXL6d1iz1ojMD0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlueBLEname.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DsIYv/btrSSMvzhFL/zd1TeMaFyKRDDV4RgHyXC1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DsIYv/btrSSMvzhFL/zd1TeMaFyKRDDV4RgHyXC1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DsIYv/btrSSMvzhFL/zd1TeMaFyKRDDV4RgHyXC1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDsIYv%2FbtrSSMvzhFL%2Fzd1TeMaFyKRDDV4RgHyXC1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;129&quot; data-filename=&quot;ssidBlueBLEname.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save the name for the bluetooth of ESP32.&lt;/p&gt;
&lt;pre id=&quot;code_1670255725829&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;SPIFFS.h&quot;  
char btName[11] = &quot;ESP32blue&quot;;  // 10 char&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SPIFFS Setting&lt;/p&gt;
&lt;pre id=&quot;code_1670255809644&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool saveConfig() {   // Write NAME
  String value = btName;
  Serial.println(value);
  File configFile = SPIFFS.open(F(&quot;/config.txt&quot;), &quot;w&quot;);
  if (!configFile) {
    Serial.println(F(&quot;Failed to open config file for writing&quot;));
    return false;
  } else {
    configFile.println(value); // save at config.txt including '\n'
    configFile.close();
    return true;
  }
}

bool loadConfig() { // Read NAME
  File configFile = SPIFFS.open(F(&quot;/config.txt&quot;), &quot;r&quot;);
  if (!configFile) {
    Serial.println(F(&quot;Failed to open config file&quot;));
    return false;
  } else {
    String temp = configFile.readStringUntil('\r');
    for (int i = 0; i &amp;lt; temp.length(); i++) btName[i] = temp[i];
    btName[temp.length()] = '\0';
    configFile.close();
    Serial.println(btName);
    return true;
  }
}

void setup() {
    if (SPIFFS.exists(F(&quot;/config.txt&quot;))) loadConfig(); // if there is &quot;/config.txt&quot;, read
    else saveConfig();  // if there is not, save a new config.txt 
}

// SPIFFS initialization code at serial monitor
void loop() {
  if(Serial.available()) { // Serial monitor
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if(temp == &quot;1&quot;){   
      esp_bt_controller_disable();
      Serial.println(F(&quot;format...&quot;));
      SPIFFS.format();
      Serial.println(F(&quot;done. can start upload.&quot;));
      while(1); // stanby for uploading
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Save parsing data for name and remove the data for password and send a message applyed in Arduino.&lt;/p&gt;
&lt;pre id=&quot;code_1670255906101&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void changeBTname(String str) { 
  bool save = false; 
  String temp = str.substring(0, 1);
  bool delPass = temp.toInt(); // if true, there is data for password which is not used in this sketch 
  str.remove(0, 1);
  if (delPass) str.remove(0, 6); // remove pass
  if (str != btName) {
    if (temp != &quot;&quot;) {
      for (int i = 0; i &amp;lt; str.length(); i++) btName[i] = str[i];
      btName[str.length()] = '\0';
      save = true; 
    }
  }
  if (save) {
    saveConfig();
    temp  = F(&quot;&amp;lt;p&amp;gt;NAME:  &quot;);
    temp += btName;
    temp += F(&quot;&amp;lt;/p&amp;gt;Value's Saved.&quot;);
    if (delPass) temp += F(&quot;&amp;lt;br/&amp;gt;Function of Set pass is not provided.&amp;lt;br/&amp;gt;&quot;);
    temp += F(&quot; The module will reboot.&amp;lt;br/&amp;gt;try to reconnect.&quot;);
    sendMessage(temp);
    sendDisconnect(); delay(500); ESP.restart();
  } else {
    temp  = F(&quot;There's no change.&quot;);
    if (delPass) temp += F(&quot;&amp;lt;br/&amp;gt;Function of Set pass is not provided.&quot;);
    sendMessage(temp);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_HMI_BLE_CONTROL_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cuc3uh/btrSUB1lXzl/HOGUSlFgnukF9gpU5egiA0/ESP32_HMI_BLE_CONTROL_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_HMI_BLE_CONTROL_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SPIFFS_FORMAT_ESP32.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/elOjko/btrSW5Anvxc/Ntgd0sOuZsXvv8eyExqLe1/SPIFFS_FORMAT_ESP32.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;SPIFFS_FORMAT_ESP32.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/vS7-YcWAJR4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/vS7-YcWAJR4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/vS7-YcWAJR4&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Login&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Obtain control authority using the password for BLE of ESP32.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFK93V/btrSUbaMAJ7/CC8Uk4Nle2rC7lodAkGpUk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFK93V/btrSUbaMAJ7/CC8Uk4Nle2rC7lodAkGpUk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFK93V/btrSUbaMAJ7/CC8Uk4Nle2rC7lodAkGpUk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFK93V%2FbtrSUbaMAJ7%2FCC8Uk4Nle2rC7lodAkGpUk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pQ5LL/btrSPPGkGGj/CWbDmc6Zro5s5mtktOgONK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pQ5LL/btrSPPGkGGj/CWbDmc6Zro5s5mtktOgONK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pQ5LL/btrSPPGkGGj/CWbDmc6Zro5s5mtktOgONK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpQ5LL%2FbtrSPPGkGGj%2FCWbDmc6Zro5s5mtktOgONK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;42&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save the name for the bluetooth of ESP32 and the set password for login.&lt;/p&gt;
&lt;pre id=&quot;code_1670256093685&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char btName[11] = &quot;ESP32ble&quot;;  // 10 char
char pass[7] = &quot;123456&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Password&amp;nbsp;handling&amp;nbsp;code:&amp;nbsp;response&amp;nbsp;message,&amp;nbsp;input&amp;nbsp;prohibition&amp;nbsp;setting,&amp;nbsp;etc.&lt;/p&gt;
&lt;pre id=&quot;code_1670256160157&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool waitPass = false;
uint8_t passAllow = 5;

#define passWaitTime 120000
#define banResetTime 600000

void banReset() {  // if wrong password is entered 5 times, banned inputting for banResetTime
  if (millis() - disconnectTime &amp;gt; banResetTime) passAllow = 5; 
}

void orderDisconnect() { 
  if (!appConnection) {
    if (millis() - disconnectTime &amp;gt; 3000) { // If &quot;%%F8connect&quot; is not confirmed within disconnectTime after receiving the first data through BLE
      needAppCheck = false;
      btDisconnect();
      Serial.println(F(&quot;enter app check disconnect&quot;));
    }
  } else if (waitPass) { // if there's no input a pass within passWaitTime, terminate the connection
    if (millis() - disconnectTime &amp;gt; passWaitTime) {
      Serial.println(&quot;time over&quot;);
      needAppCheck = false; waitPass = false; appConnection = false; 
      sendMessage(F(&quot;It's disconnected by time expires.&amp;lt;br/&amp;gt;Try to reconnect.&quot;));
      sendDisconnect(); 
    }
  }
}

void CheckF8(String temp) {
  if (temp == &quot;&quot;) {
    String hd = connectHDstr; 
    if (rxValue[0] == hd[0] &amp;amp;&amp;amp; rxValue[1] == hd[1] &amp;amp;&amp;amp; rxValue[2] == hd[2] &amp;amp;&amp;amp; rxValue[3] == hd[3]) {
      for (int i = hd.length(); i &amp;lt; rxValue.length(); i++) {
        if (rxValue[i] != '\n') temp += rxValue[i];
        else break;
      }
      if (waitPass) { 
        if (temp.startsWith(passName)) {
          temp.remove(0, pnLength); bool ok = true;
          if (temp.length() == 6) {
            for (int i = 0; i &amp;lt; 6; i++) { if (temp[i] != pass[i]) { ok = false; break; } }
          }
          if (ok) { passOK = true; waitPass = false; needAppCheck = false; iniSet(); send_State(); }  
          else { passAllow--; disconnectTime = millis(); } // wrong password &amp;amp; timer set
          if (!passAllow) { // if wrong password is entered 5 times
            waitPass = false; appConnection = false; 
            sendMessage(F(&quot;You've got wrong password 5 times.&amp;lt;br/&amp;gt;Try to reconnect 10 Min later.&quot;));
            sendDisconnect(); 
          } else responsePass(ok);
        } else if (temp == F(&quot;connect&quot;)) { requestPass(usePass); disconnectTime = millis(); } // request pass &amp;amp; timer set
        else if (temp == F(&quot;disconnect&quot;)) { waitPass = false; needAppCheck = false; appConnection = false; } 
      } else {
        if (temp == F(&quot;connect&quot;) || temp == F(&quot;autoCon&quot;)) {
          needAppCheck = false; appConnection = true; 
          if (usePass) { 
            delay(100); requestPass(usePass); 
            waitPass = true; needAppCheck = true; disconnectTime = millis(); 
          } else { iniSet(); send_State(); }
        } 
      }
    } else { btDisconnect(); needAppCheck = false; }
  } else {
    if (temp.startsWith(F(&quot;autoCon&quot;))) { needAppCheck = false; } 
    else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; passOK = false; } 
    else if (temp.startsWith(F(&quot;NA&quot;))) { temp.remove(0, 2); changeBTname(temp); }
    else Serial.println(temp);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_HMI_BLE_CONTROL_PASS.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bRTSGv/btrSWwEUHGb/iRkXPbxy4s5dyiK2t7Ldy0/ESP32_HMI_BLE_CONTROL_PASS.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_HMI_BLE_CONTROL_PASS.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/Q9fUifmNY6M&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/Q9fUifmNY6M&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Q9fUifmNY6M&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ADUCON - Arduino wireless remote control application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUCON</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/195</guid>
      <comments>https://postpop.tistory.com/195#entry195comment</comments>
      <pubDate>Sun, 4 Dec 2022 23:42:26 +0900</pubDate>
    </item>
    <item>
      <title>ESP32 Bluetooth remote control with ADUPAD</title>
      <link>https://postpop.tistory.com/194</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUPAD application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXpI8R/btrSPQXCxUb/tDRtgDIUuyxCjoXLqhbwI0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXpI8R/btrSPQXCxUb/tDRtgDIUuyxCjoXLqhbwI0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXpI8R/btrSPQXCxUb/tDRtgDIUuyxCjoXLqhbwI0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXpI8R%2FbtrSPQXCxUb%2FtDRtgDIUuyxCjoXLqhbwI0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;868&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V1QcD/btrVeb6VNpj/6rG23mKsIj7M7lYPIwtmh1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V1QcD/btrVeb6VNpj/6rG23mKsIj7M7lYPIwtmh1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V1QcD/btrVeb6VNpj/6rG23mKsIj7M7lYPIwtmh1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV1QcD%2FbtrVeb6VNpj%2F6rG23mKsIj7M7lYPIwtmh1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237475088&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUPAD - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&amp;amp;hl=ko&amp;amp;gl=JP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUPAD - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Basic code for remote control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Set Bluetooth Serial library to communicate with Bluetooth component of ESP32&lt;/p&gt;
&lt;pre id=&quot;code_1670068788678&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;BluetoothSerial.h&quot;
BluetoothSerial SerialBT;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Function for callback when attempt with Bluetooth pairing to ESP32&lt;/p&gt;
&lt;pre id=&quot;code_1670068920406&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void BTConfirmRequestCallback(uint32_t numVal){
  SerialBT.confirmReply(true);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KhlQ2/btrSJxyyZCY/gH6Gvvkroh0ltu9K3MJLTk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KhlQ2/btrSJxyyZCY/gH6Gvvkroh0ltu9K3MJLTk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KhlQ2/btrSJxyyZCY/gH6Gvvkroh0ltu9K3MJLTk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKhlQ2%2FbtrSJxyyZCY%2FgH6Gvvkroh0ltu9K3MJLTk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;264&quot; data-filename=&quot;bluePearingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- setup&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1670069307487&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setup() {
  Serial.begin(115200);// Set the baud rate for communication with the serial monitor of the Arduino IED to 115200
  SerialBT.enableSSP();// set paring mode for bluetooth classic of ESP32
  SerialBT.onConfirmRequest(BTConfirmRequestCallback); // set callback fuction when attempted pairing
  SerialBT.begin(btName); //start software Serial for Bluetooth of ESP32 and set Bluetooth device name
  Serial.println(F(&quot;Bluetooth 2.0&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1670069680975&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool gotData = false;

void loop() {
  if (SerialBT.available()) { // when incomming data from HC06
    uint8_t temp = SerialBT.read();
    Serial.println(temp); // Output data of the HC06 to the serial monitor.
    gotData = true; // the flag for response
  } else {
    if (gotData) {   // if response
      String setVal = &quot;&quot;;
      setVal += char(0xF4);      // protocol header of text for ADUPAD with bluetooth
      setVal += &quot;Hello World &quot;;
      setVal += random(100,200); // the message for sending
      setVal += char(0xF1);      // protocol footer of text for ADUPAD with bluetooth
      Serial.println(setVal);    // Output the message to the serial monitor.
      SerialBT.print(setVal);    // send data to HC06 as response 
      gotData = false;           // initialize the flag
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_BT_BASIC.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/boVogm/btrSN1d3bMv/AO3c9EZ2T9r7E1C6hivFdK/ESP32_BT_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_BT_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ESP32_BT_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32bt.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDilZt/btrSNZ8nCcH/0HcbPBZKeZIx9T2MUBZGek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDilZt/btrSNZ8nCcH/0HcbPBZKeZIx9T2MUBZGek/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDilZt/btrSNZ8nCcH/0HcbPBZKeZIx9T2MUBZGek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDilZt%2FbtrSNZ8nCcH%2F0HcbPBZKeZIx9T2MUBZGek%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorESP32bt.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pairing to ESP32 at mobile phone and connecting to ESP32 on the ADUPAD app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Bluetooth pairing&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Select the ESP32 on the Bluetooth setting screen of your mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blueParing.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsTxrL/btrSN1E73eh/X1wFAQ9gQ3p4vKgqDHXx41/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsTxrL/btrSN1E73eh/X1wFAQ9gQ3p4vKgqDHXx41/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsTxrL/btrSN1E73eh/X1wFAQ9gQ3p4vKgqDHXx41/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsTxrL%2FbtrSN1E73eh%2FX1wFAQ9gQ3p4vKgqDHXx41%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;376&quot; data-filename=&quot;blueParing.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Confirm the callback Message from ESP32 for pairing&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blueParingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mgr2P/btrSIRjVC4L/irUugqasyE0Lo9IqTXp0nK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mgr2P/btrSIRjVC4L/irUugqasyE0Lo9IqTXp0nK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mgr2P/btrSIRjVC4L/irUugqasyE0Lo9IqTXp0nK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmgr2P%2FbtrSIRjVC4L%2FirUugqasyE0Lo9IqTXp0nK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;264&quot; data-filename=&quot;blueParingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TkZkR/btrSIQZCVIW/edMUgjLi4putnc8FcALzb0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TkZkR/btrSIQZCVIW/edMUgjLi4putnc8FcALzb0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TkZkR/btrSIQZCVIW/edMUgjLi4putnc8FcALzb0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTkZkR%2FbtrSIQZCVIW%2FedMUgjLi4putnc8FcALzb0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;121&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Bluetooth 2.0 Search and Connection in the App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth icon in the app and select Bluetooth 2.0 in Select Ver.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth button and select the bluetooth of ESP32.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluetooth.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEESH1/btrSJSPV6v1/j1CDaBOf2JC6KBeXllmKxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEESH1/btrSJSPV6v1/j1CDaBOf2JC6KBeXllmKxk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEESH1/btrSJSPV6v1/j1CDaBOf2JC6KBeXllmKxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEESH1%2FbtrSJSPV6v1%2Fj1CDaBOf2JC6KBeXllmKxk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;485&quot; data-filename=&quot;bluetooth.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;esp32_blue_basicAdupadconnect.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C2Wu4/btrSI9kldJA/xV2dPpYev2TouoKbuXhbdK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C2Wu4/btrSI9kldJA/xV2dPpYev2TouoKbuXhbdK/img.jpg&quot; data-alt=&quot;received data &amp;quot;248(0xF8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C2Wu4/btrSI9kldJA/xV2dPpYev2TouoKbuXhbdK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC2Wu4%2FbtrSI9kldJA%2FxV2dPpYev2TouoKbuXhbdK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;esp32_blue_basicAdupadconnect.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data &quot;248(0xF8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;esp32_blue_basicresponse.jpg&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bru7kz/btrSKQqFdPi/nlFFijQJl9ffV7GftlhbI0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bru7kz/btrSKQqFdPi/nlFFijQJl9ffV7GftlhbI0/img.jpg&quot; data-alt=&quot;response from ESP32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bru7kz/btrSKQqFdPi/nlFFijQJl9ffV7GftlhbI0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbru7kz%2FbtrSKQqFdPi%2FnlFFijQJl9ffV7GftlhbI0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;269&quot; height=&quot;96&quot; data-filename=&quot;esp32_blue_basicresponse.jpg&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;response from ESP32&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with Bluetooth of ADUPAD applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SerialBT_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zfmo9/btrSKugWW64/ihCqgXQGQ9h89351vevqZk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zfmo9/btrSKugWW64/ihCqgXQGQ9h89351vevqZk/img.jpg&quot; data-alt=&quot;ADUPAD app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zfmo9/btrSKugWW64/ihCqgXQGQ9h89351vevqZk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzfmo9%2FbtrSKugWW64%2FihCqgXQGQ9h89351vevqZk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;226&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUPAD app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for Bluetooth in the Arduino sketch according to the protocol header settings in the ADUPAD app.&lt;/p&gt;
&lt;pre id=&quot;code_1669262160734&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD 0xF0
#define joyHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define optionHD 0xF9
#define checkHD 0xF5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUPAD app&lt;/p&gt;
&lt;pre id=&quot;code_1669262261127&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

if (appConnection) { // If app connection is confirmed
  // Execute code after app connection is confirmed
} else {
  if (SerialBT.peek() == connectHD) appConnection = true; // Check if the value is 0xF8.
  else SerialBT.disconnect(); // disconnect and advertise for new pairing
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHD(0xF8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + connect&lt;/span&gt;: Transmit the necessary app settings through the iniSet() function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + NA&lt;/span&gt;: Change setting values for the bluetooth of ESP32.&lt;/p&gt;
&lt;pre id=&quot;code_1669262494182&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (temp == F(&quot;connect&quot;)) iniSet(); 
else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; Serial.println(F(&quot;disconnect&quot;)); }
else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); }
else Serial.println(temp);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHD(0xF9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669262559997&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(0xF0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669262669781&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF0 + 1byte Num + 0xF1
while (SerialBT.peek() == pinHD) { // need depend on left arrow pad mode 
  SerialBT.readBytes(data, 3); // Store 3 bytes of data in array &quot;data&quot; from Serial Buffer
  if (data[2] == footHD) { // if the third byte is 0xF1
    pin_control(data[1]);  // execute the code with the value of second byte
    data[2] = 0;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;joyHD(0xF3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669262803877&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF3 + 1byte Num(id) + 2byte Num(heading) + 1byte Num(strength) + 0xF1
while (SerialBT.peek() == joyHD) { 
  SerialBT.readBytes(data, 6); // Store 6 bytes of data in array &quot;data&quot; from Serial Buffer
  if (data[5] == footHD) {     // if the sixth byte is 0xF1
    uint16_t value = data[3];  // Swap third and fourth bytes
    value = value &amp;lt;&amp;lt; 8 | data[2];
    joystick_control(data[1], value, data[4]); // execute the code with values
    data[5] = 0;
  }
}
if (joyEcho) { sendJoyEcho(); joyEcho = 0; } // Prevent data transmission while receiving data
// refer to &quot;Precautions when using the HC-06 with Serial communication&quot; posted in Basic code.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Sending a flag that causes the ADUPAD app to immediately terminate the timer for receiving data&lt;/p&gt;
&lt;pre id=&quot;code_1669263137284&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (dataSend) { SerialBT.write(checkHD); dataSend = false; } // send 0xF5 to terminate the timer.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669263263381&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669263286300&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the Joystick state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669263353204&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) { 
  uint8_t joy[6] = {joyHD, id, heading, heading &amp;gt;&amp;gt; 8, strength, footHD};
  SerialBT.write(joy, 6);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the Joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669263410427&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t joyEcho = 0;
uint8_t ecVal[12] = { 0, };

void send_joy_echo(uint8_t id, uint16_t heading, uint8_t strength) {
  if (joyEcho &amp;gt; 2) joyEcho = 0;
  ecVal[joyEcho*4] = id; 
  ecVal[(joyEcho*4)+1] = heading;
  ecVal[(joyEcho*4)+2] = heading &amp;gt;&amp;gt; 8;
  ecVal[(joyEcho*4)+3] = strength; 
  joyEcho++;
}

void sendJoyEcho() {
  uint8_t ch = 0;
  while (joyEcho) {
    joyEcho--;
    uint8_t joy[6] = {joyHD, ecVal[ch*4], ecVal[(ch*4)+1], ecVal[(ch*4)+2], ecVal[(ch*4)+3], echoHD};
    SerialBT.write(joy, 6); ch++;
  }
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text.&lt;/p&gt;
&lt;pre id=&quot;code_1669263479732&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String str) {
  String setVal = &quot;&quot;;
  setVal += char(strHD);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1669263512988&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;disconnect02.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQhapG/btrSJmRpWaf/0lADdpFMlzWeLvSafhrau0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQhapG/btrSJmRpWaf/0lADdpFMlzWeLvSafhrau0/img.jpg&quot; data-alt=&quot;Disconnect Button for Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQhapG/btrSJmRpWaf/0lADdpFMlzWeLvSafhrau0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQhapG%2FbtrSJmRpWaf%2F0lADdpFMlzWeLvSafhrau0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;45&quot; data-filename=&quot;disconnect02.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button for Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Use when you want to acquire control authority by using the set password for ESP32&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It can be changed to any name through definition of the passName and passNameLen for processing the password in the sketch and the app send datas starting with passName as password value. This is to enhance security.&lt;/p&gt;
&lt;pre id=&quot;code_1670154809810&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define passName F(&quot;PAS:&quot;)
#define passNameLen 0x04

void requestPass(bool val){ 
  String setVal = &quot;&quot;;
  setVal += char(connectHD);
  setVal += char(0x02);
  if (val) {
    setVal += char(passNameLen);
    setVal += passName;
  } else setVal += char(val);
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lXXiu/btrSMH70fYe/FjayJcVlAPwBLIKpJ65260/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lXXiu/btrSMH70fYe/FjayJcVlAPwBLIKpJ65260/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lXXiu/btrSMH70fYe/FjayJcVlAPwBLIKpJ65260/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlXXiu%2FbtrSMH70fYe%2FFjayJcVlAPwBLIKpJ65260%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Response for correct or not through password confirmation&lt;/p&gt;
&lt;pre id=&quot;code_1670154857226&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void responsePass(bool val){ 
  uint8_t setVal[3] = {connectHD, 0x03, val};
  SerialBT.write(setVal, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p9iMG/btrSPP5vAoa/72kKGNWD4qHKzRBXQZdFjK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p9iMG/btrSPP5vAoa/72kKGNWD4qHKzRBXQZdFjK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p9iMG/btrSPP5vAoa/72kKGNWD4qHKzRBXQZdFjK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp9iMG%2FbtrSPP5vAoa%2F72kKGNWD4qHKzRBXQZdFjK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;41&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBPgCd/btrSI9YWbp4/wyRPjY9OekCftkDtVKtIG0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBPgCd/btrSI9YWbp4/wyRPjY9OekCftkDtVKtIG0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBPgCd/btrSI9YWbp4/wyRPjY9OekCftkDtVKtIG0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBPgCd%2FbtrSI9YWbp4%2FwyRPjY9OekCftkDtVKtIG0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1669263890899&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendMessage(String str) {
  String setVal = &quot;&quot;;
  setVal += char(connectHD);
  setVal += char(0x04);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tcU2Z/btrSKuuy0dD/8PMUd6lumAjeCcECdjiyvk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tcU2Z/btrSKuuy0dD/8PMUd6lumAjeCcECdjiyvk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tcU2Z/btrSKuuy0dD/8PMUd6lumAjeCcECdjiyvk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtcU2Z%2FbtrSKuuy0dD%2F8PMUd6lumAjeCcECdjiyvk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. Set the function to continuously transmit the changed value of the Joystick according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** The Gravity Sensor always works in an active Mode.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Joystick Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Joystick Mode&lt;/span&gt;&amp;nbsp;(transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1669264070732&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveJoystick(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9Lhiq/btrSJYvKILg/pzRpljj9WShjT4THSn3Ua1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9Lhiq/btrSJYvKILg/pzRpljj9WShjT4THSn3Ua1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9Lhiq/btrSJYvKILg/pzRpljj9WShjT4THSn3Ua1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9Lhiq%2FbtrSJYvKILg%2FpzRpljj9WShjT4THSn3Ua1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;98&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Set transmission interval of ACTIVE JOYSTIC MODE. (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669264183307&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoystickInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Set the range where the strength of the joystick becomes 0. (enter a value from 0 to 35)&lt;/p&gt;
&lt;pre id=&quot;code_1669264206627&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7EOAq/btrSJxZyMuM/BlFHTrJR7Dmzj4nfV8l1FK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7EOAq/btrSJxZyMuM/BlFHTrJR7Dmzj4nfV8l1FK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7EOAq/btrSJxZyMuM/BlFHTrJR7Dmzj4nfV8l1FK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7EOAq%2FbtrSJxZyMuM%2FBlFHTrJR7Dmzj4nfV8l1FK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;198&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Set whether or not to use a function that converts the Strength value of Joystick or Gravity Sensor into a value between 0 and 10.&lt;/p&gt;
&lt;pre id=&quot;code_1669264247267&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyStrengthAdjust(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x04, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Activate a timer that sends checkHD(0xF5) at regular time intervals.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Regardless of the app, it is used to reflect independently changed values in the Arduino to the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669264286579&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequest(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x05, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/18LXQ/btrSISbXnrA/ouQ29hgUAZZeKqYj9gohOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/18LXQ/btrSISbXnrA/ouQ29hgUAZZeKqYj9gohOk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/18LXQ/btrSISbXnrA/ouQ29hgUAZZeKqYj9gohOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F18LXQ%2FbtrSISbXnrA%2FouQ29hgUAZZeKqYj9gohOk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;83&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Set the operation interval of the timer sending checkHD(%%F5). (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669272696447&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequestInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x06, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Set the group for the left arrow keypad.&lt;/p&gt;
&lt;pre id=&quot;code_1669272720480&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){   
  if (val == 0 || val &amp;gt; 2) val = 4; 
  uint8_t setVal[4] = {optionHD, 0x07, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6Fqq2/btrSLJEYifI/BYgcFvOTIwtkfe4vGQojx0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6Fqq2/btrSLJEYifI/BYgcFvOTIwtkfe4vGQojx0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6Fqq2/btrSLJEYifI/BYgcFvOTIwtkfe4vGQojx0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6Fqq2%2FbtrSLJEYifI%2FBYgcFvOTIwtkfe4vGQojx0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;88&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Set the 4-way control of the joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669272758785&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  uint8_t setVal[4] = {optionHD, 0x08, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set whether or not to display the group button.&lt;/p&gt;
&lt;pre id=&quot;code_1669272791566&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  uint8_t setVal[4] = {optionHD, 0x09, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s3EzC/btrSJSPWSSv/wuzzEWtfPE8JNkEej2rXmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s3EzC/btrSJSPWSSv/wuzzEWtfPE8JNkEej2rXmk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s3EzC/btrSJSPWSSv/wuzzEWtfPE8JNkEej2rXmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs3EzC%2FbtrSJSPWSSv%2FwuzzEWtfPE8JNkEej2rXmk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;31&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3FKjL/btrSITopWfD/YUItHa6sjmlM0ZiUcMtRk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3FKjL/btrSITopWfD/YUItHa6sjmlM0ZiUcMtRk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3FKjL/btrSITopWfD/YUItHa6sjmlM0ZiUcMtRk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3FKjL%2FbtrSITopWfD%2FYUItHa6sjmlM0ZiUcMtRk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;144&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MjkYt/btrSJUfTaMp/Q1ya3NZYBOTdXWTsvwJKzK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MjkYt/btrSJUfTaMp/Q1ya3NZYBOTdXWTsvwJKzK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MjkYt/btrSJUfTaMp/Q1ya3NZYBOTdXWTsvwJKzK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMjkYt%2FbtrSJUfTaMp%2FQ1ya3NZYBOTdXWTsvwJKzK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;137&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1669273149927&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2(OTHER)/3(HC06): show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x0A, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/srGwP/btrSIP7sWRm/2h0YyxeApFVWSamwXe7kw0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/srGwP/btrSIP7sWRm/2h0YyxeApFVWSamwXe7kw0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/srGwP/btrSIP7sWRm/2h0YyxeApFVWSamwXe7kw0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsrGwP%2FbtrSIP7sWRm%2F2h0YyxeApFVWSamwXe7kw0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. Set the activation interval of the gravity sensor and transmission of the tilt value.&lt;/p&gt;
&lt;pre id=&quot;code_1669273225287&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x0B, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqpmiz/btrSKuBgeK9/TFjL9FmRQ7WZiFsFGV3tv1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqpmiz/btrSKuBgeK9/TFjL9FmRQ7WZiFsFGV3tv1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqpmiz/btrSKuBgeK9/TFjL9FmRQ7WZiFsFGV3tv1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcqpmiz%2FbtrSKuBgeK9%2FTFjL9FmRQ7WZiFsFGV3tv1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;83&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br70Kg/btrSJn3S1kc/5b3OXyJtqboYPlfqPuNTGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br70Kg/btrSJn3S1kc/5b3OXyJtqboYPlfqPuNTGk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br70Kg/btrSJn3S1kc/5b3OXyJtqboYPlfqPuNTGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr70Kg%2FbtrSJn3S1kc%2F5b3OXyJtqboYPlfqPuNTGk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;48&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21. Set labels for buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669273292905&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//f(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0C);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lUATK/btrSL0zPoKU/XvYxTJwceNLDfaramsTZ6K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lUATK/btrSL0zPoKU/XvYxTJwceNLDfaramsTZ6K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lUATK/btrSL0zPoKU/XvYxTJwceNLDfaramsTZ6K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlUATK%2FbtrSL0zPoKU%2FXvYxTJwceNLDfaramsTZ6K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;84&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTXJN7/btrSN0lUCOb/qeQRRbqtFjKvZ8Tsh43LaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTXJN7/btrSN0lUCOb/qeQRRbqtFjKvZ8Tsh43LaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTXJN7/btrSN0lUCOb/qeQRRbqtFjKvZ8Tsh43LaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTXJN7%2FbtrSN0lUCOb%2FqeQRRbqtFjKvZ8Tsh43LaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;180&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22. Set the toggle/push properties of the left 4 buttons or 20 buttons of all.&lt;/p&gt;
&lt;pre id=&quot;code_1669273384070&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0000&quot;)          // left pad: up-left-right-down
//F(&quot;00000000001111110000&quot;) // 0000:left, 0000:right, 001111110000:center
void setLeftPadOrAllToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2h3Zm/btrSLJydMGh/Gs9nFrppgdBwZrIWhxbHIk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2h3Zm/btrSLJydMGh/Gs9nFrppgdBwZrIWhxbHIk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2h3Zm/btrSLJydMGh/Gs9nFrppgdBwZrIWhxbHIk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2h3Zm%2FbtrSLJydMGh%2FGs9nFrppgdBwZrIWhxbHIk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;105&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23. Set the toggle/push properties of the right 4 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669273452983&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;0000&quot;)           // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0E);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;24. Set the toggle/push properties of the middle 12 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669273472950&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;000000000000&quot;); // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ // must after setLeftPadMode(uint8_t val)
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0F);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;25. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1669273497174&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;RAD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; setVal += ':';
  setVal += String(selection);
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z3zSP/btrSM3b0vn0/jFCE3JwPJtaJtUMaKgDnk0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z3zSP/btrSM3b0vn0/jFCE3JwPJtaJtUMaKgDnk0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z3zSP/btrSM3b0vn0/jFCE3JwPJtaJtUMaKgDnk0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz3zSP%2FbtrSM3b0vn0%2FjFCE3JwPJtaJtUMaKgDnk0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;26. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669273549175&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;CKB:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdbq90/btrSMHz77H6/RQLLb5YmnJNkJuJ9cdvSk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdbq90/btrSMHz77H6/RQLLb5YmnJNkJuJ9cdvSk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdbq90/btrSMHz77H6/RQLLb5YmnJNkJuJ9cdvSk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdbq90%2FbtrSMHz77H6%2FRQLLb5YmnJNkJuJ9cdvSk1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;27. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1669273586030&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;CHD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += message; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgdWxX/btrSJT9bwzX/gIV3euPcCqoQSLWrRIgj9K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgdWxX/btrSJT9bwzX/gIV3euPcCqoQSLWrRIgj9K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgdWxX/btrSJT9bwzX/gIV3euPcCqoQSLWrRIgj9K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgdWxX%2FbtrSJT9bwzX%2FgIV3euPcCqoQSLWrRIgj9K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;28. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1669273624071&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;LSD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmw4c8/btrSN2cWWDz/cVhPOskq7Wbkskj64Jbk00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmw4c8/btrSN2cWWDz/cVhPOskq7Wbkskj64Jbk00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmw4c8/btrSN2cWWDz/cVhPOskq7Wbkskj64Jbk00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcmw4c8%2FbtrSN2cWWDz%2FcVhPOskq7Wbkskj64Jbk00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;294&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;29. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1669273670751&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;STR:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YCLbX/btrSJmKDX08/EfJIzSiMRIZtKXDrJWkNJk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YCLbX/btrSJmKDX08/EfJIzSiMRIZtKXDrJWkNJk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YCLbX/btrSJmKDX08/EfJIzSiMRIZtKXDrJWkNJk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYCLbX%2FbtrSJmKDX08%2FEfJIzSiMRIZtKXDrJWkNJk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.ESP32_BT_JOYSTIC.zip&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/HSncM/btrSLJ559Vj/d96VT0DilLPDARMf5w9Rd1/1.ESP32_BT_JOYSTIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1.ESP32_BT_JOYSTIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/VP5Wy1T5n_0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/VP5Wy1T5n_0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/VP5Wy1T5n_0&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1670155351258&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;BluetoothSerial.h&quot;
BluetoothSerial SerialBT;

#define btName F(&quot;ESP32blue&quot;)

void BTConfirmRequestCallback(uint32_t numVal){
  SerialBT.confirmReply(true);
}

#include &quot;protocol.h&quot;

void setup() {
  Serial.begin(115200);
  SerialBT.enableSSP();
  SerialBT.onConfirmRequest(BTConfirmRequestCallback);
  SerialBT.begin(btName); //Bluetooth device name
  Serial.println(F(&quot;Bluetooth 2.0&quot;));
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(&quot;button 1 : on&quot;); 
                  break;
      case 10: Serial.println(&quot;button 1 : off&quot;);
                  break;
      case 21: Serial.println(&quot;button 2 : on&quot;);
                  break;
      case 20: Serial.println(&quot;button 2 : off&quot;);
                  break;
      case 31: Serial.println(&quot;button 3 : on&quot;);
                  break;
      case 30: Serial.println(&quot;button 3 : off&quot;);
                  break;
      case 41: Serial.println(&quot;button 4 : on&quot;);
                  break;
      case 40: Serial.println(&quot;button 4 : off&quot;);
                  break;
      case 51: Serial.println(&quot;button 5 : on&quot;);
                  break;
      case 50: Serial.println(&quot;button 5 : off&quot;);
                  break;
      case 61: Serial.println(&quot;button 6 : on&quot;);
                  break;
      case 60: Serial.println(&quot;button 6 : off&quot;);
                  break;
      case 71: Serial.println(&quot;button 7 : on&quot;);
                  break;
      case 70: Serial.println(&quot;button 7 : off&quot;);
                  break;
      case 81: Serial.println(&quot;button 8 : on&quot;);
                  break;
      case 80: Serial.println(&quot;button 8 : off&quot;);
                  break;
      case 91: Serial.println(&quot;button 9 : on&quot;);
                  break;
      case 90: Serial.println(&quot;button 9 : off&quot;);
                  break;  
      case 101: Serial.println(&quot;button 10 : on&quot;);
                //uint8_t id, String title, String option
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,tomato,banana,mango&quot;)); 
                  break;
      case 100: Serial.println(&quot;button 10 : off&quot;);
                  break;  
      case 111: Serial.println(&quot;button 11 : on&quot;);
                  break;
      case 110: Serial.println(&quot;button 11 : off&quot;);
                  break;  
      case 121: Serial.println(&quot;button 12 : on&quot;);
                  break;
      case 120: Serial.println(&quot;button 12 : off&quot;);
                  break;  
      case 131: Serial.println(&quot;button 13 : on&quot;);
                  break;  
      case 130: Serial.println(&quot;button 13 : off&quot;);
                  break;  
      case 141: Serial.println(&quot;button 14 : on&quot;);
                  break;  
      case 140: Serial.println(&quot;button 14 : off&quot;);
                  break;  
      case 151: Serial.println(&quot;button 15 : on&quot;);
                  break;  
      case 150: Serial.println(&quot;button 15 : off&quot;);
                  break;         
      case 161: Serial.println(F(&quot;button 16 : on&quot;));
                  break;
      case 160: Serial.println(F(&quot;button 16 : off&quot;));
                  break;  
      case 171: Serial.println(F(&quot;button 17 : on&quot;));
                  break;
      case 170: Serial.println(F(&quot;button 17 : off&quot;));
                  break;  
      case 181: Serial.println(F(&quot;button 18 : on&quot;));
                  break;  
      case 180: Serial.println(F(&quot;button 18 : off&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : on&quot;));
                  break;  
      case 190: Serial.println(F(&quot;button 19 : off&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : on&quot;));
                  break;  
      case 200: Serial.println(F(&quot;button 20 : off&quot;));
                  break; 
      case 210: Serial.println(F(&quot;button 21 : off&quot;));
                  break;  
      case 220: Serial.println(F(&quot;button 22 : off&quot;));
                  break;            
    }
  }
}

// headingVal = false;
//           Top
//         6  7  0
//          \ | /
//  Left 5 --   -- 1 Right
//          / | \
//         4  3  2
//          Bottom

bool headingVal = true; 

void joystick_control(uint8_t id, uint16_t heading, uint8_t strength) {
  //sendJoyEcho(id, heading, strength); 
  if (id == 0) Serial.print(F(&quot;L: &quot;));
  else if (id == 1) Serial.print(F(&quot;R: &quot;));
  else Serial.print(F(&quot;C: &quot;));
  if (headingVal) {
    Serial.print(heading); Serial.print('/'); Serial.println(strength);
  } else {
    if (heading &amp;lt;= 23) heading = 359;
    int8_t stickDir = (heading-23)/45;  
    Serial.println(stickDir);
  }
}

bool appConnection = false;
uint8_t data[6] = {0, 0, 0, 0, 0, 0};

void SerialBT_read() {
  if (SerialBT.available()) {  
    if (appConnection) {
      if (SerialBT.peek() == joyHD) { // 0xF3
        while (SerialBT.peek() == joyHD) {
          SerialBT.readBytes(data, 6);
          if (data[5] == footHD) {
            uint16_t value = data[3];
            value = value &amp;lt;&amp;lt; 8 | data[2];
            joystick_control(data[1], value, data[4]);
            data[5] = 0;
          }
        }
        if (joyEcho) { sendJoyEcho(); joyEcho = 0; }
      } else if (SerialBT.peek() == pinHD) {  // 0xf0
        while (SerialBT.peek() == pinHD) { // need depend on left arrow pad mode 
          SerialBT.readBytes(data, 3);
          if (data[2] == footHD) {
            pin_control(data[1]);
            data[2] = 0;
          }
        }
      } else {
        uint8_t dump;
        if (SerialBT.peek() == checkHD) { dump = SerialBT.read(); dataSend = true; }
        else if (SerialBT.peek() == optionHD || SerialBT.peek() == connectHD) { 
          dump = SerialBT.read();
          String temp = SerialBT.readStringUntil('\n');
          if (dump == connectHD) {
            if (temp == F(&quot;connect&quot;)) iniSet();
            else if (temp == F(&quot;disconnect&quot;)) appConnection = false;
            else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); } 
            else Serial.println(temp);
          } else CheckF9(temp); 
        } else {
          dump = SerialBT.read();
          Serial.write(dump);
        }
      }
      if (!dataSend) SerialBT.write(checkHD); // empty return
      else dataSend = false;
    } else {
      if (SerialBT.peek() == connectHD) appConnection = true;
      else SerialBT.disconnect();
    }
  }
}

void loop() {
  SerialBT_read(); 
  if(Serial.available()) { // if there is data in the serial buffer
    String temp = Serial.readStringUntil('\n'); // option of serial monitor: NEW LINE
    Serial.println(temp);
    if(temp == &quot;1&quot;){   
      setAddButtonLabel(F(&quot;BT1,BT23,BT3,BT4,BT5,BT6&quot;));
    } else if(temp == &quot;2&quot;){ 
      sendJoyState(0, 45, 10);
    } else if(temp == &quot;3&quot;){ 
      send_joy_echo(1, 45, 10);
    } else if(temp == &quot;4&quot;){
      setActiveJoystick(true);
    } else if(temp == &quot;5&quot;){
      setActiveJoystick(false);
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1670155380923&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD 0xF0
#define joyHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define optionHD 0xF9
#define checkHD 0xF5

bool dataSend = false;

void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}

void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}

// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) { 
  uint8_t joy[6] = {joyHD, id, heading, heading &amp;gt;&amp;gt; 8, strength, footHD};
  SerialBT.write(joy, 6);
  dataSend = true;
}

uint8_t joyEcho = 0;
uint8_t ecVal[12] = { 0, };

void send_joy_echo(uint8_t id, uint16_t heading, uint8_t strength) {
  if (joyEcho &amp;gt; 2) joyEcho = 0;
  ecVal[joyEcho*4] = id; 
  ecVal[(joyEcho*4)+1] = heading;
  ecVal[(joyEcho*4)+2] = heading &amp;gt;&amp;gt; 8;
  ecVal[(joyEcho*4)+3] = strength; 
  joyEcho++;
}

void sendJoyEcho() {
  uint8_t ch = 0;
  while (joyEcho) {
    joyEcho--;
    uint8_t joy[6] = {joyHD, ecVal[ch*4], ecVal[(ch*4)+1], ecVal[(ch*4)+2], ecVal[(ch*4)+3], echoHD};
    SerialBT.write(joy, 6); ch++;
  }
  dataSend = true;
}

void sendText(String str) {
  String setVal = &quot;&quot;;
  setVal += char(strHD);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////////////////////// CONNECTION 
void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}

//#define passName F(&quot;PAS:&quot;)
//#define passNameLen 0x04
//
//void requestPass(bool val){ // order disconnect to App 
//  String setVal = &quot;&quot;;
//  setVal += char(connectHD);
//  setVal += char(0x02);
//  if (val) {
//    setVal += char(passNameLen);
//    setVal += passName;
//  } else setVal += char(val);
//  SerialBT.print(setVal);
//  dataSend = true;
//}
//
//void responsePass(bool val){ // order disconnect to App 
//  uint8_t setVal[3] = {connectHD, 0x03, val};
//  SerialBT.write(setVal, 3);
//  dataSend = true; 
//}

void sendMessage(String str) {
  String setVal = &quot;&quot;;
  setVal += char(connectHD);
  setVal += char(0x04);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveJoystick(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// SEND SLIDE GET VALUE INTERVAL
void setJoystickInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setJoyStrengthAdjust(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x04, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setRequest(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x05, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setRequestInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x06, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){   
  if (val == 0 || val &amp;gt; 2) val = 4; 
  uint8_t setVal[4] = {optionHD, 0x07, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  uint8_t setVal[4] = {optionHD, 0x08, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  uint8_t setVal[4] = {optionHD, 0x09, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// 0: not use, 1: show only name, 2: show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x0A, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x0B, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

//f(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0C);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

//F(&quot;0000&quot;)          // left pad: up-left-right-down
void setLeftPadOrAllToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}
// F(&quot;0000&quot;)           // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0E);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}
// F(&quot;000000000000&quot;); // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ // must after setLeftPadMode(uint8_t val)
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0F);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;RAD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; setVal += ':';
  setVal += String(selection);
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;CKB:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;CHD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += message; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;LSD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;STR:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  setAddButtonLabel(F(&quot;BT1,BT22,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;));
  setJoyWay4(false);
  setActiveJoystick(true); setJoystickInterval(100);
  setJoyStrengthAdjust(true);
  setRequest(false); //setRequestInterval(250);
  setSSIDLabelMode(0); // btName Label long click function disabled
  //useGravityAndInterval(180);
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUPAD app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUPAD app settings: label/toggle properties, use of the timer for checkHD(0xF5), Joystic Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1670163694427&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  setAddButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;)); 
  setJoyWay4(false); 
  setActiveJoystick(true); setJoystickInterval(100); // Active Slide Mode
  setJoyStrengthAdjust(true);                        // value of Joystick adjusted into 0 ~ 10
  setSSIDLabelMode(0); // not use change the name for blutooth of ESP32
  setRequest(false); //setRequestInterval(250); // Disable timer for check(0xF5)
  //useGravityAndInterval(180 * 2); // use or not the Gravity sensor with the interval
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the leftPadMode and menu-related button.&lt;/p&gt;
&lt;pre id=&quot;code_1670164035691&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up DIR&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;)); 
                  break;
      case 10: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left DIR&quot;));
               else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right DIR&quot;));
               else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down DIR&quot;));
               else Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down off&quot;));
               else Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
               //uint8_t id, String title, String option
               dialogList(0, F(&quot;LEFT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(&quot;button 10 : on&quot;);
                //uint8_t id, String title, String option
                dialogList(2, F(&quot;RIGHT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1670164057859&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }         // radio button
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }    // Checkbox
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }    // Select button
  else if (temp.startsWith(F(&quot;LSD&quot;))) {       // List Window
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { leftPadMode = 0; setLeftPadOrAllToggle(F(&quot;0000&quot;)); }
      else if (temp.startsWith(F(&quot;TOG&quot;))) {
        setLeftPadOrAllToggle(F(&quot;1111&quot;)); // set toggle for left button
        dialogList(1, F(&quot;LEFT PAD MODE AT TOGGLE&quot;), F(&quot;SELECT,INDIVIDUAL,TWO GROUP,ONLY ONE&quot;)); // dialog message
      }
    } else if (id == 1) {
      if (temp.startsWith(F(&quot;IND&quot;))) leftPadMode = 1; // independant
      else if (temp.startsWith(F(&quot;TWO&quot;))) leftPadMode = 2; // 2 group: up/down, left/right
      else if (temp.startsWith(F(&quot;ONL&quot;))) leftPadMode = 4; // 4psc button is 1 group
      setLeftPadMode(leftPadMode);
    } else if (id == 2) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { rightPadMode = 0; setRightPadToggle(F(&quot;0000&quot;)); } // set push for right button
      else { rightPadMode = 1; setRightPadToggle(F(&quot;1111&quot;)); }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }       // Input text
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1.ESP32_BT_JOYSTIC_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/q6bSi/btrSQTNyWEe/chtdkpSXB3eYbuZtbdWic1/1-1.ESP32_BT_JOYSTIC_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1-1.ESP32_BT_JOYSTIC_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/2dOWqdPc2fY&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/2dOWqdPc2fY&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/2dOWqdPc2fY&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Change name for the bluetooth of ESP32 on ADUPAD App&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4DL1n/btrSQTz3zlj/U2LX7sFM5fhhHPBKs0HzFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4DL1n/btrSQTz3zlj/U2LX7sFM5fhhHPBKs0HzFk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4DL1n/btrSQTz3zlj/U2LX7sFM5fhhHPBKs0HzFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4DL1n%2FbtrSQTz3zlj%2FU2LX7sFM5fhhHPBKs0HzFk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x3oDV/btrSLI7etZY/H9VKMcDqeHL7aRpw7VPCFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x3oDV/btrSLI7etZY/H9VKMcDqeHL7aRpw7VPCFk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x3oDV/btrSLI7etZY/H9VKMcDqeHL7aRpw7VPCFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx3oDV%2FbtrSLI7etZY%2FH9VKMcDqeHL7aRpw7VPCFk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;121&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save the name for the bluetooth of ESP32.&lt;/p&gt;
&lt;pre id=&quot;code_1670164257323&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char btName[11] = &quot;ESP32blue&quot;;  // 10 char&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SPIFFS Setting&lt;/p&gt;
&lt;pre id=&quot;code_1670164289186&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;SPIFFS.h&quot;  // ESP32 SPIFSPIFFS LIBRARY

bool saveConfig() {   // Write NAME
  String value = btName;
  Serial.println(value);
  File configFile = SPIFFS.open(F(&quot;/config.txt&quot;), &quot;w&quot;);
  if (!configFile) {
    Serial.println(F(&quot;Failed to open config file for writing&quot;));
    return false;
  } else {
    configFile.println(value); // save at config.txt including '\n'
    configFile.close();
    return true;
  }
}

bool loadConfig() { // Read NAME
  File configFile = SPIFFS.open(F(&quot;/config.txt&quot;), &quot;r&quot;);
  if (!configFile) {
    Serial.println(F(&quot;Failed to open config file&quot;));
    return false;
  } else {
    String temp = configFile.readStringUntil('\r');
    for (int i = 0; i &amp;lt; temp.length(); i++) btName[i] = temp[i];
    btName[temp.length()] = '\0';
    configFile.close();
    Serial.println(btName);
    return true;
  }
}

void setup() {
    if (SPIFFS.exists(F(&quot;/config.txt&quot;))) loadConfig(); // if there is &quot;/config.txt&quot;, read
    else saveConfig();  // if there is not, save a new config.txt 
}

// SPIFFS initialization code at serial monitor
void loop() {
  if(Serial.available()) { // Serial monitor
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if(temp == &quot;1&quot;){   
      Serial.println(F(&quot;format...&quot;));
      SPIFFS.format();
      Serial.println(F(&quot;done. can start upload.&quot;));
      while(1); // stanby for uploading
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Save parsing data for name and remove the data for password and send a message applyed in Arduino.&lt;/p&gt;
&lt;pre id=&quot;code_1670164325138&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void changeBTname(String str) { 
  bool save = false; 
  String temp = str.substring(0, 1);
  bool delPass = temp.toInt(); // if true, there is data for password which is not used in this sketch 
  str.remove(0, 1);
  if (delPass) str.remove(0, 6); // remove pass
  if (str != btName) {
    if (temp != &quot;&quot;) {
      for (int i = 0; i &amp;lt; str.length(); i++) btName[i] = str[i];
      btName[str.length()] = '\0';
      save = true; 
    }
  }
  if (save) {
    saveConfig();
    temp  = F(&quot;&amp;lt;p&amp;gt;NAME:  &quot;);
    temp += btName;
    temp += F(&quot;&amp;lt;/p&amp;gt;Value's Saved.&quot;);
    if (delPass) temp += F(&quot;&amp;lt;br/&amp;gt;Function of Set pass is not provided.&amp;lt;br/&amp;gt;&quot;);
    temp += F(&quot; The module will reboot.&amp;lt;br/&amp;gt;try to reconnect.&quot;);
    sendMessage(temp);
    sendDisconnect(); delay(500); ESP.restart();
  } else {
    temp  = F(&quot;There's no change.&quot;);
    if (delPass) temp += F(&quot;&amp;lt;br/&amp;gt;Function of Set pass is not provided.&quot;);
    sendMessage(temp);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.ESP32_BT_JOYSTIC_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/vDy6o/btrSJTnSU90/u9UFuHOpmZKiDTWcVA0pX1/2.ESP32_BT_JOYSTIC_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;2.ESP32_BT_JOYSTIC_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SPIFFS_FORMAT_ESP32.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/v8W9p/btrSL0NtbK1/dBbMVhcddArLZgIgfIiQMK/SPIFFS_FORMAT_ESP32.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;SPIFFS_FORMAT_ESP32.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/wyp9JWiUu0s&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/wyp9JWiUu0s&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/wyp9JWiUu0s&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Login&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Obtain control authority using the password for bluetooth of ESP32.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwEvja/btrSN1LZY7i/Ar2k1hqTp2pyRkxCGNLPik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwEvja/btrSN1LZY7i/Ar2k1hqTp2pyRkxCGNLPik/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwEvja/btrSN1LZY7i/Ar2k1hqTp2pyRkxCGNLPik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwEvja%2FbtrSN1LZY7i%2FAr2k1hqTp2pyRkxCGNLPik%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SQwcd/btrSQUTgPrX/DwXsFJ7XfKkc3cw8izQick/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SQwcd/btrSQUTgPrX/DwXsFJ7XfKkc3cw8izQick/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SQwcd/btrSQUTgPrX/DwXsFJ7XfKkc3cw8izQick/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSQwcd%2FbtrSQUTgPrX%2FDwXsFJ7XfKkc3cw8izQick%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;41&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save the name for the bluetooth of ESP32 and the set password for login.&lt;/p&gt;
&lt;pre id=&quot;code_1670164766392&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char pass[7] = &quot;123456&quot;;        // 6 char
char btName[11] = &quot;ESP32blue&quot;;  // 10 char&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Password handling code: response message, input prohibition setting, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1670164789020&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define passWaitTime 120000
#define banResetTime 600000
unsigned long int disconnectTime = 0;

void banReset() { // if wrong password is entered 5 times, banned inputting for banResetTime
  if (millis() - disconnectTime &amp;gt; banResetTime) passAllow = 5; 
}

void passTerminate() { // if there's no input a pass within passWaitTime, terminate the connection
  if (millis() - disconnectTime &amp;gt; passWaitTime) { // 2min
    waitPass = false; appConnection = false; 
    sendMessage(F(&quot;It's disconnected by time expires.&amp;lt;br/&amp;gt;Try to reconnect.&quot;));
    sendDisconnect(); 
  }
}

void CheckF8(String temp) {
  if (temp == &quot;&quot;) {
    uint8_t dump = SerialBT.read();
    if (dump == connectHD &amp;amp;&amp;amp; passAllow) {
      temp = SerialBT.readStringUntil('\n');
      Serial.println(temp);
      if (waitPass) { 
        if (temp.startsWith(passName)) {
          temp.remove(0, passNameLen); bool ok = true;
          if (temp.length() == 6) {
            for (int i = 0; i &amp;lt; 6; i++) { if (temp[i] != pass[i]) { ok = false; break; } }
          }
          if (ok) { passOK = true; waitPass = false; iniSet(); send_State(); }
          else { passAllow--; disconnectTime = millis(); } // wrong password &amp;amp; timer set
          if (!passAllow) { // if wrong password is entered 5 times
            waitPass = false; appConnection = false; 
            sendMessage(F(&quot;You've got wrong password 5 times.&amp;lt;br/&amp;gt;Try to reconnect 10 Min later.&quot;));
            sendDisconnect(); 
          } else responsePass(ok);
        } else if (temp == F(&quot;connect&quot;)) { requestPass(usePass); disconnectTime = millis(); } // request pass &amp;amp; timer set
        else if (temp == F(&quot;disconnect&quot;)) { waitPass = false; appConnection = false; SerialBT.flush();}  
      } else {
        if (temp == F(&quot;connect&quot;)) {
          appConnection = true; 
          if (usePass) { requestPass(true); waitPass = true; disconnectTime = millis(); } 
          else { iniSet(); send_State(); }
        } 
      }
    } else if (dump == checkHD) {  }
    else SerialBT.disconnect();
  } else {
    Serial.println(temp);
    if (temp == F(&quot;disconnect&quot;)) { appConnection = false; passOK = false; SerialBT.flush();}
    else if (temp.startsWith(F(&quot;NA&quot;))) { temp.remove(0, 2); changeBTname(temp); }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.ESP32_BT_JOYSTIC_PASS.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/NuMvc/btrSPPYPyhY/Fhnt8Nc06oDIqQ1XK0ISLk/3.ESP32_BT_JOYSTIC_PASS.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;3.ESP32_BT_JOYSTIC_PASS.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/reOJK8MkddE&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/reOJK8MkddE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/reOJK8MkddE&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ADUPAD - Arduino wireless remote control PAD application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUPAD</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/194</guid>
      <comments>https://postpop.tistory.com/194#entry194comment</comments>
      <pubDate>Sun, 4 Dec 2022 19:51:00 +0900</pubDate>
    </item>
    <item>
      <title>ESP32 Bluetooth remote control with ADUCON</title>
      <link>https://postpop.tistory.com/193</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUCON application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvqchu/btrSLJLdMY2/UAmW8JEJIulcqPU8LkoXh0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvqchu/btrSLJLdMY2/UAmW8JEJIulcqPU8LkoXh0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvqchu/btrSLJLdMY2/UAmW8JEJIulcqPU8LkoXh0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvqchu%2FbtrSLJLdMY2%2FUAmW8JEJIulcqPU8LkoXh0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;617&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237452597&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUCON - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&amp;amp;hl=ko&amp;amp;gl=KR&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUCON - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Basic code for remote control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Set Bluetooth Serial library to communicate with Bluetooth component of ESP32&lt;/p&gt;
&lt;pre id=&quot;code_1670068788678&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;BluetoothSerial.h&quot;
BluetoothSerial SerialBT;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Function for callback when attempt with Bluetooth pairing to ESP32&lt;/p&gt;
&lt;pre id=&quot;code_1670068920406&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void BTConfirmRequestCallback(uint32_t numVal){
  SerialBT.confirmReply(true);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blueParingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAegT7/btrSI86hYXR/8lkVXvzZIkr4k7aPhNAlL1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAegT7/btrSI86hYXR/8lkVXvzZIkr4k7aPhNAlL1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAegT7/btrSI86hYXR/8lkVXvzZIkr4k7aPhNAlL1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAegT7%2FbtrSI86hYXR%2F8lkVXvzZIkr4k7aPhNAlL1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;264&quot; data-filename=&quot;blueParingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- setup&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1670069307487&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setup() {
  Serial.begin(115200);// Set the baud rate for communication with the serial monitor of the Arduino IED to 115200
  SerialBT.enableSSP();// set paring mode for bluetooth classic of ESP32
  SerialBT.onConfirmRequest(BTConfirmRequestCallback); // set callback fuction when attempted pairing
  SerialBT.begin(btName); //start software Serial for Bluetooth of ESP32 and set Bluetooth device name
  Serial.println(F(&quot;Bluetooth 2.0&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1670069680975&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool gotData = false;

void loop() {
  if (SerialBT.available()) { // when incomming data from HC06
    uint8_t temp = SerialBT.read();
    Serial.println(temp); // Output data of the HC06 to the serial monitor.
    gotData = true; // the flag for response
  } else {
    if (gotData) {   // if response
      String setVal = &quot;&quot;;
      setVal += char(0xF4);      // protocol header of text for ADUCON with bluetooth
      setVal += &quot;Hello World &quot;;
      setVal += random(100,200); // the message for sending
      setVal += char(0xF1);      // protocol footer of text for ADUCON with bluetooth
      Serial.println(setVal);    // Output the message to the serial monitor.
      SerialBT.print(setVal);    // send data to HC06 as response 
      gotData = false;           // initialize the flag
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_BT_BASIC.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/yVkiL/btrSISvMNUf/89IIFi8oo24VfPlRZkBNc0/ESP32_BT_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_BT_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ESP32_BT_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32bt.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VmDUv/btrSIQrjFaf/CJMtbP8oYDk6DHTA6jHjL1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VmDUv/btrSIQrjFaf/CJMtbP8oYDk6DHTA6jHjL1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VmDUv/btrSIQrjFaf/CJMtbP8oYDk6DHTA6jHjL1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVmDUv%2FbtrSIQrjFaf%2FCJMtbP8oYDk6DHTA6jHjL1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorESP32bt.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pairing to ESP32 at mobile phone and connecting to ESP32 on the ADUCON app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Bluetooth pairing&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Select the ESP32 on the Bluetooth setting screen of your mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blueParing.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RDFdo/btrSJYaWIlF/w06a40n2DEZ7tzhulHjNXk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RDFdo/btrSJYaWIlF/w06a40n2DEZ7tzhulHjNXk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RDFdo/btrSJYaWIlF/w06a40n2DEZ7tzhulHjNXk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRDFdo%2FbtrSJYaWIlF%2Fw06a40n2DEZ7tzhulHjNXk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;376&quot; data-filename=&quot;blueParing.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Confirm the callback Message from ESP32 for pairing&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blueParingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t1v7o/btrSM3o4mbX/9LVgMG5nkGakpqmIeAqVg1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t1v7o/btrSM3o4mbX/9LVgMG5nkGakpqmIeAqVg1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t1v7o/btrSM3o4mbX/9LVgMG5nkGakpqmIeAqVg1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft1v7o%2FbtrSM3o4mbX%2F9LVgMG5nkGakpqmIeAqVg1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;264&quot; data-filename=&quot;blueParingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bry3ol/btrSHJzBkEb/HyM71iaPlC8luCBMgviIb1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bry3ol/btrSHJzBkEb/HyM71iaPlC8luCBMgviIb1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bry3ol/btrSHJzBkEb/HyM71iaPlC8luCBMgviIb1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbry3ol%2FbtrSHJzBkEb%2FHyM71iaPlC8luCBMgviIb1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;121&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Bluetooth 2.0 Search and Connection in the App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth icon in the app and select Bluetooth 2.0 in Select Ver.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth button and select the HC06.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectToblue.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lacXQ/btrSJXXqQc8/5plNO185QSe1K9imugZ2f1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lacXQ/btrSJXXqQc8/5plNO185QSe1K9imugZ2f1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lacXQ/btrSJXXqQc8/5plNO185QSe1K9imugZ2f1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlacXQ%2FbtrSJXXqQc8%2F5plNO185QSe1K9imugZ2f1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;924&quot; data-filename=&quot;connectToblue.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32btRES.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MFu5U/btrSIQ5V8yy/dTJfBb4goYIYWkcixgiSLK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MFu5U/btrSIQ5V8yy/dTJfBb4goYIYWkcixgiSLK/img.jpg&quot; data-alt=&quot;received data &amp;quot;248(0xF8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MFu5U/btrSIQ5V8yy/dTJfBb4goYIYWkcixgiSLK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMFu5U%2FbtrSIQ5V8yy%2FdTJfBb4goYIYWkcixgiSLK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorESP32btRES.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data &quot;248(0xF8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseBTADUCONesp32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDt1oz/btrSJnhYUKH/W47l9YkevHbKMGc6fQMFSK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDt1oz/btrSJnhYUKH/W47l9YkevHbKMGc6fQMFSK/img.jpg&quot; data-alt=&quot;response from ESP32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDt1oz/btrSJnhYUKH/W47l9YkevHbKMGc6fQMFSK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDt1oz%2FbtrSJnhYUKH%2FW47l9YkevHbKMGc6fQMFSK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;97&quot; data-filename=&quot;responseBTADUCONesp32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;response from ESP32&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with Bluetooth of ADUCON applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SerialBT_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TBhVd/btrSJmQWcTw/najrwfVIoP40an9IRhAR9K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TBhVd/btrSJmQWcTw/najrwfVIoP40an9IRhAR9K/img.jpg&quot; data-alt=&quot;ADUCON app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TBhVd/btrSJmQWcTw/najrwfVIoP40an9IRhAR9K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTBhVd%2FbtrSJmQWcTw%2FnajrwfVIoP40an9IRhAR9K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;207&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUCON app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for Bluetooth in the Arduino sketch according to the protocol header settings in the ADUCON app.&lt;/p&gt;
&lt;pre id=&quot;code_1669252564695&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD 0xF0
#define pwmHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define optionHD 0xF9
#define checkHD 0xF5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1669252769450&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

if (appConnection) { // If app connection is confirmed
  // Execute code after app connection is confirmed
} else {
  if (SerialBT.peek() == connectHD) appConnection = true; // Check if the value is 0xF8.
  else SerialBT.disconnect(); // disconnect and advertise for new pairing
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHD(0xF8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + connect&lt;/span&gt;: Transmit the necessary app settings and current Arduino state values through the iniSet() and send_State() functions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + NA&lt;/span&gt;: Change setting values for the bluetooth of ESP32.&lt;/p&gt;
&lt;pre id=&quot;code_1669253086223&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (temp == F(&quot;connect&quot;)) { iniSet(); send_State(); }
else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; SerialBT.flush(); }
else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); } 
else Serial.println(temp);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHD(0xF9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669253301025&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
  else { // if not
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;)); // set the time if the length of the value is less than 10
    else Serial.println(F(&quot;date/time&quot;)); // current date/time if larger
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(0xF0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669253479009&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF0 + 1byte Num + 0xF1
SerialBT.readBytes(Data, 3); // Store 3 bytes of Data in array &quot;Data&quot; from Serial Buffer
if (Data[2] == footHD) {     // if the third byte is 0xF1
  pin_control(Data[1]);      // execute the code with the value of second byte
  Data[2] = 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;pwmHD(0xF3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669253965769&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF3 + 1byte Num(slide number) + 2byte Num(PWM) + 0xF1
while (SerialBT.peek() == pwmHD) { // Process 3 PWM values of COLOR PICKER
  SerialBT.readBytes(Data, 5); // Store 5 bytes of Data in array &quot;Data&quot; from Serial Buffer
  if (Data[4] == footHD) {     // if the fifth byte is 0xF1
    uint16_t value = Data[3];  // Swap third and fourth bytes
    value = value &amp;lt;&amp;lt; 8 | Data[2];
    pwm_control(Data[1], value); // execute the code with values
    Data[4] = 0;
  }
}
if (pwmEcho) { sendPwmEcho(); pwmEcho = 0; } // Prevent Data transmission while receiving Data
// refer to &quot;Precautions when using the HC-06 with Serial communication&quot; posted in Basic code.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Sending a flag that causes the ADUCON app to immediately terminate the timer for receiving data&lt;/p&gt;
&lt;pre id=&quot;code_1669254954479&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (dataSend) { SerialBT.write(checkHD); dataSend = false; } // send 0xF5 to terminate the timer.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669254901711&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669255577270&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the slide state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669255595006&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {
  uint8_t pwm[5] = {pwmHD, slide, pwm_val, pwm_val &amp;gt;&amp;gt; 8, footHD};
  SerialBT.write(pwm, 5);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the PWM.&lt;/p&gt;
&lt;pre id=&quot;code_1669255626374&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t pwmEcho = 0;
uint8_t ecVal[18] = { 0, };

void send_pwm_echo(uint8_t slide, uint16_t pwm_val) {
  if (pwmEcho &amp;gt; 5) pwmEcho = 0;
  ecVal[pwmEcho*3] = slide; 
  ecVal[(pwmEcho*3)+1] = pwm_val;
  ecVal[(pwmEcho*3)+2] = pwm_val &amp;gt;&amp;gt; 8;
  pwmEcho++;
}

void sendPwmEcho() {
  uint8_t ch = 0;
  while (pwmEcho) {
    pwmEcho--;
    uint8_t pwm[5] = {pwmHD, ecVal[ch*3], ecVal[(ch*3)+1], ecVal[(ch*3)+2], echoHD};
    SerialBT.write(pwm, 5); ch++;
  }
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** Precautions when using the bluetooth of ESP32 with Serial communication &lt;br /&gt;While receiving data from bluetooth of ESP32 through software serial communication in Arduino, If Arduino transmits data to bluetooth of ESP32 some of the data received through Bluetooth from the app may be missing. (Probably the first byte) This could be an error in the software serial library. Therefore, It must be coded to transmit data to bluetooth of ESP32 after receiving data from bluetooth of ESP32.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A code example that reflects the status of the current button and PWM values of Arduino to the app when connected to the ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1669255767574&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void send_State() { // CURRENT STATE
  sendPinState(10);
  sendPinState(21);
  sendPinState(30);
  sendPinState(41);
  sendPinState(50);
  sendPinState(61);
  sendPinState(71);
  sendPinState(80);
  sendPinState(91);
  sendPinState(101);
  sendPinState(110);
  sendPinState(121);
  sendPinState(130);
  sendPinState(141);
  sendPinState(150);
  sendPwmSlide(1, 110);
  sendPwmSlide(2, 120);
  sendPwmSlide(3, 210);
  sendPwmSlide(4, 0);
  sendPwmSlide(5, 0);
  sendPwmSlide(6, 0);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mIHqo/btrSL0e3628/ZWw9bvJSLsoSKHSdatjYyk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mIHqo/btrSL0e3628/ZWw9bvJSLsoSKHSdatjYyk/img.jpg&quot; data-alt=&quot;Screen reflecting initial state and labels when connecting Arduino&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mIHqo/btrSL0e3628/ZWw9bvJSLsoSKHSdatjYyk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmIHqo%2FbtrSL0e3628%2FZWw9bvJSLsoSKHSdatjYyk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;617&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Screen reflecting initial state and labels when connecting Arduino&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text.&lt;/p&gt;
&lt;pre id=&quot;code_1669255828750&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String str) {
  String setVal = &quot;&quot;;
  setVal += char(strHD);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Set to send the date/time of the Android system When connecting, or request the transmission of the date/time if necessary.&lt;/p&gt;
&lt;pre id=&quot;code_1669255895293&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void requstDateTime(){ 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Use when you want to acquire control authority by using the set password for ESP32&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It can be changed to any name through definition of the passName and passNameLen for processing the password in the sketch and the app send datas starting with passName as password value. This is to enhance security.&lt;/p&gt;
&lt;pre id=&quot;code_1670072053635&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define passName F(&quot;PAS:&quot;)
#define passNameLen 0x04

void requestPass(bool val){ 
  String setVal = &quot;&quot;;
  setVal += char(connectHD);
  setVal += char(0x02);
  if (val) {
    setVal += char(passNameLen);
    setVal += passName;
  } else setVal += char(val);
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgag80/btrSIo2P0w4/KfotGEpEPcd8NvtSlCTpm0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgag80/btrSIo2P0w4/KfotGEpEPcd8NvtSlCTpm0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgag80/btrSIo2P0w4/KfotGEpEPcd8NvtSlCTpm0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgag80%2FbtrSIo2P0w4%2FKfotGEpEPcd8NvtSlCTpm0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Response for correct or not through password confirmation&lt;/p&gt;
&lt;pre id=&quot;code_1670072243529&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void responsePass(bool val){ 
  uint8_t setVal[3] = {connectHD, 0x03, val};
  SerialBT.write(setVal, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GGEBr/btrSJYviCzv/QzNGtzGw3kwPKVZtfjqekk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GGEBr/btrSJYviCzv/QzNGtzGw3kwPKVZtfjqekk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GGEBr/btrSJYviCzv/QzNGtzGw3kwPKVZtfjqekk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGGEBr%2FbtrSJYviCzv%2FQzNGtzGw3kwPKVZtfjqekk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;42&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYUjJb/btrSJyKsHBr/2klWlUJBdiI4K095gWfJF0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYUjJb/btrSJyKsHBr/2klWlUJBdiI4K095gWfJF0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYUjJb/btrSJyKsHBr/2klWlUJBdiI4K095gWfJF0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYUjJb%2FbtrSJyKsHBr%2F2klWlUJBdiI4K095gWfJF0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1669256053718&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendMessage(String str) {
  String setVal = &quot;&quot;;
  setVal += char(connectHD);
  setVal += char(0x04);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l2UMd/btrSJnCiLJz/FCU4QsdCblQo7BOM9jtRP0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l2UMd/btrSJnCiLJz/FCU4QsdCblQo7BOM9jtRP0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l2UMd/btrSJnCiLJz/FCU4QsdCblQo7BOM9jtRP0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl2UMd%2FbtrSJnCiLJz%2FFCU4QsdCblQo7BOM9jtRP0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1669256117198&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x05, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9S7HD/btrSJxktk4B/gsmYolJKFyLXeLioREA5S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9S7HD/btrSJxktk4B/gsmYolJKFyLXeLioREA5S1/img.png&quot; data-alt=&quot;Disconnect Button for Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9S7HD/btrSJxktk4B/gsmYolJKFyLXeLioREA5S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9S7HD%2FbtrSJxktk4B%2FgsmYolJKFyLXeLioREA5S1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;83&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button for Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Set the function to continuously transmit the changed value of the SeekBar (slide bar) according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Slide Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Slide Mode&lt;/span&gt; (transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1669256282084&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveSlide(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVGh5N/btrSLJqWCCI/MUnlooj5XHDoalpSxVwNV1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVGh5N/btrSLJqWCCI/MUnlooj5XHDoalpSxVwNV1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVGh5N/btrSLJqWCCI/MUnlooj5XHDoalpSxVwNV1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVGh5N%2FbtrSLJqWCCI%2FMUnlooj5XHDoalpSxVwNV1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;30&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Set transmission interval of ACTIVE SLIDE MODE. (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669256368070&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setSlideInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Activate a timer that sends checkHD(0xF5) at regular time intervals.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Regardless of the app, it is used to reflect independently changed values in the Arduino to the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669256405221&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequest(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_read.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OZKcM/btrSJaQCGaZ/vkIDNsAgwQGCZB0xl1nfTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OZKcM/btrSJaQCGaZ/vkIDNsAgwQGCZB0xl1nfTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OZKcM/btrSJaQCGaZ/vkIDNsAgwQGCZB0xl1nfTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOZKcM%2FbtrSJaQCGaZ%2FvkIDNsAgwQGCZB0xl1nfTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;86&quot; data-filename=&quot;edited_read.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Set the operation interval of the timer sending checkHD(0xF5). (Unit:&lt;span class=&quot;notranslate&quot;&gt; Millisecond&lt;/span&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1669256484919&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequestInterval(uint16_t val){ // val: millis
  uint8_t setVal[4] = {optionHD, 0x04, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pnTJT/btrSHJM8xCx/ogirI7I0AOYJsZhteaacDk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pnTJT/btrSHJM8xCx/ogirI7I0AOYJsZhteaacDk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pnTJT/btrSHJM8xCx/ogirI7I0AOYJsZhteaacDk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpnTJT%2FbtrSHJM8xCx%2FogirI7I0AOYJsZhteaacDk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;26&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1669256510150&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2(other)/3(HC06): show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x05, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Default Pin Number of HC-06 for pairing: 1234 (only 4-Digit number)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eaQ4yf/btrSLZ1xFJH/UNwZxpuCllEbj7SJjK6bK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eaQ4yf/btrSLZ1xFJH/UNwZxpuCllEbj7SJjK6bK1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eaQ4yf/btrSLZ1xFJH/UNwZxpuCllEbj7SJjK6bK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeaQ4yf%2FbtrSLZ1xFJH%2FUNwZxpuCllEbj7SJjK6bK1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Display additional push buttons in the main menu area. (it is possible to control only at Arduino)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOUdFw/btrSJXwnl6V/CI4KdYmj7Lgvkkj6VXPgi0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOUdFw/btrSJXwnl6V/CI4KdYmj7Lgvkkj6VXPgi0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOUdFw/btrSJXwnl6V/CI4KdYmj7Lgvkkj6VXPgi0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOUdFw%2FbtrSJXwnl6V%2FCI4KdYmj7Lgvkkj6VXPgi0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;57&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669256735413&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void showDialogMenu(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x06, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Change the main screen to Color Picker / Pwm Nob screen from Arduino. (generally set in the options of the app)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lAk05/btrSIpOesHR/tgtvaML3F6gbaEQLbXAAwK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lAk05/btrSIpOesHR/tgtvaML3F6gbaEQLbXAAwK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lAk05/btrSIpOesHR/tgtvaML3F6gbaEQLbXAAwK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlAk05%2FbtrSIpOesHR%2FtgtvaML3F6gbaEQLbXAAwK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;71&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uint8_t: list below&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: Display buttons and SeekBar (slide bar) on the main screen&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Display Color_Picker on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Display Color_Picker and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Display PWM Nob on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4: Display PWM Nob and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;String&lt;/span&gt;: name of the group&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;bool&lt;/span&gt;: Sets whether to display the SeekBar (slide bar) when the main screen buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* true&lt;/span&gt;: SeekBar (slide bar) is also displayed when button is displayed or Pwm Nob is displayed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* false&lt;/span&gt;: SeekBar (slide bar) is not displayed when button is displayed and SeekBar (slide bar) is displayed only when Pwm Nob is displayed&lt;/p&gt;
&lt;pre id=&quot;code_1669256810252&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPMain) { 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x07);
  setVal += val; setVal += ','; 
  setVal += group1; setVal += ','; 
  setVal += group2; setVal += ',';
  setVal += pwmDPMain;
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set the main screen display of the app.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set to 0 or 1 in order depending on whether buttons 1 to 15, SeekBar (slide bar) 1 to 6, text input, and floating buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: hidden 1: visible&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3wGAP/btrSHXEupfJ/Uv6e14YRwK0wFTAIm7Mv2k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3wGAP/btrSHXEupfJ/Uv6e14YRwK0wFTAIm7Mv2k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3wGAP/btrSHXEupfJ/Uv6e14YRwK0wFTAIm7Mv2k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3wGAP%2FbtrSHXEupfJ%2FUv6e14YRwK0wFTAIm7Mv2k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;307&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669256874125&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;///////////////////////// SET MAIN DISPLAY
//F(&quot;111111111111111&quot;  // button 1 ~ 15, 0:hide 1:display
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x08);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. Set labels for buttons and SeekBar.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Label buttons 1 to 15 and SeekBar (slide bar) 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bitV0A/btrSJwTqPpy/RgZbtCKtzLOcHA7rFtvppk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bitV0A/btrSJwTqPpy/RgZbtCKtzLOcHA7rFtvppk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bitV0A/btrSJwTqPpy/RgZbtCKtzLOcHA7rFtvppk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbitV0A%2FbtrSJwTqPpy%2FRgZbtCKtzLOcHA7rFtvppk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;286&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669256927333&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;)) // slider 1 ~ 6
void setButtonLabel(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x09);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. Set the button's toggle/push properties.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set the button properties to 0 or 1 in order of buttons 1 to 15.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0: Push&lt;/span&gt;&amp;nbsp;1: Toggle&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mRkd5/btrSJXb5EA3/UZyekviIYLoAIgvKFTEC21/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mRkd5/btrSJXb5EA3/UZyekviIYLoAIgvKFTEC21/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mRkd5/btrSJXb5EA3/UZyekviIYLoAIgvKFTEC21/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmRkd5%2FbtrSJXb5EA3%2FUZyekviIYLoAIgvKFTEC21%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;340&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669256982340&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0A);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21. Set the maximum/minimum values ​​of the SeekBar (slide bar).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SeekBar (slide bar) Specifies the maximum/minimum values ​​from 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG8sMG/btrSKvzImrs/ythp94MyKcTkWbP61TqYL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG8sMG/btrSKvzImrs/ythp94MyKcTkWbP61TqYL0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG8sMG/btrSKvzImrs/ythp94MyKcTkWbP61TqYL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG8sMG%2FbtrSKvzImrs%2Fythp94MyKcTkWbP61TqYL0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;249&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669257049493&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0B);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22. Set the title of the Arduino sketch.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL32JV/btrSI8SMf3x/1UEvTQwVKPn1YuyiPJMgf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL32JV/btrSI8SMf3x/1UEvTQwVKPn1YuyiPJMgf1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL32JV/btrSI8SMf3x/1UEvTQwVKPn1YuyiPJMgf1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL32JV%2FbtrSI8SMf3x%2F1UEvTQwVKPn1YuyiPJMgf1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;27&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669257103980&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//title: Test Mode
//text: Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;
void setAppTitleMessage(String title, String text){
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0C);
  setVal += title; setVal += ','; 
  setVal += text; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm0ylt/btrSIQZasa9/quR3bYVtoHIqpUv2IvgVyK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm0ylt/btrSIQZasa9/quR3bYVtoHIqpUv2IvgVyK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm0ylt/btrSIQZasa9/quR3bYVtoHIqpUv2IvgVyK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm0ylt%2FbtrSIQZasa9%2FquR3bYVtoHIqpUv2IvgVyK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;489&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;23. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1669257991924&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;RAD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; setVal += ':';
  setVal += String(selection);
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bw8rU/btrSIPTtIRU/Mx9vRocY4bEkkQf55impsK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bw8rU/btrSIPTtIRU/Mx9vRocY4bEkkQf55impsK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bw8rU/btrSIPTtIRU/Mx9vRocY4bEkkQf55impsK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBw8rU%2FbtrSIPTtIRU%2FMx9vRocY4bEkkQf55impsK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;426&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;24. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669258030003&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;CKB:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xlZw3/btrSIS3DaYQ/pUvYvMS1WqKal5EKpOrWck/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xlZw3/btrSIS3DaYQ/pUvYvMS1WqKal5EKpOrWck/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xlZw3/btrSIS3DaYQ/pUvYvMS1WqKal5EKpOrWck/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxlZw3%2FbtrSIS3DaYQ%2FpUvYvMS1WqKal5EKpOrWck%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;25. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1669258066491&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;CHD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += message; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGx1mh/btrSJEKCqC2/yA0kve6ejP8zRh69NbnGC0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGx1mh/btrSJEKCqC2/yA0kve6ejP8zRh69NbnGC0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGx1mh/btrSJEKCqC2/yA0kve6ejP8zRh69NbnGC0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGx1mh%2FbtrSJEKCqC2%2FyA0kve6ejP8zRh69NbnGC0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;26. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1669258104291&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;LSD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQlx1E/btrSJEDP228/EKDrzJhfiWKnDxAKLYjzk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQlx1E/btrSJEDP228/EKDrzJhfiWKnDxAKLYjzk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQlx1E/btrSJEDP228/EKDrzJhfiWKnDxAKLYjzk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQlx1E%2FbtrSJEDP228%2FEKDrzJhfiWKnDxAKLYjzk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;294&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;27. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1669258157699&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;STR:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bikxL5/btrSIQky8qu/qkKlT6ZcpMgvVc4FGEfASK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bikxL5/btrSIQky8qu/qkKlT6ZcpMgvVc4FGEfASK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bikxL5/btrSIQky8qu/qkKlT6ZcpMgvVc4FGEfASK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbikxL5%2FbtrSIQky8qu%2FqkKlT6ZcpMgvVc4FGEfASK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_HMI_BT_CONTROL.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b5WXjd/btrSKQwZQPU/zNRz5xfbwMdTXQkYzXSbek/ESP32_HMI_BT_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_HMI_BT_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/ulUCQJO-uCU&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/ulUCQJO-uCU&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/ulUCQJO-uCU&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1670147248742&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;BluetoothSerial.h&quot;
BluetoothSerial SerialBT;

#define btName F(&quot;ESP32blue&quot;)

void BTConfirmRequestCallback(uint32_t numVal){
  SerialBT.confirmReply(true);
}

#include &quot;protocol.h&quot;

void setup() {
  Serial.begin(115200);
  SerialBT.enableSSP();
  SerialBT.onConfirmRequest(BTConfirmRequestCallback);
  SerialBT.begin(btName); //Bluetooth device name
  Serial.println(F(&quot;Bluetooth 2.0&quot;));
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(F(&quot;button 1 : on&quot;));
               sendPinEcho(value);
               sendText(F(&quot;1: ON&quot;)); 
                  break;
      case 10: Serial.println(F(&quot;button 1 : off&quot;));
               sendText(F(&quot;1: OFF&quot;)); 
               sendPinEcho(value);
                  break;
      case 21: Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 51: Serial.println(F(&quot;button 5 : on&quot;));
                  break;
      case 50: Serial.println(F(&quot;button 5 : off&quot;));
                  break;
      case 61: Serial.println(F(&quot;button 6 : on&quot;));
                  break;
      case 60: Serial.println(F(&quot;button 6 : off&quot;));
                  break;
      case 71: Serial.println(F(&quot;button 7 : on&quot;));
                  break;
      case 70: Serial.println(F(&quot;button 7 : off&quot;));
                  break;
      case 81: Serial.println(F(&quot;button 8 : on&quot;));
                  break;
      case 80: Serial.println(F(&quot;button 8 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(F(&quot;button 10 : on&quot;));
                  break;
      case 100: Serial.println(F(&quot;button 10 : off&quot;));
                  break;  
      case 111: Serial.println(F(&quot;button 11 : on&quot;));
                  break;
      case 110: Serial.println(F(&quot;button 11 : off&quot;));
                  break;  
      case 121: Serial.println(F(&quot;button 12 : on&quot;));
                  break;
      case 120: Serial.println(F(&quot;button 12 : off&quot;));
                  break;                  
      case 131: Serial.println(F(&quot;button 13 : on&quot;));
                  break;  
      case 130: Serial.println(F(&quot;button 13 : off&quot;));
                  break;  
      case 141: Serial.println(F(&quot;button 14 : on&quot;));
                  break;  
      case 140: Serial.println(F(&quot;button 14 : off&quot;));
                  break;  
      case 151: Serial.println(F(&quot;button 15 : on&quot;));
                  break;  
      case 150: Serial.println(F(&quot;button 15 : off&quot;));
                  break;         
      case 161: Serial.println(F(&quot;button 16 : click&quot;));
                  break; 
      case 171: Serial.println(F(&quot;button 17 : click&quot;));
                  break;
      case 181: Serial.println(F(&quot;button 18 : click&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : click&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : click&quot;));
                  break;                       
    }
  }
}

void pwm_control(uint8_t num, uint16_t value) {
  if (num == 1) {  // SeekBar (slide bar) 1
    send_pwm_echo(num, value);
    Serial.print(F(&quot;pwm1: &quot;)); Serial.println(value);
  } else if (num == 2) { // SeekBar (slide bar) 2
    send_pwm_echo(num, value);
    Serial.print(F(&quot;pwm2: &quot;)); Serial.println(value);
  } else if (num == 3) {  // SeekBar (slide bar) 3
    send_pwm_echo(num, value);
    Serial.print(F(&quot;pwm3: &quot;)); Serial.println(value);
  } else if (num == 4) {  // SeekBar (slide bar) 4
    Serial.print(F(&quot;pwm4: &quot;)); Serial.println(value);
  } else if (num == 5) {  // SeekBar (slide bar) 5
    Serial.print(F(&quot;pwm5: &quot;)); Serial.println(value);
  } else if (num == 6) {  // SeekBar (slide bar) 6
    Serial.print(F(&quot;pwm6: &quot;)); Serial.println(value);
  }
}

bool appConnection = false;
uint8_t Data[5] = {0, 0, 0, 0, 0};

void SerialBT_read() {
  if (SerialBT.available()) { 
    if (appConnection) {
      if (SerialBT.peek() == pwmHD) { // 0xF3
        while (SerialBT.peek() == pwmHD) {
          SerialBT.readBytes(Data, 5);
          if (Data[4] == footHD) {
            uint16_t value = Data[3];
            value = value &amp;lt;&amp;lt; 8 | Data[2];
            pwm_control(Data[1], value);
            Data[4] = 0;
          }
        }
        if (pwmEcho) { sendPwmEcho(); pwmEcho = 0; }
      } else if (SerialBT.peek() == pinHD) {  // 0xF0
        SerialBT.readBytes(Data, 3);
        if (Data[2] == footHD) {
          pin_control(Data[1]); Data[2] = 0;
        }
      } else {
        uint8_t dump;
        if (SerialBT.peek() == checkHD) { dump = SerialBT.read(); dataSend = true; }
        else if (SerialBT.peek() == optionHD || SerialBT.peek() == connectHD) { 
          dump = SerialBT.read();
          String temp = SerialBT.readStringUntil('\n');
          if (dump == connectHD) {
            if (temp == F(&quot;connect&quot;)) { iniSet(); send_State(); }
            else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; SerialBT.flush(); }
            else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); } 
            else Serial.println(temp);
          } else CheckF9(temp); 
        } else {
          dump = SerialBT.read();
          Serial.write(dump);
        }
      }
      if (dataSend) { SerialBT.write(checkHD); dataSend = false; }
    } else {
      if (SerialBT.peek() == connectHD) appConnection = true;
      else SerialBT.disconnect();
    }
  } 
}

void loop() {
  SerialBT_read();
  if(Serial.available()) { // if there is data in the serial buffer
    String temp = Serial.readStringUntil('\n'); // option of serial monitor: NEW LINE
    Serial.println(temp);
    if(temp == &quot;on&quot;){   // input serial monitor: &quot;on&quot;
      Serial.println(&quot;LED ON&quot;);
      sendPinState(11); // button state of the app: on
      sendText(&quot;LED ON&quot;);
      send_pwm_echo(1, 150);
    } else if(temp == &quot;off&quot;){ // input serial monitor: &quot;off&quot;
      Serial.println(&quot;LED OFF&quot;);
      send_pwm_echo(1, 150);
      sendPinEcho(10); // button echo: off
      sendText(&quot;LED OFF&quot;);
    } else if(temp == &quot;1&quot;){   
      
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1670618600371&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD 0xF0
#define pwmHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define optionHD 0xF9
#define checkHD 0xF5

bool dataSend = false;

void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}

void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}

void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {
  uint8_t pwm[5] = {pwmHD, slide, pwm_val, pwm_val &amp;gt;&amp;gt; 8, footHD};
  SerialBT.write(pwm, 5);
  dataSend = true;
}

uint8_t pwmEcho = 0;
uint8_t ecVal[18] = { 0, };

void send_pwm_echo(uint8_t slide, uint16_t pwm_val) {
  if (pwmEcho &amp;gt; 5) pwmEcho = 0;
  ecVal[pwmEcho*3] = slide; 
  ecVal[(pwmEcho*3)+1] = pwm_val;
  ecVal[(pwmEcho*3)+2] = pwm_val &amp;gt;&amp;gt; 8;
  pwmEcho++;
}

void sendPwmEcho() {
  uint8_t ch = 0;
  while (pwmEcho) {
    pwmEcho--;
    uint8_t pwm[5] = {pwmHD, ecVal[ch*3], ecVal[(ch*3)+1], ecVal[(ch*3)+2], echoHD};
    SerialBT.write(pwm, 5); ch++;
  }
  dataSend = true;
}

void sendText(String str) {
  String setVal = &quot;&quot;;
  setVal += char(strHD);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////////////////////// CONNECTION 
void requstDateTime(){ 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}

//#define passName F(&quot;PAS:&quot;)
//#define passNameLen 0x04
//
//void requestPass(bool val){ 
//  String setVal = &quot;&quot;;
//  setVal += char(connectHD);
//  setVal += char(0x02);
//  if (val) {
//    setVal += char(passNameLen);
//    setVal += passName;
//  } else setVal += char(val);
//  SerialBT.print(setVal);
//  dataSend = true;
//}
//
//void responsePass(bool val){ 
//  uint8_t setVal[3] = {connectHD, 0x03, val};
//  SerialBT.write(setVal, 3);
//  dataSend = true;
//}

void sendMessage(String str) {
  String setVal = &quot;&quot;;
  setVal += char(connectHD);
  setVal += char(0x04);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}

void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x05, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveSlide(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// SEND SLIDE GET VALUE INTERVAL
void setSlideInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setRequest(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setRequestInterval(uint16_t val){ // val: millis
  uint8_t setVal[4] = {optionHD, 0x04, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// 0: not use, 1: show only name, 2: show name &amp;amp; pass // defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x05, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void showDialogMenu(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x06, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPMain) { 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x07);
  setVal += val; setVal += ','; 
  setVal += group1; setVal += ','; 
  setVal += group2; setVal += ',';
  setVal += pwmDPMain;
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////// SET MAIN DISPLAY
//F(&quot;111111111111111&quot;  // button 1 ~ 15, 0:hide 1:display
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x08);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;)) // slider 1 ~ 6
void setButtonLabel(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x09);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0A);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0B);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

void setAppTitleMessage(String title, String text){
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0C);
  setVal += title; setVal += ','; 
  setVal += text; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;RAD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; setVal += ':';
  setVal += String(selection);
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;CKB:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;CHD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += message; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;LSD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;STR:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  setActiveSlide(true); setSlideInterval(100);
  setRequest(false); //setRequestInterval(250);
}

// SEND LOCAL STATE AT PRESENT TO APP
void send_State() { // current state
  sendPinState(10);
  sendPinState(21);
  sendPinState(30);
  sendPinState(41);
  sendPinState(50);
  sendPinState(61);
  sendPinState(71);
  sendPinState(80);
  sendPinState(91);
  sendPinState(101);
  sendPinState(110);
  sendPinState(121);
  sendPinState(130);
  sendPinState(141);
  sendPinState(150);
  sendPwmSlide(1, 110);
  sendPwmSlide(2, 120);
  sendPwmSlide(3, 210);
  sendPwmSlide(4, 0);
  sendPwmSlide(5, 0);
  sendPwmSlide(6, 0);
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
  else {  
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUCON app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUCON app settings: label/toggle properties, use of the timer for checkHD(0xF5), Slide Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1670147747313&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  setDisplay(F(&quot;111111111111111&quot; // button 1 ~ 15, 0:hide 1:display
               &quot;111111&quot;          // slider 1 ~ 6
               &quot;11&quot;));           // Text Input/Floating Button
  setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); // Set Color Picker and Pwm Nob
  setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,&quot; // set labels
                   &quot;BT12,BT13,BT14,BT15,PW1,PW2,PW3,PW4,PW5,PW6&quot;));
  setButtonToggle(F(&quot;111111111111111&quot;)); // button 1 ~ 15, toggle setting, 0:push 1:toggle
  setMinMax(F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)); // slider 1 ~ 6
  setAppTitleMessage(F(&quot;Test Mode&quot;), // Change title for Arduino code on the app
  F(&quot;Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&quot; //Message
    &quot;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;&quot;
    &quot;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;&quot;));
  setActiveSlide(true); setSlideInterval(100); // Active Slide Mode
  setRequest(false); //setRequestInterval(250); // Disable timer for check(0xF5)
  setSSIDLabelMode(0);   // Set the function of the label displaying Wi-Fi connection
  showDialogMenu(true);  // show menu button
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the screen number (pageId).&lt;/p&gt;
&lt;pre id=&quot;code_1670147797987&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (pageId == 4) Serial.println(F(&quot;powor : on&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;));
                  break;
      case 10: if (pageId == 4) Serial.println(F(&quot;powor : off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (pageId == 4) { 
                 Serial.println(F(&quot;motor1 : on&quot;)); 
                 sendPinState(30); 
               } else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (pageId == 4) Serial.println(F(&quot;motor1 : off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (pageId == 4) { 
                 Serial.println(F(&quot;motor2 : on&quot;)); 
                 sendPinState(20); 
               } else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (pageId == 4) Serial.println(F(&quot;motor2 : off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 201: Serial.println(F(&quot;button 20 : click&quot;));
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,Dial_Nob,Color_Picker,Key_Pad,Arrow_Pad,Main&quot;)); // dialog message
                  break;              
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1670147829425&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t pageId = 0;  // screen number

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }         // radio button
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }    // Checkbox
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }    // Select button
  else if (temp.startsWith(F(&quot;LSD&quot;))) {       // List Window
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;Dial&quot;))) {           // Dial Nob screen 
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(4, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 1; 
      } else if (temp.startsWith(F(&quot;Color&quot;))) {   // Color Picker screen
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(2, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 2; 
      } else if (temp.startsWith(F(&quot;Key&quot;))) {     // Key Pad screen
        if (pageId &amp;lt;= 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111111111100011111110&quot;)); 
        setButtonToggle(F(&quot;000000000000111&quot;));
        setButtonLabel(F(&quot;1,2,3,4,5,6,7,8,9,*,0,#&quot;));
        pageId = 3;
      } else if (temp.startsWith(F(&quot;Arrow&quot;))) {   // Arrow Pad screen
        if (pageId &amp;lt;= 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111101010101011111110&quot;)); 
        setButtonToggle(F(&quot;111111000000000&quot;));
        setButtonLabel(F(&quot;Power,Motor1,Moror2,BT4,BT5,BT6,7,Up,9,Left,0,Right,0,Down&quot;));
        pageId = 4;
      } else {                                    // Main screen
        if (pageId &amp;lt;= 2) { setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 0; }
        setDisplay(F(&quot;11111111111111111111111&quot;));
        setButtonToggle(F(&quot;111111111111111&quot;));
        setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15&quot;));
        send_State();
        pageId = 0;
      }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }       // Input text
  else {  
    if (temp.length() &amp;lt; 6) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_HMI_BT_CONTROL_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/yfaTB/btrSQUS61rf/PYjOllVfWcweddiUkKVFI1/ESP32_HMI_BT_CONTROL_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_HMI_BT_CONTROL_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/Z9v0o6_XbeI&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/Z9v0o6_XbeI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Z9v0o6_XbeI&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Change name for the bluetooth of ESP32 on ADUCON App&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SlXZ3/btrSN00sWCv/hqmT9FGar8Sk8PfAKly3Hk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SlXZ3/btrSN00sWCv/hqmT9FGar8Sk8PfAKly3Hk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SlXZ3/btrSN00sWCv/hqmT9FGar8Sk8PfAKly3Hk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSlXZ3%2FbtrSN00sWCv%2FhqmT9FGar8Sk8PfAKly3Hk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nNg1Q/btrSJE5iyc8/CKTDVQZFuI8bZVQNRENpfK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nNg1Q/btrSJE5iyc8/CKTDVQZFuI8bZVQNRENpfK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nNg1Q/btrSJE5iyc8/CKTDVQZFuI8bZVQNRENpfK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnNg1Q%2FbtrSJE5iyc8%2FCKTDVQZFuI8bZVQNRENpfK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;121&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save the name for the bluetooth of ESP32.&lt;/p&gt;
&lt;pre id=&quot;code_1670148172954&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char btName[11] = &quot;ESP32blue&quot;;  // 10 char&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SPIFFS Setting&lt;/p&gt;
&lt;pre id=&quot;code_1670148420220&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &quot;SPIFFS.h&quot;  // ESP32 SPIFSPIFFS LIBRARY

bool saveConfig() {   // Write NAME
  String value = btName;
  Serial.println(value);
  File configFile = SPIFFS.open(F(&quot;/config.txt&quot;), &quot;w&quot;);
  if (!configFile) {
    Serial.println(F(&quot;Failed to open config file for writing&quot;));
    return false;
  } else {
    configFile.println(value); // save at config.txt including '\n'
    configFile.close();
    return true;
  }
}

bool loadConfig() { // Read NAME
  File configFile = SPIFFS.open(F(&quot;/config.txt&quot;), &quot;r&quot;);
  if (!configFile) {
    Serial.println(F(&quot;Failed to open config file&quot;));
    return false;
  } else {
    String temp = configFile.readStringUntil('\r');
    for (int i = 0; i &amp;lt; temp.length(); i++) btName[i] = temp[i];
    btName[temp.length()] = '\0';
    configFile.close();
    Serial.println(btName);
    return true;
  }
}

void setup() {
    if (SPIFFS.exists(F(&quot;/config.txt&quot;))) loadConfig(); // if there is &quot;/config.txt&quot;, read
    else saveConfig();  // if there is not, save a new config.txt 
}

// SPIFFS initialization code at serial monitor
void loop() {
  if(Serial.available()) { // Serial monitor
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if(temp == &quot;1&quot;){   
      Serial.println(F(&quot;format...&quot;));
      SPIFFS.format();
      Serial.println(F(&quot;done. can start upload.&quot;));
      while(1); // stanby for uploading
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Save parsing data for name and remove the data for password and send a message applyed in Arduino.&lt;/p&gt;
&lt;pre id=&quot;code_1670148752086&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void changeBTname(String str) { 
  bool save = false; 
  String temp = str.substring(0, 1);
  bool delPass = temp.toInt(); // if true, there is data for password which is not used in this sketch 
  str.remove(0, 1);
  if (delPass) str.remove(0, 6); // remove pass
  if (str != btName) {
    if (temp != &quot;&quot;) {
      for (int i = 0; i &amp;lt; str.length(); i++) btName[i] = str[i];
      btName[str.length()] = '\0';
      save = true; 
    }
  }
  if (save) {
    saveConfig();
    temp  = F(&quot;&amp;lt;p&amp;gt;NAME:  &quot;);
    temp += btName;
    temp += F(&quot;&amp;lt;/p&amp;gt;Value's Saved.&quot;);
    if (delPass) temp += F(&quot;&amp;lt;br/&amp;gt;Function of Set pass is not provided.&amp;lt;br/&amp;gt;&quot;);
    temp += F(&quot; The module will reboot.&amp;lt;br/&amp;gt;try to reconnect.&quot;);
    sendMessage(temp);
    sendDisconnect(); delay(500); ESP.restart();
  } else {
    temp  = F(&quot;There's no change.&quot;);
    if (delPass) temp += F(&quot;&amp;lt;br/&amp;gt;Function of Set pass is not provided.&quot;);
    sendMessage(temp);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_HMI_BT_CONTROL_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/GyuMZ/btrSJDL4QUb/yAJl5ZcpXCfwKvw2uWcLKk/ESP32_HMI_BT_CONTROL_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_HMI_BT_CONTROL_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SPIFFS_FORMAT_ESP32.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/co3i8R/btrSJYvQWV1/U7cPZL3kSV8EYqShWK8y2K/SPIFFS_FORMAT_ESP32.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;SPIFFS_FORMAT_ESP32.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/WZXhC2Xho9g&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/WZXhC2Xho9g&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/WZXhC2Xho9g&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Login&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Obtain control authority using the password for bluetooth of ESP32.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5IPmE/btrSOxqmcvw/gucbigejwNAkg85OyJKIE0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5IPmE/btrSOxqmcvw/gucbigejwNAkg85OyJKIE0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5IPmE/btrSOxqmcvw/gucbigejwNAkg85OyJKIE0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5IPmE%2FbtrSOxqmcvw%2FgucbigejwNAkg85OyJKIE0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/17AbR/btrSKt3oAbr/jW7Nzyb0KSbpUKJ8aHTctK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/17AbR/btrSKt3oAbr/jW7Nzyb0KSbpUKJ8aHTctK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/17AbR/btrSKt3oAbr/jW7Nzyb0KSbpUKJ8aHTctK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F17AbR%2FbtrSKt3oAbr%2FjW7Nzyb0KSbpUKJ8aHTctK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;42&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save the name for the bluetooth of ESP32 and the set password for login.&lt;/p&gt;
&lt;pre id=&quot;code_1670149121093&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char pass[7] = &quot;123456&quot;;        // 6 char
char btName[11] = &quot;ESP32blue&quot;;  // 10 char&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Password handling code: response message, input prohibition setting, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1670149264242&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define passWaitTime 120000
#define banResetTime 600000
unsigned long int disconnectTime = 0;

void banReset() { // if wrong password is entered 5 times, banned inputting for banResetTime
  if (millis() - disconnectTime &amp;gt; banResetTime) passAllow = 5; 
}

void passTerminate() { // if there's no input a pass within passWaitTime, terminate the connection
  if (millis() - disconnectTime &amp;gt; passWaitTime) { // 2min
    waitPass = false; appConnection = false; 
    sendMessage(F(&quot;It's disconnected by time expires.&amp;lt;br/&amp;gt;Try to reconnect.&quot;));
    sendDisconnect(); 
  }
}

void CheckF8(String temp) {
  if (temp == &quot;&quot;) {
    uint8_t dump = SerialBT.read();
    if (dump == connectHD &amp;amp;&amp;amp; passAllow) {
      temp = SerialBT.readStringUntil('\n');
      Serial.println(temp);
      if (waitPass) { 
        if (temp.startsWith(passName)) {
          temp.remove(0, passNameLen); bool ok = true;
          if (temp.length() == 6) {
            for (int i = 0; i &amp;lt; 6; i++) { if (temp[i] != pass[i]) { ok = false; break; } }
          }
          if (ok) { passOK = true; waitPass = false; iniSet(); send_State(); }
          else { passAllow--; disconnectTime = millis(); } // wrong password &amp;amp; timer set
          if (!passAllow) { // if wrong password is entered 5 times
            waitPass = false; appConnection = false; 
            sendMessage(F(&quot;You've got wrong password 5 times.&amp;lt;br/&amp;gt;Try to reconnect 10 Min later.&quot;));
            sendDisconnect(); 
          } else responsePass(ok);
        } else if (temp == F(&quot;connect&quot;)) { requestPass(usePass); disconnectTime = millis(); } // request pass &amp;amp; timer set
        else if (temp == F(&quot;disconnect&quot;)) { waitPass = false; appConnection = false; SerialBT.flush();}  
      } else {
        if (temp == F(&quot;connect&quot;)) {
          appConnection = true; 
          if (usePass) { requestPass(true); waitPass = true; disconnectTime = millis(); } 
          else { iniSet(); send_State(); }
        } 
      }
    } else if (dump == checkHD) {  }
    else SerialBT.disconnect();
  } else {
    Serial.println(temp);
    if (temp == F(&quot;disconnect&quot;)) { appConnection = false; passOK = false; SerialBT.flush();}
    else if (temp.startsWith(F(&quot;NA&quot;))) { temp.remove(0, 2); changeBTname(temp); }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_HMI_BT_CONTROL_PASS.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/c3hvlJ/btrSL1eoOmi/I4WAt6VIPYbV5TlIVNpn7K/ESP32_HMI_BT_CONTROL_PASS.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_HMI_BT_CONTROL_PASS.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/Pv1Y-xQV3qw&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/Pv1Y-xQV3qw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Pv1Y-xQV3qw&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ADUCON - Arduino wireless remote control application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUCON</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/193</guid>
      <comments>https://postpop.tistory.com/193#entry193comment</comments>
      <pubDate>Sat, 3 Dec 2022 20:46:01 +0900</pubDate>
    </item>
    <item>
      <title>ESP32/NodeMcu WiFi remote control with ADUPAD</title>
      <link>https://postpop.tistory.com/192</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/190&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - ESP32/NodeMcu Basic code for WiFi remote contol&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUPAD application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u7bGC/btrSIRcyK0C/jYsx93skoldKVhHhoXkx40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u7bGC/btrSIRcyK0C/jYsx93skoldKVhHhoXkx40/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u7bGC/btrSIRcyK0C/jYsx93skoldKVhHhoXkx40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu7bGC%2FbtrSIRcyK0C%2FjYsx93skoldKVhHhoXkx40%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;868&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Modify the HTTP response code in loop() function according to the protocol for &quot;TEXT&quot; set in the ADUPAD app.&lt;/p&gt;
&lt;pre id=&quot;code_1670055434339&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void loop() {
  client = server.available(); // Whether the server has data to receive and set now client
  String temp = &quot;&quot;;
  while (client.connected()) { // Enter an infinite loop first to prevent re-execution of &quot;client = server.available();&quot;
    if(client.available()) {   // If the client has data
      temp = client.readStringUntil('\r'); 
      Serial.println(temp);
      if (temp.startsWith(F(&quot;GET&quot;))) { // message for response
        Data  = &quot;%%F4&quot;;                // protocol header of text for ADUPAD
        Data += &quot;Hello World &quot;;
        Data += random(100,200);
        Data += &quot;%%F1&quot;;                // protocol footer of text for ADUPAD
        Data += '\n';                  // termination character of wifi for ADUPAD
        Serial.println(Data);          // Output the message to the serial monitor.
        http_response(); 
        break;
      }
    } else break;
  }
  delay(10); // time for sending data at wifi component of ESP32 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_WIFI_BASIC_CONTROL.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/l6MVl/btrSJFvPyid/RQp4iTMflGVQuTnP6wPQBK/ESP32_WIFI_BASIC_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_WIFI_BASIC_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP8266_WIFI_BASIC_CONTROL.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ma0N8/btrSKuAEyje/Dkl2UbLJx8Kt2kiHe25eD0/ESP8266_WIFI_BASIC_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP8266_WIFI_BASIC_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ESP32_WIFI_BASIC_CONTROL.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;esp32basicAdupad.jpg&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LDnfq/btrSIRjkQf2/oHGi7HA2o6CgzLHnmreWW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LDnfq/btrSIRjkQf2/oHGi7HA2o6CgzLHnmreWW1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LDnfq/btrSIRjkQf2/oHGi7HA2o6CgzLHnmreWW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLDnfq%2FbtrSIRjkQf2%2FoHGi7HA2o6CgzLHnmreWW1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;445&quot; data-filename=&quot;esp32basicAdupad.jpg&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting to the assigned IP while ESP32 is connected to the router&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the assigned IP address &quot;192.168.1.7&quot; on ADUPAD app connected to network of &quot;skynet&quot;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputAddressADUPAD1.jpg&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eAloQw/btrSHWk0KMk/jvA6jQQbIUjbOoiwfqtJkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eAloQw/btrSHWk0KMk/jvA6jQQbIUjbOoiwfqtJkk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eAloQw/btrSHWk0KMk/jvA6jQQbIUjbOoiwfqtJkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeAloQw%2FbtrSHWk0KMk%2FjvA6jQQbIUjbOoiwfqtJkk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;42&quot; data-filename=&quot;inputAddressADUPAD1.jpg&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;esp32basicAdupadconnect.jpg&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ezy8tE/btrSJxEFd8r/DXMVirqwASvjdpO56Rdcy0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ezy8tE/btrSJxEFd8r/DXMVirqwASvjdpO56Rdcy0/img.jpg&quot; data-alt=&quot;received data of &amp;quot;%%F5&amp;quot; and &amp;quot;%%F8connect&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ezy8tE/btrSJxEFd8r/DXMVirqwASvjdpO56Rdcy0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fezy8tE%2FbtrSJxEFd8r%2FDXMVirqwASvjdpO56Rdcy0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;445&quot; data-filename=&quot;esp32basicAdupadconnect.jpg&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;%%F5&quot; and &quot;%%F8connect&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseESP32ADUPAD.jpg&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ouxjO/btrSKvTSglw/A97FxssQkf0xtEoajSG6qk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ouxjO/btrSKvTSglw/A97FxssQkf0xtEoajSG6qk/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ouxjO/btrSKvTSglw/A97FxssQkf0xtEoajSG6qk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FouxjO%2FbtrSKvTSglw%2FA97FxssQkf0xtEoajSG6qk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;270&quot; height=&quot;96&quot; data-filename=&quot;responseESP32ADUPAD.jpg&quot; data-origin-width=&quot;270&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP32&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting directly to the ESP32 and then connecting the access point&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Connect to ESP32 on the WiFi Setting of a mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectToESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x9gNp/btrSJDLyRXP/6bdL78K3a7z3kyKM0yCav1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x9gNp/btrSJDLyRXP/6bdL78K3a7z3kyKM0yCav1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x9gNp/btrSJDLyRXP/6bdL78K3a7z3kyKM0yCav1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx9gNp%2FbtrSJDLyRXP%2F6bdL78K3a7z3kyKM0yCav1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;297&quot; data-filename=&quot;connectToESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the Password for the ACCESS POINT of ESP32.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputPasswordESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnXhfG/btrSIsxeopZ/VbIYAMUJSw11A6f9doJps0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnXhfG/btrSIsxeopZ/VbIYAMUJSw11A6f9doJps0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnXhfG/btrSIsxeopZ/VbIYAMUJSw11A6f9doJps0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnXhfG%2FbtrSIsxeopZ%2FVbIYAMUJSw11A6f9doJps0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;313&quot; data-filename=&quot;inputPasswordESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Select &quot;Keep WiFi on&quot; if the message output below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E0oFy/btrSLI6wX8j/nULxULM9nCl3Zax8DAEL40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E0oFy/btrSLI6wX8j/nULxULM9nCl3Zax8DAEL40/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E0oFy/btrSLI6wX8j/nULxULM9nCl3Zax8DAEL40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE0oFy%2FbtrSLI6wX8j%2FnULxULM9nCl3Zax8DAEL40%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;288&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the address &quot;192.168.4.1&quot; on ADUPAD app connected to ESP32.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputAddressADUPAD.jpg&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7jZIb/btrSHXxuV7H/p9NsLjgizxGtMdBQxTgpI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7jZIb/btrSHXxuV7H/p9NsLjgizxGtMdBQxTgpI1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7jZIb/btrSHXxuV7H/p9NsLjgizxGtMdBQxTgpI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7jZIb%2FbtrSHXxuV7H%2Fp9NsLjgizxGtMdBQxTgpI1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;42&quot; data-filename=&quot;inputAddressADUPAD.jpg&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;esp32basicAdupadconnect2.jpg&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCRLG6/btrSITnRrlm/fWxFVVFjhusBQMBvVKTCgK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCRLG6/btrSITnRrlm/fWxFVVFjhusBQMBvVKTCgK/img.jpg&quot; data-alt=&quot;received data of &amp;quot;%%F5&amp;quot; and &amp;quot;%%F8connect&amp;quot; and&amp;amp;amp;nbsp;&amp;quot;%%F5&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCRLG6/btrSITnRrlm/fWxFVVFjhusBQMBvVKTCgK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCRLG6%2FbtrSITnRrlm%2FfWxFVVFjhusBQMBvVKTCgK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;445&quot; data-filename=&quot;esp32basicAdupadconnect2.jpg&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;%%F5&quot; and &quot;%%F8connect&quot; and&amp;amp;nbsp;&quot;%%F5&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseESP32ADUPAD2.jpg&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cA4hEE/btrSM4alECI/59jTjhYF64qDXpjOL5r5C0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cA4hEE/btrSM4alECI/59jTjhYF64qDXpjOL5r5C0/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cA4hEE/btrSM4alECI/59jTjhYF64qDXpjOL5r5C0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcA4hEE%2FbtrSM4alECI%2F59jTjhYF64qDXpjOL5r5C0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;269&quot; height=&quot;96&quot; data-filename=&quot;responseESP32ADUPAD2.jpg&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP32&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with WiFi of ADUPAD applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- wifi_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8VWe0/btrSJXwfIKK/JrvyztdhLAu65Xjoa6GPT0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8VWe0/btrSJXwfIKK/JrvyztdhLAu65Xjoa6GPT0/img.jpg&quot; data-alt=&quot;ADUPAD app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8VWe0/btrSJXwfIKK/JrvyztdhLAu65Xjoa6GPT0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8VWe0%2FbtrSJXwfIKK%2FJrvyztdhLAu65Xjoa6GPT0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;226&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUPAD app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for WiFi in the Arduino sketch according to the protocol header settings in the ADUPAD app.&lt;/p&gt;
&lt;pre id=&quot;code_1669016761552&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD F(&quot;%%F0&quot;)
#define joyHD F(&quot;%%F3&quot;)
#define strHD F(&quot;%%F4&quot;)
#define footHD F(&quot;%%F1&quot;)
#define echoHD F(&quot;%%E1&quot;)
#define connectHD F(&quot;%%F8&quot;)
#define optionHD F(&quot;%%F9&quot;)
#define checkHD F(&quot;%%F5&quot;)
#define HDLen 4
#define addHD F(&quot;%%&quot;)
#define addHDLen 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUPAD app&lt;/p&gt;
&lt;pre id=&quot;code_1669016974126&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

if (appConnection) { // If app connection is confirmed
  // Execute code after app connection is confirmed
} else { // Before app connection check
  if (income_wifi == checkHD) { // Check if the value is %%F5 and set the initial settings
    appConnection = true; http_response(); // Confirm the connection of ADUPAD
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHD(%%F8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + connect&lt;/span&gt;: Transmit the necessary app settings and current Arduino state values through the iniSet() and sendState() functions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + WiFi&lt;/span&gt;: change WiFi setting values&lt;/p&gt;
&lt;pre id=&quot;code_1669080716263&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (income_wifi == F(&quot;connect&quot;)) iniSet();
else if (income_wifi == F(&quot;disconnect&quot;)) appConnection = false;  
else if (income_wifi.startsWith(F(&quot;WiFi&quot;))) { 
  sendMessage(F(&quot;This funtion is not available.&quot;)); 
} else Serial.println(income_wifi);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHD(%%F9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669080758486&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(%%F0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669080982615&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// income_wifi: %%F0 + Value + %%F1
while(income_wifi.indexOf(pinHD) != -1) { // need while function depend on left arrow pad mode 
  income_wifi.remove(0, 4); // remove %%F0
  ed = income_wifi.indexOf(footHD); // check the index number where footHD(%%F1)
  if (ed != -1) {                   // if the index number is found in the value
    temp = income_wifi.substring(0, ed); //Extract data up to index number
    uint8_t value = temp.toInt();   // convert to numeric value
    income_wifi.remove(0, ed+4);    // remove got data
    pin_control(value);             // execute the code corresponding to the value
  } else break;                     // exit while loop if there's no %%F0
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;pwmHD(%%F3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669081447582&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// income_wifi: id + Count + %% + Heading + %% + Strength + %%F1 (with protocol header %%F3 removed)
temp = income_wifi.substring(0, 1);
uint8_t id = temp.toInt(); // id: 0 or 1 or 2
income_wifi.remove(0, 1);  // remove id
ed = income_wifi.indexOf(addHD);      // index for %%
temp = income_wifi.substring(0, ed);  // extract count
uint16_t count = temp.toInt();        // convert to numeric value
bool ok = true;
if (id == 0) {                        // 0: left Joystic
  if (count == 0) leftCount = 0;      // reset leftCount
  if (count &amp;lt; leftCount) ok = false;  // Skip if the count is less than the stored leftCount
  else leftCount = count;             // update leftCount
} else if (id == 1) {                 // 1: right Joystic
  if (count == 0) rightCount = 0;     // reset rightCount
  if (count &amp;lt; rightCount) ok = false; // Skip if the count is less than the stored rightCount
  else rightCount = count;            // update leftCount
} else {                              // 2: gravity sensor
  if (count == 0) centerCount = 0;    // reset centerCount
  if (count &amp;lt; centerCount) ok = false;// Skip if the count is less than the stored centerCount
  else centerCount = count;           // update leftCount
}
if (ok) {                             // if count validation is OK
  income_wifi.remove(0, ed+addHDLen); // remove %%
  ed = income_wifi.indexOf(addHD);    // index for %%
  temp = income_wifi.substring(0, ed);// extract heading
  uint16_t heading = temp.toInt();    // convert to numeric value
  income_wifi.remove(0, ed+addHDLen); // remove %%
  ed = income_wifi.indexOf(addHD);    // index for %%
  temp = income_wifi.substring(0, ed);// extract strength
  uint8_t strength = temp.toInt();    // convert to numeric value
  income_wifi.remove(0, ed);          // remove value for strength
  if (income_wifi == footHD) {        // if the value left is %%F1
    joystick_control(id, heading, strength); // execute the code corresponding to the value
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669083364546&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669083394708&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += echoHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the Joystick state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669083467123&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) {                      
  Data += joyHD;
  Data += id;
  Data += addHD;
  Data += heading;
  Data += addHD;
  Data += strength;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the Joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669083536307&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SEND JOYSTIC ECHO - ESP01: USE AT PASSIVE JOYSTIC MODE
void sendJoyEcho(uint8_t id, uint16_t heading, uint8_t strength) {                          
  Data += joyHD;
  Data += id;
  Data += addHD;
  Data += heading;
  Data += addHD;
  Data += strength;
  Data += echoHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text.&lt;/p&gt;
&lt;pre id=&quot;code_1669083595867&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String text) {                               
  Data += strHD;
  Data += text;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1669083809747&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ 
  Data += connectHD;
  Data += F(&quot;DIS&quot;);
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;disconnect01.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBtVQ1/btrSMH7nzMk/BLXv225DvLn3KCVUJWp8V0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBtVQ1/btrSMH7nzMk/BLXv225DvLn3KCVUJWp8V0/img.jpg&quot; data-alt=&quot;Disconnect Button&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBtVQ1/btrSMH7nzMk/BLXv225DvLn3KCVUJWp8V0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBtVQ1%2FbtrSMH7nzMk%2FBLXv225DvLn3KCVUJWp8V0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;44&quot; data-filename=&quot;disconnect01.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Use when you want to acquire control authority by using the ACCESS POINT password of the module in the internal network connection through the router. (without using HTML web login)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It can be changed to any name through definition of the passName and passNameLen for processing the password in the sketch and the app send datas starting with passName as password value. This is to enhance security.&lt;/p&gt;
&lt;pre id=&quot;code_1669083955283&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define passName F(&quot;PAS:&quot;)
#define passNameLen 4

void requestPass(bool val){ 
  Data += connectHD;
  Data += val;
  Data += passName;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y6oKR/btrSMH7nBpT/2AlAjypdVxX5YDVkPD4SQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y6oKR/btrSMH7nBpT/2AlAjypdVxX5YDVkPD4SQk/img.jpg&quot; data-alt=&quot;Password dialog&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y6oKR/btrSMH7nBpT/2AlAjypdVxX5YDVkPD4SQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY6oKR%2FbtrSMH7nBpT%2F2AlAjypdVxX5YDVkPD4SQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Password dialog&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. If control authority is given through password confirmation, a cookie value is created and transmitted so that control authority for the data transmitted thereafter can be confirmed.&lt;/p&gt;
&lt;pre id=&quot;code_1669084076708&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define cooLength 5
String cooValue = &quot;u7Dv0&quot;;

String makeCooValue() {
  cooValue = &quot;&quot;;
  uint8_t temp = 0;
  for (int i = 0; i &amp;lt; cooLength; i++) {
    temp = random(39, 123); //random(39, 123); // 39 ~ 122 pick
    if (temp == 47 || temp == 59 || temp == 60 || temp == 62 || temp == 92 || temp == 94 || temp == 96) temp = 79;
    cooValue += char(temp);
  }
  return cooValue;
}

void responsePass(bool val){ 
  Data += connectHD;
  Data += F(&quot;RES:&quot;);
  if (val) Data += makeCooValue(); 
  else Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM2fir/btrSL0eXKPb/pwhAyQZaYkeuR2hBmlrQH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM2fir/btrSL0eXKPb/pwhAyQZaYkeuR2hBmlrQH1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM2fir/btrSL0eXKPb/pwhAyQZaYkeuR2hBmlrQH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM2fir%2FbtrSL0eXKPb%2FpwhAyQZaYkeuR2hBmlrQH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;41&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l6DUS/btrSM4g7HhT/8DbdFzHXq6hwDsUkCLgM6k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l6DUS/btrSM4g7HhT/8DbdFzHXq6hwDsUkCLgM6k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l6DUS/btrSM4g7HhT/8DbdFzHXq6hwDsUkCLgM6k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl6DUS%2FbtrSM4g7HhT%2F8DbdFzHXq6hwDsUkCLgM6k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Sends information about the current Wi-Fi connection so that the user can view and edit information in the app about the Wi-Fi connection.&lt;/p&gt;
&lt;pre id=&quot;code_1669084189410&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendWifiInfo(){ 
  Data += connectHD;
  Data += F(&quot;INF:&quot;);
  Data += ssidAP;
  Data += ',';
  Data += passAP;
  Data += ',';
  Data += ap;
  Data += ',';
  Data += wifiRouter;
  Data += ',';
  Data += ssid;
  Data += ',';
  Data += pass;
  Data += ',';
  Data += ip;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1669084218458&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendMessage(String str){ 
  Data += connectHD;
  Data += F(&quot;MES:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d57Jjl/btrSHU8yE1F/0e7w7aejAKnEoVk6cjezC1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d57Jjl/btrSHU8yE1F/0e7w7aejAKnEoVk6cjezC1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d57Jjl/btrSHU8yE1F/0e7w7aejAKnEoVk6cjezC1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd57Jjl%2FbtrSHU8yE1F%2F0e7w7aejAKnEoVk6cjezC1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Disable the feature, which is default setting, of automatically resend the value When a button or Joystick or Gravity Sensor is changed in the app and then if a response failure error occurs.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It is used when the Arduino intentionally does not respond due to the delay that occurs when sending data using the AT command to the ESP01.&lt;/p&gt;
&lt;pre id=&quot;code_1669087355318&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void responseFailResend(bool val) {
  Data += connectHD;
  Data += F(&quot;RFR:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Set the function to continuously transmit the changed value of the Joystick according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** The Gravity Sensor always works in an active Mode.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Joystick Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Joystick Mode&lt;/span&gt; (transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1669087913188&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveJoystick(bool val){ 
  Data += optionHD;
  Data += F(&quot;ACT:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc0N10/btrSJTAL7Dr/WyOE6tukhIV1uVd0ODfdm0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc0N10/btrSJTAL7Dr/WyOE6tukhIV1uVd0ODfdm0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc0N10/btrSJTAL7Dr/WyOE6tukhIV1uVd0ODfdm0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc0N10%2FbtrSJTAL7Dr%2FWyOE6tukhIV1uVd0ODfdm0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;98&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Set transmission interval of ACTIVE JOYSTIC MODE. (Unit:&lt;span class=&quot;notranslate&quot;&gt;&amp;nbsp;Millisecond&lt;/span&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1669088320569&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoystickInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;JSI:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Set the range where the strength of the joystick becomes 0. (enter a value from 0 to 35)&lt;/p&gt;
&lt;pre id=&quot;code_1669088561640&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  Data += optionHD;
  Data += F(&quot;JZR:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSlTDv/btrSJyXRJGs/zaMItBVoGmhZyKESsiNJM0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSlTDv/btrSJyXRJGs/zaMItBVoGmhZyKESsiNJM0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSlTDv/btrSJyXRJGs/zaMItBVoGmhZyKESsiNJM0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSlTDv%2FbtrSJyXRJGs%2FzaMItBVoGmhZyKESsiNJM0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;198&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Set whether or not to use a function that converts the Strength value of Joystick or Gravity Sensor into a value between 0 and 10.&lt;/p&gt;
&lt;pre id=&quot;code_1669088582416&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyStrengthAdjust(bool val){ 
  Data += optionHD;
  Data += F(&quot;ADJ:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Activate a timer that sends checkHD(%%F5) at regular time intervals.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Regardless of the app, it is used to reflect independently changed values in the Arduino to the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669089404190&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequest(bool val){ 
  Data += optionHD;
  Data += F(&quot;REQ:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tO7F4/btrSIsKMZ2E/BoRgEh3kaXn4UrRMD4ucv1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tO7F4/btrSIsKMZ2E/BoRgEh3kaXn4UrRMD4ucv1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tO7F4/btrSIsKMZ2E/BoRgEh3kaXn4UrRMD4ucv1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtO7F4%2FbtrSIsKMZ2E%2FBoRgEh3kaXn4UrRMD4ucv1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;83&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Set the operation interval of the timer sending checkHD(%%F5). (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669089516503&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequestInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;INT:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set the group for the left arrow keypad.&lt;/p&gt;
&lt;pre id=&quot;code_1669089606204&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){  
  if (val == 0 || val &amp;gt; 2) val = 4; 
  Data += optionHD;
  Data += F(&quot;LPM:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjKXwi/btrSKtPkEJG/krzZ5xRRi0EL2ikCdlzdG0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjKXwi/btrSKtPkEJG/krzZ5xRRi0EL2ikCdlzdG0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjKXwi/btrSKtPkEJG/krzZ5xRRi0EL2ikCdlzdG0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjKXwi%2FbtrSKtPkEJG%2FkrzZ5xRRi0EL2ikCdlzdG0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;88&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. Set the 4-way control of the joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669089622403&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  Data += optionHD;
  Data += F(&quot;SJW:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1rQ9N/btrSHJTRYS5/uMGrNKJsKkkPhM8shqXmh1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1rQ9N/btrSHJTRYS5/uMGrNKJsKkkPhM8shqXmh1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1rQ9N/btrSHJTRYS5/uMGrNKJsKkkPhM8shqXmh1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1rQ9N%2FbtrSHJTRYS5%2FuMGrNKJsKkkPhM8shqXmh1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;98&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. Set whether or not to display the group button.&lt;/p&gt;
&lt;pre id=&quot;code_1669089645803&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  Data += optionHD;
  Data += F(&quot;DAB:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7zisa/btrSHK6fMYI/Det43jhn83eK69v7EUHd0K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7zisa/btrSHK6fMYI/Det43jhn83eK69v7EUHd0K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7zisa/btrSHK6fMYI/Det43jhn83eK69v7EUHd0K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7zisa%2FbtrSHK6fMYI%2FDet43jhn83eK69v7EUHd0K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;31&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vhm1g/btrSHUU3a2f/DhEKCsgsflJSq4iQVwkS0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vhm1g/btrSHUU3a2f/DhEKCsgsflJSq4iQVwkS0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vhm1g/btrSHUU3a2f/DhEKCsgsflJSq4iQVwkS0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvhm1g%2FbtrSHUU3a2f%2FDhEKCsgsflJSq4iQVwkS0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;145&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfZzkf/btrSJT8yyFP/vGTHZ6TOrONkQXRvhDYtO1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfZzkf/btrSJT8yyFP/vGTHZ6TOrONkQXRvhDYtO1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfZzkf/btrSJT8yyFP/vGTHZ6TOrONkQXRvhDYtO1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfZzkf%2FbtrSJT8yyFP%2FvGTHZ6TOrONkQXRvhDYtO1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;137&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1669090158714&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2: show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  Data += optionHD;
  Data += F(&quot;SLM:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxhHP7/btrSLJqOFuT/RHno9kMJU4K2lgBw6IJSA1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxhHP7/btrSLJqOFuT/RHno9kMJU4K2lgBw6IJSA1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxhHP7/btrSLJqOFuT/RHno9kMJU4K2lgBw6IJSA1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxhHP7%2FbtrSLJqOFuT%2FRHno9kMJU4K2lgBw6IJSA1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;384&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22. Set the activation interval of the gravity sensor and transmission of the tilt value.&lt;/p&gt;
&lt;pre id=&quot;code_1669090262649&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;UGI:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blt8bA/btrSL0su1nm/dnjsv8gFzuRrl50CtjOHCK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blt8bA/btrSL0su1nm/dnjsv8gFzuRrl50CtjOHCK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blt8bA/btrSL0su1nm/dnjsv8gFzuRrl50CtjOHCK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblt8bA%2FbtrSL0su1nm%2Fdnjsv8gFzuRrl50CtjOHCK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;83&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AXBuh/btrSIP6RPfQ/OTCiZnbfSNMnQUTdzzfpo1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AXBuh/btrSIP6RPfQ/OTCiZnbfSNMnQUTdzzfpo1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AXBuh/btrSIP6RPfQ/OTCiZnbfSNMnQUTdzzfpo1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAXBuh%2FbtrSIP6RPfQ%2FOTCiZnbfSNMnQUTdzzfpo1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;48&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23. Set labels for buttons.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Label buttons 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;pre id=&quot;code_1669090365443&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  Data += optionHD;
  Data += F(&quot;ABL:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyLS1m/btrSHV7xNdm/6EOrqITd46cX0gOIObtig0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyLS1m/btrSHV7xNdm/6EOrqITd46cX0gOIObtig0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyLS1m/btrSHV7xNdm/6EOrqITd46cX0gOIObtig0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyLS1m%2FbtrSHV7xNdm%2F6EOrqITd46cX0gOIObtig0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;84&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLtboI/btrSHXdftwc/OSGkSubVdMlXz4fFzW0ALK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLtboI/btrSHXdftwc/OSGkSubVdMlXz4fFzW0ALK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLtboI/btrSHXdftwc/OSGkSubVdMlXz4fFzW0ALK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLtboI%2FbtrSHXdftwc%2FOSGkSubVdMlXz4fFzW0ALK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;146&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;24. Set the toggle/push properties of the left 4 buttons or 20 buttons of all.&lt;/p&gt;
&lt;pre id=&quot;code_1669090545662&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0000&quot;)           // left pad: up-left-right-down
//F(&quot;00000000001111110000&quot;) // 0000:left, 0000:right, 001111110000:center
void setLeftPadOrAllToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;LTG:&quot;);
  Data += str;  
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MjXMa/btrSHXdfv0m/tNrsvI8VaJAslmEoXjCUL0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MjXMa/btrSHXdfv0m/tNrsvI8VaJAslmEoXjCUL0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MjXMa/btrSHXdfv0m/tNrsvI8VaJAslmEoXjCUL0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMjXMa%2FbtrSHXdfv0m%2FtNrsvI8VaJAslmEoXjCUL0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;105&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;25. Set the toggle/push properties of the right 4 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669090560825&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;0000&quot;)           // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;RTG:&quot;);
  Data += str;  
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;26. Set the toggle/push properties of the middle 12 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669090577219&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;000000000000&quot;); // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;BTG:&quot;);
  Data += str;  
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;27. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; selection index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  Data += optionHD;
  Data += F(&quot;RAD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; Data += ':';
  Data += String(selection);
  Data += '\n';
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7EHBA/btrSHV7xNmy/9gHfEbaRG0t61iIjqhtXP0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7EHBA/btrSHV7xNmy/9gHfEbaRG0t61iIjqhtXP0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7EHBA/btrSHV7xNmy/9gHfEbaRG0t61iIjqhtXP0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7EHBA%2FbtrSHV7xNmy%2F9gHfEbaRG0t61iIjqhtXP0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;28. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;CKB:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Eue8/btrSLJK8yim/Hh8SNDN94cnC6eRevHrHK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Eue8/btrSLJK8yim/Hh8SNDN94cnC6eRevHrHK0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Eue8/btrSLJK8yim/Hh8SNDN94cnC6eRevHrHK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Eue8%2FbtrSLJK8yim%2FHh8SNDN94cnC6eRevHrHK0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;29. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  Data += optionHD;
  Data += F(&quot;CHD:&quot;); 
  Data += String(id); Data += ':'; 
  Data += message; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3KcfQ/btrSIpN62m2/8tZZzKGQG4Jqyzco2YkOgK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3KcfQ/btrSIpN62m2/8tZZzKGQG4Jqyzco2YkOgK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3KcfQ/btrSIpN62m2/8tZZzKGQG4Jqyzco2YkOgK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3KcfQ%2FbtrSIpN62m2%2F8tZZzKGQG4Jqyzco2YkOgK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;30. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;LSD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3jKfk/btrSISvIhH6/3FhTa5ktLoDZIQZ4ylUfC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3jKfk/btrSISvIhH6/3FhTa5ktLoDZIQZ4ylUfC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3jKfk/btrSISvIhH6/3FhTa5ktLoDZIQZ4ylUfC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3jKfk%2FbtrSISvIhH6%2F3FhTa5ktLoDZIQZ4ylUfC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;429&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;31. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1668667558042&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  Data += optionHD;
  Data += F(&quot;STR:&quot;); 
  Data += String(id); Data += ':'; 
  Data += title; 
  Data += '\n';
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bppoX2/btrSJUsRPRo/CqSr5ia5XCxkjGxOhrNGC1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bppoX2/btrSJUsRPRo/CqSr5ia5XCxkjGxOhrNGC1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bppoX2/btrSJUsRPRo/CqSr5ia5XCxkjGxOhrNGC1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbppoX2%2FbtrSJUsRPRo%2FCqSr5ia5XCxkjGxOhrNGC1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.ESP32_WIFI_JOYSTICK.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bNXVkH/btrSMILZFGL/GY7y3S9EStBSXe4kPHkzkk/1.ESP32_WIFI_JOYSTICK.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1.ESP32_WIFI_JOYSTICK.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.ESP8266_WIFI_JOYSTICK.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/r96Cd/btrSJyQ4YhJ/1DL0aCZ2sPqq9yajLrHe41/1.ESP8266_WIFI_JOYSTICK.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1.ESP8266_WIFI_JOYSTICK.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/BKM9us2iH-M&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/BKM9us2iH-M&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/BKM9us2iH-M&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1670058669905&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;WiFi.h&amp;gt;
#include &amp;lt;WiFiClient.h&amp;gt;
#include &amp;lt;WiFiAP.h&amp;gt;

WiFiServer server(80);
WiFiClient client;

const char ssidAP[] = &quot;Esp32&quot;;   // your network SSID (name)
const char passAP[] = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password
const char ssid[] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
const char pass[] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

bool wifiRouter = true;      // Whether or not there is a router connection
String ap = &quot;&quot;;
String ip = &quot;&quot;;

String Data = &quot;&quot;;
#include &quot;protocol.h&quot;

String toStringIp(IPAddress ip) {  // convert ip address to string
  String res = &quot;&quot;;
  for (int i = 0; i &amp;lt; 3; i++) res += String((ip &amp;gt;&amp;gt; (8 * i)) &amp;amp; 0xFF) + &quot;.&quot;;
  res += String(((ip &amp;gt;&amp;gt; 8 * 3)) &amp;amp; 0xFF);
  return res;
}

void setup() {
  Serial.begin(115200);
  if (wifiRouter) WiFi.mode(WIFI_AP_STA);  
  else WiFi.mode(WIFI_AP);
  WiFi.softAP(ssidAP, passAP);
  ap = toStringIp(WiFi.softAPIP());
  Serial.print(F(&quot;AP address: &quot;));
  Serial.println(ap);
  if (wifiRouter) {
    if (pass == &quot;&quot;) WiFi.begin(ssid);
    else WiFi.begin(ssid, pass);    // Connect to WPA/WPA2 network
    uint8_t wifi_count = 0;
    while (WiFi.status() != WL_CONNECTED) {
          delay(200); Serial.print(F(&quot;.&quot;));
          wifi_count++;
          if (wifi_count == 50) break;
    }
    delay(10);
    ip = toStringIp(WiFi.localIP());
    Serial.print(F(&quot;IP address: &quot;));
    Serial.println(ip);
  }
  server.begin();
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(F(&quot;button 1 : on&quot;)); 
                  break;
      case 10: Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 51: Serial.println(F(&quot;button 5 : on&quot;));
                  break;
      case 50: Serial.println(F(&quot;button 5 : off&quot;));
                  break;
      case 61: Serial.println(F(&quot;button 6 : on&quot;));
                  break;
      case 60: Serial.println(F(&quot;button 6 : off&quot;));
                  break;
      case 71: Serial.println(F(&quot;button 7 : on&quot;));
                  break;
      case 70: Serial.println(F(&quot;button 7 : off&quot;));
                  break;
      case 81: Serial.println(F(&quot;button 8 : on&quot;));
                  break;
      case 80: Serial.println(F(&quot;button 8 : off&quot;));
                  break;
      case 91: Serial.println(&quot;button 9 : on&quot;);
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(&quot;button 10 : on&quot;);
                //uint8_t id, String title, String option
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,tomato,banana,mango&quot;)); 
                  break;
      case 100: Serial.println(F(&quot;button 10 : off&quot;));
                  break;  
      case 111: Serial.println(F(&quot;button 11 : on&quot;));
                  break;
      case 110: Serial.println(F(&quot;button 11 : off&quot;));
                  break;  
      case 121: Serial.println(F(&quot;button 12 : on&quot;));
                  break;
      case 120: Serial.println(F(&quot;button 12 : off&quot;));
                  break;  
      case 131: Serial.println(F(&quot;button 13 : on&quot;));
                  break;  
      case 130: Serial.println(F(&quot;button 13 : off&quot;));
                  break;  
      case 141: Serial.println(F(&quot;button 14 : on&quot;));
                  break;  
      case 140: Serial.println(F(&quot;button 14 : off&quot;));
                  break;  
      case 151: Serial.println(F(&quot;button 15 : on&quot;));
                  break;  
      case 150: Serial.println(F(&quot;button 15 : off&quot;));
                  break;     
      case 161: Serial.println(F(&quot;button 16 : on&quot;));
                  break;
      case 160: Serial.println(F(&quot;button 16 : off&quot;));
                  break;  
      case 171: Serial.println(F(&quot;button 17 : on&quot;));
                  break;
      case 170: Serial.println(F(&quot;button 17 : off&quot;));
                  break;  
      case 181: Serial.println(F(&quot;button 18 : on&quot;));
                  break;  
      case 180: Serial.println(F(&quot;button 18 : off&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : on&quot;));
                  break;  
      case 190: Serial.println(F(&quot;button 19 : off&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : on&quot;));
                  break;  
      case 200: Serial.println(F(&quot;button 20 : off&quot;));
                  break; 
      case 210: Serial.println(F(&quot;button 21 : off&quot;));
                  break;  
      case 220: Serial.println(F(&quot;button 22 : off&quot;));
                  break;                 
    }
  }
}

// headingVal = false;
//           Top
//         6  7  0
//          \ | /
//  Left 5 --   -- 1 Right
//          / | \
//         4  3  2
//          Bottom

bool headingVal = true; 

void joystick_control(uint8_t id, uint16_t heading, uint8_t strength) {
  //sendJoyEcho(id, heading, strength); 
  if (id == 0) Serial.print(F(&quot;L: &quot;));
  else if (id == 1) Serial.print(F(&quot;R: &quot;));
  else Serial.print(F(&quot;C: &quot;));
  if (headingVal) {
    Serial.print(heading); Serial.print('/'); Serial.println(strength);
  } else {
    if (heading &amp;lt;= 23) heading = 359;
    int8_t stickDir = (heading-23)/45;  
    Serial.println(stickDir);
  }
}

bool appConnection = false;
String income_wifi = &quot;&quot;; // storage variable for received string with WiFi
uint16_t leftCount = 2;
uint16_t rightCount = 2;
uint16_t centerCount = 2;

void wifi_read() { 
  client = server.available(); 
  while (client.connected()) {
    if(client.available()) {     
      income_wifi = client.readStringUntil('\r');
      if (income_wifi.startsWith(F(&quot;GET&quot;))) income_wifi.remove(0,5);   // remove &quot;GET /&quot; 
      if (!income_wifi.startsWith(F(&quot;favi&quot;))) {                        // favicon.ico pass
        int ed = income_wifi.lastIndexOf(F(&quot;HTTP/1.1&quot;));
        income_wifi.remove(ed-1);
        if (appConnection) {  
          String temp = &quot;&quot;; 
          temp = income_wifi.substring(0, HDLen);
          uint8_t order = 0;
          if (temp == checkHD) order = 1;
          else if (temp == pinHD) order = 2;
          else if (temp == joyHD) order = 3;
          else if (temp == connectHD) order = 4;
          else if (temp == optionHD) order = 5; 
          if (order &amp;gt; 2) income_wifi.remove(0, HDLen);  // Remove protocol header
          if (order == 1) { // send data to app when change local/web control value
            Serial.println(temp);
          } else if (order == 2) { // %%F0
            while(income_wifi.indexOf(pinHD) != -1) { // need depend on left arrow pad mode 
              income_wifi.remove(0, HDLen);
              ed = income_wifi.indexOf(footHD);
              if (ed != -1) {
                temp = income_wifi.substring(0, ed);
                uint8_t value = temp.toInt();
                income_wifi.remove(0, ed+HDLen);
                pin_control(value);
              } else break;
            }
          } else if (order == 3) { // %%F3
            temp = income_wifi.substring(0, 1);
            uint8_t id = temp.toInt();
            income_wifi.remove(0, 1);
            ed = income_wifi.indexOf(addHD);
            temp = income_wifi.substring(0, ed);
            uint16_t count = temp.toInt();
            bool ok = true;
            if (id == 0) {
              if (count == 0) leftCount = 0;
              if (count &amp;lt; leftCount) ok = false;
              else leftCount = count;
            } else if (id == 1) {
              if (count == 0) rightCount = 0;
              if (count &amp;lt; rightCount) ok = false;
              else rightCount = count;
            } else {
              if (count == 0) centerCount = 0;
              if (count &amp;lt; centerCount) ok = false;
              else centerCount = count;
            }
            if (ok) {
              income_wifi.remove(0, ed+addHDLen);
              ed = income_wifi.indexOf(addHD);
              temp = income_wifi.substring(0, ed);
              uint16_t heading = temp.toInt();
              income_wifi.remove(0, ed+addHDLen);
              ed = income_wifi.indexOf(addHD);
              temp = income_wifi.substring(0, ed);
              uint8_t strength = temp.toInt();
              income_wifi.remove(0, ed);
              if (income_wifi == footHD) {
                joystick_control(id, heading, strength);
              }
            }
          } else if (order == 4) { // %%F8
            if (income_wifi == F(&quot;connect&quot;)) iniSet();
            else if (income_wifi == F(&quot;disconnect&quot;)) appConnection = false;  
            else if (income_wifi.startsWith(F(&quot;WiFi&quot;))) { 
              sendMessage(F(&quot;This funtion is not available.&quot;)); 
            } else Serial.println(income_wifi);
          } else if (order == 5) { // %%F9
            income_wifi.replace(F(&quot;%20&quot;), F(&quot; &quot;)); // URL Encoding space character change
            CheckF9(income_wifi);
          } else { // order == 0
            income_wifi.replace(F(&quot;%20&quot;), F(&quot; &quot;)); // URL Encoding space character change
            Serial.println(income_wifi);
          }
          http_response();
        } else {
          if (income_wifi == checkHD) { appConnection = true; http_response(); }
        }
      }
      income_wifi = &quot;&quot;;
      break;
    } else break;
  }
}

unsigned long int one_millis = 0;

void wifi_delay() { // Check client connection and receive data every 10 milliseconds
  if (millis() - one_millis &amp;gt; 10) {
    one_millis = millis();
    wifi_read();
  }
}

void loop() {
  wifi_delay(); 
  if(Serial.available()) { // If there is data in the serial buffer
    String temp = Serial.readStringUntil('\n'); // Serial Monitor - NEW LINE option
    Serial.println(temp);
    if(temp == &quot;1&quot;){   
      
    } else if(temp == &quot;2&quot;){ 
      sendJoyState(0, 45, 10);
    } else if(temp == &quot;3&quot;){ 
      sendJoyEcho(0, 45, 10);
    } else if(temp == &quot;4&quot;){
      setActiveJoystick(true);
    } else if(temp == &quot;5&quot;){
      setActiveJoystick(false); 
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1670058934512&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD F(&quot;%%F0&quot;)
#define joyHD F(&quot;%%F3&quot;)
#define strHD F(&quot;%%F4&quot;)
#define footHD F(&quot;%%F1&quot;)
#define echoHD F(&quot;%%E1&quot;)
#define connectHD F(&quot;%%F8&quot;)
#define optionHD F(&quot;%%F9&quot;)
#define checkHD F(&quot;%%F5&quot;)
#define HDLen 4
#define addHD F(&quot;%%&quot;)
#define addHDLen 2

// SEND PIN VALUE
void sendPinState(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += footHD;
  Data += '\n';
}

// SEND PIN ECHO
void sendPinEcho(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += echoHD;
  Data += '\n';
}

// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) {                      
  Data += joyHD;
  Data += id;
  Data += addHD;
  Data += heading;
  Data += addHD;
  Data += strength;
  Data += footHD;
  Data += '\n';
}

// SEND JOYSTIC ECHO - ESP01: USE AT PASSIVE JOYSTIC MODE
void sendJoyEcho(uint8_t id, uint16_t heading, uint8_t strength) {                          
  Data += joyHD;
  Data += id;
  Data += addHD;
  Data += heading;
  Data += addHD;
  Data += strength;
  Data += echoHD;
  Data += '\n';
}

// SEND TEXT
void sendText(String text) {                               
  Data += strHD;
  Data += text;
  Data += footHD;
  Data += '\n';
}

///////////////////////////////////////// CONNECTION 
void sendDisconnect(){ 
  Data += connectHD;
  Data += F(&quot;DIS&quot;);
  Data += '\n';
}

//#define passName F(&quot;PAS:&quot;)
//#define passNameLen 4
//
//void requestPass(bool val){ 
//  Data += connectHD;
//  Data += val;
//  Data += passName;
//  Data += '\n';
//}
//
//#define cooLength 5
//String cooValue = &quot;u7Dv0&quot;;
//
//String makeCooValue() {
//  cooValue = &quot;&quot;;
//  uint8_t temp = 0;
//  for (int i = 0; i &amp;lt; cooLength; i++) {
//    temp = random(39, 123); //random(39, 123); // 39 ~ 122 pick
//    if (temp == 47 || temp == 59 || temp == 60 || temp == 62 || temp == 92 || temp == 94 || temp == 96) temp = 79;
//    cooValue += char(temp);
//  }
//  return cooValue;
//}
//
//void responsePass(bool val){ 
//  Data += connectHD;
//  Data += F(&quot;RES:&quot;);
//  if (val) Data += makeCooValue(); 
//  else Data += val;
//  Data += '\n';
//}

void sendWifiInfo(){ 
  Data += connectHD;
  Data += F(&quot;INF:&quot;);
  Data += ssidAP;
  Data += ',';
  Data += passAP;
  Data += ',';
  Data += ap;
  Data += ',';
  Data += wifiRouter;
  Data += ',';
  Data += ssid;
  Data += ',';
  Data += pass;
  Data += ',';
  Data += ip;
  Data += '\n';
}

void sendMessage(String str){ 
  Data += connectHD;
  Data += F(&quot;MES:&quot;);
  Data += str;
  Data += '\n';
}

// defalt: true
void responseFailResend(bool val) {
  Data += connectHD;
  Data += F(&quot;RFR:&quot;);
  Data += val;
  Data += '\n';
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveJoystick(bool val){ 
  Data += optionHD;
  Data += F(&quot;ACT:&quot;);
  Data += val;
  Data += '\n';
}

// SEND SLIDE GET VALUE INTERVAL
void setJoystickInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;JSI:&quot;);
  Data += val;
  Data += '\n';
}

void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  Data += optionHD;
  Data += F(&quot;JZR:&quot;);
  Data += val;
  Data += '\n';
}

void setJoyStrengthAdjust(bool val){ 
  Data += optionHD;
  Data += F(&quot;ADJ:&quot;);
  Data += val;
  Data += '\n';
}

void setRequest(bool val){ 
  Data += optionHD;
  Data += F(&quot;REQ:&quot;);
  Data += val;
  Data += '\n';
}

void setRequestInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;INT:&quot;);
  Data += val;
  Data += '\n';
}

// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){   
  if (val == 0 || val &amp;gt; 2) val = 4; 
  Data += optionHD;
  Data += F(&quot;LPM:&quot;);
  Data += val;
  Data += '\n';
}

// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  Data += optionHD;
  Data += F(&quot;SJW:&quot;);
  Data += val;
  Data += '\n';
}

// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  Data += optionHD;
  Data += F(&quot;DAB:&quot;);
  Data += val;
  Data += '\n';
}

// 0: not use, 1: show only name, 2: show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  Data += optionHD;
  Data += F(&quot;SLM:&quot;);
  Data += val;
  Data += '\n';
}

// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;UGI:&quot;);
  Data += val;
  Data += '\n';
}

//f(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  Data += optionHD;
  Data += F(&quot;ABL:&quot;);
  Data += str;
  Data += '\n';
}

//F(&quot;0000&quot;)           // left pad: up-left-right-down
void setLeftPadOrAllToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;LTG:&quot;);
  Data += str;  
  Data += '\n';
}
// F(&quot;0000&quot;)           // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;RTG:&quot;);
  Data += str;  
  Data += '\n';
}
// F(&quot;000000000000&quot;); // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;BTG:&quot;);
  Data += str;  
  Data += '\n';
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  Data += optionHD;
  Data += F(&quot;RAD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; Data += ':';
  Data += String(selection);
  Data += '\n';
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;CKB:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  Data += optionHD;
  Data += F(&quot;CHD:&quot;); 
  Data += String(id); Data += ':'; 
  Data += message; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;LSD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  Data += optionHD;
  Data += F(&quot;STR:&quot;); 
  Data += String(id); Data += ':'; 
  Data += title; 
  Data += '\n';
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  sendWifiInfo(); 
  setAddButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;)); 
  setJoyWay4(false);
  setActiveJoystick(true); setJoystickInterval(100);
  setJoyStrengthAdjust(true);
  setRequest(false); //setRequestInterval(250);
  //useGravityAndInterval(180*2);
}

void http_response() {
  client.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;));
  client.print(Data);
  Data = &quot;&quot;;
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUPAD app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUPAD app settings: label/toggle properties, use of the timer for checkHD(%%F5), Joystic Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1670059107026&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  sendWifiInfo(); 
  setAddButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;)); 
  setJoyWay4(false);
  setActiveJoystick(true); setJoystickInterval(100); // Active Joysitck Mode
  setJoyStrengthAdjust(true);                        // value of Joystick adjusted into 0 ~ 10
  setRequest(false); //setRequestInterval(250);      // Disable timer for check(%%F5)
  //useGravityAndInterval(180*2);                    // use or not the Gravity sensor with the interval
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the leftPadMode and menu-related button.&lt;/p&gt;
&lt;pre id=&quot;code_1670059504719&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up DIR&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;)); 
                  break;
      case 10: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left DIR&quot;));
               else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right DIR&quot;));
               else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down DIR&quot;));
               else Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down off&quot;));
               else Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      .
      .
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
               //uint8_t id, String title, String option
               dialogList(0, F(&quot;LEFT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(&quot;button 10 : on&quot;);
                //uint8_t id, String title, String option
                dialogList(2, F(&quot;RIGHT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
      .
      .
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1670059549862&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }         // radio button
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }    // Checkbox
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }    // Select button
  else if (temp.startsWith(F(&quot;LSD&quot;))) {       // List Window
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { leftPadMode = 0; setLeftPadOrAllToggle(F(&quot;0000&quot;)); }
      else if (temp.startsWith(F(&quot;TOG&quot;))) {
        setLeftPadOrAllToggle(F(&quot;1111&quot;)); // set toggle for left button
        dialogList(1, F(&quot;LEFT PAD MODE AT TOGGLE&quot;), F(&quot;SELECT,INDIVIDUAL,TWO GROUP,ONLY ONE&quot;)); // dialog message
      }
    } else if (id == 1) {
      if (temp.startsWith(F(&quot;IND&quot;))) leftPadMode = 1; // independant
      else if (temp.startsWith(F(&quot;TWO&quot;))) leftPadMode = 2; // 2 group: up/down, left/right
      else if (temp.startsWith(F(&quot;ONL&quot;))) leftPadMode = 4; // 4psc button is 1 group
      setLeftPadMode(leftPadMode);
    } else if (id == 2) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { rightPadMode = 0; setRightPadToggle(F(&quot;0000&quot;)); } // set push for right button
      else { rightPadMode = 1; setRightPadToggle(F(&quot;1111&quot;)); }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }       // Input text
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1.ESP32_WIFI_JOYSTICK_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/FW7EA/btrSLIS0WxH/Tay2mhkWmHUSNYK18nvK1K/1-1.ESP32_WIFI_JOYSTICK_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1-1.ESP32_WIFI_JOYSTICK_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1.ESP8266_WIFI_JOYSTICK_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/U0CNu/btrSMHTRmP3/qkVtnGk6RLk6q0MPmJLUFK/1-1.ESP8266_WIFI_JOYSTICK_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1-1.ESP8266_WIFI_JOYSTICK_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/z-Dk_MSCcZs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/z-Dk_MSCcZs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/z-Dk_MSCcZs&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Wifi Manager&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can change the ID and password for connecting to access points and a router without using HTML code.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5mZvv/btrSIQreHqd/tRlSWztBaEsRh6ITZSm3vk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5mZvv/btrSIQreHqd/tRlSWztBaEsRh6ITZSm3vk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5mZvv/btrSIQreHqd/tRlSWztBaEsRh6ITZSm3vk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5mZvv%2FbtrSIQreHqd%2FtRlSWztBaEsRh6ITZSm3vk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;384&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.ESP32_WIFI_JOYSTICK_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/ejDyYF/btrSJTHydIz/tJ7qYLCHehcfngbuBWarTK/2.ESP32_WIFI_JOYSTICK_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;2.ESP32_WIFI_JOYSTICK_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.ESP8266_WIFI_JOYSTICK_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dbEpXS/btrSJE4Q4Gs/pw7YpitFCYS4N2hUfY4KEK/2.ESP8266_WIFI_JOYSTICK_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;2.ESP8266_WIFI_JOYSTICK_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/1x4sEWx0MjE&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/1x4sEWx0MjE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/1x4sEWx0MjE&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Login&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When connecting through a router, obtain control authority using password of the access point.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IapO9/btrSKPY7xIv/mxoxvc68uFKWdQSheEtkR0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IapO9/btrSKPY7xIv/mxoxvc68uFKWdQSheEtkR0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IapO9/btrSKPY7xIv/mxoxvc68uFKWdQSheEtkR0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIapO9%2FbtrSKPY7xIv%2Fmxoxvc68uFKWdQSheEtkR0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EFVZK/btrSJXJR9Rl/d0eiB1JozjjI2jnfM5fia1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EFVZK/btrSJXJR9Rl/d0eiB1JozjjI2jnfM5fia1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EFVZK/btrSJXJR9Rl/d0eiB1JozjjI2jnfM5fia1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEFVZK%2FbtrSJXJR9Rl%2Fd0eiB1JozjjI2jnfM5fia1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;41&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.ESP32_WIFI_JOYSTICK_PASS.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/VS7Ck/btrSKQDInTQ/6ndXJfLi5glvDljWuptP30/3.ESP32_WIFI_JOYSTICK_PASS.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;3.ESP32_WIFI_JOYSTICK_PASS.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.ESP8266_WIFI_JOYSTICK_PASS.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bKeyFD/btrSHXxzNrM/G6GkpVfo4VgV3iDi5htRak/3.ESP8266_WIFI_JOYSTICK_PASS.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;3.ESP8266_WIFI_JOYSTICK_PASS.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/XTSMQSPn1VU&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/XTSMQSPn1VU&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/XTSMQSPn1VU&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ADUPAD - Arduino wireless remote control PAD application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUPAD</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/192</guid>
      <comments>https://postpop.tistory.com/192#entry192comment</comments>
      <pubDate>Sat, 3 Dec 2022 17:14:36 +0900</pubDate>
    </item>
    <item>
      <title>ESP32/NodeMcu WiFi remote control with ADUCON</title>
      <link>https://postpop.tistory.com/191</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Q9vU/btrVcm1TUbA/6Ivk4l4g13bpszqXgpspmK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Q9vU/btrVcm1TUbA/6Ivk4l4g13bpszqXgpspmK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Q9vU/btrVcm1TUbA/6Ivk4l4g13bpszqXgpspmK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Q9vU%2FbtrVcm1TUbA%2F6Ivk4l4g13bpszqXgpspmK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/190&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - ESP32/NodeMcu Basic code for WiFi remote contol&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUCON application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc0ebF/btrSCvzwG8T/Vtoj58FZB1Q8WI3YQqhoaK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc0ebF/btrSCvzwG8T/Vtoj58FZB1Q8WI3YQqhoaK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc0ebF/btrSCvzwG8T/Vtoj58FZB1Q8WI3YQqhoaK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc0ebF%2FbtrSCvzwG8T%2FVtoj58FZB1Q8WI3YQqhoaK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;617&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Modify the HTTP response code in loop() function according to the protocol for &quot;TEXT&quot; set in the ADUCON app.&lt;/p&gt;
&lt;pre id=&quot;code_1669874559218&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void loop() {
  client = server.available(); // Whether the server has data to receive and set now client
  String temp = &quot;&quot;;
  while (client.connected()) { // Enter an infinite loop first to prevent re-execution of &quot;client = server.available();&quot;
    if(client.available()) {   // If the client has data
      temp = client.readStringUntil('\r'); 
      Serial.println(temp);
      if (temp.startsWith(F(&quot;GET&quot;))) { // message for response
        Data  = &quot;%%F4&quot;;                // protocol header of text for ADUCON
        Data += &quot;Hello World &quot;;
        Data += random(100,200);
        Data += &quot;%%F1&quot;;                // protocol footer of text for ADUCON
        Data += '\n';                  // termination character of wifi for ADUCON
        Serial.println(Data);          // Output the message to the serial monitor.
        http_response(); 
        break;
      }
    } else break;
  }
  delay(10); // time for sending data at wifi component of ESP32 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_WIFI_BASIC_CONTROL.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/k8jQs/btrSIth1jzx/3oafaKPvNdOl7Bg2CRI250/ESP32_WIFI_BASIC_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_WIFI_BASIC_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP8266_WIFI_BASIC_CONTROL.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dZ5EKZ/btrSHLKg7Gh/g38avLi1qtkMo8lO7FBink/ESP8266_WIFI_BASIC_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP8266_WIFI_BASIC_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ESP32_WIFI_BASIC_CONTROL.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32.jpg&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crXdAE/btrSCHzSzD3/gup50jDnC492CSa4SCpi70/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crXdAE/btrSCHzSzD3/gup50jDnC492CSa4SCpi70/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crXdAE/btrSCHzSzD3/gup50jDnC492CSa4SCpi70/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrXdAE%2FbtrSCHzSzD3%2Fgup50jDnC492CSa4SCpi70%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorESP32.jpg&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting to the assigned IP while ESP01 is connected to the router&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the assigned IP address &quot;192.168.1.6&quot; on ADUCON app connected to network of &quot;skynet&quot;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputAddressADUCONesp32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YPaEe/btrSCv7Fw6C/DfR1nhrkle6lq5H1UlrDn0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YPaEe/btrSCv7Fw6C/DfR1nhrkle6lq5H1UlrDn0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YPaEe/btrSCv7Fw6C/DfR1nhrkle6lq5H1UlrDn0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYPaEe%2FbtrSCv7Fw6C%2FDfR1nhrkle6lq5H1UlrDn0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;171&quot; data-filename=&quot;inputAddressADUCONesp32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32RES2.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz7twl/btrSAwTQsHn/WApVCEWQ3gYwkB1tTqaLHK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz7twl/btrSAwTQsHn/WApVCEWQ3gYwkB1tTqaLHK/img.jpg&quot; data-alt=&quot;received data of &amp;quot;%%F5&amp;quot; and &amp;quot;%%F8connect&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz7twl/btrSAwTQsHn/WApVCEWQ3gYwkB1tTqaLHK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz7twl%2FbtrSAwTQsHn%2FWApVCEWQ3gYwkB1tTqaLHK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorESP32RES2.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;%%F5&quot; and &quot;%%F8connect&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHTTPADUCONesp32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OFNnT/btrSyrrWnSd/Zy43SCOcXzk5WHSJzH4070/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OFNnT/btrSyrrWnSd/Zy43SCOcXzk5WHSJzH4070/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OFNnT/btrSyrrWnSd/Zy43SCOcXzk5WHSJzH4070/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOFNnT%2FbtrSyrrWnSd%2FZy43SCOcXzk5WHSJzH4070%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;97&quot; data-filename=&quot;responseHTTPADUCONesp32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP32&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting directly to the ESP32 and then connecting the access point&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Connect to ESP32 on the WiFi Setting of a mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectToESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fyxa9/btrSCsb6sI5/5jywnR8yAxivgA6fxTie11/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fyxa9/btrSCsb6sI5/5jywnR8yAxivgA6fxTie11/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fyxa9/btrSCsb6sI5/5jywnR8yAxivgA6fxTie11/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFyxa9%2FbtrSCsb6sI5%2F5jywnR8yAxivgA6fxTie11%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;297&quot; data-filename=&quot;connectToESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the Password for the ACCESS POINT of ESP32.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputPasswordESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/em14b7/btrSB4vMsRR/CIqmuksz3TdzyIMMaan8o1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/em14b7/btrSB4vMsRR/CIqmuksz3TdzyIMMaan8o1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/em14b7/btrSB4vMsRR/CIqmuksz3TdzyIMMaan8o1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fem14b7%2FbtrSB4vMsRR%2FCIqmuksz3TdzyIMMaan8o1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;313&quot; data-filename=&quot;inputPasswordESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Select &quot;Keep WiFi on&quot; if the message output below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgW9oM/btrSCMaghgc/eDuc0tAVJIYpc3ao3MScU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgW9oM/btrSCMaghgc/eDuc0tAVJIYpc3ao3MScU0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgW9oM/btrSCMaghgc/eDuc0tAVJIYpc3ao3MScU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgW9oM%2FbtrSCMaghgc%2FeDuc0tAVJIYpc3ao3MScU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;288&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the address &quot;192.168.4.1&quot; on ADUCON app connected to ESP32.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputAddressADUCONesp32ac.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vKU29/btrSyTPhmXJ/UjbqiIhYeBRPOVIefEkHq1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vKU29/btrSyTPhmXJ/UjbqiIhYeBRPOVIefEkHq1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vKU29/btrSyTPhmXJ/UjbqiIhYeBRPOVIefEkHq1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvKU29%2FbtrSyTPhmXJ%2FUjbqiIhYeBRPOVIefEkHq1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;172&quot; data-filename=&quot;inputAddressADUCONesp32ac.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32RES3.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HrPO1/btrSyreoGEL/juYk5E0RILsa6UXGgZpgK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HrPO1/btrSyreoGEL/juYk5E0RILsa6UXGgZpgK0/img.jpg&quot; data-alt=&quot;received data of &amp;quot;%%F5&amp;quot; and &amp;quot;%%F8connect&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HrPO1/btrSyreoGEL/juYk5E0RILsa6UXGgZpgK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHrPO1%2FbtrSyreoGEL%2FjuYk5E0RILsa6UXGgZpgK0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorESP32RES3.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;%%F5&quot; and &quot;%%F8connect&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHTTPADUCONesp32ac.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I0ytZ/btrSDGHsQq1/aXKcEAXKiHfZEGP7URk6v1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I0ytZ/btrSDGHsQq1/aXKcEAXKiHfZEGP7URk6v1/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I0ytZ/btrSDGHsQq1/aXKcEAXKiHfZEGP7URk6v1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI0ytZ%2FbtrSDGHsQq1%2FaXKcEAXKiHfZEGP7URk6v1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;97&quot; data-filename=&quot;responseHTTPADUCONesp32ac.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP32&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with WiFi of ADUCON applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- wifi_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dW2ZgT/btrSCGnEs9d/SlX8NT8MAxtSeCh2Ko77y0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dW2ZgT/btrSCGnEs9d/SlX8NT8MAxtSeCh2Ko77y0/img.jpg&quot; data-alt=&quot;ADUCON app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dW2ZgT/btrSCGnEs9d/SlX8NT8MAxtSeCh2Ko77y0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdW2ZgT%2FbtrSCGnEs9d%2FSlX8NT8MAxtSeCh2Ko77y0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;207&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUCON app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for Wifi in the Arduino sketch according to the protocol header settings in the ADUCON app.&lt;/p&gt;
&lt;pre id=&quot;code_1669963224034&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD F(&quot;%%F0&quot;)
#define pwmHD F(&quot;%%F3&quot;)
#define strHD F(&quot;%%F4&quot;)
#define footHD F(&quot;%%F1&quot;)
#define echoHD F(&quot;%%E1&quot;)
#define connectHD F(&quot;%%F8&quot;)
#define optionHD F(&quot;%%F9&quot;)
#define checkHD F(&quot;%%F5&quot;)
#define HDLen 4
#define addHD F(&quot;%%&quot;)
#define addHDLen 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1669963406537&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

if (appConnection) { // If app connection is confirmed
  // Execute code after app connection is confirmed
} else { // Before app connection check
  if (income_wifi == checkHD) { // Check if the value is %%F5 and set the initial settings
    setFirstLogin(false); // Uncheck First Web Login (Do not use web login)
    detectLogout(false); // Uncheck Detect Logout (Do not use logout detection)
    showWebView(false); // Uncheck Web View (Do not display web view button)
    appConnection = true; http_response(); // Confirm the connection of ADUCOM
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iniSet.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xpoXo/btrSHJED6ku/mD01PJmjpAWEYE4kqwj2v1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xpoXo/btrSHJED6ku/mD01PJmjpAWEYE4kqwj2v1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xpoXo/btrSHJED6ku/mD01PJmjpAWEYE4kqwj2v1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxpoXo%2FbtrSHJED6ku%2FmD01PJmjpAWEYE4kqwj2v1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;65&quot; data-filename=&quot;iniSet.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHD(%%F8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;%%F8 + connect&lt;/span&gt;: Transmit the necessary app settings and current Arduino state values through the iniSet() and sendState() functions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;%%F8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;%%F8 + WiFi&lt;/span&gt;: change WiFi setting values&lt;/p&gt;
&lt;pre id=&quot;code_1669963744761&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (income_wifi == F(&quot;connect&quot;)) { iniSet(); sendState(); }
else if (income_wifi == F(&quot;disconnect&quot;)) appConnection = false;  
else if (income_wifi.startsWith(F(&quot;WiFi&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;));  }
else Serial.println(income_wifi);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHD(%%F9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669963775889&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
  else { // if not
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;)); // set the time if the length of the value is less than 10
    else Serial.println(F(&quot;date/time&quot;)); // current date/time if larger
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(%%F0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669963822633&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// income_wifi: Value + %%F1 (with protocol header %%F0 removed)
ed = income_wifi.lastIndexOf(footHD); // check the index number where footHD(%%F1) starts in the value
if (ed != -1) {                       // if the index number is found in the value
  temp = income_wifi.substring(0, ed);//Extract data up to index number
  uint8_t value = temp.toInt();       // convert to numeric value
  pin_control(value);                 // execute the code corresponding to the value
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;pwmHD(%%F3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669963879872&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// income_wifi: %%F3 + Count + %% + Slide Num + Value + %%F1
// Example of 3 values of COLOR PICKER: %%F31%%1255%%F1%%F31%%2133%%F1%%F31%%3123%%F1
ed = income_wifi.indexOf(addHD, HDLen); // Starting index of &quot;%%&quot; after HDLen 4(%%F3)
temp = income_wifi.substring(HDLen, ed); // Extract values from after HDLen 4(%%F3) to before &quot;%%&quot;
int count = temp.toInt(); // convert to numeric value
bool ok = true;
if (count == 0) pwmCount = 0; // If count is 0, reset counter for data verification
if (count &amp;lt; pwmCount) ok = false; // Verify if the data is continuous
else pwmCount = count;
if (ok) { // If data is continuous (unless data is missing due to Wi-Fi connection)
  uint8_t slide = 0; uint16_t value = 0;
  while(income_wifi.indexOf(footHD) != -1) { // Process 3 PWM values of COLOR PICKER
    ed = income_wifi.indexOf(addHD, HDLen)+addHDLen;
    income_wifi. remove(0, ed);
    temp = income_wifi.substring(0, 1);
    slide = temp. toInt();
    ed = income_wifi. indexOf(footHD);
    temp = income_wifi.substring(1, ed);
    value = temp. toInt();
    income_wifi.remove(0, ed+HDLen);
    pwm_control(slide, value);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558035&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558035&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += echoHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the slide state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558035&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {                      
  Data += pwmHD;
  Data += slide;
  Data += pwm_val;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the PWM.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558035&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPwmEcho(uint8_t slide, uint16_t pwm_val) {                          
  Data += pwmHD;
  Data += slide;
  Data += pwm_val;
  Data += echoHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A code example that reflects the status of the current button and PWM values of Arduino to the app when connected to the ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1668667653297&quot; class=&quot;angelscript&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SEND LOCAL STATE AT PRESENT TO APP
void sendState() { 
  sendPinState(10);
  sendPinState(21);
  sendPinState(30);
  sendPinState(41);
  sendPinState(50);
  sendPinState(61);
  sendPinState(71);
  sendPinState(80);
  sendPinState(91);
  sendPinState(101);
  sendPinState(110);
  sendPinState(121);
  sendPinState(130);
  sendPinState(141);
  sendPinState(150);
  sendPwmSlide(1, 110);
  sendPwmSlide(2, 120);
  sendPwmSlide(3, 210);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMO4Sw/btrSFap6Byo/C6KrImeuMYmgy4CJeyBJ30/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMO4Sw/btrSFap6Byo/C6KrImeuMYmgy4CJeyBJ30/img.jpg&quot; data-alt=&quot;Screen reflecting initial state and labels when connecting Arduino&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMO4Sw/btrSFap6Byo/C6KrImeuMYmgy4CJeyBJ30/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMO4Sw%2FbtrSFap6Byo%2FC6KrImeuMYmgy4CJeyBJ30%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;617&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Screen reflecting initial state and labels when connecting Arduino&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558035&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String text) {                               
  Data += strHD;
  Data += text;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. If web login is implemented using the HTML code in Arduino sketch, set to move to the login page when connecting for the first time.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558036&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setFirstLogin(bool val){ 
  Data += connectHD;
  Data += F(&quot;FIR:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;webLogCheck.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzpRTC/btrSHWDPoyV/Ov00k9KSisJAHtNKaFeFa1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzpRTC/btrSHWDPoyV/Ov00k9KSisJAHtNKaFeFa1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzpRTC/btrSHWDPoyV/Ov00k9KSisJAHtNKaFeFa1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzpRTC%2FbtrSHWDPoyV%2FOv00k9KSisJAHtNKaFeFa1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;30&quot; data-filename=&quot;webLogCheck.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. If the control authority is released by a new web login, the Logout status is output as a message.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In case of connecting to the ACCESS POINT (ex. 192.168.4.1) - Administrator&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When connecting via web login from the internal network through a router - General user&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;General user can be disengaged (pushed) by Administrator or another General user.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558036&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void detectLogout(bool val){ 
  Data += connectHD;
  Data += F(&quot;DET:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Set to send the date/time of the Android system When connecting, or request the transmission of the date/time if necessary.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558036&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void requstDateTime(){ 
  Data += connectHD;
  Data += F(&quot;RDT:&quot;); 
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Use when you want to acquire control authority by using the ACCESS POINT password of the module in the internal network connection through the router. (without using HTML web login)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It can be changed to any name through definition of the passName and passNameLen for processing the password in the sketch and the app send datas starting with passName as password value. This is to enhance security.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558036&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define passName F(&quot;PAS:&quot;)
#define passNameLen 4

void requestPass(bool val){ 
  Data += connectHD;
  Data += val;
  Data += passName;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0r12H/btrSHL3CJME/OKJcHPeHBMcIcdk6Y8LfUk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0r12H/btrSHL3CJME/OKJcHPeHBMcIcdk6Y8LfUk/img.jpg&quot; data-alt=&quot;Password dialog&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0r12H/btrSHL3CJME/OKJcHPeHBMcIcdk6Y8LfUk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0r12H%2FbtrSHL3CJME%2FOKJcHPeHBMcIcdk6Y8LfUk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Password dialog&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. If control authority is given through password confirmation, a cookie value is created and transmitted so that control authority for the data transmitted thereafter can be confirmed.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558036&quot; class=&quot;pgsql&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define cooLength 5
String cooValue = &quot;u7Dv0&quot;;

String makeCooValue() {
  cooValue = &quot;&quot;;
  uint8_t temp = 0;
  for (int i = 0; i &amp;lt; cooLength; i++) {
    temp = random(39, 123); //random(39, 123); // 39 ~ 122 pick
    if (temp == 47 || temp == 59 || temp == 60 || temp == 62 || temp == 92 || temp == 94 || temp == 96) temp = 79;
    cooValue += char(temp);
  }
  Serial.print(&quot;coo: &quot;); Serial.println(cooValue);
  return cooValue;
}

void responsePass(bool val){ 
  Data += connectHD;
  Data += F(&quot;RES:&quot;);
  if (val) Data += makeCooValue(); 
  else Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba6k9h/btrSHjzNp1W/F3ShYAVSMSazeVDnurO2xk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba6k9h/btrSHjzNp1W/F3ShYAVSMSazeVDnurO2xk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba6k9h/btrSHjzNp1W/F3ShYAVSMSazeVDnurO2xk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba6k9h%2FbtrSHjzNp1W%2FF3ShYAVSMSazeVDnurO2xk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;42&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5jl0C/btrSHuuhG42/OecZt1Uk4FZFB46zF3xNV0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5jl0C/btrSHuuhG42/OecZt1Uk4FZFB46zF3xNV0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5jl0C/btrSHuuhG42/OecZt1Uk4FZFB46zF3xNV0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5jl0C%2FbtrSHuuhG42%2FOecZt1Uk4FZFB46zF3xNV0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Sends information about the current Wi-Fi connection so that the user can view and edit information in the app about the Wi-Fi connection.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558037&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendWifiInfo(){ 
  Data += connectHD;
  Data += F(&quot;INF:&quot;);
  Data += ssidAP;
  Data += ',';
  Data += passAP;
  Data += ',';
  Data += ap;
  Data += ',';
  Data += wifiRouter;
  Data += ',';
  Data += ssid;
  Data += ',';
  Data += pass;
  Data += ',';
  Data += ip;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558037&quot; class=&quot;armasm&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendMessage(String str){ 
  Data += connectHD;
  Data += F(&quot;MES:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxo2eI/btrSHMaoZ4q/DFqKzPtyTJllFFkmX8rXPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxo2eI/btrSHMaoZ4q/DFqKzPtyTJllFFkmX8rXPk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxo2eI/btrSHMaoZ4q/DFqKzPtyTJllFFkmX8rXPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxo2eI%2FbtrSHMaoZ4q%2FDFqKzPtyTJllFFkmX8rXPk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Disable the feature, which is default setting, of automatically resend the value When a button or SeekBar (slide bar) is changed in the app and then if a response failure error occurs.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It is used when the Arduino intentionally does not respond due to the delay that occurs when sending data using the AT command to the ESP01.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558037&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void responseFailResend(bool val) {
  Data += connectHD;
  Data += F(&quot;RFR:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558037&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ 
  Data += connectHD;
  Data += F(&quot;DIS&quot;);
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mi2nS/btrSIsiaAj7/kGCgR6B5IXfM0TvpoHsHm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mi2nS/btrSIsiaAj7/kGCgR6B5IXfM0TvpoHsHm1/img.png&quot; data-alt=&quot;Disconnect Button for WiFi&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mi2nS/btrSIsiaAj7/kGCgR6B5IXfM0TvpoHsHm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmi2nS%2FbtrSIsiaAj7%2FkGCgR6B5IXfM0TvpoHsHm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;83&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button for WiFi&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Set the function to continuously transmit the changed value of the SeekBar (slide bar) according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Slide Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Slide Mode&lt;/span&gt; (transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1668667558038&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveSlide(bool val){ 
  Data += optionHD;
  Data += F(&quot;ACT:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1Mr9n/btrSHi1X4Ge/IZVY5yuGTY42TZMnTkvTL1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1Mr9n/btrSHi1X4Ge/IZVY5yuGTY42TZMnTkvTL1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1Mr9n/btrSHi1X4Ge/IZVY5yuGTY42TZMnTkvTL1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1Mr9n%2FbtrSHi1X4Ge%2FIZVY5yuGTY42TZMnTkvTL1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;30&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Set transmission interval of ACTIVE SLIDE MODE. (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1668667558038&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setSlideInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;SLI:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Activate a timer that sends checkHD(%%F5) at regular time intervals.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Regardless of the app, it is used to reflect independently changed values in the Arduino to the app.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558038&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequest(bool val){ 
  Data += optionHD;
  Data += F(&quot;REQ:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_read.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLnAOC/btrSFaKpimK/LyJknJC9TJqYvwT7jALlM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLnAOC/btrSFaKpimK/LyJknJC9TJqYvwT7jALlM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLnAOC/btrSFaKpimK/LyJknJC9TJqYvwT7jALlM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLnAOC%2FbtrSFaKpimK%2FLyJknJC9TJqYvwT7jALlM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;86&quot; data-filename=&quot;edited_read.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set the operation interval of the timer sending checkHD(%%F5). (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1668667558038&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequestInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;INT:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XSJXA/btrSE95MTXi/HyhiuguPIm9Rg6YdBrcHv1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XSJXA/btrSE95MTXi/HyhiuguPIm9Rg6YdBrcHv1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XSJXA/btrSE95MTXi/HyhiuguPIm9Rg6YdBrcHv1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXSJXA%2FbtrSE95MTXi%2FHyhiuguPIm9Rg6YdBrcHv1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;26&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558038&quot; class=&quot;fortran&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2: show name &amp;amp; pass // defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  Data += optionHD;
  Data += F(&quot;SLM:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chnt6h/btrSGVlEmOp/yv7ev342L8oJbVFTTRtdd0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chnt6h/btrSGVlEmOp/yv7ev342L8oJbVFTTRtdd0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chnt6h/btrSGVlEmOp/yv7ev342L8oJbVFTTRtdd0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchnt6h%2FbtrSGVlEmOp%2Fyv7ev342L8oJbVFTTRtdd0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;384&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. Display the button to go to the webview page where you can see the HTML Page coded in Arduino.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;webViewicon.jpg&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bErvYS/btrSHWw40gV/BMsAQAsk0oZbwjcqfg4fV0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bErvYS/btrSHWw40gV/BMsAQAsk0oZbwjcqfg4fV0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bErvYS/btrSHWw40gV/BMsAQAsk0oZbwjcqfg4fV0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbErvYS%2FbtrSHWw40gV%2FBMsAQAsk0oZbwjcqfg4fV0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;58&quot; data-filename=&quot;webViewicon.jpg&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558039&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void showWebView(bool val){ 
  Data += optionHD;
  Data += F(&quot;SWV:&quot;); 
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21. Display additional push buttons in the main menu area. (it is possible to control only at Arduino)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKXe3S/btrSEefanmP/KK92FtifwbF5KBpWJIMISk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKXe3S/btrSEefanmP/KK92FtifwbF5KBpWJIMISk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKXe3S/btrSEefanmP/KK92FtifwbF5KBpWJIMISk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKXe3S%2FbtrSEefanmP%2FKK92FtifwbF5KBpWJIMISk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;57&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558039&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void showDialogMenu(bool val){ 
  Data += optionHD;
  Data += F(&quot;SDM:&quot;); 
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22. Change the main screen to Color Picker / Pwm Nob screen from Arduino. (generally set in the options of the app)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzCce3/btrSGSP4zH7/ntDsyPglIWd7tijC4X0PUK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzCce3/btrSGSP4zH7/ntDsyPglIWd7tijC4X0PUK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzCce3/btrSGSP4zH7/ntDsyPglIWd7tijC4X0PUK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzCce3%2FbtrSGSP4zH7%2FntDsyPglIWd7tijC4X0PUK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;71&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uint8_t: list below&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: Display buttons and SeekBar (slide bar) on the main screen&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Display Color_Picker on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Display Color_Picker and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Display PWM Nob on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4: Display PWM Nob and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;String&lt;/span&gt;: name of the group&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;bool&lt;/span&gt;: Sets whether to display the SeekBar (slide bar) when the main screen buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* true&lt;/span&gt;: SeekBar (slide bar) is also displayed when button is displayed or Pwm Nob is displayed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* false&lt;/span&gt;: SeekBar (slide bar) is not displayed when button is displayed and SeekBar (slide bar) is displayed only when Pwm Nob is displayed&lt;/p&gt;
&lt;pre id=&quot;code_1668667558039&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPMain) { 
  Data += optionHD;
  Data += F(&quot;CNB:&quot;);
  Data += String(val); Data += ','; 
  Data += group1; Data += ','; 
  Data += group2; Data += ','; 
  Data += pwmDPMain;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23. Set the main screen display of the app.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set to 0 or 1 in order depending on whether buttons 1 to 15, SeekBar (slide bar) 1 to 6, text input, and floating buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: hidden 1: visible&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cExXIX/btrSF70VRpJ/O2LCUHDZaICYAys4zmbos1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cExXIX/btrSF70VRpJ/O2LCUHDZaICYAys4zmbos1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cExXIX/btrSF70VRpJ/O2LCUHDZaICYAys4zmbos1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcExXIX%2FbtrSF70VRpJ%2FO2LCUHDZaICYAys4zmbos1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;307&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558039&quot; class=&quot;armasm&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;///////////////////////// SET MAIN DISPLAY 0:hide 1:display
//F(&quot;111111111111111&quot;  // button 1 ~ 15
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ 
  Data += optionHD;
  Data += F(&quot;SDP:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;24. Set labels for buttons and SeekBar.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Label buttons 1 to 15 and SeekBar (slide bar) 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q05Lm/btrSHWRnLnW/foIOp8dGk39sKoJGXFxCw1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q05Lm/btrSHWRnLnW/foIOp8dGk39sKoJGXFxCw1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q05Lm/btrSHWRnLnW/foIOp8dGk39sKoJGXFxCw1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ05Lm%2FbtrSHWRnLnW%2FfoIOp8dGk39sKoJGXFxCw1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;286&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558040&quot; class=&quot;armasm&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;) // slider 1 ~ 6
void setButtonLabel(String str){ 
  Data += optionHD;
  Data += F(&quot;ABL:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;25. Set the button's toggle/push properties.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set the button properties to 0 or 1 in order of buttons 1 to 15.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0: Push&lt;/span&gt;&amp;nbsp;1: Toggle&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MProL/btrSHwyUdgv/X8hXJNaBmxJ8IEDLEaRanK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MProL/btrSHwyUdgv/X8hXJNaBmxJ8IEDLEaRanK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MProL/btrSHwyUdgv/X8hXJNaBmxJ8IEDLEaRanK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMProL%2FbtrSHwyUdgv%2FX8hXJNaBmxJ8IEDLEaRanK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;340&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558040&quot; class=&quot;armasm&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;BTG:&quot;);
  Data += str;  
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;26. Set the maximum/minimum values of the SeekBar (slide bar).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SeekBar (slide bar) Specifies the maximum/minimum values from 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yItix/btrSHuODcdQ/VDWA7TkLgaSiT71ssCkvx1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yItix/btrSHuODcdQ/VDWA7TkLgaSiT71ssCkvx1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yItix/btrSHuODcdQ/VDWA7TkLgaSiT71ssCkvx1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyItix%2FbtrSHuODcdQ%2FVDWA7TkLgaSiT71ssCkvx1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;249&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558040&quot; class=&quot;armasm&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  Data += optionHD;
  Data += F(&quot;MNM:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;27. Set the title of the Arduino sketch.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N3ZBU/btrSHYBEN3Q/HF7iXxxJneeE9mtP3usKgK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N3ZBU/btrSHYBEN3Q/HF7iXxxJneeE9mtP3usKgK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N3ZBU/btrSHYBEN3Q/HF7iXxxJneeE9mtP3usKgK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN3ZBU%2FbtrSHYBEN3Q%2FHF7iXxxJneeE9mtP3usKgK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;27&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//title: Test Mode
//text: Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;
void setAppTitleMessage(String title, String text){
  Data += optionHD;
  Data += F(&quot;ATM:&quot;); 
  Data += title; Data += ','; 
  Data += text; 
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpRrOy/btrSHKDE9GM/Ux0jjTvJFCwoUgsJ4ow8yk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpRrOy/btrSHKDE9GM/Ux0jjTvJFCwoUgsJ4ow8yk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpRrOy/btrSHKDE9GM/Ux0jjTvJFCwoUgsJ4ow8yk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpRrOy%2FbtrSHKDE9GM%2FUx0jjTvJFCwoUgsJ4ow8yk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;489&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;28. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; selection index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  Data += optionHD;
  Data += F(&quot;RAD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; Data += ':';
  Data += String(selection);
  Data += '\n';
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2DU8D/btrSHW4Uf19/EwYzluCf5Ju2Njk4Es6hQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2DU8D/btrSHW4Uf19/EwYzluCf5Ju2Njk4Es6hQ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2DU8D/btrSHW4Uf19/EwYzluCf5Ju2Njk4Es6hQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2DU8D%2FbtrSHW4Uf19%2FEwYzluCf5Ju2Njk4Es6hQ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;29. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;CKB:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGQzt5/btrSF59UQdl/zisuW7n1cNQeYL3CRvrhPK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGQzt5/btrSF59UQdl/zisuW7n1cNQeYL3CRvrhPK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGQzt5/btrSF59UQdl/zisuW7n1cNQeYL3CRvrhPK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGQzt5%2FbtrSF59UQdl%2FzisuW7n1cNQeYL3CRvrhPK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;30. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  Data += optionHD;
  Data += F(&quot;CHD:&quot;); 
  Data += String(id); Data += ':'; 
  Data += message; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkcdMM/btrSE6VuuOa/jveIjYErZaQmuDkQ4mbkkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkcdMM/btrSE6VuuOa/jveIjYErZaQmuDkQ4mbkkK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkcdMM/btrSE6VuuOa/jveIjYErZaQmuDkQ4mbkkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkcdMM%2FbtrSE6VuuOa%2FjveIjYErZaQmuDkQ4mbkkK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;31. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;LSD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/conm7x/btrSHuujIYf/p731aAnLSKFsw4Qj55ipxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/conm7x/btrSHuujIYf/p731aAnLSKFsw4Qj55ipxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/conm7x/btrSHuujIYf/p731aAnLSKFsw4Qj55ipxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fconm7x%2FbtrSHuujIYf%2Fp731aAnLSKFsw4Qj55ipxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;429&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;32. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1668667558042&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  Data += optionHD;
  Data += F(&quot;STR:&quot;); 
  Data += String(id); Data += ':'; 
  Data += title; 
  Data += '\n';
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTQBXq/btrSHVdQGwO/kjQNr1jOnUFwlr6PCPrbF1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTQBXq/btrSHVdQGwO/kjQNr1jOnUFwlr6PCPrbF1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTQBXq/btrSHVdQGwO/kjQNr1jOnUFwlr6PCPrbF1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTQBXq%2FbtrSHVdQGwO%2FkjQNr1jOnUFwlr6PCPrbF1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.ESP32_WIFI_HMI_CONTROL.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/nHiNL/btrSJYg2BZL/WRxoLVyUuPHkzMH2KsRAK1/1.ESP32_WIFI_HMI_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1.ESP32_WIFI_HMI_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.ESP8266_WIFI_HMI_CONTROL.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bSITJO/btrSJXJbUkg/XWK2vqYnVG9Y0NiKWRtjFk/1.ESP8266_WIFI_HMI_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1.ESP8266_WIFI_HMI_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/2xkX0Wk-ePo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/2xkX0Wk-ePo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/2xkX0Wk-ePo&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669978328833&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;WiFi.h&amp;gt;
#include &amp;lt;WiFiClient.h&amp;gt;
#include &amp;lt;WiFiAP.h&amp;gt;

WiFiServer server(80);
WiFiClient client;

const char ssidAP[] = &quot;Esp32&quot;;   // your network SSID (name)
const char passAP[] = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password
const char ssid[] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
const char pass[] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

bool wifiRouter = true;          // Whether or not there is a router connection
String ap = &quot;&quot;;
String ip = &quot;&quot;;

String Data = &quot;&quot;;
#include &quot;protocol.h&quot;

String toStringIp(IPAddress ip) {  // convert ip address to string
  String res = &quot;&quot;;
  for (int i = 0; i &amp;lt; 3; i++) res += String((ip &amp;gt;&amp;gt; (8 * i)) &amp;amp; 0xFF) + &quot;.&quot;;
  res += String(((ip &amp;gt;&amp;gt; 8 * 3)) &amp;amp; 0xFF);
  return res;
}

void setup() {
  Serial.begin(115200);
  if (wifiRouter) WiFi.mode(WIFI_AP_STA);  
  else WiFi.mode(WIFI_AP);
  WiFi.softAP(ssidAP, passAP);
  ap = toStringIp(WiFi.softAPIP());
  Serial.print(F(&quot;AP address: &quot;));
  Serial.println(ap);
  if (wifiRouter) {
    if (pass == &quot;&quot;) WiFi.begin(ssid);
    else WiFi.begin(ssid, pass);    // Connect to WPA/WPA2 network
    uint8_t wifi_count = 0;
    while (WiFi.status() != WL_CONNECTED) {
          delay(200); Serial.print(F(&quot;.&quot;));
          wifi_count++;
          if (wifi_count == 50) break;
    }
    delay(10);
    ip = toStringIp(WiFi.localIP());
    Serial.print(F(&quot;IP address: &quot;));
    Serial.println(ip);
  }
  server.begin();
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(F(&quot;button 1 : on&quot;));
               sendPinEcho(value);
               sendText(F(&quot;1: ON&quot;)); 
                  break;
      case 10: Serial.println(F(&quot;button 1 : off&quot;));
               sendText(F(&quot;1: OFF&quot;)); 
               sendPinEcho(value);
                  break;
      case 21: Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 51: Serial.println(F(&quot;button 5 : on&quot;));
                  break;
      case 50: Serial.println(F(&quot;button 5 : off&quot;));
                  break;
      case 61: Serial.println(F(&quot;button 6 : on&quot;));
                  break;
      case 60: Serial.println(F(&quot;button 6 : off&quot;));
                  break;
      case 71: Serial.println(F(&quot;button 7 : on&quot;));
                  break;
      case 70: Serial.println(F(&quot;button 7 : off&quot;));
                  break;
      case 81: Serial.println(F(&quot;button 8 : on&quot;));
                  break;
      case 80: Serial.println(F(&quot;button 8 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(F(&quot;button 10 : on&quot;));
                  break;
      case 100: Serial.println(F(&quot;button 10 : off&quot;));
                  break;  
      case 111: Serial.println(F(&quot;button 11 : on&quot;));
                  break;
      case 110: Serial.println(F(&quot;button 11 : off&quot;));
                  break;  
      case 121: Serial.println(F(&quot;button 12 : on&quot;));
                  break;
      case 120: Serial.println(F(&quot;button 12 : off&quot;));
                  break;                  
      case 131: Serial.println(F(&quot;button 13 : on&quot;));
                  break;  
      case 130: Serial.println(F(&quot;button 13 : off&quot;));
                  break;  
      case 141: Serial.println(F(&quot;button 14 : on&quot;));
                  break;  
      case 140: Serial.println(F(&quot;button 14 : off&quot;));
                  break;  
      case 151: Serial.println(F(&quot;button 15 : on&quot;));
                  break;  
      case 150: Serial.println(F(&quot;button 15 : off&quot;));
                  break;         
      case 161: Serial.println(F(&quot;button 16 : click&quot;));
                  break; 
      case 171: Serial.println(F(&quot;button 17 : click&quot;));
                  break;
      case 181: Serial.println(F(&quot;button 18 : click&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : click&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : click&quot;));
                  break;                       
    }
  }
}

void pwm_control(uint8_t num, uint16_t value) {
  if (num == 1) {  // SeekBar (slide bar) 1
    sendPwmEcho(num, value); 
    Serial.print(F(&quot;pwm1: &quot;)); Serial.println(value);
  } else if (num == 2) { // SeekBar (slide bar) 2
    sendPwmEcho(num, value);
    Serial.print(F(&quot;pwm2: &quot;)); Serial.println(value);
  } else if (num == 3) {  // SeekBar (slide bar) 3
    sendPwmEcho(num, value);
    Serial.print(F(&quot;pwm3: &quot;)); Serial.println(value);
  } else if (num == 4) {  // SeekBar (slide bar) 4
    Serial.print(F(&quot;pwm4: &quot;)); Serial.println(value);
  } else if (num == 5) {  // SeekBar (slide bar) 5
    Serial.print(F(&quot;pwm5: &quot;)); Serial.println(value);
  } else if (num == 6) {  // SeekBar (slide bar) 6
    Serial.print(F(&quot;pwm6: &quot;)); Serial.println(value);
  }
}

bool appConnection = false;
String income_wifi = &quot;&quot;; // storage variable for received string with WiFi
uint16_t pwmCount = 2;

void wifi_read() { 
  client = server.available(); 
  while (client.connected()) {
    if(client.available()) {     
      income_wifi = client.readStringUntil('\r');
      if (income_wifi.startsWith(F(&quot;GET&quot;))) income_wifi.remove(0,5); // remove &quot;GET /&quot; 
      if (!income_wifi.startsWith(F(&quot;favi&quot;))) {                      // favicon.ico pass
        int ed = income_wifi.lastIndexOf(F(&quot;HTTP/1.1&quot;));
        income_wifi.remove(ed-1);
        if (appConnection) { 
          String temp = income_wifi.substring(0, HDLen);
          uint8_t order = 0;
          if (temp == checkHD) order = 1;
          else if (temp == pwmHD) order = 2;
          else if (temp == pinHD) order = 3;
          else if (temp == connectHD) order = 4;
          else if (temp == optionHD) order = 5; 
          if (order &amp;gt; 2) income_wifi.remove(0, HDLen);   // Remove protocol header
          if (order == 1) { // %%F5
            
          } else if (order == 2) { // %%F3
            ed = income_wifi.indexOf(addHD, HDLen);
            temp = income_wifi.substring(HDLen, ed);
            int count = temp.toInt();
            bool ok = true;
            if (count == 0) pwmCount = 0;
            if (count &amp;lt; pwmCount) ok = false;
            else pwmCount = count;
            if (ok) {
              uint8_t slide = 0; uint16_t value = 0;
              while(income_wifi.indexOf(footHD) != -1) {
                ed = income_wifi.indexOf(addHD, HDLen)+addHDLen;
                income_wifi.remove(0, ed);
                temp = income_wifi.substring(0, 1);
                slide = temp.toInt();
                ed = income_wifi.indexOf(footHD);
                temp = income_wifi.substring(1, ed);
                value = temp.toInt();
                income_wifi.remove(0, ed+HDLen);
                pwm_control(slide, value);
              }
            } 
          } else if (order == 3) { // %%F0
            ed = income_wifi.lastIndexOf(footHD);
            if (ed != -1) {
              temp = income_wifi.substring(0, ed);
              uint8_t value = temp.toInt();
              pin_control(value);
            }
          } else if (order == 4) { // %%F8
            if (income_wifi == F(&quot;connect&quot;)) { iniSet(); send_iniState(); }
            else if (income_wifi == F(&quot;disconnect&quot;)) appConnection = false;  
            else if (income_wifi.startsWith(F(&quot;WiFi&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); } 
            else Serial.println(income_wifi);
          } else if (order == 5) { // %%F9
            income_wifi.replace(F(&quot;%20&quot;), F(&quot; &quot;)); // URL Encoding space character change
            CheckF9(income_wifi);
          } else { // order == 0
            income_wifi.replace(F(&quot;%20&quot;), F(&quot; &quot;)); // URL Encoding space character change
            Serial.println(income_wifi);
          }
          http_response();
        } else {
          if (income_wifi == checkHD) { 
            setFirstLogin(false); detectLogout(false); showWebView(false);
            appConnection = true; http_response(); 
          }
        }
      }
      income_wifi = &quot;&quot;;
      break;
    } else break;
  }
}

unsigned long int one_millis = 0;

void wifi_delay() { // Check client connection and receive data every 10 milliseconds
  if (millis() - one_millis &amp;gt; 10) {
    one_millis = millis();
    wifi_read();
  }
}

void loop() {
  wifi_delay(); 
  if(Serial.available()) { // If there is data in the serial buffer
    String temp = Serial.readStringUntil('\n'); // Serial Monitor - NEW LINE option
    Serial.println(temp);
    if(temp == &quot;on&quot;){  
      Serial.println(&quot;ON&quot;);
      sendPinState(11);     
      sendText(&quot;ON&quot;);    
    } else if(temp == &quot;off&quot;){ 
      Serial.println(&quot;OFF&quot;);
      sendText(&quot;OFF&quot;);
      sendPinState(10);      
    } else if(temp == &quot;1&quot;){   
      
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669978627966&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD F(&quot;%%F0&quot;)
#define pwmHD F(&quot;%%F3&quot;)
#define strHD F(&quot;%%F4&quot;)
#define footHD F(&quot;%%F1&quot;)
#define echoHD F(&quot;%%E1&quot;)
#define connectHD F(&quot;%%F8&quot;)
#define optionHD F(&quot;%%F9&quot;)
#define checkHD F(&quot;%%F5&quot;)
#define HDLen 4
#define addHD F(&quot;%%&quot;)
#define addHDLen 2

// SEND PIN VALUE
void sendPinState(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += footHD;
  Data += '\n';
}

// SEND PIN ECHO
void sendPinEcho(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += echoHD;
  Data += '\n';
}

// SEND SLIDE VALUE - USE AT PASSIVE SLIDE MODE
void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {                      
  Data += pwmHD;
  Data += slide;
  Data += pwm_val;
  Data += footHD;
  Data += '\n';
}

// SEND SLIDE ECHO - ESP01: USE AT PASSIVE SLIDE MODE
void sendPwmEcho(uint8_t slide, uint16_t pwm_val) {                          
  Data += pwmHD;
  Data += slide;
  Data += pwm_val;
  Data += echoHD;
  Data += '\n';
}

// SEND TEXT
void sendText(String text) {                               
  Data += strHD;
  Data += text;
  Data += footHD;
  Data += '\n';
}

///////////////////////////////////////// CONNECTION 
void setFirstLogin(bool val){ 
  Data += connectHD;
  Data += F(&quot;FIR:&quot;);
  Data += val;
  Data += '\n';
}

void detectLogout(bool val){ 
  Data += connectHD;
  Data += F(&quot;DET:&quot;);
  Data += val;
  Data += '\n';
}

void requstDateTime(){ 
  Data += connectHD;
  Data += F(&quot;RDT:&quot;); 
  Data += '\n';
}

//#define passName F(&quot;PAS:&quot;)
//#define passNameLen 4
//
//void requestPass(bool val){ 
//  Data += connectHD;
//  Data += val;
//  Data += passName;
//  Data += '\n';
//}
//
//#define cooLength 5
//String cooValue = &quot;u7Dv0&quot;;
//
//String makeCooValue() {
//  cooValue = &quot;&quot;;
//  uint8_t temp = 0;
//  for (int i = 0; i &amp;lt; cooLength; i++) {
//    temp = random(39, 123); //random(39, 123); // 39 ~ 122 pick
//    if (temp == 47 || temp == 59 || temp == 60 || temp == 62 || temp == 92 || temp == 94 || temp == 96) temp = 79;
//    cooValue += char(temp);
//  }
//  Serial.print(&quot;coo: &quot;); Serial.println(cooValue);
//  return cooValue;
//}
//
//void responsePass(bool val){ 
//  Data += connectHD;
//  Data += F(&quot;RES:&quot;);
//  if (val) Data += makeCooValue(); 
//  else Data += val;
//  Data += '\n';
//}

void sendWifiInfo(){ 
  Data += connectHD;
  Data += F(&quot;INF:&quot;);
  Data += ssidAP;
  Data += ',';
  Data += passAP;
  Data += ',';
  Data += ap;
  Data += ',';
  Data += wifiRouter;
  Data += ',';
  Data += ssid;
  Data += ',';
  Data += pass;
  Data += ',';
  Data += ip;
  Data += '\n';
}

void sendMessage(String str){ 
  Data += connectHD;
  Data += F(&quot;MES:&quot;);
  Data += str;
  Data += '\n';
}

// defalt: true
void responseFailResend(bool val) {
  Data += connectHD;
  Data += F(&quot;RFR:&quot;);
  Data += val;
  Data += '\n';
}

void sendDisconnect(){ 
  Data += connectHD;
  Data += F(&quot;DIS&quot;);
  Data += '\n';
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveSlide(bool val){ 
  Data += optionHD;
  Data += F(&quot;ACT:&quot;);
  Data += val;
  Data += '\n';
}

void setSlideInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;SLI:&quot;);
  Data += val;
  Data += '\n';
}

void setRequest(bool val){ 
  Data += optionHD;
  Data += F(&quot;REQ:&quot;);
  Data += val;
  Data += '\n';
}

void setRequestInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;INT:&quot;);
  Data += val;
  Data += '\n';
}

void setSSIDLabelMode(uint8_t val) { // 0: not use, 1: show only name, 2: show name &amp;amp; pass // defalult: 2
  Data += optionHD;
  Data += F(&quot;SLM:&quot;);
  Data += val;
  Data += '\n';
}

void showWebView(bool val){ 
  Data += optionHD;
  Data += F(&quot;SWV:&quot;); 
  Data += val;
  Data += '\n';
}

void showDialogMenu(bool val){ 
  Data += optionHD;
  Data += F(&quot;SDM:&quot;); 
  Data += val;
  Data += '\n';
}

//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPSync) { 
  Data += optionHD;
  Data += F(&quot;CNB:&quot;);
  Data += String(val); Data += ','; 
  Data += group1; Data += ','; 
  Data += group2; Data += ','; 
  Data += pwmDPSync;
  Data += '\n';
}

///////////////////////// SET MAIN DISPLAY
//F(&quot;111111111111111&quot;  // button 1 ~ 15, 0:hide 1:display
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ // must after setLeftPadMode(uint8_t val)
  Data += optionHD;
  Data += F(&quot;SDP:&quot;);
  Data += str;
  Data += '\n';
}

//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;) // slider 1 ~ 6
void setButtonLabel(String str){ 
  Data += optionHD;
  Data += F(&quot;ABL:&quot;);
  Data += str;
  Data += '\n';
}

//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;BTG:&quot;);
  Data += str;  
  Data += '\n';
}

//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  Data += optionHD;
  Data += F(&quot;MNM:&quot;);
  Data += str;
  Data += '\n';
}

void setAppTitleMessage(String title, String text){
  Data += optionHD;
  Data += F(&quot;ATM:&quot;); 
  Data += title; Data += ','; 
  Data += text; 
  Data += '\n';
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  Data += optionHD;
  Data += F(&quot;RAD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; Data += ':';
  Data += String(selection);
  Data += '\n';
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;CKB:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  Data += optionHD;
  Data += F(&quot;CHD:&quot;); 
  Data += String(id); Data += ':'; 
  Data += message; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;LSD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  Data += optionHD;
  Data += F(&quot;STR:&quot;); 
  Data += String(id); Data += ':'; 
  Data += title; 
  Data += '\n';
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  sendWifiInfo(); 
  setDisplay(F(&quot;111111111111111&quot; // button 1 ~ 15, 0:hide 1:display
               &quot;111111&quot;          // slider 1 ~ 6
               &quot;11&quot;));           // Text Input/Floating Button
  setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), true);
  setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,&quot;
                   &quot;BT12,BT13,BT14,BT15,PW1,PW2,PW3,PW4,PW5,PW6&quot;));
  setButtonToggle(F(&quot;111111111111111&quot;));  // button 1 ~ 15, 0:push 1:toggle 
  setMinMax(F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)); // slider 1 ~ 6
  setAppTitleMessage(F(&quot;Test Mode&quot;),                    //Title
  F(&quot;Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;매뉴얼&amp;lt;br/&amp;gt;&quot; //Message
    &quot;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;&quot;
    &quot;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;&quot;));
  setActiveSlide(true); setSlideInterval(100);
  setRequest(false); //setRequestInterval(1000);
}

// SEND LOCAL STATE AT PRESENT TO APP
void send_iniState() { // 현재 상태값
  sendPinState(10);
  sendPinState(21);
  sendPinState(30);
  sendPinState(41);
  sendPinState(50);
  sendPinState(61);
  sendPinState(71);
  sendPinState(80);
  sendPinState(91);
  sendPinState(101);
  sendPinState(110);
  sendPinState(121);
  sendPinState(130);
  sendPinState(141);
  sendPinState(150);
  sendPwmSlide(1, 110);
  sendPwmSlide(2, 120);
  sendPwmSlide(3, 210);
  sendPwmSlide(4, 0);
  sendPwmSlide(5, 0);
  sendPwmSlide(6, 0);
}

void http_response() {
  client.println(F(&quot;HTTP/1.1 200 OK\n&quot;));
  client.print(Data);
  Data = &quot;&quot;;
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
  else {  
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUCON app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUCON app settings: label/toggle properties, use of the timer for checkHD(%%F5), Slide Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1669980320949&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  sendWifiInfo();
  setDisplay(F(&quot;111111111111111&quot; // button 1 ~ 15, 0:hide 1:display
               &quot;111111&quot;          // slider 1 ~ 6
               &quot;11&quot;));           // Text Input/Floating Button
  setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); // Set Color Picker and Pwm Nob
  setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,&quot; // set labels
                   &quot;BT12,BT13,BT14,BT15,PW1,PW2,PW3,PW4,PW5,PW6&quot;));
  setButtonToggle(F(&quot;111111111111111&quot;)); // button 1 ~ 15, toggle setting, 0:push 1:toggle
  setMinMax(F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)); // slider 1 ~ 6
  setAppTitleMessage(F(&quot;Test Mode&quot;), // Change title for Arduino code on the app
  F(&quot;Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&quot; //Message
    &quot;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;&quot;
    &quot;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;&quot;));
  setActiveSlide(true); setSlideInterval(100);   // Active Slide Mode
  setRequest(false); //setRequestInterval(1000); // Disable timer for check(%%F5)
  showDialogMenu(true); // show menu button
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the screen number (pageId).&lt;/p&gt;
&lt;pre id=&quot;code_1669980552029&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (pageId == 4) Serial.println(F(&quot;전원 : on&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;));
                  break;
      case 10: if (pageId == 4) Serial.println(F(&quot;전원 : off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (pageId == 4) { Serial.println(F(&quot;모터1 : on&quot;)); sendPinState(30); }
               else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (pageId == 4) Serial.println(F(&quot;모터1 : off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (pageId == 4) { Serial.println(F(&quot;모터2 : on&quot;)); sendPinState(20); }
               else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (pageId == 4) Serial.println(F(&quot;모터2 : off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 201: Serial.println(F(&quot;MENU : click&quot;));
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,Dial Nob,Color Picker,Key Pad,Arrow Pad,Main&quot;));
                  break;                       
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1669980760998&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t pageId = 0;  // screen number

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }         // radio button
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }    // Checkbox
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }    // Select button
  else if (temp.startsWith(F(&quot;LSD&quot;))) {       // List Window
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;Dial&quot;))) {           // Dial Nob screen 
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(4, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 1; 
      } else if (temp.startsWith(F(&quot;Color&quot;))) {   // Color Picker screen
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(2, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 2; 
      } else if (temp.startsWith(F(&quot;Key&quot;))) {     // Key Pad screen
        if (pageId &amp;lt;= 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111111111100011111110&quot;)); 
        setButtonToggle(F(&quot;000000000000111&quot;));
        setButtonLabel(F(&quot;1,2,3,4,5,6,7,8,9,*,0,#&quot;));
        pageId = 3;
      } else if (temp.startsWith(F(&quot;Arrow&quot;))) {   // Arrow Pad screen
        if (pageId &amp;lt;= 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111101010101011111110&quot;)); 
        setButtonToggle(F(&quot;111111000000000&quot;));
        setButtonLabel(F(&quot;Power,Motor1,Moror2,BT4,BT5,BT6,7,Up,9,Left,0,Right,0,Down&quot;));
        pageId = 4;
      } else {                                    // Main screen
        if (pageId &amp;lt;= 2) { setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 0; }
        setDisplay(F(&quot;11111111111111111111111&quot;));
        setButtonToggle(F(&quot;111111111111111&quot;));
        setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15&quot;));
        send_State();
        pageId = 0;
      }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }       // Input text
  else {  
    if (temp.length() &amp;lt; 6) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1.ESP32_WIFI_HMI_CONTROL_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bZwnYo/btrSHiBLwZW/Cg6GvSKoQPTQxeD1dyvBe0/1-1.ESP32_WIFI_HMI_CONTROL_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1-1.ESP32_WIFI_HMI_CONTROL_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1.ESP8266_WIFI_HMI_CONTROL_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bYno9t/btrSIRbWY5l/CBBHKlZ5EauFGSM0GLFAG0/1-1.ESP8266_WIFI_HMI_CONTROL_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1-1.ESP8266_WIFI_HMI_CONTROL_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/SNPHeavhEys&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/SNPHeavhEys&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/SNPHeavhEys&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Web Manager&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can change the ID and password for access point and router connection using HTML coded in Arduino.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wifiManager.jpg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lDe1a/btrSJnn5dpZ/xVFFVHyKZgXpnwxH6Jmfek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lDe1a/btrSJnn5dpZ/xVFFVHyKZgXpnwxH6Jmfek/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lDe1a/btrSJnn5dpZ/xVFFVHyKZgXpnwxH6Jmfek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlDe1a%2FbtrSJnn5dpZ%2FxVFFVHyKZgXpnwxH6Jmfek%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;290&quot; data-filename=&quot;wifiManager.jpg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Changed the variable type from const char to char so that the SSID and password for connecting to the router can be changed in the loop() function.&lt;/p&gt;
&lt;pre id=&quot;code_1669981928460&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char ssid[21] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
char pass[21] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SPIFFS Setting&lt;/p&gt;
&lt;pre id=&quot;code_1669981958589&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool saveConfig() {  // Write ID and Password
  String value = ssid;
  value += ','; value += pass;
  value += ','; value += wifiRouter; 
  File configFile = SPIFFS.open(F(&quot;/config.txt&quot;), &quot;w&quot;);
  if (!configFile) {
    Serial.println(F(&quot;Failed to open config file for writing&quot;));
    return false;
  } else {
    configFile.println(value); // save at config.txt including '\n'
    configFile.close();
    return true; 
  }
}

bool loadConfig() {  // Read ID and Password
  File configFile = SPIFFS.open(F(&quot;/config.txt&quot;), &quot;r&quot;);
  if (!configFile) {
    Serial.println(F(&quot;Failed to open config file&quot;));
    return false;
  } else {
    String temp = configFile.readStringUntil(',');
    for (int i = 0; i &amp;lt; temp.length(); i++) ssid[i] = temp[i];
    ssid[temp.length()] = '\0';
    temp = configFile.readStringUntil(',');
    for (int i = 0; i &amp;lt; temp.length(); i++) pass[i] = temp[i];
    pass[temp.length()] = '\0';
    temp = configFile.readStringUntil('\r');
    wifiRouter = temp.toInt();
    configFile.close();
    Serial.println(ssid);
    Serial.println(pass);
    Serial.println(wifiRouter);
    return true;
  }
}

void setup() {
    if (SPIFFS.exists(F(&quot;/config.txt&quot;))) loadConfig(); // if there is &quot;/config.txt&quot;, read
    else saveConfig();  // if there is not, save a new config.txt 
}

// SPIFFS initialization code at serial monitor
void loop() {
  if(Serial.available()) { // Serial monitor
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if(temp == &quot;1&quot;){   
      Serial.println(F(&quot;format...&quot;));
      SPIFFS.format();
      Serial.println(F(&quot;done. can start upload.&quot;));
      while(1); // stanby for uploading
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.ESP32_WIFI_HMI_WEB_MANAGER.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cv3bTh/btrSHksV1TB/kHGUcSWzWtiu09uoUAaNw0/2.ESP32_WIFI_HMI_WEB_MANAGER.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;2.ESP32_WIFI_HMI_WEB_MANAGER.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.ESP8266_WIFI_HMI_WEB_MANAGER.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/boSpD7/btrSHKSaKZ2/kUGKLDzjAK3dUkqtQYfrK0/2.ESP8266_WIFI_HMI_WEB_MANAGER.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;2.ESP8266_WIFI_HMI_WEB_MANAGER.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SPIFFS_FORMAT_ESP32.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/JcItK/btrSHiohwQA/t7OUhRm5v3sT2xph0jd551/SPIFFS_FORMAT_ESP32.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;SPIFFS_FORMAT_ESP32.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SPIFFS_FORMAT_ESP8266.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/nmuqm/btrSHM3zbOI/e1hMzSzGEistTGRgB9PKp1/SPIFFS_FORMAT_ESP8266.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;SPIFFS_FORMAT_ESP8266.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/qbofiZBYwAA&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/qbofiZBYwAA&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/qbofiZBYwAA&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Web Login&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When connecting through a router, obtain control authority using the name and password of the access point.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wifiManagerLoginP.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXtXS2/btrSHlehyS2/kDEzI2kaEOVtCz7hEmFipk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXtXS2/btrSHlehyS2/kDEzI2kaEOVtCz7hEmFipk/img.jpg&quot; data-alt=&quot;Login Page&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXtXS2/btrSHlehyS2/kDEzI2kaEOVtCz7hEmFipk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXtXS2%2FbtrSHlehyS2%2FkDEzI2kaEOVtCz7hEmFipk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;204&quot; data-filename=&quot;wifiManagerLoginP.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Login Page&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wifiManagerLogin.jpg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1ZXqn/btrSHLwMDEe/lPCjkriKTrKeK2RTTbkRa1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1ZXqn/btrSHLwMDEe/lPCjkriKTrKeK2RTTbkRa1/img.jpg&quot; data-alt=&quot;Web Manager with Login&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1ZXqn/btrSHLwMDEe/lPCjkriKTrKeK2RTTbkRa1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1ZXqn%2FbtrSHLwMDEe%2FlPCjkriKTrKeK2RTTbkRa1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;324&quot; data-filename=&quot;wifiManagerLogin.jpg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Web Manager with Login&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.ESP32_WIFI_HMI_WEB_LOGIN.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/MUt9s/btrSJmisLiU/FxTx2XBksCtgE8K8lVD9e0/3.ESP32_WIFI_HMI_WEB_LOGIN.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;3.ESP32_WIFI_HMI_WEB_LOGIN.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.ESP8266_WIFI_HMI_WEB_LOGIN.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/kOZiP/btrSJmQi2Cj/lHoufBI6dOin9os9wa1TmK/3.ESP8266_WIFI_HMI_WEB_LOGIN.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;3.ESP8266_WIFI_HMI_WEB_LOGIN.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/0hAbI_CerE0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/0hAbI_CerE0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/0hAbI_CerE0&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Wifi Manager&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can change the ID and password for connecting to access points and a router without using HTML code.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GEf2b/btrSJXWNIed/5OaFT9sq0kAaxRei1xC4Y0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GEf2b/btrSJXWNIed/5OaFT9sq0kAaxRei1xC4Y0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GEf2b/btrSJXWNIed/5OaFT9sq0kAaxRei1xC4Y0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGEf2b%2FbtrSJXWNIed%2F5OaFT9sq0kAaxRei1xC4Y0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;384&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.ESP32_WIFI_HMI_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b4mrWS/btrSIPeceCU/PqmGr8ZLgs0i2vTXkwryR1/4.ESP32_WIFI_HMI_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;4.ESP32_WIFI_HMI_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.ESP8266_WIFI_HMI_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/U5lwb/btrSHYimK33/8YW6w056kRyWhBaoV4lK3K/4.ESP8266_WIFI_HMI_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;4.ESP8266_WIFI_HMI_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/FdF1GXqSLC8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/FdF1GXqSLC8&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/FdF1GXqSLC8&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Login&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When connecting through a router, obtain control authority using password of the access point.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4hSKK/btrSHwNtl87/OcJii3aNruB3JHVGnGJBYK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4hSKK/btrSHwNtl87/OcJii3aNruB3JHVGnGJBYK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4hSKK/btrSHwNtl87/OcJii3aNruB3JHVGnGJBYK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4hSKK%2FbtrSHwNtl87%2FOcJii3aNruB3JHVGnGJBYK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BOoSf/btrSIRJNYAz/40CcSF0d18NKgdTAHnjkek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BOoSf/btrSIRJNYAz/40CcSF0d18NKgdTAHnjkek/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BOoSf/btrSIRJNYAz/40CcSF0d18NKgdTAHnjkek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBOoSf%2FbtrSIRJNYAz%2F40CcSF0d18NKgdTAHnjkek%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;42&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.ESP32_WIFI_HMI_PASS.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/lxIIp/btrSHKq7m2X/2ywgc2SUvyBPYtYxTdzSA0/5.ESP32_WIFI_HMI_PASS.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;5.ESP32_WIFI_HMI_PASS.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.ESP8266_WIFI_HMI_PASS.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/NC3TS/btrSHXjufS1/cl23SXtgfgh2Gij2BX5dck/5.ESP8266_WIFI_HMI_PASS.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;5.ESP8266_WIFI_HMI_PASS.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/mtBl8fEYgyg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/mtBl8fEYgyg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/mtBl8fEYgyg&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ADUCON - Arduino wireless remote control application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUCON</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/191</guid>
      <comments>https://postpop.tistory.com/191#entry191comment</comments>
      <pubDate>Thu, 1 Dec 2022 15:09:00 +0900</pubDate>
    </item>
    <item>
      <title>ESP32/NodeMcu Basic code for WiFi remote contol</title>
      <link>https://postpop.tistory.com/190</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgqT0M/btrU56Z20Sb/P75hcKid68vUPBHbBa3Zik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgqT0M/btrU56Z20Sb/P75hcKid68vUPBHbBa3Zik/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgqT0M/btrU56Z20Sb/P75hcKid68vUPBHbBa3Zik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgqT0M%2FbtrU56Z20Sb%2FP75hcKid68vUPBHbBa3Zik%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Key code for remote control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Set WiFi library for ESP32 or ESP8266 NodeMcu&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32&lt;/p&gt;
&lt;pre id=&quot;code_1669869797088&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;WiFi.h&amp;gt;      // wifi library for esp32
#include &amp;lt;WiFiClient.h&amp;gt;// access point library for esp32
#include &amp;lt;WiFiAP.h&amp;gt;    // access point library for esp32

WiFiServer server(80); // set port number 80
WiFiClient client;     // set wifi object&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP8266 NodeMcu&lt;/p&gt;
&lt;pre id=&quot;code_1669869832397&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;ESP8266WiFi.h&amp;gt; // wifi library for esp8266 with access point &amp;amp; client functions

WiFiServer server(80);   // set port number 80
WiFiClient client;       // set wifi object&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ACCESS POINT name and password setting for ESP-01&lt;/p&gt;
&lt;pre id=&quot;code_1669869983207&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const char ssidAP[] = &quot;Esp32&quot;;   // your network SSID (name)
const char passAP[] = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- If you want to use the internal network through a router connection, set the name and password of the router that ESP32 or ESP8266 NodeMcu needs to connect to.&lt;/p&gt;
&lt;pre id=&quot;code_1669870043390&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const char ssid[] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
const char pass[] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Function for data transmission via WiFi&lt;/p&gt;
&lt;pre id=&quot;code_1669870199550&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void http_response() {
  Serial.println(Data);  // output sending data to serial monitor
  client.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;)); // HTTP response Header
  client.println(Data);                // send data
  Data = &quot;&quot;;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Function to convert ip address to string&lt;/p&gt;
&lt;pre id=&quot;code_1669870250031&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String toStringIp(IPAddress ip) {  
  String res = &quot;&quot;;
  for (int i = 0; i &amp;lt; 3; i++) res += String((ip &amp;gt;&amp;gt; (8 * i)) &amp;amp; 0xFF) + &quot;.&quot;;
  res += String(((ip &amp;gt;&amp;gt; 8 * 3)) &amp;amp; 0xFF);
  return res;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- setup&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1669870283734&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setup() {
  Serial.begin(115200); // Set the baud rate for communication with the serial monitor of the Arduino IED to 115200
  if (wifiRouter) WiFi.mode(WIFI_AP_STA); // Access point and router connection mode setup (AP+STA)
  else WiFi.mode(WIFI_AP);                // only Access point mode
  WiFi.softAP(ssidAP, passAP);            // active Access point
  ap = toStringIp(WiFi.softAPIP());       // get ip of the Access point
  Serial.print(F(&quot;AP address: &quot;));        // output ip of the Access point to serial monitor
  Serial.println(ap);
  if (wifiRouter) {                       // if use a router connection
    if (pass == &quot;&quot;) WiFi.begin(ssid);     // if not set password of the router
    else WiFi.begin(ssid, pass);          // Connect to WPA/WPA2 network of the router
    uint8_t wifi_count = 0;
    while (WiFi.status() != WL_CONNECTED) { // need some time to connect to the router
          delay(200); Serial.print(F(&quot;.&quot;));
          wifi_count++;
          if (wifi_count == 50) break;
    }
    delay(10);
    ip = toStringIp(WiFi.localIP());      // get assigned IP
    Serial.print(F(&quot;IP address: &quot;));      // output assigned IP to serial monitor
    Serial.println(ip);
  }
  server.begin();                         // start HTTP server
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function to output all data received via WiFi&lt;/p&gt;
&lt;pre id=&quot;code_1669871147895&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void loop() {
  client = server.available(); // Whether the server has data to receive and set now client
  String temp = &quot;&quot;;
  while (client.connected()) { // Enter an infinite loop first to prevent re-execution of &quot;client = server.available();&quot;
    if(client.available()) {   // If the client has data
      if (client.peek() == '\n') char dump = client.read(); // dump '\n'
      else { 
        temp = client.readStringUntil('\r'); 
        Serial.println(temp);
        if (temp.startsWith(F(&quot;GET&quot;))) { // message for response
          Data = &quot;Hello World &quot;;
          Data += random(100,200);
        }
      }
      if (temp.length() == 0) { http_response(); break; } // end of received data
    } else break;
  }
  delay(10); // time for sending data at wifi component of ESP32 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP32_WIFI_BASIC.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b3Kvcs/btrSJT084j5/777x9kfw4BSLuhTDpDR9ZK/ESP32_WIFI_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP32_WIFI_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP8266_WIFI_BASIC.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/GeV8I/btrSHxMkbFJ/nXGn8JWlaO0VGAxx0KrF2k/ESP8266_WIFI_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP8266_WIFI_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ESP32_WIFI_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32.jpg&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/upWF9/btrSCKb2znr/KKp6yxS5IZvyMPFFsL8Nxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/upWF9/btrSCKb2znr/KKp6yxS5IZvyMPFFsL8Nxk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/upWF9/btrSCKb2znr/KKp6yxS5IZvyMPFFsL8Nxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FupWF9%2FbtrSCKb2znr%2FKKp6yxS5IZvyMPFFsL8Nxk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorESP32.jpg&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting directly to the ESP32 or NodeMcu and then connecting the access point&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Connect to ESP32 or NodeMcu on the WiFi Setting of a mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectToESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVHT1P/btrSCcUrpu5/YqbF62IcAYxHAsqTGSwAd1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVHT1P/btrSCcUrpu5/YqbF62IcAYxHAsqTGSwAd1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVHT1P/btrSCcUrpu5/YqbF62IcAYxHAsqTGSwAd1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVHT1P%2FbtrSCcUrpu5%2FYqbF62IcAYxHAsqTGSwAd1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;297&quot; data-filename=&quot;connectToESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the Password for the ACCESS POINT of ESP01.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputPasswordESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bySuIX/btrSCdeKIEP/VfXGk44j3oL3772lQSTTQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bySuIX/btrSCdeKIEP/VfXGk44j3oL3772lQSTTQ1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bySuIX/btrSCdeKIEP/VfXGk44j3oL3772lQSTTQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbySuIX%2FbtrSCdeKIEP%2FVfXGk44j3oL3772lQSTTQ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;313&quot; data-filename=&quot;inputPasswordESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Select &quot;Keep WiFi on&quot; if the message output below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bauise/btrSw4RbFBO/dQt8KqNuFzQ3hkVqzybKTk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bauise/btrSw4RbFBO/dQt8KqNuFzQ3hkVqzybKTk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bauise/btrSw4RbFBO/dQt8KqNuFzQ3hkVqzybKTk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbauise%2FbtrSw4RbFBO%2FdQt8KqNuFzQ3hkVqzybKTk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;288&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the address &quot;192.168.4.1/hi&quot; on web browser.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputAddress.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/32dNO/btrSxleiYEP/jTkRmDQKmsqOgBAJPTYv9K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/32dNO/btrSxleiYEP/jTkRmDQKmsqOgBAJPTYv9K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/32dNO/btrSxleiYEP/jTkRmDQKmsqOgBAJPTYv9K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F32dNO%2FbtrSxleiYEP%2FjTkRmDQKmsqOgBAJPTYv9K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;158&quot; data-filename=&quot;inputAddress.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32RES.jpg&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clHZ1h/btrSw6nWRx4/lHSz8ka6bO8XVMVrQgo4TK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clHZ1h/btrSw6nWRx4/lHSz8ka6bO8XVMVrQgo4TK/img.jpg&quot; data-alt=&quot;received data of &amp;quot;192.168.4.1/hi&amp;quot; and favicon&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clHZ1h/btrSw6nWRx4/lHSz8ka6bO8XVMVrQgo4TK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclHZ1h%2FbtrSw6nWRx4%2FlHSz8ka6bO8XVMVrQgo4TK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;698&quot; data-filename=&quot;basicMonitorESP32RES.jpg&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;192.168.4.1/hi&quot; and favicon&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHTTPESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w85dz/btrSyT9dxgn/z3kOgKpk2UZ1kB1XsWf4e0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w85dz/btrSyT9dxgn/z3kOgKpk2UZ1kB1XsWf4e0/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP32&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w85dz/btrSyT9dxgn/z3kOgKpk2UZ1kB1XsWf4e0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw85dz%2FbtrSyT9dxgn%2Fz3kOgKpk2UZ1kB1XsWf4e0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;102&quot; data-filename=&quot;responseHTTPESP32.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP32&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting to the assigned IP while ESP01 is connected to the router&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the assigned IP address &quot;192.168.1.6&quot; on web browser of PC connected to network of &quot;skynet&quot;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHTTPESP321.jpg&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tcw4q/btrSCctrqkW/AyuglphtB5ElY4Vqg6H4yK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tcw4q/btrSCctrqkW/AyuglphtB5ElY4Vqg6H4yK/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tcw4q/btrSCctrqkW/AyuglphtB5ElY4Vqg6H4yK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftcw4q%2FbtrSCctrqkW%2FAyuglphtB5ElY4Vqg6H4yK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;616&quot; height=&quot;115&quot; data-filename=&quot;responseHTTPESP321.jpg&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP01&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorESP32RES1.jpg&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3qCIB/btrSw5bzhTa/O3e3Tp3HHU7gahkfrVRkT1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3qCIB/btrSw5bzhTa/O3e3Tp3HHU7gahkfrVRkT1/img.jpg&quot; data-alt=&quot;received data of &amp;quot;192.168.1.6&amp;quot; and favicon&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3qCIB/btrSw5bzhTa/O3e3Tp3HHU7gahkfrVRkT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3qCIB%2FbtrSw5bzhTa%2FO3e3Tp3HHU7gahkfrVRkT1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;673&quot; data-filename=&quot;basicMonitorESP32RES1.jpg&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;192.168.1.6&quot; and favicon&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/191&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ESP32/NodeMcu WiFi remote control with ADUCON&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/192&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ESP32/NodeMcu WiFi remote control with ADUPAD&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ADUCON - Arduino wireless remote control application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ADUPAD - Arduino wireless remote control PAD application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237379627&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUCON - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&amp;amp;hl=ko&amp;amp;gl=KR&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUCON - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237394767&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUPAD - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&amp;amp;hl=ko&amp;amp;gl=JP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUPAD - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/190</guid>
      <comments>https://postpop.tistory.com/190#entry190comment</comments>
      <pubDate>Tue, 29 Nov 2022 18:20:44 +0900</pubDate>
    </item>
    <item>
      <title>Arduino BLE remote control with ADUPAD and BT05</title>
      <link>https://postpop.tistory.com/189</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUPAD application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zU34I/btrR8VyupO6/HLG9itWKiTiy168myTeCLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zU34I/btrR8VyupO6/HLG9itWKiTiy168myTeCLk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zU34I/btrR8VyupO6/HLG9itWKiTiy168myTeCLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzU34I%2FbtrR8VyupO6%2FHLG9itWKiTiy168myTeCLk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;868&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVnHoD/btrU43PPf1t/9khefe28Ffoiww4hQTCK9K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVnHoD/btrU43PPf1t/9khefe28Ffoiww4hQTCK9K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVnHoD/btrU43PPf1t/9khefe28Ffoiww4hQTCK9K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVnHoD%2FbtrU43PPf1t%2F9khefe28Ffoiww4hQTCK9K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Please&amp;nbsp;refer&amp;nbsp;to&amp;nbsp;the&amp;nbsp;post&amp;nbsp;below&amp;nbsp;for&amp;nbsp;how&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;Arduino&amp;nbsp;and&amp;nbsp;BT05.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/187&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Arduino Basic code for BLE remote contol with BT05&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SERIAL_BASIC_BT05.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/7p9Bb/btrSnWyEGIB/Axr1h4uwKxLTYHBBFBLDP0/ARDUINO_BT05_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_BT05_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1669712497313&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool gotData = false;

void loop() {
  if (SerialBT.available()) { // when incomming data from HC06
    uint8_t temp = SerialBT.read();
    Serial.println(temp); // Output data of the HC06 to the serial monitor.
    if (temp == 10) gotData = true; // if got '\n', the flag for response
  } else {
    if (gotData) {   // if response
      String setVal = &quot;&quot;;
      setVal += char(0xF4);      // protocol header of text for ADUPAD with bluetooth
      setVal += &quot;Hello World &quot;;
      setVal += random(100,200); // the message for sending
      setVal += char(0xF1);      // protocol footer of text for ADUPAD with bluetooth
      Serial.println(setVal);    // Output the message to the serial monitor.
      SerialBT.print(setVal);    // send data to HC06 as response 
      gotData = false;           // initialize the flag
      delay(10);                 // delay for sending data at BT05
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ARDUINO_BT05_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorBT05.jpg&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JBtiG/btrSroAIZQo/IshW0VBfSkUaTF3KnkVPx0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JBtiG/btrSroAIZQo/IshW0VBfSkUaTF3KnkVPx0/img.jpg&quot; data-alt=&quot;received data &amp;quot;13(\r) 10(\n)&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JBtiG/btrSroAIZQo/IshW0VBfSkUaTF3KnkVPx0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJBtiG%2FbtrSroAIZQo%2FIshW0VBfSkUaTF3KnkVPx0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorBT05.jpg&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data &quot;13(\r) 10(\n)&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;connecting to BT05 on the ADUPAD app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Bluetooth 4.0 Search and Connection in the App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth icon in the app and select Bluetooth 4.0 in Select Ver.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth button and select the BT05.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectBT05ADUPAD.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FMjbN/btrSm0uypnZ/EXrSOH6cVuL3pqEeGvEMQ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FMjbN/btrSm0uypnZ/EXrSOH6cVuL3pqEeGvEMQ1/img.jpg&quot; data-alt=&quot;Select BT05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FMjbN/btrSm0uypnZ/EXrSOH6cVuL3pqEeGvEMQ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFMjbN%2FbtrSm0uypnZ%2FEXrSOH6cVuL3pqEeGvEMQ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;290&quot; data-filename=&quot;connectBT05ADUPAD.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Select BT05&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectMonitorBT05.jpg&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qjvWo/btrSsn2A0nk/I7K0CAXZcjkcYt7KRVMhUK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qjvWo/btrSsn2A0nk/I7K0CAXZcjkcYt7KRVMhUK/img.jpg&quot; data-alt=&quot;received data &amp;quot;37(%) 37(%) 70(F) 56(8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qjvWo/btrSsn2A0nk/I7K0CAXZcjkcYt7KRVMhUK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqjvWo%2FbtrSsn2A0nk%2FI7K0CAXZcjkcYt7KRVMhUK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;513&quot; data-filename=&quot;connectMonitorBT05.jpg&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data &quot;37(%) 37(%) 70(F) 56(8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseBT05ADUPAD.jpg&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/esVjZo/btrSsmvQSqK/xhW7VaOkaIjjDNQZfNdy11/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/esVjZo/btrSsmvQSqK/xhW7VaOkaIjjDNQZfNdy11/img.jpg&quot; data-alt=&quot;connected to BT05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/esVjZo/btrSsmvQSqK/xhW7VaOkaIjjDNQZfNdy11/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FesVjZo%2FbtrSsmvQSqK%2FxhW7VaOkaIjjDNQZfNdy11%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;269&quot; height=&quot;96&quot; data-filename=&quot;responseBT05ADUPAD.jpg&quot; data-origin-width=&quot;269&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;connected to BT05&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with BLE of ADUPAD applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SerialBT_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LSx8O/btrR7RYs44z/O9lfOM1TshUQIBS2vYZpy0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LSx8O/btrR7RYs44z/O9lfOM1TshUQIBS2vYZpy0/img.jpg&quot; data-alt=&quot;ADUPAD app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LSx8O/btrR7RYs44z/O9lfOM1TshUQIBS2vYZpy0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLSx8O%2FbtrR7RYs44z%2FO9lfOM1TshUQIBS2vYZpy0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;ADUPAD app&amp;amp;#39;s protocol header settings&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;185&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUPAD app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for BLE in the Arduino sketch according to the protocol header settings in the ADUPAD app.&lt;/p&gt;
&lt;pre id=&quot;code_1669361395965&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD 0xF0
#define joyHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define connectHDstr F(&quot;%%F8&quot;)
#define optionHD 0xF9
#define optionHDstr F(&quot;%%F9&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUPAD app&lt;/p&gt;
&lt;pre id=&quot;code_1669361477758&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

if (appConnection) { // If app connection is confirmed
  // Execute code after app connection is confirmed
} else {
  String hd = connectHDstr; 
  if (SerialBT.peek() == hd[0]) appConnection = true; // Check if the value is %.
  else { uint8_t dump = SerialBT.read(); }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHDstr(%%F8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + connect&lt;/span&gt;: Transmit the necessary app settings and current Arduino state values through the iniSet() and send_State() functions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + NA&lt;/span&gt;: Change setting values for BT05.&lt;/p&gt;
&lt;pre id=&quot;code_1669361656221&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (temp == F(&quot;connect&quot;)) { iniSet(); send_iniState(); } 
else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; Serial.println(F(&quot;disconnect&quot;)); }
else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); }
else Serial.println(temp);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHDstr(%%F9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669361705149&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(0xF0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669361740877&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF0 + 1byte Num + 0xF1
while (SerialBT.peek() == pinHD) { // need depend on left arrow pad mode 
  SerialBT.readBytes(data, 3); // Store 3 bytes of data in array &quot;data&quot; from Serial Buffer
  if (data[2] == footHD) { // if the third byte is 0xF1
    pin_control(data[1]);  // execute the code with the value of second byte
    data[2] = 0;
  }
  delay(1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;joyHD(0xF3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669361886692&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF3 + 1byte Num(id) + 2byte Num(heading) + 1byte Num(strength) + 0xF1
while (SerialBT.peek() == joyHD) { 
  SerialBT.readBytes(data, 6); // Store 6 bytes of data in array &quot;data&quot; from Serial Buffer
  if (data[5] == footHD) {     // if the sixth byte is 0xF1
    uint16_t value = data[3];  // Swap third and fourth bytes
    value = value &amp;lt;&amp;lt; 8 | data[2];
    joystick_control(data[1], value, data[4]); // execute the code with values
    data[5] = 0;
  }
  delay(1);
}
if (joyEcho) { sendJoyEcho(); joyEcho = 0; } // Prevent data transmission while receiving data
// refer to &quot;Precautions when using the HC-06 with Serial communication&quot; posted in Basic code.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669361957437&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669361975245&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the Joystick state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669362000421&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) { 
  uint8_t joy[6] = {joyHD, id, heading, heading &amp;gt;&amp;gt; 8, strength, footHD};
  SerialBT.write(joy, 6);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the Joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669362023716&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t joyEcho = 0;
uint8_t ecVal[12] = { 0, };

void send_joy_echo(uint8_t id, uint16_t heading, uint8_t strength) {
  if (joyEcho &amp;gt; 2) joyEcho = 0;
  ecVal[joyEcho*4] = id; 
  ecVal[(joyEcho*4)+1] = heading;
  ecVal[(joyEcho*4)+2] = heading &amp;gt;&amp;gt; 8;
  ecVal[(joyEcho*4)+3] = strength; 
  joyEcho++;
}

void sendJoyEcho() {
  uint8_t ch = 0;
  while (joyEcho) {
    joyEcho--;
    uint8_t joy[6] = {joyHD, ecVal[ch*4], ecVal[(ch*4)+1], ecVal[(ch*4)+2], ecVal[(ch*4)+3], echoHD};
    SerialBT.write(joy, 6); ch++; delay(10);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text with over the limitation of transmit data length of BLE.&lt;/p&gt;
&lt;pre id=&quot;code_1669362071597&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String str) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 18) {
     repeat = (len/18)+1;
     endLen = (len%18);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = strHD;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 18;
    else ed = endLen;
    for (int i = 1; i &amp;lt; ed+1; i++) {
      temp[i] = str[(r*18)+i-1];
    }
    if (repeat-r &amp;gt; 1) temp[ed+1] = echoHD;
    else temp[ed+1] = footHD;
    temp[ed+2] = '\0';
    SerialBT.print(temp);
    delay(10);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1669362147020&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;disconnect02.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVxPjo/btrR4E6K1zG/XUgIBjjdBZFsTd1MCeflFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVxPjo/btrR4E6K1zG/XUgIBjjdBZFsTd1MCeflFk/img.jpg&quot; data-alt=&quot;Disconnect Button for Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVxPjo/btrR4E6K1zG/XUgIBjjdBZFsTd1MCeflFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVxPjo%2FbtrR4E6K1zG%2FXUgIBjjdBZFsTd1MCeflFk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;45&quot; data-filename=&quot;disconnect02.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button for Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1669362170956&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void send_message(String str, uint8_t head, uint8_t fn) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 17) {
     repeat = (len/17)+1;
     endLen = (len%17);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = head;
    temp[1] = fn;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 17;
    else ed = endLen;
    for (int i = 2; i &amp;lt; ed+2; i++) {
      temp[i] = str[(r*17)+i-2];
    }
    if (repeat-r &amp;gt; 1) temp[ed+2] = echoHD;
    else temp[ed+2] = footHD;
    temp[ed+3] = '\0';
    SerialBT.print(temp);
    delay(10);
  }
}

void sendMessage(String str) {
  send_message(str, connectHD, 0x04);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cifrtn/btrR7ioyWJR/Gu1Y59yphvzOg00egKrLN0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cifrtn/btrR7ioyWJR/Gu1Y59yphvzOg00egKrLN0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cifrtn/btrR7ioyWJR/Gu1Y59yphvzOg00egKrLN0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcifrtn%2FbtrR7ioyWJR%2FGu1Y59yphvzOg00egKrLN0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Set the function to continuously transmit the changed value of the Joystick according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** The Gravity Sensor always works in an active Mode.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Joystick Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Joystick Mode&lt;/span&gt;&amp;nbsp;(transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1669362242680&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveJoystick(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4); 
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZDgsS/btrR71mq65k/V1uKRTFm7oLa8r1Okozuz1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZDgsS/btrR71mq65k/V1uKRTFm7oLa8r1Okozuz1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZDgsS/btrR71mq65k/V1uKRTFm7oLa8r1Okozuz1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZDgsS%2FbtrR71mq65k%2FV1uKRTFm7oLa8r1Okozuz1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;98&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Set transmission interval of ACTIVE JOYSTIC MODE. (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669362279172&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoystickInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. Set the range where the strength of the joystick becomes 0. (enter a value from 0 to 35)&lt;/p&gt;
&lt;pre id=&quot;code_1669362298436&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pm4Pw/btrR83XGTTk/t4qhWxiE5L8KiPVZ7kcuA1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pm4Pw/btrR83XGTTk/t4qhWxiE5L8KiPVZ7kcuA1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pm4Pw/btrR83XGTTk/t4qhWxiE5L8KiPVZ7kcuA1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpm4Pw%2FbtrR83XGTTk%2Ft4qhWxiE5L8KiPVZ7kcuA1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;198&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Set whether or not to use a function that converts the Strength value of Joystick or Gravity Sensor into a value between 0 and 10.&lt;/p&gt;
&lt;pre id=&quot;code_1669362336885&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyStrengthAdjust(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x04, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Set the group for the left arrow keypad.&lt;/p&gt;
&lt;pre id=&quot;code_1669362420132&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){   
  if (val == 0 || val &amp;gt; 2) val = 4; 
  uint8_t setVal[4] = {optionHD, 0x05, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLVA05/btrR6FEcxQ5/mJHs3tVVANRkN1cyhRlg0K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLVA05/btrR6FEcxQ5/mJHs3tVVANRkN1cyhRlg0K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLVA05/btrR6FEcxQ5/mJHs3tVVANRkN1cyhRlg0K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLVA05%2FbtrR6FEcxQ5%2FmJHs3tVVANRkN1cyhRlg0K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;88&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Set the 4-way control of the joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669362467812&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  uint8_t setVal[4] = {optionHD, 0x06, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Set whether or not to display the group button.&lt;/p&gt;
&lt;pre id=&quot;code_1669362487173&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  uint8_t setVal[4] = {optionHD, 0x07, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmpAG7/btrR8to3vIJ/QtDrYxQOXDau3yPOZfyFvK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmpAG7/btrR8to3vIJ/QtDrYxQOXDau3yPOZfyFvK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmpAG7/btrR8to3vIJ/QtDrYxQOXDau3yPOZfyFvK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmpAG7%2FbtrR8to3vIJ%2FQtDrYxQOXDau3yPOZfyFvK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;31&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1UIsE/btrR72r9uIs/UUrfw7U6UFRcyFPVRQ7kx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1UIsE/btrR72r9uIs/UUrfw7U6UFRcyFPVRQ7kx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1UIsE/btrR72r9uIs/UUrfw7U6UFRcyFPVRQ7kx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1UIsE%2FbtrR72r9uIs%2FUUrfw7U6UFRcyFPVRQ7kx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;179&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ICRGP/btrR8pNTWg7/jddKHhkyU8BqtdBKILYYaK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ICRGP/btrR8pNTWg7/jddKHhkyU8BqtdBKILYYaK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ICRGP/btrR8pNTWg7/jddKHhkyU8BqtdBKILYYaK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FICRGP%2FbtrR8pNTWg7%2FjddKHhkyU8BqtdBKILYYaK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;137&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1669362599292&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2: show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x08, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* BLE is no need to pair with Mobile Phone and the Pin Number of BT05 only used for btween master and slave of BT05.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* If pairing is attempted, an error message is displayed.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvOblo/btrR8VZPdtw/SbhIGdnamE6kUBll8QyBCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvOblo/btrR8VZPdtw/SbhIGdnamE6kUBll8QyBCk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvOblo/btrR8VZPdtw/SbhIGdnamE6kUBll8QyBCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvOblo%2FbtrR8VZPdtw%2FSbhIGdnamE6kUBll8QyBCk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Set the activation interval of the gravity sensor and transmission of the tilt value.&lt;/p&gt;
&lt;pre id=&quot;code_1669362673892&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x09, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU77ye/btrR79dtFTx/CV7Opb6KqspI33HFilbis1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU77ye/btrR79dtFTx/CV7Opb6KqspI33HFilbis1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU77ye/btrR79dtFTx/CV7Opb6KqspI33HFilbis1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU77ye%2FbtrR79dtFTx%2FCV7Opb6KqspI33HFilbis1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;83&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bILlOB/btrR75I3XZR/rP1qYlHy6y2rumO49UYm5k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bILlOB/btrR75I3XZR/rP1qYlHy6y2rumO49UYm5k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bILlOB/btrR75I3XZR/rP1qYlHy6y2rumO49UYm5k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbILlOB%2FbtrR75I3XZR%2FrP1qYlHy6y2rumO49UYm5k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;48&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Set labels for buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669362711756&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  send_message(str, optionHD, 0x0A);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drp5uF/btrR8aKgiTx/Ak6i6zjUkBWXefVS3oPPH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drp5uF/btrR8aKgiTx/Ak6i6zjUkBWXefVS3oPPH1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drp5uF/btrR8aKgiTx/Ak6i6zjUkBWXefVS3oPPH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdrp5uF%2FbtrR8aKgiTx%2FAk6i6zjUkBWXefVS3oPPH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;84&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIbPuG/btrR8x5Ygol/uSJjiKszK0eG3s3tzjXKlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIbPuG/btrR8x5Ygol/uSJjiKszK0eG3s3tzjXKlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIbPuG/btrR8x5Ygol/uSJjiKszK0eG3s3tzjXKlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIbPuG%2FbtrR8x5Ygol%2FuSJjiKszK0eG3s3tzjXKlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;180&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set the toggle/push properties of the left 4 buttons or 20 buttons of all.&lt;/p&gt;
&lt;pre id=&quot;code_1669362794316&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0000&quot;)          // left pad: up-left-right-down
//F(&quot;00000000001111110000&quot;) // 0000:left, 0000:right, 001111110000:center
void setLeftPadOrAllToggle(String str){ 
  send_message(str, optionHD, 0x0B);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zVcDs/btrR76HZsbM/qNvph4uGAyoi2RuogWpRd1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zVcDs/btrR76HZsbM/qNvph4uGAyoi2RuogWpRd1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zVcDs/btrR76HZsbM/qNvph4uGAyoi2RuogWpRd1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzVcDs%2FbtrR76HZsbM%2FqNvph4uGAyoi2RuogWpRd1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;105&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. Set the toggle/push properties of the right 4 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669362830268&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;0000&quot;)         // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  send_message(str, optionHD, 0x0C);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. Set the toggle/push properties of the middle 12 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669362848468&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;000000000000&quot;) // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ // must after setLeftPadMode(uint8_t val)
  send_message(str, optionHD, 0x0D);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;21. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1669362865011&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String str = F(&quot;RAD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; str += ':';
  str += String(selection);
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfRwkN/btrR6GiRToP/5DwjiFSEbsdJEjKTYzXM7k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfRwkN/btrR6GiRToP/5DwjiFSEbsdJEjKTYzXM7k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfRwkN/btrR6GiRToP/5DwjiFSEbsdJEjKTYzXM7k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfRwkN%2FbtrR6GiRToP%2F5DwjiFSEbsdJEjKTYzXM7k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;22. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669362894363&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String str = F(&quot;CKB:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/myBKK/btrR5g5STKM/UBkh72UzK4PPKiKHjepJsK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/myBKK/btrR5g5STKM/UBkh72UzK4PPKiKHjepJsK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/myBKK/btrR5g5STKM/UBkh72UzK4PPKiKHjepJsK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmyBKK%2FbtrR5g5STKM%2FUBkh72UzK4PPKiKHjepJsK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;23. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1669362923827&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String str = F(&quot;CHD:&quot;); 
  str = String(id); str += ':'; 
  str += message; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhsFKz/btrR72sbBTh/kUqOPw1xy374uYfLwvKsxK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhsFKz/btrR72sbBTh/kUqOPw1xy374uYfLwvKsxK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhsFKz/btrR72sbBTh/kUqOPw1xy374uYfLwvKsxK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhsFKz%2FbtrR72sbBTh%2FkUqOPw1xy374uYfLwvKsxK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;24. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1669362955484&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String str = F(&quot;LSD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tVvh5/btrR9kEXXPb/Lt4tz8DjARLD90RlfYijB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tVvh5/btrR9kEXXPb/Lt4tz8DjARLD90RlfYijB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tVvh5/btrR9kEXXPb/Lt4tz8DjARLD90RlfYijB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtVvh5%2FbtrR9kEXXPb%2FLt4tz8DjARLD90RlfYijB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;294&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;25. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1669362994620&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  String str = F(&quot;STR:&quot;); 
  str += String(id); str += ':'; 
  str += title; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5nnDW/btrR7iCdBhy/KWHKnzXK4h1OimEjUzmD3K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5nnDW/btrR7iCdBhy/KWHKnzXK4h1OimEjUzmD3K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5nnDW/btrR7iCdBhy/KWHKnzXK4h1OimEjUzmD3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5nnDW%2FbtrR7iCdBhy%2FKWHKnzXK4h1OimEjUzmD3K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.ARDUINO_BLE_JOYSTICK.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/oOp9i/btrR9k52sPW/vBmLg2Sd8IDZOhPKcb2LBK/1.ARDUINO_BLE_JOYSTICK.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1.ARDUINO_BLE_JOYSTICK.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/rT3z3Ue9B6k&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/rT3z3Ue9B6k&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/rT3z3Ue9B6k&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669363146128&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt; 
#define BT_rxPin 3 // Bluetooth RX -&amp;gt; 3(arduino TX)
#define BT_txPin 2 // Bluetooth TX -&amp;gt; 2(arduino RX)
SoftwareSerial SerialBT(BT_txPin, BT_rxPin); // (arduino RX, arduino TX)

#include &quot;protocol.h&quot;

#define ledPin 13

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);
  SerialBT.begin(9600); //Bluetooth 
  Serial.println(sendData(F(&quot;NAMEBTO5&quot;))); // SET NAME &quot;BTO5&quot;
  Serial.println(sendData(F(&quot;RESET&quot;)));    // SOFTWARE REBOOT
  Serial.println(F(&quot;Blutooth 4.0 BTO5&quot;));
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(F(&quot;button 1 : on&quot;)); 
                  break;
      case 10: Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 51: Serial.println(F(&quot;button 5 : on&quot;));
                  break;
      case 50: Serial.println(F(&quot;button 5 : off&quot;));
                  break;
      case 61: Serial.println(F(&quot;button 6 : on&quot;));
                  break;
      case 60: Serial.println(F(&quot;button 6 : off&quot;));
                  break;
      case 71: Serial.println(F(&quot;button 7 : on&quot;));
                  break;
      case 70: Serial.println(F(&quot;button 7 : off&quot;));
                  break;
      case 81: Serial.println(F(&quot;button 8 : on&quot;));
                  break;
      case 80: Serial.println(F(&quot;button 8 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(F(&quot;button 10 : on&quot;));
                //uint8_t id, String title, String option
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,tomato,banana,mango&quot;)); 
                  break;
      case 100: Serial.println(F(&quot;button 10 : off&quot;));
                  break;  
      case 111: Serial.println(F(&quot;button 11 : on&quot;));
                  break;
      case 110: Serial.println(F(&quot;button 11 : off&quot;));
                  break;  
      case 121: Serial.println(F(&quot;button 12 : on&quot;));
                  break;
      case 120: Serial.println(F(&quot;button 12 : off&quot;));
                  break;  
      case 131: Serial.println(F(&quot;button 13 : on&quot;));
                  break;  
      case 130: Serial.println(F(&quot;button 13 : off&quot;));
                  break;  
      case 141: Serial.println(F(&quot;button 14 : on&quot;));
                  break;  
      case 140: Serial.println(F(&quot;button 14 : off&quot;));
                  break;  
      case 151: Serial.println(F(&quot;button 15 : on&quot;));
                  break;  
      case 150: Serial.println(F(&quot;button 15 : off&quot;));
                  break;         
      case 161: Serial.println(F(&quot;button 16 : on&quot;));
                  break;
      case 160: Serial.println(F(&quot;button 16 : off&quot;));
                  break;  
      case 171: Serial.println(F(&quot;button 17 : on&quot;));
                  break;
      case 170: Serial.println(F(&quot;button 17 : off&quot;));
                  break;  
      case 181: Serial.println(F(&quot;button 18 : on&quot;));
                  break;  
      case 180: Serial.println(F(&quot;button 18 : off&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : on&quot;));
                  break;  
      case 190: Serial.println(F(&quot;button 19 : off&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : on&quot;));
                  break;  
      case 200: Serial.println(F(&quot;button 20 : off&quot;));
                  break; 
      case 210: Serial.println(F(&quot;button 21 : off&quot;));
                  break;  
      case 220: Serial.println(F(&quot;button 22 : off&quot;));
                  break;          
    }
  }
}

// headingVal = false;
//           Top
//         6  7  0
//          \ | /
//  Left 5 --   -- 1 Right
//          / | \
//         4  3  2
//          Bottom

bool headingVal = true; 

void joystick_control(uint8_t id, uint16_t heading, uint8_t strength) {
  //sendJoyEcho(id, heading, strength); 
  if (id == 0) Serial.print(F(&quot;L: &quot;));
  else if (id == 1) Serial.print(F(&quot;R: &quot;));
  else Serial.print(F(&quot;C: &quot;));
  if (headingVal) {
    Serial.print(heading); Serial.print('/'); Serial.println(strength);
  } else {
    if (heading &amp;lt;= 23) heading = 359;
    int8_t stickDir = (heading-23)/45;  
    Serial.println(stickDir);
  }
}

bool appConnection = false;
uint8_t data[6] = {0, 0, 0, 0, 0, 0};

void SerialBT_read() {
  if (SerialBT.available()) {
    if (appConnection) {
      if (SerialBT.peek() == joyHD) { 
        while (SerialBT.peek() == joyHD) { // OxF3
          SerialBT.readBytes(data, 6);
          if (data[5] == footHD) {
            uint16_t value = data[3];
            value = value &amp;lt;&amp;lt; 8 | data[2];
            joystick_control(data[1], value, data[4]);
            data[5] = 0;
          }
          delay(1);
        }
        if (joyEcho) { sendJoyEcho(); joyEcho = 0; }
      } else if (SerialBT.peek() == pinHD) {  // OxF0
        while (SerialBT.peek() == pinHD) { // need depend on left arrow pad mode 
          SerialBT.readBytes(data, 3);
          if (data[2] == footHD) {
            pin_control(data[1]);
            data[2] = 0;
          }
          delay(1);
        }
      } else {
        String hd = connectHDstr; 
        if (SerialBT.peek() == hd[0]) { // alarm
          String temp = SerialBT.readStringUntil('\n');
          if (temp.startsWith(hd)) {
            temp.replace(hd,&quot;&quot;);
            if (temp == F(&quot;connect&quot;)) iniSet(); 
            else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; Serial.println(F(&quot;disconnect&quot;)); }
            else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); }
            else Serial.println(temp);
          } else { temp.replace(optionHDstr,&quot;&quot;); CheckF9(temp); }
        } else {
          uint8_t dump = SerialBT.read();
          Serial.write(dump);
        }
      } 
    } else {
      String hd = connectHDstr; 
      if (SerialBT.peek() == hd[0]) appConnection = true;
      else { uint8_t dump = SerialBT.read(); }
    } 
  }
}

void loop() {
  SerialBT_read(); 
  if(Serial.available()) { // if there is data in the serial buffer
    String temp = Serial.readStringUntil('\n'); // option of serial monitor: NEW LINE
    Serial.println(temp);
    if (temp == F(&quot;1&quot;)) {
      //EEPROM.write(1023, 0);
      //Serial.println(&quot;EEPROM INI&quot;);
    } else if (temp == F(&quot;2&quot;)) {
      
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669363201099&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD 0xF0
#define joyHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define connectHDstr F(&quot;%%F8&quot;)
#define optionHD 0xF9
#define optionHDstr F(&quot;%%F9&quot;)

void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  delay(10);
}

void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  delay(10);
}

// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) { 
  uint8_t joy[6] = {joyHD, id, heading, heading &amp;gt;&amp;gt; 8, strength, footHD};
  SerialBT.write(joy, 6);
  delay(10);
}

uint8_t joyEcho = 0;
uint8_t ecVal[12] = { 0, };

void send_joy_echo(uint8_t id, uint16_t heading, uint8_t strength) {
  if (joyEcho &amp;gt; 2) joyEcho = 0;
  ecVal[joyEcho*4] = id; 
  ecVal[(joyEcho*4)+1] = heading;
  ecVal[(joyEcho*4)+2] = heading &amp;gt;&amp;gt; 8;
  ecVal[(joyEcho*4)+3] = strength; 
  joyEcho++;
}

void sendJoyEcho() {
  uint8_t ch = 0;
  while (joyEcho) {
    joyEcho--;
    uint8_t joy[6] = {joyHD, ecVal[ch*4], ecVal[(ch*4)+1], ecVal[(ch*4)+2], ecVal[(ch*4)+3], echoHD};
    SerialBT.write(joy, 6); ch++; delay(10);
  }
}

void sendText(String str) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 18) {
     repeat = (len/18)+1;
     endLen = (len%18);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = strHD;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 18;
    else ed = endLen;
    for (int i = 1; i &amp;lt; ed+1; i++) {
      temp[i] = str[(r*18)+i-1];
    }
    if (repeat-r &amp;gt; 1) temp[ed+1] = echoHD;
    else temp[ed+1] = footHD;
    temp[ed+2] = '\0';
    SerialBT.print(temp);
    delay(10);
  }
}

///////////////////////////////////////// CONNECTION 
void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  delay(10);
}

void send_message(String str, uint8_t head, uint8_t fn) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 17) {
     repeat = (len/17)+1;
     endLen = (len%17);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = head;
    temp[1] = fn;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 17;
    else ed = endLen;
    for (int i = 2; i &amp;lt; ed+2; i++) {
      temp[i] = str[(r*17)+i-2];
    }
    if (repeat-r &amp;gt; 1) temp[ed+2] = echoHD;
    else temp[ed+2] = footHD;
    temp[ed+3] = '\0';
    SerialBT.print(temp);
    delay(10);
  }
}

void sendMessage(String str) {
  send_message(str, connectHD, 0x04);
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveJoystick(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4); 
  delay(10);
}

// SEND SLIDE GET VALUE INTERVAL
void setJoystickInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  delay(10);
}

void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}

void setJoyStrengthAdjust(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x04, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}

// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){   
  if (val == 0 || val &amp;gt; 2) val = 4; 
  uint8_t setVal[4] = {optionHD, 0x05, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}

// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  uint8_t setVal[4] = {optionHD, 0x06, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}

// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  uint8_t setVal[4] = {optionHD, 0x07, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}

// 0: not use, 1: show only name, 2: show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x08, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}

// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x09, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  delay(10);
}

//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  send_message(str, optionHD, 0x0A);
}

//F(&quot;0000&quot;)          // left pad: up-left-right-down
void setLeftPadOrAllToggle(String str){ 
  send_message(str, optionHD, 0x0B);
}
// F(&quot;0000&quot;)         // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  send_message(str, optionHD, 0x0C);
}
// F(&quot;000000000000&quot;) // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ // must after setLeftPadMode(uint8_t val)
  send_message(str, optionHD, 0x0D);
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String str = F(&quot;RAD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; str += ':';
  str += String(selection);
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String str = F(&quot;CKB:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String str = F(&quot;CHD:&quot;); 
  str = String(id); str += ':'; 
  str += message; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String str = F(&quot;LSD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  String str = F(&quot;STR:&quot;); 
  str += String(id); str += ':'; 
  str += title; 
  send_message(str, optionHD, 0x0E);
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  setAddButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;)); 
  setJoyWay4(false); 
  setActiveJoystick(true); setJoystickInterval(100);
  setJoyStrengthAdjust(true);
  setSSIDLabelMode(0); // not use change btName
  //useGravityAndInterval(180 * 2); 
}

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  SerialBT.print(command); // send the read character to the SerialBT
  long int time = millis();
  String response = &quot;&quot;;
  while( (time+500) &amp;gt; millis()) {
    while(SerialBT.available()) {  
      char c = SerialBT.read(); // 
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) break; 
  }
  return response;
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUPAD app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUPAD app settings: label/toggle properties, Joystic Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1669363278075&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  setAddButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;)); 
  setJoyWay4(false); 
  setActiveJoystick(true); setJoystickInterval(100);
  setJoyStrengthAdjust(true);
  setSSIDLabelMode(0); // not use change btName
  //useGravityAndInterval(180 * 2); 
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the leftPadMode and menu-related button.&lt;/p&gt;
&lt;pre id=&quot;code_1669363340467&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up DIR&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;)); 
                  break;
      case 10: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left DIR&quot;));
               else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right DIR&quot;));
               else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down DIR&quot;));
               else Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down off&quot;));
               else Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
               //uint8_t id, String title, String option
               dialogList(0, F(&quot;LEFT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(&quot;button 10 : on&quot;);
                //uint8_t id, String title, String option
                dialogList(2, F(&quot;RIGHT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1669363374755&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }         // radio button
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }    // Checkbox
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }    // Select button
  else if (temp.startsWith(F(&quot;LSD&quot;))) {       // List Window
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { leftPadMode = 0; setLeftPadOrAllToggle(F(&quot;0000&quot;)); }
      else if (temp.startsWith(F(&quot;TOG&quot;))) {
        setLeftPadOrAllToggle(F(&quot;1111&quot;)); // set toggle for left button
        dialogList(1, F(&quot;LEFT PAD MODE AT TOGGLE&quot;), F(&quot;SELECT,INDIVIDUAL,TWO GROUP,ONLY ONE&quot;)); // dialog message
      }
    } else if (id == 1) {
      if (temp.startsWith(F(&quot;IND&quot;))) leftPadMode = 1; // independant
      else if (temp.startsWith(F(&quot;TWO&quot;))) leftPadMode = 2; // 2 group: up/down, left/right
      else if (temp.startsWith(F(&quot;ONL&quot;))) leftPadMode = 4; // 4psc button is 1 group
      setLeftPadMode(leftPadMode);
    } else if (id == 2) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { rightPadMode = 0; setRightPadToggle(F(&quot;0000&quot;)); } // set push for right button
      else { rightPadMode = 1; setRightPadToggle(F(&quot;1111&quot;)); }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }       // Input text
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.ARDUINO_BLE_JOYSTICK_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/eDl2nf/btrR8a4A4co/UOsTqCYkKsDyvvC2wRMHlK/2.ARDUINO_BLE_JOYSTICK_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;2.ARDUINO_BLE_JOYSTICK_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/AyNCAt_KJ5I&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/AyNCAt_KJ5I&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/AyNCAt_KJ5I&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Change name of BT05 on ADUPAD App&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfJXO4/btrR84oTbVe/SRzJsKyCw2LcKrJBR7RZYK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfJXO4/btrR84oTbVe/SRzJsKyCw2LcKrJBR7RZYK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfJXO4/btrR84oTbVe/SRzJsKyCw2LcKrJBR7RZYK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfJXO4%2FbtrR84oTbVe%2FSRzJsKyCw2LcKrJBR7RZYK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OTBXy/btrR8iOZ6ug/rbMSLCDGwuVkwhiStYFs61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OTBXy/btrR8iOZ6ug/rbMSLCDGwuVkwhiStYFs61/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OTBXy/btrR8iOZ6ug/rbMSLCDGwuVkwhiStYFs61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOTBXy%2FbtrR8iOZ6ug%2FrbMSLCDGwuVkwhiStYFs61%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;121&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save the name for BT05.&lt;/p&gt;
&lt;pre id=&quot;code_1669363668635&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char btName[11] = &quot;BTO5&quot;;  // 10 char&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EEPROM Setting&lt;/p&gt;
&lt;pre id=&quot;code_1669363692091&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;EEPROM.h&amp;gt;
void loadConfig() {  Read name
  for (int i = 0; i &amp;lt; 11; i++) btName[i] = EEPROM.read(1012 + i); // sizeof(pass)-1
}

void saveConfig() { // Write name
  for (int i = 0; i &amp;lt; 11; i++) EEPROM.write(1012 + i, btName[i]); // sizeof(pass)-1
}

// After uploading the sketch to the Arduino, write it once to the EEPROM or read the values stored in the EEPROM when booting.
void setup() {
  if(EEPROM.read(1023) != 1) { 
    for (int i = 0 ; i &amp;lt; EEPROM.length() ; i++) EEPROM.write(i, 0); // EEPROM Clear
    EEPROM.write(1023, 1);   // flag for status of saving
    saveConfig();      // Write ID and Password at initialization
  } else loadConfig(); // Read saved ID and Password when Arduino is rebooting
}

// EEPROM initialization code at serial monitor
void loop() {
  if(Serial.available()) { // Serial monitor code
    String temp = Serial.readStringUntil('\n'); 
    Serial.println(temp);
    if (temp == F(&quot;1&quot;)) {
      EEPROM.write(1023, 0);
      Serial.println(&quot;EEPROM INI&quot;);
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- If there is a PIN number in received data, remove it and then save parsing data for name and send a message applyed in Arduino.&lt;/p&gt;
&lt;pre id=&quot;code_1669363754325&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void changeBTname(String str) { // NA1empty0HC06
  bool save = false;
  String temp = str.substring(0, 1);
  bool delPass = temp.toInt();
  str.remove(0, 1);
  if (delPass) str.remove(0, 6);
  if (str != btName) {
    if (temp != &quot;&quot;) {
      for (int i = 0; i &amp;lt; str.length(); i++) btName[i] = str[i];
      btName[str.length()] = '\0';
      save = true; 
    }
  }
  Serial.println(btName);
  if (save) {
    saveConfig();
    temp  = F(&quot;&amp;lt;p&amp;gt; NAME:  &quot;);
    temp += btName;
    temp += F(&quot;&amp;lt;/p&amp;gt;Value's Saved.&quot;);
    temp += F(&quot; It will disconnect for Setting.&amp;lt;br/&amp;gt;try to reconnect.&quot;);
    sendMessage(temp);
    sendDisconnect(); delay(2000); 
    Serial.println(sendData(changeName(btName))); // SET NAME &quot;BTO5&quot;
    Serial.println(sendData(F(&quot;RESET&quot;)));    // SOFTWARE REBOOT
  } else sendMessage(F(&quot;There's no change.&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.ARDUINO_BLE_JOYSTICK_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bmyNXy/btrR7R5smxI/DwROO9KRM8TnWJAJGK3zZ0/3.ARDUINO_BLE_JOYSTICK_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;3.ARDUINO_BLE_JOYSTICK_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_EEPROM_INI.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Xw4OU/btrR8pUKEH2/1yTLuqkBkVqXxDNqw3xZ00/ARDUINO_EEPROM_INI.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_EEPROM_INI.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Change all data to 0 in EEPROM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/3Zp-HzfgA50&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/3Zp-HzfgA50&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/3Zp-HzfgA50&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ADUPAD - Arduino wireless remote control PAD application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUPAD</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/189</guid>
      <comments>https://postpop.tistory.com/189#entry189comment</comments>
      <pubDate>Fri, 25 Nov 2022 15:57:23 +0900</pubDate>
    </item>
    <item>
      <title>Arduino BLE remote control with ADUCON and BT05</title>
      <link>https://postpop.tistory.com/188</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUCON application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cERxrZ/btrR5hQilV1/jaCII7X3FL9nj9DuTiZ73k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cERxrZ/btrR5hQilV1/jaCII7X3FL9nj9DuTiZ73k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cERxrZ/btrR5hQilV1/jaCII7X3FL9nj9DuTiZ73k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcERxrZ%2FbtrR5hQilV1%2FjaCII7X3FL9nj9DuTiZ73k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;617&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xQ1qX/btrVeVvXSBj/bpAXT8Sb3kP8MjMUi3ZVa0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xQ1qX/btrVeVvXSBj/bpAXT8Sb3kP8MjMUi3ZVa0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xQ1qX/btrVeVvXSBj/bpAXT8Sb3kP8MjMUi3ZVa0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxQ1qX%2FbtrVeVvXSBj%2FbpAXT8Sb3kP8MjMUi3ZVa0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Please&amp;nbsp;refer&amp;nbsp;to&amp;nbsp;the&amp;nbsp;post&amp;nbsp;below&amp;nbsp;for&amp;nbsp;how&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;Arduino&amp;nbsp;and&amp;nbsp;BT05.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/187&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Arduino Basic code for BLE remote contol with BT05&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SERIAL_BASIC_BT05.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/BpO8T/btrSq8rj6gf/RDyxeaHKfKRFFfxrULKnA0/ARDUINO_BT05_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_BT05_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1669711737386&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool gotData = false;

void loop() {
  if (SerialBT.available()) { // when incomming data from HC06
    uint8_t temp = SerialBT.read();
    Serial.println(temp); // Output data of the HC06 to the serial monitor.
    if (temp == 10) gotData = true; // if got '\n', the flag for response
  } else {
    if (gotData) {   // if response
      String setVal = &quot;&quot;;
      setVal += char(0xF4);      // protocol header of text for ADUCON with bluetooth
      setVal += &quot;Hello World &quot;;
      setVal += random(100,200); // the message for sending
      setVal += char(0xF1);      // protocol footer of text for ADUCON with bluetooth
      Serial.println(setVal);    // Output the message to the serial monitor.
      SerialBT.print(setVal);    // send data to HC06 as response 
      gotData = false;           // initialize the flag
      delay(10);                 // delay for sending data at BT05
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ARDUINO_BT05_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorBT05.jpg&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MCdEb/btrSnVl98XP/LJFAnJmEgOJzVzCFIil0rK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MCdEb/btrSnVl98XP/LJFAnJmEgOJzVzCFIil0rK/img.jpg&quot; data-alt=&quot;received data &amp;quot;13(\r) 10(\n)&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MCdEb/btrSnVl98XP/LJFAnJmEgOJzVzCFIil0rK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMCdEb%2FbtrSnVl98XP%2FLJFAnJmEgOJzVzCFIil0rK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorBT05.jpg&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data &quot;13(\r) 10(\n)&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;connecting to BT05 on the ADUCON app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Bluetooth 4.0 Search and Connection in the App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth icon in the app and select Bluetooth 4.0 in Select Ver.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth button and select the BT05.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectBT05.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btcaCG/btrSsRWHCVT/tIVmd72YBfdD3hPnzkq5nK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btcaCG/btrSsRWHCVT/tIVmd72YBfdD3hPnzkq5nK/img.jpg&quot; data-alt=&quot;Select BT05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btcaCG/btrSsRWHCVT/tIVmd72YBfdD3hPnzkq5nK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtcaCG%2FbtrSsRWHCVT%2FtIVmd72YBfdD3hPnzkq5nK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;430&quot; data-filename=&quot;connectBT05.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Select BT05&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectedBT05.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfRT7f/btrSq9KvU4h/3dEBDaw8FAAzVuj3D4VHP1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfRT7f/btrSq9KvU4h/3dEBDaw8FAAzVuj3D4VHP1/img.jpg&quot; data-alt=&quot;connected to BT05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfRT7f/btrSq9KvU4h/3dEBDaw8FAAzVuj3D4VHP1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfRT7f%2FbtrSq9KvU4h%2F3dEBDaw8FAAzVuj3D4VHP1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;82&quot; data-filename=&quot;connectedBT05.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;connected to BT05&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectMonitorBT05.jpg&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwy6oU/btrSmtwUPfD/nOjyvP6zGklfPpKZvlykxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwy6oU/btrSmtwUPfD/nOjyvP6zGklfPpKZvlykxk/img.jpg&quot; data-alt=&quot;received data &amp;quot;37(%) 37(%) 70(F) 56(8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwy6oU/btrSmtwUPfD/nOjyvP6zGklfPpKZvlykxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcwy6oU%2FbtrSmtwUPfD%2FnOjyvP6zGklfPpKZvlykxk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;513&quot; data-filename=&quot;connectMonitorBT05.jpg&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data &quot;37(%) 37(%) 70(F) 56(8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHC06ADUCON.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emCJoE/btrSmZWQkKk/57HMDKnA3VEtr1uPTCFmek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emCJoE/btrSmZWQkKk/57HMDKnA3VEtr1uPTCFmek/img.jpg&quot; data-alt=&quot;response from BT05&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emCJoE/btrSmZWQkKk/57HMDKnA3VEtr1uPTCFmek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FemCJoE%2FbtrSmZWQkKk%2F57HMDKnA3VEtr1uPTCFmek%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;97&quot; data-filename=&quot;responseHC06ADUCON.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;response from BT05&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with BLE of ADUCON applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SerialBT_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7A4Pn/btrR5ydAYN7/GxhimmZAL53JtIbFy6SqK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7A4Pn/btrR5ydAYN7/GxhimmZAL53JtIbFy6SqK1/img.jpg&quot; data-alt=&quot;ADUCON app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7A4Pn/btrR5ydAYN7/GxhimmZAL53JtIbFy6SqK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7A4Pn%2FbtrR5ydAYN7%2FGxhimmZAL53JtIbFy6SqK1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;ADUCON app&amp;amp;#39;s protocol header settings&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;207&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUCON app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for BLE in the Arduino sketch according to the protocol header settings in the ADUCON app.&lt;/p&gt;
&lt;pre id=&quot;code_1669354428665&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD 0xF0
#define pwmHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define connectHDstr F(&quot;%%F8&quot;)
#define optionHD 0xF9
#define optionHDstr F(&quot;%%F9&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1669354562318&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

if (appConnection) { // If app connection is confirmed
  // Execute code after app connection is confirmed
} else {
  String hd = connectHDstr; 
  if (SerialBT.peek() == hd[0]) appConnection = true;  // Check if the value is %.
  else { uint8_t dump = SerialBT.read(); }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHDstr(%%F8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + connect&lt;/span&gt;: Transmit the necessary app settings and current Arduino state values through the iniSet() and send_State() functions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + NA&lt;/span&gt;: Change setting values for BT05.&lt;/p&gt;
&lt;pre id=&quot;code_1669354809454&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (temp == F(&quot;connect&quot;)) { iniSet(); send_iniState(); } 
else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; Serial.println(F(&quot;disconnect&quot;)); }
else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); }
else Serial.println(temp);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHDstr(%%F9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669355019565&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
  else { // if not
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;)); // set the time if the length of the value is less than 10
    else Serial.println(F(&quot;date/time&quot;)); // current date/time if larger
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(0xF0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669355136469&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF0 + 1byte Num + 0xF1
SerialBT.readBytes(data, 3); // Store 3 bytes of data in array &quot;data&quot; from Serial Buffer
if (data[2] == footHD) {     // if the third byte is 0xF1
  pin_control(data[1]);      // execute the code with the value of second byte
  data[2] = 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;pwmHD(0xF3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669355230117&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF3 + 1byte Num(slide number) + 2byte Num(PWM) + 0xF1
while (SerialBT.peek() == pwmHD) { // Process 3 PWM values of COLOR PICKER
  SerialBT.readBytes(data, 5); // Store 5 bytes of data in array &quot;data&quot; from Serial Buffer
  if (data[4] == footHD) {     // if the fifth byte is 0xF1
    uint16_t value = data[3];  // Swap third and fourth bytes
    value = value &amp;lt;&amp;lt; 8 | data[2];
    pwm_control(data[1], value); // execute the code with values
    data[4] = 0;
  }
  delay(1);
}
if (pwmEcho) { sendPwmEcho(); pwmEcho = 0; } // Prevent data transmission while receiving data
// refer to &quot;Precautions when using the BT05 with Serial communication&quot; posted in Basic code.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669355407176&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669355434805&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the slide state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669355450454&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {
  uint8_t pwm[5] = {pwmHD, slide, pwm_val, pwm_val &amp;gt;&amp;gt; 8, footHD};
  SerialBT.write(pwm, 5);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the PWM.&lt;/p&gt;
&lt;pre id=&quot;code_1669355470974&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t pwmEcho = 0;
uint8_t ecVal[18] = { 0, };

void send_pwm_echo(uint8_t slide, uint16_t pwm_val) {
  if (pwmEcho &amp;gt; 5) pwmEcho = 0;
  ecVal[pwmEcho*3] = slide; 
  ecVal[(pwmEcho*3)+1] = pwm_val;
  ecVal[(pwmEcho*3)+2] = pwm_val &amp;gt;&amp;gt; 8;
  pwmEcho++;
}

void sendPwmEcho() {
  uint8_t ch = 0;
  while (pwmEcho) {
    pwmEcho--;
    uint8_t pwm[5] = {pwmHD, ecVal[ch*3], ecVal[(ch*3)+1], ecVal[(ch*3)+2], echoHD};
    SerialBT.write(pwm, 5); ch++; delay(10);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A code example that reflects the status of the current button and PWM values of Arduino to the app when connected to the ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1669355495789&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void send_iniState() { // CURRENT STATE
  sendPinState(10); 
  sendPinState(21); 
  sendPinState(30); 
  sendPinState(41); 
  sendPinState(50); 
  sendPinState(61); 
  sendPinState(71); 
  sendPinState(80); 
  sendPinState(91); 
  sendPinState(101); 
  sendPinState(110); 
  sendPinState(121); 
  sendPinState(130); 
  sendPinState(141); 
  sendPinState(150); 
  sendPwmSlide(1, 110); 
  sendPwmSlide(2, 120); 
  sendPwmSlide(3, 210); 
  sendPwmSlide(4, 0); 
  sendPwmSlide(5, 0); 
  sendPwmSlide(6, 0);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JeL7T/btrR75oa7mt/jIwEHsFNNHjtVdsMwuiark/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JeL7T/btrR75oa7mt/jIwEHsFNNHjtVdsMwuiark/img.jpg&quot; data-alt=&quot;Screen reflecting initial state and labels when connecting Arduino&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JeL7T/btrR75oa7mt/jIwEHsFNNHjtVdsMwuiark/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJeL7T%2FbtrR75oa7mt%2FjIwEHsFNNHjtVdsMwuiark%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;617&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Screen reflecting initial state and labels when connecting Arduino&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text with over the limitation of transmit data length of BLE.&lt;/p&gt;
&lt;pre id=&quot;code_1669355605629&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String str) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 18) {
     repeat = (len/18)+1;
     endLen = (len%18);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = strHD;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 18;
    else ed = endLen;
    for (int i = 1; i &amp;lt; ed+1; i++) {
      temp[i] = str[(r*18)+i-1];
    }
    if (repeat-r &amp;gt; 1) temp[ed+1] = echoHD;
    else temp[ed+1] = footHD;
    temp[ed+2] = '\0';
    SerialBT.print(temp);
    delay(10);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Set to send the date/time of the Android system When connecting, or request the transmission of the date/time if necessary.&lt;/p&gt;
&lt;pre id=&quot;code_1669355632157&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void requstDateTime(){ 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1669355670269&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void send_message(String str, uint8_t head, uint8_t fn) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 17) {
     repeat = (len/17)+1;
     endLen = (len%17);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = head;
    temp[1] = fn;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 17;
    else ed = endLen;
    for (int i = 2; i &amp;lt; ed+2; i++) {
      temp[i] = str[(r*17)+i-2];
    }
    if (repeat-r &amp;gt; 1) temp[ed+2] = echoHD;
    else temp[ed+2] = footHD;
    temp[ed+3] = '\0';
    SerialBT.print(temp);
    delay(10);
  }
}

void sendMessage(String str) {
  send_message(str, connectHD, 0x04);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG9Vv2/btrR71sK7sL/J92kMnyqt2fSVmJgDpkgCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG9Vv2/btrR71sK7sL/J92kMnyqt2fSVmJgDpkgCk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG9Vv2/btrR71sK7sL/J92kMnyqt2fSVmJgDpkgCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG9Vv2%2FbtrR71sK7sL%2FJ92kMnyqt2fSVmJgDpkgCk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1669355993677&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x05, 0x00};
  SerialBT.write(setVal, 3);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4AhxD/btrR5yY9IY7/BmblQn3eWeBxEgt6VwAShk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4AhxD/btrR5yY9IY7/BmblQn3eWeBxEgt6VwAShk/img.png&quot; data-alt=&quot;Disconnect Button for Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4AhxD/btrR5yY9IY7/BmblQn3eWeBxEgt6VwAShk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4AhxD%2FbtrR5yY9IY7%2FBmblQn3eWeBxEgt6VwAShk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;84&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button for Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Set the function to continuously transmit the changed value of the SeekBar (slide bar) according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Slide Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Slide Mode&lt;/span&gt;&amp;nbsp;(transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1669356064869&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveSlide(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAnvVl/btrR8JY0jRK/NZ72agKYNMKEEMb5baycBK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAnvVl/btrR8JY0jRK/NZ72agKYNMKEEMb5baycBK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAnvVl/btrR8JY0jRK/NZ72agKYNMKEEMb5baycBK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAnvVl%2FbtrR8JY0jRK%2FNZ72agKYNMKEEMb5baycBK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;30&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. Set transmission interval of ACTIVE SLIDE MODE. (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669356125525&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setSlideInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn0l9l/btrR4xTSoGD/HM2llmKZEB45r06Kv6aQc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn0l9l/btrR4xTSoGD/HM2llmKZEB45r06Kv6aQc1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn0l9l/btrR4xTSoGD/HM2llmKZEB45r06Kv6aQc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn0l9l%2FbtrR4xTSoGD%2FHM2llmKZEB45r06Kv6aQc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;26&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1669356346308&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2: show name &amp;amp; pass // defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* BLE is no need to pair with Mobile Phone and the Pin Number of BT05 only used for btween master and slave of BT05.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* If pairing is attempted, an error message is displayed.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMtOyg/btrR6GCIZbQ/wFouzb0TSAL36HekIEpRVk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMtOyg/btrR6GCIZbQ/wFouzb0TSAL36HekIEpRVk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMtOyg/btrR6GCIZbQ/wFouzb0TSAL36HekIEpRVk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMtOyg%2FbtrR6GCIZbQ%2FwFouzb0TSAL36HekIEpRVk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Display additional push buttons in the main menu area. (it is possible to control only at Arduino)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ybrsk/btrR72kX9vu/84U4reHPDEKp4uRmr4Zak0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ybrsk/btrR72kX9vu/84U4reHPDEKp4uRmr4Zak0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ybrsk/btrR72kX9vu/84U4reHPDEKp4uRmr4Zak0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fybrsk%2FbtrR72kX9vu%2F84U4reHPDEKp4uRmr4Zak0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;57&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669356870828&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void showDialogMenu(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x04, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Change the main screen to Color Picker / Pwm Nob screen from Arduino. (generally set in the options of the app)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbtaVy/btrR7JeQ93I/0K6nIxmZjTF07cmZhkJagk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbtaVy/btrR7JeQ93I/0K6nIxmZjTF07cmZhkJagk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbtaVy/btrR7JeQ93I/0K6nIxmZjTF07cmZhkJagk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbtaVy%2FbtrR7JeQ93I%2F0K6nIxmZjTF07cmZhkJagk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;71&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uint8_t: list below&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: Display buttons and SeekBar (slide bar) on the main screen&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Display Color_Picker on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Display Color_Picker and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Display PWM Nob on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4: Display PWM Nob and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;String&lt;/span&gt;: name of the group&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;bool&lt;/span&gt;: Sets whether to display the SeekBar (slide bar) when the main screen buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* true&lt;/span&gt;: SeekBar (slide bar) is also displayed when button is displayed or Pwm Nob is displayed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* false&lt;/span&gt;: SeekBar (slide bar) is not displayed when button is displayed and SeekBar (slide bar) is displayed only when Pwm Nob is displayed&lt;/p&gt;
&lt;pre id=&quot;code_1669356925603&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPMain) { 
  String str = String(val); str += ','; 
  str += group1; str += ','; 
  str += group2; str += ',';
  str += pwmDPMain;
  send_message(str, optionHD, 0x05);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Set the main screen display of the app.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set to 0 or 1 in order depending on whether buttons 1 to 15, SeekBar (slide bar) 1 to 6, text input, and floating buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: hidden 1: visible&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UfHgb/btrR31nlNdl/P7zlIltig9U60oc3QsjhHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UfHgb/btrR31nlNdl/P7zlIltig9U60oc3QsjhHk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UfHgb/btrR31nlNdl/P7zlIltig9U60oc3QsjhHk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUfHgb%2FbtrR31nlNdl%2FP7zlIltig9U60oc3QsjhHk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;307&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669357000084&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;///////////////////////// SET MAIN DISPLAY
//F(&quot;111111111111111&quot;  // button 1 ~ 15, 0:hide 1:display
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ 
  send_message(str, optionHD, 0x06);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Set labels for buttons and SeekBar.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Label buttons 1 to 15 and SeekBar (slide bar) 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pynA9/btrR6Hhj0xd/uOkKH9FAQSeFXxcUClukLK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pynA9/btrR6Hhj0xd/uOkKH9FAQSeFXxcUClukLK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pynA9/btrR6Hhj0xd/uOkKH9FAQSeFXxcUClukLK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpynA9%2FbtrR6Hhj0xd%2FuOkKH9FAQSeFXxcUClukLK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;286&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669357040356&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;)) // slider 1 ~ 6
void setButtonLabel(String str){ 
  send_message(str, optionHD, 0x07);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Set the button's toggle/push properties.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set the button properties to 0 or 1 in order of buttons 1 to 15.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0: Push&lt;/span&gt;&amp;nbsp;1: Toggle&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bawpdI/btrR79KVcqY/6RokQkkPDxoAsQfw9Nf1d1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bawpdI/btrR79KVcqY/6RokQkkPDxoAsQfw9Nf1d1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bawpdI/btrR79KVcqY/6RokQkkPDxoAsQfw9Nf1d1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbawpdI%2FbtrR79KVcqY%2F6RokQkkPDxoAsQfw9Nf1d1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;340&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669357082572&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  send_message(str, optionHD, 0x08);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Set the maximum/minimum values of the SeekBar (slide bar).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SeekBar (slide bar) Specifies the maximum/minimum values from 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/21PaB/btrR6Go8Uzp/DbWw7NkF5xkcBFIc10psy0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/21PaB/btrR6Go8Uzp/DbWw7NkF5xkcBFIc10psy0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/21PaB/btrR6Go8Uzp/DbWw7NkF5xkcBFIc10psy0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F21PaB%2FbtrR6Go8Uzp%2FDbWw7NkF5xkcBFIc10psy0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;249&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669357235971&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  send_message(str, optionHD, 0x09);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set the title of the Arduino sketch.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7aaa5/btrR7hpgZDJ/JhNIVYsWWWXJqXs1dBw5l0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7aaa5/btrR7hpgZDJ/JhNIVYsWWWXJqXs1dBw5l0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7aaa5/btrR7hpgZDJ/JhNIVYsWWWXJqXs1dBw5l0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7aaa5%2FbtrR7hpgZDJ%2FJhNIVYsWWWXJqXs1dBw5l0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;27&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669357321754&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//title: Test Mode
//text: Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;
void setAppTitleMessage(String title, String text){
  String str = title; str += ','; 
  str += text; 
  send_message(str, optionHD, 0x0A);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEYPcN/btrR4xzE4js/3OpSTlKIRgKktHlCTXo2g1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEYPcN/btrR4xzE4js/3OpSTlKIRgKktHlCTXo2g1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEYPcN/btrR4xzE4js/3OpSTlKIRgKktHlCTXo2g1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEYPcN%2FbtrR4xzE4js%2F3OpSTlKIRgKktHlCTXo2g1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;489&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;19. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1669357393330&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String str = F(&quot;RAD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; str += ':';
  str += String(selection);
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/df7DvE/btrR70tXF3M/Ev6zgBNznPYYCvQRczWdS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/df7DvE/btrR70tXF3M/Ev6zgBNznPYYCvQRczWdS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/df7DvE/btrR70tXF3M/Ev6zgBNznPYYCvQRczWdS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdf7DvE%2FbtrR70tXF3M%2FEv6zgBNznPYYCvQRczWdS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;20. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669357427171&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String str = F(&quot;CKB:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqqoMw/btrR5hXBfWz/VcQhI1nwCymoeDgC8dd1w1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqqoMw/btrR5hXBfWz/VcQhI1nwCymoeDgC8dd1w1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqqoMw/btrR5hXBfWz/VcQhI1nwCymoeDgC8dd1w1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqqoMw%2FbtrR5hXBfWz%2FVcQhI1nwCymoeDgC8dd1w1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;21. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1669357454468&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String str = F(&quot;CHD:&quot;); 
  str += String(id); str += ':'; 
  str += message; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JZZG4/btrR7TaDRMt/mfPJhybNWDZrU5JPRcTLGK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JZZG4/btrR7TaDRMt/mfPJhybNWDZrU5JPRcTLGK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JZZG4/btrR7TaDRMt/mfPJhybNWDZrU5JPRcTLGK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJZZG4%2FbtrR7TaDRMt%2FmfPJhybNWDZrU5JPRcTLGK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;22. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1669357484194&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String str = F(&quot;LSD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uGEru/btrR4yk3Bn8/y2o8EQ2k9sAN4XRKTOqho1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uGEru/btrR4yk3Bn8/y2o8EQ2k9sAN4XRKTOqho1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uGEru/btrR4yk3Bn8/y2o8EQ2k9sAN4XRKTOqho1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuGEru%2FbtrR4yk3Bn8%2Fy2o8EQ2k9sAN4XRKTOqho1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;429&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;23. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1669357535962&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  String str = F(&quot;STR:&quot;); 
  str += String(id); str += ':'; 
  str += title; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDfhnt/btrR4xzFKDf/6mkT3UPFkT0XREZv1ecKkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDfhnt/btrR4xzFKDf/6mkT3UPFkT0XREZv1ecKkk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDfhnt/btrR4xzFKDf/6mkT3UPFkT0XREZv1ecKkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDfhnt%2FbtrR4xzFKDf%2F6mkT3UPFkT0XREZv1ecKkk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_HMI_BLE_CONTROL.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bHIaYk/btrR710FsVO/kisGFz53DF6J7MPZbDfKa1/ARDUINO_HMI_BLE_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_HMI_BLE_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/cA_iYU6xaB0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/cA_iYU6xaB0&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/cA_iYU6xaB0&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669357642778&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt; 
#define BT_rxPin 3 // Bluetooth RX -&amp;gt; 3(arduino TX)
#define BT_txPin 2 // Bluetooth TX -&amp;gt; 2(arduino RX)
SoftwareSerial SerialBT(BT_txPin, BT_rxPin); // (arduino RX, arduino TX)

#include &quot;protocol.h&quot;

#define ledPin 13

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);
  SerialBT.begin(9600); //Bluetooth 
  Serial.println(sendData(F(&quot;NAMEBTO5&quot;))); // SET NAME &quot;BTO5&quot;
  Serial.println(sendData(F(&quot;RESET&quot;)));    // SOFTWARE REBOOT
  Serial.println(F(&quot;Blutooth 4.0 BTO5&quot;));
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(F(&quot;button 1 : on&quot;));
               digitalWrite(ledPin, HIGH); 
               sendPinEcho(value);
               sendText(F(&quot;1: ON&quot;));  
                  break;
      case 10: Serial.println(F(&quot;button 1 : off&quot;));
               digitalWrite(ledPin, LOW); 
               sendText(F(&quot;1: OFF&quot;)); 
               sendPinEcho(value);
                  break;
      case 21: Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 51: Serial.println(F(&quot;button 5 : on&quot;));
                  break;
      case 50: Serial.println(F(&quot;button 5 : off&quot;));
                  break;
      case 61: Serial.println(F(&quot;button 6 : on&quot;));
                  break;
      case 60: Serial.println(F(&quot;button 6 : off&quot;));
                  break;
      case 71: Serial.println(F(&quot;button 7 : on&quot;));
                  break;
      case 70: Serial.println(F(&quot;button 7 : off&quot;));
                  break;
      case 81: Serial.println(F(&quot;button 8 : on&quot;));
                  break;
      case 80: Serial.println(F(&quot;button 8 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(F(&quot;button 10 : on&quot;));
                  break;
      case 100: Serial.println(F(&quot;button 10 : off&quot;));
                  break;  
      case 111: Serial.println(F(&quot;button 11 : on&quot;));
                  break;
      case 110: Serial.println(F(&quot;button 11 : off&quot;));
                  break;  
      case 121: Serial.println(F(&quot;button 12 : on&quot;));
                  break;
      case 120: Serial.println(F(&quot;button 12 : off&quot;));
                  break;                  
      case 131: Serial.println(F(&quot;button 13 : on&quot;));
                  break;  
      case 130: Serial.println(F(&quot;button 13 : off&quot;));
                  break;  
      case 141: Serial.println(F(&quot;button 14 : on&quot;));
                  break;  
      case 140: Serial.println(F(&quot;button 14 : off&quot;));
                  break;  
      case 151: Serial.println(F(&quot;button 15 : on&quot;));
                  break;  
      case 150: Serial.println(F(&quot;button 15 : off&quot;));
                  break;         
      case 161: Serial.println(F(&quot;button 16 : click&quot;));
                  break; 
      case 171: Serial.println(F(&quot;button 17 : click&quot;));
                  break;
      case 181: Serial.println(F(&quot;button 18 : click&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : click&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : click&quot;));
                  break;                
    }
  }
}

void pwm_control(uint8_t num, uint16_t value) {
  if (num == 1) {  // SeekBar (slide bar) 1
    send_pwm_echo(num, value); 
    Serial.print(F(&quot;pwm1: &quot;)); Serial.println(value);
  } else if (num == 2) { // SeekBar (slide bar) 2
    send_pwm_echo(num, value); 
    Serial.print(F(&quot;pwm2: &quot;)); Serial.println(value);
  } else if (num == 3) {  // SeekBar (slide bar) 3
    send_pwm_echo(num, value); 
    Serial.print(F(&quot;pwm3: &quot;)); Serial.println(value);
  } else if (num == 4) {  // SeekBar (slide bar) 4
    Serial.print(F(&quot;pwm4: &quot;)); Serial.println(value);
  } else if (num == 5) {  // SeekBar (slide bar) 5
    Serial.print(F(&quot;pwm5: &quot;)); Serial.println(value);
  } else if (num == 6) {  // SeekBar (slide bar) 6
    Serial.print(F(&quot;pwm6: &quot;)); Serial.println(value);
  }
  //send_pwm_echo(num, value); 
}

bool appConnection = false;
uint8_t data[5] = {0, 0, 0, 0, 0};

void SerialBT_read() {
  if (SerialBT.available()) {  
    if (appConnection) {
      if (SerialBT.peek() == pwmHD) { // 0xF3
        while (SerialBT.peek() == pwmHD) {
          SerialBT.readBytes(data, 5);
          if (data[4] == footHD) {
            uint16_t value = data[3];
            value = value &amp;lt;&amp;lt; 8 | data[2];
            pwm_control(data[1], value);
            data[4] = 0;
          }
          delay(1);
        }
        if (pwmEcho) { sendPwmEcho(); pwmEcho = 0; }
      } else if (SerialBT.peek() == pinHD) {  // 0xF0
        SerialBT.readBytes(data, 3);
        if (data[2] == footHD) {
          pin_control(data[1]);
          data[2] = 0;
        }
      } else {
        String hd = connectHDstr; 
        if (SerialBT.peek() == hd[0]) { 
          String temp = SerialBT.readStringUntil('\n');
          if (temp.startsWith(hd)) {
            temp.replace(hd,&quot;&quot;);
            if (temp == F(&quot;connect&quot;)) { iniSet(); send_iniState(); } 
            else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; Serial.println(F(&quot;disconnect&quot;)); }
            else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); }
            else Serial.println(temp);
          } else { temp.replace(optionHDstr,&quot;&quot;); CheckF9(temp); }
        } else {
          uint8_t dump = SerialBT.read();
          Serial.write(dump);
        }
      }
    } else {
      String hd = connectHDstr; 
      if (SerialBT.peek() == hd[0]) appConnection = true;
      else { uint8_t dump = SerialBT.read(); }
    }  
  }
}

void loop() {
  SerialBT_read(); 
  if(Serial.available()) { // if there is data in the serial buffer
    String temp = Serial.readStringUntil('\n'); // option of serial monitor: NEW LINE
    Serial.println(temp);
    if(temp == &quot;1&quot;){   
      
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669357797523&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD 0xF0
#define pwmHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define connectHDstr F(&quot;%%F8&quot;)
#define optionHD 0xF9
#define optionHDstr F(&quot;%%F9&quot;)

void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  delay(10);
}

void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  delay(10);
}

void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {
  uint8_t pwm[5] = {pwmHD, slide, pwm_val, pwm_val &amp;gt;&amp;gt; 8, footHD};
  SerialBT.write(pwm, 5);
  delay(10);
}

uint8_t pwmEcho = 0;
uint8_t ecVal[18] = { 0, };

void send_pwm_echo(uint8_t slide, uint16_t pwm_val) {
  if (pwmEcho &amp;gt; 5) pwmEcho = 0;
  ecVal[pwmEcho*3] = slide; 
  ecVal[(pwmEcho*3)+1] = pwm_val;
  ecVal[(pwmEcho*3)+2] = pwm_val &amp;gt;&amp;gt; 8;
  pwmEcho++;
}

void sendPwmEcho() {
  uint8_t ch = 0;
  while (pwmEcho) {
    pwmEcho--;
    uint8_t pwm[5] = {pwmHD, ecVal[ch*3], ecVal[(ch*3)+1], ecVal[(ch*3)+2], echoHD};
    SerialBT.write(pwm, 5); ch++; delay(10);
  }
}

void sendText(String str) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 18) {
     repeat = (len/18)+1;
     endLen = (len%18);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = strHD;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 18;
    else ed = endLen;
    for (int i = 1; i &amp;lt; ed+1; i++) {
      temp[i] = str[(r*18)+i-1];
    }
    if (repeat-r &amp;gt; 1) temp[ed+1] = echoHD;
    else temp[ed+1] = footHD;
    temp[ed+2] = '\0';
    SerialBT.print(temp);
    delay(10);
  }
}

///////////////////////////////////////// CONNECTION 
void requstDateTime(){ 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  delay(10);
}

void send_message(String str, uint8_t head, uint8_t fn) {
  char temp [21]; // 18
  uint16_t len = str.length();
  uint8_t repeat = 1;
  uint8_t endLen = 0;
  if (len &amp;gt; 17) {
     repeat = (len/17)+1;
     endLen = (len%17);
  } else endLen = len;
  for (int r = 0; r &amp;lt; repeat; r++) {
    temp[0] = head;
    temp[1] = fn;
    uint8_t ed = 0;
    if (repeat-r &amp;gt; 1) ed = 17;
    else ed = endLen;
    for (int i = 2; i &amp;lt; ed+2; i++) {
      temp[i] = str[(r*17)+i-2];
    }
    if (repeat-r &amp;gt; 1) temp[ed+2] = echoHD;
    else temp[ed+2] = footHD;
    temp[ed+3] = '\0';
    SerialBT.print(temp);
    delay(10);
  }
}

void sendMessage(String str) {
  send_message(str, connectHD, 0x04);
}

void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x05, 0x00};
  SerialBT.write(setVal, 3);
  delay(10);
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveSlide(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}

// SEND SLIDE GET VALUE INTERVAL
void setSlideInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  delay(10);
}

// 0: not use, 1: show only name, 2: show name &amp;amp; pass // defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}

void showDialogMenu(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x04, val, 0x00};
  SerialBT.write(setVal, 4);
  delay(10);
}

//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPMain) { 
  String str = String(val); str += ','; 
  str += group1; str += ','; 
  str += group2; str += ',';
  str += pwmDPMain;
  send_message(str, optionHD, 0x05);
}

///////////////////////// SET MAIN DISPLAY
//F(&quot;111111111111111&quot;  // button 1 ~ 15, 0:hide 1:display
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ 
  send_message(str, optionHD, 0x06);
}

//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;)) // slider 1 ~ 6
void setButtonLabel(String str){ 
  send_message(str, optionHD, 0x07);
}

//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  send_message(str, optionHD, 0x08);
}

//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  send_message(str, optionHD, 0x09);
}

//title: Test Mode
//text: Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;
void setAppTitleMessage(String title, String text){
  String str = title; str += ','; 
  str += text; 
  send_message(str, optionHD, 0x0A);
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String str = F(&quot;RAD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; str += ':';
  str += String(selection);
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String str = F(&quot;CKB:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':';
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String str = F(&quot;CHD:&quot;); 
  str += String(id); str += ':'; 
  str += message; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String str = F(&quot;LSD:&quot;); 
  str += String(id); str += ':';
  str += title; str += ':'; 
  str += option; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  String str = F(&quot;STR:&quot;); 
  str += String(id); str += ':'; 
  str += title; 
  send_message(str, optionHD, 0x0B);
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  setDisplay(F(&quot;111111111111111&quot; // button 1 ~ 15, 0:hide 1:display
               &quot;111111&quot;          // slider 1 ~ 6
               &quot;11&quot;));           // Text Input/Floating Button
  setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,&quot;
                   &quot;BT12,BT13,BT14,BT15,PW1,PW2,PW3,PW4,PW5,PW6&quot;));
  setActiveSlide(true); setSlideInterval(100);
}

// SEND LOCAL STATE AT PRESENT TO APP
void send_iniState() { // current state
  sendPinState(10); 
  sendPinState(21); 
  sendPinState(30); 
  sendPinState(41); 
  sendPinState(50); 
  sendPinState(61); 
  sendPinState(71); 
  sendPinState(80); 
  sendPinState(91); 
  sendPinState(101); 
  sendPinState(110); 
  sendPinState(121); 
  sendPinState(130); 
  sendPinState(141); 
  sendPinState(150); 
  sendPwmSlide(1, 110); 
  sendPwmSlide(2, 120); 
  sendPwmSlide(3, 210); 
  sendPwmSlide(4, 0); 
  sendPwmSlide(5, 0); 
  sendPwmSlide(6, 0);
}

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  SerialBT.print(command); // send the read character to the SerialBT
  long int time = millis();
  String response = &quot;&quot;;
  while( (time+500) &amp;gt; millis()) {
    while(SerialBT.available()) {  
      char c = SerialBT.read(); // 
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) break; 
  }
  return response;
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
  else {  
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUCON app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUCON app settings: label/toggle properties, Slide Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1669358045713&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  setDisplay(F(&quot;111111111111111&quot; // button 1 ~ 15, 0:hide 1:display
               &quot;111111&quot;          // slider 1 ~ 6
               &quot;11&quot;));           // Text Input/Floating Button
  setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); // Set Color Picker and Pwm Nob
  setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,&quot; // set labels
                   &quot;BT12,BT13,BT14,BT15,PW1,PW2,PW3,PW4,PW5,PW6&quot;));
  setButtonToggle(F(&quot;111111111111111&quot;)); // button 1 ~ 15, toggle setting, 0:push 1:toggle
  setMinMax(F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;));  // slider 1 ~ 6
  setAppTitleMessage(F(&quot;Test Mode&quot;), // Change title for Arduino code on the app
  F(&quot;Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&quot; //Message
    &quot;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;&quot;
    &quot;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;&quot;));
  setActiveSlide(true); setSlideInterval(100);  // Active Slide Mode
  setSSIDLabelMode(0);   // Set the function of the label displaying Wi-Fi connection
  showDialogMenu(true);  // show menu button
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the screen number (pageId).&lt;/p&gt;
&lt;pre id=&quot;code_1669358221010&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (pageId == 4) Serial.println(F(&quot;powor : on&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;));
                  break;
      case 10: if (pageId == 4) Serial.println(F(&quot;powor : off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (pageId == 4) { 
                 Serial.println(F(&quot;motor1 : on&quot;)); 
                 sendPinState(30); 
               } else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (pageId == 4) Serial.println(F(&quot;motor1 : off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (pageId == 4) { 
                 Serial.println(F(&quot;motor2 : on&quot;)); 
                 sendPinState(20); 
               } else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (pageId == 4) Serial.println(F(&quot;motor2 : off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 201: Serial.println(F(&quot;button 20 : click&quot;));
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,Dial_Nob,Color_Picker,Key_Pad,Arrow_Pad,Main&quot;)); // dialog message
                  break;              
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1669358267970&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t pageId = 0;  // screen number

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }         // radio button
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }    // Checkbox
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }    // Select button
  else if (temp.startsWith(F(&quot;LSD&quot;))) {       // List Window
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;Dial&quot;))) {           // Dial Nob screen 
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(4, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 1; 
      } else if (temp.startsWith(F(&quot;Color&quot;))) {   // Color Picker screen
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(2, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 2; 
      } else if (temp.startsWith(F(&quot;Key&quot;))) {     // Key Pad screen
        if (pageId &amp;lt;= 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111111111100011111110&quot;)); 
        setButtonToggle(F(&quot;000000000000111&quot;));
        setButtonLabel(F(&quot;1,2,3,4,5,6,7,8,9,*,0,#&quot;));
        pageId = 3;
      } else if (temp.startsWith(F(&quot;Arrow&quot;))) {   // Arrow Pad screen
        if (pageId &amp;lt;= 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111101010101011111110&quot;)); 
        setButtonToggle(F(&quot;111111000000000&quot;));
        setButtonLabel(F(&quot;Power,Motor1,Moror2,BT4,BT5,BT6,7,Up,9,Left,0,Right,0,Down&quot;));
        pageId = 4;
      } else {                                    // Main screen
        if (pageId &amp;lt;= 2) { setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 0; }
        setDisplay(F(&quot;11111111111111111111111&quot;));
        setButtonToggle(F(&quot;111111111111111&quot;));
        setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15&quot;));
        send_State();
        pageId = 0;
      }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }       // Input text
  else {  
    if (temp.length() &amp;lt; 6) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_HMI_BLE_CONTROL_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/5C4Xm/btrR70ncBzu/7rkM5Bz21bjat9LjIyHBGK/ARDUINO_HMI_BLE_CONTROL_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_HMI_BLE_CONTROL_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/KW_kFqago7Q&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/KW_kFqago7Q&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/KW_kFqago7Q&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Change name of BT05 on ADUCON App&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dH65rF/btrR8insKjZ/oIRklOkU6OyEQDr7lKHUyk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dH65rF/btrR8insKjZ/oIRklOkU6OyEQDr7lKHUyk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dH65rF/btrR8insKjZ/oIRklOkU6OyEQDr7lKHUyk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdH65rF%2FbtrR8insKjZ%2FoIRklOkU6OyEQDr7lKHUyk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cH1GwO/btrR6HaF0hQ/YsiJIgTr9bHkVSLMb4cVj1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cH1GwO/btrR6HaF0hQ/YsiJIgTr9bHkVSLMb4cVj1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cH1GwO/btrR6HaF0hQ/YsiJIgTr9bHkVSLMb4cVj1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcH1GwO%2FbtrR6HaF0hQ%2FYsiJIgTr9bHkVSLMb4cVj1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;121&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save the name for BT05.&lt;/p&gt;
&lt;pre id=&quot;code_1669358567281&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char btName[11] = &quot;BTO5&quot;;  // 10 char&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EEPROM Setting&lt;/p&gt;
&lt;pre id=&quot;code_1669358586760&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;EEPROM.h&amp;gt;
void loadConfig() {  Read name
  for (int i = 0; i &amp;lt; 11; i++) btName[i] = EEPROM.read(1012 + i); // sizeof(pass)-1
}

void saveConfig() { // Write name
  for (int i = 0; i &amp;lt; 11; i++) EEPROM.write(1012 + i, btName[i]); // sizeof(pass)-1
}

// After uploading the sketch to the Arduino, write it once to the EEPROM or read the values stored in the EEPROM when booting.
void setup() {
  if(EEPROM.read(1023) != 1) { 
    for (int i = 0 ; i &amp;lt; EEPROM.length() ; i++) EEPROM.write(i, 0); // EEPROM Clear
    EEPROM.write(1023, 1);   // flag for status of saving
    saveConfig();      // Write ID and Password at initialization
  } else loadConfig(); // Read saved ID and Password when Arduino is rebooting
}

// EEPROM initialization code at serial monitor
void loop() {
  if(Serial.available()) { // Serial monitor code
    String temp = Serial.readStringUntil('\n'); 
    Serial.println(temp);
    if (temp == F(&quot;1&quot;)) {
      EEPROM.write(1023, 0);
      Serial.println(&quot;EEPROM INI&quot;);
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- If there is a PIN number in received data, remove it and then save parsing data for name and send a message applyed in Arduino.&lt;/p&gt;
&lt;pre id=&quot;code_1669359101057&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void changeBTname(String str) { // NA1empty0HC06
  bool save = false;
  String temp = str.substring(0, 1);
  bool delPass = temp.toInt();
  str.remove(0, 1);
  if (delPass) str.remove(0, 6);
  if (str != btName) {
    if (temp != &quot;&quot;) {
      for (int i = 0; i &amp;lt; str.length(); i++) btName[i] = str[i];
      btName[str.length()] = '\0';
      save = true; 
    }
  }
  Serial.println(btName);
  if (save) {
    saveConfig();
    temp  = F(&quot;&amp;lt;p&amp;gt; NAME:  &quot;);
    temp += btName;
    temp += F(&quot;&amp;lt;/p&amp;gt;Value's Saved.&quot;);
    temp += F(&quot; It will disconnect for Setting.&amp;lt;br/&amp;gt;try to reconnect.&quot;);
    sendMessage(temp);
    sendDisconnect(); delay(2000); 
    Serial.println(sendData(changeName(btName))); // SET NAME &quot;BTO5&quot;
    Serial.println(sendData(F(&quot;RESET&quot;)));    // SOFTWARE REBOOT
  } else sendMessage(F(&quot;There's no change.&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_HMI_BLE_CONTROL_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b2KIwr/btrR7hppQwa/QP4XVO8cASiIJtAVZ1Umyk/ARDUINO_HMI_BLE_CONTROL_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_HMI_BLE_CONTROL_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_EEPROM_INI.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/L0Id9/btrR5hQ0aUL/pcuTJrlkMVmteM0HDn2ORk/ARDUINO_EEPROM_INI.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_EEPROM_INI.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Change all data to 0 in EEPROM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/QTzFAwWkLzg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/QTzFAwWkLzg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/QTzFAwWkLzg&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ADUCON - Arduino wireless remote control application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUCON</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/188</guid>
      <comments>https://postpop.tistory.com/188#entry188comment</comments>
      <pubDate>Fri, 25 Nov 2022 14:02:32 +0900</pubDate>
    </item>
    <item>
      <title>Arduino Basic code for BLE remote contol with BT05</title>
      <link>https://postpop.tistory.com/187</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GEuUv/btrU45tkSho/Zp0YfZZkK61klidB7zYon0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GEuUv/btrU45tkSho/Zp0YfZZkK61klidB7zYon0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GEuUv/btrU45tkSho/Zp0YfZZkK61klidB7zYon0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGEuUv%2FbtrU45tkSho%2FZp0YfZZkK61klidB7zYon0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The default baud rate of BT05 is 9600. Therefore, software serial can be used in Arduino without a baud rate change.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Tof7x/btrR7R4iQrB/tGCJbJkxJsCp5IYlfeOoUK/DX-BT05-A%204.0%20AT%20Commands%20%28Chinese%29.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;DX-BT05-A 4.0 AT Commands (Chinese).pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.16MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectionHC06.jpg&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3uVjg/btrR34JMjWu/tI1caVZsTpvk2cvKymA1Z0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3uVjg/btrR34JMjWu/tI1caVZsTpvk2cvKymA1Z0/img.jpg&quot; data-alt=&quot;Arduino board and BT05 wiring&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3uVjg/btrR34JMjWu/tI1caVZsTpvk2cvKymA1Z0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3uVjg%2FbtrR34JMjWu%2FtI1caVZsTpvk2cvKymA1Z0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Arduino board and BT05 wiring&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;480&quot; data-filename=&quot;connectionHC06.jpg&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Arduino board and BT05 wiring&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Wire connection for Arduino and BT05&lt;br /&gt;BT05&amp;nbsp;&amp;nbsp;&amp;nbsp;Arduino&lt;br /&gt;VCC -&amp;gt;&amp;nbsp;&amp;nbsp;3.3V/5V&lt;br /&gt;GND -&amp;gt;&amp;nbsp;&amp;nbsp;GND&lt;br /&gt;TXD -&amp;gt;&amp;nbsp;&amp;nbsp;Pin 2 (Set as RX pin in Arduino code)&lt;br /&gt;RXD -&amp;gt;&amp;nbsp;&amp;nbsp;Pin 3 (set as TX pin in Arduino code)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- How to check baud rate of the module&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Module and Arduino must be well wired in hardware.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Upload the basic Sketch which is coded baud rate &quot;9600&quot; of Serial.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. set option to &quot;Both NL &amp;amp; CR&quot; for Serial Monitor of Arduino IDE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Set baud rate to &quot;9600&quot; at Serial Monitor of Arduino IDE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Input &quot;AT&quot; at text window and if get &quot;OK&quot; as a response, the baud rate of the module is 9600.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. If not, try to change baud rate to 115200 or another value in the sketch and upload.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Set baud rate to &quot;115200&quot; or another value at Serial Monitor of Arduino IDE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Input &quot;AT&quot; at text window and if get &quot;OK&quot; as a response, the baud rate of the module is 115200. if not repeat no.7 ~ 9.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cIiu6i/btrR6HtA4mB/TYxbioxkSAhNlfK6Givkl0/SERIAL_BASIC_BT05.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;SERIAL_BASIC_BT05.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669346889571&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt; 
#define BT_rxPin 3 // Bluetooth RX -&amp;gt; 3(arduino TX)
#define BT_txPin 2 // Bluetooth TX -&amp;gt; 2(arduino RX)
SoftwareSerial SerialBT(BT_txPin, BT_rxPin); // (arduino RX, arduino TX)

void setup() {
  Serial.begin(9600);  // Serial Monitor and baud rate 
  SerialBT.begin(9600);   // ESP01 serial and baud rate 
}

void loop() {
  if (SerialBT.available()) {
    Serial.write(SerialBT.read()); //Output the contents of the ESP01 to the serial monitor
  }
  if (Serial. available()) {
    SerialBT.write(Serial.read()); //Write the contents of the serial monitor to the ESP01
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;baudRateChange9600.jpg&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byfWfp/btrR5haVWb5/OYoRdFkUd5HKzWWq3Xq5m0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byfWfp/btrR5haVWb5/OYoRdFkUd5HKzWWq3Xq5m0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byfWfp/btrR5haVWb5/OYoRdFkUd5HKzWWq3Xq5m0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyfWfp%2FbtrR5haVWb5%2FOYoRdFkUd5HKzWWq3Xq5m0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;464&quot; data-filename=&quot;baudRateChange9600.jpg&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- How to change baud rate of BT05&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; border: 1px solid #99cefa; background-color: #f6f9fd;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; padding: 10px 10px 10px 10px;&quot;&gt;the Bluetooth serial baud rate list of BT05&lt;br /&gt;4---------9600 (Default)&lt;br /&gt;5---------19200&lt;br /&gt;6---------38400&lt;br /&gt;7---------57600&lt;br /&gt;8---------115200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If current baud rate is 9600 and want to change the baud rate to 115200, input &quot;AT+BAUD8&quot; at text window and get OK115200 as a response, then the change has been made.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Precautions when using the BT05 with Serial communication&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;While receiving data from HC-06 through software serial communication in Arduino, If Arduino transmits data to HC-06 some of the data received through Bluetooth from the app may be missing. (Probably the first byte) This could be an error in the software serial library. Therefore, It must be coded to transmit data to HC-06 after receiving data from HC-06.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When sending data sequentially using multiple functions such as &quot;SerialBT.write(setVal, 4); SerialBT.write(setVal, 4); SerialBT.write(setVal, 4);&quot;, the dealay must be given between each function about 10 Milliseconds. Sending the function's data consecutively without delay can cause certain bytes in the function to be missed. This is probably because BT05 needs time to complete data transmission.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Key code for remote control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Set Software serial to communicate with BT05.&lt;/p&gt;
&lt;pre id=&quot;code_1669349494253&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt; 
#define BT_rxPin 3 // Bluetooth RX -&amp;gt; 3(arduino TX)
#define BT_txPin 2 // Bluetooth TX -&amp;gt; 2(arduino RX)
SoftwareSerial SerialBT(BT_txPin, BT_rxPin); // (arduino RX, arduino TX)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Function that executes AT command for BT05 setup&lt;/p&gt;
&lt;pre id=&quot;code_1669349546445&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  SerialBT.print(command); // send the read character to the SerialBT
  long int time = millis();
  String response = &quot;&quot;;
  while( (time+500) &amp;gt; millis()) {
    while(SerialBT.available()) {  
      char c = SerialBT.read(); // 
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) break; 
  }
  return response;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- setup&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1669349586781&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);   // Software Serial for Serial monitor of Arduino IDE
  SerialBT.begin(9600); // Software Serial for BT05 
  Serial.println(sendData(F(&quot;NAMEBTO5&quot;))); // SET NAME &quot;BTO5&quot;
  Serial.println(sendData(F(&quot;RESET&quot;)));    // SOFTWARE REBOOT
  Serial.println(F(&quot;Blutooth 4.0 BTO5&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1669711378708&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool gotData = false;

void loop() {
  if (SerialBT.available()) { // when incomming data from HC06
    uint8_t temp = SerialBT.read();
    Serial.println(temp); // Output data of the HC06 to the serial monitor.
    if (temp == 10) gotData = true; // if got '\n', the flag for response
  } else {
    if (gotData) {   // if response
      String setVal = &quot;&quot;;
      setVal += char(0xF4);      // protocol header of text for ADUCON with bluetooth
      setVal += &quot;Hello World &quot;;
      setVal += random(100,200); // the message for sending
      setVal += char(0xF1);      // protocol footer of text for ADUCON with bluetooth
      Serial.println(setVal);    // Output the message to the serial monitor.
      SerialBT.print(setVal);    // send data to HC06 as response 
      gotData = false;           // initialize the flag
      delay(10);                 // delay for sending data at BT05
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SERIAL_BASIC_BT05.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bjZddS/btrSqtbCpv6/Gi0zVKyjyJcs3IYulpL4dk/ARDUINO_BT05_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_BT05_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ARDUINO_BT05_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorBT05.jpg&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnHPDy/btrSqXchMjK/mGlGqkSEScWPnj6MyKl7Z0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnHPDy/btrSqXchMjK/mGlGqkSEScWPnj6MyKl7Z0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnHPDy/btrSqXchMjK/mGlGqkSEScWPnj6MyKl7Z0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnHPDy%2FbtrSqXchMjK%2FmGlGqkSEScWPnj6MyKl7Z0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorBT05.jpg&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** To test the code above, you need an app that transmits data via Bluetooth.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/188&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - Arduino BLE remote control with ADUCON and BT05&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/189&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - Arduino BLE remote control with ADUPAD and BT05&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ADUCON - Arduino wireless remote control application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ADUPAD - Arduino wireless remote control PAD application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237339718&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUCON - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&amp;amp;hl=ko&amp;amp;gl=KR&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUCON - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237347104&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUPAD - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&amp;amp;hl=ko&amp;amp;gl=JP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUPAD - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/187</guid>
      <comments>https://postpop.tistory.com/187#entry187comment</comments>
      <pubDate>Fri, 25 Nov 2022 12:45:15 +0900</pubDate>
    </item>
    <item>
      <title>Arduino Bluetooth remote control with ADUPAD and HC-06</title>
      <link>https://postpop.tistory.com/186</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUPAD application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5N7Nb/btrRZMB3C9I/RyXb2xwSlK28rxIHyds9v0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5N7Nb/btrRZMB3C9I/RyXb2xwSlK28rxIHyds9v0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5N7Nb/btrRZMB3C9I/RyXb2xwSlK28rxIHyds9v0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5N7Nb%2FbtrRZMB3C9I%2FRyXb2xwSlK28rxIHyds9v0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;868&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qnhSt/btrVamHSJTf/JqooB1Vxx7HejqzxcWqqxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qnhSt/btrVamHSJTf/JqooB1Vxx7HejqzxcWqqxk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qnhSt/btrVamHSJTf/JqooB1Vxx7HejqzxcWqqxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqnhSt%2FbtrVamHSJTf%2FJqooB1Vxx7HejqzxcWqqxk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Please&amp;nbsp;refer&amp;nbsp;to&amp;nbsp;the&amp;nbsp;post&amp;nbsp;below&amp;nbsp;for&amp;nbsp;how&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;Arduino&amp;nbsp;and&amp;nbsp;HC-06.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/184&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Arduino Basic code for bluetooth remote contol with HC-06&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_HC06_BASIC.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bAYpwi/btrSmZH52pQ/ngGrBIZkS8ubhDgF1zJAx0/ARDUINO_HC06_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_HC06_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1669695731112&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool gotData = false;

void loop() {
  if (SerialBT.available()) { // when incomming data from HC06
    uint8_t temp = SerialBT.read();
    Serial.println(temp); // Output data of the HC06 to the serial monitor.
    gotData = true; // the flag for response
  } else {
    if (gotData) {   // if response
      String setVal = &quot;&quot;;
      setVal += char(0xF4);      // protocol header of text for ADUPAD with bluetooth
      setVal += &quot;Hello World &quot;;
      setVal += random(100,200); // the message for sending
      setVal += char(0xF1);      // protocol footer of text for ADUPAD with bluetooth
      Serial.println(setVal);    // Output the message to the serial monitor.
      SerialBT.print(setVal);    // send data to HC06 as response 
      gotData = false;           // initialize the flag
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ARDUINO_HC06_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorHC06.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc9ltK/btrSplw8cW4/jML7U3NWpL3HFmGmKuQarK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc9ltK/btrSplw8cW4/jML7U3NWpL3HFmGmKuQarK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc9ltK/btrSplw8cW4/jML7U3NWpL3HFmGmKuQarK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc9ltK%2FbtrSplw8cW4%2FjML7U3NWpL3HFmGmKuQarK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorHC06.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pairing HC-06 to mobile phone and connecting to HC-06 on the ADUPAD app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Bluetooth pairing&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Select the HC06 on the Bluetooth setting screen of your mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pairingHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yE5Pg/btrSm160nfm/NGKanCoXG5Yd4Zy7d8kBLK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yE5Pg/btrSm160nfm/NGKanCoXG5Yd4Zy7d8kBLK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yE5Pg/btrSm160nfm/NGKanCoXG5Yd4Zy7d8kBLK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyE5Pg%2FbtrSm160nfm%2FNGKanCoXG5Yd4Zy7d8kBLK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;295&quot; data-filename=&quot;pairingHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Input the password when requesting the pairing password and click the confirm when the connection message is output as shown below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputPassHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RC5Ks/btrSnFo8DTO/QEQLX2fbVKcollQaffOcC0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RC5Ks/btrSnFo8DTO/QEQLX2fbVKcollQaffOcC0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RC5Ks/btrSnFo8DTO/QEQLX2fbVKcollQaffOcC0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRC5Ks%2FbtrSnFo8DTO%2FQEQLX2fbVKcollQaffOcC0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;215&quot; data-filename=&quot;inputPassHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bluetooth pairing complete&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pairedHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uaJtl/btrSlEq877t/M2kU34nqDh5fl8xCWF4tO1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uaJtl/btrSlEq877t/M2kU34nqDh5fl8xCWF4tO1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uaJtl/btrSlEq877t/M2kU34nqDh5fl8xCWF4tO1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuaJtl%2FbtrSlEq877t%2FM2kU34nqDh5fl8xCWF4tO1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;296&quot; data-filename=&quot;pairedHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Bluetooth 2.0 Search and Connection in the App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth icon in the app and select Bluetooth 2.0 in Select Ver.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth button and select the HC06.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BZrPU/btrSqum3ahC/NSF7ih6WkoIodAsf3QODz1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BZrPU/btrSqum3ahC/NSF7ih6WkoIodAsf3QODz1/img.jpg&quot; data-alt=&quot;Select HC06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BZrPU/btrSqum3ahC/NSF7ih6WkoIodAsf3QODz1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBZrPU%2FbtrSqum3ahC%2FNSF7ih6WkoIodAsf3QODz1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;connectHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Select HC06&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectMonitorHC06.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSi0x5/btrSjnX0EZz/CeYkkJBgTByrzYi3GEWizk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSi0x5/btrSjnX0EZz/CeYkkJBgTByrzYi3GEWizk/img.jpg&quot; data-alt=&quot;received data &amp;quot;248(0xF8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSi0x5/btrSjnX0EZz/CeYkkJBgTByrzYi3GEWizk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSi0x5%2FbtrSjnX0EZz%2FCeYkkJBgTByrzYi3GEWizk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;connectMonitorHC06.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data &quot;248(0xF8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectedHC06adupad.jpg&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btYT63/btrSnFbFWEa/fyDScctoG4vk5sdIZfTjFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btYT63/btrSnFbFWEa/fyDScctoG4vk5sdIZfTjFk/img.jpg&quot; data-alt=&quot;connected to HC06 and&amp;amp;amp;nbsp;response from HC06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btYT63/btrSnFbFWEa/fyDScctoG4vk5sdIZfTjFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtYT63%2FbtrSnFbFWEa%2FfyDScctoG4vk5sdIZfTjFk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;267&quot; height=&quot;92&quot; data-filename=&quot;connectedHC06adupad.jpg&quot; data-origin-width=&quot;267&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;connected to HC06 and&amp;amp;nbsp;response from HC06&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with Bluetooth of ADUPAD applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SerialBT_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gl1Yb/btrRYyEmkDn/vYASEZnkmfC5xlaboWr5kk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gl1Yb/btrRYyEmkDn/vYASEZnkmfC5xlaboWr5kk/img.jpg&quot; data-alt=&quot;ADUPAD app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gl1Yb/btrRYyEmkDn/vYASEZnkmfC5xlaboWr5kk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGl1Yb%2FbtrRYyEmkDn%2FvYASEZnkmfC5xlaboWr5kk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;ADUPAD app&amp;amp;#39;s protocol header settings&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;185&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUPAD app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for Bluetooth in the Arduino sketch according to the protocol header settings in the ADUPAD app.&lt;/p&gt;
&lt;pre id=&quot;code_1669262160734&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD 0xF0
#define joyHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define optionHD 0xF9
#define checkHD 0xF5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUPAD app&lt;/p&gt;
&lt;pre id=&quot;code_1669262261127&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

if (appConnection) { // If app connection is confirmed
  // Execute code after app connection is confirmed
} else {
  if (SerialBT.peek() == connectHD) appConnection = true; // Check if the value is 0xF8.
  else { uint8_t dump = SerialBT.read(); }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHD(0xF8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + connect&lt;/span&gt;: Transmit the necessary app settings through the iniSet() function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + NA&lt;/span&gt;: Change setting values for HC-06.&lt;/p&gt;
&lt;pre id=&quot;code_1669262494182&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (temp == F(&quot;connect&quot;)) iniSet(); 
else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; Serial.println(F(&quot;disconnect&quot;)); }
else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); }
else Serial.println(temp);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHD(0xF9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669262559997&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(0xF0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669262669781&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF0 + 1byte Num + 0xF1
while (SerialBT.peek() == pinHD) { // need depend on left arrow pad mode 
  SerialBT.readBytes(data, 3); // Store 3 bytes of data in array &quot;data&quot; from Serial Buffer
  if (data[2] == footHD) { // if the third byte is 0xF1
    pin_control(data[1]);  // execute the code with the value of second byte
    data[2] = 0;
  }
  delay(1);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;joyHD(0xF3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669262803877&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF3 + 1byte Num(id) + 2byte Num(heading) + 1byte Num(strength) + 0xF1
while (SerialBT.peek() == joyHD) { 
  SerialBT.readBytes(data, 6); // Store 6 bytes of data in array &quot;data&quot; from Serial Buffer
  if (data[5] == footHD) {     // if the sixth byte is 0xF1
    uint16_t value = data[3];  // Swap third and fourth bytes
    value = value &amp;lt;&amp;lt; 8 | data[2];
    joystick_control(data[1], value, data[4]); // execute the code with values
    data[5] = 0;
  }
  delay(1);
}
if (joyEcho) { sendJoyEcho(); joyEcho = 0; } // Prevent data transmission while receiving data
// refer to &quot;Precautions when using the HC-06 with Serial communication&quot; posted in Basic code.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Sending a flag that causes the ADUPAD app to immediately terminate the timer for receiving data&lt;/p&gt;
&lt;pre id=&quot;code_1669263137284&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (dataSend) { SerialBT.write(checkHD); dataSend = false; } // send 0xF5 to terminate the timer.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669263263381&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669263286300&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the Joystick state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669263353204&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) { 
  uint8_t joy[6] = {joyHD, id, heading, heading &amp;gt;&amp;gt; 8, strength, footHD};
  SerialBT.write(joy, 6);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the Joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669263410427&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t joyEcho = 0;
uint8_t ecVal[12] = { 0, };

void send_joy_echo(uint8_t id, uint16_t heading, uint8_t strength) {
  if (joyEcho &amp;gt; 2) joyEcho = 0;
  ecVal[joyEcho*4] = id; 
  ecVal[(joyEcho*4)+1] = heading;
  ecVal[(joyEcho*4)+2] = heading &amp;gt;&amp;gt; 8;
  ecVal[(joyEcho*4)+3] = strength; 
  joyEcho++;
}

void sendJoyEcho() {
  uint8_t ch = 0;
  while (joyEcho) {
    joyEcho--;
    uint8_t joy[6] = {joyHD, ecVal[ch*4], ecVal[(ch*4)+1], ecVal[(ch*4)+2], ecVal[(ch*4)+3], echoHD};
    SerialBT.write(joy, 6); ch++;
  }
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text.&lt;/p&gt;
&lt;pre id=&quot;code_1669263479732&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String str) {
  String setVal = &quot;&quot;;
  setVal += char(strHD);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1669263512988&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;disconnect02.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;58&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pXZzn/btrRXuv8pPK/lEDkltwe6Cpadk1usAVmU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pXZzn/btrRXuv8pPK/lEDkltwe6Cpadk1usAVmU0/img.jpg&quot; data-alt=&quot;Disconnect Button for Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pXZzn/btrRXuv8pPK/lEDkltwe6Cpadk1usAVmU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpXZzn%2FbtrRXuv8pPK%2FlEDkltwe6Cpadk1usAVmU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Disconnect Button for Bluetooth&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;45&quot; data-filename=&quot;disconnect02.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;58&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button for Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1669263890899&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendMessage(String str) {
  String setVal = &quot;&quot;;
  setVal += char(connectHD);
  setVal += char(0x04);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8qtWH/btrR1fjVdFR/EmkrVrepvjihnET7xyCy40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8qtWH/btrR1fjVdFR/EmkrVrepvjihnET7xyCy40/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8qtWH/btrR1fjVdFR/EmkrVrepvjihnET7xyCy40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8qtWH%2FbtrR1fjVdFR%2FEmkrVrepvjihnET7xyCy40%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Set the function to continuously transmit the changed value of the Joystick according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** The Gravity Sensor always works in an active Mode.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Joystick Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Joystick Mode&lt;/span&gt;&amp;nbsp;(transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1669264070732&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveJoystick(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqC7q4/btrR2sDklqH/nFAPkT2Buf1WIY9w4SKtq0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqC7q4/btrR2sDklqH/nFAPkT2Buf1WIY9w4SKtq0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqC7q4/btrR2sDklqH/nFAPkT2Buf1WIY9w4SKtq0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqC7q4%2FbtrR2sDklqH%2FnFAPkT2Buf1WIY9w4SKtq0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;98&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Set transmission interval of ACTIVE JOYSTIC MODE. (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669264183307&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoystickInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. Set the range where the strength of the joystick becomes 0. (enter a value from 0 to 35)&lt;/p&gt;
&lt;pre id=&quot;code_1669264206627&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ElBZf/btrRYySaIhH/Kl2fa2PdB2pS5T5QZ2nPvK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ElBZf/btrRYySaIhH/Kl2fa2PdB2pS5T5QZ2nPvK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ElBZf/btrRYySaIhH/Kl2fa2PdB2pS5T5QZ2nPvK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FElBZf%2FbtrRYySaIhH%2FKl2fa2PdB2pS5T5QZ2nPvK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;198&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Set whether or not to use a function that converts the Strength value of Joystick or Gravity Sensor into a value between 0 and 10.&lt;/p&gt;
&lt;pre id=&quot;code_1669264247267&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyStrengthAdjust(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x04, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Activate a timer that sends checkHD(0xF5) at regular time intervals.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Regardless of the app, it is used to reflect independently changed values in the Arduino to the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669264286579&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequest(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x05, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byV0uT/btrRY1Gure1/MPN3mESqOR5Igh59GW7Hkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byV0uT/btrRY1Gure1/MPN3mESqOR5Igh59GW7Hkk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byV0uT/btrRY1Gure1/MPN3mESqOR5Igh59GW7Hkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyV0uT%2FbtrRY1Gure1%2FMPN3mESqOR5Igh59GW7Hkk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;83&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Set the operation interval of the timer sending checkHD(%%F5). (Unit:&lt;span class=&quot;notranslate&quot;&gt;&amp;nbsp;Millisecond&lt;/span&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1669272696447&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequestInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x06, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Set the group for the left arrow keypad.&lt;/p&gt;
&lt;pre id=&quot;code_1669272720480&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){   
  if (val == 0 || val &amp;gt; 2) val = 4; 
  uint8_t setVal[4] = {optionHD, 0x07, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/psxlM/btrR2HOt30A/JrhiWPOx97gqP8eUdHgmEk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/psxlM/btrR2HOt30A/JrhiWPOx97gqP8eUdHgmEk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/psxlM/btrR2HOt30A/JrhiWPOx97gqP8eUdHgmEk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpsxlM%2FbtrR2HOt30A%2FJrhiWPOx97gqP8eUdHgmEk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;88&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Set the 4-way control of the joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669272758785&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  uint8_t setVal[4] = {optionHD, 0x08, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Set whether or not to display the group button.&lt;/p&gt;
&lt;pre id=&quot;code_1669272791566&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  uint8_t setVal[4] = {optionHD, 0x09, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJyLN9/btrR3Dq4yg4/gVlWAN6iTo6mtmK2IK1NV1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJyLN9/btrR3Dq4yg4/gVlWAN6iTo6mtmK2IK1NV1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJyLN9/btrR3Dq4yg4/gVlWAN6iTo6mtmK2IK1NV1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJyLN9%2FbtrR3Dq4yg4%2FgVlWAN6iTo6mtmK2IK1NV1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;31&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/23EOR/btrR2sKQrsP/sbEFmePpN3LAP7ZzpyNUx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/23EOR/btrR2sKQrsP/sbEFmePpN3LAP7ZzpyNUx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/23EOR/btrR2sKQrsP/sbEFmePpN3LAP7ZzpyNUx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F23EOR%2FbtrR2sKQrsP%2FsbEFmePpN3LAP7ZzpyNUx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;145&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TKzgO/btrRY18hxj2/tItb9T0nK39cCJBO7amUoK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TKzgO/btrRY18hxj2/tItb9T0nK39cCJBO7amUoK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TKzgO/btrRY18hxj2/tItb9T0nK39cCJBO7amUoK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTKzgO%2FbtrRY18hxj2%2FtItb9T0nK39cCJBO7amUoK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;137&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1669273149927&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2(OTHER)/3(HC06): show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x0A, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MvOsg/btrRYxfmPDZ/Yxsj2y4rFOFDTJMM3yjPkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MvOsg/btrRYxfmPDZ/Yxsj2y4rFOFDTJMM3yjPkk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MvOsg/btrRYxfmPDZ/Yxsj2y4rFOFDTJMM3yjPkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMvOsg%2FbtrRYxfmPDZ%2FYxsj2y4rFOFDTJMM3yjPkk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set the activation interval of the gravity sensor and transmission of the tilt value.&lt;/p&gt;
&lt;pre id=&quot;code_1669273225287&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x0B, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3flMO/btrR2EK24Ck/wboUjF6GNYe4UxuO9juAs0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3flMO/btrR2EK24Ck/wboUjF6GNYe4UxuO9juAs0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3flMO/btrR2EK24Ck/wboUjF6GNYe4UxuO9juAs0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3flMO%2FbtrR2EK24Ck%2FwboUjF6GNYe4UxuO9juAs0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;83&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIkCCX/btrR22dMeQE/wuwWMs4jaJ2H03K8ARMUuk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIkCCX/btrR22dMeQE/wuwWMs4jaJ2H03K8ARMUuk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIkCCX/btrR22dMeQE/wuwWMs4jaJ2H03K8ARMUuk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIkCCX%2FbtrR22dMeQE%2FwuwWMs4jaJ2H03K8ARMUuk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;48&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. Set labels for buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669273292905&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//f(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0C);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGHgFv/btrR3GafaaW/50za5NujCfYdc1pWdZKaP0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGHgFv/btrR3GafaaW/50za5NujCfYdc1pWdZKaP0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGHgFv/btrR3GafaaW/50za5NujCfYdc1pWdZKaP0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGHgFv%2FbtrR3GafaaW%2F50za5NujCfYdc1pWdZKaP0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;84&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4YnG3/btrR2wzESuv/B9ttkaFZ892ifwDjAmdRUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4YnG3/btrR2wzESuv/B9ttkaFZ892ifwDjAmdRUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4YnG3/btrR2wzESuv/B9ttkaFZ892ifwDjAmdRUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4YnG3%2FbtrR2wzESuv%2FB9ttkaFZ892ifwDjAmdRUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;178&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. Set the toggle/push properties of the left 4 buttons or 20 buttons of all.&lt;/p&gt;
&lt;pre id=&quot;code_1669273384070&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0000&quot;)          // left pad: up-left-right-down
//F(&quot;00000000001111110000&quot;) // 0000:left, 0000:right, 001111110000:center
void setLeftPadOrAllToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d028Y4/btrR21lFLqN/h6ohunglk4BeHfB2rtjmY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d028Y4/btrR21lFLqN/h6ohunglk4BeHfB2rtjmY0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d028Y4/btrR21lFLqN/h6ohunglk4BeHfB2rtjmY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd028Y4%2FbtrR21lFLqN%2Fh6ohunglk4BeHfB2rtjmY0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;105&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21. Set the toggle/push properties of the right 4 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669273452983&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;0000&quot;)           // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0E);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22. Set the toggle/push properties of the middle 12 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669273472950&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;000000000000&quot;); // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ // must after setLeftPadMode(uint8_t val)
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0F);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;23. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1669273497174&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;RAD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; setVal += ':';
  setVal += String(selection);
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0kdSz/btrR2SWAhuU/U35Mk3aeNE0dohqc3WCAk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0kdSz/btrR2SWAhuU/U35Mk3aeNE0dohqc3WCAk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0kdSz/btrR2SWAhuU/U35Mk3aeNE0dohqc3WCAk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0kdSz%2FbtrR2SWAhuU%2FU35Mk3aeNE0dohqc3WCAk1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;24. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669273549175&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;CKB:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TJJZx/btrR3dMVepU/GhedyCJnRSEqyXHkCWMt4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TJJZx/btrR3dMVepU/GhedyCJnRSEqyXHkCWMt4k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TJJZx/btrR3dMVepU/GhedyCJnRSEqyXHkCWMt4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTJJZx%2FbtrR3dMVepU%2FGhedyCJnRSEqyXHkCWMt4k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;25. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1669273586030&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;CHD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += message; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DBdsL/btrRYt45v8C/Ouyr1fCdSbBAqqmxo3LvJ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DBdsL/btrRYt45v8C/Ouyr1fCdSbBAqqmxo3LvJ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DBdsL/btrRYt45v8C/Ouyr1fCdSbBAqqmxo3LvJ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDBdsL%2FbtrRYt45v8C%2FOuyr1fCdSbBAqqmxo3LvJ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;26. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1669273624071&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;LSD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3r7rs/btrRYyFnDGi/V1C6NkWQvmOPSCSYK7WAJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3r7rs/btrRYyFnDGi/V1C6NkWQvmOPSCSYK7WAJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3r7rs/btrRYyFnDGi/V1C6NkWQvmOPSCSYK7WAJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3r7rs%2FbtrRYyFnDGi%2FV1C6NkWQvmOPSCSYK7WAJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;429&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;27. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1669273670751&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;STR:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ac8w5/btrR1gYfAsP/nw0V2HX12vxV4MrOF1HPu0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ac8w5/btrR1gYfAsP/nw0V2HX12vxV4MrOF1HPu0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ac8w5/btrR1gYfAsP/nw0V2HX12vxV4MrOF1HPu0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAc8w5%2FbtrR1gYfAsP%2Fnw0V2HX12vxV4MrOF1HPu0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.ARDUINO_BT_JOYSTICK.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bahDE4/btrRYxfoXPc/2vcspF5kKuLZ0bQdz0aL50/1.ARDUINO_BT_JOYSTICK.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1.ARDUINO_BT_JOYSTICK.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/PCqG1aAAz80&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/PCqG1aAAz80&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/PCqG1aAAz80&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669273795719&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt; 
#define BT_rxPin 3 // Bluetooth RX -&amp;gt; 3(arduino TX)
#define BT_txPin 2 // Bluetooth TX -&amp;gt; 2(arduino RX)
SoftwareSerial SerialBT(BT_txPin, BT_rxPin); // (arduino RX, arduino TX)

#define btName F(&quot;HC06&quot;)
#define pass F(&quot;1234&quot;)

#include &quot;protocol.h&quot;

#define ledPin 13

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);  
  SerialBT.begin(9600); //Bluetooth 
  Serial.println(sendData(F(&quot;NAME&quot;),btName,false)); // SET NAME &quot;HC06&quot;
  //Serial.println(sendData(F(&quot;PIN&quot;),pass,true));  // SET PASS 
  Serial.println(&quot;Bluetooth 2.0&quot;);
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(&quot;button 1 : on&quot;); 
                  break;
      case 10: Serial.println(&quot;button 1 : off&quot;);
                  break;
      case 21: Serial.println(&quot;button 2 : on&quot;);
                  break;
      case 20: Serial.println(&quot;button 2 : off&quot;);
                  break;
      case 31: Serial.println(&quot;button 3 : on&quot;);
                  break;
      case 30: Serial.println(&quot;button 3 : off&quot;);
                  break;
      case 41: Serial.println(&quot;button 4 : on&quot;);
                  break;
      case 40: Serial.println(&quot;button 4 : off&quot;);
                  break;
      case 51: Serial.println(&quot;button 5 : on&quot;);
                  break;
      case 50: Serial.println(&quot;button 5 : off&quot;);
                  break;
      case 61: Serial.println(&quot;button 6 : on&quot;);
                  break;
      case 60: Serial.println(&quot;button 6 : off&quot;);
                  break;
      case 71: Serial.println(&quot;button 7 : on&quot;);
                  break;
      case 70: Serial.println(&quot;button 7 : off&quot;);
                  break;
      case 81: Serial.println(&quot;button 8 : on&quot;);
                  break;
      case 80: Serial.println(&quot;button 8 : off&quot;);
                  break;
      case 91: Serial.println(&quot;button 9 : on&quot;);
                  break;
      case 90: Serial.println(&quot;button 9 : off&quot;);
                  break;  
      case 101: Serial.println(F(&quot;button 10 : on&quot;));
                //uint8_t id, String title, String option
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,tomato,banana,mango&quot;)); 
                  break;
      case 100: Serial.println(&quot;button 10 : off&quot;);
                  break;  
      case 111: Serial.println(&quot;button 11 : on&quot;);
                  break;
      case 110: Serial.println(&quot;button 11 : off&quot;);
                  break;  
      case 121: Serial.println(&quot;button 12 : on&quot;);
                  break;
      case 120: Serial.println(&quot;button 12 : off&quot;);
                  break;  
      case 131: Serial.println(&quot;button 13 : on&quot;);
                  break;  
      case 130: Serial.println(&quot;button 13 : off&quot;);
                  break;  
      case 141: Serial.println(&quot;button 14 : on&quot;);
                  break;  
      case 140: Serial.println(&quot;button 14 : off&quot;);
                  break;  
      case 151: Serial.println(&quot;button 15 : on&quot;);
                  break;  
      case 150: Serial.println(&quot;button 15 : off&quot;);
                  break;         
      case 161: Serial.println(F(&quot;button 16 : on&quot;));
                  break;
      case 160: Serial.println(F(&quot;button 16 : off&quot;));
                  break;  
      case 171: Serial.println(F(&quot;button 17 : on&quot;));
                  break;
      case 170: Serial.println(F(&quot;button 17 : off&quot;));
                  break;  
      case 181: Serial.println(F(&quot;button 18 : on&quot;));
                  break;  
      case 180: Serial.println(F(&quot;button 18 : off&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : on&quot;));
                  break;  
      case 190: Serial.println(F(&quot;button 19 : off&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : on&quot;));
                  break;  
      case 200: Serial.println(F(&quot;button 20 : off&quot;));
                  break; 
      case 210: Serial.println(F(&quot;button 21 : off&quot;));
                  break;  
      case 220: Serial.println(F(&quot;button 22 : off&quot;));
                  break;           
    }
  }
}

// headingVal = false;
//           Top
//         6  7  0
//          \ | /
//  Left 5 --   -- 1 Right
//          / | \
//         4  3  2
//          Bottom

bool headingVal = true; 

void joystick_control(uint8_t id, uint16_t heading, uint8_t strength) {
  //sendJoyEcho(id, heading, strength); 
  if (id == 0) Serial.print(F(&quot;L: &quot;));
  else if (id == 1) Serial.print(F(&quot;R: &quot;));
  else Serial.print(F(&quot;C: &quot;));
  if (headingVal) {
    Serial.print(heading); Serial.print('/'); Serial.println(strength);
  } else {
    if (heading &amp;lt;= 23) heading = 359;
    int8_t stickDir = (heading-23)/45;  
    Serial.println(stickDir);
  }
}

bool appConnection = false;
uint8_t data[6] = {0, 0, 0, 0, 0, 0};

void SerialBT_read() {
  if (SerialBT.available()) {  
    if (appConnection) {
      if (SerialBT.peek() == joyHD) { // 0xF3
        while (SerialBT.peek() == joyHD) {
          SerialBT.readBytes(data, 6);
          if (data[5] == footHD) {
            uint16_t value = data[3];
            value = value &amp;lt;&amp;lt; 8 | data[2];
            joystick_control(data[1], value, data[4]);
            data[5] = 0;
          }
          delay(1);
        }
        if (joyEcho) { sendJoyEcho(); joyEcho = 0; }
      } else if (SerialBT.peek() == pinHD) {  // 0xF0
        while (SerialBT.peek() == pinHD) { // need depend on left arrow pad mode 
          SerialBT.readBytes(data, 3);
          if (data[2] == footHD) {
            pin_control(data[1]);
            data[2] = 0;
          }
          delay(1);
        }
      } else {
        uint8_t dump;
        if (SerialBT.peek() == checkHD) { dump = SerialBT.read(); dataSend = true; }
        else if (SerialBT.peek() == optionHD || SerialBT.peek() == connectHD) { 
          dump = SerialBT.read();
          String temp = SerialBT.readStringUntil('\n');
          if (dump == connectHD) {
            if (temp == F(&quot;connect&quot;)) iniSet();
            else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; Serial.println(F(&quot;disconnect&quot;)); }
            else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); }
            else Serial.println(temp);
          } else CheckF9(temp); 
        } else {
          dump = SerialBT.read();
          Serial.write(dump);
        }
      }
      if (dataSend) { SerialBT.write(checkHD); dataSend = false; }
    } else {
      if (SerialBT.peek() == connectHD) appConnection = true;
      else { uint8_t dump = SerialBT.read(); }
    }
  }
}

void loop() {
  SerialBT_read(); 
  if(Serial.available()) { // if there is data in the serial buffer
    String temp = Serial.readStringUntil('\n'); // option of serial monitor: NEW LINE
    Serial.println(temp);
    if(temp == &quot;1&quot;){   // EEPROM INI
      //EEPROM.write(1023, 0);
    } else if(temp == &quot;2&quot;){ 
      
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669273829615&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD 0xF0
#define joyHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define optionHD 0xF9
#define checkHD 0xF5

bool dataSend = false;

void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}

void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}

// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) { 
  uint8_t joy[6] = {joyHD, id, heading, heading &amp;gt;&amp;gt; 8, strength, footHD};
  SerialBT.write(joy, 6);
  dataSend = true;
}

uint8_t joyEcho = 0;
uint8_t ecVal[12] = { 0, };

void send_joy_echo(uint8_t id, uint16_t heading, uint8_t strength) {
  if (joyEcho &amp;gt; 2) joyEcho = 0;
  ecVal[joyEcho*4] = id; 
  ecVal[(joyEcho*4)+1] = heading;
  ecVal[(joyEcho*4)+2] = heading &amp;gt;&amp;gt; 8;
  ecVal[(joyEcho*4)+3] = strength; 
  joyEcho++;
}

void sendJoyEcho() {
  uint8_t ch = 0;
  while (joyEcho) {
    joyEcho--;
    uint8_t joy[6] = {joyHD, ecVal[ch*4], ecVal[(ch*4)+1], ecVal[(ch*4)+2], ecVal[(ch*4)+3], echoHD};
    SerialBT.write(joy, 6); ch++;
  }
  dataSend = true;
}

void sendText(String str) {
  String setVal = &quot;&quot;;
  setVal += char(strHD);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////////////////////// CONNECTION 
void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}

//#define passName F(&quot;PAS:&quot;)
//#define passNameLen 0x04
//
//void requestPass(bool val){ // order disconnect to App 
//  String setVal = &quot;&quot;;
//  setVal += char(connectHD);
//  setVal += char(0x02);
//  if (val) {
//    setVal += char(passNameLen);
//    setVal += passName;
//  } else setVal += char(val);
//  SerialBT.print(setVal);
//  dataSend = true;
//}
//
//void responsePass(bool val){ // order disconnect to App 
//  uint8_t setVal[3] = {connectHD, 0x03, val};
//  SerialBT.write(setVal, 3);
//  dataSend = true; 
//}

void sendMessage(String str) {
  String setVal = &quot;&quot;;
  setVal += char(connectHD);
  setVal += char(0x04);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveJoystick(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// SEND SLIDE GET VALUE INTERVAL
void setJoystickInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setJoyStrengthAdjust(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x04, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setRequest(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x05, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setRequestInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x06, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){   
  if (val == 0 || val &amp;gt; 2) val = 4; 
  uint8_t setVal[4] = {optionHD, 0x07, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  uint8_t setVal[4] = {optionHD, 0x08, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  uint8_t setVal[4] = {optionHD, 0x09, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// 0: not use, 1: show only name, 2(OTHER)/3(HC06): show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x0A, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x0B, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

//f(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0C);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

//F(&quot;0000&quot;)          // left pad: up-left-right-down
void setLeftPadOrAllToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}
// F(&quot;0000&quot;)           // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0E);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}
// F(&quot;000000000000&quot;); // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ // must after setLeftPadMode(uint8_t val)
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0F);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;RAD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; setVal += ':';
  setVal += String(selection);
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;CKB:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;CHD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += message; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;LSD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x10);
  setVal += F(&quot;STR:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  setAddButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;)); 
  setJoyWay4(false); 
  setActiveJoystick(true); setJoystickInterval(100);
  setJoyStrengthAdjust(true);
  setSSIDLabelMode(0); // not use change btName
  setRequest(false); //setRequestInterval(250);
  //useGravityAndInterval(180 * 2); 
}

String sendData(String order, String val, bool sendPass) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += val;
  if (!sendPass) command += F(&quot;\r\n&quot;);
  SerialBT.print(command); // send the read character to the SerialBT
  long int time = millis();
  String response = &quot;&quot;;
  while( (time+1000) &amp;gt; millis()) {
    while(SerialBT.available()) {  
      char c = SerialBT.read(); 
      response+=c;
    }
  }
  return response;
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUPAD app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUPAD app settings: label/toggle properties, use of the timer for checkHD(0xF5), Joystic Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1669273956231&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  setAddButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;)); 
  setJoyWay4(false); 
  setActiveJoystick(true); setJoystickInterval(100); // Active Slide Mode
  setJoyStrengthAdjust(true);                   // value of Joystick adjusted into 0 ~ 10
  setSSIDLabelMode(0); // not use change btName
  setRequest(false); //setRequestInterval(250); // Disable timer for check(0xF5)
  //useGravityAndInterval(180 * 2); // use or not the Gravity sensor with the interval
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the leftPadMode and menu-related button.&lt;/p&gt;
&lt;pre id=&quot;code_1669274076478&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up DIR&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;)); 
                  break;
      case 10: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left DIR&quot;));
               else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right DIR&quot;));
               else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down DIR&quot;));
               else Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down off&quot;));
               else Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
               //uint8_t id, String title, String option
               dialogList(0, F(&quot;LEFT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(&quot;button 10 : on&quot;);
                //uint8_t id, String title, String option
                dialogList(2, F(&quot;RIGHT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1669274132318&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }         // radio button
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }    // Checkbox
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }    // Select button
  else if (temp.startsWith(F(&quot;LSD&quot;))) {       // List Window
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { leftPadMode = 0; setLeftPadOrAllToggle(F(&quot;0000&quot;)); }
      else if (temp.startsWith(F(&quot;TOG&quot;))) {
        setLeftPadOrAllToggle(F(&quot;1111&quot;)); // set toggle for left button
        dialogList(1, F(&quot;LEFT PAD MODE AT TOGGLE&quot;), F(&quot;SELECT,INDIVIDUAL,TWO GROUP,ONLY ONE&quot;)); // dialog message
      }
    } else if (id == 1) {
      if (temp.startsWith(F(&quot;IND&quot;))) leftPadMode = 1; // independant
      else if (temp.startsWith(F(&quot;TWO&quot;))) leftPadMode = 2; // 2 group: up/down, left/right
      else if (temp.startsWith(F(&quot;ONL&quot;))) leftPadMode = 4; // 4psc button is 1 group
      setLeftPadMode(leftPadMode);
    } else if (id == 2) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { rightPadMode = 0; setRightPadToggle(F(&quot;0000&quot;)); } // set push for right button
      else { rightPadMode = 1; setRightPadToggle(F(&quot;1111&quot;)); }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }       // Input text
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.ARDUINO_BT_JOYSTICK_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bxyUNf/btrR3Bz5eWH/Xke8xbSSnaFtowvTELnj10/2.ARDUINO_BT_JOYSTICK_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;2.ARDUINO_BT_JOYSTICK_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/Kwwkf6npo-I&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/Kwwkf6npo-I&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Kwwkf6npo-I&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Change name of HC-06 and Pin Number which is used to pair on ADUPAD App&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nU8y2/btrRZOVbhkw/AKjS3O7PzurF9Y4Fk2uI9k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nU8y2/btrRZOVbhkw/AKjS3O7PzurF9Y4Fk2uI9k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nU8y2/btrRZOVbhkw/AKjS3O7PzurF9Y4Fk2uI9k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnU8y2%2FbtrRZOVbhkw%2FAKjS3O7PzurF9Y4Fk2uI9k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2y2i7/btrRYsLRqd5/Qv9ybPP06cTBKNkTLMcICk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2y2i7/btrRYsLRqd5/Qv9ybPP06cTBKNkTLMcICk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2y2i7/btrRYsLRqd5/Qv9ybPP06cTBKNkTLMcICk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2y2i7%2FbtrRYsLRqd5%2FQv9ybPP06cTBKNkTLMcICk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;121&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save pin number and name for HC-06.&lt;/p&gt;
&lt;pre id=&quot;code_1669274349789&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char pass[5] = &quot;1234&quot;;     // 4 NUMER
char btName[11] = &quot;HC06&quot;;  // 10 char&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EEPROM Setting&lt;/p&gt;
&lt;pre id=&quot;code_1669274368661&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;EEPROM.h&amp;gt;
void loadConfig() {  // Read ID/Pin number
  for (int i = 0; i &amp;lt; 11; i++) btName[i] = EEPROM.read(1008 + i); // sizeof(pass)-1
  for (int i = 0; i &amp;lt; 4; i++) pass[i] = EEPROM.read(1019 + i); // sizeof(ssid)-1
}

void saveConfig() { // Write ID/Pin number
  for (int i = 0; i &amp;lt; 11; i++) EEPROM.write(1008 + i, btName[i]); // sizeof(pass)-1
  for (int i = 0; i &amp;lt; 4; i++) EEPROM.write(1019 + i, pass[i]); // sizeof(ssid)-1
}

// After uploading the sketch to the Arduino, write it once to the EEPROM or read the values stored in the EEPROM when booting.
void setup() {
  if(EEPROM.read(1023) != 1) { 
    for (int i = 0 ; i &amp;lt; EEPROM.length() ; i++) EEPROM.write(i, 0); // EEPROM Clear
    EEPROM.write(1023, 1);   // flag for status of saving
    saveConfig();      // Write ID and Password at initialization
  } else loadConfig(); // Read saved ID and Password when Arduino is rebooting
}

// EEPROM initialization code at serial monitor
void loop() {
  if(Serial.available()) { // Serial monitor code
    String temp = Serial.readStringUntil('\n'); 
    Serial.println(temp);
    if (temp == F(&quot;1&quot;)) {
      EEPROM.write(1023, 0);
      Serial.println(&quot;EEPROM INI&quot;);
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Save parsing data for name and pin number and send a message applyed in Arduino.&lt;/p&gt;
&lt;pre id=&quot;code_1669274478198&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void changeBTname(String str) { // NA18888HC06
  bool save = false;
  String temp = str.substring(0, 1);
  bool getPass = temp.toInt();
  str.remove(0, 1);
  if (getPass) {
    temp = str.substring(0, 4);
    str.remove(0, 4);
    if (temp != pass) {
      for (int i = 0; i &amp;lt; 4; i++) pass[i] = temp[i];
      save = true;
    }
  } 
  if (str != btName) {
    if (temp != &quot;&quot;) {
      for (int i = 0; i &amp;lt; str.length(); i++) btName[i] = str[i];
      btName[str.length()] = '\0';
      save = true; 
    }
  }
  Serial.println(btName);
  Serial.println(pass);
  if (save) {
    saveConfig();
    temp  = F(&quot;&amp;lt;p&amp;gt; NAME:  &quot;);
    temp += btName;
    temp += F(&quot;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt; PASS: &quot;);
    temp += pass;
    temp += F(&quot;&amp;lt;/p&amp;gt;Value's Saved.&quot;);
    temp += F(&quot; It will disconnect for Setting.&amp;lt;br/&amp;gt;try to reconnect.&quot;);
    sendMessage(temp);
    sendDisconnect(); delay(1000); 
    Serial.println(sendData(F(&quot;NAME&quot;),btName,false)); // SET NAME &quot;HC06&quot;
    Serial.println(sendData(F(&quot;PIN&quot;),pass,true));     // SET PASS 
  } else sendMessage(F(&quot;There's no change.&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.ARDUINO_BT_JOYSTICK_PIN.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bMYrRa/btrR1g426Re/yUsMNifQJ5eWyuPSRUzqAK/3.ARDUINO_BT_JOYSTICK_PIN.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;3.ARDUINO_BT_JOYSTICK_PIN.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_EEPROM_INI.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cjrYTf/btrR3CluWCF/FnNlHodVHSnun2Zpf4tbVK/ARDUINO_EEPROM_INI.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_EEPROM_INI.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Change all data to 0 in EEPROM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/uqBv3tViElw&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/uqBv3tViElw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/uqBv3tViElw&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ADUPAD - Arduino wireless remote control PAD application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUPAD</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/186</guid>
      <comments>https://postpop.tistory.com/186#entry186comment</comments>
      <pubDate>Thu, 24 Nov 2022 12:56:44 +0900</pubDate>
    </item>
    <item>
      <title>Arduino Bluetooth remote control with ADUCON and HC-06</title>
      <link>https://postpop.tistory.com/185</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUCON application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bslLDC/btrRXfyKCy0/ihbH3YflK0pzPekl4av1yK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bslLDC/btrRXfyKCy0/ihbH3YflK0pzPekl4av1yK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bslLDC/btrRXfyKCy0/ihbH3YflK0pzPekl4av1yK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbslLDC%2FbtrRXfyKCy0%2FihbH3YflK0pzPekl4av1yK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;617&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JrZQK/btrVfsAg4jT/TaBxtxqKMHkUKoRzK15Cp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JrZQK/btrVfsAg4jT/TaBxtxqKMHkUKoRzK15Cp1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JrZQK/btrVfsAg4jT/TaBxtxqKMHkUKoRzK15Cp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJrZQK%2FbtrVfsAg4jT%2FTaBxtxqKMHkUKoRzK15Cp1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Please&amp;nbsp;refer&amp;nbsp;to&amp;nbsp;the&amp;nbsp;post&amp;nbsp;below&amp;nbsp;for&amp;nbsp;how&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;Arduino&amp;nbsp;and&amp;nbsp;HC-06.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/184&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Arduino Basic code for bluetooth remote contol with HC-06&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_HC06_BASIC.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/eH3EEq/btrSf9FjTVs/yN8Gwkua9xyHoHDs4rO5m0/ARDUINO_HC06_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_HC06_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1669695759775&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool gotData = false;

void loop() {
  if (SerialBT.available()) { // when incomming data from HC06
    uint8_t temp = SerialBT.read();
    Serial.println(temp); // Output data of the HC06 to the serial monitor.
    gotData = true; // the flag for response
  } else {
    if (gotData) {   // if response
      String setVal = &quot;&quot;;
      setVal += char(0xF4);      // protocol header of text for ADUCON with bluetooth
      setVal += &quot;Hello World &quot;;
      setVal += random(100,200); // the message for sending
      setVal += char(0xF1);      // protocol footer of text for ADUCON with bluetooth
      Serial.println(setVal);    // Output the message to the serial monitor.
      SerialBT.print(setVal);    // send data to HC06 as response 
      gotData = false;           // initialize the flag
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ARDUINO_HC06_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorHC06.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsEmEV/btrSmsDauQv/Uogkm2rffvImYGsk2i1bz0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsEmEV/btrSmsDauQv/Uogkm2rffvImYGsk2i1bz0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsEmEV/btrSmsDauQv/Uogkm2rffvImYGsk2i1bz0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsEmEV%2FbtrSmsDauQv%2FUogkm2rffvImYGsk2i1bz0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorHC06.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Pairing to HC-06 at mobile phone and connecting to HC-06 on the ADUCON app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Bluetooth pairing&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Select the HC06 on the Bluetooth setting screen of your mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pairingHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BnMLF/btrSmZAJn6Q/GdQXhsYgtLhNAQTyXAuHp1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BnMLF/btrSmZAJn6Q/GdQXhsYgtLhNAQTyXAuHp1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BnMLF/btrSmZAJn6Q/GdQXhsYgtLhNAQTyXAuHp1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBnMLF%2FbtrSmZAJn6Q%2FGdQXhsYgtLhNAQTyXAuHp1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;295&quot; data-filename=&quot;pairingHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Input the password when requesting the pairing password and click the confirm when the connection message is output as shown below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputPassHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyZyCz/btrSlkMHumL/9RBGgDF9iz1zWSc8UGoQL1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyZyCz/btrSlkMHumL/9RBGgDF9iz1zWSc8UGoQL1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyZyCz/btrSlkMHumL/9RBGgDF9iz1zWSc8UGoQL1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyZyCz%2FbtrSlkMHumL%2F9RBGgDF9iz1zWSc8UGoQL1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;215&quot; data-filename=&quot;inputPassHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bluetooth pairing complete&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pairedHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHg7AF/btrSjnJQmuX/FfQUPKs6I9TUbw8DcQ8Rjk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHg7AF/btrSjnJQmuX/FfQUPKs6I9TUbw8DcQ8Rjk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHg7AF/btrSjnJQmuX/FfQUPKs6I9TUbw8DcQ8Rjk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHg7AF%2FbtrSjnJQmuX%2FFfQUPKs6I9TUbw8DcQ8Rjk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;296&quot; data-filename=&quot;pairedHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Bluetooth 2.0 Search and Connection in the App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth icon in the app and select Bluetooth 2.0 in Select Ver.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth button and select the HC06.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DjYIk/btrSm0zDqv6/uviktffXEgUaxVOy1XlCH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DjYIk/btrSm0zDqv6/uviktffXEgUaxVOy1XlCH1/img.jpg&quot; data-alt=&quot;Select HC06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DjYIk/btrSm0zDqv6/uviktffXEgUaxVOy1XlCH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDjYIk%2FbtrSm0zDqv6%2FuviktffXEgUaxVOy1XlCH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;424&quot; data-filename=&quot;connectHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Select HC06&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectedHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n0VBz/btrShGJIg3B/TOAmA4NmxPnB5OdgIzRe01/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n0VBz/btrShGJIg3B/TOAmA4NmxPnB5OdgIzRe01/img.jpg&quot; data-alt=&quot;connected to HC06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n0VBz/btrShGJIg3B/TOAmA4NmxPnB5OdgIzRe01/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn0VBz%2FbtrShGJIg3B%2FTOAmA4NmxPnB5OdgIzRe01%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;82&quot; data-filename=&quot;connectedHC06.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;connected to HC06&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectMonitorHC06.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SjvUb/btrSljAdJxj/QM6LeuhkDGRwsmGal2wZFK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SjvUb/btrSljAdJxj/QM6LeuhkDGRwsmGal2wZFK/img.jpg&quot; data-alt=&quot;received data &amp;quot;248(0xF8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SjvUb/btrSljAdJxj/QM6LeuhkDGRwsmGal2wZFK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSjvUb%2FbtrSljAdJxj%2FQM6LeuhkDGRwsmGal2wZFK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;connectMonitorHC06.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data &quot;248(0xF8) 99(c) 111(o) 110(n) 110(n) 101(e) 99(c) 116(t) 10(\n)&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHC06ADUCON.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuTns8/btrSmvfARMK/rJkg5RjBR46eUXrZEf6N5K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuTns8/btrSmvfARMK/rJkg5RjBR46eUXrZEf6N5K/img.jpg&quot; data-alt=&quot;response from HC06&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuTns8/btrSmvfARMK/rJkg5RjBR46eUXrZEf6N5K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuTns8%2FbtrSmvfARMK%2FrJkg5RjBR46eUXrZEf6N5K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;97&quot; data-filename=&quot;responseHC06ADUCON.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;response from HC06&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with Bluetooth of ADUCON applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SerialBT_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S6UF2/btrR1g3KRDg/1QAdKKT5XFskWYrTJcETc1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S6UF2/btrR1g3KRDg/1QAdKKT5XFskWYrTJcETc1/img.jpg&quot; data-alt=&quot;ADUCON app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S6UF2/btrR1g3KRDg/1QAdKKT5XFskWYrTJcETc1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS6UF2%2FbtrR1g3KRDg%2F1QAdKKT5XFskWYrTJcETc1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;ADUCON app&amp;amp;#39;s protocol header settings&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;207&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUCON app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for Bluetooth in the Arduino sketch according to the protocol header settings in the ADUCON app.&lt;/p&gt;
&lt;pre id=&quot;code_1669252564695&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD 0xF0
#define pwmHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define optionHD 0xF9
#define checkHD 0xF5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1669252769450&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

if (appConnection) { // If app connection is confirmed
  // Execute code after app connection is confirmed
} else {
  if (SerialBT.peek() == connectHD) appConnection = true; // Check if the value is 0xF8.
  else { uint8_t dump = SerialBT.read(); }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHD(0xF8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + connect&lt;/span&gt;: Transmit the necessary app settings and current Arduino state values through the iniSet() and send_State() functions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0xF8 + NA&lt;/span&gt;: Change setting values for HC-06.&lt;/p&gt;
&lt;pre id=&quot;code_1669253086223&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (temp == F(&quot;connect&quot;)) { iniSet(); send_State(); }
else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; Serial.println(F(&quot;disconnect&quot;)); }
else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); } 
else Serial.println(temp);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHD(0xF9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669253301025&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
  else { // if not
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;)); // set the time if the length of the value is less than 10
    else Serial.println(F(&quot;date/time&quot;)); // current date/time if larger
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(0xF0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669253479009&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF0 + 1byte Num + 0xF1
SerialBT.readBytes(data, 3); // Store 3 bytes of data in array &quot;data&quot; from Serial Buffer
if (data[2] == footHD) {     // if the third byte is 0xF1
  pin_control(data[1]);      // execute the code with the value of second byte
  data[2] = 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;pwmHD(0xF3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669253965769&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0xF3 + 1byte Num(slide number) + 2byte Num(PWM) + 0xF1
while (SerialBT.peek() == pwmHD) { // Process 3 PWM values of COLOR PICKER
  SerialBT.readBytes(data, 5); // Store 5 bytes of data in array &quot;data&quot; from Serial Buffer
  if (data[4] == footHD) {     // if the fifth byte is 0xF1
    uint16_t value = data[3];  // Swap third and fourth bytes
    value = value &amp;lt;&amp;lt; 8 | data[2];
    pwm_control(data[1], value); // execute the code with values
    data[4] = 0;
  }
  delay(1);
}
if (pwmEcho) { sendPwmEcho(); pwmEcho = 0; } // Prevent data transmission while receiving data
// refer to &quot;Precautions when using the HC-06 with Serial communication&quot; posted in Basic code.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Sending a flag that causes the ADUCON app to immediately terminate the timer for receiving data&lt;/p&gt;
&lt;pre id=&quot;code_1669254954479&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (dataSend) { SerialBT.write(checkHD); dataSend = false; } // send 0xF5 to terminate the timer.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669254901711&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669255577270&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the slide state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669255595006&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {
  uint8_t pwm[5] = {pwmHD, slide, pwm_val, pwm_val &amp;gt;&amp;gt; 8, footHD};
  SerialBT.write(pwm, 5);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the PWM.&lt;/p&gt;
&lt;pre id=&quot;code_1669255626374&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t pwmEcho = 0;
uint8_t ecVal[18] = { 0, };

void send_pwm_echo(uint8_t slide, uint16_t pwm_val) {
  if (pwmEcho &amp;gt; 5) pwmEcho = 0;
  ecVal[pwmEcho*3] = slide; 
  ecVal[(pwmEcho*3)+1] = pwm_val;
  ecVal[(pwmEcho*3)+2] = pwm_val &amp;gt;&amp;gt; 8;
  pwmEcho++;
}

void sendPwmEcho() {
  uint8_t ch = 0;
  while (pwmEcho) {
    pwmEcho--;
    uint8_t pwm[5] = {pwmHD, ecVal[ch*3], ecVal[(ch*3)+1], ecVal[(ch*3)+2], echoHD};
    SerialBT.write(pwm, 5); ch++;
  }
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A code example that reflects the status of the current button and PWM values of Arduino to the app when connected to the ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1669255767574&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void send_State() { // CURRENT STATE
  sendPinState(10);
  sendPinState(21);
  sendPinState(30);
  sendPinState(41);
  sendPinState(50);
  sendPinState(61);
  sendPinState(71);
  sendPinState(80);
  sendPinState(91);
  sendPinState(101);
  sendPinState(110);
  sendPinState(121);
  sendPinState(130);
  sendPinState(141);
  sendPinState(150);
  sendPwmSlide(1, 110);
  sendPwmSlide(2, 120);
  sendPwmSlide(3, 210);
  sendPwmSlide(4, 0);
  sendPwmSlide(5, 0);
  sendPwmSlide(6, 0);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ1Mtp/btrRXGo8yyz/zqptJCPKiTsZYFSlCRhyrk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ1Mtp/btrRXGo8yyz/zqptJCPKiTsZYFSlCRhyrk/img.jpg&quot; data-alt=&quot;Screen reflecting initial state and labels when connecting Arduino&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ1Mtp/btrRXGo8yyz/zqptJCPKiTsZYFSlCRhyrk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ1Mtp%2FbtrRXGo8yyz%2FzqptJCPKiTsZYFSlCRhyrk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;617&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Screen reflecting initial state and labels when connecting Arduino&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text.&lt;/p&gt;
&lt;pre id=&quot;code_1669255828750&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String str) {
  String setVal = &quot;&quot;;
  setVal += char(strHD);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Set to send the date/time of the Android system When connecting, or request the transmission of the date/time if necessary.&lt;/p&gt;
&lt;pre id=&quot;code_1669255895293&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void requstDateTime(){ 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1669256053718&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendMessage(String str) {
  String setVal = &quot;&quot;;
  setVal += char(connectHD);
  setVal += char(0x04);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bayuzF/btrRYsKEkMX/RKZkMKncKkc2lgC8yVe1Yk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bayuzF/btrRYsKEkMX/RKZkMKncKkc2lgC8yVe1Yk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bayuzF/btrRYsKEkMX/RKZkMKncKkc2lgC8yVe1Yk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbayuzF%2FbtrRYsKEkMX%2FRKZkMKncKkc2lgC8yVe1Yk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1669256117198&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x05, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2rRtm/btrRXemoGCV/HeBSdQuideT6YMyINdkXuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2rRtm/btrRXemoGCV/HeBSdQuideT6YMyINdkXuk/img.png&quot; data-alt=&quot;Disconnect Button for Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2rRtm/btrRXemoGCV/HeBSdQuideT6YMyINdkXuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2rRtm%2FbtrRXemoGCV%2FHeBSdQuideT6YMyINdkXuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;84&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button for Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Set the function to continuously transmit the changed value of the SeekBar (slide bar) according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Slide Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Slide Mode&lt;/span&gt; (transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1669256282084&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveSlide(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9IgEo/btrRXbJTTho/R20DAv5RCbsej0vGZ2kbPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9IgEo/btrRXbJTTho/R20DAv5RCbsej0vGZ2kbPk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9IgEo/btrRXbJTTho/R20DAv5RCbsej0vGZ2kbPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9IgEo%2FbtrRXbJTTho%2FR20DAv5RCbsej0vGZ2kbPk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;30&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. Set transmission interval of ACTIVE SLIDE MODE. (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669256368070&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setSlideInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Activate a timer that sends checkHD(0xF5) at regular time intervals.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Regardless of the app, it is used to reflect independently changed values in the Arduino to the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669256405221&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequest(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_read.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0TKTN/btrRXa5gBxD/kCBBpmIu3DJpRBiGXsArtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0TKTN/btrRXa5gBxD/kCBBpmIu3DJpRBiGXsArtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0TKTN/btrRXa5gBxD/kCBBpmIu3DJpRBiGXsArtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0TKTN%2FbtrRXa5gBxD%2FkCBBpmIu3DJpRBiGXsArtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;120&quot; data-filename=&quot;edited_read.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Set the operation interval of the timer sending checkHD(0xF5). (Unit:&lt;span class=&quot;notranslate&quot;&gt; Millisecond&lt;/span&gt;)&lt;/p&gt;
&lt;pre id=&quot;code_1669256484919&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequestInterval(uint16_t val){ // val: millis
  uint8_t setVal[4] = {optionHD, 0x04, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5pLTJ/btrRX4i03jJ/ZqY7ploR3cTsFW5h0nqGD1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5pLTJ/btrRX4i03jJ/ZqY7ploR3cTsFW5h0nqGD1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5pLTJ/btrRX4i03jJ/ZqY7ploR3cTsFW5h0nqGD1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5pLTJ%2FbtrRX4i03jJ%2FZqY7ploR3cTsFW5h0nqGD1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;26&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1669256510150&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2(other)/3(HC06): show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x05, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Default Pin Number of HC-06 for pairing: 1234 (only 4-Digit number)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eDUS3L/btrRXFjtvuq/ybfRqY0nL75sTikIUK6cWk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eDUS3L/btrRXFjtvuq/ybfRqY0nL75sTikIUK6cWk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eDUS3L/btrRXFjtvuq/ybfRqY0nL75sTikIUK6cWk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeDUS3L%2FbtrRXFjtvuq%2FybfRqY0nL75sTikIUK6cWk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Display additional push buttons in the main menu area. (it is possible to control only at Arduino)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxg0Z0/btrRZLCZUf1/szm7rWmTrdKqpJ0Knoorwk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxg0Z0/btrRZLCZUf1/szm7rWmTrdKqpJ0Knoorwk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxg0Z0/btrRZLCZUf1/szm7rWmTrdKqpJ0Knoorwk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdxg0Z0%2FbtrRZLCZUf1%2Fszm7rWmTrdKqpJ0Knoorwk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;57&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669256735413&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void showDialogMenu(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x06, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Change the main screen to Color Picker / Pwm Nob screen from Arduino. (generally set in the options of the app)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/burMaz/btrRZOzHRx9/UgVkP1Ujp32tdX0w0SRmHk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/burMaz/btrRZOzHRx9/UgVkP1Ujp32tdX0w0SRmHk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/burMaz/btrRZOzHRx9/UgVkP1Ujp32tdX0w0SRmHk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FburMaz%2FbtrRZOzHRx9%2FUgVkP1Ujp32tdX0w0SRmHk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;71&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uint8_t: list below&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: Display buttons and SeekBar (slide bar) on the main screen&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Display Color_Picker on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Display Color_Picker and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Display PWM Nob on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4: Display PWM Nob and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;String&lt;/span&gt;: name of the group&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;bool&lt;/span&gt;: Sets whether to display the SeekBar (slide bar) when the main screen buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* true&lt;/span&gt;: SeekBar (slide bar) is also displayed when button is displayed or Pwm Nob is displayed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* false&lt;/span&gt;: SeekBar (slide bar) is not displayed when button is displayed and SeekBar (slide bar) is displayed only when Pwm Nob is displayed&lt;/p&gt;
&lt;pre id=&quot;code_1669256810252&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPMain) { 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x07);
  setVal += val; setVal += ','; 
  setVal += group1; setVal += ','; 
  setVal += group2; setVal += ',';
  setVal += pwmDPMain;
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Set the main screen display of the app.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set to 0 or 1 in order depending on whether buttons 1 to 15, SeekBar (slide bar) 1 to 6, text input, and floating buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: hidden 1: visible&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BY8gN/btrRX2emwzs/REOSZEzkLktQgZKdjw6HJ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BY8gN/btrRX2emwzs/REOSZEzkLktQgZKdjw6HJ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BY8gN/btrRX2emwzs/REOSZEzkLktQgZKdjw6HJ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBY8gN%2FbtrRX2emwzs%2FREOSZEzkLktQgZKdjw6HJ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;307&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669256874125&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;///////////////////////// SET MAIN DISPLAY
//F(&quot;111111111111111&quot;  // button 1 ~ 15, 0:hide 1:display
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x08);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Set labels for buttons and SeekBar.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Label buttons 1 to 15 and SeekBar (slide bar) 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgB79y/btrRXCtuMdF/Fs5pWe6VGBI2J1HCrRp28k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgB79y/btrRXCtuMdF/Fs5pWe6VGBI2J1HCrRp28k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgB79y/btrRXCtuMdF/Fs5pWe6VGBI2J1HCrRp28k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgB79y%2FbtrRXCtuMdF%2FFs5pWe6VGBI2J1HCrRp28k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;286&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669256927333&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;)) // slider 1 ~ 6
void setButtonLabel(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x09);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set the button's toggle/push properties.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set the button properties to 0 or 1 in order of buttons 1 to 15.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0: Push&lt;/span&gt;&amp;nbsp;1: Toggle&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4x8sE/btrRVtxwRX4/8hQUJKkEunpTvQosNSVCP1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4x8sE/btrRVtxwRX4/8hQUJKkEunpTvQosNSVCP1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4x8sE/btrRVtxwRX4/8hQUJKkEunpTvQosNSVCP1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4x8sE%2FbtrRVtxwRX4%2F8hQUJKkEunpTvQosNSVCP1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;340&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669256982340&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0A);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. Set the maximum/minimum values of the SeekBar (slide bar).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SeekBar (slide bar) Specifies the maximum/minimum values from 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0ZvWr/btrRZPFmR79/sGdLU1rDliKtoEvT5FsLUk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0ZvWr/btrRZPFmR79/sGdLU1rDliKtoEvT5FsLUk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0ZvWr/btrRZPFmR79/sGdLU1rDliKtoEvT5FsLUk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0ZvWr%2FbtrRZPFmR79%2FsGdLU1rDliKtoEvT5FsLUk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;249&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669257049493&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0B);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. Set the title of the Arduino sketch.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djtewV/btrRXnXE7hT/QbgKUmkhBT6wfzGXpyphi0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djtewV/btrRXnXE7hT/QbgKUmkhBT6wfzGXpyphi0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djtewV/btrRXnXE7hT/QbgKUmkhBT6wfzGXpyphi0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjtewV%2FbtrRXnXE7hT%2FQbgKUmkhBT6wfzGXpyphi0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;27&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669257103980&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//title: Test Mode
//text: Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;
void setAppTitleMessage(String title, String text){
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0C);
  setVal += title; setVal += ','; 
  setVal += text; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xBmSB/btrR1fw4KSR/9EA8LkoKbFcA3Jb7X5tF3k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xBmSB/btrR1fw4KSR/9EA8LkoKbFcA3Jb7X5tF3k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xBmSB/btrR1fw4KSR/9EA8LkoKbFcA3Jb7X5tF3k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxBmSB%2FbtrR1fw4KSR%2F9EA8LkoKbFcA3Jb7X5tF3k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;489&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;21. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1669257991924&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;RAD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; setVal += ':';
  setVal += String(selection);
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YvCR4/btrRXnDlt3v/knRBuBgjJEqnrwi7RVI8wk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YvCR4/btrRXnDlt3v/knRBuBgjJEqnrwi7RVI8wk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YvCR4/btrRXnDlt3v/knRBuBgjJEqnrwi7RVI8wk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYvCR4%2FbtrRXnDlt3v%2FknRBuBgjJEqnrwi7RVI8wk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;22. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1669258030003&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;CKB:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQ35Jy/btrRY5Ivk5t/HornkpUaQDXLyTQkPScuMK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQ35Jy/btrRY5Ivk5t/HornkpUaQDXLyTQkPScuMK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQ35Jy/btrRY5Ivk5t/HornkpUaQDXLyTQkPScuMK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQ35Jy%2FbtrRY5Ivk5t%2FHornkpUaQDXLyTQkPScuMK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;23. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1669258066491&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;CHD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += message; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lP3UQ/btrRZMopica/gPOk8MWrsM5Xn6XYkdPhX1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lP3UQ/btrRZMopica/gPOk8MWrsM5Xn6XYkdPhX1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lP3UQ/btrRZMopica/gPOk8MWrsM5Xn6XYkdPhX1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlP3UQ%2FbtrRZMopica%2FgPOk8MWrsM5Xn6XYkdPhX1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;24. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1669258104291&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;LSD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caYdkJ/btrR1nWbd71/Jq9fFd882XXvWTSOMkC2Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caYdkJ/btrR1nWbd71/Jq9fFd882XXvWTSOMkC2Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caYdkJ/btrR1nWbd71/Jq9fFd882XXvWTSOMkC2Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaYdkJ%2FbtrR1nWbd71%2FJq9fFd882XXvWTSOMkC2Vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;294&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;25. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1669258157699&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;STR:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qoDG0/btrRZMvabAt/zWVBoGqwq1mqm7zHG40JZk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qoDG0/btrRZMvabAt/zWVBoGqwq1mqm7zHG40JZk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qoDG0/btrRZMvabAt/zWVBoGqwq1mqm7zHG40JZk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqoDG0%2FbtrRZMvabAt%2FzWVBoGqwq1mqm7zHG40JZk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_HMI_BT_CONTROL.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cvzHXn/btrR1gisUFF/19MXELPhjkJ3i3mRQuD8K0/ARDUINO_HMI_BT_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_HMI_BT_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/9we0UNgdLTw&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/9we0UNgdLTw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/9we0UNgdLTw&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669258301259&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt; 
#define BT_rxPin 3 // Bluetooth RX -&amp;gt; 3(arduino TX)
#define BT_txPin 2 // Bluetooth TX -&amp;gt; 2(arduino RX)
SoftwareSerial SerialBT(BT_txPin, BT_rxPin); // (arduino RX, arduino TX)

#define btName F(&quot;HC06&quot;)
#define pass F(&quot;1234&quot;)  // pin number for paring

#include &quot;protocol.h&quot;

#define ledPin 13

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);
  SerialBT.begin(9600); //Bluetooth 
  Serial.println(sendData(F(&quot;NAME&quot;),btName,false)); // SET NAME &quot;HC06&quot;
  //Serial.println(sendData(F(&quot;PIN&quot;),pass,true));   // SET PASS 
  Serial.println(F(&quot;Bluetooth 2.0&quot;));
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(F(&quot;button 1 : on&quot;));
               digitalWrite(ledPin, HIGH); 
               sendPinEcho(value);
               sendText(F(&quot;1: ON&quot;));  
                  break;
      case 10: Serial.println(F(&quot;button 1 : off&quot;));
               digitalWrite(ledPin, LOW); 
               sendText(F(&quot;1: OFF&quot;)); 
               sendPinEcho(value);
                  break;
      case 21: Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 51: Serial.println(F(&quot;button 5 : on&quot;));
                  break;
      case 50: Serial.println(F(&quot;button 5 : off&quot;));
                  break;
      case 61: Serial.println(F(&quot;button 6 : on&quot;));
                  break;
      case 60: Serial.println(F(&quot;button 6 : off&quot;));
                  break;
      case 71: Serial.println(F(&quot;button 7 : on&quot;));
                  break;
      case 70: Serial.println(F(&quot;button 7 : off&quot;));
                  break;
      case 81: Serial.println(F(&quot;button 8 : on&quot;));
                  break;
      case 80: Serial.println(F(&quot;button 8 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(F(&quot;button 10 : on&quot;));
                  break;
      case 100: Serial.println(F(&quot;button 10 : off&quot;));
                  break;  
      case 111: Serial.println(F(&quot;button 11 : on&quot;));
                  break;
      case 110: Serial.println(F(&quot;button 11 : off&quot;));
                  break;  
      case 121: Serial.println(F(&quot;button 12 : on&quot;));
                  break;
      case 120: Serial.println(F(&quot;button 12 : off&quot;));
                  break;                  
      case 131: Serial.println(F(&quot;button 13 : on&quot;));
                  break;  
      case 130: Serial.println(F(&quot;button 13 : off&quot;));
                  break;  
      case 141: Serial.println(F(&quot;button 14 : on&quot;));
                  break;  
      case 140: Serial.println(F(&quot;button 14 : off&quot;));
                  break;  
      case 151: Serial.println(F(&quot;button 15 : on&quot;));
                  break;  
      case 150: Serial.println(F(&quot;button 15 : off&quot;));
                  break;         
      case 161: Serial.println(F(&quot;button 16 : click&quot;));
                  break; 
      case 171: Serial.println(F(&quot;button 17 : click&quot;));
                  break;
      case 181: Serial.println(F(&quot;button 18 : click&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : click&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : click&quot;));
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,Dial Nob,Color Picker,Key Pad,Arrow Pad,Main&quot;));
                  break;               
    }
  }
}

void pwm_control(uint8_t num, uint16_t value) {
  if (num == 1) {  // SeekBar (slide bar) 1
    send_pwm_echo(num, value);
    Serial.print(F(&quot;pwm1: &quot;)); Serial.println(value);
  } else if (num == 2) {  // SeekBar (slide bar) 2
    send_pwm_echo(num, value);
    Serial.print(F(&quot;pwm2: &quot;)); Serial.println(value);
  } else if (num == 3) {  // SeekBar (slide bar) 3
    send_pwm_echo(num, value);
    Serial.print(F(&quot;pwm3: &quot;)); Serial.println(value);
  } else if (num == 4) {  // SeekBar (slide bar) 4
    Serial.print(F(&quot;pwm4: &quot;)); Serial.println(value);
  } else if (num == 5) {  // SeekBar (slide bar) 5
    Serial.print(F(&quot;pwm5: &quot;)); Serial.println(value);
  } else if (num == 6) {  // SeekBar (slide bar) 6
    Serial.print(F(&quot;pwm6: &quot;)); Serial.println(value);
  }
}

bool appConnection = false;
uint8_t data[5] = {0, 0, 0, 0, 0};

void SerialBT_read() {
  if (SerialBT.available()) { 
    if (appConnection) {
      if (SerialBT.peek() == pwmHD) { // 0xF3
        while (SerialBT.peek() == pwmHD) {
          SerialBT.readBytes(data, 5);
          if (data[4] == footHD) {
            uint16_t value = data[3];
            value = value &amp;lt;&amp;lt; 8 | data[2];
            pwm_control(data[1], value);
            data[4] = 0;
          }
          delay(1);
        }
        if (pwmEcho) { sendPwmEcho(); pwmEcho = 0; }
      } else if (SerialBT.peek() == pinHD) {  // 0xF0
        SerialBT.readBytes(data, 3);
        if (data[2] == footHD) {
          pin_control(data[1]);
          data[2] = 0;
        }
      } else {
        uint8_t dump;
        if (SerialBT.peek() == checkHD) { dump = SerialBT.read(); dataSend = true; }
        else if (SerialBT.peek() == optionHD || SerialBT.peek() == connectHD) { 
          dump = SerialBT.read();
          String temp = SerialBT.readStringUntil('\n');
          if (dump == connectHD) {
            if (temp == F(&quot;connect&quot;)) { iniSet(); send_State(); }
            else if (temp == F(&quot;disconnect&quot;)) { appConnection = false; Serial.println(F(&quot;disconnect&quot;)); }
            else if (temp.startsWith(F(&quot;NA&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;)); } 
            else Serial.println(temp);
          } else CheckF9(temp); 
        } else {
          dump = SerialBT.read();
          Serial.write(dump);
        }
      }
      if (dataSend) { SerialBT.write(checkHD); dataSend = false; }
    } else {
      if (SerialBT.peek() == connectHD) appConnection = true;
      else { uint8_t dump = SerialBT.read(); }
    }
  } 
}


void loop() {
  SerialBT_read(); 
  if(Serial.available()) { // if there is data in the serial buffer
    String temp = Serial.readStringUntil('\n'); // option of serial monitor: NEW LINE
    Serial.println(temp);
    if(temp == &quot;on&quot;){ // input serial monitor: &quot;on&quot;
      Serial.println(&quot;LED ON&quot;);
      sendPinState(11); // button state of the app: on
      sendText(&quot;LED ON&quot;);
      send_pwm_echo(1, 150);
    } else if(temp == &quot;off&quot;){ // input serial monitor: &quot;off&quot;
      Serial.println(&quot;LED OFF&quot;);
      send_pwm_echo(1, 150);
      sendPinEcho(10); // button echo: off
      sendText(&quot;LED OFF&quot;);
    } else if(temp == &quot;1&quot;){   
      
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669258352763&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD 0xF0
#define pwmHD 0xF3
#define strHD 0xF4
#define footHD 0xF1
#define echoHD 0xE1
#define connectHD 0xF8
#define optionHD 0xF9
#define checkHD 0xF5

bool dataSend = false;

void sendPinState(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, footHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}

void sendPinEcho(uint8_t pin_val){
  uint8_t pin[3] = {pinHD, pin_val, echoHD};
  SerialBT.write(pin, 3);
  dataSend = true;
}

void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {
  uint8_t pwm[5] = {pwmHD, slide, pwm_val, pwm_val &amp;gt;&amp;gt; 8, footHD};
  SerialBT.write(pwm, 5);
  dataSend = true;
}

uint8_t pwmEcho = 0;
uint8_t ecVal[18] = { 0, };

void send_pwm_echo(uint8_t slide, uint16_t pwm_val) {
  if (pwmEcho &amp;gt; 5) pwmEcho = 0;
  ecVal[pwmEcho*3] = slide; 
  ecVal[(pwmEcho*3)+1] = pwm_val;
  ecVal[(pwmEcho*3)+2] = pwm_val &amp;gt;&amp;gt; 8;
  pwmEcho++;
}

void sendPwmEcho() {
  uint8_t ch = 0;
  while (pwmEcho) {
    pwmEcho--;
    uint8_t pwm[5] = {pwmHD, ecVal[ch*3], ecVal[(ch*3)+1], ecVal[(ch*3)+2], echoHD};
    SerialBT.write(pwm, 5); ch++;
  }
  dataSend = true;
}

void sendText(String str) {
  String setVal = &quot;&quot;;
  setVal += char(strHD);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////////////////////// CONNECTION 
void requstDateTime(){ 
  uint8_t setVal[3] = {connectHD, 0x01, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}

//#define passName F(&quot;PAS:&quot;)
//#define passNameLen 0x04
//
//void requestPass(bool val){ 
//  String setVal = &quot;&quot;;
//  setVal += char(connectHD);
//  setVal += char(0x02);
//  if (val) {
//    setVal += char(passNameLen);
//    setVal += passName;
//  } else setVal += char(val);
//  SerialBT.print(setVal);
//  dataSend = true;
//}
//
//void responsePass(bool val){ 
//  uint8_t setVal[3] = {connectHD, 0x03, val};
//  SerialBT.write(setVal, 3);
//  dataSend = true;
//}

void sendMessage(String str) {
  String setVal = &quot;&quot;;
  setVal += char(connectHD);
  setVal += char(0x04);
  setVal += str;
  setVal += char(footHD);
  SerialBT.print(setVal);
  dataSend = true;
}

void sendDisconnect(){ // order disconnect to App 
  uint8_t setVal[3] = {connectHD, 0x05, 0x00};
  SerialBT.write(setVal, 3);
  dataSend = true;
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveSlide(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x01, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// SEND SLIDE GET VALUE INTERVAL
void setSlideInterval(uint16_t val){ 
  uint8_t setVal[4] = {optionHD, 0x02, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setRequest(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x03, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void setRequestInterval(uint16_t val){ // val: millis
  uint8_t setVal[4] = {optionHD, 0x04, val, val &amp;gt;&amp;gt; 8};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

// 0: not use, 1: show only name, 2(other)/3(HC06): show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  uint8_t setVal[4] = {optionHD, 0x05, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

void showDialogMenu(bool val){ 
  uint8_t setVal[4] = {optionHD, 0x06, val, 0x00};
  SerialBT.write(setVal, 4);
  dataSend = true;
}

//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPMain) { 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x07);
  setVal += val; setVal += ','; 
  setVal += group1; setVal += ','; 
  setVal += group2; setVal += ',';
  setVal += pwmDPMain;
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////// SET MAIN DISPLAY
//F(&quot;111111111111111&quot;  // button 1 ~ 15, 0:hide 1:display
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x08);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;)) // slider 1 ~ 6
void setButtonLabel(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x09);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0A);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0B);
  setVal += str; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

void setAppTitleMessage(String title, String text){
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0C);
  setVal += title; setVal += ','; 
  setVal += text; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;RAD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; setVal += ':';
  setVal += String(selection);
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;CKB:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;CHD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += message; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;LSD:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; setVal += ':';
  setVal += option; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  String setVal = &quot;&quot;;
  setVal += char(optionHD); 
  setVal += char(0x0D);
  setVal += F(&quot;STR:&quot;); 
  setVal += String(id); setVal += ':';
  setVal += title; 
  setVal += char(footHD); 
  SerialBT.print(setVal);
  dataSend = true;
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  setActiveSlide(true);
  setSSIDLabelMode(0);
  setRequest(false); //setRequestInterval(100);
}

// SEND LOCAL STATE AT PRESENT TO APP
void send_State() { // current state
  sendPinState(10);
  sendPinState(21);
  sendPinState(30);
  sendPinState(41);
  sendPinState(50);
  sendPinState(61);
  sendPinState(71);
  sendPinState(80);
  sendPinState(91);
  sendPinState(101);
  sendPinState(110);
  sendPinState(121);
  sendPinState(130);
  sendPinState(141);
  sendPinState(150);
  sendPwmSlide(1, 110);
  sendPwmSlide(2, 120);
  sendPwmSlide(3, 210);
  sendPwmSlide(4, 0);
  sendPwmSlide(5, 0);
  sendPwmSlide(6, 0);
}

String sendData(String order, String val, bool sendPass) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += val;
  if (!sendPass) command += F(&quot;\r\n&quot;);
  SerialBT.print(command); // send the read character to the SerialBT
  long int time = millis();
  String response = &quot;&quot;;
  while( (time+1000) &amp;gt; millis()) {
    while(SerialBT.available()) {  
      char c = SerialBT.read(); 
      response+=c;
    }
  }
  return response;
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
  else {  
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUCON app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUCON app settings: label/toggle properties, use of the timer for checkHD(0xF5), Slide Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1669258872426&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  setRequest(false); //setRequestInterval(250); // Disable timer for check(0xF5)
  setDisplay(F(&quot;111111111111111&quot; // button 1 ~ 15, 0:hide 1:display
               &quot;111111&quot;          // slider 1 ~ 6
               &quot;11&quot;));           // Text Input/Floating Button
  setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); // Set Color Picker and Pwm Nob
  setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,&quot; // set labels
                   &quot;BT12,BT13,BT14,BT15,PW1,PW2,PW3,PW4,PW5,PW6&quot;));
  setButtonToggle(F(&quot;111111111111111&quot;)); // button 1 ~ 15, toggle setting, 0:push 1:toggle
  setMinMax(F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)); // slider 1 ~ 6
  setAppTitleMessage(F(&quot;Test Mode&quot;), // Change title for Arduino code on the app
  F(&quot;Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&quot; //Message
    &quot;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;&quot;
    &quot;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;&quot;));
  setActiveSlide(true); setSlideInterval(100); // Active Slide Mode
  setSSIDLabelMode(0);   // Set the function of the label displaying Wi-Fi connection
  showDialogMenu(true);  // show menu button
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the screen number (pageId).&lt;/p&gt;
&lt;pre id=&quot;code_1669259255673&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (pageId == 4) Serial.println(F(&quot;powor : on&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;));
                  break;
      case 10: if (pageId == 4) Serial.println(F(&quot;powor : off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (pageId == 4) { 
                 Serial.println(F(&quot;motor1 : on&quot;)); 
                 sendPinState(30); 
               } else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (pageId == 4) Serial.println(F(&quot;motor1 : off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (pageId == 4) { 
                 Serial.println(F(&quot;motor2 : on&quot;)); 
                 sendPinState(20); 
               } else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (pageId == 4) Serial.println(F(&quot;motor2 : off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 201: Serial.println(F(&quot;button 20 : click&quot;));
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,Dial_Nob,Color_Picker,Key_Pad,Arrow_Pad,Main&quot;)); // dialog message
                  break;              
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1669259353905&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t pageId = 0;  // screen number

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }         // radio button
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }    // Checkbox
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }    // Select button
  else if (temp.startsWith(F(&quot;LSD&quot;))) {       // List Window
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;Dial&quot;))) {           // Dial Nob screen 
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(4, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 1; 
      } else if (temp.startsWith(F(&quot;Color&quot;))) {   // Color Picker screen
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(2, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 2; 
      } else if (temp.startsWith(F(&quot;Key&quot;))) {     // Key Pad screen
        if (pageId &amp;lt;= 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111111111100011111110&quot;)); 
        setButtonToggle(F(&quot;000000000000111&quot;));
        setButtonLabel(F(&quot;1,2,3,4,5,6,7,8,9,*,0,#&quot;));
        pageId = 3;
      } else if (temp.startsWith(F(&quot;Arrow&quot;))) {   // Arrow Pad screen
        if (pageId &amp;lt;= 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111101010101011111110&quot;)); 
        setButtonToggle(F(&quot;111111000000000&quot;));
        setButtonLabel(F(&quot;Power,Motor1,Moror2,BT4,BT5,BT6,7,Up,9,Left,0,Right,0,Down&quot;));
        pageId = 4;
      } else {                                    // Main screen
        if (pageId &amp;lt;= 2) { setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 0; }
        setDisplay(F(&quot;11111111111111111111111&quot;));
        setButtonToggle(F(&quot;111111111111111&quot;));
        setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15&quot;));
        send_State();
        pageId = 0;
      }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }       // Input text
  else {  
    if (temp.length() &amp;lt; 6) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_HMI_BT_CONTROL_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cuYXA6/btrRX2laDaq/TnkRqULlVkbZj1RHSZwzKk/ARDUINO_HMI_BT_CONTROL_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_HMI_BT_CONTROL_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/y3eWQIpC_M4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/y3eWQIpC_M4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/y3eWQIpC_M4&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Change name of HC-06 and Pin Number which is used to pair on ADUCON App&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccHRYj/btrRXez0GSb/tYMK5KBqoZZgxZ7osNeC7K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccHRYj/btrRXez0GSb/tYMK5KBqoZZgxZ7osNeC7K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccHRYj/btrRXez0GSb/tYMK5KBqoZZgxZ7osNeC7K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccHRYj%2FbtrRXez0GSb%2FtYMK5KBqoZZgxZ7osNeC7K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boCUZB/btrRX26ERlm/BMabyAl3q2FcYcN1O2MKK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boCUZB/btrRX26ERlm/BMabyAl3q2FcYcN1O2MKK0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boCUZB/btrRX26ERlm/BMabyAl3q2FcYcN1O2MKK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboCUZB%2FbtrRX26ERlm%2FBMabyAl3q2FcYcN1O2MKK0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;208&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define array variable to save pin number and name for HC-06.&lt;/p&gt;
&lt;pre id=&quot;code_1669260206912&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char pass[5] = &quot;1234&quot;;     // 4 NUMER
char btName[11] = &quot;HC06&quot;;  // 10 char&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EEPROM Setting&lt;/p&gt;
&lt;pre id=&quot;code_1669260497871&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;EEPROM.h&amp;gt;
void loadConfig() {  // Read ID/Pin number
  for (int i = 0; i &amp;lt; 11; i++) btName[i] = EEPROM.read(1008 + i); // sizeof(pass)-1
  for (int i = 0; i &amp;lt; 4; i++) pass[i] = EEPROM.read(1019 + i); // sizeof(ssid)-1
}

void saveConfig() { // Write ID/Pin number
  for (int i = 0; i &amp;lt; 11; i++) EEPROM.write(1008 + i, btName[i]); // sizeof(pass)-1
  for (int i = 0; i &amp;lt; 4; i++) EEPROM.write(1019 + i, pass[i]); // sizeof(ssid)-1
}

// After uploading the sketch to the Arduino, write it once to the EEPROM or read the values stored in the EEPROM when booting.
void setup() {
  if(EEPROM.read(1023) != 1) { 
    for (int i = 0 ; i &amp;lt; EEPROM.length() ; i++) EEPROM.write(i, 0); // EEPROM Clear
    EEPROM.write(1023, 1);   // flag for status of saving
    saveConfig();      // Write ID and Password at initialization
  } else loadConfig(); // Read saved ID and Password when Arduino is rebooting
}

// EEPROM initialization code at serial monitor
void loop() {
  if(Serial.available()) { // Serial monitor code
    String temp = Serial.readStringUntil('\n'); 
    Serial.println(temp);
    if (temp == F(&quot;1&quot;)) {
      EEPROM.write(1023, 0);
      Serial.println(&quot;EEPROM INI&quot;);
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Save parsing data for name and pin number and send a message applyed in Arduino.&lt;/p&gt;
&lt;pre id=&quot;code_1669261108968&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void changeBTname(String str) { // NA18888HC06
  bool save = false;
  String temp = str.substring(0, 1);
  bool getPass = temp.toInt();
  str.remove(0, 1);
  if (getPass) {
    temp = str.substring(0, 4);
    str.remove(0, 4);
    if (temp != pass) {
      for (int i = 0; i &amp;lt; 4; i++) pass[i] = temp[i];
      save = true;
    }
  } 
  if (str != btName) {
    if (temp != &quot;&quot;) {
      for (int i = 0; i &amp;lt; str.length(); i++) btName[i] = str[i];
      btName[str.length()] = '\0';
      save = true; 
    }
  }
  Serial.println(btName);
  Serial.println(pass);
  if (save) {
    saveConfig();
    temp  = F(&quot;&amp;lt;p&amp;gt; NAME:  &quot;);
    temp += btName;
    temp += F(&quot;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt; PASS: &quot;);
    temp += pass;
    temp += F(&quot;&amp;lt;/p&amp;gt;Value's Saved.&quot;);
    temp += F(&quot; It will disconnect for Setting.&amp;lt;br/&amp;gt;try to reconnect.&quot;);
    sendMessage(temp);
    sendDisconnect(); delay(1000); 
    Serial.println(sendData(F(&quot;NAME&quot;),btName,false)); // SET NAME &quot;HC06&quot;
    Serial.println(sendData(F(&quot;PIN&quot;),pass,true));     // SET PASS 
  } else sendMessage(F(&quot;There's no change.&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_HMI_BT_CONTROL_PIN.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/CMsJZ/btrRY5u5SkN/HCYDPQhKD2Ozme8BKampy1/ARDUINO_HMI_BT_CONTROL_PIN.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_HMI_BT_CONTROL_PIN.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_EEPROM_INI.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/HGqDU/btrRX1Uffhf/5yoJg9XA21uOsKNW33Hwdk/ARDUINO_EEPROM_INI.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_EEPROM_INI.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Change all data to 0 in EEPROM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/BNaIS4CpPaM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/BNaIS4CpPaM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/BNaIS4CpPaM&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ADUCON - Arduino wireless remote control application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUCON</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/185</guid>
      <comments>https://postpop.tistory.com/185#entry185comment</comments>
      <pubDate>Thu, 24 Nov 2022 08:19:03 +0900</pubDate>
    </item>
    <item>
      <title>Arduino Basic code for bluetooth remote contol with HC-06</title>
      <link>https://postpop.tistory.com/184</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvOrOB/btrVaTr6Ust/K6n25NIT0Ax2nROXGHhL41/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvOrOB/btrVaTr6Ust/K6n25NIT0Ax2nROXGHhL41/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvOrOB/btrVaTr6Ust/K6n25NIT0Ax2nROXGHhL41/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvOrOB%2FbtrVaTr6Ust%2FK6n25NIT0Ax2nROXGHhL41%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The default baud rate of HC-06 is 9600. Therefore, software serial can be used in Arduino without a baud rate change.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/NJPSi/btrRT5DhSeW/4tzgq8C47YuKkIpts0rJa1/hc-06.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;hc-06.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.74MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectionHC06.jpg&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blE5oh/btrRY1Tasee/GaI0qb2MAT7zTyLMrMAiS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blE5oh/btrRY1Tasee/GaI0qb2MAT7zTyLMrMAiS1/img.jpg&quot; data-alt=&quot;Arduino board and HC-06 wiring&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blE5oh/btrRY1Tasee/GaI0qb2MAT7zTyLMrMAiS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblE5oh%2FbtrRY1Tasee%2FGaI0qb2MAT7zTyLMrMAiS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Arduino board and HC-06 wiring&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;480&quot; data-filename=&quot;connectionHC06.jpg&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Arduino board and HC-06 wiring&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Wire connection for Arduino and HC-06&lt;br /&gt;HC-06&amp;nbsp;&amp;nbsp;&amp;nbsp;Arduino&lt;br /&gt;VCC -&amp;gt;&amp;nbsp;&amp;nbsp;3.3V/5V&lt;br /&gt;GND -&amp;gt;&amp;nbsp;&amp;nbsp;GND&lt;br /&gt;TXD -&amp;gt;&amp;nbsp;&amp;nbsp;Pin 2 (Set as RX pin in Arduino code)&lt;br /&gt;RXD -&amp;gt;&amp;nbsp;&amp;nbsp;Pin 3 (set as TX pin in Arduino code)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- How to check baud rate of the module&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Module and Arduino must be well wired in hardware.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Upload the basic Sketch which is coded baud rate &quot;9600&quot; of Serial.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Set option to &quot;Both NL &amp;amp; CR&quot; for Serial Monitor of Arduino IDE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Set baud rate to &quot;9600&quot; at Serial Monitor of Arduino IDE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Input &quot;AT&quot; at text window and if get &quot;OK&quot; as a response, the baud rate of the module is 9600.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. If not, try to change baud rate to 115200 or another value in the sketch and upload.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Set baud rate to &quot;115200&quot; or another value at Serial Monitor of Arduino IDE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Input &quot;AT&quot; at text window and if get &quot;OK&quot; as a response, the baud rate of the module is 115200. if not repeat no.7 ~ 9.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/uQHHi/btrR5hhGoI6/KITPByvXwo0NqXv8Ji7S4K/SERIAL_BASIC_HC06.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;SERIAL_BASIC_HC06.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669345705434&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt; 
#define BT_rxPin 3 // Bluetooth RX -&amp;gt; 3(arduino TX)
#define BT_txPin 2 // Bluetooth TX -&amp;gt; 2(arduino RX)
SoftwareSerial SerialBT(BT_txPin, BT_rxPin); // (arduino RX, arduino TX)

void setup() {
  Serial.begin(9600);  // Serial Monitor and baud rate 
  SerialBT.begin(9600);   // ESP01 serial and baud rate 
}

void loop() {
  if (SerialBT.available()) {
    Serial.write(SerialBT.read()); //Output the contents of the ESP01 to the serial monitor
  }
  if (Serial. available()) {
    SerialBT.write(Serial.read()); //Write the contents of the serial monitor to the ESP01
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;baudRateChange9600.jpg&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAL61Z/btrR4FiHuTL/k5gE8dKCS0yWZA08EXKfqk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAL61Z/btrR4FiHuTL/k5gE8dKCS0yWZA08EXKfqk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAL61Z/btrR4FiHuTL/k5gE8dKCS0yWZA08EXKfqk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAL61Z%2FbtrR4FiHuTL%2Fk5gE8dKCS0yWZA08EXKfqk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;464&quot; data-filename=&quot;baudRateChange9600.jpg&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- How to change baud rate of HC-06&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; border: 1px solid #99cefa; background-color: #f6f9fd;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%; padding: 10px 10px 10px 10px;&quot;&gt;the Bluetooth serial baud rate list of HC-06&lt;br /&gt;4---------9600 (Default)&lt;br /&gt;5---------19200&lt;br /&gt;6---------38400&lt;br /&gt;7---------57600&lt;br /&gt;8---------115200&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If current baud rate is 9600 and want to change the baud rate to 115200, input &quot;AT+BAUD8&quot; at text window and get OK115200 as a response, then the change has been made.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Precautions when using the HC-06 with Serial communication&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;While receiving data from HC-06 through software serial communication in Arduino, If Arduino transmits data to HC-06 some of the data received through Bluetooth from the app may be missing. (Probably the first byte) This could be an error in the software serial library. Therefore, It must be coded to transmit data to HC-06 after receiving data from HC-06.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Key code for remote control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Set Software serial to communicate with HC-06.&lt;/p&gt;
&lt;pre id=&quot;code_1669248302032&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt; 
#define BT_rxPin 3 // Bluetooth RX -&amp;gt; 3(arduino TX)
#define BT_txPin 2 // Bluetooth TX -&amp;gt; 2(arduino RX)
SoftwareSerial SerialBT(BT_txPin, BT_rxPin); // (arduino RX, arduino TX)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Define the name for HC-06 and pin number which is used to pair.&lt;/p&gt;
&lt;pre id=&quot;code_1669248335272&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define btName F(&quot;HC06&quot;) // set name of bluetooth module HC-06. 
#define pass F(&quot;1234&quot;)   // pin number for paring&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Function that executes AT command for HC06 setup&lt;/p&gt;
&lt;pre id=&quot;code_1669249061400&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sendData(String order, String val, bool sendPass) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += val;
  if (!sendPass) command += F(&quot;\r\n&quot;);
  SerialBT.print(command); // send the command to the HC-06
  long int time = millis();
  String response = &quot;&quot;;
  while( (time+1000) &amp;gt; millis()) { 
    while(SerialBT.available()) { // if The esp has data
      char c = SerialBT.read();   // read the next character.
      response+=c;
    }
  }
  return response;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- setup&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1669249551855&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);   // Software Serial for Serial monitor of Arduino IDE
  SerialBT.begin(9600); // Software Serial for HC-06 
  Serial.println(sendData(F(&quot;NAME&quot;),btName,false)); // SET NAME &quot;HC06&quot;
  //Serial.println(sendData(F(&quot;PIN&quot;),pass,true));   // SET PIN NUMBER IF NEED. 
  Serial.println(F(&quot;Bluetooth 2.0&quot;));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1669630690217&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool gotData = false;

void loop() {
  if (SerialBT.available()) { // when incomming data from HC06
    uint8_t temp = SerialBT.read();
    Serial.println(temp); // Output data of the HC06 to the serial monitor.
    gotData = true; // the flag for response
  } else {
    if (gotData) {   // if response
      String setVal = &quot;&quot;;
      setVal += char(0xF4);      // protocol header of text for ADUCON with bluetooth
      setVal += &quot;Hello World &quot;;
      setVal += random(100,200); // the message for sending
      setVal += char(0xF1);      // protocol footer of text for ADUCON with bluetooth
      Serial.println(setVal);    // Output the message to the serial monitor.
      SerialBT.print(setVal);    // send data to HC06 as response 
      gotData = false;           // initialize the flag
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_HC06_BASIC.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/JzAcb/btrSkExPJts/vy6DaPjtM7eLmybU3Svlz0/ARDUINO_HC06_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_HC06_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ARDUINO_HC06_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitorHC06.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRHQpi/btrSmvzPKX8/lqWrvXzeQD1P3FVx8GOKy1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRHQpi/btrSmvzPKX8/lqWrvXzeQD1P3FVx8GOKy1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRHQpi/btrSmvzPKX8/lqWrvXzeQD1P3FVx8GOKy1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRHQpi%2FbtrSmvzPKX8%2FlqWrvXzeQD1P3FVx8GOKy1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;445&quot; data-filename=&quot;basicMonitorHC06.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** To test the code above, you need an app that transmits data via Bluetooth.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/185&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - Arduino Bluetooth remote control with ADUCON and HC-06&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/186&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - Arduino Bluetooth remote control with ADUPAD and HC-06&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ADUCON - Arduino wireless remote control application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ADUPAD - Arduino wireless remote control PAD application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237292057&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUCON - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&amp;amp;hl=ko&amp;amp;gl=KR&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUCON - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237305608&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUPAD - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&amp;amp;hl=ko&amp;amp;gl=JP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUPAD - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/184</guid>
      <comments>https://postpop.tistory.com/184#entry184comment</comments>
      <pubDate>Wed, 23 Nov 2022 18:54:20 +0900</pubDate>
    </item>
    <item>
      <title>Arduino WiFi remote control with ADUPAD and ESP-01</title>
      <link>https://postpop.tistory.com/183</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biV657/btrVamHSF8D/FKIeZMBjTuwxH6mPbyXkCK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biV657/btrVamHSF8D/FKIeZMBjTuwxH6mPbyXkCK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biV657/btrVamHSF8D/FKIeZMBjTuwxH6mPbyXkCK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiV657%2FbtrVamHSF8D%2FFKIeZMBjTuwxH6mPbyXkCK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If the baud rate of ESP01 is not set to 9600, refer to the post below to set it up.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Please&amp;nbsp;refer&amp;nbsp;to&amp;nbsp;the&amp;nbsp;post&amp;nbsp;below&amp;nbsp;for&amp;nbsp;how&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;Arduino&amp;nbsp;and&amp;nbsp;ESP01.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/181&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Setting up Wi-Fi module ESP01 and basic code for Arduino remote control&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUPAD application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oSsKX/btrRStbs9lK/TxndHxQ5WxDkuL0Po6m59K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oSsKX/btrRStbs9lK/TxndHxQ5WxDkuL0Po6m59K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oSsKX/btrRStbs9lK/TxndHxQ5WxDkuL0Po6m59K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoSsKX%2FbtrRStbs9lK%2FTxndHxQ5WxDkuL0Po6m59K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;868&quot; data-filename=&quot;adupadOverview.jpg&quot; data-origin-width=&quot;594&quot; data-origin-height=&quot;868&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Modify the HTTP response code in loop() function according to the protocol for &quot;TEXT&quot; set in the ADUPAD app.&lt;/p&gt;
&lt;pre id=&quot;code_1669529931225&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (gotData) { 
  Data = &quot;%%F4&quot;;   // protocol header of text for ADUPAD
  Data += &quot;Hello World &quot;;
  Data += random(100,200);
  Data += &quot;%%F1&quot;;  // protocol footer of text for ADUPAD
  Data += '\n';    // termination character of wifi for ADUPAD
  Serial.println(Data); // Output the message to the serial monitor.
  http_response();
  gotData = false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_ESP01_ADUPAD_BASIC.zip&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bQrsvL/btrSXqdqqxy/PmAPkZ8UAxM0SjK9Hf5VxK/ARDUINO_ESP01_ADUPAD_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_ESP01_ADUPAD_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ARDUINO_ESP01_ADUPAD_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitor.jpg&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czES3r/btrScbJNQRV/xyBx0kykxfZcRBQqG0O2Yk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czES3r/btrScbJNQRV/xyBx0kykxfZcRBQqG0O2Yk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czES3r/btrScbJNQRV/xyBx0kykxfZcRBQqG0O2Yk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczES3r%2FbtrScbJNQRV%2FxyBx0kykxfZcRBQqG0O2Yk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;445&quot; data-filename=&quot;basicMonitor.jpg&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting to the assigned IP while ESP01 is connected to the router&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the assigned IP address &quot;192.168.1.7&quot; on ADUPAD app connected to network of &quot;skynet&quot;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputAddressADUPAD1.jpg&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz4BnW/btrSgaDny5K/SrOgHNYq97lj49ks45UCYk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz4BnW/btrSgaDny5K/SrOgHNYq97lj49ks45UCYk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz4BnW/btrSgaDny5K/SrOgHNYq97lj49ks45UCYk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz4BnW%2FbtrSgaDny5K%2FSrOgHNYq97lj49ks45UCYk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;42&quot; data-filename=&quot;inputAddressADUPAD1.jpg&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitor1ADUCON.jpg&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;847&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cARZZw/btrSju2nD1i/jGwvkB8KB2w51ExdmUjwiK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cARZZw/btrSju2nD1i/jGwvkB8KB2w51ExdmUjwiK/img.jpg&quot; data-alt=&quot;received data of &amp;quot;%%F5&amp;quot; and &amp;quot;%%F8connect&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cARZZw/btrSju2nD1i/jGwvkB8KB2w51ExdmUjwiK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcARZZw%2FbtrSju2nD1i%2FjGwvkB8KB2w51ExdmUjwiK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;847&quot; data-filename=&quot;basicMonitor1ADUCON.jpg&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;847&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;%%F5&quot; and &quot;%%F8connect&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHTTPADUPAD1.jpg&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SvWkL/btrSc9SsorX/JUBIZqqoipPbwRycG8Sc4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SvWkL/btrSc9SsorX/JUBIZqqoipPbwRycG8Sc4k/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SvWkL/btrSc9SsorX/JUBIZqqoipPbwRycG8Sc4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSvWkL%2FbtrSc9SsorX%2FJUBIZqqoipPbwRycG8Sc4k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;271&quot; height=&quot;95&quot; data-filename=&quot;responseHTTPADUPAD1.jpg&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP01&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting directly to the ESP01 and then connecting the access point&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Connect to ESP01 on the WiFi Setting of a mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectToESP01.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F5BSM/btrShHOtigc/ey8LFpVkTBVALuFZjAA6Bk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F5BSM/btrShHOtigc/ey8LFpVkTBVALuFZjAA6Bk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F5BSM/btrShHOtigc/ey8LFpVkTBVALuFZjAA6Bk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF5BSM%2FbtrShHOtigc%2Fey8LFpVkTBVALuFZjAA6Bk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;303&quot; data-filename=&quot;connectToESP01.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the Password for the ACCESS POINT of ESP01.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputPassword.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHIv3x/btrShH8LBrv/K8kSxj4VVCKP8TgKItjRik/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHIv3x/btrShH8LBrv/K8kSxj4VVCKP8TgKItjRik/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHIv3x/btrShH8LBrv/K8kSxj4VVCKP8TgKItjRik/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHIv3x%2FbtrShH8LBrv%2FK8kSxj4VVCKP8TgKItjRik%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;319&quot; data-filename=&quot;inputPassword.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Select &quot;Keep WiFi on&quot; if the message output below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKGfpd/btrShB8wtkv/q95h1VZNUnbtl3mF1dm4Vk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKGfpd/btrShB8wtkv/q95h1VZNUnbtl3mF1dm4Vk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKGfpd/btrShB8wtkv/q95h1VZNUnbtl3mF1dm4Vk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKGfpd%2FbtrShB8wtkv%2Fq95h1VZNUnbtl3mF1dm4Vk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;288&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the address &quot;192.168.4.1&quot; on ADUPAD app connected to ESP01.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputAddressADUPAD.jpg&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baVV6O/btrSkDSiQuy/RKAAmYPiTUt5VZ6metcOSk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baVV6O/btrSkDSiQuy/RKAAmYPiTUt5VZ6metcOSk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baVV6O/btrSkDSiQuy/RKAAmYPiTUt5VZ6metcOSk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaVV6O%2FbtrSkDSiQuy%2FRKAAmYPiTUt5VZ6metcOSk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;42&quot; data-filename=&quot;inputAddressADUPAD.jpg&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitor1ADUPAD.jpg&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BNNFX/btrSkDktB6F/3VUJuyuCderOHmWnx9KvxK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BNNFX/btrSkDktB6F/3VUJuyuCderOHmWnx9KvxK/img.jpg&quot; data-alt=&quot;received data of &amp;quot;%%F5&amp;quot; and &amp;quot;%%F8connect&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BNNFX/btrSkDktB6F/3VUJuyuCderOHmWnx9KvxK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBNNFX%2FbtrSkDktB6F%2F3VUJuyuCderOHmWnx9KvxK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;912&quot; data-filename=&quot;basicMonitor1ADUPAD.jpg&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;%%F5&quot; and &quot;%%F8connect&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHTTPADUPAD.jpg&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIzr7q/btrShHHHIpS/6KQfwAOlqsfSJu00PSzzKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIzr7q/btrShHHHIpS/6KQfwAOlqsfSJu00PSzzKk/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIzr7q/btrShHHHIpS/6KQfwAOlqsfSJu00PSzzKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIzr7q%2FbtrShHHHIpS%2F6KQfwAOlqsfSJu00PSzzKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;271&quot; height=&quot;95&quot; data-filename=&quot;responseHTTPADUPAD.jpg&quot; data-origin-width=&quot;271&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP01&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with WiFi of ADUPAD applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- wifi_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdOiRr/btrRGvowkvL/QbnzFm6AkevQSewxLciH00/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdOiRr/btrRGvowkvL/QbnzFm6AkevQSewxLciH00/img.jpg&quot; data-alt=&quot;ADUPAD app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdOiRr/btrRGvowkvL/QbnzFm6AkevQSewxLciH00/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdOiRr%2FbtrRGvowkvL%2FQbnzFm6AkevQSewxLciH00%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;ADUPAD app&amp;amp;#39;s protocol header settings&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;226&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUPAD app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for WiFi in the Arduino sketch according to the protocol header settings in the ADUPAD app.&lt;/p&gt;
&lt;pre id=&quot;code_1669016761552&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD F(&quot;%%F0&quot;)
#define joyHD F(&quot;%%F3&quot;)
#define strHD F(&quot;%%F4&quot;)
#define footHD F(&quot;%%F1&quot;)
#define echoHD F(&quot;%%E1&quot;)
#define connectHD F(&quot;%%F8&quot;)
#define optionHD F(&quot;%%F9&quot;)
#define checkHD F(&quot;%%F5&quot;)
#define HDLen 4
#define addHD F(&quot;%%&quot;)
#define addHDLen 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUPAD app&lt;/p&gt;
&lt;pre id=&quot;code_1669016974126&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

if (appConnection) { // If app connection is confirmed
  // Execute code after app connection is confirmed
} else { // Before app connection check
  if (income_wifi == checkHD) { // Check if the value is %%F5 and set the initial settings
    appConnection = true; http_response(); // Confirm the connection of ADUPAD
    if (connectionId != 48) { // Initialize ESP01 connection ID when connecting for the first time
      while (connectionId != 48) { 
        connectionId--;
        String command = F(&quot;AT+CIPCLOSE=&quot;);
        command += String(connectionId-48);
        command += F(&quot;\r\n&quot;);
        esp01.print(command);
        delay(1);
      } 
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHD(%%F8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + connect&lt;/span&gt;: Transmit the necessary app settings and current Arduino state values through the iniSet() and sendState() functions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + WiFi&lt;/span&gt;: change WiFi setting values&lt;/p&gt;
&lt;pre id=&quot;code_1669080716263&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (income_wifi == F(&quot;connect&quot;)) iniSet();
else if (income_wifi == F(&quot;disconnect&quot;)) appConnection = false;  
else if (income_wifi.startsWith(F(&quot;WiFi&quot;))) { 
  sendMessage(F(&quot;This funtion is not available.&quot;)); 
} else Serial.println(income_wifi);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHD(%%F9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669080758486&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(%%F0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669080982615&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// income_wifi: %%F0 + Value + %%F1
while(income_wifi.indexOf(pinHD) != -1) { // need while function depend on left arrow pad mode 
  income_wifi.remove(0, 4); // remove %%F0
  ed = income_wifi.indexOf(footHD); // check the index number where footHD(%%F1)
  if (ed != -1) {                   // if the index number is found in the value
    temp = income_wifi.substring(0, ed); //Extract data up to index number
    uint8_t value = temp.toInt();   // convert to numeric value
    income_wifi.remove(0, ed+4);    // remove got data
    pin_control(value);             // execute the code corresponding to the value
  } else break;                     // exit while loop if there's no %%F0
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;pwmHD(%%F3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1669081447582&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// income_wifi: id + Count + %% + Heading + %% + Strength + %%F1 (with protocol header %%F3 removed)
temp = income_wifi.substring(0, 1);
uint8_t id = temp.toInt(); // id: 0 or 1 or 2
income_wifi.remove(0, 1);  // remove id
ed = income_wifi.indexOf(addHD);      // index for %%
temp = income_wifi.substring(0, ed);  // extract count
uint16_t count = temp.toInt();        // convert to numeric value
bool ok = true;
if (id == 0) {                        // 0: left Joystic
  if (count == 0) leftCount = 0;      // reset leftCount
  if (count &amp;lt; leftCount) ok = false;  // Skip if the count is less than the stored leftCount
  else leftCount = count;             // update leftCount
} else if (id == 1) {                 // 1: right Joystic
  if (count == 0) rightCount = 0;     // reset rightCount
  if (count &amp;lt; rightCount) ok = false; // Skip if the count is less than the stored rightCount
  else rightCount = count;            // update leftCount
} else {                              // 2: gravity sensor
  if (count == 0) centerCount = 0;    // reset centerCount
  if (count &amp;lt; centerCount) ok = false;// Skip if the count is less than the stored centerCount
  else centerCount = count;           // update leftCount
}
if (ok) {                             // if count validation is OK
  income_wifi.remove(0, ed+addHDLen); // remove %%
  ed = income_wifi.indexOf(addHD);    // index for %%
  temp = income_wifi.substring(0, ed);// extract heading
  uint16_t heading = temp.toInt();    // convert to numeric value
  income_wifi.remove(0, ed+addHDLen); // remove %%
  ed = income_wifi.indexOf(addHD);    // index for %%
  temp = income_wifi.substring(0, ed);// extract strength
  uint8_t strength = temp.toInt();    // convert to numeric value
  income_wifi.remove(0, ed);          // remove value for strength
  if (income_wifi == footHD) {        // if the value left is %%F1
    joystick_control(id, heading, strength); // execute the code corresponding to the value
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669083364546&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1669083394708&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += echoHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the Joystick state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669083467123&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) {                      
  Data += joyHD;
  Data += id;
  Data += addHD;
  Data += heading;
  Data += addHD;
  Data += strength;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the Joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669083536307&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SEND JOYSTIC ECHO - ESP01: USE AT PASSIVE JOYSTIC MODE
void sendJoyEcho(uint8_t id, uint16_t heading, uint8_t strength) {                          
  Data += joyHD;
  Data += id;
  Data += addHD;
  Data += heading;
  Data += addHD;
  Data += strength;
  Data += echoHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text.&lt;/p&gt;
&lt;pre id=&quot;code_1669083595867&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String text) {                               
  Data += strHD;
  Data += text;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1669083809747&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ 
  Data += connectHD;
  Data += F(&quot;DIS&quot;);
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;disconnect01.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ulmht/btrRQiAN0kh/5taD7oiWHI4QiEAw8r7TaK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ulmht/btrRQiAN0kh/5taD7oiWHI4QiEAw8r7TaK/img.jpg&quot; data-alt=&quot;Disconnect Button&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ulmht/btrRQiAN0kh/5taD7oiWHI4QiEAw8r7TaK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fulmht%2FbtrRQiAN0kh%2F5taD7oiWHI4QiEAw8r7TaK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Disconnect Button&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;44&quot; data-filename=&quot;disconnect01.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Use when you want to acquire control authority by using the ACCESS POINT password of the module in the internal network connection through the router. (without using HTML web login)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It can be changed to any name through definition of the passName and passNameLen for processing the password in the sketch and the app send datas starting with passName as password value. This is to enhance security.&lt;/p&gt;
&lt;pre id=&quot;code_1669083955283&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define passName F(&quot;PAS:&quot;)
#define passNameLen 4

void requestPass(bool val){ 
  Data += connectHD;
  Data += val;
  Data += passName;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlCpXD/btrRMvV38lL/KcLlyX7HWy4EK6mWNAXwiK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlCpXD/btrRMvV38lL/KcLlyX7HWy4EK6mWNAXwiK/img.jpg&quot; data-alt=&quot;Password dialog&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlCpXD/btrRMvV38lL/KcLlyX7HWy4EK6mWNAXwiK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlCpXD%2FbtrRMvV38lL%2FKcLlyX7HWy4EK6mWNAXwiK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Password dialog&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Password dialog&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. If control authority is given through password confirmation, a cookie value is created and transmitted so that control authority for the data transmitted thereafter can be confirmed.&lt;/p&gt;
&lt;pre id=&quot;code_1669084076708&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define cooLength 5
String cooValue = &quot;u7Dv0&quot;;

String makeCooValue() {
  cooValue = &quot;&quot;;
  uint8_t temp = 0;
  for (int i = 0; i &amp;lt; cooLength; i++) {
    temp = random(39, 123); //random(39, 123); // 39 ~ 122 pick
    if (temp == 47 || temp == 59 || temp == 60 || temp == 62 || temp == 92 || temp == 94 || temp == 96) temp = 79;
    cooValue += char(temp);
  }
  return cooValue;
}

void responsePass(bool val){ 
  Data += connectHD;
  Data += F(&quot;RES:&quot;);
  if (val) Data += makeCooValue(); 
  else Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9tAbO/btrRMApjrp2/gV92Fp2Qlejv8tduPZVjW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9tAbO/btrRMApjrp2/gV92Fp2Qlejv8tduPZVjW1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9tAbO/btrRMApjrp2/gV92Fp2Qlejv8tduPZVjW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9tAbO%2FbtrRMApjrp2%2FgV92Fp2Qlejv8tduPZVjW1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;60&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S3JTg/btrRMFcZXpI/k4R1lz5zOPKkUvL5aknII0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S3JTg/btrRMFcZXpI/k4R1lz5zOPKkUvL5aknII0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S3JTg/btrRMFcZXpI/k4R1lz5zOPKkUvL5aknII0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS3JTg%2FbtrRMFcZXpI%2Fk4R1lz5zOPKkUvL5aknII0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Sends information about the current Wi-Fi connection so that the user can view and edit information in the app about the Wi-Fi connection.&lt;/p&gt;
&lt;pre id=&quot;code_1669084189410&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendWifiInfo(){ 
  Data += connectHD;
  Data += F(&quot;INF:&quot;);
  Data += ssidAP;
  Data += ',';
  Data += passAP;
  Data += ',';
  Data += ap;
  Data += ',';
  Data += wifiRouter;
  Data += ',';
  Data += ssid;
  Data += ',';
  Data += pass;
  Data += ',';
  Data += ip;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1669084218458&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendMessage(String str){ 
  Data += connectHD;
  Data += F(&quot;MES:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HgJrM/btrROrY7YG6/6UzGVKW4qIpqNUHKuZug90/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HgJrM/btrROrY7YG6/6UzGVKW4qIpqNUHKuZug90/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HgJrM/btrROrY7YG6/6UzGVKW4qIpqNUHKuZug90/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHgJrM%2FbtrROrY7YG6%2F6UzGVKW4qIpqNUHKuZug90%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Disable the feature, which is default setting, of automatically resend the value When a button or Joystick or Gravity Sensor is changed in the app and then if a response failure error occurs.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It is used when the Arduino intentionally does not respond due to the delay that occurs when sending data using the AT command to the ESP01.&lt;/p&gt;
&lt;pre id=&quot;code_1669087355318&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void responseFailResend(bool val) {
  Data += connectHD;
  Data += F(&quot;RFR:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Set the function to continuously transmit the changed value of the Joystick according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** The Gravity Sensor always works in an active Mode.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Joystick Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Joystick Mode&lt;/span&gt; (transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1669087913188&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveJoystick(bool val){ 
  Data += optionHD;
  Data += F(&quot;ACT:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baK2aS/btrRQ5g4pXM/sBP2wk5hwZf763eDeBKQG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baK2aS/btrRQ5g4pXM/sBP2wk5hwZf763eDeBKQG1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baK2aS/btrRQ5g4pXM/sBP2wk5hwZf763eDeBKQG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaK2aS%2FbtrRQ5g4pXM%2FsBP2wk5hwZf763eDeBKQG1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;98&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Set transmission interval of ACTIVE JOYSTIC MODE. (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669088320569&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoystickInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;JSI:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Set the range where the strength of the joystick becomes 0. (enter a value from 0 to 35)&lt;/p&gt;
&lt;pre id=&quot;code_1669088561640&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  Data += optionHD;
  Data += F(&quot;JZR:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CO0dq/btrRLL53Ncs/xaskiz9ABqnqZ6J7WIcBj1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CO0dq/btrRLL53Ncs/xaskiz9ABqnqZ6J7WIcBj1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CO0dq/btrRLL53Ncs/xaskiz9ABqnqZ6J7WIcBj1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCO0dq%2FbtrRLL53Ncs%2Fxaskiz9ABqnqZ6J7WIcBj1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;198&quot; data-filename=&quot;joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Set whether or not to use a function that converts the Strength value of Joystick or Gravity Sensor into a value between 0 and 10.&lt;/p&gt;
&lt;pre id=&quot;code_1669088582416&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setJoyStrengthAdjust(bool val){ 
  Data += optionHD;
  Data += F(&quot;ADJ:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Activate a timer that sends checkHD(%%F5) at regular time intervals.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Regardless of the app, it is used to reflect independently changed values in the Arduino to the app.&lt;/p&gt;
&lt;pre id=&quot;code_1669089404190&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequest(bool val){ 
  Data += optionHD;
  Data += F(&quot;REQ:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/exGqXU/btrRM0gYoEK/PsR26H1aDqfn951GIOCkBK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/exGqXU/btrRM0gYoEK/PsR26H1aDqfn951GIOCkBK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/exGqXU/btrRM0gYoEK/PsR26H1aDqfn951GIOCkBK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FexGqXU%2FbtrRM0gYoEK%2FPsR26H1aDqfn951GIOCkBK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;83&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Set the operation interval of the timer sending checkHD(%%F5). (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1669089516503&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequestInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;INT:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set the group for the left arrow keypad.&lt;/p&gt;
&lt;pre id=&quot;code_1669089606204&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){  
  if (val == 0 || val &amp;gt; 2) val = 4; 
  Data += optionHD;
  Data += F(&quot;LPM:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkYPLI/btrRSsXOB5W/VU8R469skFSoeavpJCa5d1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkYPLI/btrRSsXOB5W/VU8R469skFSoeavpJCa5d1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkYPLI/btrRSsXOB5W/VU8R469skFSoeavpJCa5d1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkYPLI%2FbtrRSsXOB5W%2FVU8R469skFSoeavpJCa5d1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;88&quot; data-filename=&quot;arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. Set the 4-way control of the joystick.&lt;/p&gt;
&lt;pre id=&quot;code_1669089622403&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  Data += optionHD;
  Data += F(&quot;SJW:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z5WzP/btrRSQKZRhk/go0gLk05o1K2B0gzeHdhH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z5WzP/btrRSQKZRhk/go0gLk05o1K2B0gzeHdhH1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z5WzP/btrRSQKZRhk/go0gLk05o1K2B0gzeHdhH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ5WzP%2FbtrRSQKZRhk%2Fgo0gLk05o1K2B0gzeHdhH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;98&quot; data-filename=&quot;jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. Set whether or not to display the group button.&lt;/p&gt;
&lt;pre id=&quot;code_1669089645803&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  Data += optionHD;
  Data += F(&quot;DAB:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIIubH/btrRR86mJYB/PKtwlZVjWplG3e1shPHvEk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIIubH/btrRR86mJYB/PKtwlZVjWplG3e1shPHvEk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIIubH/btrRR86mJYB/PKtwlZVjWplG3e1shPHvEk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIIubH%2FbtrRR86mJYB%2FPKtwlZVjWplG3e1shPHvEk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;31&quot; data-filename=&quot;addGroupButton.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8zo2c/btrROI02ftU/CVJKn1anUihqrENKATAI0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8zo2c/btrROI02ftU/CVJKn1anUihqrENKATAI0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8zo2c/btrROI02ftU/CVJKn1anUihqrENKATAI0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8zo2c%2FbtrROI02ftU%2FCVJKn1anUihqrENKATAI0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;143&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIzi86/btrRLKTHCLf/FfszLXqWWyzO46Qst6k4Sk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIzi86/btrRLKTHCLf/FfszLXqWWyzO46Qst6k4Sk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIzi86/btrRLKTHCLf/FfszLXqWWyzO46Qst6k4Sk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIzi86%2FbtrRLKTHCLf%2FFfszLXqWWyzO46Qst6k4Sk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;137&quot; data-filename=&quot;SSIDLabel.jpg&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1669090158714&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2: show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  Data += optionHD;
  Data += F(&quot;SLM:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byaj7v/btrRMZWNdiw/46yiKKZ1hlyKDZuuVEb2vk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byaj7v/btrRMZWNdiw/46yiKKZ1hlyKDZuuVEb2vk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byaj7v/btrRMZWNdiw/46yiKKZ1hlyKDZuuVEb2vk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyaj7v%2FbtrRMZWNdiw%2F46yiKKZ1hlyKDZuuVEb2vk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;384&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22. Set the activation interval of the gravity sensor and transmission of the tilt value.&lt;/p&gt;
&lt;pre id=&quot;code_1669090262649&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;UGI:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o2EqC/btrRPA9E6To/l3jsBs7TNtT6riHJVUowSK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o2EqC/btrRPA9E6To/l3jsBs7TNtT6riHJVUowSK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o2EqC/btrRPA9E6To/l3jsBs7TNtT6riHJVUowSK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo2EqC%2FbtrRPA9E6To%2Fl3jsBs7TNtT6riHJVUowSK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;83&quot; data-filename=&quot;readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOShIf/btrRRwzZE47/A6HU8LKkKPVtWqVT0RNOZK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOShIf/btrRRwzZE47/A6HU8LKkKPVtWqVT0RNOZK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOShIf/btrRRwzZE47/A6HU8LKkKPVtWqVT0RNOZK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOShIf%2FbtrRRwzZE47%2FA6HU8LKkKPVtWqVT0RNOZK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;372&quot; height=&quot;48&quot; data-filename=&quot;gravitySensorActive.jpg&quot; data-origin-width=&quot;372&quot; data-origin-height=&quot;48&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23. Set labels for buttons.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Label buttons 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;pre id=&quot;code_1669090365443&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  Data += optionHD;
  Data += F(&quot;ABL:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blXl9Y/btrRNUBQGjU/L988ybgDWB62iSSjK9wxNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blXl9Y/btrRNUBQGjU/L988ybgDWB62iSSjK9wxNk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blXl9Y/btrRNUBQGjU/L988ybgDWB62iSSjK9wxNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblXl9Y%2FbtrRNUBQGjU%2FL988ybgDWB62iSSjK9wxNk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;84&quot; data-filename=&quot;buttonLabel.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8zo2c/btrROI02ftU/CVJKn1anUihqrENKATAI0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8zo2c/btrROI02ftU/CVJKn1anUihqrENKATAI0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8zo2c/btrROI02ftU/CVJKn1anUihqrENKATAI0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8zo2c%2FbtrROI02ftU%2FCVJKn1anUihqrENKATAI0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;143&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;24. Set the toggle/push properties of the left 4 buttons or 20 buttons of all.&lt;/p&gt;
&lt;pre id=&quot;code_1669090545662&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0000&quot;)           // left pad: up-left-right-down
//F(&quot;00000000001111110000&quot;) // 0000:left, 0000:right, 001111110000:center
void setLeftPadOrAllToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;LTG:&quot;);
  Data += str;  
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RanyJ/btrRRvgOtTN/FTZ6TaAybtgwMzvbNwfSmk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RanyJ/btrRRvgOtTN/FTZ6TaAybtgwMzvbNwfSmk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RanyJ/btrRRvgOtTN/FTZ6TaAybtgwMzvbNwfSmk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRanyJ%2FbtrRRvgOtTN%2FFTZ6TaAybtgwMzvbNwfSmk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;385&quot; height=&quot;105&quot; data-filename=&quot;buttonDisplaySet.jpg&quot; data-origin-width=&quot;385&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;25. Set the toggle/push properties of the right 4 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669090560825&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;0000&quot;)           // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;RTG:&quot;);
  Data += str;  
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;26. Set the toggle/push properties of the middle 12 buttons.&lt;/p&gt;
&lt;pre id=&quot;code_1669090577219&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// F(&quot;000000000000&quot;); // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;BTG:&quot;);
  Data += str;  
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;27. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; selection index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  Data += optionHD;
  Data += F(&quot;RAD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; Data += ':';
  Data += String(selection);
  Data += '\n';
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKLR41/btrRNB2rrt3/BkeK6hgw9F4bTUKGgKftuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKLR41/btrRNB2rrt3/BkeK6hgw9F4bTUKGgKftuK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKLR41/btrRNB2rrt3/BkeK6hgw9F4bTUKGgKftuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKLR41%2FbtrRNB2rrt3%2FBkeK6hgw9F4bTUKGgKftuK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;28. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;CKB:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b83PPF/btrRPCfoPCX/Ir2YDNKw1pTOSCNmmwU5Pk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b83PPF/btrRPCfoPCX/Ir2YDNKw1pTOSCNmmwU5Pk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b83PPF/btrRPCfoPCX/Ir2YDNKw1pTOSCNmmwU5Pk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb83PPF%2FbtrRPCfoPCX%2FIr2YDNKw1pTOSCNmmwU5Pk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;29. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  Data += optionHD;
  Data += F(&quot;CHD:&quot;); 
  Data += String(id); Data += ':'; 
  Data += message; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yvJJ5/btrRQ4vXADv/q2L95KmOWcRuuvYHm2OlA0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yvJJ5/btrRQ4vXADv/q2L95KmOWcRuuvYHm2OlA0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yvJJ5/btrRQ4vXADv/q2L95KmOWcRuuvYHm2OlA0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyvJJ5%2FbtrRQ4vXADv%2Fq2L95KmOWcRuuvYHm2OlA0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;30. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;LSD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B2AR0/btrRNB2rO4g/SznRUgcdbmSakLFGsVS1Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B2AR0/btrRNB2rO4g/SznRUgcdbmSakLFGsVS1Y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B2AR0/btrRNB2rO4g/SznRUgcdbmSakLFGsVS1Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB2AR0%2FbtrRNB2rO4g%2FSznRUgcdbmSakLFGsVS1Y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;294&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;31. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1668667558042&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  Data += optionHD;
  Data += F(&quot;STR:&quot;); 
  Data += String(id); Data += ':'; 
  Data += title; 
  Data += '\n';
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KTu62/btrRMWMFPF7/bCGdekzgPgAOdKZyHXfvkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KTu62/btrRMWMFPF7/bCGdekzgPgAOdKZyHXfvkk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KTu62/btrRMWMFPF7/bCGdekzgPgAOdKZyHXfvkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKTu62%2FbtrRMWMFPF7%2FbCGdekzgPgAOdKZyHXfvkk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.ARDUINO_ESP01_JOYSTICK.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cgWUio/btrRVMBRhIi/ddpp67ZtgmQWhMDNeKshK0/1.ARDUINO_ESP01_JOYSTICK.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1.ARDUINO_ESP01_JOYSTICK.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/qUIGxQ3kFGo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/qUIGxQ3kFGo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/qUIGxQ3kFGo&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669173999725&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(RX, TX);

const char ssidAP[] = &quot;ESP01&quot;;   // your network SSID (name)
const char passAP[] = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password

bool wifiRouter = true;      // 공유기 연결 유무
const char ssid[] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
const char pass[] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

String ap = &quot;&quot;;
String ip = &quot;&quot;;

String Data = &quot;&quot;;
#include &quot;protocol.h&quot;

#define ledPin 13

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);
  esp01.begin(9600); // your esp's baud rate might be different
  sendData(F(&quot;RST&quot;)); 
  unsigned long int time = millis();
  String temp = &quot;&quot;;
  while (time+20000 &amp;gt; millis()) {
    temp = esp01.readStringUntil('\n');
    if (temp.indexOf(F(&quot;ready&quot;)) != -1) { Serial.println(F(&quot;Set&quot;)); break; }
  }
  if (wifiRouter) sendData(F(&quot;CWMODE=3&quot;)); // configure as access point (working mode: AP+STA)
  else sendData(F(&quot;CWMODE=2&quot;));
  if (wifiRouter) sendData(F(&quot;CWDHCP=1,1&quot;));
  sendData(addID(F(&quot;CWSAP=&quot;),ssidAP,passAP)+','+String(10)+','+String(3)); 
  sendData(F(&quot;CIPMUX=1&quot;)); // configure for multiple connections
  sendData(F(&quot;CIPSERVER=1,80&quot;)); // turn on server on port 80
  if (wifiRouter) {
    retry = 1;
    while(retry) { 
      sendData(addID(F(&quot;CWJAP=&quot;),ssid,pass)); 
      if (retry &amp;gt; 1) { Serial.print(F(&quot;Retrying to connect: &quot;)); Serial.println(retry-1); }
      if (retry &amp;gt; 4) { Serial.println(F(&quot;connection failed&quot;)); retry = 0; }
    }
  }
  ipCheck(sendData(F(&quot;CIFSR&quot;))); // get ip address
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(F(&quot;button 1 : on&quot;)); 
                  break;
      case 10: Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 51: Serial.println(F(&quot;button 5 : on&quot;));
                  break;
      case 50: Serial.println(F(&quot;button 5 : off&quot;));
                  break;
      case 61: Serial.println(F(&quot;button 6 : on&quot;));
                  break;
      case 60: Serial.println(F(&quot;button 6 : off&quot;));
                  break;
      case 71: Serial.println(F(&quot;button 7 : on&quot;));
                  break;
      case 70: Serial.println(F(&quot;button 7 : off&quot;));
                  break;
      case 81: Serial.println(F(&quot;button 8 : on&quot;));
                  break;
      case 80: Serial.println(F(&quot;button 8 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(F(&quot;button 10 : on&quot;));
                //uint8_t id, String title, String option
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,tomato,banana,mango&quot;)); 
                  break;
      case 100: Serial.println(F(&quot;button 10 : off&quot;));
                  break;  
      case 111: Serial.println(F(&quot;button 11 : on&quot;));
                  break;
      case 110: Serial.println(F(&quot;button 11 : off&quot;));
                  break;  
      case 121: Serial.println(F(&quot;button 12 : on&quot;));
                  break;
      case 120: Serial.println(F(&quot;button 12 : off&quot;));
                  break;  
      case 131: Serial.println(F(&quot;button 13 : on&quot;));
                  break;  
      case 130: Serial.println(F(&quot;button 13 : off&quot;));
                  break;  
      case 141: Serial.println(F(&quot;button 14 : on&quot;));
                  break;  
      case 140: Serial.println(F(&quot;button 14 : off&quot;));
                  break;  
      case 151: Serial.println(F(&quot;button 15 : on&quot;));
                  break;  
      case 150: Serial.println(F(&quot;button 15 : off&quot;));
                  break;     
      case 161: Serial.println(F(&quot;button 16 : on&quot;));
                  break;
      case 160: Serial.println(F(&quot;button 16 : off&quot;));
                  break;  
      case 171: Serial.println(F(&quot;button 17 : on&quot;));
                  break;
      case 170: Serial.println(F(&quot;button 17 : off&quot;));
                  break;  
      case 181: Serial.println(F(&quot;button 18 : on&quot;));
                  break;  
      case 180: Serial.println(F(&quot;button 18 : off&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : on&quot;));
                  break;  
      case 190: Serial.println(F(&quot;button 19 : off&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : on&quot;));
                  break;  
      case 200: Serial.println(F(&quot;button 20 : off&quot;));
                  break; 
      case 210: Serial.println(F(&quot;button 21 : off&quot;));
                  break;  
      case 220: Serial.println(F(&quot;button 22 : off&quot;));
                  break;               
    }
  }
}

// headingVal = false;
//           Top
//         6  7  0
//          \ | /
//  Left 5 --   -- 1 Right
//          / | \
//         4  3  2
//          Bottom

bool headingVal = true; 

void joystick_control(uint8_t id, uint16_t heading, uint8_t strength) {
  //sendJoyEcho(id, heading, strength); 
  if (id == 0) Serial.print(F(&quot;L: &quot;));
  else if (id == 1) Serial.print(F(&quot;R: &quot;));
  else Serial.print(F(&quot;C: &quot;));
  if (headingVal) {
    Serial.print(heading); Serial.print('/'); Serial.println(strength);
  } else {
    if (heading &amp;lt;= 23) heading = 359;
    int8_t stickDir = (heading-23)/45;  
    Serial.println(stickDir);
  }
}

bool appConnection = false;
String income_wifi = &quot;&quot;; // 와이파이 수신 스트링 저장 변수
uint16_t leftCount = 2;
uint16_t rightCount = 2;
uint16_t centerCount = 2;

void wifi_read() {
  while (esp01.available()) { 
    income_wifi = esp01.readStringUntil('\n');
    if (income_wifi.startsWith(F(&quot;+IPD&quot;))) {
      income_wifi.remove(0,5);
      connectionId = income_wifi.charAt(0);
      int st = income_wifi.indexOf(F(&quot;GET /&quot;))+5;
      income_wifi.remove(0,st);
      if (!income_wifi.startsWith(F(&quot;fav&quot;))) { // favicon.ico 는 통과 
        int ed = income_wifi.lastIndexOf(F(&quot;HTTP/1.1&quot;));
        income_wifi.remove(ed-1);
        String temp = &quot;&quot;; 
        if (appConnection) {  
          temp = income_wifi.substring(0, 4);
          uint8_t order = 0; 
          if (temp == checkHD) order = 1;
          else if (temp == pinHD) order = 2;
          else if (temp == joyHD) order = 3;
          else if (temp == connectHD) order = 4;
          else if (temp == optionHD) order = 5; 
          if (order &amp;gt; 2) income_wifi.remove(0, 4); //프로토콜 헤더 제거
          if (order == 1) { // send data to app when change local/web control value
            
          } else if (order == 2) { // %%F0
            while(income_wifi.indexOf(pinHD) != -1) { // need depend on left arrow pad mode 
              income_wifi.remove(0, 4);
              ed = income_wifi.indexOf(footHD);
              if (ed != -1) {
                temp = income_wifi.substring(0, ed);
                uint8_t value = temp.toInt();
                income_wifi.remove(0, ed+4);
                pin_control(value);
              } else break;
            }
          } else if (order == 3) { // %%F3
            temp = income_wifi.substring(0, 1);
            uint8_t id = temp.toInt();
            income_wifi.remove(0, 1);
            ed = income_wifi.indexOf(addHD);
            temp = income_wifi.substring(0, ed);
            uint16_t count = temp.toInt();
            bool ok = true;
            if (id == 0) {
              if (count == 0) leftCount = 0;
              if (count &amp;lt; leftCount) ok = false;
              else leftCount = count;
            } else if (id == 1) {
              if (count == 0) rightCount = 0;
              if (count &amp;lt; rightCount) ok = false;
              else rightCount = count;
            } else {
              if (count == 0) centerCount = 0;
              if (count &amp;lt; centerCount) ok = false;
              else centerCount = count;
            }
            if (ok) {
              income_wifi.remove(0, ed+addHDLen);
              ed = income_wifi.indexOf(addHD);
              temp = income_wifi.substring(0, ed);
              uint16_t heading = temp.toInt();
              income_wifi.remove(0, ed+addHDLen);
              ed = income_wifi.indexOf(addHD);
              temp = income_wifi.substring(0, ed);
              uint8_t strength = temp.toInt();
              income_wifi.remove(0, ed);
              if (income_wifi == footHD) {
                joystick_control(id, heading, strength);
              }
            }
          } else if (order == 4) { // %%F8
            if (income_wifi == F(&quot;connect&quot;)) iniSet();
            else if (income_wifi == F(&quot;disconnect&quot;)) appConnection = false;  
            else if (income_wifi.startsWith(F(&quot;WiFi&quot;))) { 
              sendMessage(F(&quot;This funtion is not available.&quot;)); 
            } else Serial.println(income_wifi);
          } else if (order == 5) { // %%F9
            income_wifi.replace(F(&quot;%20&quot;), F(&quot; &quot;)); // URL Decoding 공백문자 변경
            CheckF9(income_wifi); 
          } else { 
            income_wifi.replace(F(&quot;%20&quot;), F(&quot; &quot;)); // URL Decoding 공백문자 변경
            Serial.println(income_wifi);
          }
          http_response();
        } else {
          if (income_wifi == checkHD) { 
            appConnection = true; http_response(); 
            if (connectionId != 48) {
              while (connectionId != 48) { 
                connectionId--;
                String command = F(&quot;AT+CIPCLOSE=&quot;);
                command += String(connectionId-48);
                command += F(&quot;\r\n&quot;);
                esp01.print(command);
                delay(1);
              } 
            }
          }
        }
      }
      income_wifi = &quot;&quot;;
    }
  }      
}     
 
void loop() {
  wifi_read();
  if(Serial.available()) { // 시리얼 버퍼에 데이터 있으면
    String temp = Serial.readStringUntil('\n'); // 시리얼 모니터 - NEW LINE 옵션
    Serial.println(temp);
    if(temp == &quot;1&quot;){   
      
    } else if(temp == &quot;2&quot;){ 
      
    } else if(temp == &quot;3&quot;){ 
      
    } else if(temp == &quot;4&quot;){
      
    } else if(temp == &quot;5&quot;){
      
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1669174039188&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD F(&quot;%%F0&quot;)
#define joyHD F(&quot;%%F3&quot;)
#define strHD F(&quot;%%F4&quot;)
#define footHD F(&quot;%%F1&quot;)
#define echoHD F(&quot;%%E1&quot;)
#define connectHD F(&quot;%%F8&quot;)
#define optionHD F(&quot;%%F9&quot;)
#define checkHD F(&quot;%%F5&quot;)
#define HDLen 4
#define addHD F(&quot;%%&quot;)
#define addHDLen 2

// SEND PIN VALUE
void sendPinState(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += footHD;
  Data += '\n';
}

// SEND PIN ECHO
void sendPinEcho(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += echoHD;
  Data += '\n';
}

// id 0:Left Joystick, 1:Right Joystick 2:Gravity Sensor(change only text)
void sendJoyState(uint8_t id, uint16_t heading, uint8_t strength) {                      
  Data += joyHD;
  Data += id;
  Data += addHD;
  Data += heading;
  Data += addHD;
  Data += strength;
  Data += footHD;
  Data += '\n';
}

// SEND JOYSTIC ECHO - ESP01: USE AT PASSIVE JOYSTIC MODE
void sendJoyEcho(uint8_t id, uint16_t heading, uint8_t strength) {                          
  Data += joyHD;
  Data += id;
  Data += addHD;
  Data += heading;
  Data += addHD;
  Data += strength;
  Data += echoHD;
  Data += '\n';
}

// SEND TEXT
void sendText(String text) {                               
  Data += strHD;
  Data += text;
  Data += footHD;
  Data += '\n';
}

///////////////////////////////////////// CONNECTION 
void sendDisconnect(){ 
  Data += connectHD;
  Data += F(&quot;DIS&quot;);
  Data += '\n';
}

//#define passName F(&quot;PAS:&quot;)
//#define passNameLen 4
//
//void requestPass(bool val){ 
//  Data += connectHD;
//  Data += val;
//  Data += passName;
//  Data += '\n';
//}
//
//#define cooLength 5
//String cooValue = &quot;u7Dv0&quot;;
//
//String makeCooValue() {
//  cooValue = &quot;&quot;;
//  uint8_t temp = 0;
//  for (int i = 0; i &amp;lt; cooLength; i++) {
//    temp = random(39, 123); //random(39, 123); // 39 ~ 122 pick
//    if (temp == 47 || temp == 59 || temp == 60 || temp == 62 || temp == 92 || temp == 94 || temp == 96) temp = 79;
//    cooValue += char(temp);
//  }
//  return cooValue;
//}
//
//void responsePass(bool val){ 
//  Data += connectHD;
//  Data += F(&quot;RES:&quot;);
//  if (val) Data += makeCooValue(); 
//  else Data += val;
//  Data += '\n';
//}

void sendWifiInfo(){ 
  Data += connectHD;
  Data += F(&quot;INF:&quot;);
  Data += ssidAP;
  Data += ',';
  Data += passAP;
  Data += ',';
  Data += ap;
  Data += ',';
  Data += wifiRouter;
  Data += ',';
  Data += ssid;
  Data += ',';
  Data += pass;
  Data += ',';
  Data += ip;
  Data += '\n';
}

void sendMessage(String str){ 
  Data += connectHD;
  Data += F(&quot;MES:&quot;);
  Data += str;
  Data += '\n';
}

// defalt: true
void responseFailResend(bool val) {
  Data += connectHD;
  Data += F(&quot;RFR:&quot;);
  Data += val;
  Data += '\n';
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveJoystick(bool val){ 
  Data += optionHD;
  Data += F(&quot;ACT:&quot;);
  Data += val;
  Data += '\n';
}

// SEND SLIDE GET VALUE INTERVAL
void setJoystickInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;JSI:&quot;);
  Data += val;
  Data += '\n';
}

void setJoyZeroRange(uint8_t val){ 
  if (val &amp;gt; 35) val = 35;
  Data += optionHD;
  Data += F(&quot;JZR:&quot;);
  Data += val;
  Data += '\n';
}

void setJoyStrengthAdjust(bool val){ 
  Data += optionHD;
  Data += F(&quot;ADJ:&quot;);
  Data += val;
  Data += '\n';
}

void setRequest(bool val){ 
  Data += optionHD;
  Data += F(&quot;REQ:&quot;);
  Data += val;
  Data += '\n';
}

void setRequestInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;INT:&quot;);
  Data += val;
  Data += '\n';
}

// 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
void setLeftPadMode(uint8_t val){  
  if (val == 0 || val &amp;gt; 2) val = 4; 
  Data += optionHD;
  Data += F(&quot;LPM:&quot;);
  Data += val;
  Data += '\n';
}

// 0: Left &amp;amp; Right False 1: Left 4 Way 2: Right 4Way 3: Both 4 Way
void setJoyWay4(uint8_t val){
  Data += optionHD;
  Data += F(&quot;SJW:&quot;);
  Data += val;
  Data += '\n';
}

// 0: none 1: group1 2: group1&amp;amp;2
void setDisplayAddButton(uint8_t val){ 
  if (val &amp;gt; 2) val = 2;
  Data += optionHD;
  Data += F(&quot;DAB:&quot;);
  Data += val;
  Data += '\n';
}

// 0: not use, 1: show only name, 2: show name &amp;amp; pass, defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  Data += optionHD;
  Data += F(&quot;SLM:&quot;);
  Data += val;
  Data += '\n';
}

// defalt interval : 180 millis, 180, 180 * 6 = 1080
void useGravityAndInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;UGI:&quot;);
  Data += val;
  Data += '\n';
}

//f(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;)
void setAddButtonLabel(String str){ 
  Data += optionHD;
  Data += F(&quot;ABL:&quot;);
  Data += str;
  Data += '\n';
}

//F(&quot;0000&quot;)           // left pad: up-left-right-down
void setLeftPadOrAllToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;LTG:&quot;);
  Data += str;  
  Data += '\n';
}
// F(&quot;0000&quot;)           // right pad: top-left-right-bottom
void setRightPadToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;RTG:&quot;);
  Data += str;  
  Data += '\n';
}
// F(&quot;000000000000&quot;); // center: view-menu-bt1-bt2-bt3-bt4-bt5-bt6-LB-LT-RB-RT
void setButtonToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;BTG:&quot;);
  Data += str;  
  Data += '\n';
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  Data += optionHD;
  Data += F(&quot;RAD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; Data += ':';
  Data += String(selection);
  Data += '\n';
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;CKB:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  Data += optionHD;
  Data += F(&quot;CHD:&quot;); 
  Data += String(id); Data += ':'; 
  Data += message; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;LSD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  Data += optionHD;
  Data += F(&quot;STR:&quot;); 
  Data += String(id); Data += ':'; 
  Data += title; 
  Data += '\n';
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  sendWifiInfo(); 
  setAddButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  //setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  //setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;)); 
  setJoyWay4(false);
  setActiveJoystick(false); //setJoystickInterval(100);
  setJoyStrengthAdjust(true);
  setRequest(false); //setRequestInterval(250);
}

void ipCheck(String response) {
  int st, ed;
  if (response.indexOf(F(&quot;PIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;PIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ap = response.substring(st, ed);
    response.remove(0, ed+1);
    Serial.print(F(&quot;ap: &quot;)); Serial.println(ap);
  }
  if (response.indexOf(F(&quot;AIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;AIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    Serial.print(F(&quot;ip: &quot;)); Serial.println(ip);
  }
}

uint8_t retry = 1;

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  esp01.print(command); // send the read character to the esp01
  long int time = millis();
  String response = &quot;&quot;;
  while( (time+20000) &amp;gt; millis()) {
    while(esp01.available()) {  // The esp has data so display its output to the serial window
      char c = esp01.read(); // read the next character.
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) { retry = 0; Serial.println(F(&quot;OK&quot;)); break; } 
    else if (response.indexOf(F(&quot;FAIL&quot;)) != -1 || response.indexOf(F(&quot;ERROR&quot;)) != -1) { 
      if (response.indexOf(F(&quot;FAIL&quot;)) != -1) retry++;
      else if (response.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; } 
      Serial.print(command); Serial.println(F(&quot;Failed&quot;)); break; 
    }
  }
  return response;
}

String addID(String order, String ssidTemp, String passTemp) {
  String temp = order+'&quot;'+ssidTemp+'&quot;'+','+'&quot;'+passTemp+'&quot;';
  return temp;
}

uint8_t connectionId = 48; // 연결 id 저장 변수

void http_response() {
  String cip = F(&quot;AT+CIPSEND=&quot;);
  cip += connectionId-48;
  cip += ',';
  cip += Data.length()+19;
  cip += F(&quot;\r\n&quot;);
  esp01.print(cip);
  unsigned long int time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) break;
  }
  esp01.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;)); // +19
  esp01.print(Data);
  time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) break;
  }
  Data = &quot;&quot;;
  String command = F(&quot;AT+CIPCLOSE=&quot;);
  command += String(connectionId-48);
  command += F(&quot;\r\n&quot;);
  esp01.print(command);
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of Grabity Sensor using responseFailResend() function&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Coded to not respond to values from the gravity sensor continuously transmitted in active mode.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code to prevent response according to joystick number(Gravity Sensor)&lt;/p&gt;
&lt;pre id=&quot;code_1669175470952&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool joystick_control(uint8_t id, uint16_t heading, uint8_t strength) {
  bool response = true;
  if (id == 0) Serial.print(F(&quot;L: &quot;));      // set passive joystick mode by setActiveJoystick(false);
  else if (id == 1) Serial.print(F(&quot;R: &quot;)); // set passive joystick mode by setActiveJoystick(false);
  else { Serial.print(F(&quot;C: &quot;)); response = false; } // gravity sensor's allways active mode
  if (headingVal) {
    Serial.print(heading); Serial.print('/'); Serial.println(strength);
  } else {
    if (heading &amp;lt;= 23) heading = 359;
    int8_t stickDir = (heading-23)/45; 
    Serial.println(stickDir);
  }
  return response;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code to prevent response about the value of all Joystic.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In Active Joystic Mode, the Response must be prevented due to taking more than 1 second to process AT Command.&lt;/p&gt;
&lt;pre id=&quot;code_1669176311429&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool joystick_control(uint8_t id, uint16_t heading, uint8_t strength) {
  if (id == 0) Serial.print(F(&quot;L: &quot;));      
  else if (id == 1) Serial.print(F(&quot;R: &quot;)); 
  else { Serial.print(F(&quot;C: &quot;)); response = false; } 
  if (headingVal) {
    Serial.print(heading); Serial.print('/'); Serial.println(strength);
  } else {
    if (heading &amp;lt;= 23) heading = 359;
    int8_t stickDir = (heading-23)/45; 
    Serial.println(stickDir);
  }
  return response = false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code to prevent response about the value of all button except menu-related buttons that must be made a response.&lt;/p&gt;
&lt;pre id=&quot;code_1669177942622&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool pin_control(uint8_t value) {
  bool response = false;
  if (value != 0) {
    switch (value) {
      .
      .
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
               //uint8_t id, String title, String option
               dialogList(0, F(&quot;LEFT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); 
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(&quot;button 10 : on&quot;);
                //uint8_t id, String title, String option
                dialogList(2, F(&quot;RIGHT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); 
                  break;
      case 100: Serial.println(F(&quot;button 10 : off&quot;));
                  break;  
      .
      .
    }
  }
  if (value == 91 || value == 101) response = true; // must be made a response
  return response;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the wifi_read() function&lt;/p&gt;
&lt;pre id=&quot;code_1669178311925&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (appConnection) { 
  bool response = true; // add
  if (order == 1) {  }
  else if (order == 2) {  
    response = pin_control(value); // edit
  }
  else if (order == 3) {
    response = joystick_control(id, heading, strength); // edit
  } 
  else if (order == 4) {  }
  else {  }
  if (response) http_response(); // edit
  else {  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.ARDUINO_ESP01_JOYSTICK_GRAVITY_NORESPONSE.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cnKRR8/btrRTErdG0Q/CQAqvqt8NWl8PDovFlg8vK/2.ARDUINO_ESP01_JOYSTICK_GRAVITY_NORESPONSE.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;2.ARDUINO_ESP01_JOYSTICK_GRAVITY_NORESPONSE.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/QjgocTgGyis&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/QjgocTgGyis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/QjgocTgGyis&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUPAD app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUPAD app settings: label/toggle properties, use of the timer for checkHD(%%F5), Joystic Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1669178725709&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  sendWifiInfo(); 
  setAddButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6&quot;));
  setDisplayAddButton(2); // 0: none 1: group1 2: group1&amp;amp;2
  setLeftPadMode(1);      // 1: independent 2: group1(up-down) / group2 (left-right) 4: group4(only 1)
  setLeftPadOrAllToggle(F(&quot;00000000001111110000&quot;)); 
  setJoyWay4(false);
  setActiveJoystick(false); //setJoystickInterval(100); // Passive Joysitck Mode
  setJoyStrengthAdjust(true);                           // value of Joystick adjusted into 0 ~ 10
  setRequest(false); //setRequestInterval(250);         // Disable timer for check(%%F5)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the leftPadMode and menu-related button.&lt;/p&gt;
&lt;pre id=&quot;code_1669179441364&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up DIR&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;)); 
                  break;
      case 10: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Up off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left DIR&quot;));
               else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Left off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right DIR&quot;));
               else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Right off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down DIR&quot;));
               else Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: if (leftPadMode &amp;gt; 1) Serial.println(F(&quot;Down off&quot;));
               else Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      .
      .
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
               //uint8_t id, String title, String option
               dialogList(0, F(&quot;LEFT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(&quot;button 10 : on&quot;);
                //uint8_t id, String title, String option
                dialogList(2, F(&quot;RIGHT PAD&quot;), F(&quot;SELECT,TOGGLE,PUSH&quot;)); // dialog message
                  break;
      .
      .
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1669180016691&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }         // radio button
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }    // Checkbox
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }    // Select button
  else if (temp.startsWith(F(&quot;LSD&quot;))) {       // List Window
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { leftPadMode = 0; setLeftPadOrAllToggle(F(&quot;0000&quot;)); }
      else if (temp.startsWith(F(&quot;TOG&quot;))) {
        setLeftPadOrAllToggle(F(&quot;1111&quot;)); // set toggle for left button
        dialogList(1, F(&quot;LEFT PAD MODE AT TOGGLE&quot;), F(&quot;SELECT,INDIVIDUAL,TWO GROUP,ONLY ONE&quot;)); // dialog message
      }
    } else if (id == 1) {
      if (temp.startsWith(F(&quot;IND&quot;))) leftPadMode = 1; // independant
      else if (temp.startsWith(F(&quot;TWO&quot;))) leftPadMode = 2; // 2 group: up/down, left/right
      else if (temp.startsWith(F(&quot;ONL&quot;))) leftPadMode = 4; // 4psc button is 1 group
      setLeftPadMode(leftPadMode);
    } else if (id == 2) {
      if (temp.startsWith(F(&quot;PUS&quot;))) { rightPadMode = 0; setRightPadToggle(F(&quot;0000&quot;)); } // set push for right button
      else { rightPadMode = 1; setRightPadToggle(F(&quot;1111&quot;)); }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }       // Input text
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.ARDUINO_ESP01_JOYSTICK_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/nPCLt/btrRXDdRt6k/EFSLiSGAmDImB08SlRtt6k/3.ARDUINO_ESP01_JOYSTICK_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;3.ARDUINO_ESP01_JOYSTICK_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/oa89VEVs-IM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/oa89VEVs-IM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/oa89VEVs-IM&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Wifi Manager&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can change the ID and password for connecting to access points and a router without using HTML code.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddXsDl/btrRVuoJHLl/DmmIpOdATmeK484KG8G8ck/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddXsDl/btrRVuoJHLl/DmmIpOdATmeK484KG8G8ck/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddXsDl/btrRVuoJHLl/DmmIpOdATmeK484KG8G8ck/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddXsDl%2FbtrRVuoJHLl%2FDmmIpOdATmeK484KG8G8ck%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;561&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.ARDUINO_ESP01_JOYSTICK_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/lzHHO/btrRX0NpSYe/zJxHrg2DPhBA34K5f2IRr1/4.ARDUINO_ESP01_JOYSTICK_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;4.ARDUINO_ESP01_JOYSTICK_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/FlHNzvcrFOY&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/FlHNzvcrFOY&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/FlHNzvcrFOY&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Login&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When connecting through a router, obtain control authority using password of the access point.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMu8Qd/btrRVtclG8W/COdGZuhTcE28kcEkbIGwPK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMu8Qd/btrRVtclG8W/COdGZuhTcE28kcEkbIGwPK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMu8Qd/btrRVtclG8W/COdGZuhTcE28kcEkbIGwPK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMu8Qd%2FbtrRVtclG8W%2FCOdGZuhTcE28kcEkbIGwPK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;199&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ql8dN/btrRXtJm4HJ/kM6I4EnBrpEvikPKc7a9T1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ql8dN/btrRXtJm4HJ/kM6I4EnBrpEvikPKc7a9T1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ql8dN/btrRXtJm4HJ/kM6I4EnBrpEvikPKc7a9T1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fql8dN%2FbtrRXtJm4HJ%2FkM6I4EnBrpEvikPKc7a9T1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;60&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.ARDUINO_ESP01_JOYSTICK_PASS.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bV6lM6/btrRX2ErvZR/3GA6OZGNluUw4a3rEEywD1/5.ARDUINO_ESP01_JOYSTICK_PASS.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;5.ARDUINO_ESP01_JOYSTICK_PASS.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/GD8_yDmlI_8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/GD8_yDmlI_8&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/GD8_yDmlI_8&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ADUPAD - Arduino wireless remote control PAD application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUPAD</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/183</guid>
      <comments>https://postpop.tistory.com/183#entry183comment</comments>
      <pubDate>Mon, 21 Nov 2022 17:00:14 +0900</pubDate>
    </item>
    <item>
      <title>Arduino WiFi remote control with ADUCON and ESP-01</title>
      <link>https://postpop.tistory.com/182</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccfC5D/btrU8FnmRv2/bzJw4UkrKMxj1kMQFdRqkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccfC5D/btrU8FnmRv2/bzJw4UkrKMxj1kMQFdRqkk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccfC5D/btrU8FnmRv2/bzJw4UkrKMxj1kMQFdRqkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccfC5D%2FbtrU8FnmRv2%2FbzJw4UkrKMxj1kMQFdRqkk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If the baud rate of ESP01 is not set to 9600, refer to the post below to set it up.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Please&amp;nbsp;refer&amp;nbsp;to&amp;nbsp;the&amp;nbsp;post&amp;nbsp;below&amp;nbsp;for&amp;nbsp;how&amp;nbsp;to&amp;nbsp;connect&amp;nbsp;Arduino&amp;nbsp;and&amp;nbsp;ESP01.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/181&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Setting up Wi-Fi module ESP01 and basic code for Arduino remote control&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;ADUCON application&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkCJRs/btrRpY5ap7c/Zf8UhSbETU9yL13w4pHGuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkCJRs/btrRpY5ap7c/Zf8UhSbETU9yL13w4pHGuK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkCJRs/btrRpY5ap7c/Zf8UhSbETU9yL13w4pHGuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkCJRs%2FbtrRpY5ap7c%2FZf8UhSbETU9yL13w4pHGuK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;617&quot; data-filename=&quot;ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;BASIC CONNENTION TEST&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Upload&amp;nbsp;the&amp;nbsp;sketches&amp;nbsp;below&amp;nbsp;to&amp;nbsp;Arduino.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_ESP01_ADUCON_BASIC.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bi8zJV/btrV4tzVBZc/0E4D5J5B0TJHnRJCBtLb61/1.ARDUINO_ESP01_HMI_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1.ARDUINO_ESP01_HMI_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Modify the HTTP response code in loop() function according to the protocol for &quot;TEXT&quot; set in the ADUCON app.&lt;/p&gt;
&lt;pre id=&quot;code_1669529931225&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (gotData) { 
  Data = &quot;%%F4&quot;;   // protocol header of text for ADUCON
  Data += &quot;Hello World &quot;;
  Data += random(100,200);
  Data += &quot;%%F1&quot;;  // protocol footer of text for ADUCON
  Data += '\n';    // termination character of wifi for ADUCON
  Serial.println(Data); // Output the message to the serial monitor.
  http_response();
  gotData = false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ARDUINO_ESP01_ADUCON_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitor.jpg&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HWd80/btrSc9RpGzw/EkXcT9LlhOO1PkuaCMdFh0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HWd80/btrSc9RpGzw/EkXcT9LlhOO1PkuaCMdFh0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HWd80/btrSc9RpGzw/EkXcT9LlhOO1PkuaCMdFh0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHWd80%2FbtrSc9RpGzw%2FEkXcT9LlhOO1PkuaCMdFh0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;445&quot; data-filename=&quot;basicMonitor.jpg&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting to the assigned IP while ESP01 is connected to the router&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the assigned IP address &quot;192.168.1.7&quot; on ADUCON app connected to network of &quot;skynet&quot;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputAddressADUCON.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L48Jc/btrSarL2V8K/PFx30jwiikV81viRSrYuak/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L48Jc/btrSarL2V8K/PFx30jwiikV81viRSrYuak/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L48Jc/btrSarL2V8K/PFx30jwiikV81viRSrYuak/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL48Jc%2FbtrSarL2V8K%2FPFx30jwiikV81viRSrYuak%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;171&quot; data-filename=&quot;inputAddressADUCON.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitor1ADUCON.jpg&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;847&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC9gNE/btrR9jurAWx/0pKsZnQEHXAkkgRSOPRqFk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC9gNE/btrR9jurAWx/0pKsZnQEHXAkkgRSOPRqFk/img.jpg&quot; data-alt=&quot;received data of &amp;quot;%%F5&amp;quot; and &amp;quot;%%F8connect&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC9gNE/btrR9jurAWx/0pKsZnQEHXAkkgRSOPRqFk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC9gNE%2FbtrR9jurAWx%2F0pKsZnQEHXAkkgRSOPRqFk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;847&quot; data-filename=&quot;basicMonitor1ADUCON.jpg&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;847&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;%%F5&quot; and &quot;%%F8connect&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHTTPADUCON.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SxlrH/btrSa6Vc2zR/v7TF0GXvb27vtw9EVKIpl1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SxlrH/btrSa6Vc2zR/v7TF0GXvb27vtw9EVKIpl1/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SxlrH/btrSa6Vc2zR/v7TF0GXvb27vtw9EVKIpl1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSxlrH%2FbtrSa6Vc2zR%2Fv7TF0GXvb27vtw9EVKIpl1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;97&quot; data-filename=&quot;responseHTTPADUCON.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP01&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting directly to the ESP01 and then connecting the access point&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Connect to ESP01 on the WiFi Setting of a mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectToESP01.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgttCf/btrR9NifBo7/fQpy97kxZp6tayj0ICg6q0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgttCf/btrR9NifBo7/fQpy97kxZp6tayj0ICg6q0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgttCf/btrR9NifBo7/fQpy97kxZp6tayj0ICg6q0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgttCf%2FbtrR9NifBo7%2FfQpy97kxZp6tayj0ICg6q0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;303&quot; data-filename=&quot;connectToESP01.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the Password for the ACCESS POINT of ESP01.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputPassword.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blnpaV/btrScaw4Ajv/kovWHpQK6HMNp4pOFcJk0k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blnpaV/btrScaw4Ajv/kovWHpQK6HMNp4pOFcJk0k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blnpaV/btrScaw4Ajv/kovWHpQK6HMNp4pOFcJk0k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblnpaV%2FbtrScaw4Ajv%2FkovWHpQK6HMNp4pOFcJk0k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;319&quot; data-filename=&quot;inputPassword.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Select &quot;Keep WiFi on&quot; if the message output below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4nCxJ/btrSgapwtfF/zQJpZ57HuV6icIzWhnkUr1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4nCxJ/btrSgapwtfF/zQJpZ57HuV6icIzWhnkUr1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4nCxJ/btrSgapwtfF/zQJpZ57HuV6icIzWhnkUr1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4nCxJ%2FbtrSgapwtfF%2FzQJpZ57HuV6icIzWhnkUr1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;288&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the address &quot;192.168.4.1&quot; on ADUCON app connected to ESP01.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputAddressADUCON2.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cciXhU/btrScbbHMO8/tDxGfPsAxgPE9KHsfQINxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cciXhU/btrScbbHMO8/tDxGfPsAxgPE9KHsfQINxk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cciXhU/btrScbbHMO8/tDxGfPsAxgPE9KHsfQINxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcciXhU%2FbtrScbbHMO8%2FtDxGfPsAxgPE9KHsfQINxk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;169&quot; data-filename=&quot;inputAddressADUCON2.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;169&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitor2ADUCON.jpg&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bow68D/btrSf2kN51R/zfRWPR3MGcC9IOG2Q8M7XK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bow68D/btrSf2kN51R/zfRWPR3MGcC9IOG2Q8M7XK/img.jpg&quot; data-alt=&quot;received data of &amp;quot;%%F5&amp;quot; and &amp;quot;%%F8connect&amp;quot;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bow68D/btrSf2kN51R/zfRWPR3MGcC9IOG2Q8M7XK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbow68D%2FbtrSf2kN51R%2FzfRWPR3MGcC9IOG2Q8M7XK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;912&quot; data-filename=&quot;basicMonitor2ADUCON.jpg&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;%%F5&quot; and &quot;%%F8connect&quot;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHTTPADUCON2.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D2PpT/btrSagYUcSN/kss11FkUQcWO5US2CzgofK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D2PpT/btrSagYUcSN/kss11FkUQcWO5US2CzgofK/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D2PpT/btrSagYUcSN/kss11FkUQcWO5US2CzgofK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD2PpT%2FbtrSagYUcSN%2Fkss11FkUQcWO5US2CzgofK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;97&quot; data-filename=&quot;responseHTTPADUCON2.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP01&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Code for remote control with WiFi of ADUCON applications&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In&amp;nbsp;order&amp;nbsp;to&amp;nbsp;control&amp;nbsp;Arduino&amp;nbsp;from&amp;nbsp;the&amp;nbsp;app,&amp;nbsp;there&amp;nbsp;are&amp;nbsp;basic&amp;nbsp;Arduino&amp;nbsp;codes&amp;nbsp;for&amp;nbsp;protocol-related&amp;nbsp;functions&amp;nbsp;that&amp;nbsp;allow&amp;nbsp;it&amp;nbsp;to&amp;nbsp;work&amp;nbsp;with&amp;nbsp;the&amp;nbsp;app.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Each&amp;nbsp;of&amp;nbsp;these&amp;nbsp;codes&amp;nbsp;has&amp;nbsp;its&amp;nbsp;own&amp;nbsp;functions&amp;nbsp;and&amp;nbsp;you&amp;nbsp;need&amp;nbsp;to&amp;nbsp;understand&amp;nbsp;what&amp;nbsp;these&amp;nbsp;functions&amp;nbsp;do.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- wifi_read() function&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Protocol header definition&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfOkL0/btrRvbwpo7D/0cKWvKZrU2Z8yXjBXrTnZ1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfOkL0/btrRvbwpo7D/0cKWvKZrU2Z8yXjBXrTnZ1/img.jpg&quot; data-alt=&quot;ADUCON app's protocol header settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfOkL0/btrRvbwpo7D/0cKWvKZrU2Z8yXjBXrTnZ1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfOkL0%2FbtrRvbwpo7D%2F0cKWvKZrU2Z8yXjBXrTnZ1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;ADUCON app&amp;amp;#39;s protocol header settings&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;266&quot; data-filename=&quot;protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADUCON app's protocol header settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Define the headers for Wifi in the Arduino sketch according to the protocol header settings in the ADUCON app.&lt;/p&gt;
&lt;pre id=&quot;code_1668667261725&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define pinHD F(&quot;%%F0&quot;)
#define pwmHD F(&quot;%%F3&quot;)
#define strHD F(&quot;%%F4&quot;)
#define footHD F(&quot;%%F1&quot;)
#define echoHD F(&quot;%%E1&quot;)
#define connectHD F(&quot;%%F8&quot;)
#define optionHD F(&quot;%%F9&quot;)
#define checkHD F(&quot;%%F5&quot;)
#define HDLen 4
#define addHD F(&quot;%%&quot;)
#define addHDLen 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Code to check the connection attempt of ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1668667261726&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool appConnection = false;

if (appConnection) { // If app connection is confirmed
  // Execute code after app connection is confirmed
} else { // Before app connection check
  if (income_wifi == checkHD) { // Check if the value is %%F5 and set the initial settings
    setFirstLogin(false); // Uncheck First Web Login (Do not use web login)
    detectLogout(false); // Uncheck Detect Logout (Do not use logout detection)
    showWebView(false); // Uncheck Web View (Do not display web view button)
    appConnection = true; http_response(); // Confirm the connection of ADUCOM
    if (connectionId != 48) { // Initialize ESP01 connection ID when connecting for the first time
      while (connectionId != 48) {
        connectionId--;
        String command = F(&quot;AT+CIPCLOSE=&quot;);
        command += String(connectionId-48);
        command += F(&quot;\r\n&quot;);
        esp01.print(command);
        delay(1);
      }
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iniSet.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvl37J/btrRtzx4U0P/V1l07aYdbd7smGGaIHHu91/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvl37J/btrRtzx4U0P/V1l07aYdbd7smGGaIHHu91/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvl37J/btrRtzx4U0P/V1l07aYdbd7smGGaIHHu91/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvl37J%2FbtrRtzx4U0P%2FV1l07aYdbd7smGGaIHHu91%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;84&quot; data-filename=&quot;iniSet.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Handling of values according to connection header &quot;connectHD(%%F8)&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + connect&lt;/span&gt;: Transmit the necessary app settings and current Arduino state values through the iniSet() and sendState() functions&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + disconnect&lt;/span&gt;: Disconnect and change value of appConnection to false&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;%%F8 + WiFi&lt;/span&gt;: change WiFi setting values&lt;/p&gt;
&lt;pre id=&quot;code_1668667261727&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (income_wifi == F(&quot;connect&quot;)) { iniSet(); sendState(); }
else if (income_wifi == F(&quot;disconnect&quot;)) appConnection = false;  
else if (income_wifi.startsWith(F(&quot;WiFi&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;));  }
else Serial.println(income_wifi);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Handling of values according to option header &quot;optionHD(%%F9)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1668667261727&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) { } // if it starts with &quot;RAD&quot;
  else if (temp.startsWith(F(&quot;CKB&quot;))) { } // if it starts with &quot;CKB&quot;
  else if (temp.startsWith(F(&quot;CHD&quot;))) { } // if it starts with &quot;CHD&quot;
  else if (temp.startsWith(F(&quot;LSD&quot;))) { } // if it starts with &quot;LSD&quot;
  else if (temp.startsWith(F(&quot;STR&quot;))) { } // if it starts with &quot;STR&quot;
  else { // if not
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;)); // set the time if the length of the value is less than 10
    else Serial.println(F(&quot;date/time&quot;)); // current date/time if larger
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Handling of values according to button header &quot;pinHD(%%F0)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1668667261728&quot; class=&quot;reasonml&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// income_wifi: Value + %%F1 (with protocol header %%F0 removed)
ed = income_wifi.lastIndexOf(footHD); // check the index number where footHD(%%F1) starts in the value
if (ed != -1) {                       // if the index number is found in the value
  temp = income_wifi.substring(0, ed);//Extract data up to index number
  uint8_t value = temp.toInt();       // convert to numeric value
  pin_control(value);                 // execute the code corresponding to the value
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Handling of values according to SeekBar(slide bar) header &quot;pwmHD(%%F3)&quot;&lt;/p&gt;
&lt;pre id=&quot;code_1668667261728&quot; class=&quot;reasonml&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// income_wifi: %%F3 + Count + %% + Slide Num + Value + %%F1
// Example of 3 values of COLOR PICKER: %%F31%%1255%%F1%%F31%%2133%%F1%%F31%%3123%%F1
ed = income_wifi.indexOf(addHD, HDLen); // Starting index of &quot;%%&quot; after HDLen 4(%%F3)
temp = income_wifi.substring(HDLen, ed); // Extract values from after HDLen 4(%%F3) to before &quot;%%&quot;
int count = temp.toInt(); // convert to numeric value
bool ok = true;
if (count == 0) pwmCount = 0; // If count is 0, reset counter for data verification
if (count &amp;lt; pwmCount) ok = false; // Verify if the data is continuous
else pwmCount = count;
if (ok) { // If data is continuous (unless data is missing due to Wi-Fi connection)
  uint8_t slide = 0; uint16_t value = 0;
  while(income_wifi.indexOf(footHD) != -1) { // Process 3 PWM values of COLOR PICKER
    ed = income_wifi.indexOf(addHD, HDLen)+addHDLen;
    income_wifi. remove(0, ed);
    temp = income_wifi.substring(0, 1);
    slide = temp. toInt();
    ed = income_wifi. indexOf(footHD);
    temp = income_wifi.substring(1, ed);
    value = temp. toInt();
    income_wifi.remove(0, ed+HDLen);
    pwm_control(slide, value);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Protocol function to send data from Arduino to app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Change the state of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558035&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinState(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Transmits an echo for the received value of the button.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558035&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPinEcho(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += echoHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Change the slide state of the app.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558035&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {                      
  Data += pwmHD;
  Data += slide;
  Data += pwm_val;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Transmits the echo for the received value of the PWM.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558035&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendPwmEcho(uint8_t slide, uint16_t pwm_val) {                          
  Data += pwmHD;
  Data += slide;
  Data += pwm_val;
  Data += echoHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A code example that reflects the status of the current button and PWM values of Arduino to the app when connected to the ADUCON app&lt;/p&gt;
&lt;pre id=&quot;code_1668667653297&quot; class=&quot;angelscript&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// SEND LOCAL STATE AT PRESENT TO APP
void sendState() { 
  sendPinState(10);
  sendPinState(21);
  sendPinState(30);
  sendPinState(41);
  sendPinState(50);
  sendPinState(61);
  sendPinState(71);
  sendPinState(80);
  sendPinState(91);
  sendPinState(101);
  sendPinState(110);
  sendPinState(121);
  sendPinState(130);
  sendPinState(141);
  sendPinState(150);
  sendPwmSlide(1, 110);
  sendPwmSlide(2, 120);
  sendPwmSlide(3, 210);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3dBgQ/btrRuwAPXsQ/XDOgm6CpjuRHwXYR0NNXj1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3dBgQ/btrRuwAPXsQ/XDOgm6CpjuRHwXYR0NNXj1/img.jpg&quot; data-alt=&quot;Screen reflecting initial state and labels when connecting Arduino&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3dBgQ/btrRuwAPXsQ/XDOgm6CpjuRHwXYR0NNXj1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3dBgQ%2FbtrRuwAPXsQ%2FXDOgm6CpjuRHwXYR0NNXj1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Screen reflecting initial state and labels when connecting Arduino&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;1059&quot; data-filename=&quot;iniState.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;1059&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Screen reflecting initial state and labels when connecting Arduino&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Send text.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558035&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendText(String text) {                               
  Data += strHD;
  Data += text;
  Data += footHD;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. If web login is implemented using the HTML code in Arduino sketch, set to move to the login page when connecting for the first time.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558036&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setFirstLogin(bool val){ 
  Data += connectHD;
  Data += F(&quot;FIR:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;webLogCheck.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;39&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oC8Um/btrRyBBVkOP/pCttQ7OvJIk5X6leLb8xm1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oC8Um/btrRyBBVkOP/pCttQ7OvJIk5X6leLb8xm1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oC8Um/btrRyBBVkOP/pCttQ7OvJIk5X6leLb8xm1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoC8Um%2FbtrRyBBVkOP%2FpCttQ7OvJIk5X6leLb8xm1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;30&quot; data-filename=&quot;webLogCheck.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;39&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. If the control authority is released by a new web login, the Logout status is output as a message.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In case of connecting to the ACCESS POINT (ex. 192.168.4.1) - Administrator&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When connecting via web login from the internal network through a router - General user&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;General user can be disengaged (pushed) by Administrator or another General user.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558036&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void detectLogout(bool val){ 
  Data += connectHD;
  Data += F(&quot;DET:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Set to send the date/time of the Android system When connecting, or request the transmission of the date/time if necessary.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558036&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void requstDateTime(){ 
  Data += connectHD;
  Data += F(&quot;RDT:&quot;); 
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Use when you want to acquire control authority by using the ACCESS POINT password of the module in the internal network connection through the router. (without using HTML web login)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It can be changed to any name through definition of the passName and passNameLen for processing the password in the sketch and the app send datas starting with passName as password value. This is to enhance security.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558036&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define passName F(&quot;PAS:&quot;)
#define passNameLen 4

void requestPass(bool val){ 
  Data += connectHD;
  Data += val;
  Data += passName;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9uViS/btrRtUhJHtu/gDyc10Ibwky6KxCSko1FLk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9uViS/btrRtUhJHtu/gDyc10Ibwky6KxCSko1FLk/img.jpg&quot; data-alt=&quot;Password dialog&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9uViS/btrRtUhJHtu/gDyc10Ibwky6KxCSko1FLk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9uViS%2FbtrRtUhJHtu%2FgDyc10Ibwky6KxCSko1FLk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Password dialog&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Password dialog&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. If control authority is given through password confirmation, a cookie value is created and transmitted so that control authority for the data transmitted thereafter can be confirmed.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558036&quot; class=&quot;pgsql&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#define cooLength 5
String cooValue = &quot;u7Dv0&quot;;

String makeCooValue() {
  cooValue = &quot;&quot;;
  uint8_t temp = 0;
  for (int i = 0; i &amp;lt; cooLength; i++) {
    temp = random(39, 123); //random(39, 123); // 39 ~ 122 pick
    if (temp == 47 || temp == 59 || temp == 60 || temp == 62 || temp == 92 || temp == 94 || temp == 96) temp = 79;
    cooValue += char(temp);
  }
  Serial.print(&quot;coo: &quot;); Serial.println(cooValue);
  return cooValue;
}

void responsePass(bool val){ 
  Data += connectHD;
  Data += F(&quot;RES:&quot;);
  if (val) Data += makeCooValue(); 
  else Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dklhlh/btrRysYhwAE/wkQBKkZk7UK5lbz3OkZkW1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dklhlh/btrRysYhwAE/wkQBKkZk7UK5lbz3OkZkW1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dklhlh/btrRysYhwAE/wkQBKkZk7UK5lbz3OkZkW1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdklhlh%2FbtrRysYhwAE%2FwkQBKkZk7UK5lbz3OkZkW1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;72&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctoUFZ/btrRtIolisv/3gM88psSMWYfvpB4kDml4k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctoUFZ/btrRtIolisv/3gM88psSMWYfvpB4kDml4k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctoUFZ/btrRtIolisv/3gM88psSMWYfvpB4kDml4k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctoUFZ%2FbtrRtIolisv%2F3gM88psSMWYfvpB4kDml4k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11. Sends information about the current Wi-Fi connection so that the user can view and edit information in the app about the Wi-Fi connection.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558037&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendWifiInfo(){ 
  Data += connectHD;
  Data += F(&quot;INF:&quot;);
  Data += ssidAP;
  Data += ',';
  Data += passAP;
  Data += ',';
  Data += ap;
  Data += ',';
  Data += wifiRouter;
  Data += ',';
  Data += ssid;
  Data += ',';
  Data += pass;
  Data += ',';
  Data += ip;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12. Outputs the message in the form of a pop-up.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558037&quot; class=&quot;armasm&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendMessage(String str){ 
  Data += connectHD;
  Data += F(&quot;MES:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bS3s8W/btrRuVUNssx/5J1hmjYQpG13bHwDfafX4K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bS3s8W/btrRuVUNssx/5J1hmjYQpG13bHwDfafX4K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bS3s8W/btrRuVUNssx/5J1hmjYQpG13bHwDfafX4K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbS3s8W%2FbtrRuVUNssx%2F5J1hmjYQpG13bHwDfafX4K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13. Disable the feature, which is default setting, of automatically resend the value When a button or SeekBar (slide bar) is changed in the app and then if a response failure error occurs.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;It is used when the Arduino intentionally does not respond due to the delay that occurs when sending data using the AT command to the ESP01.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558037&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void responseFailResend(bool val) {
  Data += connectHD;
  Data += F(&quot;RFR:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. Instruct the app to click the Disconnect Button.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558037&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void sendDisconnect(){ 
  Data += connectHD;
  Data += F(&quot;DIS&quot;);
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxBEbn/btrRzZBupCd/elipKG3tv7LWDFv7Vichh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxBEbn/btrRzZBupCd/elipKG3tv7LWDFv7Vichh0/img.png&quot; data-alt=&quot;Disconnect Button for WiFi&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxBEbn/btrRzZBupCd/elipKG3tv7LWDFv7Vichh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxBEbn%2FbtrRzZBupCd%2FelipKG3tv7LWDFv7Vichh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;연결 해제 버튼&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;83&quot; data-filename=&quot;edited_disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;107&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disconnect Button for WiFi&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. Set the function to continuously transmit the changed value of the SeekBar (slide bar) according to the specified interval.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;true: Active Slide Mode&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false: Passive Slide Mode&lt;/span&gt; (transmits only values when the slide bar is touched up)&lt;/p&gt;
&lt;pre id=&quot;code_1668667558038&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setActiveSlide(bool val){ 
  Data += optionHD;
  Data += F(&quot;ACT:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tJQCU/btrRzk7bLMy/cnKreTp5bjDjU62bMlVYt1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tJQCU/btrRzk7bLMy/cnKreTp5bjDjU62bMlVYt1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tJQCU/btrRzk7bLMy/cnKreTp5bjDjU62bMlVYt1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtJQCU%2FbtrRzk7bLMy%2FcnKreTp5bjDjU62bMlVYt1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;30&quot; data-filename=&quot;activeSlide.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;16. Set transmission interval of ACTIVE SLIDE MODE. (Unit:&amp;nbsp;Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1668667558038&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setSlideInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;SLI:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;17. Activate a timer that sends checkHD(%%F5) at regular time intervals.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Regardless of the app, it is used to reflect independently changed values in the Arduino to the app.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558038&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequest(bool val){ 
  Data += optionHD;
  Data += F(&quot;REQ:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_read.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BLmhW/btrRyA2SPjG/jI9blsZn7P6lY0LJkKFlf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BLmhW/btrRyA2SPjG/jI9blsZn7P6lY0LJkKFlf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BLmhW/btrRyA2SPjG/jI9blsZn7P6lY0LJkKFlf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBLmhW%2FbtrRyA2SPjG%2FjI9blsZn7P6lY0LJkKFlf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;86&quot; data-filename=&quot;edited_read.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;18. Set the operation interval of the timer sending checkHD(%%F5). (Unit: Millisecond)&lt;/p&gt;
&lt;pre id=&quot;code_1668667558038&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setRequestInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;INT:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;19. Set the operation function when clicking the label displaying the current connection status.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MFsoQ/btrRuWsGixH/ZpOkdXcshusqr19TRT1QyK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MFsoQ/btrRuWsGixH/ZpOkdXcshusqr19TRT1QyK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MFsoQ/btrRuWsGixH/ZpOkdXcshusqr19TRT1QyK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMFsoQ%2FbtrRuWsGixH%2FZpOkdXcshusqr19TRT1QyK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;34&quot; data-filename=&quot;connectionDP.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: No function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Show only connection information when it clicked.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Show connection information and password when it clicked so that the connection and password can be set.&lt;/p&gt;
&lt;pre id=&quot;code_1668667558038&quot; class=&quot;fortran&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 0: not use, 1: show only name, 2: show name &amp;amp; pass // defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  Data += optionHD;
  Data += F(&quot;SLM:&quot;);
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boRGJZ/btrRv9k00Fh/o6yaGNy1vYSnrkMGIEJx9k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boRGJZ/btrRv9k00Fh/o6yaGNy1vYSnrkMGIEJx9k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boRGJZ/btrRv9k00Fh/o6yaGNy1vYSnrkMGIEJx9k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboRGJZ%2FbtrRv9k00Fh%2Fo6yaGNy1vYSnrkMGIEJx9k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;561&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;20. Display the button to go to the webview page where you can see the HTML Page coded in Arduino.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;webViewicon.jpg&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NV54V/btrRvI8LcDR/u3xlke7hn1bZnfjYQzzZNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NV54V/btrRvI8LcDR/u3xlke7hn1bZnfjYQzzZNk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NV54V/btrRvI8LcDR/u3xlke7hn1bZnfjYQzzZNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNV54V%2FbtrRvI8LcDR%2Fu3xlke7hn1bZnfjYQzzZNk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;74&quot; data-filename=&quot;webViewicon.jpg&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558039&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void showWebView(bool val){ 
  Data += optionHD;
  Data += F(&quot;SWV:&quot;); 
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;21. Display additional push buttons in the main menu area. (it is possible to control only at Arduino)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cppuTt/btrRyzCZeb3/3ih4to3FZyi2PMGGjfDcuk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cppuTt/btrRyzCZeb3/3ih4to3FZyi2PMGGjfDcuk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cppuTt/btrRyzCZeb3/3ih4to3FZyi2PMGGjfDcuk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcppuTt%2FbtrRyzCZeb3%2F3ih4to3FZyi2PMGGjfDcuk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;74&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558039&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void showDialogMenu(bool val){ 
  Data += optionHD;
  Data += F(&quot;SDM:&quot;); 
  Data += val;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;22. Change the main screen to Color Picker / Pwm Nob screen from Arduino. (generally set in the options of the app)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uMqPZ/btrRvI12XUi/DvWTzMxz8lOdqq2cgiFxU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uMqPZ/btrRvI12XUi/DvWTzMxz8lOdqq2cgiFxU1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uMqPZ/btrRvI12XUi/DvWTzMxz8lOdqq2cgiFxU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuMqPZ%2FbtrRvI12XUi%2FDvWTzMxz8lOdqq2cgiFxU1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;71&quot; data-filename=&quot;setColorPickerNob.jpg&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;uint8_t: list below&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: Display buttons and SeekBar (slide bar) on the main screen&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Display Color_Picker on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Display Color_Picker and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3: Display PWM Nob on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4: Display PWM Nob and Group 2 on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;String&lt;/span&gt;: name of the group&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;bool&lt;/span&gt;: Sets whether to display the SeekBar (slide bar) when the main screen buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* true&lt;/span&gt;: SeekBar (slide bar) is also displayed when button is displayed or Pwm Nob is displayed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;* false&lt;/span&gt;: SeekBar (slide bar) is not displayed when button is displayed and SeekBar (slide bar) is displayed only when Pwm Nob is displayed&lt;/p&gt;
&lt;pre id=&quot;code_1668667558039&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPMain) { 
  Data += optionHD;
  Data += F(&quot;CNB:&quot;);
  Data += String(val); Data += ','; 
  Data += group1; Data += ','; 
  Data += group2; Data += ','; 
  Data += pwmDPMain;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;23. Set the main screen display of the app.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set to 0 or 1 in order depending on whether buttons 1 to 15, SeekBar (slide bar) 1 to 6, text input, and floating buttons are displayed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0: hidden 1: visible&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7i9t0/btrRupu8xGF/CZoK8QRpUXP2g5XVXStCck/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7i9t0/btrRupu8xGF/CZoK8QRpUXP2g5XVXStCck/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7i9t0/btrRupu8xGF/CZoK8QRpUXP2g5XVXStCck/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7i9t0%2FbtrRupu8xGF%2FCZoK8QRpUXP2g5XVXStCck%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;395&quot; data-filename=&quot;setDisplay.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558039&quot; class=&quot;armasm&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;///////////////////////// SET MAIN DISPLAY 0:hide 1:display
//F(&quot;111111111111111&quot;  // button 1 ~ 15
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ 
  Data += optionHD;
  Data += F(&quot;SDP:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;24. Set labels for buttons and SeekBar.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Label buttons 1 to 15 and SeekBar (slide bar) 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uxmEU/btrRw87dpob/HccFIXG4Jrg0NADQ9T37AK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uxmEU/btrRw87dpob/HccFIXG4Jrg0NADQ9T37AK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uxmEU/btrRw87dpob/HccFIXG4Jrg0NADQ9T37AK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuxmEU%2FbtrRw87dpob%2FHccFIXG4Jrg0NADQ9T37AK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;368&quot; data-filename=&quot;setButtonLabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558040&quot; class=&quot;armasm&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;) // slider 1 ~ 6
void setButtonLabel(String str){ 
  Data += optionHD;
  Data += F(&quot;ABL:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;25. Set the button's toggle/push properties.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set the button properties to 0 or 1 in order of buttons 1 to 15.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;0: Push&lt;/span&gt;&amp;nbsp;1: Toggle&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lkSqw/btrRupIIDTA/OMNnjVL8lASVoP4kBl4mS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lkSqw/btrRupIIDTA/OMNnjVL8lASVoP4kBl4mS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lkSqw/btrRupIIDTA/OMNnjVL8lASVoP4kBl4mS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlkSqw%2FbtrRupIIDTA%2FOMNnjVL8lASVoP4kBl4mS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;438&quot; data-filename=&quot;buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558040&quot; class=&quot;armasm&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;BTG:&quot;);
  Data += str;  
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;26. Set the maximum/minimum values of the SeekBar (slide bar).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SeekBar (slide bar) Specifies the maximum/minimum values from 1 to 6 in order using ',' as a separator.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UieXj/btrRyBAMOjj/rgQUaHESTFMMzFUYAlBkqK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UieXj/btrRyBAMOjj/rgQUaHESTFMMzFUYAlBkqK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UieXj/btrRyBAMOjj/rgQUaHESTFMMzFUYAlBkqK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUieXj%2FbtrRyBAMOjj%2FrgQUaHESTFMMzFUYAlBkqK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;320&quot; data-filename=&quot;seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558040&quot; class=&quot;armasm&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  Data += optionHD;
  Data += F(&quot;MNM:&quot;);
  Data += str;
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;27. Set the title of the Arduino sketch.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIPw7k/btrRyAbXecx/8mh6o4W1mzn5sZk8WKun2k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIPw7k/btrRyAbXecx/8mh6o4W1mzn5sZk8WKun2k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIPw7k/btrRyAbXecx/8mh6o4W1mzn5sZk8WKun2k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIPw7k%2FbtrRyAbXecx%2F8mh6o4W1mzn5sZk8WKun2k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;27&quot; data-filename=&quot;setTitle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//title: Test Mode
//text: Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;
void setAppTitleMessage(String title, String text){
  Data += optionHD;
  Data += F(&quot;ATM:&quot;); 
  Data += title; Data += ','; 
  Data += text; 
  Data += '\n';
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmajnG/btrRyAwe3iw/I84nXhgNHy8coKE5xjK2I0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmajnG/btrRyAwe3iw/I84nXhgNHy8coKE5xjK2I0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmajnG/btrRyAwe3iw/I84nXhgNHy8coKE5xjK2I0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmajnG%2FbtrRyAwe3iw%2FI84nXhgNHy8coKE5xjK2I0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;489&quot; data-filename=&quot;setTitle1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;28. Dialog Message&lt;/span&gt;: radio button&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot; -&amp;gt; selection index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  Data += optionHD;
  Data += F(&quot;RAD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; Data += ':';
  Data += String(selection);
  Data += '\n';
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nAjNC/btrRwXkphQ1/Dia2yeiu7ZEG4LT9ow8kl1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nAjNC/btrRwXkphQ1/Dia2yeiu7ZEG4LT9ow8kl1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nAjNC/btrRwXkphQ1/Dia2yeiu7ZEG4LT9ow8kl1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnAjNC%2FbtrRwXkphQ1%2FDia2yeiu7ZEG4LT9ow8kl1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;426&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;29. Dialog Message: Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;CKB:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8Hdjs/btrRzF4nC5M/CRTFnwlkV9pm26KKcLSkU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8Hdjs/btrRzF4nC5M/CRTFnwlkV9pm26KKcLSkU0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8Hdjs/btrRzF4nC5M/CRTFnwlkV9pm26KKcLSkU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8Hdjs%2FbtrRzF4nC5M%2FCRTFnwlkV9pm26KKcLSkU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;30. Dialog Message&lt;/span&gt;: Select button&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  Data += optionHD;
  Data += F(&quot;CHD:&quot;); 
  Data += String(id); Data += ':'; 
  Data += message; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CHD:0:B , CHD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YRGKM/btrRx5WLqrZ/9nPkGVAqw0n7EG7QKo1q90/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YRGKM/btrRx5WLqrZ/9nPkGVAqw0n7EG7QKo1q90/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YRGKM/btrRx5WLqrZ/9nPkGVAqw0n7EG7QKo1q90/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYRGKM%2FbtrRx5WLqrZ%2F9nPkGVAqw0n7EG7QKo1q90%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;31. Dialog Message&lt;/span&gt;: List Window&lt;/p&gt;
&lt;pre id=&quot;code_1668667558041&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;LSD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; LSD:0:F , LSD:id:option str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nacR3/btrRuwOx9cx/S4eiYne1Zy3soYndjZ7q0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nacR3/btrRuwOx9cx/S4eiYne1Zy3soYndjZ7q0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nacR3/btrRuwOx9cx/S4eiYne1Zy3soYndjZ7q0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnacR3%2FbtrRuwOx9cx%2FS4eiYne1Zy3soYndjZ7q0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;429&quot; data-filename=&quot;edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;32. Dialog Message&lt;/span&gt;: Input text&lt;/p&gt;
&lt;pre id=&quot;code_1668667558042&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void dialogInput(uint8_t id, String title){ 
  Data += optionHD;
  Data += F(&quot;STR:&quot;); 
  Data += String(id); Data += ':'; 
  Data += title; 
  Data += '\n';
} // Return -&amp;gt; STR:0:str , STR:id:str&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cM0ufS/btrRzksCWOQ/CwuMx8bLOjxshAw0L8FCU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cM0ufS/btrRzksCWOQ/CwuMx8bLOjxshAw0L8FCU1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cM0ufS/btrRzksCWOQ/CwuMx8bLOjxshAw0L8FCU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcM0ufS%2FbtrRzksCWOQ%2FCwuMx8bLOjxshAw0L8FCU1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.ARDUINO_ESP01_HMI_CONTROL.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/36ZNj/btrRtUhVNS7/zwfxU0T8uXUYWKfaAESWhk/1.ARDUINO_ESP01_HMI_CONTROL.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1.ARDUINO_ESP01_HMI_CONTROL.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/Sn46at1o7_U&quot;&gt;https://youtu.be/Sn46at1o7_U&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Sn46at1o7_U&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1668668081972&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(RX, TX);

const char ssidAP[] = &quot;ESP01&quot;;    // your network SSID (name)
const char passAP[] = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password

bool wifiRouter = true;          // Whether or not there is a router connection
const char ssid[] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
const char pass[] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

String ap = &quot;&quot;;
String ip = &quot;&quot;;

String Data = &quot;&quot;;
#include &quot;protocol.h&quot;

#define ledPin 13

void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);
  esp01.begin(9600); // your esp's baud rate might be different
  sendData(F(&quot;RST&quot;)); 
  unsigned long int time = millis();
  String temp = &quot;&quot;;
  while (time+20000 &amp;gt; millis()) {
    temp = esp01.readStringUntil('\n');
    if (temp.indexOf(F(&quot;ready&quot;)) != -1) { Serial.println(F(&quot;Set&quot;)); break; }
  }
  if (wifiRouter) sendData(F(&quot;CWMODE=3&quot;)); // configure as access point (working mode: AP+STA)
  else sendData(F(&quot;CWMODE=2&quot;));
  if (wifiRouter) sendData(F(&quot;CWDHCP=1,1&quot;));
  sendData(addID(F(&quot;CWSAP=&quot;),ssidAP,passAP)+','+String(10)+','+String(3)); 
  sendData(F(&quot;CIPMUX=1&quot;)); // configure for multiple connections
  sendData(F(&quot;CIPSERVER=1,80&quot;)); // turn on server on port 80
  if (wifiRouter) {
    retry = 1;
    while(retry) { 
      sendData(addID(F(&quot;CWJAP=&quot;),ssid,pass)); 
      if (retry &amp;gt; 1) { Serial.print(F(&quot;Retrying to connect: &quot;)); Serial.println(retry-1); }
      if (retry &amp;gt; 4) { Serial.println(F(&quot;connection failed&quot;)); retry = 0; }
    }
  }
  ipCheck(sendData(F(&quot;CIFSR&quot;))); // get ip address
}

void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: Serial.println(F(&quot;button 1 : on&quot;));
               digitalWrite(ledPin, HIGH); 
               sendPinEcho(value);
               sendText(F(&quot;1: ON&quot;));  
                  break;
      case 10: Serial.println(F(&quot;button 1 : off&quot;));
               digitalWrite(ledPin, LOW); 
               sendText(F(&quot;1: OFF&quot;)); 
               sendPinEcho(value);
                  break;
      case 21: Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 41: Serial.println(F(&quot;button 4 : on&quot;));
                  break;
      case 40: Serial.println(F(&quot;button 4 : off&quot;));
                  break;
      case 51: Serial.println(F(&quot;button 5 : on&quot;));
                  break;
      case 50: Serial.println(F(&quot;button 5 : off&quot;));
                  break;
      case 61: Serial.println(F(&quot;button 6 : on&quot;));
                  break;
      case 60: Serial.println(F(&quot;button 6 : off&quot;));
                  break;
      case 71: Serial.println(F(&quot;button 7 : on&quot;));
                  break;
      case 70: Serial.println(F(&quot;button 7 : off&quot;));
                  break;
      case 81: Serial.println(F(&quot;button 8 : on&quot;));
                  break;
      case 80: Serial.println(F(&quot;button 8 : off&quot;));
                  break;
      case 91: Serial.println(F(&quot;button 9 : on&quot;));
                  break;
      case 90: Serial.println(F(&quot;button 9 : off&quot;));
                  break;  
      case 101: Serial.println(F(&quot;button 10 : on&quot;));
                  break;
      case 100: Serial.println(F(&quot;button 10 : off&quot;));
                  break;  
      case 111: Serial.println(F(&quot;button 11 : on&quot;));
                  break;
      case 110: Serial.println(F(&quot;button 11 : off&quot;));
                  break;  
      case 121: Serial.println(F(&quot;button 12 : on&quot;));
                  break;
      case 120: Serial.println(F(&quot;button 12 : off&quot;));
                  break;                  
      case 131: Serial.println(F(&quot;button 13 : on&quot;));
                  break;  
      case 130: Serial.println(F(&quot;button 13 : off&quot;));
                  break;  
      case 141: Serial.println(F(&quot;button 14 : on&quot;));
                  break;  
      case 140: Serial.println(F(&quot;button 14 : off&quot;));
                  break;  
      case 151: Serial.println(F(&quot;button 15 : on&quot;));
                  break;  
      case 150: Serial.println(F(&quot;button 15 : off&quot;));
                  break;         
      case 161: Serial.println(F(&quot;button 16 : click&quot;));
                  break; 
      case 171: Serial.println(F(&quot;button 17 : click&quot;));
                  break;
      case 181: Serial.println(F(&quot;button 18 : click&quot;));
                  break;  
      case 191: Serial.println(F(&quot;button 19 : click&quot;));
                  break;  
      case 201: Serial.println(F(&quot;button 20 : click&quot;));
                  break;         
    }
  }
}

void pwm_control(uint8_t num, uint16_t value) {
  if (num == 1) {  // SeekBar (slide bar) 1
    sendText(String(value));  
    sendPwmEcho(num, value); // ESP01: recommend at passive slide mode
    Serial.print(F(&quot;pwm1: &quot;)); Serial.println(value);
  } else if (num == 2) {  // SeekBar (slide bar) 2
    sendPwmEcho(num, value); // ESP01: recommend at passive slide mode
    Serial.print(F(&quot;pwm2: &quot;)); Serial.println(value);
  } else if (num == 3) {  // SeekBar (slide bar) 3
    sendPwmEcho(num, value); // ESP01: recommend at passive slide mode
    Serial.print(F(&quot;pwm3: &quot;)); Serial.println(value);
  } else if (num == 4) {  // SeekBar (slide bar) 4
    Serial.print(F(&quot;pwm4: &quot;)); Serial.println(value);
  } else if (num == 5) {  // SeekBar (slide bar) 5
    Serial.print(F(&quot;pwm5: &quot;)); Serial.println(value);
  } else if (num == 6) {  // SeekBar (slide bar) 6
    Serial.print(F(&quot;pwm6: &quot;)); Serial.println(value);
  }
}

bool appConnection = false;
String income_wifi = &quot;&quot;; // storage variable for received string with WiFi
uint16_t pwmCount = 2;

void wifi_read() {
  while (esp01.available()) { 
    income_wifi = esp01.readStringUntil('\n');
    if (income_wifi.startsWith(F(&quot;+IPD&quot;))) {
      income_wifi.remove(0,5);
      connectionId = income_wifi.charAt(0);
      int st = income_wifi.indexOf(F(&quot;GET /&quot;))+5;
      income_wifi.remove(0,st);
      if (!income_wifi.startsWith(F(&quot;fav&quot;))) { // it pass favicon.ico
        int ed = income_wifi.lastIndexOf(F(&quot;HTTP/1.1&quot;));
        income_wifi.remove(ed-1);
        if (appConnection) { 
          String temp = income_wifi.substring(0, HDLen);
          uint8_t order = 0;
          if (temp == checkHD) order = 1;
          else if (temp == pwmHD) order = 2;
          else if (temp == pinHD) order = 3;
          else if (temp == connectHD) order = 4;
          else if (temp == optionHD) order = 5; 
          if (order &amp;gt; 2) income_wifi.remove(0, HDLen); // Remove protocol header
          if (order == 1) { // %%F5
            
          } else if (order == 2) { // %%F3
            ed = income_wifi.indexOf(addHD, HDLen);
            temp = income_wifi.substring(HDLen, ed);
            int count = temp.toInt();
            bool ok = true;
            if (count == 0) pwmCount = 0;
            if (count &amp;lt; pwmCount) ok = false;
            else pwmCount = count;
            if (ok) {
              uint8_t slide = 0; uint16_t value = 0;
              while(income_wifi.indexOf(footHD) != -1) {
                ed = income_wifi.indexOf(addHD, HDLen)+addHDLen;
                income_wifi.remove(0, ed);
                temp = income_wifi.substring(0, 1);
                slide = temp.toInt();
                ed = income_wifi.indexOf(footHD);
                temp = income_wifi.substring(1, ed);
                value = temp.toInt();
                income_wifi.remove(0, ed+HDLen);
                pwm_control(slide, value);
              }
            } 
          } else if (order == 3) { // %%F0
            ed = income_wifi.lastIndexOf(footHD);
            if (ed != -1) {
              temp = income_wifi.substring(0, ed);
              uint8_t value = temp.toInt();
              pin_control(value);
            }
          } else if (order == 4) { // %%F8
            if (income_wifi == F(&quot;connect&quot;)) { iniSet(); sendState(); }
            else if (income_wifi == F(&quot;disconnect&quot;)) appConnection = false;  
            else if (income_wifi.startsWith(F(&quot;WiFi&quot;))) { sendMessage(F(&quot;This funtion is not available.&quot;));  }
            else Serial.println(income_wifi);
          } else if (order == 5) { // %%F9
            income_wifi.replace(F(&quot;%20&quot;), F(&quot; &quot;)); // URL Encoding space character change
            CheckF9(income_wifi);
          } else { // order == 0
            income_wifi.replace(F(&quot;%20&quot;), F(&quot; &quot;)); // URL Encoding space character change
            Serial.println(income_wifi);
          }
          http_response();
        } else {
          if (income_wifi == checkHD) { 
            setFirstLogin(false); detectLogout(false); showWebView(false); 
            appConnection = true; http_response(); 
            if (connectionId != 48) {
              while (connectionId != 48) { 
                connectionId--;
                String command = F(&quot;AT+CIPCLOSE=&quot;);
                command += String(connectionId-48);
                command += F(&quot;\r\n&quot;);
                esp01.print(command);
                delay(1);
              } 
            }
          }
        }
      }
      income_wifi = &quot;&quot;;
    }
  }      
}     
 
void loop() {
  wifi_read();
  if(Serial.available() &amp;gt; 0){ // if there is data in the serial buffer
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if (temp.startsWith(F(&quot;AT&quot;))) {
      temp.remove(0,3);
      Serial.println(temp);
      sendData(temp);
    } else if (temp == F(&quot;1&quot;)) {
      
    } else if (temp == F(&quot;2&quot;)) {
      
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol sketch&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;UNFOLD&quot; data-text-less=&quot;CLOSE&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;pre id=&quot;code_1668668081979&quot; class=&quot;lasso&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//////////////////////////////////////////////////////////// COMMON
///////////////////////////////////////// ESSENTIAL 
#define pinHD F(&quot;%%F0&quot;)
#define pwmHD F(&quot;%%F3&quot;)
#define strHD F(&quot;%%F4&quot;)
#define footHD F(&quot;%%F1&quot;)
#define echoHD F(&quot;%%E1&quot;)
#define connectHD F(&quot;%%F8&quot;)
#define optionHD F(&quot;%%F9&quot;)
#define checkHD F(&quot;%%F5&quot;)
#define HDLen 4
#define addHD F(&quot;%%&quot;)
#define addHDLen 2

// SEND PIN VALUE
void sendPinState(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += footHD;
  Data += '\n';
}

// SEND PIN ECHO
void sendPinEcho(uint8_t pin_val){  
  Data += pinHD;
  Data += pin_val;
  Data += echoHD;
  Data += '\n';
}

// SEND SLIDE VALUE - USE AT PASSIVE SLIDE MODE
void sendPwmSlide(uint8_t slide, uint16_t pwm_val) {                      
  Data += pwmHD;
  Data += slide;
  Data += pwm_val;
  Data += footHD;
  Data += '\n';
}

// SEND SLIDE ECHO - ESP01: USE AT PASSIVE SLIDE MODE
void sendPwmEcho(uint8_t slide, uint16_t pwm_val) {                          
  Data += pwmHD;
  Data += slide;
  Data += pwm_val;
  Data += echoHD;
  Data += '\n';
}

// SEND TEXT
void sendText(String text) {                               
  Data += strHD;
  Data += text;
  Data += footHD;
  Data += '\n';
}

///////////////////////////////////////// CONNECTION 
void setFirstLogin(bool val){ 
  Data += connectHD;
  Data += F(&quot;FIR:&quot;);
  Data += val;
  Data += '\n';
}

void detectLogout(bool val){ 
  Data += connectHD;
  Data += F(&quot;DET:&quot;);
  Data += val;
  Data += '\n';
}

void requstDateTime(){ 
  Data += connectHD;
  Data += F(&quot;RDT:&quot;); 
  Data += '\n';
}

//#define passName F(&quot;PAS:&quot;)
//#define passNameLen 4
//
//void requestPass(bool val){ 
//  Data += connectHD;
//  Data += val;
//  Data += passName;
//  Data += '\n';
//}
//
//#define cooLength 5
//String cooValue = &quot;u7Dv0&quot;;
//
//String makeCooValue() {
//  cooValue = &quot;&quot;;
//  uint8_t temp = 0;
//  for (int i = 0; i &amp;lt; cooLength; i++) {
//    temp = random(39, 123); //random(39, 123); // 39 ~ 122 pick
//    if (temp == 47 || temp == 59 || temp == 60 || temp == 62 || temp == 92 || temp == 94 || temp == 96) temp = 79;
//    cooValue += char(temp);
//  }
//  Serial.print(&quot;coo: &quot;); Serial.println(cooValue);
//  return cooValue;
//}
//
//void responsePass(bool val){ 
//  Data += connectHD;
//  Data += F(&quot;RES:&quot;);
//  if (val) Data += makeCooValue(); 
//  else Data += val;
//  Data += '\n';
//}

void sendWifiInfo(){ 
  Data += connectHD;
  Data += F(&quot;INF:&quot;);
  Data += ssidAP;
  Data += ',';
  Data += passAP;
  Data += ',';
  Data += ap;
  Data += ',';
  Data += wifiRouter;
  Data += ',';
  Data += ssid;
  Data += ',';
  Data += pass;
  Data += ',';
  Data += ip;
  Data += '\n';
}

void sendMessage(String str){ 
  Data += connectHD;
  Data += F(&quot;MES:&quot;);
  Data += str;
  Data += '\n';
}

// defalt: true
void responseFailResend(bool val) {
  Data += connectHD;
  Data += F(&quot;RFR:&quot;);
  Data += val;
  Data += '\n';
}

void sendDisconnect(){ 
  Data += connectHD;
  Data += F(&quot;DIS&quot;);
  Data += '\n';
}

///////////////////////////////////////// OPTION
///////////////////////// SET FUNCION
void setActiveSlide(bool val){ 
  Data += optionHD;
  Data += F(&quot;ACT:&quot;);
  Data += val;
  Data += '\n';
}

void setSlideInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;SLI:&quot;);
  Data += val;
  Data += '\n';
}

void setRequest(bool val){ 
  Data += optionHD;
  Data += F(&quot;REQ:&quot;);
  Data += val;
  Data += '\n';
}

void setRequestInterval(uint16_t val){ 
  Data += optionHD;
  Data += F(&quot;INT:&quot;);
  Data += val;
  Data += '\n';
}

// 0: not use, 1: show only name, 2: show name &amp;amp; pass // defalult: 2
void setSSIDLabelMode(uint8_t val) { 
  Data += optionHD;
  Data += F(&quot;SLM:&quot;);
  Data += val;
  Data += '\n';
}

void showWebView(bool val){ 
  Data += optionHD;
  Data += F(&quot;SWV:&quot;); 
  Data += val;
  Data += '\n';
}

void showDialogMenu(bool val){ 
  Data += optionHD;
  Data += F(&quot;SDM:&quot;); 
  Data += val;
  Data += '\n';
}

//0: not use 1:color picke 2:color picker+add group 3: pwm nob 4: pwm nob+add group, group1 &amp;amp; group2 Label
void setColorNob(uint8_t val, String group1, String group2, bool pwmDPMain) { 
  Data += optionHD;
  Data += F(&quot;CNB:&quot;);
  Data += String(val); Data += ','; 
  Data += group1; Data += ','; 
  Data += group2; Data += ','; 
  Data += pwmDPMain;
  Data += '\n';
}

///////////////////////// SET MAIN DISPLAY
//F(&quot;111111111111111&quot;  // button 1 ~ 15, 0:hide 1:display
//  &quot;111111&quot;           // slider 1 ~ 6
//  &quot;11&quot;)              // Text Input/Floating Button
void setDisplay(String str){ // must after setLeftPadMode(uint8_t val)
  Data += optionHD;
  Data += F(&quot;SDP:&quot;);
  Data += str;
  Data += '\n';
}

//F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15,&quot; // button 1 ~ 15
//  &quot;PW1,PW2,PW3,PW4,PW5,PW6&quot;) // slider 1 ~ 6
void setButtonLabel(String str){ 
  Data += optionHD;
  Data += F(&quot;ABL:&quot;);
  Data += str;
  Data += '\n';
}

//F(&quot;111111111111111&quot;) // button 1 ~ 15, 0:push 1:toggle 
void setButtonToggle(String str){ 
  Data += optionHD;
  Data += F(&quot;BTG:&quot;);
  Data += str;  
  Data += '\n';
}

//F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)
void setMinMax(String str){ 
  Data += optionHD;
  Data += F(&quot;MNM:&quot;);
  Data += str;
  Data += '\n';
}

void setAppTitleMessage(String title, String text){
  Data += optionHD;
  Data += F(&quot;ATM:&quot;); 
  Data += title; Data += ','; 
  Data += text; 
  Data += '\n';
}

///////////////////////// PERFORM DIALOG
// option = &quot;A,B,C&quot; -&amp;gt; index = 1(A) ~ 3(C)
void dialogRadio(uint8_t id, String title, String option, uint8_t selection){ 
  Data += optionHD;
  Data += F(&quot;RAD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; Data += ':';
  Data += String(selection);
  Data += '\n';
} // Return -&amp;gt; RAD:0:1(index) , RAD:id:option index

// option = &quot;A,B,C&quot;
void dialogCheckbox(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;CKB:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':';
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CKB:0:1,3(index) , CKB:id:option index

// option = &quot;A,B&quot;
void dialogChoose(uint8_t id, String message, String option){ 
  Data += optionHD;
  Data += F(&quot;CHD:&quot;); 
  Data += String(id); Data += ':'; 
  Data += message; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; CHD:0:B , CHD:id:option str

// option = &quot;A,B,C,D,E,F,G,H&quot;
void dialogList(uint8_t id, String title, String option){ 
  Data += optionHD;
  Data += F(&quot;LSD:&quot;); 
  Data += String(id); Data += ':';
  Data += title; Data += ':'; 
  Data += option; 
  Data += '\n';
} // Return -&amp;gt; LSD:0:F , LSD:id:option str 

void dialogInput(uint8_t id, String title){ 
  Data += optionHD;
  Data += F(&quot;STR:&quot;); 
  Data += String(id); Data += ':'; 
  Data += title; 
  Data += '\n';
} // Return -&amp;gt; STR:0:str , STR:id:str

//////////////////////////////////////////////////////////// INDIVIDUAL
void iniSet() {
  setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,&quot;
                   &quot;BT12,BT13,BT14,BT15,PW1,PW2,PW3,PW4,PW5,PW6&quot;));
  setButtonToggle(F(&quot;111111111111111&quot;)); // button 1 ~ 15, 0:push 1:toggle    
  setRequest(false); //setRequestInterval(2000);
  setActiveSlide(false); //setSlideInterval(100);
}

// SEND LOCAL STATE AT PRESENT TO APP
void sendState() { 
  sendPinState(10);
  sendPinState(21);
  sendPinState(30);
  sendPinState(41);
  sendPinState(50);
  sendPinState(61);
  sendPinState(71);
  sendPinState(80);
  sendPinState(91);
  sendPinState(101);
  sendPinState(110);
  sendPinState(121);
  sendPinState(130);
  sendPinState(141);
  sendPinState(150);
  sendPwmSlide(1, 110);
  sendPwmSlide(2, 120);
  sendPwmSlide(3, 210);
}

void ipCheck(String response) {
  int st, ed;
  if (response.indexOf(F(&quot;PIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;PIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ap = response.substring(st, ed);
    response.remove(0, ed+1);
    Serial.print(F(&quot;ap: &quot;)); Serial.println(ap);
  }
  if (response.indexOf(F(&quot;AIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;AIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    Serial.print(F(&quot;ip: &quot;)); Serial.println(ip);
  }
}

uint8_t retry = 1;

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  esp01.print(command); // send the read character to the esp01
  long int time = millis();
  String response = &quot;&quot;;
  while( (time+20000) &amp;gt; millis()) {
    while(esp01.available()) {  // The esp has data so display its output to the serial window
      char c = esp01.read(); // read the next character.
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) { retry = 0; Serial.println(F(&quot;OK&quot;)); break; } 
    else if (response.indexOf(F(&quot;FAIL&quot;)) != -1 || response.indexOf(F(&quot;ERROR&quot;)) != -1) { 
      if (response.indexOf(F(&quot;FAIL&quot;)) != -1) retry++;
      else if (response.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; } 
      Serial.print(command); Serial.println(F(&quot;Failed&quot;)); break; 
    }
  }
  return response;
}

String addID(String order, String ssid_AP, String pass_AP) {
  String temp = order+'&quot;'+ssid_AP+'&quot;'+','+'&quot;'+pass_AP+'&quot;';
  return temp;
}

uint8_t connectionId = 48; // storage variable for connection ID 

void http_response() {
  String cip = F(&quot;AT+CIPSEND=&quot;);
  cip += connectionId-48;
  cip += ',';
  cip += Data.length()+19;
  cip += F(&quot;\r\n&quot;);
  esp01.print(cip);
  unsigned long int time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { break; }
  }
  esp01.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;)); // +19
  esp01.print(Data);
  time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { break; }
  }
  Data = &quot;&quot;;
  String command = F(&quot;AT+CIPCLOSE=&quot;);
  command += String(connectionId-48);
  command += F(&quot;\r\n&quot;);
  esp01.print(command);
}

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
  else {  
    if (temp.length() &amp;lt; 10) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size20&quot;&gt;Example of using Protocol to set ADUCON app&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ADUCON app settings: label/toggle properties, use of the timer for checkHD(%%F5), Slide Mode settings, etc.&lt;/p&gt;
&lt;pre id=&quot;code_1668667943980&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void iniSet() {
  setDisplay(F(&quot;111111111111111&quot; // button 1 ~ 15, 0:hide 1:display
               &quot;111111&quot;          // slider 1 ~ 6
               &quot;11&quot;));           // Text Input/Floating Button
  setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); // Set Color Picker and Pwm Nob
  setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,&quot; // set labels
                   &quot;BT12,BT13,BT14,BT15,PW1,PW2,PW3,PW4,PW5,PW6&quot;));
  setButtonToggle(F(&quot;111111111111111&quot;)); // button 1 ~ 15, toggle setting, 0:push 1:toggle
  setMinMax(F(&quot;0,255,0,255,0,255,0,255,0,255,0,255&quot;)); // slider 1 to 6
  setAppTitleMessage(F(&quot;Test Mode&quot;), // Change title for Arduino code on the app
  F(&quot;Arduino&amp;lt;br/&amp;gt;- WiFi Controler&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Manual&amp;lt;br/&amp;gt;&quot; //Message
    &quot;&amp;lt;a href='https://postpop.tistory.com/8'&amp;gt;&quot;
    &quot;https://postpop.tistory.com/8&amp;lt;/a&amp;gt;&quot;));
  setRequest(false); //setRequestInterval(2000); // Disable timer for check(%%F5)
  setActiveSlide(false); //setSlideInterval(100); // Passive Slide Mode
  setSSIDLabelMode(0);   // Set the function of the label displaying Wi-Fi connection
  showDialogMenu(true);  // show menu button
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the screen number (pageId).&lt;/p&gt;
&lt;pre id=&quot;code_1668668163964&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void pin_control(uint8_t value) {
  if (value != 0) {
    switch (value) {
      case 11: if (pageId == 4) Serial.println(F(&quot;powor : on&quot;));
               else Serial.println(F(&quot;button 1 : on&quot;));
                  break;
      case 10: if (pageId == 4) Serial.println(F(&quot;powor : off&quot;));
               else Serial.println(F(&quot;button 1 : off&quot;));
                  break;
      case 21: if (pageId == 4) { 
                 Serial.println(F(&quot;motor1 : on&quot;)); 
                 sendPinState(30); 
               } else Serial.println(F(&quot;button 2 : on&quot;));
                  break;
      case 20: if (pageId == 4) Serial.println(F(&quot;motor1 : off&quot;));
               else Serial.println(F(&quot;button 2 : off&quot;));
                  break;
      case 31: if (pageId == 4) { 
                 Serial.println(F(&quot;motor2 : on&quot;)); 
                 sendPinState(20); 
               } else Serial.println(F(&quot;button 3 : on&quot;));
                  break;
      case 30: if (pageId == 4) Serial.println(F(&quot;motor2 : off&quot;));
               else Serial.println(F(&quot;button 3 : off&quot;));
                  break;
      case 201: Serial.println(F(&quot;button 20 : click&quot;));
                dialogList(0, F(&quot;MENU&quot;), F(&quot;select,Dial_Nob,Color_Picker,Key_Pad,Arrow_Pad,Main&quot;)); // dialog message
                  break;           
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the function &quot;CheckF9()&quot; that handles dialog messages.&lt;/p&gt;
&lt;pre id=&quot;code_1668668163965&quot; class=&quot;reasonml&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t pageId = 0;  // screen number

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }         // radio button
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }    // Checkbox
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }    // Select button
  else if (temp.startsWith(F(&quot;LSD&quot;))) {       // List Window
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      if (temp.startsWith(F(&quot;Dial&quot;))) {           // Dial Nob screen 
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(4, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 1; 
      } else if (temp.startsWith(F(&quot;Color&quot;))) {   // Color Picker screen
        setDisplay(F(&quot;11111111111111111111110&quot;)); // hide floating button
        setColorNob(2, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 2; 
      } else if (temp.startsWith(F(&quot;Key&quot;))) {     // Key Pad screen
        if (pageId &amp;lt;= 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111111111100011111110&quot;)); 
        setButtonToggle(F(&quot;000000000000111&quot;));
        setButtonLabel(F(&quot;1,2,3,4,5,6,7,8,9,*,0,#&quot;));
        pageId = 3;
      } else if (temp.startsWith(F(&quot;Arrow&quot;))) {   // Arrow Pad screen
        if (pageId &amp;lt;= 2) setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false);
        setDisplay(F(&quot;11111101010101011111110&quot;)); 
        setButtonToggle(F(&quot;111111000000000&quot;));
        setButtonLabel(F(&quot;Power,Motor1,Moror2,BT4,BT5,BT6,7,Up,9,Left,0,Right,0,Down&quot;));
        pageId = 4;
      } else {                                    // Main screen
        if (pageId &amp;lt;= 2) { setColorNob(0, F(&quot;GR1&quot;), F(&quot;GR2&quot;), false); pageId = 0; }
        setDisplay(F(&quot;11111111111111111111111&quot;));
        setButtonToggle(F(&quot;111111111111111&quot;));
        setButtonLabel(F(&quot;BT1,BT2,BT3,BT4,BT5,BT6,BT7,BT8,BT9,BT10,BT11,BT12,BT13,BT14,BT15&quot;));
        send_State();
        pageId = 0;
      }
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }       // Input text
  else {  
    if (temp.length() &amp;lt; 6) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If you touch the push button quickly on the Key Pad screen, it takes about 1 second to process the response using the AT Command, so the number touched in the middle may be missing or the order of the numbers may be mixed up. In order to prevent this, you need to make a touch every second or use &quot;responseFailResend(flase);&quot;, so that it does not respond.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-1.ARDUINO_ESP01_HMI_CONTROL_MENU.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/JQW1p/btrRx6OWqih/2vKkyKyrURkSgMFD649U3K/1-1.ARDUINO_ESP01_HMI_CONTROL_MENU.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1-1.ARDUINO_ESP01_HMI_CONTROL_MENU.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/3ruyhd2yhBo&quot;&gt;https://youtu.be/3ruyhd2yhBo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/3ruyhd2yhBo&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Example of using responseFailResend() function&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Coding in order not to respond for values that are quickly touched and transmitted on the keypad screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the screen number (pageId)&lt;/p&gt;
&lt;pre id=&quot;code_1668668163967&quot; class=&quot;angelscript&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool pin_control(uint8_t value) {
  bool response = true;
  .
  .
  .
  if (pageId == 3) { if (value &amp;lt; 130) response = false; }       // KEY PAD
  return response; // no response when push button.
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of code processing for each function of a button that changes according to the screen number (pageId)&lt;/p&gt;
&lt;pre id=&quot;code_1668668163967&quot; class=&quot;reasonml&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t pageId = 0;
bool idClose = false;

void CheckF9(String temp) {
  Serial.println(temp);
  if (temp.startsWith(F(&quot;RAD&quot;))) {  }
  else if (temp.startsWith(F(&quot;CKB&quot;))) {  }
  else if (temp.startsWith(F(&quot;CHD&quot;))) {  }
  else if (temp.startsWith(F(&quot;LSD&quot;))) {  
    int ed = temp.indexOf(':');
    temp.remove(0, ed+1);
    ed = temp.indexOf(':');
    String ID = temp.substring(0, ed);
    uint8_t id = ID.toInt();
    temp.remove(0, ed+1);
    if (id == 0) {
      .
      .
      .
      if (pageId == 3) responseFailResend(false); // If the key pad screen
      else responseFailResend(true);              // if the rest of the screen
    }
  }
  else if (temp.startsWith(F(&quot;STR&quot;))) {  }
  else {  
    if (temp.length() &amp;lt; 6) Serial.println(F(&quot;alarm&quot;));
    else Serial.println(F(&quot;date/time&quot;));
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** If you want to apply it to the push button of &quot;Arrow Pad&quot; screen, you could add the code below to the function-specific code processing of the button and to the CheckF9() function.&lt;/p&gt;
&lt;pre id=&quot;code_1668668163968&quot; class=&quot;angelscript&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (pageId == 4) {
  uint8_t va = value / 10;
  if (va == 8 || va == 10 || va == 12 || va == 14) response = false; // ARROW KEY
} else if (pageId == 3) { if (value &amp;lt; 130) response = false; }       // KEY PAD&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1668668163968&quot; class=&quot;lisp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (pageId == 3 || pageId == 4) responseFailResend(false); 
else responseFailResend(true);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Example of modifying the wifi_read() function&lt;/p&gt;
&lt;pre id=&quot;code_1668668163968&quot; class=&quot;gauss&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (appConnection) { 
  bool response = true; // add
  if (order == 1) {  }
  else if (order == 2) {  }
  else if (order == 3) {
    response = pin_control(value); // edit
  } 
  else if (order == 4) {  }
  else {  }
  if (response) http_response(); // edit
  else {  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1-2.ARDUINO_ESP01_HMI_CONTROL_MENU_PUSH_NORESPONSE.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b4MROc/btrRyzJRPIG/TmSJPDSOntRZEk7N08knh1/1-2.ARDUINO_ESP01_HMI_CONTROL_MENU_PUSH_NORESPONSE.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;1-2.ARDUINO_ESP01_HMI_CONTROL_MENU_PUSH_NORESPONSE.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/4WE27s7Ovqc&quot;&gt;https://youtu.be/4WE27s7Ovqc&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/4WE27s7Ovqc&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Web Manager&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can change the ID and password for access point and router connection using HTML coded in Arduino.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wifiManager.jpg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G9On0/btrRTtDN3i4/S5E0AGpTrXhJE3w9bBTXRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G9On0/btrRTtDN3i4/S5E0AGpTrXhJE3w9bBTXRK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G9On0/btrRTtDN3i4/S5E0AGpTrXhJE3w9bBTXRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG9On0%2FbtrRTtDN3i4%2FS5E0AGpTrXhJE3w9bBTXRK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;290&quot; data-filename=&quot;wifiManager.jpg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Changed the variable type from const char to char so that the SSID and password for connecting to the router can be changed in the loop() function.&lt;/p&gt;
&lt;pre id=&quot;code_1668668163969&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char ssid[21] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
char pass[21] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- EEPROM Setting&lt;/p&gt;
&lt;pre id=&quot;code_1668668163969&quot; class=&quot;arduino&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void loadConfig() {  // Read ID and Password
  wifiRouter = EEPROM.read(980); // read whether router is in use
  for (int i = 0; i &amp;lt; 21; i++) ssid[i] = EEPROM.read(981 + i); // read SSID
  for (int i = 0; i &amp;lt; 21; i++) pass[i] = EEPROM.read(1002 + i);// read password
}

void saveConfig() { // Write ID and Password
  EEPROM.write(980, wifiRouter); // Save whether or not the router is used
  for (int i = 0; i &amp;lt; 21; i++) EEPROM.write(981 + i, ssid[i]); // save SSID
  for (int i = 0; i &amp;lt; 21; i++) EEPROM.write(1002 + i, pass[i]);// Save password
}

// After uploading the sketch to the Arduino, write it once to the EEPROM or read the values stored in the EEPROM when booting.
void setup() {
  if(EEPROM.read(1023) != 1) { 
    for (int i = 0 ; i &amp;lt; EEPROM.length() ; i++) EEPROM.write(i, 0); // EEPROM Clear
    EEPROM.write(1023, 1);  // flag for status of saving
    saveConfig();       // Write ID and Password at initialization
  } else loadConfig();  // Read saved ID and Password when Arduino is rebooting
}

// EEPROM initialization code at serial monitor
void loop() {
  if(Serial.available() &amp;gt; 0){ // Serial monitor code
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if (temp == F(&quot;1&quot;)) {
      EEPROM.write(1023, 0);
      Serial.println(&quot;EEPROM INI&quot;);
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.ARDUINO_ESP01_HMI_WEB_MANAGER.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dhQr7p/btrRv7AOdQC/LBfEy8MhJ2kDO0uCehqsYK/2.ARDUINO_ESP01_HMI_WEB_MANAGER.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;2.ARDUINO_ESP01_HMI_WEB_MANAGER.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ARDUINO_EEPROM_INI.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/BrWlO/btrRRB277Cc/NvjFT8D38J7IswSkbSqwv0/ARDUINO_EEPROM_INI.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_EEPROM_INI.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Change all data to 0 in EEPROM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/cazJ1JhffXU&quot;&gt;https://youtu.be/cazJ1JhffXU&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/cazJ1JhffXU&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Web Login&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When connecting through a router, obtain control authority using the name and password of the access point.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wifiManagerLoginP.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4LXaV/btrSHXKuLhf/P5LDlyNPL7cirLQqfNAMsk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4LXaV/btrSHXKuLhf/P5LDlyNPL7cirLQqfNAMsk/img.jpg&quot; data-alt=&quot;Login Page&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4LXaV/btrSHXKuLhf/P5LDlyNPL7cirLQqfNAMsk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4LXaV%2FbtrSHXKuLhf%2FP5LDlyNPL7cirLQqfNAMsk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;204&quot; data-filename=&quot;wifiManagerLoginP.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Login Page&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wifiManagerLogin.jpg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccojqa/btrSIRQvjaG/Fo15xkCIn3un8P8GIuwkN0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccojqa/btrSIRQvjaG/Fo15xkCIn3un8P8GIuwkN0/img.jpg&quot; data-alt=&quot;Web Manager with Login&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccojqa/btrSIRQvjaG/Fo15xkCIn3un8P8GIuwkN0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fccojqa%2FbtrSIRQvjaG%2FFo15xkCIn3un8P8GIuwkN0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;324&quot; data-filename=&quot;wifiManagerLogin.jpg&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Web Manager with Login&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.ARDUINO_ESP01_HMI_WEB_LOGIN.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/BYpBZ/btrRxUHMwz3/X5OUtUdaiuoHk0zOXXSGck/3.ARDUINO_ESP01_HMI_WEB_LOGIN.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;3.ARDUINO_ESP01_HMI_WEB_LOGIN.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/RIBYkVFOk2s&quot;&gt;https://youtu.be/RIBYkVFOk2s&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/RIBYkVFOk2s&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Wifi Manager&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can change the ID and password for connecting to access points and a router without using HTML code.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x1XsV/btrRTEk1IoW/50OF1UtL4k9j9rxk57nuj1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x1XsV/btrRTEk1IoW/50OF1UtL4k9j9rxk57nuj1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x1XsV/btrRTEk1IoW/50OF1UtL4k9j9rxk57nuj1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx1XsV%2FbtrRTEk1IoW%2F50OF1UtL4k9j9rxk57nuj1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;561&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.ARDUINO_ESP01_HMI_NAME.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b8qfZs/btrRv7OlBKP/8EIs9gjiwHGNggdo4S0ve0/4.ARDUINO_ESP01_HMI_NAME.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;4.ARDUINO_ESP01_HMI_NAME.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/Wi9NfuZULsU&quot;&gt;https://youtu.be/Wi9NfuZULsU&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Wi9NfuZULsU&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App Login&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When connecting through a router, obtain control authority using password of the access point.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dsftv/btrRSsFpnDr/l7J8oDWzrmNknTbqgISXxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dsftv/btrRSsFpnDr/l7J8oDWzrmNknTbqgISXxk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dsftv/btrRSsFpnDr/l7J8oDWzrmNknTbqgISXxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDsftv%2FbtrRSsFpnDr%2Fl7J8oDWzrmNknTbqgISXxk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;199&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQCM1M/btrRSiiucfE/bk6zIJkbKoxl46sMIQY321/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQCM1M/btrRSiiucfE/bk6zIJkbKoxl46sMIQY321/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQCM1M/btrRSiiucfE/bk6zIJkbKoxl46sMIQY321/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQCM1M%2FbtrRSiiucfE%2Fbk6zIJkbKoxl46sMIQY321%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;42&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.ARDUINO_ESP01_HMI_PASS.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/n1eAh/btrRvaxMIDH/rooj3HOS10xop21ykNys21/5.ARDUINO_ESP01_HMI_PASS.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;5.ARDUINO_ESP01_HMI_PASS.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/-p7PWt7pfTM&quot;&gt;https://youtu.be/-p7PWt7pfTM&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/-p7PWt7pfTM&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ADUCON - Arduino wireless remote control application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUCON</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/182</guid>
      <comments>https://postpop.tistory.com/182#entry182comment</comments>
      <pubDate>Thu, 17 Nov 2022 15:05:44 +0900</pubDate>
    </item>
    <item>
      <title>Setting up Wi-Fi module ESP01 and basic code for Arduino remote control</title>
      <link>https://postpop.tistory.com/181</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X3WkX/btrVfsAgVpF/dgW1NPqvbhLIisL7hYTr90/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X3WkX/btrVfsAgVpF/dgW1NPqvbhLIisL7hYTr90/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X3WkX/btrVfsAgVpF/dgW1NPqvbhLIisL7hYTr90/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX3WkX%2FbtrVfsAgVpF%2FdgW1NPqvbhLIisL7hYTr90%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In order to remotely control the Arduino by connecting to the WiFi module ESP01 in the Android application ADUCON / ADUPAD, the WiFi module ESP01 and Arduino must be well wired in hardware. In addition, the serial communication baud rate for data transmission of ESP01 must be set to 9600 so that it can be used on the Arduino board.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Preparations&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Connection between Arduino Uno board and ESP01&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1-1.esp01_pinout.png&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uFUgh/btrRnoce1ot/3rhgOHeT7TFqBnofc1kl5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uFUgh/btrRnoce1ot/3rhgOHeT7TFqBnofc1kl5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uFUgh/btrRnoce1ot/3rhgOHeT7TFqBnofc1kl5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuFUgh%2FbtrRnoce1ot%2F3rhgOHeT7TFqBnofc1kl5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;ESP01 PIN NUMBUR&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;287&quot; data-filename=&quot;1-1.esp01_pinout.png&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TX -&amp;gt; Arduino RX&lt;br /&gt;RX -&amp;gt; Arduino TX&lt;br /&gt;VCC -&amp;gt; Arduino 3.3V&lt;br /&gt;CH_PD -&amp;gt; Arduino 3.3V&lt;br /&gt;GND -&amp;gt; Arduino GND&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1-2.arduino_esp01_connection.jpg&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOC8Xp/btrRoQFvIgj/k4zfU2vkQdvKcOzFu6KWD1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOC8Xp/btrRoQFvIgj/k4zfU2vkQdvKcOzFu6KWD1/img.jpg&quot; data-alt=&quot;Arduino board and ESP01 wiring&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOC8Xp/btrRoQFvIgj/k4zfU2vkQdvKcOzFu6KWD1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOC8Xp%2FbtrRoQFvIgj%2Fk4zfU2vkQdvKcOzFu6KWD1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Arduino board and ESP01 wiring&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;657&quot; data-filename=&quot;1-2.arduino_esp01_connection.jpg&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Arduino board and ESP01 wiring&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Set the serial communication baud rate of module ESP01 to 9600&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The default baud rate for ESP01 is 115200. Arduino's softwareSerial can also be used as a baud rate 115200. However, in this case, errors sometimes occur during data transmission. The baud rate at which softwareSerial operates stably is 9600. Therefore, it is necessary to change the baud rate of ESP01 to 9600 so that it can be connected to Arduino and used normally.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- How to check baud rate of the module&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Module and Arduino must be well wired in hardware.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Upload the basic Sketch which is coded baud rate 115200 of Serial.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Set option to &quot;Both NL &amp;amp; CR&quot; for Serial Monitor of Arduino IDE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Set baud rate to &quot;115200&quot; at Serial Monitor of Arduino IDE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Input &quot;AT&quot; at text window and if get &quot;OK&quot; as a response, the baud rate of the module is 115200.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. If not, try to change baud rate to 9600 or another value in the sketch and upload.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Set baud rate to &quot;9600&quot; or another value at Serial Monitor of Arduino IDE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. Input &quot;AT&quot; at text window and if get &quot;OK&quot;, the baud rate of the module is 9600. if not repeat no.7 ~ 9.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/8LIXt/btrR6d0rRK9/BpVRe3Pg3VXMzn1Dh8l9tK/Serial_basic_esp01.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Serial_basic_esp01.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1669346616876&quot; class=&quot;arduino&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
SoftwareSerial esp01(2, 3); // SoftwareSerial NAME(RX, TX);

void setup() {
  Serial.begin(115200);  // Serial Monitor and baud rate
  esp01.begin(115200);   // ESP01 serial and baud rate
}

void loop() {
  if (esp01.available()) {
    Serial.write(esp01.read()); //Output the contents of the ESP01 to the serial monitor
  }
  if (Serial. available()) {
    esp01.write(Serial.read()); //Write the contents of the serial monitor to the ESP01
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;baudRateChange115200.jpg&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjCkGu/btrR3fyh6eJ/H7cBYuqTjkikk5KT8krVJ0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjCkGu/btrR3fyh6eJ/H7cBYuqTjkikk5KT8krVJ0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjCkGu/btrR3fyh6eJ/H7cBYuqTjkikk5KT8krVJ0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjCkGu%2FbtrR3fyh6eJ%2FH7cBYuqTjkikk5KT8krVJ0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;464&quot; data-filename=&quot;baudRateChange115200.jpg&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If the baud rate is not set to 9600, please set it by referring to the below.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set the transmission option of the serial monitor to Both NL &amp;amp; CR and the baud rate to 115200. Then, type &quot;AT&quot; into the Arduino serial monitor input window and hit enter. If OK is displayed on the serial monitor as a response, you can confirm that the Arduino and ESP01 are well connected and are operating normally. Copy and paste the AT command &quot;AT+UART_DEF=9600,8,1,0,0&quot; to change the baud rate and hit enter. If you receive an OK response, the baud rate of ESP-01 has been changed to 9600.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.esp01_baud_rate_9600_set.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhGSRi/btrRrPlBh3s/KkGexodBUlWcCxUoKe6HX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhGSRi/btrRrPlBh3s/KkGexodBUlWcCxUoKe6HX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhGSRi/btrRrPlBh3s/KkGexodBUlWcCxUoKe6HX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhGSRi%2FbtrRrPlBh3s%2FKkGexodBUlWcCxUoKe6HX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;esp01_baud_rate_9600_set&quot; loading=&quot;lazy&quot; width=&quot;724&quot; height=&quot;400&quot; data-filename=&quot;1.esp01_baud_rate_9600_set.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.esp01_baud_rate_9600_result.png&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XuHoj/btrRpDF10w9/UtyJlhLEFVL1MfKRblyGzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XuHoj/btrRpDF10w9/UtyJlhLEFVL1MfKRblyGzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XuHoj/btrRpDF10w9/UtyJlhLEFVL1MfKRblyGzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXuHoj%2FbtrRpDF10w9%2FUtyJlhLEFVL1MfKRblyGzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;esp01_baud_rate_9600_result&quot; loading=&quot;lazy&quot; width=&quot;719&quot; height=&quot;401&quot; data-filename=&quot;1.esp01_baud_rate_9600_result.png&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Precautions when using the WiFi module ESP01&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. When transmitting data, AT command must be executed through serial communication every time.&lt;br /&gt;2. When Arduino is operating as a server and the use of multi-connection is forced as a connection option, if the id used for receiving is in use or not terminated, the next id will receive additional requests.&lt;br /&gt;3. If an additional request comes while all 5 connection ids are connected, all of them are closed. In this state, it must be reset to be usable again.&lt;br /&gt;4. In order to prevent the third case, when data reception is completed, the id connection must be disconnected and the ID state must be put on standby.&lt;br /&gt;5. In case of receiving continuous data, the data is received while the id is changed. At that time, the time order of the received data may be changed.&lt;br /&gt;6. For the reason of No. 1, it takes more than 1 second to respond to data reception. Therefore, it is difficult to respond to rapidly received data, so it is recommended to use the SeekBar (slide bar) mode as &quot;Passive Slide Mode&quot;.&lt;br /&gt;*** If you want to receive continuous values using &quot;Active Slide Mode&quot;, you must code not to respond to reception so that all 5 connection ids are not filled. At the same time, the data transmission interval must be properly set in the application so that values can be received at appropriate time intervals.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Key code for remote control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Set Software serial to communicate with ESP01.&lt;/p&gt;
&lt;pre id=&quot;code_1668653785066&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(RX, TX);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ACCESS POINT name and password setting for ESP-01&lt;/p&gt;
&lt;pre id=&quot;code_1668653785066&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const char ssidAP[] = &quot;ESP01&quot;;   // your network SSID (name)
const char passAP[] = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- If you want to use the internal network through a router connection, set the name and password of the router that ESP01 needs to connect to.&lt;/p&gt;
&lt;pre id=&quot;code_1668653785066&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const char ssid[] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
const char pass[] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Function that executes AT command for ESP01 setup&lt;/p&gt;
&lt;pre id=&quot;code_1668653785066&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  esp01.print(command); // send the command to the esp01
  long int time = millis();
  String response = &quot;&quot;;
  while( (time+20000) &amp;gt; millis()) {
    while(esp01.available()) {  // if The esp has data
      char c = esp01.read();    // read the next character.
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) { retry = 0; Serial.println(F(&quot;OK&quot;)); break; } 
    else if (response.indexOf(F(&quot;FAIL&quot;)) != -1 || response.indexOf(F(&quot;ERROR&quot;)) != -1) { 
      if (response.indexOf(F(&quot;FAIL&quot;)) != -1) retry++;
      else if (response.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; } 
      Serial.print(command); Serial.println(F(&quot;Failed&quot;)); break; 
    }
  }
  return response;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Function that executes AT Command for data transmission and terminates the connection ID&lt;/p&gt;
&lt;pre id=&quot;code_1668653785067&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;uint8_t connectionId = 48; // connection id

void http_response() {
  String cip = F(&quot;AT+CIPSEND=&quot;);
  cip += connectionId-48;
  cip += ',';
  cip += Data.length()+19;
  cip += F(&quot;\r\n&quot;);
  esp01.print(cip);
  unsigned long int time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { break; }
  }
  esp01.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;)); // +19
  esp01.print(Data);
  time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { break; }
  }
  Data = &quot;&quot;;
  String command = F(&quot;AT+CIPCLOSE=&quot;);
  command += String(connectionId-48);
  command += F(&quot;\r\n&quot;);
  esp01.print(command);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- setup&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1668653785068&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void setup() {
  pinMode(ledPin, OUTPUT);   // Set the default LED (13) of the Arduino Uno as an output
  digitalWrite(ledPin, LOW); // set the initial state of the primary LED (13) to off
  Serial.begin(9600); // Set the baud rate for communication with the serial monitor of the Arduino IED to 9600
  esp01.begin(9600);  // Set baud rate for communication with ESP01 to 9600
  sendData(F(&quot;RST&quot;)); // AT Command: ESP01 module reset
  unsigned long int time = millis();
  String temp = &quot;&quot;;
  while (time+20000 &amp;gt; millis()) { // Wait until ESP01 is reset
    temp = esp01. readStringUntil('\n');
    if (temp. indexOf(F(&quot;ready&quot;)) != -1) { Serial. println(F(&quot;Set&quot;)); break; }
  }
  if (wifiRouter) sendData(F(&quot;CWMODE=3&quot;)); // AT Command: Access point and router connection setup (AP+STA)
  else sendData(F(&quot;CWMODE=2&quot;));            // AT Command: set access point only
  if (wifiRouter) sendData(F(&quot;CWDHCP=1,1&quot;)); // Set the use of DHCP when connecting to a router
  sendData(addID(F(&quot;CWSAP=&quot;),ssidAP,passAP)+','+String(10)+','+String(3)); // AT Command: AP execution
  sendData(F(&quot;CIPMUX=1&quot;));       // AT Command: Multi Connection Settings
  sendData(F(&quot;CIPSERVER=1,80&quot;)); // AT Command: set server port number 80
  if (wifiRouter) { // In case of router connection
    retry = 1;
    while(retry) {  // If the router fails to connect, repeat the connection
      sendData(addID(F(&quot;CWJAP=&quot;),ssid,pass)); // AT Command: Launch router connection
      if (retry &amp;gt; 1) { Serial. print(F(&quot;Retrying to connect: &quot;)); Serial. println(retry-1); }
      if (retry &amp;gt; 4) { Serial. println(F(&quot;connection failed&quot;)); retry = 0; }
    }
  }
  ipCheck(sendData(F(&quot;CIFSR&quot;))); // AT Command: Check the current AP/IP address and store it in variables ap, ip
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- loop&lt;/span&gt;() function&lt;/p&gt;
&lt;pre id=&quot;code_1669454862818&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool gotData = false;

void loop() {
  if (esp01.available()) { // when incomming data from ESP01
    String temp = esp01.readStringUntil('\n'); // read string until character '\n'
    Serial.println(temp); //Output the contents of the ESP01 to the serial monitor
    if (temp.startsWith(&quot;+IPD&quot;)) {    // if the string start with &quot;+IPD&quot;
      gotData = true;                 // the flag for response of HTTP
      temp.remove(0,5);               // remove &quot;+IPD,&quot;
      connectionId = temp.charAt(0);  // get connection ID from first character of temp
    }
  } else {                 
    if (gotData) {                    // if response of HTTP
      Data = &quot;Hello World &quot;;  
      Data += random(100,200);        // the message for sending
      Serial.println(Data);           // output Message to the serial monitor
      http_response();                // response of HTTP
      gotData = false;                // initialize the flag
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO_ESP01_BASIC.zip&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/b1mHDY/btrSahWAad2/W2TvhvOfkOIFrY3oNK6Eck/ARDUINO_ESP01_BASIC.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ARDUINO_ESP01_BASIC.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Output of Serial Monitor after upload scketch &quot;ARDUINO_ESP01_BASIC.ino&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitor.jpg&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;445&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mdeoD/btrR9XjERfr/FJpKSqx4CsPyiyitPzskR1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mdeoD/btrR9XjERfr/FJpKSqx4CsPyiyitPzskR1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mdeoD/btrR9XjERfr/FJpKSqx4CsPyiyitPzskR1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmdeoD%2FbtrR9XjERfr%2FFJpKSqx4CsPyiyitPzskR1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;445&quot; data-filename=&quot;basicMonitor.jpg&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;445&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting directly to the ESP01 and then connecting the access point&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Connect to ESP01 on the WiFi Setting of a mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectToESP01.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GXWXd/btrScabvJog/1NgsvGdG6ix2x3WbwUk8Tk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GXWXd/btrScabvJog/1NgsvGdG6ix2x3WbwUk8Tk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GXWXd/btrScabvJog/1NgsvGdG6ix2x3WbwUk8Tk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGXWXd%2FbtrScabvJog%2F1NgsvGdG6ix2x3WbwUk8Tk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;303&quot; data-filename=&quot;connectToESP01.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the Password for the ACCESS POINT of ESP01.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputPassword.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/920YN/btrR8JNxKEp/YZQ1r93REgEKM0ae7vkbI0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/920YN/btrR8JNxKEp/YZQ1r93REgEKM0ae7vkbI0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/920YN/btrR8JNxKEp/YZQ1r93REgEKM0ae7vkbI0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F920YN%2FbtrR8JNxKEp%2FYZQ1r93REgEKM0ae7vkbI0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;319&quot; data-filename=&quot;inputPassword.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Select &quot;Keep WiFi on&quot; if the message output below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDpU5k/btrR9FwLWCK/xJgOUCtumfkUob7CVFXJNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDpU5k/btrR9FwLWCK/xJgOUCtumfkUob7CVFXJNk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDpU5k/btrR9FwLWCK/xJgOUCtumfkUob7CVFXJNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDpU5k%2FbtrR9FwLWCK%2FxJgOUCtumfkUob7CVFXJNk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;288&quot; data-filename=&quot;keepWiFion.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the address &quot;192.168.4.1/hi&quot; on web browser.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputAddress.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJvZQO/btrSbSB05wh/4AWDWAedlbYbHREq9SqVGK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJvZQO/btrSbSB05wh/4AWDWAedlbYbHREq9SqVGK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJvZQO/btrSbSB05wh/4AWDWAedlbYbHREq9SqVGK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJvZQO%2FbtrSbSB05wh%2F4AWDWAedlbYbHREq9SqVGK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;158&quot; data-filename=&quot;inputAddress.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitor1.jpg&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;1038&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r2GNE/btrR8Jmp0Do/Ah5M3jTHoh9tKglVEAJsWk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r2GNE/btrR8Jmp0Do/Ah5M3jTHoh9tKglVEAJsWk/img.jpg&quot; data-alt=&quot;received data of &amp;quot;192.168.4.1/hi&amp;quot; and favicon&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r2GNE/btrR8Jmp0Do/Ah5M3jTHoh9tKglVEAJsWk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr2GNE%2FbtrR8Jmp0Do%2FAh5M3jTHoh9tKglVEAJsWk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;1038&quot; data-filename=&quot;basicMonitor1.jpg&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;1038&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;192.168.4.1/hi&quot; and favicon&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHTTP.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UIaNi/btrR9Yv6ERE/aTSHOtScjczhG7IXcankMK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UIaNi/btrR9Yv6ERE/aTSHOtScjczhG7IXcankMK/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UIaNi/btrR9Yv6ERE/aTSHOtScjczhG7IXcankMK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUIaNi%2FbtrR9Yv6ERE%2FaTSHOtScjczhG7IXcankMK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Respons of HTTP from ESP01&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;116&quot; data-filename=&quot;responseHTTP.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP01&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connecting to the assigned IP while ESP01 is connected to the router&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Input the assigned IP address &quot;192.168.1.7/hi&quot; on web browser of PC connected to network of &quot;skynet&quot;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;inputAddressPC.jpg&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;92&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8lunL/btrSehVXSY7/VLmTkLWsAW4JLnjEOsmPqK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8lunL/btrSehVXSY7/VLmTkLWsAW4JLnjEOsmPqK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8lunL/btrSehVXSY7/VLmTkLWsAW4JLnjEOsmPqK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8lunL%2FbtrSehVXSY7%2FVLmTkLWsAW4JLnjEOsmPqK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;502&quot; height=&quot;92&quot; data-filename=&quot;inputAddressPC.jpg&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;92&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basicMonitor1pc.jpg&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;919&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRfbEC/btrScPrTZub/o79LiWgmwyBmBpcTgoqP5K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRfbEC/btrScPrTZub/o79LiWgmwyBmBpcTgoqP5K/img.jpg&quot; data-alt=&quot;received data of &amp;quot;192.168.1.7/hi&amp;quot; and favicon&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRfbEC/btrScPrTZub/o79LiWgmwyBmBpcTgoqP5K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRfbEC%2FbtrScPrTZub%2Fo79LiWgmwyBmBpcTgoqP5K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;699&quot; height=&quot;919&quot; data-filename=&quot;basicMonitor1pc.jpg&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;919&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;received data of &quot;192.168.1.7/hi&quot; and favicon&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responseHTTPpc.jpg&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QFCXO/btrSagqcSeJ/MvV3CTDjJN92Xis1Yt9DX0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QFCXO/btrSagqcSeJ/MvV3CTDjJN92Xis1Yt9DX0/img.jpg&quot; data-alt=&quot;Respons of HTTP from ESP01&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QFCXO/btrSagqcSeJ/MvV3CTDjJN92Xis1Yt9DX0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQFCXO%2FbtrSagqcSeJ%2FMvV3CTDjJN92Xis1Yt9DX0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;502&quot; height=&quot;115&quot; data-filename=&quot;responseHTTPpc.jpg&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;115&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Respons of HTTP from ESP01&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/182&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - Arduino WiFi remote control with ADUCON and ESP-01&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/183&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - Arduino WiFi remote control with ADUPAD and ESP-01&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ADUCON - Arduino wireless remote control application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/176&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ADUPAD - Arduino wireless remote control PAD application&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237099669&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUCON - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&amp;amp;hl=ko&amp;amp;gl=KR&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUCON - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671237122569&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUPAD - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&amp;amp;hl=ko&amp;amp;gl=JP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUPAD - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino</category>
      <category>ADUCON</category>
      <category>ADUPAD</category>
      <category>Arduino</category>
      <category>esp01</category>
      <category>아두이노</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/181</guid>
      <comments>https://postpop.tistory.com/181#entry181comment</comments>
      <pubDate>Wed, 16 Nov 2022 17:05:42 +0900</pubDate>
    </item>
    <item>
      <title>ADUPAD - Arduino wireless remote control PAD application</title>
      <link>https://postpop.tistory.com/176</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_pad515.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bepq05/btrN4jFhAnT/IUk5OKWh73ob4f72aBXPN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bepq05/btrN4jFhAnT/IUk5OKWh73ob4f72aBXPN0/img.png&quot; data-alt=&quot;Main screen of ADUPAD&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bepq05/btrN4jFhAnT/IUk5OKWh73ob4f72aBXPN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbepq05%2FbtrN4jFhAnT%2FIUk5OKWh73ob4f72aBXPN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Main screen of ADUPAD&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;251&quot; data-filename=&quot;edited_pad515.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Main screen of ADUPAD&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvWtfS/btrU6ZsQRFW/J3X0mvErkpXmRp5bMOCek0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvWtfS/btrU6ZsQRFW/J3X0mvErkpXmRp5bMOCek0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvWtfS/btrU6ZsQRFW/J3X0mvErkpXmRp5bMOCek0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvWtfS%2FbtrU6ZsQRFW%2FJ3X0mvErkpXmRp5bMOCek0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Arduino remote control PAD app using a wireless module available in Arduino.&lt;br /&gt;Bluetooth 2.0 Classic / 4.0 BLE : HC-05, HC-06, HM-10, AT-09, BT05, ESP32, etc.&lt;br /&gt;Wi-Fi : ESP01, ESP8266 NodeMcu, ESP32, etc.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671217806003&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUPAD - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&amp;amp;hl=ko&amp;amp;gl=JP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=io.kodular.skyship72.pad01&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LO8vz/hyQUThHuF7/97m8eABuu7XUysnWnCsvAk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/7isMP/hyQUTWgG6j/GlHoTx2kg3lrQtKRleR1yK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/FdB7d/hyQUYJ3AXD/kfLCoO1elEVVYiQ7gOBlB1/img.jpg?width=526&amp;amp;height=256&amp;amp;face=0_0_526_256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUPAD - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 PAD&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Characteristic&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 2 pcs joysticks.&lt;br /&gt;- 1 pc gravity sensor controller.&lt;br /&gt;- 20 pcs buttons for control: Toggle and push button property setting function.&lt;br /&gt;Some button labels can be customized.&lt;br /&gt;- Provides a dialog window to set the control authority using a password &lt;br /&gt;- Provides custom dialog windows (radio box, check box, text input, etc.) &lt;br /&gt;- The screen stays on while the app is running (prevents the screen from turning off)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_pad.jpg&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XUkFU/btrN774m9Iu/nTKpZzU88ZwPvwKaI1hUR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XUkFU/btrN774m9Iu/nTKpZzU88ZwPvwKaI1hUR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XUkFU/btrN774m9Iu/nTKpZzU88ZwPvwKaI1hUR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXUkFU%2FbtrN774m9Iu%2FnTKpZzU88ZwPvwKaI1hUR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;292&quot; data-filename=&quot;edited_pad.jpg&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Top Menu&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;munu1.jpg&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/esInLx/btrNxagkqJQ/fzmQGwyAQl0G3W6MyLV5O1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/esInLx/btrNxagkqJQ/fzmQGwyAQl0G3W6MyLV5O1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/esInLx/btrNxagkqJQ/fzmQGwyAQl0G3W6MyLV5O1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FesInLx%2FbtrNxagkqJQ%2FfzmQGwyAQl0G3W6MyLV5O1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;55&quot; data-filename=&quot;munu1.jpg&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gameoffac1.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDuLhx/btrNufpR3SH/XEDtr400jQUfO6URNpruik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDuLhx/btrNufpR3SH/XEDtr400jQUfO6URNpruik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDuLhx/btrNufpR3SH/XEDtr400jQUfO6URNpruik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDuLhx%2FbtrNufpR3SH%2FXEDtr400jQUfO6URNpruik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;46&quot; height=&quot;50&quot; data-filename=&quot;gameoffac1.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click: Open Arduino connection and pop-up window for button setting.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Long click: move to setting screen of the option.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Joystick Information&lt;/span&gt;: Joystick Heading / Strength :: Strength / Joystick Heading&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Can set whether to display &quot;Joystick_Information&quot; on the option setting screen.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;leftUpsideDown.jpg&quot; data-origin-width=&quot;43&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qCKnq/btrNwDQpztq/KxPi5IKKRTKolT6Kf63QH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qCKnq/btrNwDQpztq/KxPi5IKKRTKolT6Kf63QH1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qCKnq/btrNwDQpztq/KxPi5IKKRTKolT6Kf63QH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqCKnq%2FbtrNwDQpztq%2FKxPi5IKKRTKolT6Kf63QH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;30&quot; height=&quot;22&quot; data-filename=&quot;leftUpsideDown.jpg&quot; data-origin-width=&quot;43&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swap left joystick and arrow buttons position up and down.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;rightUpsideDown.jpg&quot; data-origin-width=&quot;43&quot; data-origin-height=&quot;31&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yF63o/btrNxev5ptk/Hut74OVg4p58qpOYH3v011/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yF63o/btrNxev5ptk/Hut74OVg4p58qpOYH3v011/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yF63o/btrNxev5ptk/Hut74OVg4p58qpOYH3v011/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyF63o%2FbtrNxev5ptk%2FHut74OVg4p58qpOYH3v011%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;30&quot; height=&quot;22&quot; data-filename=&quot;rightUpsideDown.jpg&quot; data-origin-width=&quot;43&quot; data-origin-height=&quot;31&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swap right joystick and buttons position up and down.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;joystickCenter.png&quot; data-origin-width=&quot;31&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceoU7l/btrNvrQYs7t/B05XkIS2Ua4utUNGqIrTG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceoU7l/btrNvrQYs7t/B05XkIS2Ua4utUNGqIrTG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceoU7l/btrNvrQYs7t/B05XkIS2Ua4utUNGqIrTG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceoU7l%2FbtrNvrQYs7t%2FB05XkIS2Ua4utUNGqIrTG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;30&quot; height=&quot;48&quot; data-filename=&quot;joystickCenter.png&quot; data-origin-width=&quot;31&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Passive Joystick Mode&lt;/span&gt;: Initialize joystick position when clicked (centering).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Active Joystick Mode&lt;/span&gt;: Set whether or not to reset the position (centering) when the joystick is touched up.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Display content by icon color&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 28px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 8.25581%; height: 18px;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gameoff.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtxsr1/btrNDURzwJA/jJMzpcMPVpmcWDKttykrn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtxsr1/btrNDURzwJA/jJMzpcMPVpmcWDKttykrn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtxsr1/btrNDURzwJA/jJMzpcMPVpmcWDKttykrn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdtxsr1%2FbtrNDURzwJA%2FjJMzpcMPVpmcWDKttykrn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;46&quot; height=&quot;34&quot; data-filename=&quot;gameoff.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 41.7443%; height: 18px;&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Disconnected / Passive Joystick Mode&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.7907%; height: 18px;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gameoffac.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DNV4Z/btrNwFayDRO/pofeYVWOnaLRC8MeQdKcW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DNV4Z/btrNwFayDRO/pofeYVWOnaLRC8MeQdKcW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DNV4Z/btrNwFayDRO/pofeYVWOnaLRC8MeQdKcW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDNV4Z%2FbtrNwFayDRO%2FpofeYVWOnaLRC8MeQdKcW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;46&quot; height=&quot;34&quot; data-filename=&quot;gameoffac.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 42.2093%; height: 18px;&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Disconnected / Active Joystick Mode&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 10px;&quot;&gt;
&lt;td style=&quot;width: 8.25581%; height: 10px;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gameon.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FCUvv/btrNB4Urvz3/s0ettb4NxB1qe6lcx6GNr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FCUvv/btrNB4Urvz3/s0ettb4NxB1qe6lcx6GNr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FCUvv/btrNB4Urvz3/s0ettb4NxB1qe6lcx6GNr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFCUvv%2FbtrNB4Urvz3%2Fs0ettb4NxB1qe6lcx6GNr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;46&quot; height=&quot;34&quot; data-filename=&quot;gameon.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 41.7443%; height: 10px;&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Connected / Passive Joystick Mode&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 7.7907%; height: 10px;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gameonac.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;34&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFFWnp/btrNAxbvvBb/z2uBvzkiOKk7Ww2ZZKeMY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFFWnp/btrNAxbvvBb/z2uBvzkiOKk7Ww2ZZKeMY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFFWnp/btrNAxbvvBb/z2uBvzkiOKk7Ww2ZZKeMY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFFWnp%2FbtrNAxbvvBb%2Fz2uBvzkiOKk7Ww2ZZKeMY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;46&quot; height=&quot;34&quot; data-filename=&quot;gameonac.png&quot; data-origin-width=&quot;46&quot; data-origin-height=&quot;34&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 42.2093%; height: 10px;&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Connected / Active Joystick Mode&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Left arrow button: works as a push or toggle propertys.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Group options for toggle properties: Only one of the buttons in a group will be in the ON state.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Single operation per button - All buttons can be turned ON.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Work with two groups of up/down and left/right.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4: 4 buttons work as a group.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- button value&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;UP: Toggle on(11)/off(10), Push down(11)/up(10)&lt;br /&gt;LEFT: Toggle on(21)/off(20), Push down(21)/up(20)&lt;br /&gt;RIGHT: Toggle on(31)/off(30), Push down(31)/up(30)&lt;br /&gt;DOWN: Toggle on(41)/off(40), Push down(41)/up(40)&lt;br /&gt;CENTER: 210&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Right button: works with push or toggle properties&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- button value&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Y: Toggle on(51)/off(50), Push down(51)/up(50)&lt;br /&gt;X: Toggle on(61)/off(60), Push down(61)/up(60)&lt;br /&gt;B: Toggle on(71)/off(70), Push down(71)/up(70)&lt;br /&gt;A: Toggle on(81)/off(80), Push down(81)/up(80)&lt;br /&gt;CENTER: 220&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 12 pcs buttons of middle: works as a push or toggle properties.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chklnj/btrNv7YQNFN/ZoSDdrgRHx04xdmRtbab11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chklnj/btrNv7YQNFN/ZoSDdrgRHx04xdmRtbab11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chklnj/btrNv7YQNFN/ZoSDdrgRHx04xdmRtbab11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchklnj%2FbtrNv7YQNFN%2FZoSDdrgRHx04xdmRtbab11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;264&quot; data-filename=&quot;edited_BUTTONRARE.jpg&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Group button: can set the button display and label in the popped up connection window.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- button value&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;M: Toggle on(91)/off(90), Push down(91)/up(90)&lt;br /&gt;L: Toggle on(101)/off(100), Push down(101)/up(100)&lt;br /&gt;Button 1: Toggle on(111)/off(110), Push down(111)/up(110)&lt;br /&gt;Button 2: Toggle on(121)/off(120), Push down(121)/up(120)&lt;br /&gt;Button 3: Toggle on(131)/off(130), Push down(131)/up(130)&lt;br /&gt;Button 4: Toggle on(141)/off(140), Push down(141)/up(140)&lt;br /&gt;Button 5: Toggle on(151)/off(150), Push down(151)/up(150)&lt;br /&gt;Button 6: Toggle on(161)/off(160), Push down(161)/up(160)&lt;br /&gt;LB: Toggle on(171)/off(170), Push down(171)/up(170)&lt;br /&gt;LT: Toggle on(181)/off(180), Push down(181)/up(180)&lt;br /&gt;RB: Toggle on(191)/off(190), Push down(191)/up(190)&lt;br /&gt;RT: Toggle on(201)/off(200), Push down(201)/up(200)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** All buttons in the push property are short touched and send only the pushed value.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Left Joystick: ID(0), Heading(0 ~ 359) / Strength value transmission.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Right Joystick: ID(1), Heading(0 ~ 359) / Strength value transmission.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** In the case of the Active Joystick Option, the value is continuously transmitted at the specified time interval, and in the case of the Passive Joystick Option, the value is transmitted only during touch-up.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Gravity sensor controller:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transmits forward/backward/left/right tilt of the mobile phone as ID(2), Heading(0 ~ 359) / Strength value per set interval (Default: 180ms).&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sensorArea.jpg&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vJHOk/btrNv9oXnd1/LzYeQTroItf86xzE5XtH9k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vJHOk/btrNv9oXnd1/LzYeQTroItf86xzE5XtH9k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vJHOk/btrNv9oXnd1/LzYeQTroItf86xzE5XtH9k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvJHOk%2FbtrNv9oXnd1%2FLzYeQTroItf86xzE5XtH9k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;297&quot; height=&quot;93&quot; data-filename=&quot;sensorArea.jpg&quot; data-origin-width=&quot;297&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gravity sensor icon indication by color&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.2946%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;grvoff.png&quot; data-origin-width=&quot;50&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv0l4q/btrNB5y3nNi/Tw436dCHkybaBj4JkL7a7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv0l4q/btrNB5y3nNi/Tw436dCHkybaBj4JkL7a7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv0l4q/btrNB5y3nNi/Tw436dCHkybaBj4JkL7a7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv0l4q%2FbtrNB5y3nNi%2FTw436dCHkybaBj4JkL7a7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;50&quot; height=&quot;28&quot; data-filename=&quot;grvoff.png&quot; data-origin-width=&quot;50&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 25.0388%;&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Sensor Off&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.7597%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;grvon.png&quot; data-origin-width=&quot;50&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dafDbq/btrNzEhFNiu/pLJNZ0rSuRokPD5OKhnkH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dafDbq/btrNzEhFNiu/pLJNZ0rSuRokPD5OKhnkH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dafDbq/btrNzEhFNiu/pLJNZ0rSuRokPD5OKhnkH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdafDbq%2FbtrNzEhFNiu%2FpLJNZ0rSuRokPD5OKhnkH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;50&quot; height=&quot;28&quot; data-filename=&quot;grvon.png&quot; data-origin-width=&quot;50&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 24.5737%;&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Sensor On&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 8.52716%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;grvact.png&quot; data-origin-width=&quot;50&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qqgD8/btrNzEhFNiG/oVDCKclf8fsmvMI3fehNy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qqgD8/btrNzEhFNiG/oVDCKclf8fsmvMI3fehNy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qqgD8/btrNzEhFNiG/oVDCKclf8fsmvMI3fehNy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqqgD8%2FbtrNzEhFNiG%2FoVDCKclf8fsmvMI3fehNy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;50&quot; height=&quot;28&quot; data-filename=&quot;grvact.png&quot; data-origin-width=&quot;50&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 24.8062%;&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Sensor On &amp;amp; Active&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gravity sensor&lt;span class=&quot;notranslate&quot;&gt;&amp;nbsp;Active&amp;nbsp;&lt;/span&gt;area: After the gravity sensor is turned on, it operates when it is between 0 degrees and about 30 degrees, and transmits the value based on the position when it is first operated.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;activeArea.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgDjuQ/btrOqEvrkxJ/hef0Ecjj9ATtWk3H0OKtuK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgDjuQ/btrOqEvrkxJ/hef0Ecjj9ATtWk3H0OKtuK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgDjuQ/btrOqEvrkxJ/hef0Ecjj9ATtWk3H0OKtuK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgDjuQ%2FbtrOqEvrkxJ%2Fhef0Ecjj9ATtWk3H0OKtuK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;activeArea.jpg&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;SCREEN ROTATION&lt;/span&gt;: Rotates the phone's screen 180 degrees.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;DIRECTION&lt;/span&gt;: 8 directions display&lt;span class=&quot;notranslate&quot;&gt;(8-point)&lt;/span&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Can set whether to display the gravity sensor controller on the option setting screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Wireless connection information, long click - Display connection information. (only works when connected and display option is enabled)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9. blinker indication of a timer for sending &quot;0xF5 or %%F5&quot;, click - timer ON/OFF. (works only in connected state)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10. Displays the text received from Arduino.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pop-up window for Connection / Button Settings&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectionPopUp.jpg&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QnfFi/btrNvOyzTC1/NNoEx9zwxrInzpzAp5kiYk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QnfFi/btrNvOyzTC1/NNoEx9zwxrInzpzAp5kiYk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QnfFi/btrNvOyzTC1/NNoEx9zwxrInzpzAp5kiYk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQnfFi%2FbtrNvOyzTC1%2FNNoEx9zwxrInzpzAp5kiYk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;280&quot; data-filename=&quot;connectionPopUp.jpg&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Shows if Wi-Fi is on or off and connect to Arduino via Wi-Fi.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Bluetooth connection button.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Whether or not the group button is displayed&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;4. BLEC&lt;/span&gt;: If you want to connect using a specific Custom UUID when connecting to BLE(Bluetooth 4.0).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* In the general case, you can connect without specifying a custom UUID.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Toggle (Check) and push (Uncheck) setting of all buttons.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Label settings for group buttons&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Option setting screen&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KqFEY/btrNvOFSjH4/dONrxKRB2gUnb5P1Nsz9Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KqFEY/btrNvOFSjH4/dONrxKRB2gUnb5P1Nsz9Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KqFEY/btrNvOFSjH4/dONrxKRB2gUnb5P1Nsz9Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKqFEY%2FbtrNvOFSjH4%2FdONrxKRB2gUnb5P1Nsz9Ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;88&quot; data-filename=&quot;edited_arrowButtonGroup.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set Toggle Property of a group for Left Arrow Button&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1: Assign each button as a group.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2: Specify in two groups: top/bottom and left/right.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4: 4 buttons assigned as a group.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m5Mpt/btrNvqrBUpz/jjxoxEEFjXw6riMcBBZcM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m5Mpt/btrNvqrBUpz/jjxoxEEFjXw6riMcBBZcM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m5Mpt/btrNvqrBUpz/jjxoxEEFjXw6riMcBBZcM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm5Mpt%2FbtrNvqrBUpz%2FjjxoxEEFjXw6riMcBBZcM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;198&quot; data-filename=&quot;edited_joystickInfo.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Joystick Settings Information&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Show value&lt;/span&gt;: Display joystick heading and strength or joystick 8 directions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Direction check&lt;/span&gt;: display 8 direction according to heading of joystick.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Direction uncheck&lt;/span&gt;: display values of joystick heading and strength.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Strength Adjust uncheck&lt;/span&gt;: The joystick has a value in the range of 0 to 45/50 according to the resolution of the mobile phone, and the value obtained by subtracting the Zero Range from that value is transmitted as the strength value.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Strength Adjust check&lt;/span&gt;: Regardless of the resolution of the mobile phone, it is converted into a value between 0 and 10 and transmitted it as a strength value.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Max.Strength&lt;/span&gt;: The value when Strength Adjust is checked is 10, and when it is not checked, it is the value obtained by subtracting Zero Range from 45/50.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Zero Range&lt;/span&gt;: Set the range where the strength of the joystick becomes 0. (enter a value from 0 to 35)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FS3fz/btrNAynMWI7/VxcveuzdLG067oRPqc9Wak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FS3fz/btrNAynMWI7/VxcveuzdLG067oRPqc9Wak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FS3fz/btrNAynMWI7/VxcveuzdLG067oRPqc9Wak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFS3fz%2FbtrNAynMWI7%2FVxcveuzdLG067oRPqc9Wak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;190&quot; height=&quot;98&quot; data-filename=&quot;edited_jostickMode.jpg&quot; data-origin-width=&quot;190&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Active: Active / Passive&lt;/span&gt;&amp;nbsp;Joystick Settings&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Active check&lt;/span&gt;: Transmits the value of the joystick at specified intervals. (&lt;span class=&quot;notranslate&quot;&gt;Default: 40 milliseconds&lt;/span&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Active uncheck(Passive Joystick)&lt;/span&gt;: it only transmit the value when the joystick is released.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_save.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IlCSl/btrNvOlzlUP/XINfKD7rrjBl17p25uH2B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IlCSl/btrNvOlzlUP/XINfKD7rrjBl17p25uH2B1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IlCSl/btrNvOlzlUP/XINfKD7rrjBl17p25uH2B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIlCSl%2FbtrNvOlzlUP%2FXINfKD7rrjBl17p25uH2B1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;60&quot; data-filename=&quot;edited_save.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Open folder Icon: Display file list in designated path (Download/) and read selected data (txt) file.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Backup&lt;/span&gt;: Back up app settings and save them to path (Download)/Config.pwm.txt file.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In Android's API 29 or lower, it is saved as Config.pwm.txt in the internal storage and the designated path.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;backup.jpg&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dI1W3q/btrNv1dSJjU/kaBnZqyln17CbCvElyel6k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dI1W3q/btrNv1dSJjU/kaBnZqyln17CbCvElyel6k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dI1W3q/btrNv1dSJjU/kaBnZqyln17CbCvElyel6k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdI1W3q%2FbtrNv1dSJjU%2FkaBnZqyln17CbCvElyel6k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;278&quot; height=&quot;74&quot; data-filename=&quot;backup.jpg&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Recovery&lt;/span&gt;: Restore backed up settings.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;load.jpg&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vL5DF/btrNCgUFQWv/2UWPOXK7ckp8tnzJOkQrdK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vL5DF/btrNCgUFQWv/2UWPOXK7ckp8tnzJOkQrdK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vL5DF/btrNCgUFQWv/2UWPOXK7ckp8tnzJOkQrdK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvL5DF%2FbtrNCgUFQWv%2F2UWPOXK7ckp8tnzJOkQrdK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;278&quot; height=&quot;60&quot; data-filename=&quot;load.jpg&quot; data-origin-width=&quot;278&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Share icon: Attach Config.pwm.txt file to SNS (Email, etc.).&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sns.jpg&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/16RaQ/btrNAMM4uaO/0kZG2qOkmi7w6PXHkx1bIK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/16RaQ/btrNAMM4uaO/0kZG2qOkmi7w6PXHkx1bIK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/16RaQ/btrNAMM4uaO/0kZG2qOkmi7w6PXHkx1bIK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F16RaQ%2FbtrNAMM4uaO%2F0kZG2qOkmi7w6PXHkx1bIK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;153&quot; data-filename=&quot;sns.jpg&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/du90Fo/btrNzFtUuis/hjv9DkhVnj66z5TFwXZLY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/du90Fo/btrNzFtUuis/hjv9DkhVnj66z5TFwXZLY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/du90Fo/btrNzFtUuis/hjv9DkhVnj66z5TFwXZLY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdu90Fo%2FbtrNzFtUuis%2Fhjv9DkhVnj66z5TFwXZLY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;83&quot; data-filename=&quot;edited_readOption.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;83&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Read data from arduino&lt;/span&gt;: Set whether or not using of the timer to send Check(0xF5) for reflecting values independently changed on Arduino without specific operations (buttons and SeekBar) of the app.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Reading Interval&lt;/span&gt;: Interval of timer to send Check(0xF5).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_heaptic.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1E5mF/btrNv0F3AtH/xD8Kbq3vk6xdKmFeEQ6ICK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1E5mF/btrNv0F3AtH/xD8Kbq3vk6xdKmFeEQ6ICK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1E5mF/btrNv0F3AtH/xD8Kbq3vk6xdKmFeEQ6ICK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1E5mF%2FbtrNv0F3AtH%2FxD8Kbq3vk6xdKmFeEQ6ICK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;60&quot; data-filename=&quot;edited_heaptic.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Beep&lt;/span&gt;: Outputs a beep when a button or Joystick is touched.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;VIB&lt;/span&gt;: Vibrate on touch of buttons and Joystick.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Echo Color&lt;/span&gt;: In the case of a button with a label, set whether or not the text color is changed when echo data is received.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Save BT &amp;amp; JOY State&lt;/span&gt;: Saving transmission values of button and joystick.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdbpG1/btrNAyA3EK5/THT1weCOZ2RijzqbiAiBa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdbpG1/btrNAyA3EK5/THT1weCOZ2RijzqbiAiBa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdbpG1/btrNAyA3EK5/THT1weCOZ2RijzqbiAiBa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdbpG1%2FbtrNAyA3EK5%2FTHT1weCOZ2RijzqbiAiBa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;226&quot; data-filename=&quot;edited_protocol.jpg&quot; data-origin-width=&quot;489&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol header settings&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Button: &quot;F0&quot; - Bluetooth: 0xF0, WiFi: &quot;%%F0&quot;&lt;br /&gt;Joystick: &quot;F3&quot; - Bluetooth: 0xF3, WiFi: &quot;%%F3&quot;&lt;br /&gt;String: &quot;F4&quot; - Bluetooth: 0xF4, WiFi: &quot;%%F4&quot;&lt;br /&gt;Footer: &quot;F1&quot; - Bluetooth: 0xF1, WiFi: &quot;%%F1&quot;&lt;br /&gt;Echo: &quot;E1&quot; - Bluetooth: 0xE1, WiFi: &quot;%%E1&quot;&lt;br /&gt;Check: &quot;F5&quot; - Bluetooth: 0xF5, WiFi: &quot;%%F5&quot;&lt;br /&gt;Connect: &quot;F8&quot; - Bluetooth: 0xF8, WiFi: &quot;%%F8&quot;&lt;br /&gt;Option: &quot;F9&quot; - Bluetooth: 0xF9, WiFi: &quot;%%F9&quot;&lt;br /&gt;Wifi add: &quot;%%&quot; - WiFi: &quot;%%&quot; + &quot;Header&quot;&lt;br /&gt;DB clear&lt;/span&gt;: Initialize all data of the app&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Save &amp;amp; Back&lt;/span&gt;: Save and return to main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connect to Arduino&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Bluetooth Classic:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Bluetooth pairing&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Select the module you want to connect on the Bluetooth setting screen of your mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearing.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blu7i6/btrNwCYZdiL/N4QJk5mEywV9v7ZOytSlk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blu7i6/btrNwCYZdiL/N4QJk5mEywV9v7ZOytSlk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blu7i6/btrNwCYZdiL/N4QJk5mEywV9v7ZOytSlk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblu7i6%2FbtrNwCYZdiL%2FN4QJk5mEywV9v7ZOytSlk1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;376&quot; data-filename=&quot;bluePearing.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Depending on the module, input the password when requesting the pairing password and click the confirm when the connection message is output as shown below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JOm1q/btrNxa80Jsj/3bdftLYix4Hh0LG8cQKbo1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JOm1q/btrNxa80Jsj/3bdftLYix4Hh0LG8cQKbo1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JOm1q/btrNxa80Jsj/3bdftLYix4Hh0LG8cQKbo1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJOm1q%2FbtrNxa80Jsj%2F3bdftLYix4Hh0LG8cQKbo1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;264&quot; data-filename=&quot;bluePearingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bluetooth pairing complete&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxsL4i/btrNxauo3DK/mlVTKnby4UB9dBkgkzgeM1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxsL4i/btrNxauo3DK/mlVTKnby4UB9dBkgkzgeM1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxsL4i/btrNxauo3DK/mlVTKnby4UB9dBkgkzgeM1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxsL4i%2FbtrNxauo3DK%2FmlVTKnby4UB9dBkgkzgeM1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;121&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Bluetooth 2.0 Search and Connection in App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth icon in the app and select Bluetooth 2.0 in Select Ver.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth button and select the module name you want to connect.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluetooth.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;606&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpG5Sc/btrNyDb91k1/F3gZny6DgU3oSkKpZCkvgK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpG5Sc/btrNyDb91k1/F3gZny6DgU3oSkKpZCkvgK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpG5Sc/btrNyDb91k1/F3gZny6DgU3oSkKpZCkvgK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpG5Sc%2FbtrNyDb91k1%2FF3gZny6DgU3oSkKpZCkvgK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;485&quot; data-filename=&quot;bluetooth.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Bluetooth BLE:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For BLE, Bluetooth pairing is not required.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;An error message is displayed when Bluetooth pairing is attempted with the BLE module.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In case of the ESP32 module, if the same mac address is registered as Bluetooth Classic, it is recommended first to unpair it and connect it to the ESP32 BLE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Select Bluetooth 4.0 in Select Ver and then select the BLE module to connect.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;adupad_ble.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NCzLH/btrT4R9ZDra/8SmzyEf0K8EvbXBrDjYR1K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NCzLH/btrT4R9ZDra/8SmzyEf0K8EvbXBrDjYR1K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NCzLH/btrT4R9ZDra/8SmzyEf0K8EvbXBrDjYR1K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNCzLH%2FbtrT4R9ZDra%2F8SmzyEf0K8EvbXBrDjYR1K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;290&quot; data-filename=&quot;adupad_ble.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Wifi:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A. Direct connection to Access Point of Arduino Wi-Fi module&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Select the name of Wi-Fi module on your phone's Wi-Fi connection screen.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wifiChange.jpg&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9pC2A/btrNv8D7sKw/uOQEbA28VapSGMtTjR3cok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9pC2A/btrNv8D7sKw/uOQEbA28VapSGMtTjR3cok/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9pC2A/btrNv8D7sKw/uOQEbA28VapSGMtTjR3cok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9pC2A%2FbtrNv8D7sKw%2FuOQEbA28VapSGMtTjR3cok%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;463&quot; data-filename=&quot;wifiChange.jpg&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Check that the app's wifi connection name is the name of Wi-Fi module (e.g. Esp32).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Connect to the specified Access Point IP: 192.168.4.1.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wifiAP.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0f5Go/btrNwFn0196/BE0l3nc2VWyAQeDqpippt1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0f5Go/btrNwFn0196/BE0l3nc2VWyAQeDqpippt1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0f5Go/btrNwFn0196/BE0l3nc2VWyAQeDqpippt1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0f5Go%2FbtrNwFn0196%2FBE0l3nc2VWyAQeDqpippt1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;144&quot; data-filename=&quot;wifiAP.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B. Connection through a router&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If the Wi-Fi module of Arduino is connected to a router (eg skynet) and the IP assigned by the router (eg 192.168.1.6) is known, connect to the assigned IP.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wifigong.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqlhtF/btrNxaBfXbh/baBWG9mJJqRuCPjs6XIDG1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqlhtF/btrNxaBfXbh/baBWG9mJJqRuCPjs6XIDG1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqlhtF/btrNxaBfXbh/baBWG9mJJqRuCPjs6XIDG1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqlhtF%2FbtrNxaBfXbh%2FbaBWG9mJJqRuCPjs6XIDG1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;144&quot; data-filename=&quot;wifigong.jpg&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;update.png&quot; data-origin-width=&quot;32&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yk5GC/btrRFfTDsUq/O7TB8IAuNjYgAt2yoVQpp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yk5GC/btrRFfTDsUq/O7TB8IAuNjYgAt2yoVQpp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yk5GC/btrRFfTDsUq/O7TB8IAuNjYgAt2yoVQpp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYk5GC%2FbtrRFfTDsUq%2FO7TB8IAuNjYgAt2yoVQpp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;32&quot; height=&quot;32&quot; data-filename=&quot;update.png&quot; data-origin-width=&quot;32&quot; data-origin-height=&quot;32&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If you click the icon displayed after connecting to the Wi-Fi or Bluetooth module, 0xF5 or &quot;%%F5&quot; is transmitted for checking whether there is a new value or not in Arduino.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;SE-eeae2df4-4cad-428a-903b-d2aa5e6a49db&quot; data-ke-size=&quot;size23&quot;&gt;Protocol for remote control&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Send Data From App To Arduino&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Bluetooth Classic:&lt;br /&gt;Button: 0xF0 + 1byte Num + 0xF1&lt;br /&gt;Joystick: 0xF3 + 1byte Num(id) + 2byte Num(heading) + 1byte Num(strength) + 0xF1&lt;br /&gt;Connection: 0xF8 + &quot;connect&quot; + \n&lt;br /&gt;Disconnction: 0xF8 + &quot;disconnect&quot; + \n&lt;br /&gt;Text: Text + Endline Option(None / '\n' / '\r' / &quot;\r\n&quot;)&lt;br /&gt;Check: 0xF5&lt;br /&gt;&lt;br /&gt;- Bluetooth BLE:&lt;br /&gt;Button: 0xF0 + 1byte Num + 0xF1&lt;br /&gt;Joystick: 0xF3 + 1byte Num(id) + 2byte Num(heading) + 1byte Num(strength) + 0xF1&lt;br /&gt;Connection: &quot;%%F8&quot; + &quot;connect&quot; + \n&lt;br /&gt;Disconnction: &quot;%%F8&quot; + &quot;disconnect&quot; + \n&lt;br /&gt;Text: Text + Endline Option(None / '\n' / '\r' / &quot;\r\n&quot;)&lt;br /&gt;Check: 0xF5&lt;br /&gt;&lt;br /&gt;- Wifi (String)&lt;br /&gt;Button: %%F0 + Value + %%F1&lt;br /&gt;Joystick: %%F3 + Joystic ID + Count + %% + Heading + %% + Strength + %%F1&lt;br /&gt;Connection: %%F8 + connect + \n&lt;br /&gt;Disconnction: %%F8 + disconnect + \n&lt;br /&gt;Text Send: String + Endline Option(None / '\n' / '\r' / &quot;\r\n&quot;)&lt;br /&gt;Check: %%F5&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Recieve Data From Arduino To App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Bluetooth Classic:&lt;br /&gt;///////////////////////////////////////// ESSENTIAL (0xF0, 0xF3,0xF4)&lt;br /&gt;Button State: 0xF0 + 1byte Num + 0xF1&lt;br /&gt;Joystick State: 0xF3 + 1byte Num + 2byte Num + 1byte Num + 0xF1&lt;br /&gt;Button Echo: 0xF0 + 1byte Num + 0xE1&lt;br /&gt;Joystick Echo: 0xF3 + 1byte Num + 2byte Num + 1byte Num + 0xE1&lt;br /&gt;Text: 0xF4 + Text + 0xF1&lt;br /&gt;///////////////////////////////////////// CONNECTION (0xF8)&lt;br /&gt;send Disconnect: 0xF8 + 0x01 + 0x00&lt;br /&gt;request Pass: 0xF8 + 0x02 + 1byte Num(length) + &quot;Pass Name&quot;&lt;br /&gt;response Pass: 0xF8 + 0x03 + 1byte Num&lt;br /&gt;send Message: 0xF8 + 0x04 + String + 0xF1&lt;br /&gt;///////////////////////////////////////// OPTION (0xF9)&lt;br /&gt;set Active Joystic: 0xF9 + 0x01 + 1byte Num + 0x00&lt;br /&gt;set Joystick Interval: 0xF9 + 0x02 + 2byte Num&lt;br /&gt;set Joy Zero Range: 0xF9 + 0x03 + 1byte Num + 0x00&lt;br /&gt;set Joy Strength Adjust: 0xF9 + 0x04 + 1byte Num + 0x00&lt;br /&gt;set Request: 0xF9 + 0x05 + 1byte Num + 0x00&lt;br /&gt;set Request Interval: 0xF9 + 0x06 + 2byte Num&lt;br /&gt;set Left Pad Mode: 0xF9 + 0x07 + 1byte Num + 0x00&lt;br /&gt;set Joy Way4: 0xF9 + 0x08 + 1byte Num + 0x00&lt;br /&gt;set Display Add Button: 0xF9 + 0x09 + 1byte Num + 0x00&lt;br /&gt;set SSID Label Mode: 0xF9 + 0x0A + 1byte Num + 0x00&lt;br /&gt;use Gravity And Interval: 0xF9 + 0x0B + 2byte Num&lt;br /&gt;set Add Button Label: 0xF9 + 0x0C + String + 0xF1&lt;br /&gt;set Left Pad Or All Toggle: 0xF9 + 0x0D + String + 0xF1&lt;br /&gt;set Right Pad Toggle: 0xF9 + 0x0E + String + 0xF1&lt;br /&gt;set Button Toggle: 0xF9 + 0x0F + String + 0xF1&lt;br /&gt;dialog Radio: 0xF9 + 0x10 + &quot;RAD:&quot; + String + 0xF1&lt;br /&gt;dialog Checkbox: 0xF9 + 0x10 + &quot;CKB:&quot; + String + 0xF1&lt;br /&gt;dialog Choose: 0xF9 + 0x10 + &quot;CHD:&quot; + String + 0xF1&lt;br /&gt;dialog List: 0xF9 + 0x10 + &quot;LSD:&quot; + String + 0xF1&lt;br /&gt;dialog Input: 0xF9 + 0x10 + &quot;STR:&quot; + String + 0xF1&lt;br /&gt;&lt;br /&gt;- Bluetooth BLE:&lt;br /&gt;///////////////////////////////////////// ESSENTIAL (0xF0, 0xF3,0xF4)&lt;br /&gt;Button State: 0xF0 + 1byte Num + 0xF1&lt;br /&gt;Joystick State: 0xF3 + 1byte Num + 2byte Num + 1byte Num + 0xF1&lt;br /&gt;Button Echo: 0xF0 + 1byte Num + 0xE1&lt;br /&gt;Joystick Echo: 0xF3 + 1byte Num + 2byte Num + 1byte Num + 0xE1&lt;br /&gt;Text: 0xF4 + Text + 0xE1/F1&lt;br /&gt;///////////////////////////////////////// CONNECTION (0xF8)&lt;br /&gt;send Disconnect: 0xF8 + 0x01 + 0x00&lt;br /&gt;request Pass: 0xF8 + 0x02 + 1byte Num(length) + &quot;Pass Name&quot;&lt;br /&gt;response Pass: 0xF8 + 0x03 + 1byte Num&lt;br /&gt;send Message: 0xF8 + 0x04 + String + 0xF1&lt;br /&gt;///////////////////////////////////////// OPTION (0xF9)&lt;br /&gt;set Active Joystic: 0xF9 + 0x01 + 1byte Num + 0x00&lt;br /&gt;set Joystick Interval: 0xF9 + 0x02 + 2byte Num&lt;br /&gt;set Joy Zero Range: 0xF9 + 0x03 + 1byte Num + 0x00&lt;br /&gt;set Joy Strength Adjust: 0xF9 + 0x04 + 1byte Num + 0x00&lt;br /&gt;set Left Pad Mode: 0xF9 + 0x05 + 1byte Num + 0x00&lt;br /&gt;set Joy Way4: 0xF9 + 0x06 + 1byte Num + 0x00&lt;br /&gt;set Display Add Button: 0xF9 + 0x07 + 1byte Num + 0x00&lt;br /&gt;set SSID Label Mode: 0xF9 + 0x08 + 1byte Num + 0x00&lt;br /&gt;use Gravity And Interval: 0xF9 + 0x09 + 2byte Num&lt;br /&gt;set Add Button Label: 0xF9 + 0x0A + String + 0xF1&lt;br /&gt;set Left Pad Or All Toggle: 0xF9 + 0x0B + String + 0xF1&lt;br /&gt;set Right Pad Toggle: 0xF9 + 0x0C + String + 0xF1&lt;br /&gt;set Button Toggle: 0xF9 + 0x0D + String + 0xF1&lt;br /&gt;dialog Radio: 0xF9 + 0x0E + &quot;RAD:&quot; + String + 0xF1&lt;br /&gt;dialog Checkbox: 0xF9 + 0x0E + &quot;CKB:&quot; + String + 0xF1&lt;br /&gt;dialog Choose: 0xF9 + 0x0E + &quot;CHD:&quot; + String + 0xF1&lt;br /&gt;dialog List: 0xF9 + 0x0E + &quot;LSD:&quot; + String + 0xF1&lt;br /&gt;dialog Input: 0xF9 + 0x0E + &quot;STR:&quot; + String + 0xF1&lt;br /&gt;&lt;br /&gt;- Wifi (String):&lt;br /&gt;///////////////////////////////////////// ESSENTIAL (%%F0, %%F3, %%F4)&lt;br /&gt;1. Button State: %%F0 + Value + %%F1 + '\n'&lt;br /&gt;2. Joystick State: %%F3 + Joystic ID + %% + Heading + %% + Strength + %%F1 + '\n'&lt;br /&gt;3. Button Echo: %%F0 + Value + %%E1 + '\n'&lt;br /&gt;4. Joystick Echo: %%F3 + Joystic ID + %% + Heading + %% + Strength + %%E1 + '\n'&lt;br /&gt;5. Text: %%F4 + Text + %%F1 + '\n'&lt;br /&gt;///////////////////////////////////////// CONNECTION (%%F8)&lt;br /&gt;6. send Disconnect: %%F8 + DIS + '\n'&lt;br /&gt;7. request Pass: %%F8 + &quot;bool&quot; + &quot;Pass Name&quot; + '\n'&lt;br /&gt;8. response Pass: %%F8 + RES: + &quot;Cookie or bool&quot; + '\n'&lt;br /&gt;9. send Wifi Info: %%F8 + INF: + String + '\n'&lt;br /&gt;10. send Message: %%F8 + MES: + String + '\n'&lt;br /&gt;11. response Fail Resend: %%F8 + RFR: + &quot;bool&quot; + '\n'&lt;br /&gt;///////////////////////////////////////// OPTION (%%F9)&lt;br /&gt;12. set Active Joystick: %%F9 + ACT: + &quot;bool&quot; + '\n'&lt;br /&gt;13. set Joystick Interval: %%F9 + JSI: + &quot;value&quot; + '\n'&lt;br /&gt;14. set Joy Zero Range: %%F9 + JZR: + &quot;value&quot; + '\n'&lt;br /&gt;15. set Joy Strength Adjust: %%F9 + ADJ: + &quot;bool&quot; + '\n'&lt;br /&gt;16. set Request: %%F9 + REQ: + &quot;bool&quot; + '\n'&lt;br /&gt;17. set Request Interval: %%F9 + INT: + &quot;value&quot; + '\n'&lt;br /&gt;18. set Left Pad Mode: %%F9 + LPM: + &quot;value&quot; + '\n'&lt;br /&gt;19. set Joy Way4: %%F9 + SJW: + &quot;value&quot; + '\n'&lt;br /&gt;20. set Display Add Button: %%F9 + DAB: + &quot;value&quot; + '\n'&lt;br /&gt;21. set SSID Label Mode: %%F9 + SLM: + &quot;value&quot; + '\n'&lt;br /&gt;22. use Gravity And Interval: %%F9 + UGI: + &quot;value&quot; + '\n'&lt;br /&gt;23. set Add Button Label: %%F9 + ABL: + &quot;String&quot; + '\n'&lt;br /&gt;24. set Left Pad Or All Toggle: %%F9 + LTG: + &quot;String&quot; + '\n'&lt;br /&gt;25. set Right Pad Toggle: %%F9 + RTG: + &quot;String&quot; + '\n'&lt;br /&gt;26. set Button Toggle: %%F9 + BTG: + &quot;String&quot; + '\n'&lt;br /&gt;27. dialog Radio: %%F9 + RAD: + &quot;String&quot; + '\n'&lt;br /&gt;28. dialog Checkbox: %%F9 + CKB: + &quot;String&quot; + '\n'&lt;br /&gt;29. dialog Choose: %%F9 + CHD: + &quot;String&quot; + '\n'&lt;br /&gt;30. dialog List: %%F9 + LSD: + &quot;String&quot; + '\n'&lt;br /&gt;31. dialog Input: %%F9 + STR: + &quot;String&quot; + '\n'&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App items that can be controlled by Arduino according to the protocol&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protocolCont.jpg&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;1277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bogF1F/btrN774naDD/Nq2UxS61PbzOG3FFS8ywP0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bogF1F/btrN774naDD/Nq2UxS61PbzOG3FFS8ywP0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bogF1F/btrN774naDD/Nq2UxS61PbzOG3FFS8ywP0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbogF1F%2FbtrN774naDD%2FNq2UxS61PbzOG3FFS8ywP0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;876&quot; data-filename=&quot;protocolCont.jpg&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;1277&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Other protocol control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;6. send Disconnect&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;disconnect.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRL0aM/btrNwEo77XR/JyTkIS0ZGE4T6RjKs4I6ck/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRL0aM/btrNwEo77XR/JyTkIS0ZGE4T6RjKs4I6ck/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRL0aM/btrNwEo77XR/JyTkIS0ZGE4T6RjKs4I6ck/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRL0aM%2FbtrNwEo77XR%2FJyTkIS0ZGE4T6RjKs4I6ck%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;94&quot; data-filename=&quot;disconnect.jpg&quot; data-origin-width=&quot;517&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;click &quot;Disconnect&quot; button of Wi-Fi and Bluetooth.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;7. request Pass&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dCfonI/btrNwjSU4ek/qzpsNZJ8szFixtZupYrm81/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dCfonI/btrNwjSU4ek/qzpsNZJ8szFixtZupYrm81/img.jpg&quot; data-alt=&quot;Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dCfonI/btrNwjSU4ek/qzpsNZJ8szFixtZupYrm81/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdCfonI%2FbtrNwjSU4ek%2FqzpsNZJ8szFixtZupYrm81%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AlgQu/btrNChMO5y0/OlXlzKGohk0KxPlEKDqbb1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AlgQu/btrNChMO5y0/OlXlzKGohk0KxPlEKDqbb1/img.jpg&quot; data-alt=&quot;Wifi&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AlgQu/btrNChMO5y0/OlXlzKGohk0KxPlEKDqbb1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAlgQu%2FbtrNChMO5y0%2FOlXlzKGohk0KxPlEKDqbb1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Wifi&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;8. response Pass&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3Jppj/btrNwDX1D2R/WNxenx8H5wRsskJXUqkkH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3Jppj/btrNwDX1D2R/WNxenx8H5wRsskJXUqkkH1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3Jppj/btrNwDX1D2R/WNxenx8H5wRsskJXUqkkH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3Jppj%2FbtrNwDX1D2R%2FWNxenx8H5wRsskJXUqkkH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;41&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;60&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZlXAS/btrNyE28BwQ/aL95fb7K7aHmkkQATGdtq0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZlXAS/btrNyE28BwQ/aL95fb7K7aHmkkQATGdtq0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZlXAS/btrNyE28BwQ/aL95fb7K7aHmkkQATGdtq0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZlXAS%2FbtrNyE28BwQ%2FaL95fb7K7aHmkkQATGdtq0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;9. send Wifi Info&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This code applies only to Wi-Fi and transmits Wi-Fi connection information to use in 21. set SSID Label Mode.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;10. send Message&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwx8WF/btrNwCrauwN/Ay7xTpCZbfrksk3aWJvAPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwx8WF/btrNwCrauwN/Ay7xTpCZbfrksk3aWJvAPk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwx8WF/btrNwCrauwN/Ay7xTpCZbfrksk3aWJvAPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwx8WF%2FbtrNwCrauwN%2FAy7xTpCZbfrksk3aWJvAPk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;11. response Fail Resend&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This code only applies to Wi-Fi and set whether or not to use the function to retransmit if the response to the app's request fails.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false&lt;/span&gt;: Applies only when the Arduino intentionally does not respond to HTTP requests of the app. (e.g. ESP01)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;13. set Joystick Interval&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;21. set SSID Label Mode&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6zn9b/btrNzGfjMB3/tPxJKjRJoPAu5iVPKRZ2S1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6zn9b/btrNzGfjMB3/tPxJKjRJoPAu5iVPKRZ2S1/img.jpg&quot; data-alt=&quot;Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6zn9b/btrNzGfjMB3/tPxJKjRJoPAu5iVPKRZ2S1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6zn9b%2FbtrNzGfjMB3%2FtPxJKjRJoPAu5iVPKRZ2S1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/trwqA/btrNv8xi5RK/xwhkqGultIk5lea96NTkBK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/trwqA/btrNv8xi5RK/xwhkqGultIk5lea96NTkBK/img.jpg&quot; data-alt=&quot;Wifi&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/trwqA/btrNv8xi5RK/xwhkqGultIk5lea96NTkBK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtrwqA%2FbtrNv8xi5RK%2FxwhkqGultIk5lea96NTkBK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;384&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Wifi&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;27. dialog Radio&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCkvj2/btrNzEaK2Cq/k37UrVMef0xPjPmv2mQxhk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCkvj2/btrNzEaK2Cq/k37UrVMef0xPjPmv2mQxhk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCkvj2/btrNzEaK2Cq/k37UrVMef0xPjPmv2mQxhk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCkvj2%2FbtrNzEaK2Cq%2Fk37UrVMef0xPjPmv2mQxhk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;28. dialog Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A4eHl/btrNDUYcQxN/LmKdv9nHUkjrGIsmGC2EcK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A4eHl/btrNDUYcQxN/LmKdv9nHUkjrGIsmGC2EcK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A4eHl/btrNDUYcQxN/LmKdv9nHUkjrGIsmGC2EcK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA4eHl%2FbtrNDUYcQxN%2FLmKdv9nHUkjrGIsmGC2EcK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;29. dialog Choose&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnEkBN/btrNyFHLxyl/KFLXnkvfmDWkDZCAEv7Mc0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnEkBN/btrNyFHLxyl/KFLXnkvfmDWkDZCAEv7Mc0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnEkBN/btrNyFHLxyl/KFLXnkvfmDWkDZCAEv7Mc0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnEkBN%2FbtrNyFHLxyl%2FKFLXnkvfmDWkDZCAEv7Mc0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;30. dialog List&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebxlLy/btrNwo01Sh8/rZ7BXzPsjjgSVd17pjOLDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebxlLy/btrNwo01Sh8/rZ7BXzPsjjgSVd17pjOLDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebxlLy/btrNwo01Sh8/rZ7BXzPsjjgSVd17pjOLDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FebxlLy%2FbtrNwo01Sh8%2FrZ7BXzPsjjgSVd17pjOLDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;294&quot; data-filename=&quot;edited_edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;31. dialog Input&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vLEXd/btrNCfO1Nl1/pyxPB664hdUYW4wLRdkhJk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vLEXd/btrNCfO1Nl1/pyxPB664hdUYW4wLRdkhJk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vLEXd/btrNCfO1Nl1/pyxPB664hdUYW4wLRdkhJk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvLEXd%2FbtrNCfO1Nl1%2FpyxPB664hdUYW4wLRdkhJk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO ESP01 JOYSTICK&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/qUIGxQ3kFGo&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/qUIGxQ3kFGo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/qUIGxQ3kFGo&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/181&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Setting up Wi-Fi module ESP01 and basic code for Arduino remote control&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/183&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - Arduino WiFi remote control with ADUPAD and ESP-01&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/184&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Arduino Basic code for bluetooth remote contol with HC-06&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/186&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - Arduino Bluetooth remote control with ADUPAD and HC-06&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/187&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Arduino Basic code for BLE remote contol with BT05&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/189&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - Arduino BLE remote control with ADUPAD and BT05&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/190&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - ESP32/NodeMcu Basic code for WiFi remote contol&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/192&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ESP32/NodeMcu WiFi remote control with ADUPAD&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/194&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ESP32 Bluetooth remote control with ADUPAD&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/196&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUPAD] - ESP32 BLE remote control with ADUPAD&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUPAD</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/176</guid>
      <comments>https://postpop.tistory.com/176#entry176comment</comments>
      <pubDate>Sat, 1 Oct 2022 16:34:55 +0900</pubDate>
    </item>
    <item>
      <title>ADUCON - Arduino wireless remote control application</title>
      <link>https://postpop.tistory.com/175</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Arduino remote control app using a wireless module available in Arduino.&lt;br /&gt;Bluetooth 2.0 Classic / 4.0 BLE : HC-05, HC-06, HM-10, AT-09, BT05, ESP32, etc.&lt;br /&gt;Wi-Fi : ESP01, ESP8266 NodeMcu, ESP32, etc.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1671217712110&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;ADUCON - Google Play 앱&quot; data-og-description=&quot;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&amp;amp;hl=ko&amp;amp;gl=KR&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.hmi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkSzSa/hyQUUOrymu/F2qZrajZ4oj5PTeHKE2RpK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/buRYWy/hyQU6g2c3o/Tq2RVawizu5F1hrHg7KwQ0/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/cvQ7J0/hyQUXYHiBe/S5kKqrUMqOvhpHPt9aMWq1/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUCON - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;무선(WiFi/Bluetooth/BLE)을 통한 Arduino 원격 제어 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YUf5x/btrVeViqdhY/cgdE59YPIq6NKB7NA8jdqK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YUf5x/btrVeViqdhY/cgdE59YPIq6NKB7NA8jdqK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YUf5x/btrVeViqdhY/cgdE59YPIq6NKB7NA8jdqK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYUf5x%2FbtrVeViqdhY%2FcgdE59YPIq6NKB7NA8jdqK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;57&quot; data-filename=&quot;한글페이지설정.jpg&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;57&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Characteristic&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 15 buttons:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Toggle and push button property setting available.&lt;br /&gt;Button label customization feature.&lt;br /&gt;- 6 SeekBar (slide bar):&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Min and Max value setting available.&lt;br /&gt;Color Picker mode for RGB LED control.&lt;br /&gt;Dial knob mode for PWM control.&lt;br /&gt;- Text transmission and option settings:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;NO: none, NL: new line, CR: carriage return, BOTH: carriage return+new line.&lt;/span&gt;&lt;br /&gt;- floating button:&lt;br /&gt;4 pushbuttons (16, 17, 18, 19).&lt;br /&gt;Button to send system date and time.&lt;br /&gt;Button to send time set value.- Color picker for RGB LED control &lt;br /&gt;- Dial knob for PWM control &lt;br /&gt;- Web viewer for HTML page in Arduino Sketch&lt;br /&gt;- Provides a dialog window to set the control authority using a password &lt;br /&gt;- Provides custom dialog windows (radio box, check box, text input, etc.) &lt;br /&gt;- The screen stays on while the app is running (prevents the screen from turning off)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;Bluetooth&amp;nbsp;and&amp;nbsp;Wi-Fi&amp;nbsp;connection&amp;nbsp;permissions&amp;nbsp;are&amp;nbsp;set&amp;nbsp;according&amp;nbsp;to&amp;nbsp;the&amp;nbsp;latest&amp;nbsp;Android&amp;nbsp;API&amp;nbsp;level. &lt;br /&gt;***&amp;nbsp;If&amp;nbsp;not&amp;nbsp;obtain&amp;nbsp;permission&amp;nbsp;for&amp;nbsp;the&amp;nbsp;API&amp;nbsp;level,&amp;nbsp;the&amp;nbsp;connection&amp;nbsp;will&amp;nbsp;be&amp;nbsp;restricted. &lt;br /&gt;In the case of the older version (advertisement version), permission updates are not performed, so Bluetooth and Wi-Fi connections are limited depending on the Android version.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cl7QTD/btrMINNYmGZ/UkNRqxCISFIt5vrMVxNgF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cl7QTD/btrMINNYmGZ/UkNRqxCISFIt5vrMVxNgF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cl7QTD/btrMINNYmGZ/UkNRqxCISFIt5vrMVxNgF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl7QTD%2FbtrMINNYmGZ%2FUkNRqxCISFIt5vrMVxNgF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;617&quot; data-filename=&quot;edited_ARCON00.jpg&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Top menu&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13.jpg&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coN89H/btrMJ0TiXXG/ppxSpBKZRuDNvVi87UtiPk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coN89H/btrMJ0TiXXG/ppxSpBKZRuDNvVi87UtiPk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coN89H/btrMJ0TiXXG/ppxSpBKZRuDNvVi87UtiPk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoN89H%2FbtrMJ0TiXXG%2FppxSpBKZRuDNvVi87UtiPk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;70&quot; data-filename=&quot;13.jpg&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Name of code for Arduino, click - Show code information.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Blinker of timer for sending &quot;CheckHD(%%F5)&quot;, click - timer ON/OFF (works only in connected state).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Information for wireless connection, long click - Display connection information (only works when connected to Arduino and display option is enabled).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Main menu&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;48.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xQtsd/btrMIWjBCUF/SuT2pC9jrwYqASsMmBx2ak/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xQtsd/btrMIWjBCUF/SuT2pC9jrwYqASsMmBx2ak/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xQtsd/btrMIWjBCUF/SuT2pC9jrwYqASsMmBx2ak/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxQtsd%2FbtrMIWjBCUF%2FSuT2pC9jrwYqASsMmBx2ak%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;85&quot; data-filename=&quot;48.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Wi-Fi ON/OFF display and Set Arduino connection via Wi-Fi.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. Display settings: Button / SeekBar label and main screen display settings.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. Property settings: push and toggle for button / minimum and maximum for SeekBar.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. App settings and storage: button-related color designation and protocol settings.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Bluetooth connection button.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arduino.png&quot; data-origin-width=&quot;40&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biJa0M/btrNn2pM2Pw/hd0RZkZknPsokmC8jokUb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biJa0M/btrNn2pM2Pw/hd0RZkZknPsokmC8jokUb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biJa0M/btrNn2pM2Pw/hd0RZkZknPsokmC8jokUb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiJa0M%2FbtrNn2pM2Pw%2Fhd0RZkZknPsokmC8jokUb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;40&quot; height=&quot;40&quot; data-filename=&quot;arduino.png&quot; data-origin-width=&quot;40&quot; data-origin-height=&quot;40&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Main screen&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_sendText.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fpq5N/btrNonmhGGt/KHBXInHbzzTz6KV4JR880k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fpq5N/btrNonmhGGt/KHBXInHbzzTz6KV4JR880k/img.png&quot; data-alt=&quot;send text&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fpq5N/btrNonmhGGt/KHBXInHbzzTz6KV4JR880k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFpq5N%2FbtrNonmhGGt%2FKHBXInHbzzTz6KV4JR880k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;57&quot; data-filename=&quot;edited_sendText.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;send text&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set transport options: NO(none), NL(new line), CR(carriage return), BOTH(carriage return + new line)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_button.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/O2e2P/btrNomnneOY/uJ9cGg7WPTZMW9NRY1JIck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/O2e2P/btrNomnneOY/uJ9cGg7WPTZMW9NRY1JIck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/O2e2P/btrNomnneOY/uJ9cGg7WPTZMW9NRY1JIck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FO2e2P%2FbtrNomnneOY%2FuJ9cGg7WPTZMW9NRY1JIck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;307&quot; data-filename=&quot;edited_button.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Button: Send specified value according to push/toggle setting&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Toggle button (on/off) 1byte number:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Button1 on(11)/off(10), Button2 on(21)/off(20) ....... Button14 on(141)/off(140), Button15 on(151)/off(150)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;notranslate&quot;&gt;- Push button (down/up) 1byte number:&lt;br /&gt;Button1 down(11)/up(10), Button2 down(21)/up(20) ....... Button14 down(141)/up(140), Button15 down(151)/up(150)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*** Short touch of a push button: send only down value&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_seekbar.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgl8Ae/btrNjT7H2Dd/eLpd5BNdlwOei1hWCcXAp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgl8Ae/btrNjT7H2Dd/eLpd5BNdlwOei1hWCcXAp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgl8Ae/btrNjT7H2Dd/eLpd5BNdlwOei1hWCcXAp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcgl8Ae%2FbtrNjT7H2Dd%2FeLpd5BNdlwOei1hWCcXAp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;283&quot; data-filename=&quot;edited_seekbar.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SeekBar (slide bar): Transmits a specific value through sliding or text box in the set maximum/minimum value area.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In the case of Active Slide Mode, values are continuously transmitted at designated time intervals, and in case of Passive Slide Mode, values are transmitted at touch-up.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_floatingbutton.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFmM1x/btrNjzIjPNm/4vyNiVSgGwqVJZDQ1kVJUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFmM1x/btrNjzIjPNm/4vyNiVSgGwqVJZDQ1kVJUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFmM1x/btrNjzIjPNm/4vyNiVSgGwqVJZDQ1kVJUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFmM1x%2FbtrNjzIjPNm%2F4vyNiVSgGwqVJZDQ1kVJUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;57&quot; data-filename=&quot;edited_floatingbutton.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Floating Button: Sends a specified value, system date/time or specific time value with a push button.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Button16: 161 .. Button19: 191&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arduino_set_c.png&quot; data-origin-width=&quot;40&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLddSM/btrMVb2pSm0/63jHjjbixBQGBZjD2HObGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLddSM/btrMVb2pSm0/63jHjjbixBQGBZjD2HObGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLddSM/btrMVb2pSm0/63jHjjbixBQGBZjD2HObGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLddSM%2FbtrMVb2pSm0%2F63jHjjbixBQGBZjD2HObGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;40&quot; height=&quot;40&quot; data-filename=&quot;arduino_set_c.png&quot; data-origin-width=&quot;40&quot; data-origin-height=&quot;40&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Display settings&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_buttonlabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caejr8/btrNnshdanK/Vx3Zx0KjtPFO7PAxR9ib71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caejr8/btrNnshdanK/Vx3Zx0KjtPFO7PAxR9ib71/img.png&quot; data-alt=&quot;Button and SeekBar label settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caejr8/btrNnshdanK/Vx3Zx0KjtPFO7PAxR9ib71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcaejr8%2FbtrNnshdanK%2FVx3Zx0KjtPFO7PAxR9ib71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;286&quot; data-filename=&quot;edited_buttonlabel.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Button and SeekBar label settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_DPexplain.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yOgI8/btrNlSmV5yf/ZdZz5BavR7tvUdO2pMQuak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yOgI8/btrNlSmV5yf/ZdZz5BavR7tvUdO2pMQuak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yOgI8/btrNlSmV5yf/ZdZz5BavR7tvUdO2pMQuak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyOgI8%2FbtrNlSmV5yf%2FZdZz5BavR7tvUdO2pMQuak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;99&quot; data-filename=&quot;edited_DPexplain.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Web View&lt;/span&gt;: Display the button to move to the web viewer that can display the web page set in Arduino, and is displayed only when connected to Arduino through Wi-Fi.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;webViewicon.jpg&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcWWnB/btrNlatKpGi/RXOveFj9FH3j8HdEQgM8kk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcWWnB/btrNlatKpGi/RXOveFj9FH3j8HdEQgM8kk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcWWnB/btrNlatKpGi/RXOveFj9FH3j8HdEQgM8kk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcWWnB%2FbtrNlatKpGi%2FRXOveFj9FH3j8HdEQgM8kk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;58&quot; data-filename=&quot;webViewicon.jpg&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;webViewex.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqVUrr/btrNihHm6RL/AyLzf1O0PNOWMsZLoBvra0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqVUrr/btrNihHm6RL/AyLzf1O0PNOWMsZLoBvra0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqVUrr/btrNihHm6RL/AyLzf1O0PNOWMsZLoBvra0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqVUrr%2FbtrNihHm6RL%2FAyLzf1O0PNOWMsZLoBvra0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;353&quot; data-filename=&quot;webViewex.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Text Input&lt;/span&gt;: Whether or not the text box is displayed on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Floating Button&lt;/span&gt;: Whether or not the floating button is displayed on the main screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Blue box area: Set when you want to control SeekBar with Color Picker or Pwm Nob.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- DP Main check&lt;/span&gt;: When SeekBar is displayed on both the main screen and the Color Picker or Pwm Nob control screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- DP Main uncheck&lt;/span&gt;: In case the SeekBar is not displayed on the main screen and is displayed only on the Color Picker or Pwm Nob control screen.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D0DTc/btrMYUSVSHA/KSIU7r79nMLaEIs2GdTIU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D0DTc/btrMYUSVSHA/KSIU7r79nMLaEIs2GdTIU1/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;594&quot; data-filename=&quot;colorpicker.jpg&quot; style=&quot;width: 49.4186%; margin-right: 10px;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D0DTc/btrMYUSVSHA/KSIU7r79nMLaEIs2GdTIU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD0DTc%2FbtrMYUSVSHA%2FKSIU7r79nMLaEIs2GdTIU1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vXjdA/btrMXi7IL8i/Q61uOpKkKpkzEfmgCEHsbK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vXjdA/btrMXi7IL8i/Q61uOpKkKpkzEfmgCEHsbK/img.jpg&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;594&quot; data-filename=&quot;dialnob.jpg&quot; style=&quot;width: 49.4186%;&quot; data-widthpercent=&quot;50&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vXjdA/btrMXi7IL8i/Q61uOpKkKpkzEfmgCEHsbK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvXjdA%2FbtrMXi7IL8i%2FQ61uOpKkKpkzEfmgCEHsbK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;594&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Color Picker / Dial Nob&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Add Group&lt;/span&gt;: Add a Group to the Color Picker or Pwm Nob control screen.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* SeekBar of three are displayed as a group. If you want to control them with two groups, change to check.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_button_seekbar_dp.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ncvAR/btrNosntZfP/sX7epO0pVBAMT7CyZvii1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ncvAR/btrNosntZfP/sX7epO0pVBAMT7CyZvii1k/img.png&quot; data-alt=&quot;Button and SeekBar display settings on the main screen&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ncvAR/btrNosntZfP/sX7epO0pVBAMT7CyZvii1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FncvAR%2FbtrNosntZfP%2FsX7epO0pVBAMT7CyZvii1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;239&quot; data-filename=&quot;edited_button_seekbar_dp.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Button and SeekBar display settings on the main screen&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;button_TP_c.png&quot; data-origin-width=&quot;40&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXv3ny/btrMXjFBFnR/NZca135KW5JnR64ulzAI80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXv3ny/btrMXjFBFnR/NZca135KW5JnR64ulzAI80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXv3ny/btrMXjFBFnR/NZca135KW5JnR64ulzAI80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXv3ny%2FbtrMXjFBFnR%2FNZca135KW5JnR64ulzAI80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;40&quot; height=&quot;40&quot; data-filename=&quot;button_TP_c.png&quot; data-origin-width=&quot;40&quot; data-origin-height=&quot;40&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Setting button and SeekBar properties&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_heaptic.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oQysf/btrNi49FjhM/K9R51ppBewquTzv4E6ssS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oQysf/btrNi49FjhM/K9R51ppBewquTzv4E6ssS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oQysf/btrNi49FjhM/K9R51ppBewquTzv4E6ssS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoQysf%2FbtrNi49FjhM%2FK9R51ppBewquTzv4E6ssS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;72&quot; data-filename=&quot;edited_heaptic.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Beep&lt;/span&gt;: Outputs a beep when a button or SeekBar is touched.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;VIB&lt;/span&gt;: Vibrate on touch of buttons and SeekBar.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Floating BT VIB&lt;/span&gt;: Vibrate when touching the floating button.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Echo Text color&lt;/span&gt;: Whether to change text color when echo data is received.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Acitve Slide: Active / Passive&lt;/span&gt;&amp;nbsp;SeekBar settings.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Acitve Slide check&lt;/span&gt;: Transmits the value of SeekBar at specified intervals.&lt;span class=&quot;notranslate&quot;&gt;&amp;nbsp;(Default: 40 millis)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Acitve Slide uncheck(Passive Slide)&lt;/span&gt;: Transmit value only when SeekBar is touched up.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGJHau/btrNn2W0E4g/KDMAUy6Bs44FEJGXaI2Lh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGJHau/btrNn2W0E4g/KDMAUy6Bs44FEJGXaI2Lh0/img.png&quot; data-alt=&quot;Set Max/Min value of SeekBar&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGJHau/btrNn2W0E4g/KDMAUy6Bs44FEJGXaI2Lh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGJHau%2FbtrNn2W0E4g%2FKDMAUy6Bs44FEJGXaI2Lh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;249&quot; data-filename=&quot;edited_seekbarMinMax.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Set Max/Min value of SeekBar&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Does not affect the maximum/minimum value of Color Picke. It's fixed between 0 and 255.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/deAlKb/btrNosHMvwH/jeCfCDTO3YilrrftgkFR2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/deAlKb/btrNosHMvwH/jeCfCDTO3YilrrftgkFR2k/img.png&quot; data-alt=&quot;Set the button's push/toggle properties&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/deAlKb/btrNosHMvwH/jeCfCDTO3YilrrftgkFR2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdeAlKb%2FbtrNosHMvwH%2FjeCfCDTO3YilrrftgkFR2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;340&quot; data-filename=&quot;edited_buttonPushToggle.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Set the button's push/toggle properties&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;nick_folder_c.png&quot; data-origin-width=&quot;40&quot; data-origin-height=&quot;40&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWOJfB/btrM1dR92EA/0ZnWq6Avp7S4lx1jpHkAnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWOJfB/btrM1dR92EA/0ZnWq6Avp7S4lx1jpHkAnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWOJfB/btrM1dR92EA/0ZnWq6Avp7S4lx1jpHkAnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWOJfB%2FbtrM1dR92EA%2F0ZnWq6Avp7S4lx1jpHkAnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;40&quot; height=&quot;40&quot; data-filename=&quot;nick_folder_c.png&quot; data-origin-width=&quot;40&quot; data-origin-height=&quot;40&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;App settings&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_save.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWngkq/btrNobzwF9E/FrPGpFKSlE6xZDB5X2TPeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWngkq/btrNobzwF9E/FrPGpFKSlE6xZDB5X2TPeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWngkq/btrNobzwF9E/FrPGpFKSlE6xZDB5X2TPeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWngkq%2FbtrNobzwF9E%2FFrPGpFKSlE6xZDB5X2TPeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;53&quot; data-filename=&quot;edited_save.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Open folder Icon: Display file list in designated path (Download/) and read selected data (txt) file.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Backup&lt;/span&gt;: Back up app settings and save them to path (Download)/Config.pwm.txt.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;backupMsg.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HTRDM/btrM3avhOV0/8t4CzkYIEyeFoA0NQRVNS1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HTRDM/btrM3avhOV0/8t4CzkYIEyeFoA0NQRVNS1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HTRDM/btrM3avhOV0/8t4CzkYIEyeFoA0NQRVNS1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHTRDM%2FbtrM3avhOV0%2F8t4CzkYIEyeFoA0NQRVNS1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;68&quot; data-filename=&quot;backupMsg.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Recovery&lt;/span&gt;: Restore backed up settings.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;recoveryMsg.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc6D87/btrM1d6VVaD/BwJKDRtv6DWLO6HZ9cGit0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc6D87/btrM1d6VVaD/BwJKDRtv6DWLO6HZ9cGit0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc6D87/btrM1d6VVaD/BwJKDRtv6DWLO6HZ9cGit0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc6D87%2FbtrM1d6VVaD%2FBwJKDRtv6DWLO6HZ9cGit0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;54&quot; data-filename=&quot;recoveryMsg.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Share icon: Attach Config.pwm.txt file to SNS (Email, etc.).&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;share.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ9AYB/btrM2qyffy7/b9l34XxwERUR87NLnoqHNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ9AYB/btrM2qyffy7/b9l34XxwERUR87NLnoqHNk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ9AYB/btrM2qyffy7/b9l34XxwERUR87NLnoqHNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ9AYB%2FbtrM2qyffy7%2Fb9l34XxwERUR87NLnoqHNk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;137&quot; data-filename=&quot;share.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set button and text color&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_buttonColor.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czkZ11/btrNn2W0E6F/YaKnaSOknSG7kmdG7u6HG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czkZ11/btrNn2W0E6F/YaKnaSOknSG7kmdG7u6HG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czkZ11/btrNn2W0E6F/YaKnaSOknSG7kmdG7u6HG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczkZ11%2FbtrNn2W0E6F%2FYaKnaSOknSG7kmdG7u6HG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;185&quot; data-filename=&quot;edited_buttonColor.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Push Button color&lt;/span&gt;: The color of the button when the button property is push.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Push Text color Down&lt;/span&gt;: Button label color when the push button is pressed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Push Text color Up&lt;/span&gt;: Button label color when the push button is released.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Toggle Button color On&lt;/span&gt;: The color of the button in the on state when the button property is toggled.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Toggle Button color Off&lt;/span&gt;: The color of the button in the off state when the button property is Toggle.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Echo color&lt;/span&gt;: If the Echo text color is checked, the text color of the corresponding Echo value.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_read.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vFNFH/btrNlRhhDGd/2zgKqccgkPlvKdzyzkmZn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vFNFH/btrNlRhhDGd/2zgKqccgkPlvKdzyzkmZn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vFNFH/btrNlRhhDGd/2zgKqccgkPlvKdzyzkmZn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvFNFH%2FbtrNlRhhDGd%2F2zgKqccgkPlvKdzyzkmZn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;120&quot; data-filename=&quot;edited_read.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Connect with Custom UUID&lt;/span&gt;: If you want to use a specific UUID when connecting to BLE (Bluetooth 4.0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* In the general case, you can connect without specifying a custom UUID.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Read data from arduino&lt;/span&gt;: Set whether or not using of the timer to send Check(0xF5) for reflecting values independently changed on Arduino without specific operations (buttons and SeekBar) of the app.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Reading Interval&lt;/span&gt;: Interval of timer to send Check(0xF5).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_connection.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMUGvU/btrNhR3YhXs/R0acemyt5gaGzkjtkOMQ20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMUGvU/btrNhR3YhXs/R0acemyt5gaGzkjtkOMQ20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMUGvU/btrNhR3YhXs/R0acemyt5gaGzkjtkOMQ20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMUGvU%2FbtrNhR3YhXs%2FR0acemyt5gaGzkjtkOMQ20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;68&quot; data-filename=&quot;edited_connection.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Save BT &amp;amp; Slide state&lt;/span&gt;: Save when button state and SeekBar value changeed. Display saved states and values when starting the app.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Send Date/Time&lt;/span&gt;: Send date/time of Android system upon connection.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;First Web Login&lt;/span&gt;: Go to the login page when connected to Wi-Fi.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Detect Logout&lt;/span&gt;: Output a message and Disconnect when login is disabled by other connection.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Protocol header settings&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqDoZJ/btrNpsCh8uj/mU97r4DaSFObbhFxziTWCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqDoZJ/btrNpsCh8uj/mU97r4DaSFObbhFxziTWCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqDoZJ/btrNpsCh8uj/mU97r4DaSFObbhFxziTWCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqDoZJ%2FbtrNpsCh8uj%2FmU97r4DaSFObbhFxziTWCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;207&quot; data-filename=&quot;edited_protocol.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;Button: &quot;F0&quot; - Bluetooth: 0xF0, WiFi: &quot;%%F0&quot;&lt;br /&gt;Slide(SeekBar): &quot;F3&quot; - Bluetooth: 0xF3, WiFi: &quot;%%F3&quot;&lt;br /&gt;String: &quot;F4&quot; - Bluetooth: 0xF4, WiFi: &quot;%%F4&quot;&lt;br /&gt;Footer: &quot;F1&quot; - Bluetooth: 0xF1, WiFi: &quot;%%F1&quot;&lt;br /&gt;Echo: &quot;E1&quot; - Bluetooth: 0xE1, WiFi: &quot;%%E1&quot;&lt;br /&gt;Check: &quot;F5&quot; - Bluetooth: 0xF5, WiFi: &quot;%%F5&quot;&lt;br /&gt;Connect: &quot;F8&quot; - Bluetooth: 0xF8, WiFi: &quot;%%F8&quot;&lt;br /&gt;Option: &quot;F9&quot; - Bluetooth: 0xF9, WiFi: &quot;%%F9&quot;&lt;br /&gt;Wifi add: &quot;%%&quot; - WiFi: &quot;%%&quot; + &quot;Header&quot;&lt;br /&gt;DB clear and Reload&lt;/span&gt;: Initialize all data of the app&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Connect to Arduino&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Bluetooth Classic:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Bluetooth pairing&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Select the module you want to connect on the Bluetooth setting screen of your mobile phone.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearing.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btYc6A/btrNa3vIAjq/h6V3ZdE2U9PowwKhk6kgw0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btYc6A/btrNa3vIAjq/h6V3ZdE2U9PowwKhk6kgw0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btYc6A/btrNa3vIAjq/h6V3ZdE2U9PowwKhk6kgw0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtYc6A%2FbtrNa3vIAjq%2Fh6V3ZdE2U9PowwKhk6kgw0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;376&quot; data-filename=&quot;bluePearing.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Depending on the module, input the password when requesting the pairing password and click the confirm when the connection message is output as shown below.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvYLp6/btrNb0ZMzkE/f9mXaqKeOCT1KiHs2aI4R0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvYLp6/btrNb0ZMzkE/f9mXaqKeOCT1KiHs2aI4R0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvYLp6/btrNb0ZMzkE/f9mXaqKeOCT1KiHs2aI4R0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvYLp6%2FbtrNb0ZMzkE%2Ff9mXaqKeOCT1KiHs2aI4R0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;264&quot; data-filename=&quot;bluePearingMSG.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bluetooth pairing complete&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8I7gc/btrM7EcASBw/ui37VCuYSGOyBZpWCDEY6k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8I7gc/btrM7EcASBw/ui37VCuYSGOyBZpWCDEY6k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8I7gc/btrM7EcASBw/ui37VCuYSGOyBZpWCDEY6k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8I7gc%2FbtrM7EcASBw%2Fui37VCuYSGOyBZpWCDEY6k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;121&quot; data-filename=&quot;bluePearingZ.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Bluetooth 2.0 Search and Connection in App&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth icon in the app and select Bluetooth 2.0 in Select Ver.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Click the Bluetooth button and select the module name you want to connect.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectToblue.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAPRmp/btrNcBkv0Zb/qvYBzcxKNrHUEIq8oIrtOk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAPRmp/btrNcBkv0Zb/qvYBzcxKNrHUEIq8oIrtOk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAPRmp/btrNcBkv0Zb/qvYBzcxKNrHUEIq8oIrtOk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAPRmp%2FbtrNcBkv0Zb%2FqvYBzcxKNrHUEIq8oIrtOk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;718&quot; data-filename=&quot;connectToblue.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Bluetooth BLE:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For BLE, Bluetooth pairing is not required.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;An error message is displayed when Bluetooth pairing is attempted with the BLE module.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In case of the ESP32 module, if the same mac address is registered as Bluetooth Classic, it is recommended first to unpair it and connect it to the ESP32 BLE.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Select Bluetooth 4.0 in Select Ver and then select the BLE module to connect.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aducon_ble.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sW9cY/btrT3qd9LKv/s4C3GIWkXAKkCbxY3o17Uk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sW9cY/btrT3qd9LKv/s4C3GIWkXAKkCbxY3o17Uk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sW9cY/btrT3qd9LKv/s4C3GIWkXAKkCbxY3o17Uk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsW9cY%2FbtrT3qd9LKv%2Fs4C3GIWkXAKkCbxY3o17Uk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;430&quot; data-filename=&quot;aducon_ble.jpg&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Wifi:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A. Direct connection to Access Point of Arduino Wi-Fi module&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Select the name of Wi-Fi module on your phone's Wi-Fi connection screen.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wifiChange.jpg&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs8DTv/btrM7jMt5KM/AshmsdPphmUoHh3LkLqNK1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs8DTv/btrM7jMt5KM/AshmsdPphmUoHh3LkLqNK1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs8DTv/btrM7jMt5KM/AshmsdPphmUoHh3LkLqNK1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs8DTv%2FbtrM7jMt5KM%2FAshmsdPphmUoHh3LkLqNK1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;463&quot; data-filename=&quot;wifiChange.jpg&quot; data-origin-width=&quot;1034&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Check that the app's wifi connection name is the name of Wi-Fi module (e.g. Esp32).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Connect to the specified Access Point IP: 192.168.4.1.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectToAP.jpg&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBVpbb/btrNa32M7RI/X2Mlad0D7EPtK5WfbBzYDk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBVpbb/btrNa32M7RI/X2Mlad0D7EPtK5WfbBzYDk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBVpbb/btrNa32M7RI/X2Mlad0D7EPtK5WfbBzYDk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBVpbb%2FbtrNa32M7RI%2FX2Mlad0D7EPtK5WfbBzYDk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;359&quot; data-filename=&quot;connectToAP.jpg&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;359&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B. Connection through a router&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If the Wi-Fi module of Arduino is connected to a router (eg skynet) and the IP assigned by the router (eg 192.168.1.6) is known, connect to the assigned IP.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;connectToIP.jpg&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iic2C/btrNbcZQKVT/gR6L9kSqkWtK4KgvjV3hU0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iic2C/btrNbcZQKVT/gR6L9kSqkWtK4KgvjV3hU0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iic2C/btrNbcZQKVT/gR6L9kSqkWtK4KgvjV3hU0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIic2C%2FbtrNbcZQKVT%2FgR6L9kSqkWtK4KgvjV3hU0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;513&quot; data-filename=&quot;connectToIP.jpg&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock floatLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;update.png&quot; data-origin-width=&quot;32&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wizj4/btrNpKn9RqU/E4dk0E6oXURwSy3KZBqr60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wizj4/btrNpKn9RqU/E4dk0E6oXURwSy3KZBqr60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wizj4/btrNpKn9RqU/E4dk0E6oXURwSy3KZBqr60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwizj4%2FbtrNpKn9RqU%2FE4dk0E6oXURwSy3KZBqr60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;32&quot; height=&quot;32&quot; data-filename=&quot;update.png&quot; data-origin-width=&quot;32&quot; data-origin-height=&quot;32&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If you click the icon displayed after connecting to the Wi-Fi or Bluetooth module, 0xF5 or &quot;%%F5&quot; is transmitted for checking whether there is a new value or not in Arduino.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;SE-eeae2df4-4cad-428a-903b-d2aa5e6a49db&quot; data-ke-size=&quot;size23&quot;&gt;원격제어용 프로토콜&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Send Data From App To Arduino&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Bluetooth Classic:&lt;br /&gt;Button: 0xF0 + 1byte Num + 0xF1&lt;br /&gt;SeekBar: 0xF3 + 1byte Num + 2byte Num + 0xF1&lt;br /&gt;Connection: 0xF8 + &quot;connect&quot; + \n&lt;br /&gt;Disconnction: 0xF8 + &quot;disconnect&quot; + \n&lt;br /&gt;Date/Time: 0xF9 + &quot;09/22/2022 13:32:39&quot; + \n&lt;br /&gt;SetTime: 0xF9 + &quot;21:20&quot; + \n&lt;br /&gt;Text: Text + Endline Option(None / '\n' / '\r' / &quot;\r\n&quot;)&lt;br /&gt;Check: 0xF5&lt;br /&gt;&lt;br /&gt;- Bluetooth BLE:&lt;br /&gt;Button: 0xF0 + 1byte Num + 0xF1&lt;br /&gt;SeekBar: 0xF3 + 1byte Num + 2byte Num + 0xF1&lt;br /&gt;Connection: &quot;%%F8&quot; + &quot;connect&quot; + \n&lt;br /&gt;Disconnction: &quot;%%F8&quot; + &quot;disconnect&quot; + \n&lt;br /&gt;Date/Time: &quot;%%F9&quot; + &quot;09/22/2022 13:32:39&quot; + \n&lt;br /&gt;SetTime: &quot;%%F9&quot; + &quot;21:20&quot; + \n&lt;br /&gt;Text: Text + Endline Option(None / '\n' / '\r' / &quot;\r\n&quot;)&lt;br /&gt;&lt;br /&gt;- Wifi (String)&lt;br /&gt;Button: %%F0 + Value + %%F1&lt;br /&gt;SeekBar: %%F3 + Count + %% + Slide Num + Value + %%F1&lt;br /&gt;Connection: %%F8 + connect + \n&lt;br /&gt;Disconnction: %%F8 + disconnect + \n&lt;br /&gt;Date/Time: %%F9 + 09/22/2022 13:32:39 + \n&lt;br /&gt;SetTime: %%F9 + 21:20 + \n&lt;br /&gt;Text Send: String + Endline Option(None / '\n' / '\r' / &quot;\r\n&quot;)&lt;br /&gt;Check: %%F5&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Recieve Data From Arduino To App&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;- Bluetooth Classic:&lt;br /&gt;///////////////////////////////////////// ESSENTIAL (0xF0, 0xF3,0xF4)&lt;br /&gt;Button State: 0xF0 + 1byte Num + 0xF1&lt;br /&gt;SeekBar State: 0xF3 + 1byte Num + 2byte Num + 0xF1&lt;br /&gt;Button Echo: 0xF0 + 1byte Num + 0xE1&lt;br /&gt;SeekBar Echo: 0xF3 + 1byte Num + 2byte Num + 0xE1&lt;br /&gt;Text: 0xF4 + Text + 0xF1&lt;br /&gt;///////////////////////////////////////// CONNECTION (0xF8)&lt;br /&gt;requst Date Time: 0xF8 + 0x01 + 0x00&lt;br /&gt;request Pass: 0xF8 + 0x02 + 1byte Num(length) + &quot;Pass Name&quot;&lt;br /&gt;response Pass: 0xF8 + 0x03 + 1byte Num&lt;br /&gt;send Message: 0xF8 + 0x04 + String + 0xF1&lt;br /&gt;send Disconnect: 0xF8 + 0x05 + 0x00&lt;br /&gt;///////////////////////////////////////// OPTION (0xF9)&lt;br /&gt;set Active Slide: 0xF9 + 0x01 + 1byte Num + 0x00&lt;br /&gt;set Slide Interval: 0xF9 + 0x02 + 2byte Num&lt;br /&gt;set Request: 0xF9 + 0x03 + 1byte Num + 0x00&lt;br /&gt;set Request Interval: 0xF9 + 0x04 + 2byte Num&lt;br /&gt;set SSID Label Mode: 0xF9 + 0x05 + 1byte Num + 0x00&lt;br /&gt;show Dialog Menu: 0xF9 + 0x06 + 2byte Num&lt;br /&gt;set Color Nob: 0xF9 + 0x07 + String + 0xF1&lt;br /&gt;set Display: 0xF9 + 0x08 + String + 0xF1&lt;br /&gt;set Button Label: 0xF9 + 0x09 + String + 0xF1&lt;br /&gt;set Button Toggle: 0xF9 + 0x0A + String + 0xF1&lt;br /&gt;set Min Max: 0xF9 + 0x0B + String + 0xF1&lt;br /&gt;set App Title Message: 0xF9 + 0x0C + String + 0xF1&lt;br /&gt;dialog Radio: 0xF9 + 0x0D + &quot;RAD:&quot; + String + 0xF1&lt;br /&gt;dialog Checkbox: 0xF9 + 0x0D + &quot;CKB:&quot; + String + 0xF1&lt;br /&gt;dialog Choose: 0xF9 + 0x0D + &quot;CHD:&quot; + String + 0xF1&lt;br /&gt;dialog List: 0xF9 + 0x0D + &quot;LSD:&quot; + String + 0xF1&lt;br /&gt;dialog Input: 0xF9 + 0x0D + &quot;STR:&quot; + String + 0xF1&lt;br /&gt;&lt;br /&gt;- Bluetooth BLE:&lt;br /&gt;///////////////////////////////////////// ESSENTIAL (0xF0, 0xF3,0xF4)&lt;br /&gt;Button State: 0xF0 + 1byte Num + 0xF1&lt;br /&gt;SeekBar State: 0xF3 + 1byte Num + 2byte Num + 0xF1&lt;br /&gt;Button Echo: 0xF0 + 1byte Num + 0xE1&lt;br /&gt;SeekBar Echo: 0xF3 + 1byte Num + 2byte Num + 0xE1&lt;br /&gt;Text: 0xF4 + Text + 0xE1/F1&lt;br /&gt;///////////////////////////////////////// CONNECTION (0xF8)&lt;br /&gt;requst Date Time: 0xF8 + 0x01 + 0x00&lt;br /&gt;request Pass: 0xF8 + 0x02 + 1byte Num(length) + &quot;Pass Name&quot;&lt;br /&gt;response Pass: 0xF8 + 0x03 + 1byte Num&lt;br /&gt;send Message: 0xF8 + 0x04 + String + 0xE1/F1&lt;br /&gt;send Disconnect: 0xF8 + 0x05 + 0x00&lt;br /&gt;///////////////////////////////////////// OPTION (0xF9)&lt;br /&gt;set Active Slide: 0xF9 + 0x01 + 1byte Num + 0x00&lt;br /&gt;set Slide Interval: 0xF9 + 0x02 + 2byte Num&lt;br /&gt;set SSID Label Mode: 0xF9 + 0x03 + 1byte Num + 0x00&lt;br /&gt;show Dialog Menu: 0xF9 + 0x04 + 1byte Num + 0x00&lt;br /&gt;set Color Nob: 0xF9 + 0x05 + String + 0xE1/F1&lt;br /&gt;set Display: 0xF9 + 0x06 + String + 0xE1/F1&lt;br /&gt;set Button Label: 0xF9 + 0x07 + String + 0xE1/F1&lt;br /&gt;set Button Toggle: 0xF9 + 0x08 + String + 0xE1/F1&lt;br /&gt;set Min Max: 0xF9 + 0x09 + String + 0xE1/F1&lt;br /&gt;set App Title Message: 0xF9 + 0x0A + String + 0xE1/F1&lt;br /&gt;dialog Radio: 0xF9 + 0x0B + &quot;RAD:&quot; + String + 0xE1/F1&lt;br /&gt;dialog Checkbox: 0xF9 + 0x0B + &quot;CKB:&quot; + String + 0xE1/F1&lt;br /&gt;dialog Choose: 0xF9 + 0x0B + &quot;CHD:&quot; + String + 0xE1/F1&lt;br /&gt;dialog List: 0xF9 + 0x0B + &quot;LSD:&quot; + String + 0xE1/F1&lt;br /&gt;dialog Input: 0xF9 + 0x0B + &quot;STR:&quot; + String + 0xE1/F1&lt;br /&gt;&lt;br /&gt;- Wifi (String):&lt;br /&gt;///////////////////////////////////////// ESSENTIAL (%%F0, %%F3, %%F4)&lt;br /&gt;1. Button State: %%F0 + Value + %%F1 + '\n'&lt;br /&gt;2. SeekBar State: %%F3 + Slide Num + Value + %%F1 + '\n'&lt;br /&gt;3. Button Echo: %%F0 + Value + %%E1 + '\n'&lt;br /&gt;4. SeekBar Echo: %%F3 + Slide Num + Value + %%E1 + '\n'&lt;br /&gt;5. Text: %%F4 + Text + %%F1 + '\n'&lt;br /&gt;///////////////////////////////////////// CONNECTION (%%F8)&lt;br /&gt;6. set First Login: %%F8 + FIR: + &quot;Value&quot; + '\n'&lt;br /&gt;7. detect Logout: %%F8 + DET: + &quot;Value&quot; + '\n'&lt;br /&gt;8. requst Date Time: %%F8 + RDT: + '\n'&lt;br /&gt;9. request Pass: %%F8 + &quot;bool&quot; + &quot;Pass Name&quot; + '\n'&lt;br /&gt;10. response Pass: %%F8 + RES: + &quot;Cookie or bool&quot; + '\n'&lt;br /&gt;11. send Wifi Info: %%F8 + INF: + String + '\n'&lt;br /&gt;12. send Message: %%F8 + MES: + String + '\n'&lt;br /&gt;13. response Fail Resend: %%F8 + RFR: + &quot;bool&quot; + '\n'&lt;br /&gt;14. send Disconnect: %%F8 + DIS + '\n'&lt;br /&gt;///////////////////////////////////////// OPTION (%%F9)&lt;br /&gt;15. set Active Slide: %%F9 + ACT: + &quot;bool&quot; + '\n'&lt;br /&gt;16. set Slide Interval: %%F9 + SLI: + &quot;value&quot; + '\n'&lt;br /&gt;17. set Request: %%F9 + REQ: + &quot;bool&quot; + '\n'&lt;br /&gt;18. set Request Interval: %%F9 + INT: + &quot;value&quot; + '\n'&lt;br /&gt;19. set SSID Label Mode: %%F9 + SLM: + &quot;value&quot; + '\n'&lt;br /&gt;20. show Web View: %%F9 + SWV: + &quot;bool&quot; + '\n'&lt;br /&gt;21. show Dialog Menu: %%F9 + SDM: + &quot;bool&quot; + '\n'&lt;br /&gt;22. set Color Nob: %%F9 + CNB: + &quot;String&quot; + '\n'&lt;br /&gt;23. set Display: %%F9 + SDP: + &quot;String&quot; + '\n'&lt;br /&gt;24. set Button Label: %%F9 + ABL: + &quot;String&quot; + '\n'&lt;br /&gt;25. set Button Toggle: %%F9 + BTG: + &quot;String&quot; + '\n'&lt;br /&gt;26. set Min Max: %%F9 + MNM: + &quot;String&quot; + '\n'&lt;br /&gt;27. set App Title Message: %%F9 + ATM: + &quot;String&quot; + '\n'&lt;br /&gt;28. dialog Radio: %%F9 + RAD: + &quot;String&quot; + '\n'&lt;br /&gt;29. dialog Checkbox: %%F9 + CKB: + &quot;String&quot; + '\n'&lt;br /&gt;30. dialog Choose: %%F9 + CHD: + &quot;String&quot; + '\n'&lt;br /&gt;31. dialog List: %%F9 + LSD: + &quot;String&quot; + '\n'&lt;br /&gt;32. dialog Input: %%F9 + STR: + &quot;String&quot; + '\n'&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;App items that can be controlled by Arduino according to the protocol&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_protoAct.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;978&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MBlxN/btrNiNMT3MZ/QKMWrRazy3Vl45gYFbCb0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MBlxN/btrNiNMT3MZ/QKMWrRazy3Vl45gYFbCb0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MBlxN/btrNiNMT3MZ/QKMWrRazy3Vl45gYFbCb0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMBlxN%2FbtrNiNMT3MZ%2FQKMWrRazy3Vl45gYFbCb0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;978&quot; data-filename=&quot;edited_protoAct.jpg&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;978&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Other protocol control&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;9. request Pass&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBjeym/btrNv9wiiEA/ktCKkPk4gj1vKYHCc9QzTk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBjeym/btrNv9wiiEA/ktCKkPk4gj1vKYHCc9QzTk/img.jpg&quot; data-alt=&quot;Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBjeym/btrNv9wiiEA/ktCKkPk4gj1vKYHCc9QzTk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBjeym%2FbtrNv9wiiEA%2FktCKkPk4gj1vKYHCc9QzTk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPass.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwD5pA/btrNvOlBM9A/uS2kL7KaMNC7ExfbHsNjK0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwD5pA/btrNvOlBM9A/uS2kL7KaMNC7ExfbHsNjK0/img.jpg&quot; data-alt=&quot;Wifi&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwD5pA/btrNvOlBM9A/uS2kL7KaMNC7ExfbHsNjK0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwD5pA%2FbtrNvOlBM9A%2FuS2kL7KaMNC7ExfbHsNjK0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;136&quot; data-filename=&quot;requestPassWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Wifi&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;10. response Pass&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GACde/btrNb4u5Cz7/Gur7f4QJRtjiVlzU3ukAE1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GACde/btrNb4u5Cz7/Gur7f4QJRtjiVlzU3ukAE1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GACde/btrNb4u5Cz7/Gur7f4QJRtjiVlzU3ukAE1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGACde%2FbtrNb4u5Cz7%2FGur7f4QJRtjiVlzU3ukAE1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;42&quot; data-filename=&quot;responsePass1.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHBDM9/btrNzIRImgb/k0Vq37doJqgkX0qjUBfgCk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHBDM9/btrNzIRImgb/k0Vq37doJqgkX0qjUBfgCk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHBDM9/btrNzIRImgb/k0Vq37doJqgkX0qjUBfgCk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHBDM9%2FbtrNzIRImgb%2Fk0Vq37doJqgkX0qjUBfgCk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;responsePass2.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;11. send Wifi Info&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This code applies only to Wi-Fi and transmits Wi-Fi connection information to use in 19. set SSID Label Mode.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;12. send Message&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCh1SG/btrNANkWNpa/mngKXjL4OQ1D9INOSkMI71/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCh1SG/btrNANkWNpa/mngKXjL4OQ1D9INOSkMI71/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCh1SG/btrNANkWNpa/mngKXjL4OQ1D9INOSkMI71/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCh1SG%2FbtrNANkWNpa%2FmngKXjL4OQ1D9INOSkMI71%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;protoMSG.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;13. response Fail Resend&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This code only applies to Wi-Fi and set whether or not to use the function to retransmit if the response to the app's request fails.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;false&lt;/span&gt;: Applies only when the Arduino intentionally does not respond to HTTP requests of the app. (e.g. ESP01)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;14. send Disconnect&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZLlt7/btrNb0fDrWT/X88cqieI1M3Y1bQN2xo8Xk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZLlt7/btrNb0fDrWT/X88cqieI1M3Y1bQN2xo8Xk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZLlt7/btrNb0fDrWT/X88cqieI1M3Y1bQN2xo8Xk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZLlt7%2FbtrNb0fDrWT%2FX88cqieI1M3Y1bQN2xo8Xk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;169&quot; data-filename=&quot;disconnect.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;click &quot;Disconnect&quot; button of Wi-Fi and Bluetooth.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;16. set Slide Interval&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;19. set SSID Label Mode&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FNtnL/btrNvNNMv79/n4pPmKNKAj5oLREwsuTeZk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FNtnL/btrNvNNMv79/n4pPmKNKAj5oLREwsuTeZk/img.jpg&quot; data-alt=&quot;Bluetooth&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FNtnL/btrNvNNMv79/n4pPmKNKAj5oLREwsuTeZk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFNtnL%2FbtrNvNNMv79%2Fn4pPmKNKAj5oLREwsuTeZk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;186&quot; data-filename=&quot;ssidBlue.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;271&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Bluetooth&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LenIU/btrNvL3rTe0/3lLIYgM80K0lBrKduqI5f0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LenIU/btrNvL3rTe0/3lLIYgM80K0lBrKduqI5f0/img.jpg&quot; data-alt=&quot;Wifi&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LenIU/btrNvL3rTe0/3lLIYgM80K0lBrKduqI5f0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLenIU%2FbtrNvL3rTe0%2F3lLIYgM80K0lBrKduqI5f0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;384&quot; data-filename=&quot;ssidWifi.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Wifi&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;21. show Dialog Menu&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0g0eZ/btrNb3JQXuO/UyTnY6U5mR6A8hMMw5aqjk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0g0eZ/btrNb3JQXuO/UyTnY6U5mR6A8hMMw5aqjk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0g0eZ/btrNb3JQXuO/UyTnY6U5mR6A8hMMw5aqjk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0g0eZ%2FbtrNb3JQXuO%2FUyTnY6U5mR6A8hMMw5aqjk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;57&quot; data-filename=&quot;dialogMenu.jpg&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Button value: 201&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;28. dialog Radio&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bciQLg/btrNwFO1GyT/UkwLjueGTRPiZdeQHGr0s0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bciQLg/btrNwFO1GyT/UkwLjueGTRPiZdeQHGr0s0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bciQLg/btrNwFO1GyT/UkwLjueGTRPiZdeQHGr0s0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbciQLg%2FbtrNwFO1GyT%2FUkwLjueGTRPiZdeQHGr0s0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;292&quot; data-filename=&quot;dialogRadio.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;29. dialog Checkbox&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMzQaG/btrNyDiOHZc/516T77XKRetbCSb6CKdI2k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMzQaG/btrNyDiOHZc/516T77XKRetbCSb6CKdI2k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMzQaG/btrNyDiOHZc/516T77XKRetbCSb6CKdI2k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMzQaG%2FbtrNyDiOHZc%2F516T77XKRetbCSb6CKdI2k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;293&quot; data-filename=&quot;dialogCheckbox.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;30. dialog Choose&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X1xa9/btrNvMnJAC5/gJ2yDa2x0r7binLnCxHBq0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X1xa9/btrNvMnJAC5/gJ2yDa2x0r7binLnCxHBq0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X1xa9/btrNvMnJAC5/gJ2yDa2x0r7binLnCxHBq0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX1xa9%2FbtrNvMnJAC5%2FgJ2yDa2x0r7binLnCxHBq0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;99&quot; data-filename=&quot;dialogChoose.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;31. dialog List&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buSAgj/btrNDVph82U/fYq9SzOhZL4J9Hno14LbGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buSAgj/btrNDVph82U/fYq9SzOhZL4J9Hno14LbGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buSAgj/btrNDVph82U/fYq9SzOhZL4J9Hno14LbGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuSAgj%2FbtrNDVph82U%2FfYq9SzOhZL4J9Hno14LbGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;294&quot; data-filename=&quot;edited_edited_edited_dialogList.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;429&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span class=&quot;notranslate&quot;&gt;32. dialog Input&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNfH2b/btrNwDjjfav/CcuPiw2JGVjLidjOw3VwVK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNfH2b/btrNwDjjfav/CcuPiw2JGVjLidjOw3VwVK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNfH2b/btrNwDjjfav/CcuPiw2JGVjLidjOw3VwVK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNfH2b%2FbtrNwDjjfav%2FCcuPiw2JGVjLidjOw3VwVK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;145&quot; data-filename=&quot;dialogInput.jpg&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ARDUINO ESP01 HMI CONTROL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://youtu.be/Sn46at1o7_U&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/Sn46at1o7_U&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Sn46at1o7_U&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/181&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Setting up Wi-Fi module ESP01 and basic code for Arduino remote control&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/182&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - Arduino WiFi remote control with ADUCON and ESP-01&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/184&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Arduino Basic code for bluetooth remote contol with HC-06&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/185&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - Arduino Bluetooth remote control with ADUCON and HC-06&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/187&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Arduino Basic code for BLE remote contol with BT05&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/188&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - Arduino BLE remote control with ADUCON and BT05&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/190&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - ESP32/NodeMcu Basic code for WiFi remote contol&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/191&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ESP32/NodeMcu WiFi remote control with ADUCON&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/193&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ESP32 Bluetooth remote control with ADUCON&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/195&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino/ADUCON] - ESP32 BLE remote control with ADUCON&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino/ADUCON</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/175</guid>
      <comments>https://postpop.tistory.com/175#entry175comment</comments>
      <pubDate>Tue, 27 Sep 2022 16:55:40 +0900</pubDate>
    </item>
    <item>
      <title>Kodular/MIT App inventor - Canvas 이용 color picker 만들기</title>
      <link>https://postpop.tistory.com/174</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Color Picker의 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색상 테이블에서 색상값을 가져올 수 있는 팝업 형태의 Notification으로 앱 내의 버튼 및 텍스트 등의 색상을 변경하는데 이용할 수 있다.&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Kodular color picker&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Canvas 및 Notifier의 Custom Dialog 기능 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. MIT App inventor color picker&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Canvas 및 extension &quot;com.dreamers.AlphaDialog.aix&quot; 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Canvas&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 앱에서 좌표를 기준으로&amp;nbsp;&lt;span&gt;도형들을&lt;span&gt; &lt;/span&gt;&lt;/span&gt;그리고 출력할 수 있는 가상의 공간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kodular Notifier의 custom dialog 블록과 extension &quot;com.dreamers.AlphaDialog.aix&quot;의 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드에서 Layout 을 설정해주는 &quot;Arrangement&quot; 또는 component를 팝업 형태로 출력해주는 블록 및 extension으로 앱 초기화 시 설정되며, 팝업 형태로만 출력되고 메인 앱에서는 출력되지 않게 해 준다.&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qU3c0/btrF5H6Imni/yKKw9ZV4RqJF59Kj0pdnOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qU3c0/btrF5H6Imni/yKKw9ZV4RqJF59Kj0pdnOK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;334&quot; data-origin-height=&quot;498&quot; data-filename=&quot;kodular_color_picker.png&quot; style=&quot;width: 50.1884%; margin-right: 10px;&quot; data-widthpercent=&quot;50.78&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qU3c0/btrF5H6Imni/yKKw9ZV4RqJF59Kj0pdnOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqU3c0%2FbtrF5H6Imni%2FyKKw9ZV4RqJF59Kj0pdnOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;334&quot; height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LOrFo/btrF5H6ImIA/kI4WKYklqy2X5nYSaevyQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LOrFo/btrF5H6ImIA/kI4WKYklqy2X5nYSaevyQ1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;463&quot; data-filename=&quot;colorPicker.png&quot; style=&quot;width: 48.6488%;&quot; data-widthpercent=&quot;49.22&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LOrFo/btrF5H6ImIA/kI4WKYklqy2X5nYSaevyQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLOrFo%2FbtrF5H6ImIA%2FkI4WKYklqy2X5nYSaevyQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;301&quot; height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Kodular color picker(좌)/MIT App inventor color picker(우)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;색상 리스트 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역 변수 colorList를 설정해주고 color picker에서 사용할 색상을 지정해준다. 예제에 사용한 색상 개수는 54개.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;color_list.jpg&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;1407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brvQtL/btrF1SoeTVR/cYPW82g4GWuZlyxo2Pt1BK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brvQtL/btrF1SoeTVR/cYPW82g4GWuZlyxo2Pt1BK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brvQtL/btrF1SoeTVR/cYPW82g4GWuZlyxo2Pt1BK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrvQtL%2FbtrF1SoeTVR%2FcYPW82g4GWuZlyxo2Pt1BK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;1407&quot; data-filename=&quot;color_list.jpg&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;1407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Canvas에 색상 테이블 그리기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;draw_color_picker_at_canvas.jpg&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s5SZm/btrF4F9pCvA/jT6PoLOgAMsJpakBxuFRGk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s5SZm/btrF4F9pCvA/jT6PoLOgAMsJpakBxuFRGk/img.jpg&quot; data-alt=&quot;Canvas에 색상 테이블 그리는 블록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s5SZm/btrF4F9pCvA/jT6PoLOgAMsJpakBxuFRGk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs5SZm%2FbtrF4F9pCvA%2FjT6PoLOgAMsJpakBxuFRGk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;724&quot; height=&quot;542&quot; data-filename=&quot;draw_color_picker_at_canvas.jpg&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Canvas에 색상 테이블 그리는 블록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Canvas에 원의 지름이 38픽셀인 6 x 9 테이블을 그려준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 원의 중심과의 거리는 44픽셀로 정했으며 상/하/좌/우 여백으로 2픽셀씩 주게 되면 Canvas 넓이는 268픽셀이 되고 높이는 400픽셀이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(44 x 6) + 4 = 268 / (44 x 9) + 4 = 400&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 처음 그리게 되는 원의 중심점은 각 원의 중심과의 거리 44 절반인 22에 상/좌 여백을 더해주어 24, 24가 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 지역 변수 X, Y에 설정해주고 색상원 54개를 그려주기 위해 for 루프를 이용하여 Canvas에 색상원 54개를 반복하여 그리도록 프로그래밍해준다. 이때 원을 한 개씩 그릴 때마다. 중심점 X값을 각 원의 중심과의 거리인 44만큼 증가시켜주고 색상원 6개가 그려진 이후에는 중심점 Y값을 각 원의 중심과의 거리인 44만큼 증가시키고 X값은 처음 값인 24를 지정해주어 테이블 형식으로 색상원이 그려지도록 해준다. &quot;&lt;span&gt;drawColorPicker&quot;라는 Procedure에 코드를 넣어주었다. &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Screen1 Initialize 블록에 drawColorPicker가 실행되도록 배치해주면 &lt;span&gt;Canvas에&lt;span&gt;&amp;nbsp;&lt;/span&gt;색상테이블&lt;/span&gt; 54개가 그려질 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;screen_initialize.png&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byOQrq/btrF7dREFh6/xQWqpdd5hTN8dGkge7ogJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byOQrq/btrF7dREFh6/xQWqpdd5hTN8dGkge7ogJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byOQrq/btrF7dREFh6/xQWqpdd5hTN8dGkge7ogJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyOQrq%2FbtrF7dREFh6%2FxQWqpdd5hTN8dGkge7ogJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;230&quot; height=&quot;69&quot; data-filename=&quot;screen_initialize.png&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Canvas를 터치했을 때 색상값 가져오기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Canvas의 구성 블록 중 터치다운 시 코드를 실행하는 액션 블록과 터치 지점의 색상값을 가져오는 Get Pixel Color 블록을 이용하여 색상값을 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Canvas의 이름을 &quot;colorPick&quot;으로 설정해 주었고, 이 Canvas의 위치를 설정해주는 Arrangement의 이름을 &quot;colorPicker&quot;로 설정해 주었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;canvas_touch_down.jpg&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DIEON/btrF6aVfruL/TfpK6RzYnTxkD73dGmntl1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DIEON/btrF6aVfruL/TfpK6RzYnTxkD73dGmntl1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DIEON/btrF6aVfruL/TfpK6RzYnTxkD73dGmntl1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDIEON%2FbtrF6aVfruL%2FTfpK6RzYnTxkD73dGmntl1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;549&quot; height=&quot;199&quot; data-filename=&quot;canvas_touch_down.jpg&quot; data-origin-width=&quot;549&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가져온 색상값을 적용하기&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가져온 색상값을 어떤 요소에 적용해야 하는지를 설정하기 위해 전역 변수 &quot;colorOrderNum&quot;을 설정해주고 초기값은 0으로 설정해 주었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼의 배경 색상을 변경하고자 한다면 colorOrderNum는 1 값을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;버튼의 텍스트 색상을 변경하고자 한다면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;colorOrderNum는 2 값을 설정해주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;색상 변경이 완료되면 초기값 0으로 변경해준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;apply_color1.jpg&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIgrie/btrF4fcpz1r/l7u7TCCLFtKOTYPVOurUh0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIgrie/btrF4fcpz1r/l7u7TCCLFtKOTYPVOurUh0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIgrie/btrF4fcpz1r/l7u7TCCLFtKOTYPVOurUh0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIgrie%2FbtrF4fcpz1r%2Fl7u7TCCLFtKOTYPVOurUh0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;339&quot; height=&quot;339&quot; data-filename=&quot;apply_color1.jpg&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;339&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;changeColor&quot;라는 Procedure를 설정해주고 &lt;span&gt;colorOrderNum의 값에 따라 버튼의 색상을 적용하도록&lt;span&gt; 코드를 작성해준다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;apply_color2.jpg&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6PcnW/btrF7dEcxap/cpmWA1Hk9r6BgXSv9j1kXK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6PcnW/btrF7dEcxap/cpmWA1Hk9r6BgXSv9j1kXK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6PcnW/btrF7dEcxap/cpmWA1Hk9r6BgXSv9j1kXK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6PcnW%2FbtrF7dEcxap%2FcpmWA1Hk9r6BgXSv9j1kXK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;555&quot; height=&quot;243&quot; data-filename=&quot;apply_color2.jpg&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Kodular Notifier의 Create Custom Dialog 블록 설정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;component: Canvas의 위치를 설정해주는 Arrangement &quot;colorPicker&quot; 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;title: 텍스트 &quot;Color Picker&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;button Text: 빈 텍스트 상자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cancel Button Text: 텍스트 &quot;close&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cancelable: true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;를 설정해주고 Screen1 초기화 시 Canvas에 색상 테이블이 그려진 다음에 위치해준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Kodular_Notifier_Create_Custom_Dialog.jpg&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk1Au8/btrF3hhzKKm/JbMZVxsGZ8QA9ylNahGQbK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk1Au8/btrF3hhzKKm/JbMZVxsGZ8QA9ylNahGQbK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk1Au8/btrF3hhzKKm/JbMZVxsGZ8QA9ylNahGQbK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk1Au8%2FbtrF3hhzKKm%2FJbMZVxsGZ8QA9ylNahGQbK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;477&quot; height=&quot;224&quot; data-filename=&quot;Kodular_Notifier_Create_Custom_Dialog.jpg&quot; data-origin-width=&quot;477&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dp3Vfm/btrF3YoxnJK/zIncDCQ77NosgOweC6lIUk/Kodular_colorPicker.aia?attach=1&amp;amp;knm=tfile.aia&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Kodular_colorPicker.aia&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 프로그래밍은 아래 동영상 참조&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/4NgwiZjdF5w&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. extension &quot;com.dreamers.AlphaDialog.aix&quot; 다운로드 및 CreateDialog 블록 설정하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://community.kodular.io/t/update-free-alpha-dialog-transparent-dialogs-custom-toasts-and-much-more/98530&quot;&gt;https://community.kodular.io/t/update-free-alpha-dialog-transparent-dialogs-custom-toasts-and-much-more/98530&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1656520537090&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;[UPDATE] Free Alpha Dialog | Transparent Dialogs, Custom Toasts and much more&quot; data-og-description=&quot;Alpha Dialog Extension Alpha Dialog is a simple yet powerful and easy to use extension that you can use freely in your projects to create awesome and unique dialogs. The extension allows you create transparent dialogs, full screen dialogs and by using a ve&quot; data-og-host=&quot;community.kodular.io&quot; data-og-source-url=&quot;https://community.kodular.io/t/update-free-alpha-dialog-transparent-dialogs-custom-toasts-and-much-more/98530&quot; data-og-url=&quot;https://community.kodular.io/t/update-free-alpha-dialog-transparent-dialogs-custom-toasts-and-much-more/98530&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/CaA6n/hyOV0vTI87/6yBfdx308qSZddwkiq94l1/img.png?width=264&amp;amp;height=78&amp;amp;face=0_0_264_78,https://scrap.kakaocdn.net/dn/bcZrkV/hyOV19pwIf/pb1kROKgsUADx5ZGGCkWeK/img.png?width=264&amp;amp;height=78&amp;amp;face=0_0_264_78,https://scrap.kakaocdn.net/dn/eJ9uY9/hyOVX60mNM/jpvtFJqI4NnxKCy7njjIJK/img.png?width=225&amp;amp;height=500&amp;amp;face=0_0_225_500&quot;&gt;&lt;a href=&quot;https://community.kodular.io/t/update-free-alpha-dialog-transparent-dialogs-custom-toasts-and-much-more/98530&quot; data-source-url=&quot;https://community.kodular.io/t/update-free-alpha-dialog-transparent-dialogs-custom-toasts-and-much-more/98530&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/CaA6n/hyOV0vTI87/6yBfdx308qSZddwkiq94l1/img.png?width=264&amp;amp;height=78&amp;amp;face=0_0_264_78,https://scrap.kakaocdn.net/dn/bcZrkV/hyOV19pwIf/pb1kROKgsUADx5ZGGCkWeK/img.png?width=264&amp;amp;height=78&amp;amp;face=0_0_264_78,https://scrap.kakaocdn.net/dn/eJ9uY9/hyOVX60mNM/jpvtFJqI4NnxKCy7njjIJK/img.png?width=225&amp;amp;height=500&amp;amp;face=0_0_225_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[UPDATE] Free Alpha Dialog | Transparent Dialogs, Custom Toasts and much more&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Alpha Dialog Extension Alpha Dialog is a simple yet powerful and easy to use extension that you can use freely in your projects to create awesome and unique dialogs. The extension allows you create transparent dialogs, full screen dialogs and by using a ve&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;community.kodular.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Kodular Cummunity에 가입이 되어야만 다운로드할 수 있다.&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;layout: Canvas의 위치를 설정해주는 Arrangement &quot;colorPicker&quot; 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cancelable: true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;를 설정해주고 Screen1 초기화 시 Canvas에 색상 테이블이 그려진 다음에 위치해준다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;com.dreamers.AlphaDialog.aix_CreateDialog.jpg&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfoBzt/btrF4edwF4R/BeGCJXTsfCFzLrg80RDtRK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfoBzt/btrF4edwF4R/BeGCJXTsfCFzLrg80RDtRK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfoBzt/btrF4edwF4R/BeGCJXTsfCFzLrg80RDtRK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfoBzt%2FbtrF4edwF4R%2FBeGCJXTsfCFzLrg80RDtRK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;425&quot; height=&quot;145&quot; data-filename=&quot;com.dreamers.AlphaDialog.aix_CreateDialog.jpg&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/r8Kg1/btrF5IY08DX/apaancVRS8aBp1hLy48nx0/MIT_APPinventor_colorPicker.aia?attach=1&amp;amp;knm=tfile.aia&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;MIT_APPinventor_colorPicker.aia&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 프로그래밍은 아래 동영상 참조&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/Wf9tr6u-Wcg&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>App Inventor</category>
      <category>Color picker</category>
      <category>Kodular</category>
      <category>MIT app inventor</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/174</guid>
      <comments>https://postpop.tistory.com/174#entry174comment</comments>
      <pubDate>Thu, 30 Jun 2022 01:13:38 +0900</pubDate>
    </item>
    <item>
      <title>아두이노 - 와이파이, ESP01 wifi 모듈 무선 원격제어 그리고 시리얼 통신 - 6편</title>
      <link>https://postpop.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 아두이노 와이파이(wifi) 모듈 ESP-01을 이용하여&amp;nbsp;&amp;nbsp;wifi AP를 설정하고&amp;nbsp;스마트폰과 wifi AP 연결을 통한 데이터 전송과 &amp;nbsp;와이파이로 수신된 데이터를&amp;nbsp;시리얼 통신을 통해&amp;nbsp;아두이노에서&amp;nbsp;받고&amp;nbsp;코드를 실행하는 원격제어를 할 수 있도록 코딩해 보자.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/9959C03A5DC290EE08?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/9959C03A5DC290EE08?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9959C03A5DC290EE08&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9959C03A5DC290EE08&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;143&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP-01 pin map&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노와 연결하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TX -&amp;gt; 아두이노 RX&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RX -&amp;gt; 아두이노 TX&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VCC -&amp;gt; 아두이노 3.3V&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CH_PD -&amp;gt; 아두이노 3.3V&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GND -&amp;gt; 아두이노 GND&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노의 출력 핀 TTL 전압은 5V이고 ESP-01 모듈은 3.3V이다. 따라서 아두이노 TX핀에서 출력되는 신호 전압을&amp;nbsp;TTL 레벨 쉬프트를 통해&amp;nbsp;ESP-01 모듈의 RX 핀에 3.3V의&amp;nbsp;신호 전압으로 변경해주어야 하지만, 테스트상에서는 별 문제가 없어서 아래와 같이 TTL 레벨 쉬프트 없이 연결하였다. 이 연결 방식은 장시간 사용 시 ESP-01 모듈에 손상을 줄 가능성이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장시간 사용할 예정이라면 아두이노 TTL 레벨 쉬프트를 검색하여 적용하기 바란다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/9939D1345CE168A717?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/9939D1345CE168A717?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9939D1345CE168A717&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9939D1345CE168A717&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;368&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* TTL 레벨 쉬프트 연결도&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_아두이노 TTL 레벨 시프트.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZNUeO/btrXK8NKwv6/l2BbmwkFBvYMwbo6cSISs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZNUeO/btrXK8NKwv6/l2BbmwkFBvYMwbo6cSISs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZNUeO/btrXK8NKwv6/l2BbmwkFBvYMwbo6cSISs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZNUeO%2FbtrXK8NKwv6%2Fl2BbmwkFBvYMwbo6cSISs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;376&quot; data-filename=&quot;edited_edited_아두이노 TTL 레벨 시프트.png&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조&lt;span&gt;&amp;nbsp;&lt;/span&gt;사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://arduino.stackexchange.com/questions/44336/esp-01-adapter-and-logic-level-converter&quot;&gt;https://arduino.stackexchange.com/questions/44336/esp-01-adapter-and-logic-level-converter&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결을 하였다면 AT command를 통해 정상 작동 여부를 확인해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 파일을 아두이노에 업로드해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cTbkwB/btqVIJpgnYd/ZvCi0VMsND9wc2xmsXAok1/Serial_basic_esp01.ino?attach=1&amp;amp;knm=tfile.ino&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Serial_basic_esp01.ino&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#define rxPin 3&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#define txPin 2&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(TX, RX);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void setup() {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Serial.begin(115200);&amp;nbsp; &amp;nbsp;//시리얼 모니터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; esp01.begin(115200);&amp;nbsp; //와이파이 시리얼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void loop() {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; if (esp01.available()) {&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; Serial.write(esp01.read());&amp;nbsp; //블루투스 측 내용을 시리얼 모니터에 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; if (Serial.available()) {&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; esp01.write(Serial.read());&amp;nbsp; //시리얼 모니터 내용을 블루투스 측에 쓰기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP-01의 기본 baud rate는 115200이다. 현재 상태의 작동 여부를 확인하기 위해 하드웨어와 소프트웨어 시리얼 baud rate를&amp;nbsp; 둘 다 115200으로 맞추어 주었다. 115200으로 해놓아도 AT command의 사용에는 지장이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노 시리얼 모니터의 전송 옵션을 Both NL &amp;amp; CR, 보드 레이트를 115200으로 맞추어 주고 아두이노 시리얼 모니터 입력창에 AT를 입력하고 엔터를 친다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답으로 OK가 들어온다면 기기의 정상작동과 연결이 잘 되었음을 확인할 수 있다.&amp;nbsp;아래 그림처럼 수신된 데이터에 읽을 수 없는 문자가 섞여 있을 수 있다. 하지만 OK만 확인된다면 문제는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 3.본문 배너1 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;3647290720&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노에서 softwareSerial을 통해 안정적으로 사용하기 위해서는 baud rate를 9600으로 변경해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP-01의 baud rate를 변경하는 방법으로는 기본 baud rate가 9600으로 설정된 펌웨어를 모듈에 업데이트하는 방법과 AT command를 사용하여 변경해주는 방법이 있는데 이 글에서는 AT command를 사용하여 진행하겠다. 펌웨어 업데이트에 관해서는 인터넷상에 관련 글들이 많이 있으므로 참조하길 바란다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노 시리얼 모니터 입력창에 AT+UART_DEF=9600,8,1,0,0 를 복사한 뒤 붙여 넣고 엔터를 쳐준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99A8073D5CE16BB82D?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99A8073D5CE16BB82D?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99A8073D5CE16BB82D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99A8073D5CE16BB82D&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;410&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;409&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래처럼 OK 응답이&amp;nbsp;표시된다면&amp;nbsp;ESP-01의&amp;nbsp;baud rate가 9600으로 변경된 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/992EF23D5CE16BB927?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/992EF23D5CE16BB927?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/992EF23D5CE16BB927&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F992EF23D5CE16BB927&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;363&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP-01의&amp;nbsp;baud rate가 9600으로 변경되었으니 위의 코드의&amp;nbsp;baud rate를 115200에서 9600으로 아래 그림과 같이 변경해주고 업로드한다. 그리고 시리얼 모니터의 보드 레이트도 9600으로 변경한 뒤 AT를 입력하여 정상 작동 여부를 확인하면 준비는 끝나게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/994A9E3D5CE16BB932?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/994A9E3D5CE16BB932?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/994A9E3D5CE16BB932&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F994A9E3D5CE16BB932&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;411&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인이 되었으면 스케치 상 보드 레이트를 9600 상태에서 저장을 시켜놓자. 이제 보드 레이트 115200은 사용하지 않게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP-01 wifi 모듈을 이용한 아두이노 원격제어의 방법은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP-01 모듈을&amp;nbsp;soft AP로 설정(공유기 기능)하여 스마트폰의 wifi가 AP의 ip로 연결할 수 있게 하고&amp;nbsp; 또한,&amp;nbsp;server로 설정하여&amp;nbsp;soft AP&amp;nbsp;통해 연결된&amp;nbsp;스마트폰이 server로 웹페이지를 요청할 수 있도록 하게 된다. 이렇게 함으로써,&amp;nbsp;만약 서버의 ip가 192.168.4.1로 설정되었을 경우,&amp;nbsp;스마트폰 웹브라우저 주소창에 http://192.168.4.1/on 입력하여&amp;nbsp;서버에 on 페이지에 대한 요청을 할 수 있게 된다. 이때&amp;nbsp;ESP-01 모듈은&amp;nbsp;들어온&amp;nbsp;웹페이지 요청 값을 시리얼 통신을 통해 아두이노에 전송하게 되고 아두이노는&amp;nbsp;수신된 웹페이지 요청 값을 코드에 따라서 원격제어에 필요한 on 만을 분리해내고 그 값에 해당하는 코드를 실행시켜&amp;nbsp;아두이노&amp;nbsp;원격제어를 구현하게 된다. 만약 on에 대한 응답 코드가 아두이노에 설정되어 있다면 아두이노는 시리얼 통신을 통해&amp;nbsp;ESP-01 모듈에 웹페이지 요청에 대한 응답을 보내라고 명령하게 되고&amp;nbsp;ESP-01 모듈은 그 명령에 따라 스마트폰에 응답을 보내게 된다. 이러한 과정을 통하여 스마트폰과 아두이노 간의 원격제어용 데이터 송신 및 수신이 이루어지게 된다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/999FB63A5CE2934C1E?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/999FB63A5CE2934C1E?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/999FB63A5CE2934C1E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F999FB63A5CE2934C1E&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;184&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기의 작업을 수행할 수 있도록&amp;nbsp;ESP-01를 설정하는데 필요한&amp;nbsp;AT command에 대해 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AT+RST&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //&amp;nbsp;ESP-01&amp;nbsp;리셋&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AT+CWMODE=2&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //&amp;nbsp;1 = Station mode (client),&amp;nbsp;2 = AP mode (host),&amp;nbsp;3 = AP + Station mode&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AT+CWSAP=&quot;esp01&quot;,&quot;1234test&quot;,5,3&amp;nbsp; &amp;nbsp;// AT+CWSAP=&amp;nbsp;softAP SSID,&amp;nbsp;Password,&amp;nbsp;channel id, ecn&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ecn(보안설정) : 0 = OPEN, 2 = WPA_PSK, 3 = WPA2_PSK, 4 = WPA_WPA2_PSK&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AT+CIFSR&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//&amp;nbsp;AP IP 주소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AT+CIPMUX=1&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //&amp;nbsp;0: Single connection,&amp;nbsp;1: Multiple connections (0 ~ 4), 서버 설정 시 &quot;1&quot; 강제 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AT+CIPSERVER=1,80&amp;nbsp; &amp;nbsp; &amp;nbsp;//&amp;nbsp;AT+CIPSERVER= mode, port&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mode:&amp;nbsp;0: Delete server,&amp;nbsp;1:&amp;nbsp;Create server,&amp;nbsp;port number&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기의 AT command를 앞서 보드 레이트 변경 시와 같이 주석 앞부분을 복사하여 차례대로 아두이노 시리얼 모니터 입력창에 붙여 넣기 한 뒤 엔터를 치면 아래와 같이&amp;nbsp;ESP-01 모듈이 설정되는 것을 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;797&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99B575485CE2A42110?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99B575485CE2A42110?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B575485CE2A42110&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B575485CE2A42110&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;713&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;797&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP-01 모듈의 soft AP의 기본 설정 ip 주소는&amp;nbsp;192.168.4.1이다. 현재 soft AP의 주소가 기본 설정값인 192.168.4.1 임을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 4.본문배너2 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;9606701598&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스마트폰에서 wifi 장치를 켜게 되면 상기에서 설정한 대로 SSID &quot;esp01&quot;이 검색될 것이다. 클릭하고 설정해 놓은 비밀번호를 입력하고 연결해 보자. 연결 후 네트워크 설정 관리에 들어가 보면 스마트폰이 할당받은 ip 주소를 확인할 수 있다. 아두이노 원격제어에서 우리가 할당받은 ip주소를 사용할 일은 거의 없다. 단지,&amp;nbsp;soft AP의 주소와 비슷하여 혼동을 방지하기 위해 확인이 필요한 것뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99E931475CE29F302B?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99E931475CE29F302B?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99E931475CE29F302B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99E931475CE29F302B&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;280&quot; height=&quot;268&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/9943CA475CE29F3013?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/9943CA475CE29F3013?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9943CA475CE29F3013&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9943CA475CE29F3013&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;198&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99D295475CE29F3136?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99D295475CE29F3136?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99D295475CE29F3136&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D295475CE29F3136&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;280&quot; height=&quot;458&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스마트폰이 soft AP에 접속이 되면 아래와 같이 시리얼 모니터상에 connection id: 0이 연결됐다는 표시와&amp;nbsp;+IPD,0,459:GET /hi HTTP/1.1 수신 데이터가 표시되고, 접속장비와&amp;nbsp;soft AP의 ip 주소를 확인할 수 있고 데이터 수신 후에 id 0번의 연결을 끊은걸 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;520&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99FED83E5CE2A58108?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99FED83E5CE2A58108?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99FED83E5CE2A58108&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99FED83E5CE2A58108&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;520&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;520&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 수신&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+IPD,0,158:GET / HTTP/1.1&amp;nbsp; // +IPD,id,len:GET /data HTTP/1.1&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// id: id no. of connection, len: data length, data: data received&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;+IPD,0,158:GET /&quot; 이하가 수신된 데이터이다. 수신 시에는&amp;nbsp;AT+CIPMUX=1&amp;nbsp;옵션 설정에 따라 멀티 커넥션 id 0부터 4까지 자동으로 할당되어 사용하게 되며 수신이 완료되면 자동으로 연결을 닫게 되는데 연결을 닫기 전에 수신되는 데이터는 다른 커넥션 id로 자동 할당되어 수신되는 걸 테스트를 통해 확인할 수 있었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의 전송&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AT+CIPSEND=0,30&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AT+CIPSEND=length&amp;nbsp; &amp;nbsp; // normal send (single connection).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AT+CIPSEND=id,length&amp;nbsp; // normal send (multiple connection), id: ID no. of connection, length: data length, MAX 048 bytes&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AT+CIPCLOSE=0&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // id： ID no. of connection to close,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Close TCP or UDP connection.For multiply connection mode&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP-01을 통해 데이터 송신 시에는 아두이노에서 시리얼 통신을 통해 상기의 데이터 전송 AT command를 사용하여 전송 데이터와 함께 보내야만 데이터가 스마트폰으로 전송된다. 시리얼 통신으로 연결된다는 것 자체가 데이터의 전송 속도에 제한을 걸게 되는데, 이 상황에 더불어 모듈이 AT command를 수신하고 작동하는 시간이 소요되게 되어 아두이노에서 어떤 작동의 응답으로 ESP-01 모듈의 wifi를 통해 데이터 전송할 경우 약 1초 에서 2초의 시간이 걸리게 된다. 이 얘기는 짧은 시간 동안 연속되는 데이터의 전송하는 데 있어서 문제를 야기하게 된다고 할 수 있다. 필자는 ESP-01의 이러한 데이터 전송 특성 때문에 발생하는 사용의 불편함(긴 응답 시간)에 따라 이 기능의 효용성이 낮다고 보아 아두이노에서 스마트폰으로 데이터를 전송하는 기능을 아예 사용하지 않기로 하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기와 같이 아두이노 시리얼 모니터를 통해 ESP-01을 일일이 설정하는 것은 많이 불편하다. 코드상에서 아두이노 실행 시 자동으로 설정되도록 하는 코드를 인터넷에서 쉽게 찾아볼 수 있었고 이를 이용하기로 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 코드를 아래와 같이 코딩해 주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String sendData(String command, const int timeout, boolean debug) {&amp;nbsp; // 스트링 타입 AT command 전송 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; String response = &quot;&quot;;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 스트링 타입 지역변수 선언 및 초기화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; esp01.print(command);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //&amp;nbsp;ESP-01 모듈에&amp;nbsp;스트링 타입의 AT command 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; long int time = millis();&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; while( (time+timeout) &amp;gt; millis()) {&amp;nbsp; &amp;nbsp; //&amp;nbsp;ESP-01 모듈의 명령 실행 후 응답에 필요한 시간이 경과되면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; while(esp01.available()) {&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //&amp;nbsp;&amp;nbsp;시리얼 버퍼에&amp;nbsp;ESP-01 모듈의 응답을 있을 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; char c = esp01.read();&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 1byte 데이터를 char타입 변수 c에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; response+=c;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // c에 저장된 문자를 문자열로 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; if(debug) Serial.print(response);&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// debug가 참이면 시리얼 모니터에 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; return response;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전송 실행 함수:&amp;nbsp;sendData(문자열 명령, 응답에 필요한 시간, 시리얼 모니터 출력 플래그);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendData(&quot;AT+RST\r\n&quot;,2000,DEBUG);&amp;nbsp; //리셋&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendData(&quot;AT+CWMODE=2\r\n&quot;,1000,DEBUG); // configure as access point (working mode: AP+STA)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendData(&quot;AT+CWSAP=\&quot;ESP-01\&quot;,\&quot;1234test\&quot;,11,3\r\n&quot;,1000,DEBUG); // join the access point&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendData(&quot;AT+CIFSR\r\n&quot;,1000,DEBUG); // get ip address&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendData(&quot;AT+CIPMUX=1\r\n&quot;,1000,DEBUG); // configure for multiple connections&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendData(&quot;AT+CIPSERVER=1,80\r\n&quot;,1000,DEBUG); // turn on server on port 80&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기 코드 중 wifi 연결 시 비밀번호 연결을 비활성화하고자 한다면 아래처럼 3을 0으로 변경해주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendData(&quot;AT+CWSAP=\&quot;ESP-01\&quot;,\&quot;1234test\&quot;,11,0\r\n&quot;,1000,DEBUG);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 5.본문배너3 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;5927891592&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 수신 데이터를 필요한 값만 추출해내는 parsing에 대해 살펴보겠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;parsing을 하기 위해서는 String class를 활용해야만 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기 AT command 설정 테스트에서 데이터 수신이&amp;nbsp;+IPD,0,158:GET / HTTP/1.1&amp;nbsp;형식으로 들어온 걸&amp;nbsp;확인했었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 웹브라우저에서 http://192.168.4.1/hi라고 입력하면&amp;nbsp;+IPD,0,459:GET /hi&amp;nbsp;HTTP/1.1&amp;nbsp;데이터가 수신될 것이다. 즉,&amp;nbsp;모든 데이터 수신에는&amp;nbsp;+IPD,0,158:GET / 형식의 코드가 선행된다.&amp;nbsp;&amp;nbsp;데이터 수신의 확인을 위해&amp;nbsp;&quot;+IPD,&quot;를 이용하여 하기로 하자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if (esp01.find(&quot;+IPD,&quot;)) { // 만약 시리얼 버퍼에 &quot;+IPD, &quot;가 있으면, &quot;+IPD,&quot;가 확인될 경우 &quot;+IPD,&quot;는 삭제된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수신 데이터를 스트링 타입 income_wifi 변수에 저장해 주면 &quot;0,158:GET / HTTP/1.1&quot;라는 스트링이 저장된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;income_wifi = esp01.readStringUntil('\r'); // 스트링 타입 income_wifi 변수에 '\r' 문자까지 저장&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;웹브라우저 주소 끝에는 자동으로 '\r' 문자가 붙는다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 data는 &quot;GET /&quot; 이후에 들어오고 종료 문자 역할을 하는 &quot;HTTP/1.1&quot;의 앞&amp;nbsp;공백 문자에서 끝나게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String class에서는 스트링 중의 일부를 떼어내어 저장할 수 있는&amp;nbsp;string.substring(start index, end index); 함수를 제공하고 있으며,&amp;nbsp;저장할 스트링의 시작 인덱스 번호와 종료 인덱스 번호를 필요로 한다. 이 함수를 이용하기 위해&amp;nbsp;&quot;GET /&quot;와&amp;nbsp;&quot;HTTP/1.1&quot;의 인덱스 번호를 알아내 보자.&lt;/p&gt;
&lt;div class=&quot;autosourcing-stub-extra&quot; style=&quot;line-height: 1.5; color: #323752; text-align: justify; zoom: 1; opacity: 1;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;income_wifi&amp;nbsp;스트링에서&amp;nbsp;&quot;GET /&quot;의 시작 인덱스 위치를 확인하는 코드는&amp;nbsp;income_wifi.indexOf(&quot;GET /&quot;)가 되고&amp;nbsp;&quot;HTTP/1.1&quot;의 시작 인덱스 위치를 확인하는 코드는&amp;nbsp;income_wifi.indexOf(&quot;HTTP/1.1&quot;)가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 번호를 사용하여 스트링에서 특정 위치의 스트링을 추출해내는 코드는 아래와 같게 된다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;income_wifi.substring(income_wifi.indexOf(&quot;GET /&quot;)+5, income_wifi.indexOf(&quot;HTTP/1.1&quot;)-1);&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;income_wifi.indexOf(&quot;GET /&quot;)는 &quot;GET /&quot;의 시작 인덱스 번호를 반환한다. 그러므로 필요한 위치의 인덱스 번호는&amp;nbsp; &quot;GET /&quot;의 글자 수 5를(공백 문자 포함) 더한 위치 값이 되게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;income_wifi.indexOf(&quot;HTTP/1.1&quot;)는&amp;nbsp;&quot;HTTP/1.1&quot;의&amp;nbsp;시작 인덱스 번호를 반환한다.&amp;nbsp;하지만 앞에 공백 문자(space)가 있으므로 -1을 해준 위치 값이 필요로 하는 위치 값이 되고,&amp;nbsp;상기의 코드에서는 data가 없으므로 두 위치 값은 같은 값일 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드를 아두이노에 업로드하고 스마트폰에서 soft AP에 접속해 보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/0HQ69/btqVRvpFQS1/tF6oJiGhyFNk7eW78jUXH0/Serial_basic_esp01_parsing.ino?attach=1&amp;amp;knm=tfile.ino&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Serial_basic_esp01_parsing.ino&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#define DEBUG true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String income_wifi = &quot;&quot;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SoftwareSerial esp01(2,3);&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void setup() {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Serial.begin(9600);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; esp01.begin(9600); // your esp's baud rate might be different&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+RST\r\n&quot;,2000,DEBUG); // reset module&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CWMODE=2\r\n&quot;,1000,DEBUG); // configure as access point (working mode: AP+STA)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CWSAP=\&quot;ESP-01\&quot;,\&quot;1234test\&quot;,11,0\r\n&quot;,1000,DEBUG); // join the access point&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CIFSR\r\n&quot;,1000,DEBUG); // get ip address&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CIPMUX=1\r\n&quot;,1000,DEBUG); // configure for multiple connections&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CIPSERVER=1,80\r\n&quot;,1000,DEBUG); // turn on server on port 80&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void loop() {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; if (esp01.available()) {&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; if (esp01.find(&quot;+IPD,&quot;)) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; income_wifi = esp01.readStringUntil('\r');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; String wifi_temp = income_wifi.substring(income_wifi.indexOf(&quot;GET /&quot;)+5, income_wifi.indexOf(&quot;HTTP/1.1&quot;)-1);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; Serial.println(wifi_temp);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String sendData(String command, const int timeout, boolean debug) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; String response = &quot;&quot;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; esp01.print(command); // send the read character to the esp01&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; long int time = millis();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; while( (time+timeout) &amp;gt; millis()) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; while(esp01.available()) {&amp;nbsp; // The esp has data so display its output to the serial window&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; char c = esp01.read(); // read the next character.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; response+=c;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; if(debug) Serial.print(response);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; return response;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스마트폰 웹브라우저 주소창에서 192.168.4.1/hi를 입력하고 연결을 클릭하면 아래와 같이 시리얼 모니터에 hi가 표시된 것을 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/9999E3425CE3EC9907?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/9999E3425CE3EC9907?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9999E3425CE3EC9907&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9999E3425CE3EC9907&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;416&quot; height=&quot;98&quot; data-origin-width=&quot;416&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99476E495CE2D97910?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99476E495CE2D97910?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99476E495CE2D97910&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99476E495CE2D97910&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;328&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞에서 살펴본&amp;nbsp;AT command 설정 시에는 스마트폰 접속 시 관련 정보들이 시리얼 모니터에 출력되었었지만 지금은 data를 제외한 모든 값은 출력이 안되게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 추출된 스트링 데이터를 이용하여 LED의 제어를 할 수 있게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 아두이노 기본 LED를 웹브라우저를 통해 제어할 수 있도록 스트링 LED 제어 코드를 추가해 주었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업로드하고 스마트폰 웹브라우저에 http://192.168.4.1/on을 입력하면 LED가 켜지는 것을 볼 수 있고 http://192.168.4.1/off를&amp;nbsp;&amp;nbsp;입력하면 LED가 꺼지는 것을 볼 수 있다.&amp;nbsp; &quot;on&quot; 또는 &quot;off&quot;가 아닌 텍스트를 입력한다면 시리얼 모니터에 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/y302z/btqVRvDda8F/ctEEtC94hr0a8GVVMH2yjK/Serial_basic_esp01_string_LED.ino?attach=1&amp;amp;knm=tfile.ino&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Serial_basic_esp01_string_LED.ino&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#define DEBUG true&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;#define ledPin 13&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String income_wifi = &quot;&quot;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SoftwareSerial esp01(2,3);&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void setup() {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Serial.begin(9600);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; esp01.begin(9600); // your esp's baud rate might be different&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; pinMode(ledPin, OUTPUT);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+RST\r\n&quot;,2000,DEBUG); // reset module&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CWMODE=2\r\n&quot;,1000,DEBUG); // configure as access point (working mode: AP+STA)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CWSAP=\&quot;ESP-01\&quot;,\&quot;1234test\&quot;,11,0\r\n&quot;,1000,DEBUG); // join the access point&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CIFSR\r\n&quot;,1000,DEBUG); // get ip address&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CIPMUX=1\r\n&quot;,1000,DEBUG); // configure for multiple connections&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CIPSERVER=1,80\r\n&quot;,1000,DEBUG); // turn on server on port 80&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void loop() {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; if (esp01.available()) {&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; if (esp01.find(&quot;+IPD,&quot;)) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; income_wifi = esp01.readStringUntil('\r');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; String wifi_temp = income_wifi.substring(income_wifi.indexOf(&quot;GET /&quot;)+5, income_wifi.indexOf(&quot;HTTP/1.1&quot;)-1);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(wifi_temp == &quot;on&quot;){&amp;nbsp; // wifi_temp는 지역변수로서 &quot;if (esp01.find(&quot;+IPD,&quot;)){} 함수를 나가면 초기화됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; digitalWrite(ledPin, HIGH);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; else if(wifi_temp == &quot;off&quot;){&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; digitalWrite(ledPin, LOW);&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; else {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Serial.println(wifi_temp);&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String sendData(String command, const int timeout, boolean debug) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; String response = &quot;&quot;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; esp01.print(command); // send the read character to the esp01&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; long int time = millis();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; while( (time+timeout) &amp;gt; millis()) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; while(esp01.available()) {&amp;nbsp; // The esp has data so display its output to the serial window&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; char c = esp01.read(); // read the next character.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; response+=c;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; if(debug) Serial.print(response);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; return response;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 웹브라우저를 이용하는 대신&amp;nbsp;안드로이드&amp;nbsp;앱을 이용하여 원격제어를 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arduino bluetooth controller PWM 안드로이드 앱의 wifi를 이용한 원격제어용 데이터 전송 프로토콜은 다음과 같이 코딩해 주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디지털 버튼 제어 프로토콜: &quot;%%F0&quot; + 스트링 값 + &quot;%%F1&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 스트링 값 = &quot;10&quot; 버튼1 off, 스트링 값 = &quot;11&quot; 버튼1 on, &quot;20&quot; 버튼2 off, &quot;21&quot; 버튼2 on, ......&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PWM 값 프로토콜: 1번 슬라이드 &quot;%%F31&quot; + 스트링 값 + &quot;%%F1&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2번 슬라이드 &quot;%%F32&quot; + 스트링 값 + &quot;%%F1&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;3번 슬라이드 &quot;%%F33&quot; + 스트링 값 + &quot;%%F1&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기 예제 코드에서는 스트링을 parsing 할 때 시작 문자열로서&amp;nbsp;&quot;GET /&quot; 종료 문자열로서&amp;nbsp;&quot;HTTP/1.1&quot;를 사용했다. 이들을 상기 프로토콜에 적용하여 코드를 바꾸어 주었다. 또한 스트링으로 데이터를 한 번에 받기 때문에 &quot;%%F1&quot;와 &quot;%%F0&quot;가 스트링에 있다면 그 데이터의 검증이 완료된 것으로 볼 수 있다. 앞선 블루투스 원격제어에서는 검증 시 여러 단계가 필요했으나 스트링으로 데이터를 한꺼번에 받을 경우 코드가 간단해진다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if (income_wifi.indexOf(&quot;%%F1&quot;) != -1) { // 만약 스트링 중에 &quot;%%F1&quot; 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if (income_wifi.indexOf(&quot;%%F0&quot;) != -1) { // &quot;%%F0&quot; 있으면 디지털 버튼 상태 값 검증이 되어&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String wifi_temp = income_wifi.substring(income_wifi.indexOf(&quot;%%F0&quot;)+4, income_wifi.indexOf(&quot;%%F1&quot;)); // 값 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if (income_wifi.indexOf(&quot;%%F31&quot;) != -1) { // 만약 스트링 중에 &quot;%%F31&quot; 있고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if (income_wifi.indexOf(&quot;%%F0&quot;) != -1) { // &quot;%%F0&quot; 있으면 슬라이드 1 PWM 값 검증이 되어&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String wifi_temp = income_wifi.substring(income_wifi.indexOf(&quot;%%F31&quot;)+5, income_wifi.indexOf(&quot;%%F1&quot;)); // 값 저장&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기타 프로토콜에 해당되지 않는 텍스트는 앞선 parsing 방법을 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String wifi_temp = income_wifi.substring(income_wifi.indexOf(&quot;GET /&quot;)+5, income_wifi.indexOf(&quot;HTTP/1.1&quot;)-1);&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 설명중 데이터 수신에서 멀티 커넥션 id에 관해 언급했었다.&amp;nbsp;ESP-01 모듈은 데이터 수신 시 5개의 id를 사용하여 연결을 하게 되는데 그 id 번호는 0부터 4까지이다.&amp;nbsp; 상기에 링크를 걸었던 ESP-01 모듈 AT command 참조 사이트에 의하면 만약 0 ~ 4까지 모두 사용하고 있는 상태에서 추가 연결이 있을 경우(id 값이 5가 될 경우) 모든 연결은 끊긴다고 한다. 필자가 확인해 본 결과 모두 끊기면서 더 이상 연결이 되지 않는다. 이런 상황이 되었을 경우 데이터의 송 수신이 안되게 되어 닫힌 멀티커넥션 기능을 열기 위해서는 리셋을 해주어야만 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가로 설명하자면, 데이터 수신 시 id 0번부터 받게 되고 수신이 완료되면 id 0번의 연결을 끊는 것을 앞선 예제에서 확인했었다. id 0번의 연결이 끊기게 되면 이때 id 0번이 다시 데이터를 받을 수 있는 상태로 초기화 되게 된다.&amp;nbsp;만약 id 0번의 연결이&amp;nbsp;끊기 전에 데이터가 들어오게 된다면, 다음 id인&amp;nbsp;1번으로 넘어가게 되고 다시 id 0번이 끊겨 초기화가 되면 다시 id 0번으로 데이터를 수신하게 된다.&amp;nbsp;즉 연속된 데이터를 id 순서대로 받다가 앞선 번호에서 초기화가 되면 그 id를 우선 사용하게 된다. 수신되는 데이터 간격이 길어&amp;nbsp;id 0번이&amp;nbsp;수신 완료하고 초기화되었다면 계속에서 id 0번을 사용하게 된다.&amp;nbsp;&amp;nbsp;문제는 id의 연결을 끊고 초기화시키는데 시간이 걸린다는 것이다.&amp;nbsp;데이터가 빠르게&amp;nbsp;연속으로 들어올 경우 id가 초기화되기 전에 id 0부터 id 4까지 모두&amp;nbsp;연결된 상태가 되어 모든 연결을 끊고 더 이상 데이터를 수신하지 못하는 현상이 발생하게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해서&amp;nbsp;데이터를 읽는 시간 간격을 강제하고 활성화된 id를 AT command를 통해 강제로&amp;nbsp;끊는 코드를 아래와 같이 추가해 보았으나 그것 만으로는 충분하지 않았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;connectionId = income_wifi.charAt(0);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unsigned long int one_millis = 0;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void wifi_delay() { // 50 millis 마다 연결된 id 가 있으면 그 아이디를 종료시키고&amp;nbsp;데이터 수신확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; if (millis() - one_millis &amp;gt; 50) {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; one_millis = millis();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; if (connectionId == '0') esp01.write(&quot;AT+CIPCLOSE=0\r\n&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; else if (connectionId == '1') esp01.write(&quot;AT+CIPCLOSE=1\r\n&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; else if (connectionId == '2') esp01.write(&quot;AT+CIPCLOSE=2\r\n&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; else if (connectionId == '3') esp01.write(&quot;AT+CIPCLOSE=3\r\n&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; else if (connectionId == '4') esp01.write(&quot;AT+CIPCLOSE=4\r\n&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; wifi_read();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; }&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다른 문제로는 수신된 데이터 각각의 id로 분산되어 받게 될 경우 그 순서가 뒤바뀔 수 있다는 것이다. 한 개의 아이디로 연속된 데이터를 받는다면 순서는 뒤바뀌지 않는다. 모듈에서 멀티 커넥션&amp;nbsp;id 연결 시 데이터 수신 시점의 시간 값에 대한 검증은 하지 않는 것 같으며&amp;nbsp;마지막에 출력되어야 할 값이 그전 값보다 먼저 출력되는 현상을 여러 번 확인했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 wifi 연결에 대한 응답&amp;nbsp;server의 구동에 있어 멀티 커넥션 자체가 다중 접속을 고려한 것이지 한 사용자의 연속된 데이터를 전송받기 위한 구성은 아닐 것이라 생각되며 웹페이지 요청 순서는 중요하지 않을 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어찌 되었든지 간에 원격제어를 하기 위해서는 신뢰할 수 있는 값의 순서가 필요하고 이런 문제를 해결하기 위해서는&amp;nbsp;한 개의 id만을 사용하여 받을 수 있도록&amp;nbsp;스마트폰에서 데이터를 전송하는 간격을 늘려주는 방법 외에는 찾을 수가 없었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP-01 wifi 모듈로 원격제어를 하는것은&amp;nbsp;블루투스 모듈의 사용에 비해&amp;nbsp;적당한 방법은 아니라고 생각이 되나 연결거리가 블루투스 보다 길어 또한 필요하게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP-01 wifi 모듈의 특징을 이해하고 모듈의 성능에 맞게 필요 기능이 적용되도록 코딩해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 데이터 전송 시 시리얼 통신을 통하여 AT command를 매번 실행시켜주어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서버로서 데이터 수신 시 연결 옵션으로 멀티 커넥션 사용이 강제되어 있고 수신에 사용된 id가 사용 중이거나 종료되지 않은 경우에 추가되는 요청은 다음 id가 요청받게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 연결용 id 5개가 모두 연결된 상태에서 추가 요청이 올 경우 모두 닫힌다. -&amp;gt; 리셋해야만 다시 사용 가능해진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 3번의 경우를 방지하기 위해 데이터 수신이 완료되면 반드시 id연결을 끊고 대기 상태로 하여야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 연속되는 데이터를 받을 경우 id가 바뀌면서 데이터를 수신하게 되는데 그때 데이터 값의 순서가 바뀔 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 6.본문배너4 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;8253257324&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 편에 살펴볼 NODE MCU 1.0(ESP-12E, esp8266 칩셋)이나 ESP32 Dev Module의 경우 상기&amp;nbsp;ESP-01의&amp;nbsp;특징 중 2, 3, 5번은 동일한 거 같으나 모듈 자체에 wifi가 내장되어있어&amp;nbsp;ESP-01의 경우처럼&amp;nbsp;모듈과 wifi간 시리얼 통신을 사용하지 않을 뿐만 아니라&amp;nbsp;AT command도 사용하지 않게 되어 사용 id의 종료가 상대적으로 빠르다고 할 수 있다. 하지만 이 두 모델도 연속되는 빠른 데이터 수신 시 5번의 현상이 발견되었고 이를 해결하기 위해서 스마트 폰에서 데이터 전송 간격을 조정해주어야만 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스마트폰에서 이 두 모듈의 데이터 전송 간격은 ESP-01 모듈보다는 짧고&amp;nbsp;블루투스 모듈보다는 길게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Hz8lr/btqVAHzcN11/j1edrbMV3sZkthygLwnk21/arduino_remote_control_esp01.ino?attach=1&amp;amp;knm=tfile.ino&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;arduino_remote_control_esp01.ino&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드를 아두이노에 업로드한 뒤 스마트폰에서&amp;nbsp;ESP-01의 soft AP에 접속한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arduino bluetooth controller PWM 안드로이드 앱을 실행한 뒤 wifi 아이콘을 클릭하고&amp;nbsp;ESP-01의 soft AP 192.168.4.1을 입력하고 esp01 체크 박스에 체크를 해준다. 앱에는 기본적으로 100 밀리 초마다&amp;nbsp;soft AP ip 주소로 응답 요청을 하도록 프로그램되어있다. 하지만 현재&amp;nbsp;ESP-01을 활용한 아두이노 스케치 코드에는 응답에 대한 어떠한 코드도 없으므로 스마트폰은 요청에 대한 응답을 받지 못하고 오류를 발생하게 된다.&amp;nbsp;esp01 체크 박스에 체크를 해주면 100 밀리 초마다&amp;nbsp;soft AP ip 주소에&amp;nbsp;응답 요청을 하지 않게 되어 사용 가능하게 된다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a class=&quot;tx-link&quot; href=&quot;https://play.google.com/store/apps/details?id=com.appybuilder.arduino_appy.arduino_BT_controller_PWM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;arduino bluetooth controller PWM - 아두이노 원격제어 안드로이드 앱 버전 3.5 다운로드&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a class=&quot;tx-link&quot; href=&quot;https://nxpop.tistory.com/2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;arduino bluetooth controller PWM 매뉴얼&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;*** 앱에서 와이파이 연결은 안드로이드8 [갤럭시S7]이하 버전에서만 작동합니다 ***&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;*** 앱에서 블루투스 연결은 안드로이드 10 이하 버전에서만 작동합니다 ***&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/995DD04D5CE3EDF209?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/995DD04D5CE3EDF209?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/995DD04D5CE3EDF209&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F995DD04D5CE3EDF209&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;429&quot; height=&quot;256&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Confirm을 클릭한 뒤 버튼 1번을 클릭하면 아두이노 기본 LED가 켜지는 것을 볼 수 있고 버튼 2번 부터는 시리얼 모니터에 작동 상태가 표시된다. PWM 제어용 슬라이드는 천천히 움직일 경우 연속되는 데이터가 전송되고 빠르게 움직이면 최종 정지했을 때의 값만 전송된다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP-01 모듈 연결 시는 안드로이드 앱에서 wifi를 통해 연결되었다는 어떠한 표시도 볼 수 없다. 아두이노에서 스마트폰으로 응답을 주는 코드가 없기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NODE MCU 1.0(ESP-12E, esp8266 칩셋)이나 ESP32 Dev Module의 경우 체크박스에 체크를 한 상태에서 Confirm을 클릭하게 되면&amp;nbsp;응답 요청을 하지 않게 되어 아두이노 측에서 입력된 값을 스마트폰에 출력을 하지 못하게 만든다. 아두이노 시리얼 모니터에 hello를 입력하면 스마트폰에 hello가 표시되어야 하나 표시가 되지 않는다. 이는 서버의 특징으로 스마트폰(클라이언트 또는 마스터)의 요청 시에만 서버(슬레이브)는 연결된 id를 통해&amp;nbsp;응답을 할 수 있기 때문에 요청이 없는 상태에서는 아두이노에서 스마트폰으로 데이터를 전송하지 못하게 된다.&amp;nbsp;&amp;nbsp;또한 현재 연결되어 응답을 수신하고 있다는 표시도 할 수 없게 되어, 와이파이가 중간에 끊어져도 알 수 없게 된다. 하지만&amp;nbsp;&amp;nbsp;ESP-01 모듈처럼&amp;nbsp;스마트폰에서 모듈의 제어를 하는 기능은 문제없이 사용 가능하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NODE MCU 1.0(ESP-12E, esp8266 칩셋)이나 ESP32 Dev Module의 경우에는&amp;nbsp;esp01 체크 박스에 체크하지 않고 Confirm을 클릭해야만&amp;nbsp;wifi를 통해 연결되었을 때 응답을 수신하고 현재 연결된 상태라는 것을 표시하게 되고 만약, 가변저항이 연결되어 있다면 가변저항의 조정 상태를 슬라이드 바로 표시할 수 있게 된다. &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99DC884F5CE3EF1810?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99DC884F5CE3EF1810?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99DC884F5CE3EF1810&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99DC884F5CE3EF1810&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;472&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bRfoTj/btqVQWgKm9M/ev136GN4ULOEcnYu0dBKgk/arduino_remote_control_esp01_pwm.ino?attach=1&amp;amp;knm=tfile.ino&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;arduino_remote_control_esp01_pwm.ino&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2019.11.22 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제까지 ESP01의&amp;nbsp;soft AP에 연결하여 아두이노를 제어했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP01을 station모드로 공유기에 연결하고 내부 네트워크를 통한 아두이노 원격 제어해보자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP01을 staion 모드로 공유기에 연결하면 공유기는 ESP01에 ip주소를 할당해 준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 주소를 통해&amp;nbsp;내부 네트워크용 안에서 원격제어를 할 수 있게 되는데 이를 위해서는 반드시&amp;nbsp;시리얼 모니터에 표시되는&amp;nbsp;할당받은 ip주소를&amp;nbsp;확인한 뒤에 연결해야만 한다.&amp;nbsp;(공유기에서 ESP01에 지정 ip를 할당하는&amp;nbsp;설정을 할 수 없는 경우) 또는 한번 받은 ip 주소를 메모해 두었다가 다시 연결 시 그 주소를&amp;nbsp;입력하여 사용할 수도 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 시리얼 모니터에서 ip주소를 확인하거나 ip주소가 변경되어 메모해둔 ip주소로 연결할 수 없는 경우도 발생할 수 있어 불편하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기 이유로 내부 네트워크 이용 원격제어가 불필요하다고 생각하여 설명하지 않았었는데, 공유기에 스마트폰이 연결된 상태에서는 soft AP를 이용한 원격제어처럼 와이파이를 따로 연결하지 않아도 되는 편리한 점 때문에 설명을 추가하게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://t1.daumcdn.net/cfile/tistory/99D7A74B5DD77D1122?original&quot; data-phocus=&quot;https://t1.daumcdn.net/cfile/tistory/99D7A74B5DD77D1122?original&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99D7A74B5DD77D1122&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99D7A74B5DD77D1122&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;452&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP01을 station 모드로 공유기에 연결하기 위해서 아래와 같이 setup() 함수 코드를 변경해 주었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;void setup() {&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Serial.begin(9600);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; esp01.begin(9600); // your esp's baud rate might be different&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; pinMode(ledPin, OUTPUT);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+RST\r\n&quot;,2000,DEBUG); // reset module&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CWMODE=1\r\n&quot;,1000,DEBUG); // configure as access point (working mode: AP+STA)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CWDHCP=1,1\r\n&quot;,1000,DEBUG);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CWJAP=\&quot;&quot;+ ssid +&quot;\&quot;,\&quot;&quot;+pass+&quot;\&quot;\r\n&quot;,8000,DEBUG);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CIFSR\r\n&quot;,1000,DEBUG); // get ip address&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CIPMUX=1\r\n&quot;,1000,DEBUG); // configure for multiple connections&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; sendData(&quot;AT+CIPSERVER=1,80\r\n&quot;,1000,DEBUG); // turn on server on port 80&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드를 업로드하고 시리얼 모니터를 통해 공유기에서 할당받은 ip를 확인하고 ip 주소 192.168.4.1 대신 공유기에서 할당받은 ip를 입력하고 연결해 주면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2021.03.06 추가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일정 시간 경과 후 와이파이 연결 및 데이터 전송에 관한 테스트&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유기를 통해 테스트하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유기 아이디: skynet&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공유기 비번: skynet00&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스마트폰의 와이파이가 공유기 skynet에 연결된 상태에서&amp;nbsp;arduino bluetooth controller PWM 앱을 이용해 테스트했습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아두이노 코드&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cUaUth/btqZjvaIeTO/SP27tZm0EJKMTQbmo8q2wK/arduino_remote_control_esp01_station_softAP_revised.ino?attach=1&amp;amp;knm=tfile.ino&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;arduino_remote_control_esp01_station_softAP_revised.ino&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1614992929408&quot; class=&quot;c++ arduino&quot; data-ke-language=&quot;c++&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt; 
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(TX, RX);

const String ssid = &quot;skynet&quot;;    // your network SSID (name)
const String pass = &quot;skynet00&quot;;         // your network password

const String ssid_AP = &quot;ESP-01&quot;;    // your network SSID (name)
const String pass_AP = &quot;1234test&quot;;         // your network password
String ip = &quot;&quot;;
bool ipCheck = false;

#define DEBUG true
#define ledPin 13

uint8_t pin_val = 0; // 디지털 버튼 제어용 변수
uint16_t pwm1 = 0;   // pwm 제어용 변수
uint16_t pwm2 = 0;
uint16_t pwm3 = 0;
String text = &quot;&quot;;
char connectionId; // 연결 id 저장 변수
String income_wifi = &quot;&quot;;

void setup() {
  Serial.begin(9600);
  esp01.begin(9600); // your esp's baud rate might be different
  pinMode(ledPin, OUTPUT);
  sendData(&quot;AT+RST\r\n&quot;,2000,DEBUG); // reset module
  sendData(&quot;AT+CWMODE=3\r\n&quot;,1000,DEBUG); // configure as access point (working mode: AP+STA)
  sendData(&quot;AT+CWDHCP=1,1\r\n&quot;,1000,DEBUG);
  sendData(&quot;AT+CWSAP=\&quot;&quot;+ ssid_AP +&quot;\&quot;,\&quot;&quot;+pass_AP+&quot;\&quot;,11,0\r\n&quot;,1000,DEBUG); // join the access point
  sendData(&quot;AT+CWJAP=\&quot;&quot;+ ssid +&quot;\&quot;,\&quot;&quot;+pass+&quot;\&quot;\r\n&quot;,8000,DEBUG);
  sendData(&quot;AT+CIFSR\r\n&quot;,1000,DEBUG); // get ip address
  sendData(&quot;AT+CIPMUX=1\r\n&quot;,1000,DEBUG); // configure for multiple connections
  sendData(&quot;AT+CIPSERVER=1,80\r\n&quot;,1000,DEBUG); // turn on server on port 80
}
 
void loop() {
  wifi_delay();
  if(Serial.available() &amp;gt; 0){ // 아두이노 모듈 작동 확인
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
  }
}

unsigned long int one_millis = 0;

void wifi_delay() { // 100 millis
  if (millis() - one_millis &amp;gt; 50) {
    one_millis = millis();
    if (connectionId == '0') esp01.write(&quot;AT+CIPCLOSE=0\r\n&quot;);
    else if (connectionId == '1') esp01.write(&quot;AT+CIPCLOSE=1\r\n&quot;);
    else if (connectionId == '2') esp01.write(&quot;AT+CIPCLOSE=2\r\n&quot;);
    else if (connectionId == '3') esp01.write(&quot;AT+CIPCLOSE=3\r\n&quot;);
    else if (connectionId == '4') esp01.write(&quot;AT+CIPCLOSE=4\r\n&quot;);
    wifi_read();
  }
}

void wifi_read() {
  if (esp01.available()) { // check if the esp is sending a message
    if (esp01.find(&quot;+IPD,&quot;)) {
      income_wifi = esp01.readStringUntil('\r');
      Serial.println(income_wifi);
      connectionId = income_wifi.charAt(0);
      if (income_wifi.indexOf(&quot;%%F1&quot;) != -1) {
        if (income_wifi.indexOf(&quot;%%F0&quot;) != -1) {
          String wifi_temp = income_wifi.substring(income_wifi.indexOf(&quot;%%F0&quot;)+4, income_wifi.indexOf(&quot;%%F1&quot;));
          pin_val = wifi_temp.toInt();
          Serial.println(pin_val);
          pin_control();
        }
        else if (income_wifi.indexOf(&quot;%%F31&quot;) != -1) {
          String wifi_temp = income_wifi.substring(income_wifi.indexOf(&quot;%%F31&quot;)+5, income_wifi.indexOf(&quot;%%F1&quot;));
          pwm1 = wifi_temp.toInt();
          Serial.print(&quot;pwm1: &quot;); Serial.println(pwm1);
        }
        else if (income_wifi.indexOf(&quot;%%F32&quot;) != -1) {
          String wifi_temp = income_wifi.substring(income_wifi.indexOf(&quot;%%F32&quot;)+5, income_wifi.indexOf(&quot;%%F1&quot;));
          pwm2 = wifi_temp.toInt();
          Serial.print(&quot;pwm2: &quot;); Serial.println(pwm2);
        }
        else if (income_wifi.indexOf(&quot;%%F33&quot;) != -1) {
          String wifi_temp = income_wifi.substring(income_wifi.indexOf(&quot;%%F33&quot;)+5, income_wifi.indexOf(&quot;%%F1&quot;));
          pwm3 = wifi_temp.toInt();
          Serial.print(&quot;pwm3: &quot;); Serial.println(pwm3); 
        }
      } else { // 텍스트 출력 코드
        String wifi_temp = income_wifi.substring(income_wifi.indexOf(&quot;GET /&quot;)+5, income_wifi.indexOf(&quot;HTTP/1.1&quot;));
        Serial.println(wifi_temp);
      }
      income_wifi = &quot;&quot;;
    }
  }
}
 
String sendData(String command, const int timeout, boolean debug) {
  String response = &quot;&quot;;
  if (command.indexOf(&quot;CIFSR&quot;) != -1) ipCheck = true;
  else ipCheck = false;
  esp01.print(command); // send the read character to the esp01
  long int time = millis();
  while( (time+timeout) &amp;gt; millis()) {
    while(esp01.available()) {  // The esp has data so display its output to the serial window 
      char c = esp01.read(); // read the next character.
      response+=c;
    }
  }
  if (ipCheck) {
    ip = response.substring(response.indexOf(&quot;STAIP,&quot;)+7,response.indexOf(&quot;+CIFSR:STAMAC&quot;)-3);
  }
  if(debug) Serial.print(response);
  return response;
}

void pin_control() {
  if (pin_val != 0) {
    switch (pin_val) {
      case 11: digitalWrite(ledPin, true); // button 1 : on
                  break;
      case 10: digitalWrite(ledPin, false); // button 1 : off
                  break;
      case 21: Serial.println(&quot;button 2 : on&quot;);
                  break;
      case 20: Serial.println(&quot;button 2 : off&quot;);
                  break;
      case 31: Serial.println(&quot;button 3 : on&quot;);
                  break;
      case 30: Serial.println(&quot;button 3 : off&quot;);
                  break;
      case 41: Serial.println(&quot;button 4 : on&quot;);
                  break;
      case 40: Serial.println(&quot;button 4 : off&quot;);
                  break;
      case 51: Serial.println(&quot;button 5 : on&quot;);
                  break;
      case 50: Serial.println(&quot;button 5 : off&quot;);
                  break;
      case 61: Serial.println(&quot;button 6 : on&quot;);
                  break;
      case 60: Serial.println(&quot;button 6 : off&quot;);
                  break;
      case 71: Serial.println(&quot;button 7 : on&quot;);
                  break;
      case 70: Serial.println(&quot;button 7 : off&quot;);
                  break;
      case 81: Serial.println(&quot;button 8 : on&quot;);
                  break;
      case 80: Serial.println(&quot;button 8 : off&quot;);
                  break;
      case 91: Serial.println(&quot;button 9 : on&quot;);
                  break;
      case 90: Serial.println(&quot;button 9 : off&quot;);
                  break;  
      case 101: Serial.println(&quot;button 10 : on&quot;);
                  break;
      case 100: Serial.println(&quot;button 10 : off&quot;);
                  break;  
      case 111: Serial.println(&quot;button 11 : on&quot;);
                  break;
      case 110: Serial.println(&quot;button 11 : off&quot;);
                  break;  
      case 121: Serial.println(&quot;button 12 : on&quot;);
                  break;
      case 120: Serial.println(&quot;button 12 : off&quot;);
                  break;  
    }
    pin_val = 0;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기 코드 업로드 후 시리얼 모니터에서 공유기에서 할당해준 ip 주소 192.168.1.9 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;esp01_ini.jpg&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9sdW9/btqZjvogTSf/FbSp48syhnISqlELNHzKkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9sdW9/btqZjvogTSf/FbSp48syhnISqlELNHzKkk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9sdW9/btqZjvogTSf/FbSp48syhnISqlELNHzKkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9sdW9%2FbtqZjvogTSf%2FFbSp48syhnISqlELNHzKkk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;590&quot; height=&quot;802&quot; data-filename=&quot;esp01_ini.jpg&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;802&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스마트폰 와이파이 공유기 연결&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/culnhD/btqZoyEe19A/k4WsqdyMylklGewmt9ggTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/culnhD/btqZoyEe19A/k4WsqdyMylklGewmt9ggTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/culnhD/btqZoyEe19A/k4WsqdyMylklGewmt9ggTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FculnhD%2FbtqZoyEe19A%2Fk4WsqdyMylklGewmt9ggTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;357&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;arduino bluetooth controller PWM 앱에서 esp01 ip 주소 설정&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgpl0U/btqZpVyXbn7/X2oiFVh8OBwM9hYRC9wFKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgpl0U/btqZpVyXbn7/X2oiFVh8OBwM9hYRC9wFKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgpl0U/btqZpVyXbn7/X2oiFVh8OBwM9hYRC9wFKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgpl0U%2FbtqZpVyXbn7%2FX2oiFVh8OBwM9hYRC9wFKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;458&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;앱에서 텍스트 hi 전송 및 1번 버튼 온/오프 메시지&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;massege.jpg&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TCePN/btqZreSktt9/ZlfIbvzit106zL0wIKjdkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TCePN/btqZreSktt9/ZlfIbvzit106zL0wIKjdkk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TCePN/btqZreSktt9/ZlfIbvzit106zL0wIKjdkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTCePN%2FbtqZreSktt9%2FZlfIbvzit106zL0wIKjdkk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;373&quot; height=&quot;150&quot; data-filename=&quot;massege.jpg&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;데이터 수신 및 동작 확인 후 일정 시간 지난 뒤 다시 제어할 경우 가끔씩 esp01 모듈이 sleep 상태로 전환되어 있는 것처럼 첫 번째 데이터를 수신하지 못하는 경우를 확인하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈의 특성인지는 모르겠지만 앱에서 와이파이를 제어한다는 것이 인터넷 브라우저에서 제어하는 것과는 약간의 차이가 있게 됩니다. 웹브라우저는 서버에서 보내주는 &quot;OK 200&quot;확인 메시지를 받지 못하면 일정기간 또는 일정 횟수 동안 같은 메시지를 반복해서 보내게 되는데 앱에서는 한 번만 보내도록 되어 있어 발생하는 것으로 생각됩니다. 블루투스로 연결해서 사용할 경우에는 이러한 문제가 발생하지 않을 것입니다. 왜냐하면 블루투스는 상시 연결(BLE 제외)을 기준으로 하기 때문 일 것입니다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일정 시간 뒤 버튼을 눌러 제어를 하고자 했는데 esp01 모듈이 데이트를 받지 못하는 상황을 방지하기 위해서는 텍스트 입력창에 어떤 텍스트라도 입력하여 전 송한 뒤 esp01이 데이터를 확실하게 수신할 수 있도록 깨워주는(?) 선행 작업이 필요할 것으로 생각됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/uIeKYR7hz9E&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;1234.jpg&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmlu34/btqVK8a0ULP/TWs7gsNjkYktEVObDnap8K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmlu34/btqVK8a0ULP/TWs7gsNjkYktEVObDnap8K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmlu34/btqVK8a0ULP/TWs7gsNjkYktEVObDnap8K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmlu34%2FbtqVK8a0ULP%2FTWs7gsNjkYktEVObDnap8K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;773&quot; data-filename=&quot;1234.jpg&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2022년 5월 31일 업데이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. AT command의 딜레이 시간을 제거하고 회신 값에 따라 다음 코드가 실행되게 하여 오류 방지 및 setup 완료 시간 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 공유기에 접속할 수 있도록 AT+CWJAP 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 공유기 연결 실패 시 재시도하도록 코드 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;basic_esp01_serial.jpg&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DH7X7/btrEzJTxJez/g6sv8PFSIUUSOz7AE8R4GK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DH7X7/btrEzJTxJez/g6sv8PFSIUUSOz7AE8R4GK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DH7X7/btrEzJTxJez/g6sv8PFSIUUSOz7AE8R4GK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDH7X7%2FbtrEzJTxJez%2Fg6sv8PFSIUUSOz7AE8R4GK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;747&quot; height=&quot;480&quot; data-filename=&quot;basic_esp01_serial.jpg&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;위 사진의 ip 주소처럼 정상적으로 wifi 공유기에 연결되고 ip 주소를 할당받은 경우에는 컴퓨터의 웹브라우저 주소창에 해당 아이피와 테스트 문구 &quot;192.168.1.12/hi&quot;를 입력하여 테스트할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;wifi_con_test.jpg&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDaiT1/btrDDsdUg4R/0ipkc6CMc2u7Lc84nXRG61/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDaiT1/btrDDsdUg4R/0ipkc6CMc2u7Lc84nXRG61/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDaiT1/btrDDsdUg4R/0ipkc6CMc2u7Lc84nXRG61/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDaiT1%2FbtrDDsdUg4R%2F0ipkc6CMc2u7Lc84nXRG61%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;84&quot; data-filename=&quot;wifi_con_test.jpg&quot; data-origin-width=&quot;396&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/J5uL3/btrEIotwsGj/6RnK3p0t0GglP8XGr4x3A1/Serial_basic_esp01_parsing_update.ino?attach=1&amp;amp;knm=tfile.ino&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Serial_basic_esp01_parsing_update.ino&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1654301281629&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(TX, RX);

const String ssid_AP = &quot;ESP01&quot;;    // your network SSID (name)
const String pass_AP = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password

char ssid[33] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
char pass[21] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

String ip = &quot;&quot;;

void ipCheck(String response) {
  int st, ed;
  if (response.indexOf(F(&quot;PIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;PIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    response.remove(0, ed+1);
    Serial.print(F(&quot;ap: &quot;)); Serial.println(ip);
  }
  if (response.indexOf(F(&quot;AIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;AIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    Serial.print(F(&quot;ip: &quot;)); Serial.println(ip);
  }
}

uint8_t retry = 1;

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  esp01.print(command); // send the read character to the esp01
  unsigned long int time = millis();
  String response = &quot;&quot;;
  while( (time+20000) &amp;gt; millis()) {
    while(esp01.available()) {  // The esp has data so display its output to the serial window
      char c = esp01.read(); // read the next character.
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) { retry = 0; Serial.println(F(&quot;OK&quot;)); break; } 
    else if (response.indexOf(F(&quot;FAIL&quot;)) != -1 || response.indexOf(F(&quot;ERROR&quot;)) != -1) { 
      if (response.indexOf(F(&quot;FAIL&quot;)) != -1) retry++;
      else if (response.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; } 
      Serial.print(command); Serial.println(F(&quot;Failed&quot;)); break; 
    }
  }
  return response;
}

String addID(String order, String ssid_AP, String pass_AP) {
  String temp = order+'&quot;'+ssid_AP+'&quot;'+','+'&quot;'+pass_AP+'&quot;';
  return temp;
}

void setup() {
  Serial.begin(9600);
  esp01.begin(9600); // your esp's baud rate might be different
  sendData(F(&quot;RST&quot;)); // disconnect AP if connected
  unsigned long int time = millis();
  String temp = &quot;&quot;;
  while (time+20000 &amp;gt; millis()) {
    temp = esp01.readStringUntil('\n');
    if (temp.indexOf(F(&quot;ready&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  sendData(F(&quot;CWMODE=3&quot;)); // configure as access point (working mode: AP+STA)
  sendData(F(&quot;CWDHCP=1,1&quot;));
  sendData(addID(F(&quot;CWSAP=&quot;),ssid_AP,pass_AP)+','+String(10)+','+String(3)); 
  retry = 1;
  while(retry) { 
    sendData(addID(F(&quot;CWJAP=&quot;),ssid,pass)); 
    if (retry &amp;gt; 1) { Serial.print(F(&quot;Retrying to connect: &quot;)); Serial.println(retry-1); }
    if (retry &amp;gt; 4) { Serial.println(F(&quot;connection failed&quot;)); retry = 0; }
  }
  sendData(F(&quot;CIPMUX=1&quot;)); // configure for multiple connections
  sendData(F(&quot;CIPSERVER=1,80&quot;)); // turn on server on port 80
  ipCheck(sendData(F(&quot;CIFSR&quot;))); // // get ip address
}

String income_wifi = &quot;&quot;;

void loop() {
  while (esp01.available()) { 
    income_wifi = esp01.readStringUntil('\n');
    if (income_wifi.startsWith(F(&quot;+IPD,&quot;))) {
      String wifi_temp = income_wifi.substring(income_wifi.indexOf(F(&quot;GET /&quot;))+5, income_wifi.indexOf(F(&quot;HTTP/1.1&quot;))-1);
      Serial.println(wifi_temp);
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 7.본문배너5 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;5172369234&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;웹페이지를 통한 요청에 대해 응답을 하도록 코드를 작성해 주었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654301405457&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void disconnectID() {
  if (connectionId &amp;lt; 255) {
    String command = F(&quot;AT+CIPCLOSE=&quot;);
    command += connectionId-48;
    command += F(&quot;\r\n&quot;);
    esp01.print(command);
    connectionId = 255;
  }
}

void http_response() {
  String cip = F(&quot;AT+CIPSEND=&quot;);
  cip += connectionId-48;
  cip += ',';
  cip += Data.length()+19;
  cip += F(&quot;\r\n&quot;);
  Serial.println(cip);
  esp01.print(cip);
  unsigned long int time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  esp01.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;)); // +19
  esp01.print(Data);
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  Data = &quot;&quot;;
  disconnectID();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지 주소창에서 할당받은 아이피 주소에 on/off/message를 입력해 보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;led_on.jpg&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dF2cfK/btrDGdmE5hf/wYhCKjkwaAIEdxFoZv2X10/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dF2cfK/btrDGdmE5hf/wYhCKjkwaAIEdxFoZv2X10/img.jpg&quot; data-alt=&quot;주소창에 192.168.1.12/on 입력후 회신받은 메세지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dF2cfK/btrDGdmE5hf/wYhCKjkwaAIEdxFoZv2X10/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdF2cfK%2FbtrDGdmE5hf%2FwYhCKjkwaAIEdxFoZv2X10%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;112&quot; data-filename=&quot;led_on.jpg&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주소창에 192.168.1.12/on 입력후 회신받은 메세지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;led_off.jpg&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y7Awe/btrDESjhYln/Y06EauC8F0z4ZkIBU3HVSK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y7Awe/btrDESjhYln/Y06EauC8F0z4ZkIBU3HVSK/img.jpg&quot; data-alt=&quot;주소창에 192.168.1.12/off 입력후 회신받은 메세지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y7Awe/btrDESjhYln/Y06EauC8F0z4ZkIBU3HVSK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY7Awe%2FbtrDESjhYln%2FY06EauC8F0z4ZkIBU3HVSK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;343&quot; height=&quot;109&quot; data-filename=&quot;led_off.jpg&quot; data-origin-width=&quot;343&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주소창에 192.168.1.12/off 입력후 회신받은 메세지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;hello_world.jpg&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;106&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cX6LWK/btrDCSEwFfg/U7yNd0gKVRGnhp2OKvd6dK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cX6LWK/btrDCSEwFfg/U7yNd0gKVRGnhp2OKvd6dK/img.jpg&quot; data-alt=&quot;주소창에 192.168.1.12/Hello World! 입력후 회신받은 메세지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cX6LWK/btrDCSEwFfg/U7yNd0gKVRGnhp2OKvd6dK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcX6LWK%2FbtrDCSEwFfg%2FU7yNd0gKVRGnhp2OKvd6dK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;106&quot; data-filename=&quot;hello_world.jpg&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;106&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주소창에 192.168.1.12/Hello World! 입력후 회신받은 메세지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;AT+CIPSEND_response_serial.jpg&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mHG7X/btrDE8zmOU9/X5zwB8AKoeszuUxhRA8aQk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mHG7X/btrDE8zmOU9/X5zwB8AKoeszuUxhRA8aQk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mHG7X/btrDE8zmOU9/X5zwB8AKoeszuUxhRA8aQk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmHG7X%2FbtrDE8zmOU9%2FX5zwB8AKoeszuUxhRA8aQk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;741&quot; height=&quot;733&quot; data-filename=&quot;AT+CIPSEND_response_serial.jpg&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;733&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cVxoju/btrEU3cbUNK/27bywbhrYzrmTkYtzRsII1/Serial_basic_esp01_parsing_response.ino?attach=1&amp;amp;knm=tfile.ino&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Serial_basic_esp01_parsing_response.ino&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1654301405458&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(TX, RX);

const String ssid_AP = &quot;ESP01&quot;;    // your network SSID (name)
const String pass_AP = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password

char ssid[33] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
char pass[21] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

String ip = &quot;&quot;;

void ipCheck(String response) {
  int st, ed;
  if (response.indexOf(F(&quot;PIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;PIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    response.remove(0, ed+1);
    Serial.print(F(&quot;ap: &quot;)); Serial.println(ip);
  }
  if (response.indexOf(F(&quot;AIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;AIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    Serial.print(F(&quot;ip: &quot;)); Serial.println(ip);
  }
}

uint8_t retry = 1;

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  esp01.print(command); // send the read character to the esp01
  unsigned long int time = millis();
  String response = &quot;&quot;;
  while( (time+20000) &amp;gt; millis()) {
    while(esp01.available()) {  // The esp has data so display its output to the serial window
      char c = esp01.read(); // read the next character.
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) { retry = 0; Serial.println(F(&quot;OK&quot;)); break; } 
    else if (response.indexOf(F(&quot;FAIL&quot;)) != -1 || response.indexOf(F(&quot;ERROR&quot;)) != -1) { 
      if (response.indexOf(F(&quot;FAIL&quot;)) != -1) retry++;
      else if (response.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; } 
      Serial.print(command); Serial.println(F(&quot;Failed&quot;)); break; 
    }
  }
  return response;
}

String addID(String order, String ssid_AP, String pass_AP) {
  String temp = order+'&quot;'+ssid_AP+'&quot;'+','+'&quot;'+pass_AP+'&quot;';
  return temp;
}

#define ledPin 13
 
void setup() {
  Serial.begin(9600);
  esp01.begin(9600); // your esp's baud rate might be different
  sendData(F(&quot;RST&quot;)); // disconnect AP if connected
  unsigned long int time = millis();
  String temp = &quot;&quot;;
  while (time+20000 &amp;gt; millis()) {
    temp = esp01.readStringUntil('\n');
    if (temp.indexOf(F(&quot;ready&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  sendData(F(&quot;CWMODE=3&quot;)); // configure as access point (working mode: AP+STA)
  sendData(F(&quot;CWDHCP=1,1&quot;));
  sendData(addID(F(&quot;CWSAP=&quot;),ssid_AP,pass_AP)+','+String(10)+','+String(3)); 
  retry = 1;
  while(retry) { 
    sendData(addID(F(&quot;CWJAP=&quot;),ssid,pass)); 
    if (retry &amp;gt; 1) { Serial.print(F(&quot;Retrying to connect: &quot;)); Serial.println(retry-1); }
    if (retry &amp;gt; 4) { Serial.println(F(&quot;connection failed&quot;)); retry = 0; }
  }
  sendData(F(&quot;CIPMUX=1&quot;)); // configure for multiple connections
  sendData(F(&quot;CIPSERVER=1,80&quot;)); // turn on server on port 80
  ipCheck(sendData(F(&quot;CIFSR&quot;))); // // get ip address
}

uint8_t connectionId = 255; // 연결 id 저장 변수
String Data = &quot;&quot;;

void disconnectID() {
  if (connectionId &amp;lt; 255) {
    String command = F(&quot;AT+CIPCLOSE=&quot;);
    command += connectionId-48;
    command += F(&quot;\r\n&quot;);
    esp01.print(command);
    connectionId = 255;
  }
}

void http_response() {
  String cip = F(&quot;AT+CIPSEND=&quot;);
  cip += connectionId-48;
  cip += ',';
  cip += Data.length()+19;
  cip += F(&quot;\r\n&quot;);
  Serial.println(cip);
  esp01.print(cip);
  unsigned long int time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  esp01.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;)); // +19
  esp01.print(Data);
  time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  Data = &quot;&quot;;
  disconnectID();
}

String income_wifi = &quot;&quot;;
 
void loop() {
  while (esp01.available()) { 
    income_wifi = esp01.readStringUntil('\n');
    if (income_wifi.startsWith(F(&quot;+IPD,&quot;))) {
      income_wifi.remove(0,5);
      connectionId = income_wifi.charAt(0);
      int ed = income_wifi.lastIndexOf(F(&quot;HTTP/1.1&quot;))-1;
      income_wifi.remove(ed);
      int st = income_wifi.indexOf(F(&quot;GET /&quot;))+5;
      income_wifi.remove(0,st);
      Serial.println(income_wifi);
      if(income_wifi == F(&quot;on&quot;)){  
        digitalWrite(ledPin, HIGH);
        Data += F(&quot;&amp;lt;p&amp;gt;LED ON&amp;lt;/p&amp;gt;&quot;);
      }
      else if(income_wifi == F(&quot;off&quot;)){  
        digitalWrite(ledPin, LOW);  
        Data += F(&quot;&amp;lt;p&amp;gt;LED OFF&amp;lt;/p&amp;gt;&quot;);
      }
      else {
        income_wifi.replace(&quot;%20&quot;, &quot; &quot;); // URL Decoding 공백문자 변경
        Serial.println(income_wifi); 
        Data += F(&quot;&amp;lt;p&amp;gt;&quot;);
        Data += income_wifi;
        Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
      }
      http_response();
    }
    income_wifi = &quot;&quot;;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지 응답 코드가 있는 아두이노 와이파이 제어에서 사용할 수 있는 연결 도우미 앱입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1705451944417&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;MCUWiFi - Google Play 앱&quot; data-og-description=&quot;스마트폰에서 아두이노 웹서버에 연결하기 위한 앱&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&amp;amp;hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Z9qXB/hyU5QOKVrE/bpzvFyCdjrb9sLTwQgq5o0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bqGT7E/hyU5Pvxelp/hMJ4APQq0Fdz0r6K0sJ4NK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/rYb4x/hyU5PbdO6D/IK7eummhbQKcjEg2UlWMuK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.tistory.postpop.MCUWiFi&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Z9qXB/hyU5QOKVrE/bpzvFyCdjrb9sLTwQgq5o0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bqGT7E/hyU5Pvxelp/hMJ4APQq0Fdz0r6K0sJ4NK/img.png?width=600&amp;amp;height=300&amp;amp;face=0_0_600_300,https://scrap.kakaocdn.net/dn/rYb4x/hyU5PbdO6D/IK7eummhbQKcjEg2UlWMuK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MCUWiFi - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;스마트폰에서 아두이노 웹서버에 연결하기 위한 앱&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;특징:&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 스마트폰에서 아두이노 웹서버에 연결할 때 에러 메세지 출력 및 연결 가이드 제시&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 아두이노 웹서버의 html 페이지 연결시 스마트폰의 웹브라우저 대신 앱 내부 웹 뷰어를 통해 연결 및 표시&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 앱 실행전 스마트폰의 와이파이 실행 유무에 따라 앱 종료시 와이파이 설정 페이지 이동&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자세한 설명은 아래 포스트를 참조하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/201&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - 아두이노 와이파이 연결 도우미 앱&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/p0C6njyAu5M&quot; width=&quot;300&quot; height=&quot;225&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지를 이용하여 아두이노 우노의 기본 LED를 제어해 보자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지 코드&lt;/p&gt;
&lt;pre id=&quot;code_1654301405462&quot; class=&quot;xml&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const char HEADER[] PROGMEM = // HTML HEADER
&quot;&amp;lt;!doctype html&amp;gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&quot;
&quot;&amp;lt;meta name='viewport'charset='utf-8'content='width=device-width,initial-scale=1,user-scalable=no'&amp;gt;&quot;
&quot;&amp;lt;style&amp;gt;.c{text-align:center;}div,input{padding:5px;font-size:1em;}input{width:95%;}&quot;
&quot;body{text-align:center;font-family:verdana;}&quot;    
&quot;button{border:0;border-radius:0.3rem;background-color:#1fa3ec;color:#fff;line-height:2.4rem;font-size:1.2rem;width:100%}&quot;
&quot;&amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;div style='text-align:center;display:inline-block;min-width:260px;'&amp;gt;&quot;;

const char FOOTER[] PROGMEM = &quot;&amp;lt;/div&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;\r\n&quot;; // HTML FOOTER
const char BACK[] PROGMEM   = &quot;&amp;lt;form method='get'action='ip'&amp;gt;&amp;lt;button&amp;gt;Back&amp;lt;/button&amp;gt;&amp;lt;/form&amp;gt;&amp;lt;br/&amp;gt;&quot;; 

void ipPage() {
  Data =  (const __FlashStringHelper *)HEADER; // 아두이노 PROGMEM 읽는 코드
  Data += F(&quot;&amp;lt;p&amp;gt;SSID: &quot;);
  Data += ssid;
  Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;p&amp;gt;IP Address: &quot;);
  Data += ip;  // 와이파이 공유기에서 할당받은 아이피 주소
  Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;form method='get'action='Button'&amp;gt;&amp;lt;button&amp;gt;Button&amp;lt;/button&amp;gt;&amp;lt;/form&amp;gt;&amp;lt;br/&amp;gt;&quot;);
  Data += (const __FlashStringHelper *)FOOTER;
}

void buttonPage() {
  Data =  (const __FlashStringHelper *)HEADER;
  Data += F(&quot;&amp;lt;h3&amp;gt;Pin Control&amp;lt;/h3&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;p&amp;gt;&amp;lt;button style='width:40%;background-color:#12cb3d'&amp;gt;ON&amp;lt;/button&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;button style='margin-left:10%;width:40%;background-color:#07510a'&amp;gt;OFF&amp;lt;/button&amp;gt;&amp;lt;/p&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;form method='get'action='button'&amp;gt;&quot;);  // 데이터 폼 시작
  Data += F(&quot;&amp;lt;input type='hidden'id='bt'name='bt'&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;button style='background-color:#&quot;); 
  if (digitalRead(ledPin)) Data += F(&quot;12cb3d&quot;); // ON 버튼 색상
  else Data += F(&quot;07510a&quot;);                     // OFF 버튼 색상
  Data += F(&quot;'onclick='bt.value=&quot;);
  if (digitalRead(ledPin)) Data += 10;          // 버튼이 ON일경우 클릭시 OFF값 10전송
  else Data += 11;                              // 버튼이 OFF일경우 클릭시 ON값 11전송
  Data += F(&quot;;submit()'&amp;gt;Button 1&amp;lt;/button&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&quot;); // 데이터 폼의 값 전송
  Data += F(&quot;&amp;lt;/form&amp;gt;&quot;);                         // 데이터 폼 종료
  Data += (const __FlashStringHelper *)BACK;
  Data += (const __FlashStringHelper *)FOOTER;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ip_page.jpg&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9V6fL/btrDFKLNMrr/OLtzXMRrKO3icatUH9V1g1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9V6fL/btrDFKLNMrr/OLtzXMRrKO3icatUH9V1g1/img.jpg&quot; data-alt=&quot;주소창에 192.168.1.12 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9V6fL/btrDFKLNMrr/OLtzXMRrKO3icatUH9V1g1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9V6fL%2FbtrDFKLNMrr%2FOLtzXMRrKO3icatUH9V1g1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;278&quot; data-filename=&quot;ip_page.jpg&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주소창에 192.168.1.12 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;button_page.jpg&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dt3FZ/btrDEhRnsoV/DWJ1EIf99ihKGKvkgKv4JK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dt3FZ/btrDEhRnsoV/DWJ1EIf99ihKGKvkgKv4JK/img.jpg&quot; data-alt=&quot;Button을 클릭했을때 들어가는 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dt3FZ/btrDEhRnsoV/DWJ1EIf99ihKGKvkgKv4JK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDt3FZ%2FbtrDEhRnsoV%2FDWJ1EIf99ihKGKvkgKv4JK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;373&quot; data-filename=&quot;button_page.jpg&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Button을 클릭했을때 들어가는 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼 1을 클릭하면 아두이노 우노의 기본 LED가 켜지고 버튼 1이 ON색상으로 변경된 웹페이지를 받게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;webpage_serial.jpg&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D2nrx/btrDGKxM8Or/krjVPtQxDq4uMM7XHk5yak/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D2nrx/btrDGKxM8Or/krjVPtQxDq4uMM7XHk5yak/img.jpg&quot; data-alt=&quot;ㅓ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D2nrx/btrDGKxM8Or/krjVPtQxDq4uMM7XHk5yak/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD2nrx%2FbtrDGKxM8Or%2FkrjVPtQxDq4uMM7XHk5yak%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;481&quot; data-filename=&quot;webpage_serial.jpg&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ㅓ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;상기 시리얼 모니터에 표시된 AT+CIPSEND=1,912중 &quot;912&quot;가 웹페이지 전체 문자열 길이이고 이 중 Data 스트링 변수의 전체 길이는 912 - 19 = 893이다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;i&gt;스케치는&amp;nbsp;프로그램&amp;nbsp;저장&amp;nbsp;공간&amp;nbsp;12138&amp;nbsp;바이트(37%)를&amp;nbsp;사용.&amp;nbsp;최대&amp;nbsp;32256&amp;nbsp;바이트.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;전역&amp;nbsp;변수는&amp;nbsp;동적&amp;nbsp;메모리&amp;nbsp;427바이트(20%)를&amp;nbsp;사용,&amp;nbsp;1621바이트의&amp;nbsp;지역변수가&amp;nbsp;남음.&amp;nbsp;&amp;nbsp;최대는&amp;nbsp;2048&amp;nbsp;바이트.&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기 코드를 업로드한 후에 아두이노 IDE에 현재 가용 메모리가 1621바이트 남아있다고 한다. 실제로는 아두이노 부팅 후 사용되는 함수 안의 스트링 지역 변수 등은 돌려받게 되지만 남은 메모리 1621바이트 전체를 사용할 수 없는 게 일반적이다. 변수에 공간을 할당하고 회수하는 데에 있어서 흔적들 또는 유실되는 영역들이 발생하므로 실제 가용 메모리에 대해서는 추정적이나 실험적으로 결정해야 한다. 버튼 웹페이지의 Data 문자열 길이가 현재보다 길어진다면 메모리 부족으로 인해 데이터가 일부만 전송될 수 있다. PROGMEM을 이용한 추가적인 페이지는 더 만들 수 있으나 상기 코드에서는 웹페이지의 Data&amp;nbsp; 문자열 변수의&amp;nbsp; 길이를 대략 900 이하로 맞추어 주어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/XlrTx/btrEDRYwVSM/A4xkvGVa2GcEmjKTgQoc51/Serial_basic_esp01_string_LED_webpage.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Serial_basic_esp01_string_LED_webpage.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1654301405463&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(TX, RX);

const String ssid_AP = &quot;ESP01&quot;;    // your network SSID (name)
const String pass_AP = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password

char ssid[33] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
char pass[21] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

String ip = &quot;&quot;;

void ipCheck(String response) {
  int st, ed;
  if (response.indexOf(F(&quot;PIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;PIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    response.remove(0, ed+1);
    Serial.print(F(&quot;ap: &quot;)); Serial.println(ip);
  }
  if (response.indexOf(F(&quot;AIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;AIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    Serial.print(F(&quot;ip: &quot;)); Serial.println(ip);
  }
}

uint8_t retry = 1;

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  esp01.print(command); // send the read character to the esp01
  unsigned long int time = millis();
  String response = &quot;&quot;;
  while( (time+20000) &amp;gt; millis()) {
    while(esp01.available()) {  // The esp has data so display its output to the serial window
      char c = esp01.read(); // read the next character.
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) { retry = 0; Serial.println(F(&quot;OK&quot;)); break; } 
    else if (response.indexOf(F(&quot;FAIL&quot;)) != -1 || response.indexOf(F(&quot;ERROR&quot;)) != -1) { 
      if (response.indexOf(F(&quot;FAIL&quot;)) != -1) retry++;
      else if (response.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; } 
      Serial.print(command); Serial.println(F(&quot;Failed&quot;)); break; 
    }
  }
  return response;
}

String addID(String order, String ssid_AP, String pass_AP) {
  String temp = order+'&quot;'+ssid_AP+'&quot;'+','+'&quot;'+pass_AP+'&quot;';
  return temp;
}

#define ledPin 13
 
void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);
  esp01.begin(9600); // your esp's baud rate might be different
  sendData(F(&quot;RST&quot;)); // disconnect AP if connected
  unsigned long int time = millis();
  String temp = &quot;&quot;;
  while (time+20000 &amp;gt; millis()) {
    temp = esp01.readStringUntil('\n');
    if (temp.indexOf(F(&quot;ready&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  sendData(F(&quot;CWMODE=3&quot;)); // configure as access point (working mode: AP+STA)
  sendData(F(&quot;CWDHCP=1,1&quot;));
  sendData(addID(F(&quot;CWSAP=&quot;),ssid_AP,pass_AP)+','+String(10)+','+String(3)); 
  retry = 1;
  while(retry) { 
    sendData(addID(F(&quot;CWJAP=&quot;),ssid,pass)); 
    if (retry &amp;gt; 1) { Serial.print(F(&quot;Retrying to connect: &quot;)); Serial.println(retry-1); }
    if (retry &amp;gt; 4) { Serial.println(F(&quot;connection failed&quot;)); retry = 0; }
  }
  sendData(F(&quot;CIPMUX=1&quot;)); // configure for multiple connections
  sendData(F(&quot;CIPSERVER=1,80&quot;)); // turn on server on port 80
  ipCheck(sendData(F(&quot;CIFSR&quot;))); // // get ip address
}

uint8_t connectionId = 255; // 연결 id 저장 변수
String Data = &quot;&quot;;

void disconnectID() {
  if (connectionId &amp;lt; 255) {
    String command = F(&quot;AT+CIPCLOSE=&quot;);
    command += connectionId-48;
    command += F(&quot;\r\n&quot;);
    esp01.print(command);
    connectionId = 255;
  }
}

void http_response() {
  String cip = F(&quot;AT+CIPSEND=&quot;);
  cip += connectionId-48;
  cip += ',';
  cip += Data.length()+19;
  cip += F(&quot;\r\n&quot;);
  Serial.println(cip);
  esp01.print(cip);
  unsigned long int time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  esp01.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;)); // +19
  esp01.print(Data);
  time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  Data = &quot;&quot;;
  disconnectID();
}

#include &quot;webPage.h&quot;

String income_wifi = &quot;&quot;;
 
void loop() {
  while (esp01.available()) { 
    income_wifi = esp01.readStringUntil('\n');
    if (income_wifi.startsWith(F(&quot;+IPD,&quot;))) {
      income_wifi.remove(0,5);
      connectionId = income_wifi.charAt(0);
      int ed = income_wifi.lastIndexOf(F(&quot;HTTP/1.1&quot;))-1;
      income_wifi.remove(ed);
      int st = income_wifi.indexOf(F(&quot;GET /&quot;))+5;
      income_wifi.remove(0,st);
      Serial.println(income_wifi);
      if(income_wifi == F(&quot;on&quot;)){  
        digitalWrite(ledPin, HIGH);
        Data += F(&quot;&amp;lt;p&amp;gt;LED ON&amp;lt;/p&amp;gt;&quot;);
      }
      else if(income_wifi == F(&quot;off&quot;)){  
        digitalWrite(ledPin, LOW);  
        Data += F(&quot;&amp;lt;p&amp;gt;LED OFF&amp;lt;/p&amp;gt;&quot;);
      }
      else {
        if (income_wifi.indexOf(F(&quot;ip&quot;)) != -1) ipPage();
        else if (income_wifi.indexOf(F(&quot;Button&quot;)) != -1) buttonPage(); 
        else if (income_wifi.indexOf(F(&quot;button&quot;)) != -1) { 
          String temp = income_wifi.substring(income_wifi.indexOf('?')+4);
          uint8_t val = temp.toInt();
          if (val == 10) digitalWrite(ledPin, LOW);
          else digitalWrite(ledPin, HIGH);
          buttonPage(); 
        } else {
          Serial.println(F(&quot;enter&quot;));
          if (income_wifi == &quot;&quot;) ipPage();
          else {
            income_wifi.replace(&quot;%20&quot;, &quot; &quot;); // URL Decoding 공백문자 변경
            Serial.println(income_wifi); 
            Data += F(&quot;&amp;lt;p&amp;gt;&quot;);
            Data += income_wifi;
            Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
          }
        }
      }
      http_response();
    }
    income_wifi = &quot;&quot;;
  }
  if(Serial.available() &amp;gt; 0){ // 아두이노 모듈 작동 확인
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if (temp.startsWith(F(&quot;AT&quot;))) {
      temp.remove(0,3);
      Serial.println(temp);
      sendData(temp);
    } else if (temp == F(&quot;1&quot;)) {
      
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기의 Data 문자열 변수의 길이를 줄여 메모리 문제를 해결하기 위해 boolean 변수 page를 설정하고 page 변수에 따라 웹페이지의 html header와 footer를 Data 문자열 변수에 저장하지 않고 PROGMEM에서 바로 읽어서 전송할 수 있도록 코드를 수정해 주었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654301405467&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void http_response(bool page) {
  String cip = F(&quot;AT+CIPSEND=&quot;);
  cip += connectionId-48;
  cip += ',';
  if (page) cip += Data.length()+19+sizeofHeader+sizeofFooter;
  else cip += Data.length()+19;
  cip += F(&quot;\r\n&quot;);
  Serial.println(cip);
  esp01.print(cip);
  unsigned long int time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  esp01.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;)); // +19
  if (page) {
    esp01.print((const __FlashStringHelper *)HEADER);
    esp01.print(Data);
    esp01.print((const __FlashStringHelper *)FOOTER);
  } else esp01.print(Data);
  time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  Data = &quot;&quot;;
  page = false;
  disconnectID();
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/yJozq/btrESlL9y0Y/7xKMRg9NwSJ3FmQFfTrHUK/Serial_basic_esp01_string_LED_webpage_revised.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Serial_basic_esp01_string_LED_webpage_revised.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1654301405467&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(TX, RX);

const String ssid_AP = &quot;ESP01&quot;;    // your network SSID (name)
const String pass_AP = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password

char ssid[33] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
char pass[21] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

String ip = &quot;&quot;;

void ipCheck(String response) {
  int st, ed;
  if (response.indexOf(F(&quot;PIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;PIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    response.remove(0, ed+1);
    Serial.print(F(&quot;ap: &quot;)); Serial.println(ip);
  }
  if (response.indexOf(F(&quot;AIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;AIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    Serial.print(F(&quot;ip: &quot;)); Serial.println(ip);
  }
}

uint8_t retry = 1;

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  esp01.print(command); // send the read character to the esp01
  unsigned long int time = millis();
  String response = &quot;&quot;;
  while( (time+20000) &amp;gt; millis()) {
    while(esp01.available()) {  // The esp has data so display its output to the serial window
      char c = esp01.read(); // read the next character.
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) { retry = 0; Serial.println(F(&quot;OK&quot;)); break; } 
    else if (response.indexOf(F(&quot;FAIL&quot;)) != -1 || response.indexOf(F(&quot;ERROR&quot;)) != -1) { 
      if (response.indexOf(F(&quot;FAIL&quot;)) != -1) retry++;
      else if (response.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; } 
      Serial.print(command); Serial.println(F(&quot;Failed&quot;)); break; 
    }
  }
  return response;
}

String addID(String order, String ssid_AP, String pass_AP) {
  String temp = order+'&quot;'+ssid_AP+'&quot;'+','+'&quot;'+pass_AP+'&quot;';
  return temp;
}

#define ledPin 13

uint16_t sizeofHeader = 0;
uint16_t sizeofFooter = 0;
bool page = false;
String Data = &quot;&quot;;
#include &quot;webPage.h&quot;
 
void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  Serial.begin(9600);
  esp01.begin(9600); // your esp's baud rate might be different
  sendData(F(&quot;RST&quot;)); // disconnect AP if connected
  unsigned long int time = millis();
  String temp = &quot;&quot;;
  while (time+20000 &amp;gt; millis()) {
    temp = esp01.readStringUntil('\n');
    if (temp.indexOf(F(&quot;ready&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  sendData(F(&quot;CWMODE=3&quot;)); // configure as access point (working mode: AP+STA)
  sendData(F(&quot;CWDHCP=1,1&quot;));
  sendData(addID(F(&quot;CWSAP=&quot;),ssid_AP,pass_AP)+','+String(10)+','+String(3)); 
  retry = 1;
  while(retry) { 
    sendData(addID(F(&quot;CWJAP=&quot;),ssid,pass)); 
    if (retry &amp;gt; 1) { Serial.print(F(&quot;Retrying to connect: &quot;)); Serial.println(retry-1); }
    if (retry &amp;gt; 4) { Serial.println(F(&quot;connection failed&quot;)); retry = 0; }
  }
  sendData(F(&quot;CIPMUX=1&quot;)); // configure for multiple connections
  sendData(F(&quot;CIPSERVER=1,80&quot;)); // turn on server on port 80
  ipCheck(sendData(F(&quot;CIFSR&quot;))); // // get ip address
  sizeofHeader = sizeof(HEADER)-1; // -1: '\0'
  sizeofFooter = sizeof(FOOTER)-1; // -1: '\0'
}

uint8_t connectionId = 255; // 연결 id 저장 변수

void disconnectID() {
  if (connectionId &amp;lt; 255) {
    String command = F(&quot;AT+CIPCLOSE=&quot;);
    command += connectionId-48;
    command += F(&quot;\r\n&quot;);
    esp01.print(command);
    connectionId = 255;
  }
}

void http_response() {
  String cip = F(&quot;AT+CIPSEND=&quot;);
  cip += connectionId-48;
  cip += ',';
  if (page) cip += Data.length()+19+sizeofHeader+sizeofFooter;
  else cip += Data.length()+19;
  cip += F(&quot;\r\n&quot;);
  Serial.println(cip);
  esp01.print(cip);
  unsigned long int time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  esp01.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;)); // +19
  if (page) {
    esp01.print((const __FlashStringHelper *)HEADER);
    esp01.print(Data);
    esp01.print((const __FlashStringHelper *)FOOTER);
  } else esp01.print(Data);
  time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  Data = &quot;&quot;;
  page = false;
  disconnectID();
}

String income_wifi = &quot;&quot;;
 
void loop() {
  while (esp01.available()) { 
    income_wifi = esp01.readStringUntil('\n');
    if (income_wifi.startsWith(F(&quot;+IPD,&quot;))) {
      income_wifi.remove(0,5);
      connectionId = income_wifi.charAt(0);
      int ed = income_wifi.lastIndexOf(F(&quot;HTTP/1.1&quot;))-1;
      income_wifi.remove(ed);
      int st = income_wifi.indexOf(F(&quot;GET /&quot;))+5;
      income_wifi.remove(0,st);
      Serial.println(income_wifi);
      if (!income_wifi.startsWith(F(&quot;fav&quot;))) { // favicon.ico 는 통과
        if(income_wifi == F(&quot;on&quot;)){  
          digitalWrite(ledPin, HIGH);
          Data += F(&quot;&amp;lt;p&amp;gt;LED ON&amp;lt;/p&amp;gt;&quot;);
        } else if(income_wifi == F(&quot;off&quot;)){  
          digitalWrite(ledPin, LOW);  
          Data += F(&quot;&amp;lt;p&amp;gt;LED OFF&amp;lt;/p&amp;gt;&quot;);
        } else {
          if (income_wifi.indexOf(F(&quot;ip&quot;)) != -1) ipPage();
          else if (income_wifi.indexOf(F(&quot;Button&quot;)) != -1) buttonPage(); 
          else if (income_wifi.indexOf(F(&quot;button&quot;)) != -1) { 
            String temp = income_wifi.substring(income_wifi.indexOf('?')+4);
            uint8_t val = temp.toInt();
            if (val == 10) digitalWrite(ledPin, LOW);
            else digitalWrite(ledPin, HIGH);
            buttonPage(); 
          } else {
            Serial.println(F(&quot;enter&quot;));
            if (income_wifi == &quot;&quot;) ipPage();
            else {
              income_wifi.replace(&quot;%20&quot;, &quot; &quot;); // URL Decoding 공백문자 변경
              Serial.println(income_wifi); 
              Data += F(&quot;&amp;lt;p&amp;gt;&quot;);
              Data += income_wifi;
              Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
            }
          }
        }
        http_response();
      }
    }
    income_wifi = &quot;&quot;;
  }
  if(Serial.available() &amp;gt; 0){ // 아두이노 모듈 작동 확인
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if (temp.startsWith(F(&quot;AT&quot;))) {
      temp.remove(0,3);
      Serial.println(temp);
      sendData(temp);
    } else if (temp == F(&quot;1&quot;)) {
      
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와이파이 매니저&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글&amp;nbsp;&lt;a href=&quot;https://postpop.tistory.com/95&quot;&gt;[arduino] - 아두이노 - ESP01 와이파이 매니저, soft AP이용 공유기 연결용 아이디와 비밀번호 설정하기, wifimanager&lt;/a&gt;에서 구현한 와이파이 매니저를 WiFiEsp.h 라이브러리를 사용하지 않고 AT commnad를 사용하여 구현하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 8.본문배너6 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;4789225853&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 아두이노 IDE에서 와이파이 설정값 변경한 경우 EEPROM에 값 반영하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리부팅시 변경된 와이파이 설정값을 반영해주기 위해서는 시리얼 모니터에서 &quot;1&quot;을 입력하고 엔터를 쳐준 뒤에 아두이노를 리부팅 해준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1ipPage_not_connect.jpg&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;235&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHyOl9/btrDUDUKOJ1/5nL76Jn7dIUjjn0WDmKjP0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHyOl9/btrDUDUKOJ1/5nL76Jn7dIUjjn0WDmKjP0/img.jpg&quot; data-alt=&quot;설정에 따라 공유기에 연결이 안된 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHyOl9/btrDUDUKOJ1/5nL76Jn7dIUjjn0WDmKjP0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHyOl9%2FbtrDUDUKOJ1%2F5nL76Jn7dIUjjn0WDmKjP0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;324&quot; height=&quot;235&quot; data-filename=&quot;1ipPage_not_connect.jpg&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;235&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설정에 따라 공유기에 연결이 안된 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2wifi_config_page.jpg&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rJuAV/btrDWjniZ2V/r76Kk76kkhkbiKpJBB0Ds1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rJuAV/btrDWjniZ2V/r76Kk76kkhkbiKpJBB0Ds1/img.jpg&quot; data-alt=&quot;Wifi 설정 페이지 - 와이파이 연결유무, 아이디, 패스워드 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rJuAV/btrDWjniZ2V/r76Kk76kkhkbiKpJBB0Ds1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrJuAV%2FbtrDWjniZ2V%2Fr76Kk76kkhkbiKpJBB0Ds1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;324&quot; height=&quot;266&quot; data-filename=&quot;2wifi_config_page.jpg&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Wifi 설정 페이지 - 와이파이 연결유무, 아이디, 패스워드 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3change_option.jpg&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bClQm2/btrDYfxtJgg/Ey5KE0MTvohUcZ8chAyF70/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bClQm2/btrDYfxtJgg/Ey5KE0MTvohUcZ8chAyF70/img.jpg&quot; data-alt=&quot;공유기 연결 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bClQm2/btrDYfxtJgg/Ey5KE0MTvohUcZ8chAyF70/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbClQm2%2FbtrDYfxtJgg%2FEy5KE0MTvohUcZ8chAyF70%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;323&quot; height=&quot;263&quot; data-filename=&quot;3change_option.jpg&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공유기 연결 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4return_message.jpg&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwCY0D/btrDYeSTdpF/zcoBDJrSK1NCRfg6e7Jxj1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwCY0D/btrDYeSTdpF/zcoBDJrSK1NCRfg6e7Jxj1/img.jpg&quot; data-alt=&quot;설정 저장 및 공유기 연결중 메세지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwCY0D/btrDYeSTdpF/zcoBDJrSK1NCRfg6e7Jxj1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwCY0D%2FbtrDYeSTdpF%2FzcoBDJrSK1NCRfg6e7Jxj1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;324&quot; height=&quot;230&quot; data-filename=&quot;4return_message.jpg&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설정 저장 및 공유기 연결중 메세지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5ipPage_connected.jpg&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBti2Q/btrDUOIw6IE/mwnn6fKWI1owyOkcbvSy3k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBti2Q/btrDUOIw6IE/mwnn6fKWI1owyOkcbvSy3k/img.jpg&quot; data-alt=&quot;공유기 연결 후 할당받은 아이피 표시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBti2Q/btrDUOIw6IE/mwnn6fKWI1owyOkcbvSy3k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBti2Q%2FbtrDUOIw6IE%2Fmwnn6fKWI1owyOkcbvSy3k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;324&quot; height=&quot;229&quot; data-filename=&quot;5ipPage_connected.jpg&quot; data-origin-width=&quot;324&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공유기 연결 후 할당받은 아이피 표시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지 코드&lt;/p&gt;
&lt;pre id=&quot;code_1654301405471&quot; class=&quot;xml&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//web page String
const char HEADER[] PROGMEM = 
&quot;&amp;lt;!doctype html&amp;gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&quot;
&quot;&amp;lt;meta name='viewport'charset='utf-8'content='width=device-width,initial-scale=1,user-scalable=no'&amp;gt;&quot;
&quot;&amp;lt;style&amp;gt;.c{text-align:center;}div,input{padding:5px;font-size:1em;}input{width:95%;}&quot;
&quot;body{text-align:center;font-family:verdana;}&quot;    
&quot;button{border:0;border-radius:0.3rem;background-color:#1fa3ec;color:#fff;line-height:2.4rem;font-size:1.2rem;width:100%}&quot;
&quot;&amp;lt;/style&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;div style='text-align:center;display:inline-block;min-width:260px;'&amp;gt;&quot;;

const char FOOTER[] PROGMEM = &quot;&amp;lt;/div&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;\r\n&quot;; 
const char BACK[] PROGMEM   = &quot;&amp;lt;form method='get'action='ip'&amp;gt;&amp;lt;button&amp;gt;Back&amp;lt;/button&amp;gt;&amp;lt;/form&amp;gt;&amp;lt;br/&amp;gt;&quot;; 

void ipPage() {
  Data += F(&quot;&amp;lt;p&amp;gt;SSID: &quot;);
  Data += ssid;
  Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;p&amp;gt;IP Address: &quot;);
  Data += ip;
  Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;form method='get'action='Button'&amp;gt;&amp;lt;button&amp;gt;Button Page&amp;lt;/button&amp;gt;&amp;lt;/form&amp;gt;&amp;lt;br/&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;form method='get'action='Wifi'&amp;gt;&amp;lt;button&amp;gt;Wifi Config&amp;lt;/button&amp;gt;&amp;lt;/form&amp;gt;&amp;lt;br/&amp;gt;&quot;);
  page = true;
}

void buttonPage() {
  Data += F(&quot;&amp;lt;h3&amp;gt;Pin Control&amp;lt;/h3&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;p&amp;gt;&amp;lt;button style='width:40%;background-color:#12cb3d'&amp;gt;ON&amp;lt;/button&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;button style='margin-left:10%;width:40%;background-color:#07510a'&amp;gt;OFF&amp;lt;/button&amp;gt;&amp;lt;/p&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;form method='get'action='button'&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;input type='hidden'id='bt'name='bt'&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;button style='background-color:#&quot;); 
  if (digitalRead(ledPin)) Data += F(&quot;12cb3d&quot;);
  else Data += F(&quot;07510a&quot;);
  Data += F(&quot;'onclick='bt.value=&quot;);
  if (digitalRead(ledPin)) Data += 10;
  else Data += 11;
  Data += F(&quot;;submit()'&amp;gt;Button 1&amp;lt;/button&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;/form&amp;gt;&quot;);
  Data += (const __FlashStringHelper *)BACK;
  page = true;
}

void wifiPage() {
  Data += (const __FlashStringHelper *)BACK;
  Data += F(&quot;&amp;lt;form method='get'action='wifi'&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;input style='width:auto;'type='checkbox'name='use'&quot;); 
  if (wifiRouter) Data += F(&quot;checked&quot;);
  Data += F(&quot;&amp;gt; connect To wifi Router&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;input id='s'name='s'length='20'value='&quot;);
  Data += ssid;
  Data += F(&quot;'&amp;gt;&amp;lt;br/&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;input id='p'name='p'length='20'value='&quot;);
  Data += pass;
  Data += F(&quot;'&amp;gt;&amp;lt;br/&amp;gt;&quot;);
  Data += F(&quot;&amp;lt;br/&amp;gt;&amp;lt;button type='submit'&amp;gt;save&amp;lt;/button&amp;gt;&amp;lt;/form&amp;gt;&quot;);
  page = true;
}

void messagePage() {
  if (wifiRouter) {
    Data += F(&quot;&amp;lt;p&amp;gt;SSID: &quot;);
    Data += ssid;
    Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
    Data += F(&quot;&amp;lt;p&amp;gt;PASS: &quot;);
    Data += pass;
    Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
    Data += F(&quot;&amp;lt;p&amp;gt;Credentials Saved.&amp;lt;/p&amp;gt;&quot;); 
    Data += F(&quot;&amp;lt;p&amp;gt;Trying to connect ESP01 to Router.&amp;lt;/p&amp;gt;&quot;);
  }
  else Data += F(&quot;&amp;lt;p&amp;gt;disconnect from Router.&amp;lt;/p&amp;gt;&quot;);
  Data += (const __FlashStringHelper *)BACK;
  page = true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Gzfxl/btrEYGOKw9H/HGGpM1GOne8fx401yaKuTk/6.Serial_basic_esp01_LED_wifiManager.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;6.Serial_basic_esp01_LED_wifiManager.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1654301405473&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;EEPROM.h&amp;gt;

#include &amp;lt;SoftwareSerial.h&amp;gt;
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(TX, RX);

const String ssid_AP = &quot;ESP01&quot;;    // your network SSID (name)
const String pass_AP = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password

bool wifiRouter = true;      // 공유기 연결 유무
char ssid[21] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
char pass[21] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

String ip = &quot;&quot;;

void ipCheck(String response) {
  int st, ed;
  if (response.indexOf(F(&quot;PIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;PIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    response.remove(0, ed+1);
    Serial.print(F(&quot;ap: &quot;)); Serial.println(ip);
  }
  if (response.indexOf(F(&quot;AIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;AIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    Serial.print(F(&quot;ip: &quot;)); Serial.println(ip);
  }
}

uint8_t retry = 1;

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  esp01.print(command); // send the read character to the esp01
  unsigned long int time = millis();
  String response = &quot;&quot;;
  while( (time+20000) &amp;gt; millis()) {
    while(esp01.available()) {  // The esp has data so display its output to the serial window
      char c = esp01.read(); // read the next character.
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) { retry = 0; Serial.println(F(&quot;OK&quot;)); break; } 
    else if (response.indexOf(F(&quot;FAIL&quot;)) != -1 || response.indexOf(F(&quot;ERROR&quot;)) != -1) { 
      if (response.indexOf(F(&quot;FAIL&quot;)) != -1) retry++;
      else if (response.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; } 
      Serial.print(command); Serial.println(F(&quot;Failed&quot;)); break; 
    }
  }
  return response;
}

String addID(String order, String ssid_AP, String pass_AP) {
  String temp = order+'&quot;'+ssid_AP+'&quot;'+','+'&quot;'+pass_AP+'&quot;';
  return temp;
}

#define ledPin 13

uint16_t sizeofHeader = 0;
uint16_t sizeofFooter = 0;
String Data = &quot;&quot;;
bool page = false;
#include &quot;webPage.h&quot;

void setWifi()  {
  sendData(F(&quot;RST&quot;)); // disconnect AP if connected
  unsigned long int time = millis();
  String temp = &quot;&quot;;
  while (time+20000 &amp;gt; millis()) {
    temp = esp01.readStringUntil('\n');
    if (temp.indexOf(F(&quot;ready&quot;)) != -1) { Serial.println(F(&quot;Set&quot;)); break; }
  }
  if (wifiRouter) sendData(F(&quot;CWMODE=3&quot;)); // configure as access point (working mode: AP+STA)
  else sendData(F(&quot;CWMODE=2&quot;));
  if (wifiRouter) sendData(F(&quot;CWDHCP=1,1&quot;));
  sendData(addID(F(&quot;CWSAP=&quot;),ssid_AP,pass_AP)+','+String(10)+','+String(3)); 
  sendData(F(&quot;CIPMUX=1&quot;)); // configure for multiple connections
  sendData(F(&quot;CIPSERVER=1,80&quot;)); // turn on server on port 80
  if (wifiRouter) {
    retry = 1;
    while(retry) { 
      sendData(addID(F(&quot;CWJAP=&quot;),ssid,pass)); 
      if (retry &amp;gt; 1) { Serial.print(F(&quot;Retrying to connect: &quot;)); Serial.println(retry-1); }
      if (retry &amp;gt; 4) { Serial.println(F(&quot;connection failed&quot;)); retry = 0; }
    }
  }
  ipCheck(sendData(F(&quot;CIFSR&quot;))); // get ip address
}

void wifi_eeprom_read() {  // 아이디 / 비밀번호 읽기
  for (int i = 0; i &amp;lt; 20; i++) ssid[i] = EEPROM.read(981 + i); // sizeof(ssid)-1
  for (int i = 0; i &amp;lt; 20; i++) pass[i] = EEPROM.read(1001 + i); // sizeof(pass)-1
}

void wifi_eeprom_write() { // 아이디 / 비밀번호 쓰기
  for (int i = 0; i &amp;lt; 20; i++) EEPROM.write(981 + i, ssid[i]); // sizeof(ssid)-1
  for (int i = 0; i &amp;lt; 20; i++) EEPROM.write(1001 + i, pass[i]); // sizeof(pass)-1
}
 
void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  if(EEPROM.read(1023) != 1) { 
    for (int i = 0 ; i &amp;lt; EEPROM.length() ; i++) EEPROM.write(i, 0); // EEPROM Clear
    EEPROM.write(1023, 1);   // eeprom 저장 플래그 
    EEPROM.write(980, wifiRouter);
    wifi_eeprom_write();  // 최초 초기화시 아이디 / 비밀번호 쓰기
  } else {
    wifiRouter = EEPROM.read(980);
    wifi_eeprom_read();  // 아두이노 리셋시 저장된 아이디 / 비밀번호 읽기
  }
  Serial.begin(9600);
  esp01.begin(9600); // your esp's baud rate might be different
  setWifi();
  sizeofHeader = sizeof(HEADER)-1; // -1: '\0'
  sizeofFooter = sizeof(FOOTER)-1; // -1: '\0'
}

uint8_t connectionId = 255; // 연결 id 저장 변수

void disconnectID() {
  if (connectionId &amp;lt; 255) {
    String command = F(&quot;AT+CIPCLOSE=&quot;);
    command += connectionId-48;
    command += F(&quot;\r\n&quot;);
    esp01.print(command);
    connectionId = 255;
  }
}

void http_response() {
  String cip = F(&quot;AT+CIPSEND=&quot;);
  cip += connectionId-48;
  cip += ',';
  if (page) cip += Data.length()+19+sizeofHeader+sizeofFooter;
  else cip += Data.length()+19;
  cip += F(&quot;\r\n&quot;);
  Serial.println(cip);
  esp01.print(cip);
  unsigned long int time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  esp01.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;)); // +19
  if (page) {
    esp01.print((const __FlashStringHelper *)HEADER);
    esp01.print(Data);
    esp01.print((const __FlashStringHelper *)FOOTER);
  } else esp01.print(Data);
  time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  Data = &quot;&quot;;
  page = false;
  disconnectID();
}

String income_wifi = &quot;&quot;;
 
void loop() {
  while (esp01.available()) { 
    income_wifi = esp01.readStringUntil('\n');
    if (income_wifi.startsWith(F(&quot;+IPD,&quot;))) {
      income_wifi.remove(0,5);
      connectionId = income_wifi.charAt(0);
      int ed = income_wifi.lastIndexOf(F(&quot;HTTP/1.1&quot;))-1;
      income_wifi.remove(ed);
      int st = income_wifi.indexOf(F(&quot;GET /&quot;))+5;
      income_wifi.remove(0,st);
      Serial.println(income_wifi);
      if (!income_wifi.startsWith(F(&quot;fav&quot;))) { // favicon.ico 는 통과 
        bool wifiChanged = false;
        if(income_wifi == F(&quot;on&quot;)){  
          digitalWrite(ledPin, HIGH);
          Data += F(&quot;&amp;lt;p&amp;gt;LED ON&amp;lt;/p&amp;gt;&quot;);
        } else if(income_wifi == F(&quot;off&quot;)){  
          digitalWrite(ledPin, LOW);  
          Data += F(&quot;&amp;lt;p&amp;gt;LED OFF&amp;lt;/p&amp;gt;&quot;);
        } else {
          if (income_wifi.indexOf(F(&quot;ip&quot;)) != -1) ipPage();
          else if (income_wifi.indexOf(F(&quot;Button&quot;)) != -1) buttonPage(); 
          else if (income_wifi.indexOf(F(&quot;button&quot;)) != -1) { 
            String temp = income_wifi.substring(income_wifi.indexOf('?')+4);
            uint8_t val = temp.toInt();
            if (val == 10) digitalWrite(ledPin, LOW);
            else digitalWrite(ledPin, HIGH);
            buttonPage(); 
          } 
          else if (income_wifi.indexOf(F(&quot;Wifi&quot;)) != -1) wifiPage(); 
          else if (income_wifi.indexOf(F(&quot;wifi&quot;)) != -1) { // 
            ed = income_wifi.lastIndexOf('&amp;amp;');
            String temp = income_wifi.substring(ed+3);
            String check = &quot;&quot;;
            if (temp.length() &amp;gt; 7) { // 비밀번호 길이가 8 이상인경우
              check = pass;
              if (temp != check) {
                wifiChanged = true;
                for (int i = 0; i &amp;lt; temp.length(); i++) pass[i] = temp[i];
                pass[temp.length()] = '\0';
              }
            }
            income_wifi.remove(ed);
            ed = income_wifi.lastIndexOf(F(&quot;s=&quot;));
            temp = income_wifi.substring(ed+2);
            Serial.println(temp);
            check = ssid;
            if (temp != check) {
              wifiChanged = true;
              for (int i = 0; i &amp;lt; temp.length(); i++) ssid[i] = temp[i];
              ssid[temp.length()] = '\0';
            }
            st = income_wifi.indexOf('?');
            temp = income_wifi.substring(st+1, st+4);
            bool oldWifiRouter = wifiRouter;
            if (temp == F(&quot;use&quot;)) wifiRouter = true;
            else wifiRouter = false;
            if (oldWifiRouter != wifiRouter) { EEPROM.write(980, wifiRouter); wifiChanged = true; }
            if (wifiChanged) { wifi_eeprom_write(); messagePage(); }
            else wifiPage(); 
          } 
          else {
            if (income_wifi == &quot;&quot;) ipPage();
            else {
              income_wifi.replace(&quot;%20&quot;, &quot; &quot;); // URL Decoding 공백문자 변경
              Serial.println(income_wifi); 
              Data += F(&quot;&amp;lt;p&amp;gt;&quot;);
              Data += income_wifi;
              Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
            }
          }
        }
        http_response();
        if (wifiChanged) setWifi();
      }
    }
    income_wifi = &quot;&quot;;
  }
  if(Serial.available() &amp;gt; 0){ // 아두이노 모듈 작동 확인
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if (temp.startsWith(F(&quot;AT&quot;))) {
      temp.remove(0,3);
      Serial.println(temp);
      sendData(temp);
    } else if (temp == F(&quot;1&quot;)) {
      EEPROM.write(1023, 0);
    } else if (temp == F(&quot;2&quot;)) {
      Serial.println(ssid);
      Serial.println(pass);
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹페이지 로그인&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와이파이를 통해 아두이노를 원격 제어할 때 Soft AP(192.168.4.1)를 사용할 경우에는 Soft AP의 비밀번호를 설정함으로써 보안이 설정되는데 (휴대폰의 와이파이 연결에서 AP연결 시 비밀번호 입력 필요), 아두이노가 와이파이 공유기에 연결되고 IP를 할당받은 경우에는 공유기 네트워크 내에 연결된 누구라도 아두이노가 연결된 IP주소만 알면 연결 및 제어가 가능하게 된다. 이를 방지하기 위해 Cookie를 사용하여 웹 로그인 기능을 구현하였다. 원격제어는 한 명만 제어가 가능해야 하며, 따라서 멀티 로그인은 배제한다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 웹 로그인 사용 유무 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span&gt;Soft AP(102.168.4.1)에 비밀번호가 설정되어 있는 경우에만 웹 로그인 활성화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* 비밀번호는 &lt;span&gt;8 문자 이상 입력해야 설정됨&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 웹 로그인 사용 시 Soft AP(102.168.4.1)를 통한 연결은 AP연결 시 비밀번호를 입력하므로 로그인 확인 안 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.&amp;nbsp; 공유기 네트워크에 로그인되어있더라도 &lt;span&gt;Soft AP(102.168.4.1) 및 다른 브라우저 로그인을 통한 연결 시 밀어내기 기능 - Soft AP 접속 우선 제어 권한&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;5. 웹 로그인 비밀번호는 Soft AP 비밀번호를 사용한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;web_login_page.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJMxHW/btrEczdhak6/G0pLFZRvt6dV5wOiNJqpq0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJMxHW/btrEczdhak6/G0pLFZRvt6dV5wOiNJqpq0/img.jpg&quot; data-alt=&quot;웹로그인 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJMxHW/btrEczdhak6/G0pLFZRvt6dV5wOiNJqpq0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJMxHW%2FbtrEczdhak6%2FG0pLFZRvt6dV5wOiNJqpq0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;185&quot; data-filename=&quot;web_login_page.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웹로그인 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;web_login_page_pass.jpg&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;186&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CDsGy/btrEc4w5gQk/nn8oiAnhpIDtGrHNUAtcgk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CDsGy/btrEc4w5gQk/nn8oiAnhpIDtGrHNUAtcgk/img.jpg&quot; data-alt=&quot;웹로그인 비밀번호 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CDsGy/btrEc4w5gQk/nn8oiAnhpIDtGrHNUAtcgk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCDsGy%2FbtrEc4w5gQk%2Fnn8oiAnhpIDtGrHNUAtcgk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;351&quot; height=&quot;186&quot; data-filename=&quot;web_login_page_pass.jpg&quot; data-origin-width=&quot;351&quot; data-origin-height=&quot;186&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웹로그인 비밀번호 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;web_login_page_pass_confirm.jpg&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drmKfw/btrEeXX1YmY/VkFfx36fV64J700OyIXAU1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drmKfw/btrEeXX1YmY/VkFfx36fV64J700OyIXAU1/img.jpg&quot; data-alt=&quot;웹로그인 확인 후 페이지 표시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drmKfw/btrEeXX1YmY/VkFfx36fV64J700OyIXAU1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrmKfw%2FbtrEeXX1YmY%2FVkFfx36fV64J700OyIXAU1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;350&quot; height=&quot;308&quot; data-filename=&quot;web_login_page_pass_confirm.jpg&quot; data-origin-width=&quot;350&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웹로그인 확인 후 페이지 표시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;web_login_page_pass_config.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lnNYk/btrEapO0mWQ/V4gTMic04uWuvD8ZRqxpH1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lnNYk/btrEapO0mWQ/V4gTMic04uWuvD8ZRqxpH1/img.jpg&quot; data-alt=&quot;웹로그인 설정화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lnNYk/btrEapO0mWQ/V4gTMic04uWuvD8ZRqxpH1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlnNYk%2FbtrEapO0mWQ%2FV4gTMic04uWuvD8ZRqxpH1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;325&quot; data-filename=&quot;web_login_page_pass_config.jpg&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웹로그인 설정화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;web_login_serial.jpg&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1e6pe/btrEcAcgY66/t5lSIcWgRolCoSgjPdTpF1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1e6pe/btrEcAcgY66/t5lSIcWgRolCoSgjPdTpF1/img.jpg&quot; data-alt=&quot;웹로그인 시 시리얼모니터 표시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1e6pe/btrEcAcgY66/t5lSIcWgRolCoSgjPdTpF1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1e6pe%2FbtrEcAcgY66%2Ft5lSIcWgRolCoSgjPdTpF1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;717&quot; height=&quot;480&quot; data-filename=&quot;web_login_serial.jpg&quot; data-origin-width=&quot;717&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웹로그인 시 시리얼모니터 표시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;로그인 웹페이지 및 쿠기 생성 코드, 비밀번호 검증 코드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1654646324871&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void loginPage() {
  if (connectedAP) {
    Data += F(&quot;&amp;lt;br /&amp;gt;occupied connection by AP&amp;lt;br /&amp;gt;&quot;);
  } else {
    Data += F(&quot;&amp;lt;form method='post'action='Login'&amp;gt;&quot;);
    Data += F(&quot;&amp;lt;input name='s'length='20'value='&quot;); 
    Data += ssid_AP;
    Data += F(&quot;'&amp;gt;&amp;lt;br /&amp;gt;&quot;);
    Data += F(&quot;&amp;lt;input type='password'name='p'length='20'&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&quot;);
    Data += F(&quot;&amp;lt;button type='submit'&amp;gt;Login&amp;lt;/button&amp;gt;&amp;lt;/form&amp;gt;&quot;);
  }
  page = true;
}

// login code
String cooValue = &quot;u7Dv0&quot;;
uint8_t cooLength = 5;
bool newCoo = true;

String makeCooValue() {
  cooValue = &quot;&quot;;
  uint8_t temp = 0;
  for (int i = 0; i &amp;lt; cooLength; i++) {
    temp = random(39, 123); //random(39, 123); // 39 ~ 122 pick
    if (temp == 47 || temp == 59 || temp == 60 || temp == 62 || temp == 92 || temp == 94 || temp == 96) temp = 41;
    cooValue += char(temp);
  }
  Serial.print(F(&quot;send coo: &quot;)); Serial.println(cooValue);
  return cooValue;
}

bool checkLogin() {
  bool confirm = false;
  String tempId = &quot;&quot;;
  tempId = esp01.readStringUntil('\n');
  while(1) { 
    tempId = esp01.readStringUntil('\n');
    if (tempId.startsWith(F(&quot;\r&quot;))) { tempId = esp01.readStringUntil('\n'); break; }
  } 
  int index = tempId.lastIndexOf('&amp;amp;');
  String tempPass = tempId.substring(index+3);
  tempId.remove(index);
  index = tempId.lastIndexOf('?');
  tempId = tempId.substring(index+3); 
  Serial.print(&quot;tempPass: &quot;); Serial.println(tempPass);
  Serial.print(&quot;tempId: &quot;); Serial.println(tempId);
  if (tempId == ssid_AP &amp;amp;&amp;amp; tempPass == pass_AP) { confirm = true; login = true; newCoo = true;}
  return confirm;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bHMjPW/btrE1unZ4fM/9hAfpheVlh6U5y95xOrrr1/7.Serial_basic_esp01_LED_Login.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;7.Serial_basic_esp01_LED_Login.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1654646370836&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;EEPROM.h&amp;gt;

#include &amp;lt;SoftwareSerial.h&amp;gt;
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(TX, RX);

const String ssid_AP = &quot;ESP01&quot;;    // your network SSID (name)
const String pass_AP = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password

bool wifiRouter = true;      // 공유기 연결 유무
char ssid[21] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
char pass[21] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

String ip = &quot;&quot;;
bool useLogin = true;
bool connectedAP = false;

void ipCheck(String response) {
  int st, ed;
  if (response.indexOf(F(&quot;PIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;PIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    response.remove(0, ed+1);
    Serial.print(F(&quot;ap: &quot;)); Serial.println(ip);
  }
  if (response.indexOf(F(&quot;AIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;AIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    Serial.print(F(&quot;ip: &quot;)); Serial.println(ip);
  }
}

uint8_t retry = 1;

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  esp01.print(command); // send the read character to the esp01
  long int time = millis();
  String response = &quot;&quot;;
  while( (time+20000) &amp;gt; millis()) {
    while(esp01.available()) {  // The esp has data so display its output to the serial window
      char c = esp01.read(); // read the next character.
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) { retry = 0; Serial.println(F(&quot;OK&quot;)); break; } 
    else if (response.indexOf(F(&quot;FAIL&quot;)) != -1 || response.indexOf(F(&quot;ERROR&quot;)) != -1) { 
      if (response.indexOf(F(&quot;FAIL&quot;)) != -1) retry++;
      else if (response.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; } 
      Serial.print(command); Serial.println(F(&quot;Failed&quot;)); break; 
    }
  }
  return response;
}

String addID(String order, String ssid_AP, String pass_AP) {
  String temp = order+'&quot;'+ssid_AP+'&quot;'+','+'&quot;'+pass_AP+'&quot;';
  return temp;
}

#define ledPin 13

uint16_t sizeofHeader = 0;
uint16_t sizeofFooter = 0;
bool page = false;
bool login = false;
String Data = &quot;&quot;;
#include &quot;webPage.h&quot;

void setWifi()  {
  sendData(F(&quot;RST&quot;)); // disconnect AP if connected
  unsigned long int time = millis();
  String temp = &quot;&quot;;
  while (time+20000 &amp;gt; millis()) {
    temp = esp01.readStringUntil('\n');
    if (temp.indexOf(F(&quot;ready&quot;)) != -1) { Serial.println(F(&quot;Set&quot;)); break; }
  }
  if (wifiRouter) sendData(F(&quot;CWMODE=3&quot;)); // configure as access point (working mode: AP+STA)
  else sendData(F(&quot;CWMODE=2&quot;));
  if (wifiRouter) sendData(F(&quot;CWDHCP=1,1&quot;));
  sendData(addID(F(&quot;CWSAP=&quot;),ssid_AP,pass_AP)+','+String(10)+','+String(3)); 
  sendData(F(&quot;CIPMUX=1&quot;)); // configure for multiple connections
  sendData(F(&quot;CIPSERVER=1,80&quot;)); // turn on server on port 80
  if (wifiRouter) {
    retry = 1;
    while(retry) { 
      sendData(addID(F(&quot;CWJAP=&quot;),ssid,pass)); 
      if (retry &amp;gt; 1) { Serial.print(F(&quot;Retrying to connect: &quot;)); Serial.println(retry-1); }
      if (retry &amp;gt; 4) { Serial.println(F(&quot;connection failed&quot;)); retry = 0; }
    }
  }
  ipCheck(sendData(F(&quot;CIFSR&quot;))); // get ip address
}

void wifi_eeprom_read() {  // 아이디 / 비밀번호 읽기
  for (int i = 0; i &amp;lt; 20; i++) ssid[i] = EEPROM.read(981 + i); // sizeof(ssid)-1
  for (int i = 0; i &amp;lt; 20; i++) pass[i] = EEPROM.read(1001 + i); // sizeof(pass)-1
}

void wifi_eeprom_write() { // 아이디 / 비밀번호 쓰기
  for (int i = 0; i &amp;lt; 20; i++) EEPROM.write(981 + i, ssid[i]); // sizeof(ssid)-1
  for (int i = 0; i &amp;lt; 20; i++) EEPROM.write(1001 + i, pass[i]); // sizeof(pass)-1
}
 
void setup() {
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  if(EEPROM.read(1023) != 1) { 
    for (int i = 0 ; i &amp;lt; EEPROM.length() ; i++) EEPROM.write(i, 0); // EEPROM Clear
    EEPROM.write(1023, 1);   // eeprom 저장 플래그 
    EEPROM.write(980, wifiRouter);
    EEPROM.write(979, useLogin);
    wifi_eeprom_write();  // 최초 초기화시 아이디 / 비밀번호 쓰기
  } else {
    useLogin = EEPROM.read(979);
    wifiRouter = EEPROM.read(980);
    wifi_eeprom_read();  // 아두이노 리셋시 저장된 아이디 / 비밀번호 읽기
  }
  if (pass_AP == &quot;&quot; || pass_AP.length() &amp;lt; 8) useLogin = false; // Soft AP의 비밀번호가 활성화되지않은 경우
  Serial.begin(9600);
  esp01.begin(9600); // your esp's baud rate might be different
  setWifi();
  sizeofHeader = sizeof(HEADER)-1; // -1: '\0'
  sizeofFooter = sizeof(FOOTER)-1; // -1: '\0'
}

uint8_t connectionId = 255; // 연결 id 저장 변수

void disconnectID() {
  if (connectionId &amp;lt; 255) {
    String command = F(&quot;AT+CIPCLOSE=&quot;);
    command += connectionId-48;
    command += F(&quot;\r\n&quot;);
    esp01.print(command);
    connectionId = 255;
  }
}

void http_response() {
  String cip = F(&quot;AT+CIPSEND=&quot;);
  cip += connectionId-48;
  cip += ',';
  if (page) {
    uint8_t len = 50+4;
    if (!connectedAP &amp;amp;&amp;amp; useLogin) {
      len += 4;
      if (login) {
        if (newCoo) len += cooLength;
      }
    }
    cip += Data.length()+len+sizeofHeader+sizeofFooter;
  } else cip += Data.length()+19;
  cip += F(&quot;\r\n&quot;);
  esp01.print(cip);
  unsigned long int time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  if (page) {
    esp01.print(F(&quot;HTTP/1.1 200 OK\nContent-type:text/html\nSet-Cookie:&quot;)); // +52 -2 = 50
    if (!connectedAP &amp;amp;&amp;amp; useLogin) {
      esp01.print(F(&quot;%%F5&quot;)); // +4
      if (login) {
        if (newCoo) esp01.print(makeCooValue()); // +cooLength
      }
    }
    esp01.print(F(&quot;\r\n\r\n&quot;)); // +8 -4 = 4 
    esp01.print((const __FlashStringHelper *)HEADER);
    esp01.print(Data);
    esp01.print((const __FlashStringHelper *)FOOTER);
  } else {
    esp01.print(F(&quot;HTTP/1.1 200 OK\r\n\r\n&quot;)); // 23 - 4 = +19
    esp01.print(Data);
  }
  time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;out&quot;)); break; }
  }
  Data = &quot;&quot;;
  page = false;
  disconnectID();
}

String income_wifi = &quot;&quot;;
 
void loop() {
  while (esp01.available()) { 
    income_wifi = esp01.readStringUntil('\n');
    bool parsing = false;
    if (income_wifi.startsWith(F(&quot;+&quot;))) {
      if (income_wifi.startsWith(F(&quot;+IPD&quot;))) parsing = true;
      else if (income_wifi.startsWith(F(&quot;+STA_CON&quot;))) { connectedAP = true; Serial.println(F(&quot;connectedAP&quot;)); }
      else if (income_wifi.startsWith(F(&quot;+STA_DIS&quot;))) { connectedAP = false; Serial.println(F(&quot;disconnectedAP&quot;)); }
    } 
    if (parsing) {
      income_wifi.remove(0,5);
      connectionId = income_wifi.charAt(0);
      int ed = income_wifi.lastIndexOf(F(&quot;HTTP/1.1&quot;))-1;
      income_wifi.remove(ed);
      int st = income_wifi.indexOf(F(&quot;GET /&quot;))+5;
      income_wifi.remove(0,st);
      Serial.println(income_wifi);
      if (!income_wifi.startsWith(F(&quot;fav&quot;))) { // favicon.ico 는 통과 
        bool OK = false, rootPage = false; bool wifiChanged = false;
        if (useLogin) {
          if (connectedAP) {
            OK = true;
            if (login) { login = false; makeCooValue(); } // 로그인 밀어내기 old Cookie terminate
          } else {
            if (!login) { // 현재 로그인 상태가 아닌 경우
              if (income_wifi.indexOf(F(&quot;Logi&quot;)) != -1) {
                Serial.println(&quot;enter&quot;);
                rootPage = checkLogin(); // 비밀번호 검증 start sending Cookie
                Serial.println(rootPage);
              } 
            } else {
              newCoo = false; 
              if (income_wifi.indexOf(F(&quot;Logi&quot;)) != -1) { // 밀어내기 로그인
                rootPage = checkLogin();
              } else { 
                uint16_t len = 0;
                String temp = &quot;&quot;;
                while(1) { 
                  temp = esp01.readStringUntil('\n');
                  len = temp.length();
                  if (temp.startsWith(F(&quot;Coo&quot;)) || len &amp;lt; 3) break; 
                } 
                if (len &amp;gt; 2) {
                  ed = temp.indexOf(F(&quot;%%F5&quot;))+4;
                  if (ed != -1) {
                    temp = temp.substring(ed, ed+cooLength);
                    if (temp == cooValue) { OK = true; newCoo = true; }
                  } 
                }
                if (OK) { // 웹페이지 출력
                  if (income_wifi.indexOf(F(&quot;Logo&quot;)) != -1) { // Logout
                    login = false; OK = false; 
                    makeCooValue(); // cookie 값 변경
                  } 
                }
              }
            }
          }
        } else {
          OK = true;
        }
        if (OK) {
          if(income_wifi == F(&quot;on&quot;)){  
            digitalWrite(ledPin, HIGH);
            Data += F(&quot;&amp;lt;p&amp;gt;LED ON&amp;lt;/p&amp;gt;&quot;);
          } else if(income_wifi == F(&quot;off&quot;)){  
            digitalWrite(ledPin, LOW);  
            Data += F(&quot;&amp;lt;p&amp;gt;LED OFF&amp;lt;/p&amp;gt;&quot;);
          } else {
            if (income_wifi.indexOf(F(&quot;ip&quot;)) != -1) ipPage();
            else if (income_wifi.indexOf(F(&quot;Button&quot;)) != -1) buttonPage(); 
            else if (income_wifi.indexOf(F(&quot;button&quot;)) != -1) { 
              String temp = income_wifi.substring(income_wifi.indexOf('?')+4);
              uint8_t val = temp.toInt();
              if (val == 10) digitalWrite(ledPin, LOW);
              else digitalWrite(ledPin, HIGH);
              buttonPage(); 
            } 
            else if (income_wifi.indexOf(F(&quot;Wifi&quot;)) != -1) wifiPage(); 
            else if (income_wifi.indexOf(F(&quot;wifi&quot;)) != -1) { // 
              ed = income_wifi.lastIndexOf('&amp;amp;');
              String temp = income_wifi.substring(ed+3);
              if (temp == F(&quot;G=on&quot;)) { 
                useLogin = true; EEPROM.write(979, useLogin);
                income_wifi.remove(ed);
                ed = income_wifi.lastIndexOf('&amp;amp;');
                temp = income_wifi.substring(ed+3);
              } else { useLogin = false; EEPROM.write(979, useLogin); }
              String check = &quot;&quot;;
              if (temp.length() &amp;gt; 7) { // 비밀번호 길이가 8 이상인경우
                check = pass;
                if (temp != check) {
                  wifiChanged = true;
                  for (int i = 0; i &amp;lt; temp.length(); i++) pass[i] = temp[i];
                  pass[temp.length()] = '\0';
                }
              }
              income_wifi.remove(ed);
              ed = income_wifi.lastIndexOf(F(&quot;s=&quot;));
              temp = income_wifi.substring(ed+2);
              Serial.println(temp);
              check = ssid;
              if (temp != check) {
                wifiChanged = true;
                for (int i = 0; i &amp;lt; temp.length(); i++) ssid[i] = temp[i];
                ssid[temp.length()] = '\0';
              }
              st = income_wifi.indexOf('?');
              temp = income_wifi.substring(st+1, st+4);
              bool oldWifiRouter = wifiRouter;
              if (temp == F(&quot;ROU&quot;)) wifiRouter = true;
              else wifiRouter = false;
              if (oldWifiRouter != wifiRouter) { EEPROM.write(980, wifiRouter); wifiChanged = true; }
              if (wifiChanged) { wifi_eeprom_write(); messagePage(); }
              else wifiPage(); 
            } else {
              if (income_wifi == &quot;&quot;) ipPage();
              else {
                income_wifi.replace(F(&quot;%20&quot;), F(&quot; &quot;)); // URL Decoding 공백문자 변경
                Serial.println(income_wifi); 
                Data += F(&quot;&amp;lt;p&amp;gt;&quot;);
                Data += income_wifi;
                Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
              }
            }
          }
        } else {
          if (useLogin) {
            if (rootPage) ipPage();
            else loginPage();
          } else {
            if (income_wifi == &quot;&quot;) ipPage();
            else {
              income_wifi.replace(F(&quot;%20&quot;), F(&quot; &quot;)); // URL Decoding 공백문자 변경
              Serial.println(income_wifi); 
              Data += F(&quot;&amp;lt;p&amp;gt;&quot;);
              Data += income_wifi;
              Data += F(&quot;&amp;lt;/p&amp;gt;&quot;);
            }
          }
        }
        http_response();
        if (wifiChanged) setWifi();
      }
    }
    income_wifi = &quot;&quot;;
  }
  if(Serial.available() &amp;gt; 0){ // 아두이노 모듈 작동 확인
    String temp = Serial.readStringUntil('\n');
    Serial.println(temp);
    if (temp.startsWith(F(&quot;AT&quot;))) {
      temp.remove(0,3);
      Serial.println(temp);
      sendData(temp);
    } else if (temp == F(&quot;1&quot;)) {
      EEPROM.write(1023, 0);
    } 
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP01 펌웨어 업로드하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 로그인 구현 코드상에 Soft AP로 연결된 상태를 확인하는 코드는 아래와 같다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1654659352549&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    if (income_wifi.startsWith(F(&quot;+&quot;))) {
      if (income_wifi.startsWith(F(&quot;+IPD&quot;))) parsing = true;
      else if (income_wifi.startsWith(F(&quot;+STA_CON&quot;))) { connectedAP = true; Serial.println(F(&quot;connectedAP&quot;)); }
      else if (income_wifi.startsWith(F(&quot;+STA_DIS&quot;))) { connectedAP = false; Serial.println(F(&quot;disconnectedAP&quot;)); }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상기 코드는 ESP01 펌웨어에서 Soft AP에 연결/종료 이벤트가 발생하면 시리얼 통신을 통해 아두이노로 보내주는 메시지 &quot;+STA_CONNECTED / +STA_DISCONNECTED&quot;를 확인하고 현재 Soft AP에서 연결된 상태인지 아닌지를 결정하는 코드이다. 따라서 ESP01의 펌웨어 프로그램에서 해당 메시지를 정상적으로 보내주지 않는다면 웹로그인 기능은 작동할 수 없게된다. 일부 펌웨어 버전이 탑제된 ESP01은 Soft AP 연결/종료 이벤트 발생시 해당 메세지를 전송하지 않는 오류가 있다고 한다. 만약 Soft AP로 연결을 했는데 시리얼 모니터에 &quot;connectedAP&quot;라는 메시지가 표시되지 않는다면 최신 펌웨어를 ESP01에 업로드해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;script async src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8269928309278636&quot;
     crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
&lt;!-- 8.본문배너7 --&gt;
&lt;ins class=&quot;adsbygoogle&quot;
     style=&quot;display:block&quot;
     data-ad-client=&quot;ca-pub-8269928309278636&quot;
     data-ad-slot=&quot;1013416775&quot;
     data-ad-format=&quot;auto&quot;
     data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 아두이노에 EMPTY CODE 업로드&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arduino_ide_new.jpg&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ttSiN/btrEdaRcYFV/JmgtZLQULOKCJavMh0HrHK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ttSiN/btrEdaRcYFV/JmgtZLQULOKCJavMh0HrHK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ttSiN/btrEdaRcYFV/JmgtZLQULOKCJavMh0HrHK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FttSiN%2FbtrEdaRcYFV%2FJmgtZLQULOKCJavMh0HrHK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;503&quot; height=&quot;127&quot; data-filename=&quot;arduino_ide_new.jpg&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;arduino_ide_new_page.jpg&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo781z/btrEcxTG7xz/6srCu0hxegBtjFbb9pIrIK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo781z/btrEcxTG7xz/6srCu0hxegBtjFbb9pIrIK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo781z/btrEcxTG7xz/6srCu0hxegBtjFbb9pIrIK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo781z%2FbtrEcxTG7xz%2F6srCu0hxegBtjFbb9pIrIK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;503&quot; height=&quot;489&quot; data-filename=&quot;arduino_ide_new_page.jpg&quot; data-origin-width=&quot;503&quot; data-origin-height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. ESP01과 아두이노의 연결을 펌웨어 업로드용으로 변경&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP01 TX -&amp;gt; 아두이노 TX&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ESP01&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;RX -&amp;gt; 아두이노 RX&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ESP01&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;VCC -&amp;gt; 아두이노 3.3V&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ESP01&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;CH_PD -&amp;gt; 아두이노 3.3V&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ESP01&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;GND -&amp;gt; 아두이노 GND&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ESP01&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;GPIO0 -&amp;gt; &lt;span&gt;아두이노 GND&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;ESP01&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;RST -&amp;gt; &lt;span&gt;아두이노 GND 연결 대기&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;esp01.jpg&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XzkxH/btrEdacCDj0/EJKA8O2Z7PZ2bhKRzLwhEk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XzkxH/btrEdacCDj0/EJKA8O2Z7PZ2bhKRzLwhEk/img.jpg&quot; data-alt=&quot;ESP01 핀맵&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XzkxH/btrEdacCDj0/EJKA8O2Z7PZ2bhKRzLwhEk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXzkxH%2FbtrEdacCDj0%2FEJKA8O2Z7PZ2bhKRzLwhEk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;320&quot; height=&quot;167&quot; data-filename=&quot;esp01.jpg&quot; data-origin-width=&quot;320&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ESP01 핀맵&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firmware_sche.jpg&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k7KLI/btrD8jIrXBJ/pcDwK3HzsGATbgX0AONil0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k7KLI/btrD8jIrXBJ/pcDwK3HzsGATbgX0AONil0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k7KLI/btrD8jIrXBJ/pcDwK3HzsGATbgX0AONil0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk7KLI%2FbtrD8jIrXBJ%2FpcDwK3HzsGATbgX0AONil0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;729&quot; height=&quot;519&quot; data-filename=&quot;firmware_sche.jpg&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. ESP01 펌웨어 / 펌웨어 업로드 프로그램 다운로드 및 압축 풀기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;펌웨어 업로드 프로그램&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cf8nxg/btrEek7lXh2/mI8SnUYUGYVrX0zJL3JErK/flash_download_tools_v3.6.5.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;flash_download_tools_v3.6.5.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;14.10MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;펌웨어 V1.7.5_1&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/qKMxz/btrEdr6Yz0A/VCttmYT9S3eF9hckkbqB6K/ESP8266_NonOS_AT_Bin_V1.7.5_1.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;ESP8266_NonOS_AT_Bin_V1.7.5_1.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.89MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.espressif.com/en/products/sdks/esp-at/resource&quot;&gt;https://www.espressif.com/en/products/sdks/esp-at/resource&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1654662231770&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Resources | Espressif Systems&quot; data-og-description=&quot;*Note: When developing new products with ESP8266, it is recommended that you use ESP8266 AT Bin V2.0.0.0 and/or later versions. Previous AT versions were based on the ESP8266 NONOS SDK, to which no new features will be added in the future. ESP8266 AT Bin V&quot; data-og-host=&quot;www.espressif.com&quot; data-og-source-url=&quot;https://www.espressif.com/en/products/sdks/esp-at/resource&quot; data-og-url=&quot;https://www.espressif.com/en/products/sdks/esp-at/resource&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cKRX1I/hyOGQ1mhKE/qVu5f62LVKy3YB2t5GUU7K/img.jpg?width=2851&amp;amp;height=1001&amp;amp;face=0_0_2851_1001&quot;&gt;&lt;a href=&quot;https://www.espressif.com/en/products/sdks/esp-at/resource&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.espressif.com/en/products/sdks/esp-at/resource&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cKRX1I/hyOGQ1mhKE/qVu5f62LVKy3YB2t5GUU7K/img.jpg?width=2851&amp;amp;height=1001&amp;amp;face=0_0_2851_1001');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Resources | Espressif Systems&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;*Note: When developing new products with ESP8266, it is recommended that you use ESP8266 AT Bin V2.0.0.0 and/or later versions. Previous AT versions were based on the ESP8266 NONOS SDK, to which no new features will be added in the future. ESP8266 AT Bin V&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.espressif.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 경로상에 한글이 있으면 정상 작동하지 않으므로 다운로드한 펌웨어 / 업로드 프로그램은 C드라이브 또는 D드라이브에 복사하고 압축을 풀어준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firmware_program.jpg&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qbwYs/btrEdsdVqUY/jB4tvzZ41q4R6M5kcSGXxk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qbwYs/btrEdsdVqUY/jB4tvzZ41q4R6M5kcSGXxk/img.jpg&quot; data-alt=&quot;펌웨어 업로드 프로그램 경로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qbwYs/btrEdsdVqUY/jB4tvzZ41q4R6M5kcSGXxk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqbwYs%2FbtrEdsdVqUY%2FjB4tvzZ41q4R6M5kcSGXxk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;910&quot; height=&quot;375&quot; data-filename=&quot;firmware_program.jpg&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;펌웨어 업로드 프로그램 경로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firmware_program1.jpg&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7jAEu/btrEeYb53C0/4KHO62Og8kzLIXzEnJcmv1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7jAEu/btrEeYb53C0/4KHO62Og8kzLIXzEnJcmv1/img.jpg&quot; data-alt=&quot;펌웨어 경로&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7jAEu/btrEeYb53C0/4KHO62Og8kzLIXzEnJcmv1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7jAEu%2FbtrEeYb53C0%2F4KHO62Og8kzLIXzEnJcmv1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;926&quot; height=&quot;260&quot; data-filename=&quot;firmware_program1.jpg&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;펌웨어 경로&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. ESP01 설치되어있는 펨웨어 지우기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4-1. flash_download_tools_v3.6.5.exe를 실행하고 ESP8266 DownloadTool을 선택한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;flash_download_tools1.jpg&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bH3Slk/btrEc3ZL1bU/jUxuXXwNkDJX5LkJk3UFY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bH3Slk/btrEc3ZL1bU/jUxuXXwNkDJX5LkJk3UFY0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bH3Slk/btrEc3ZL1bU/jUxuXXwNkDJX5LkJk3UFY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbH3Slk%2FbtrEc3ZL1bU%2FjUxuXXwNkDJX5LkJk3UFY0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;530&quot; data-filename=&quot;flash_download_tools1.jpg&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4-2. DownloadTool에서 아두이노가 연결된 COM PORT를 설정해준다. 만약 아두이노 IDE의 시리얼 모니터가 열려있다면 닫아준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;serial_port.jpg&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VSU6a/btrEgwGoHZo/y1WOrpfLtEi6cfte959bkK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VSU6a/btrEgwGoHZo/y1WOrpfLtEi6cfte959bkK/img.jpg&quot; data-alt=&quot;아두이노 IDE의 COM 포트 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VSU6a/btrEgwGoHZo/y1WOrpfLtEi6cfte959bkK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVSU6a%2FbtrEgwGoHZo%2Fy1WOrpfLtEi6cfte959bkK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;570&quot; height=&quot;488&quot; data-filename=&quot;serial_port.jpg&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아두이노 IDE의 COM 포트 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firmware_erase.jpg&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;698&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c46BQs/btrEhYoQbiG/1KqVsyDoPN3D5nhUd4iFNk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c46BQs/btrEhYoQbiG/1KqVsyDoPN3D5nhUd4iFNk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c46BQs/btrEhYoQbiG/1KqVsyDoPN3D5nhUd4iFNk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc46BQs%2FbtrEhYoQbiG%2F1KqVsyDoPN3D5nhUd4iFNk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;698&quot; data-filename=&quot;firmware_erase.jpg&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;698&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4-3. ESP01을 업로드 모드로 전환하고 지우기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ESP01의 RST핀에 연결해놓은 선을 아두이노 GND에 1초 정도 연결한 뒤 떼면 ESP01에 내장되어 있는 파란색 LED가 켜졌다 꺼지면서 업로드 모드로 전환된다. 파란색 LED가 켜졌다 꺼지지 않으면 업로드할 수 없다. ESP01과 아두이노의 연결이 잘못되었거나 아두이노에 EMPTY CODE가 업로드되지 않았을 수 있다. &lt;span&gt;ERASE 버튼을 클릭한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 펌웨어가 지워지면 아래와 같은 메시지와 함께 FINISH라고 표시된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;erase_ok.jpg&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buAaGG/btrEhp1oTuU/igOVqmmrWV2sPvwcRAyhEK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buAaGG/btrEhp1oTuU/igOVqmmrWV2sPvwcRAyhEK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buAaGG/btrEhp1oTuU/igOVqmmrWV2sPvwcRAyhEK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuAaGG%2FbtrEhp1oTuU%2FigOVqmmrWV2sPvwcRAyhEK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;704&quot; data-filename=&quot;erase_ok.jpg&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 아래 사진처럼 점선이 표시된다면 정상적으로 진행되지 않고 있다는 것이다. 이때는 STOP을 누르고 COM PORT를 확인하거나 &quot;업로드 모드&quot;로 전환하기를 다시 한 뒤 해본다. 펌웨어 지우기를 할 수 없다면, 펌웨어 업로드도 할 수 없게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;error_dp.jpg&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIu9Rj/btrEhYbsZf4/z5HVOik4ZL6Yswg6noNoMk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIu9Rj/btrEhYbsZf4/z5HVOik4ZL6Yswg6noNoMk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIu9Rj/btrEhYbsZf4/z5HVOik4ZL6Yswg6noNoMk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIu9Rj%2FbtrEhYbsZf4%2Fz5HVOik4ZL6Yswg6noNoMk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;434&quot; height=&quot;111&quot; data-filename=&quot;error_dp.jpg&quot; data-origin-width=&quot;434&quot; data-origin-height=&quot;111&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 펌웨어 설정 경로 확인하고 설정하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firmware_readme.jpg&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HLrEA/btrEiw6FjGC/LQ8r9VOZtT7eknpLgPgdS0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HLrEA/btrEiw6FjGC/LQ8r9VOZtT7eknpLgPgdS0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HLrEA/btrEiw6FjGC/LQ8r9VOZtT7eknpLgPgdS0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHLrEA%2FbtrEiw6FjGC%2FLQ8r9VOZtT7eknpLgPgdS0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;923&quot; height=&quot;280&quot; data-filename=&quot;firmware_readme.jpg&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D:\ESP8266_NonOS_AT_Bin_V1.7.5_1\ESP8266_NonOS_AT_Bin_V1.7.5\bin\at 경로의 README.md 파일을 메모장으로 열어보면 아래와 같은 경로 설정을 확인할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;i&gt;###&amp;nbsp;Flash&amp;nbsp;size&amp;nbsp;8Mbit:&amp;nbsp;512KB+512KB&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;boot_v1.2+.bin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0x00000&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user1.1024.new.2.bin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0x01000&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp_init_data_default.bin&amp;nbsp;&amp;nbsp;&amp;nbsp;0xfc000&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blank.bin&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;0x7e000&amp;nbsp;&amp;amp;&amp;nbsp;0xfe000&lt;/i&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 방법에 따라 아래와 같이 순서대로 경로 창에 입력해 준다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;target_pass.jpg&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DjnXt/btrEivNuTMG/aK7rkyAwJPB33lbhXvmQKk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DjnXt/btrEivNuTMG/aK7rkyAwJPB33lbhXvmQKk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DjnXt/btrEivNuTMG/aK7rkyAwJPB33lbhXvmQKk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDjnXt%2FbtrEivNuTMG%2FaK7rkyAwJPB33lbhXvmQKk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;464&quot; data-filename=&quot;target_pass.jpg&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.D:\ESP8266_NonOS_AT_Bin_V1.7.5_1\ESP8266_NonOS_AT_Bin_V1.7.5\bin\boot_v1.7.bin을 선택하고 우측에 &quot;0x00000&quot;을 입력.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2.D:\ESP8266_NonOS_AT_Bin_V1.7.5_1\ESP8266_NonOS_AT_Bin_V1.7.5\bin\at\512+512\user1.1024.new.2.bin을 선택하고 우측에 &quot;0x01000&quot;을 입력.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.D:\ESP8266_NonOS_AT_Bin_V1.7.5_1\ESP8266_NonOS_AT_Bin_V1.7.5\bin\esp_init_data_default_v08.bin을 선택하고 우측에 &quot;0xfc000&quot;을 입력.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.D:\ESP8266_NonOS_AT_Bin_V1.7.5_1\ESP8266_NonOS_AT_Bin_V1.7.5\bin\blank.bin을 선택하고 우측에 &quot;0x7e000&quot;을 입력.&amp;nbsp; 그 아래 같은 파일을 한번 더 선택하고 우측에 &quot;0xfe000&quot;을 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력한 다섯 개 항목의 체크박스에 체크를 해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;target_pass_all.jpg&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ex1K5Y/btrEiwTcLBk/k36GdvBW3FJ7AiPJYba3d1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ex1K5Y/btrEiwTcLBk/k36GdvBW3FJ7AiPJYba3d1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ex1K5Y/btrEiwTcLBk/k36GdvBW3FJ7AiPJYba3d1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fex1K5Y%2FbtrEiwTcLBk%2Fk36GdvBW3FJ7AiPJYba3d1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;410&quot; height=&quot;154&quot; data-filename=&quot;target_pass_all.jpg&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 설정이 완료됐으면 SPI SPEED: 40MHz, SPI MODE: QIO, FLASH SIZE: 8Mbit를 추가로 설정해주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;4-1 업로드 모드로 전환하기를 다시 실행한 뒤 &quot;START&quot; 버튼을 클릭&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;업로드 모드는 펌웨어 지우기 또는 펌웨어 업로드의 시도가 있은 후에는 그 성공 여부에 상관없이 초기화되므로 매번 업로드 모드로 전환한 후에 실행해야함.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firmware_upload2.jpg&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dN19TZ/btrEiu8XcNd/9T7bHRBkdwebMbGtUy0JqK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dN19TZ/btrEiu8XcNd/9T7bHRBkdwebMbGtUy0JqK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dN19TZ/btrEiu8XcNd/9T7bHRBkdwebMbGtUy0JqK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdN19TZ%2FbtrEiu8XcNd%2F9T7bHRBkdwebMbGtUy0JqK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;451&quot; height=&quot;707&quot; data-filename=&quot;firmware_upload2.jpg&quot; data-origin-width=&quot;451&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;firmware_upload1.jpg&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Aeam9/btrEfCNXfo9/uQCa6uxSehfpqxUiPz3jlK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Aeam9/btrEfCNXfo9/uQCa6uxSehfpqxUiPz3jlK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Aeam9/btrEfCNXfo9/uQCa6uxSehfpqxUiPz3jlK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAeam9%2FbtrEfCNXfo9%2FuQCa6uxSehfpqxUiPz3jlK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;528&quot; height=&quot;527&quot; data-filename=&quot;firmware_upload1.jpg&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;펌웨어 업로드가 완료되면 ESP01 모듈의 보드 레이트는 초기값인 115200으로 변경된다. 아두이노에서 사용할 수 있도록 보드 레이트를 9600으로 변경해주어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 아두이노에는 EMPTY CODE가 업로드 되어 있다. 이 상태에서 아두이노 IDE의 시리얼 모니터를 열고 보드 레이트는 115200, 전송옵션은 &quot;Both NL &amp;amp; CR&quot;로 설정한 뒤에 현재 아두이노 GND에 연결되어 있는 GPIO0핀의 연결을 해제한다.&amp;nbsp; GPIO0핀이 연결해제된 상태에서 RST핀을 아두이노의 GND핀에 연결했다 해제하면 시리얼 모니터에 아래와 같이 &quot;ready&quot;라는 메시지가 출력된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;esp01_ready.jpg&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daOq8d/btrEmDR6nBj/GHRH6K1Xdgs4J7JBR3lgok/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daOq8d/btrEmDR6nBj/GHRH6K1Xdgs4J7JBR3lgok/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daOq8d/btrEmDR6nBj/GHRH6K1Xdgs4J7JBR3lgok/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaOq8d%2FbtrEmDR6nBj%2FGHRH6K1Xdgs4J7JBR3lgok%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;734&quot; height=&quot;435&quot; data-filename=&quot;esp01_ready.jpg&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시리얼 모니터 입력창에 &quot;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;AT+UART_DEF=9600,8,1,0,0&lt;/span&gt;&quot;를 입력하고 엔터를 치면 &quot;OK&quot;라는 메세지가 출력되고 ESP01의 보드레이트는 9600으로 변경된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;esp01_ready9600.jpg&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnznD0/btrEh9epRc1/viwzhk3yXFhgYfEsikyzy0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnznD0/btrEh9epRc1/viwzhk3yXFhgYfEsikyzy0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnznD0/btrEh9epRc1/viwzhk3yXFhgYfEsikyzy0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnznD0%2FbtrEh9epRc1%2Fviwzhk3yXFhgYfEsikyzy0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;431&quot; data-filename=&quot;esp01_ready9600.jpg&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;보드 레이트가 9600으로 변경되었으므로 시리얼 모니터의 보드 레이트를 9600으로 변경한 뒤 시리얼 모니터 입력창에 &quot;AT&quot;를 입력하고 엔터를 치면 &quot;OK&quot;라는 메시지를 확인 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;esp01_ready9600_OK.jpg&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeeIgu/btrEeJtzH5l/tBKoMkyAaikqwL00PDSogK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeeIgu/btrEeJtzH5l/tBKoMkyAaikqwL00PDSogK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeeIgu/btrEeJtzH5l/tBKoMkyAaikqwL00PDSogK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeeIgu%2FbtrEeJtzH5l%2FtBKoMkyAaikqwL00PDSogK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;431&quot; data-filename=&quot;esp01_ready9600_OK.jpg&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 펌웨어 업로드와 보드 레이트 변경까지 완료 하였다.&amp;nbsp;아두이노와 ESP01의 연결을 이전으로(제어용) 변경해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기상청 및 오픈 웨더 맵에서 날씨 정보 받기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기상청에서 제공하던 RSS 날씨 정보 서비스가 폐지 되고 공공데이터 포털을 통한 API 접속(오픈웨더맵과 같은 방식)방식으로 변경되었습니다. API 기반 기상청 날씨 정보를 수신하고자 한다면 아래 포트스를 참조하시기 바랍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/86&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - 아두이노 - ESP01 모듈, 기상청 / 오픈웨더맵 API 날씨 정보 받기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기상청 :: 아래 기상청 날씨 정보 수신 코드는 RSS 방식일때 사용하는 코드입니다.&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;i&gt;스케치는&amp;nbsp;프로그램&amp;nbsp;저장&amp;nbsp;공간&amp;nbsp;13142&amp;nbsp;바이트(40%)를&amp;nbsp;사용.&amp;nbsp;최대&amp;nbsp;32256&amp;nbsp;바이트.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;전역&amp;nbsp;변수는&amp;nbsp;동적&amp;nbsp;메모리&amp;nbsp;437바이트(21%)를&amp;nbsp;사용,&amp;nbsp;1611바이트의&amp;nbsp;지역변수가&amp;nbsp;남음.&amp;nbsp;&amp;nbsp;최대는&amp;nbsp;2048&amp;nbsp;바이트.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/stLeB/btrD2HVOXW2/o5kKsNclvgFCNrHd8b7Xb1/Serial_basic_esp01_AT_weather_data_kor.ino?attach=1&amp;amp;knm=tfile.ino&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Serial_basic_esp01_AT_weather_data_kor.ino&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1654475820272&quot; class=&quot;arduino&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(TX, RX);

const String ssid_AP = &quot;ESP01&quot;;    // your network SSID (name)
const String pass_AP = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password

char ssid[21] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
char pass[21] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

String ip = &quot;&quot;;
String ap = &quot;&quot;;

void ipCheck(String response) {
  int st, ed;
  if (response.indexOf(F(&quot;PIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;PIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ap = response.substring(st, ed);
    response.remove(0, ed+1);
    Serial.print(F(&quot;ap: &quot;)); Serial.println(ap);
  }
  if (response.indexOf(F(&quot;AIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;AIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    Serial.print(F(&quot;ip: &quot;)); Serial.println(ip);
  }
}

uint8_t retry = 1;

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  esp01.print(command); // send the read character to the esp01
  unsigned long int time = millis();
  String response = &quot;&quot;;
  while( (time+20000) &amp;gt; millis()) {
    while(esp01.available()) {  // The esp has data so display its output to the serial window
      char c = esp01.read(); // read the next character.
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) { retry = 0; Serial.println(F(&quot;OK&quot;)); break; } 
    else if (response.indexOf(F(&quot;FAIL&quot;)) != -1 || response.indexOf(F(&quot;ERROR&quot;)) != -1) { 
      if (response.indexOf(F(&quot;FAIL&quot;)) != -1) retry++;
      else if (response.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; } 
      Serial.print(command); Serial.println(F(&quot;Failed&quot;)); break; 
    }
  }
  return response;
}

String addID(String order, String ssid_AP, String pass_AP) {
  String temp = order+'&quot;'+ssid_AP+'&quot;'+','+'&quot;'+pass_AP+'&quot;';
  return temp;
}

void setup() {
  Serial.begin(9600);
  esp01.begin(9600); // your esp's baud rate might be different
  sendData(F(&quot;CWQIF&quot;)); // disconnect AP if connected
  sendData(F(&quot;CWQAP&quot;)); // disconnect wifi if connected
  sendData(F(&quot;CWMODE=3&quot;)); // configure as access point (working mode: AP+STA)
  sendData(F(&quot;CWDHCP=1,1&quot;));
  sendData(addID(F(&quot;CWSAP=&quot;),ssid_AP,pass_AP)+','+String(10)+','+String(3)); 
  retry = 1;
  while(retry) { 
    sendData(addID(F(&quot;CWJAP=&quot;),ssid,pass)); 
    if (retry &amp;gt; 1) { Serial.print(F(&quot;Retrying to connect: &quot;)); Serial.println(retry-1); }
    if (retry &amp;gt; 4) { Serial.println(F(&quot;connection failed&quot;)); retry = 0; }
  }
  sendData(F(&quot;CIPMUX=1&quot;)); // configure for multiple connections
  sendData(F(&quot;CIPSERVER=1,80&quot;)); // turn on server on port 80
  ipCheck(sendData(F(&quot;CIFSR&quot;))); // // get ip address
}

// http://www.kma.go.kr/wid/queryDFSRSS.jsp?zone=1159068000
const char host[] PROGMEM = &quot;www.kma.go.kr&quot;;
const char url[]  PROGMEM = &quot;/wid/queryDFSRSS.jsp?zone=1159068000&quot;;

bool OK200 = false;
bool sentREQ = false;
bool gotWeather = false;

void get_weather() {
  if (!sentREQ) {
    Serial.println(F(&quot;Starting connection to server...&quot;));
    bool connectOK = false;
    String cip = F(&quot;AT+CIPSTART=3,&quot;); // connection ID 3 (ID: 0 ~ 4)
    cip += '&quot;'; cip += F(&quot;TCP&quot;); cip += '&quot;';
    cip += ','; cip += '&quot;';
    cip += (const __FlashStringHelper *)host;
    cip += '&quot;'; cip += ',';
    cip += F(&quot;80&quot;); // port number
    cip += F(&quot;\r\n&quot;);
    esp01.print(cip);
    unsigned long int time = millis();
    while (time+2000 &amp;gt; millis()) {
      cip = esp01.readStringUntil('\n');
      if (cip.indexOf(F(&quot;OK&quot;)) != -1) { connectOK = true; Serial.println(F(&quot;OK&quot;)); break; }
      else if (cip.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; }
    }
    if (connectOK) {
      Serial.println(F(&quot;Connected to server&quot;));
      String temp = F(&quot;GET &quot;);
      temp += (const __FlashStringHelper *)url;
      temp += F(&quot; HTTP/1.1\r\nHost: &quot;);
      temp += (const __FlashStringHelper *)host;
      temp += F(&quot;\r\nConnection: close\r\n\r\n&quot;);
      cip = F(&quot;AT+CIPSEND=&quot;);
      cip += 3; // connection ID 3 (ID: 0 ~ 4)
      cip += ',';
      cip += temp.length();
      cip += F(&quot;\r\n&quot;);
      esp01.print(cip);
      time = millis();
      while (time+2000 &amp;gt; millis()) {
        cip = esp01.readStringUntil('\n');
        if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;OK&quot;)); break; }
        else if (cip.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; }
      }
      esp01.print(temp);
      sentREQ = true;
      gotWeather = true;
    }
  }
}

// RSS 날씨 정보 저장 변수
// RSS 날씨 정보 저장 변수
String line0 = &quot;&quot;;
String line1 = &quot;&quot;;

uint8_t count = 0; // RSS 날씨 정보 분류 카운터
uint8_t tryCount = 0;

// 온도 저장 변수
float temp0;
float temp1;

void parsing() {
  String announce_time;
  int tm_start= line0.indexOf(F(&quot;&amp;lt;tm&amp;gt;&quot;)); // &quot;&amp;lt;tm&amp;gt;&quot;문자가 시작되는 인덱스 값('&amp;lt;'의 인덱스)을 반환한다. 
  int tm_end= line0.indexOf(F(&quot;&amp;lt;/tm&amp;gt;&quot;));  
  announce_time = line0.substring(tm_start + 4, tm_end); // +4: &quot;&amp;lt;tm&amp;gt;&quot;스트링의 크기 4바이트, 4칸 이동
  Serial.print(F(&quot;announce_time: &quot;)); Serial.println(announce_time);
  String hour;
  int hour_start= line0.indexOf(F(&quot;&amp;lt;hour&amp;gt;&quot;));
  int hour_end= line0.indexOf(F(&quot;&amp;lt;/hour&amp;gt;&quot;));
  hour = line0.substring(hour_start + 6, hour_end);
  Serial.print(F(&quot;hour: &quot;)); Serial.println(hour);
  String temp;
  int temp_start= line0.indexOf(F(&quot;&amp;lt;temp&amp;gt;&quot;));
  int temp_end= line0.indexOf(F(&quot;&amp;lt;/temp&amp;gt;&quot;));
  temp = line0.substring(temp_start + 6, temp_end);
  Serial.print(F(&quot;temp: &quot;)); Serial.println(temp);
  temp0 = temp.toFloat();   // 자료형 변경 String -&amp;gt; float
  Serial.print(F(&quot;temp0: &quot;)); Serial.println(temp0);
  String wfEn;
  int wfEn_start= line0.indexOf(F(&quot;&amp;lt;wfEn&amp;gt;&quot;));
  int wfEn_end= line0.indexOf(F(&quot;&amp;lt;/wfEn&amp;gt;&quot;));
  wfEn = line0.substring(wfEn_start + 6, wfEn_end);
  Serial.print(F(&quot;weather: &quot;)); Serial.println(wfEn);
  line0 = &quot;&quot;; // 스트링 변수 line0 데이터 추출 완료 
  Serial.println();
  hour_start= line1.indexOf(F(&quot;&amp;lt;hour&amp;gt;&quot;));
  hour_end= line1.indexOf(F(&quot;&amp;lt;/hour&amp;gt;&quot;));
  hour = line1.substring(hour_start + 6, hour_end);
  Serial.print(F(&quot;hour: &quot;)); Serial.println(hour);
  temp_start= line1.indexOf(F(&quot;&amp;lt;temp&amp;gt;&quot;));
  temp_end= line1.indexOf(F(&quot;&amp;lt;/temp&amp;gt;&quot;));
  temp = line1.substring(temp_start + 6, temp_end);
  Serial.print(F(&quot;temp: &quot;)); Serial.println(temp);
  temp1 = temp.toFloat();   // 자료형 변경 String -&amp;gt; float
  Serial.print(F(&quot;temp1: &quot;)); Serial.println(temp1);
  wfEn_start= line1.indexOf(F(&quot;&amp;lt;wfEn&amp;gt;&quot;));
  wfEn_end= line1.indexOf(F(&quot;&amp;lt;/wfEn&amp;gt;&quot;));
  wfEn = line1.substring(wfEn_start + 6, wfEn_end);
  Serial.print(F(&quot;weather: &quot;)); Serial.println(wfEn);
  line1 = &quot;&quot;; // 스트링 변수 line1 데이터 추출 완료 
}

bool header = false;

void loop() {
  if (!ip.startsWith(F(&quot;0&quot;))) { // 공유기로부터 IP주소를 할당받은 경우
    if (!gotWeather) {
      if (tryCount &amp;lt; 3) { get_weather(); tryCount++; }
    }
  }
  if (sentREQ) { // 날씨 정보가 들어오는 동안
    if (!OK200) {
      if (esp01.find('+')) {
        line0 = esp01.readStringUntil('\n');
        if (line0.indexOf(F(&quot;200&quot;)) != -1) OK200 = true;
        line0 = &quot;&quot;;
      } else { // gotWeather = true; -&amp;gt; 날씨 작업 종료 후 나머지 데이터 삭제
        line0 = esp01.readStringUntil('\n');
        if (line0.endsWith(F(&quot;D&quot;))) { 
          if (line0.endsWith(F(&quot;CLOSED&quot;))) sentREQ = false; // HTTP connection closed
        }
      }
    } else {
      if (!header) {
        line0 = esp01.readStringUntil('\n');
        if (line0.indexOf(F(&quot;&amp;lt;header&amp;gt;&quot;)) != -1) { header = true; line0 = &quot;&quot;; }
      } else {
        bool finish = false;
        while (esp01.available()) {
          char c = esp01.read();
          if (c == '&amp;lt;') count++;
          if (count &amp;lt;= 50) line0 += c;
          else if (count &amp;gt; 50 &amp;amp;&amp;amp; count &amp;lt;= 90) line1 += c;
          else if (count &amp;gt; 90) { finish = true; break; }
        }
        if (finish) {
          Serial.println(F(&quot;Finished Reading&quot;));
          Serial.println(line0);
          Serial.println(line1);
          parsing();
          gotWeather = true; // 날씨 작업 종료
          count = 0; header = false; OK200 = false; tryCount = 0; // 초기화 sentREQ = false; 
        }
      }
    }
  } else { // 날씨 이외의 경우
    if (esp01.available()) {
      line0 = esp01.readStringUntil('\n');
      Serial.println(line0);
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OPEN WEATER MAP&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;i&gt;스케치는&amp;nbsp;프로그램&amp;nbsp;저장&amp;nbsp;공간&amp;nbsp;10142&amp;nbsp;바이트(31%)를&amp;nbsp;사용.&amp;nbsp;최대&amp;nbsp;32256&amp;nbsp;바이트.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;전역&amp;nbsp;변수는&amp;nbsp;동적&amp;nbsp;메모리&amp;nbsp;407바이트(19%)를&amp;nbsp;사용,&amp;nbsp;1641바이트의&amp;nbsp;지역변수가&amp;nbsp;남음.&amp;nbsp;&amp;nbsp;최대는&amp;nbsp;2048&amp;nbsp;바이트.&lt;/i&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/qiJ97/btrD0sLRhbS/eBAIHuqiu4ZGMArF5kFKr0/Serial_basic_esp01_AT_weather_data_open.ino?attach=1&amp;amp;knm=tfile.ino&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Serial_basic_esp01_AT_weather_data_open.ino&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1654475820279&quot; class=&quot;arduino&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;SoftwareSerial.h&amp;gt;
#define rxPin 3 
#define txPin 2 
SoftwareSerial esp01(txPin, rxPin); // SoftwareSerial NAME(TX, RX);

const String ssid_AP = &quot;ESP01&quot;;    // your network SSID (name)
const String pass_AP = &quot;12345678&quot;; //&quot;1234test&quot;;         // your network password

char ssid[21] = &quot;skynet&quot;;    // &quot;SK_WiFiGIGA40F7&quot; your network SSID (name)
char pass[21] = &quot;skynet00&quot;;  // &quot;1712037218&quot; your network password 

String ip = &quot;&quot;;
String ap = &quot;&quot;;

void ipCheck(String response) {
  int st, ed;
  if (response.indexOf(F(&quot;PIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;PIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ap = response.substring(st, ed);
    response.remove(0, ed+1);
    Serial.print(F(&quot;ap: &quot;)); Serial.println(ap);
  }
  if (response.indexOf(F(&quot;AIP&quot;)) != -1) {
    st = response.indexOf(F(&quot;AIP&quot;))+5;
    ed = response.indexOf('&quot;', st+1);
    ip = response.substring(st, ed);
    Serial.print(F(&quot;ip: &quot;)); Serial.println(ip);
  }
}

uint8_t retry = 1;

String sendData(String order) {
  String command = F(&quot;AT+&quot;);
  command += order;
  command += F(&quot;\r\n&quot;);
  esp01.print(command); // send the read character to the esp01
  unsigned long int time = millis();
  String response = &quot;&quot;;
  while( (time+20000) &amp;gt; millis()) {
    while(esp01.available()) {  // The esp has data so display its output to the serial window
      char c = esp01.read(); // read the next character.
      response+=c;
    }
    if (response.indexOf(F(&quot;OK&quot;)) != -1) { retry = 0; Serial.println(F(&quot;OK&quot;)); break; } 
    else if (response.indexOf(F(&quot;FAIL&quot;)) != -1 || response.indexOf(F(&quot;ERROR&quot;)) != -1) { 
      if (response.indexOf(F(&quot;FAIL&quot;)) != -1) retry++;
      else if (response.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; } 
      Serial.print(command); Serial.println(F(&quot;Failed&quot;)); break; 
    }
  }
  return response;
}

String addID(String order, String ssid_AP, String pass_AP) {
  String temp = order+'&quot;'+ssid_AP+'&quot;'+','+'&quot;'+pass_AP+'&quot;';
  return temp;
}

void setup() {
  Serial.begin(9600);
  esp01.begin(9600); // your esp's baud rate might be different
  sendData(F(&quot;CWQIF&quot;)); // disconnect AP if connected
  sendData(F(&quot;CWQAP&quot;)); // disconnect wifi if connected
  sendData(F(&quot;CWMODE=3&quot;)); // configure as access point (working mode: AP+STA)
  sendData(F(&quot;CWDHCP=1,1&quot;));
  sendData(addID(F(&quot;CWSAP=&quot;),ssid_AP,pass_AP)+','+String(10)+','+String(3)); 
  retry = 1;
  while(retry) { 
    sendData(addID(F(&quot;CWJAP=&quot;),ssid,pass)); 
    if (retry &amp;gt; 1) { Serial.print(F(&quot;Retrying to connect: &quot;)); Serial.println(retry-1); }
    if (retry &amp;gt; 4) { Serial.println(F(&quot;connection failed&quot;)); retry = 0; }
  }
  sendData(F(&quot;CIPMUX=1&quot;)); // configure for multiple connections
  sendData(F(&quot;CIPSERVER=1,80&quot;)); // turn on server on port 80
  ipCheck(sendData(F(&quot;CIFSR&quot;))); // // get ip address
}

String json_parser(String s, String a) { 
  String val;
  if (s.indexOf(a) != -1) {
    int st_index = s.indexOf(a);
    int val_index = s.indexOf(':', st_index);
    if (s.charAt(val_index + 1) == '&quot;') {
      int ed_index = s.indexOf('&quot;', val_index + 2);
      val = s.substring(val_index + 2, ed_index);
    }
    else {
      int ed_index = s.indexOf(',', val_index + 1);
      val = s.substring(val_index + 1, ed_index);
    }
  } 
  else {
    Serial.print(a); Serial.println(F(&quot; is not available&quot;));
  }
  return val;
}

// OPEN WEATHER MAP
// https://api.openweathermap.org/data/2.5/weather?q=Seoul,KR&amp;amp;APPID=YOUR_API_KEY
const char host[] PROGMEM = &quot;api.openweathermap.org&quot;;
const char url[]  PROGMEM = &quot;/data/2.5/weather?q=Seoul,KR&amp;amp;APPID=YOUR_API_KEY&quot;; // YOUR_API_KEY 수정

bool OK200 = false;
bool sentREQ = false;
bool gotWeather = false;

void get_weather() {
  Serial.println(F(&quot;Starting connection to server...&quot;));
  bool connectOK = false;
  String cip = F(&quot;AT+CIPSTART=3,&quot;); // connection ID 3 (ID: 0 ~ 4)
  cip += '&quot;'; cip += F(&quot;TCP&quot;); cip += '&quot;';
  cip += ','; cip += '&quot;';
  cip += (const __FlashStringHelper *)host;
  cip += '&quot;'; cip += ',';
  cip += F(&quot;80&quot;); // port number
  cip += F(&quot;\r\n&quot;);
  esp01.print(cip);
  unsigned long int time = millis();
  while (time+2000 &amp;gt; millis()) {
    cip = esp01.readStringUntil('\n');
    if (cip.indexOf(F(&quot;OK&quot;)) != -1) { connectOK = true; Serial.println(F(&quot;OK&quot;)); break; }
    else if (cip.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; }
  }
  if (connectOK) {
    Serial.println(F(&quot;Connected to server&quot;));
    String temp = F(&quot;GET &quot;);
    temp += (const __FlashStringHelper *)url;
    temp += F(&quot; HTTP/1.1\r\nHost: &quot;);
    temp += (const __FlashStringHelper *)host;
    temp += F(&quot;\r\nConnection: close\r\n\r\n&quot;);
    cip = F(&quot;AT+CIPSEND=&quot;);
    cip += 3; // connection ID 3 (ID: 0 ~ 4)
    cip += ',';
    cip += temp.length();
    cip += F(&quot;\r\n&quot;);
    esp01.print(cip);
    time = millis();
    while (time+2000 &amp;gt; millis()) {
      cip = esp01.readStringUntil('\n');
      if (cip.indexOf(F(&quot;OK&quot;)) != -1) { Serial.println(F(&quot;OK&quot;)); break; }
      else if (cip.indexOf(F(&quot;ERROR&quot;)) != -1) { Serial.println(F(&quot;ERROR&quot;)); break; }
    }
    esp01.print(temp);
    sentREQ = true;
    gotWeather = true;
  }
}

// RSS 날씨 정보 저장 변수
String line = &quot;&quot;;
uint8_t tryCount = 0;

void loop() {
  if (!ip.startsWith(F(&quot;0&quot;))) { // 공유기로부터 IP주소를 할당받은 경우
    if (!gotWeather) {
      if (tryCount &amp;lt; 3) { get_weather(); tryCount++; }
    }
  }
  while (esp01.available()) { 
    line = esp01.readStringUntil('\n');
    Serial.println(line);
    if (sentREQ) {
      if (!OK200) {
        if (line.startsWith(F(&quot;+&quot;))) {
          if (line.indexOf(F(&quot;200&quot;)) != -1) OK200 = true;
          else { OK200 = false; gotWeather = false; }
        }
      } else {
        if (line.startsWith(F(&quot;{&quot;))) {
          Serial.println(line);
          Serial.println(F(&quot;weather data for parsing&quot;));
          String description = json_parser(line, F(&quot;description&quot;));
          Serial.print(F(&quot;description: &quot;)); Serial.println(description);
          String pressure = json_parser(line, F(&quot;pressure&quot;));
          Serial.print(F(&quot;pressure: &quot;)); Serial.println(pressure);
          String wind = json_parser(line, F(&quot;speed&quot;));
          Serial.print(F(&quot;wind: &quot;)); Serial.println(wind);
          String Temp = json_parser(line, F(&quot;temp&quot;));
          Serial.print(F(&quot;Temp: &quot;)); Serial.println(Temp);
          line = &quot;&quot;;
          gotWeather = true; // 날씨 작업 종료
          tryCount = 0; OK200 = false; sentREQ = false; // 초기화
        }
      }
    } else {
      Serial.println(line);
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;2022년 12월 17일 최신 업데이트 : ESP01 원격 제어 기본코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/181&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Arduino] - Setting up Wi-Fi module ESP01 and basic code for Arduino remote control&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신&amp;nbsp;업데이트&amp;nbsp;유료앱(모든&amp;nbsp;안드로이드&amp;nbsp;버전&amp;nbsp;와이파이&amp;nbsp;연결&amp;nbsp;지원)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://postpop.tistory.com/175&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1671499234578&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;ADUCON - Arduino wireless remote control application&quot; data-og-description=&quot;Arduino remote control app using a wireless module available in Arduino. Bluetooth 2.0 Classic / 4.0 BLE : HC-05, HC-06, HM-10, AT-09, BT05, ESP32, etc. Wi-Fi : ESP01, ESP8266 NodeMcu, ESP32, etc. https://play.google.com/store/apps/details?id=com.tistory.p&quot; data-og-host=&quot;postpop.tistory.com&quot; data-og-source-url=&quot;https://postpop.tistory.com/175&quot; data-og-url=&quot;https://postpop.tistory.com/175&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qHrDq/hyQYDY5bzI/sObsM0AH4IdB5GpAMqlSJ1/img.png?width=800&amp;amp;height=409&amp;amp;face=0_0_800_409,https://scrap.kakaocdn.net/dn/bG6uNW/hyQWvhitYe/8OLT6hMlXpbRtowMK7qE5k/img.png?width=800&amp;amp;height=409&amp;amp;face=0_0_800_409,https://scrap.kakaocdn.net/dn/7Ex8H/hyQYH1tNml/t5GNcsWICUFHMB7PcXMZqK/img.png?width=1206&amp;amp;height=617&amp;amp;face=0_0_1206_617&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/175&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://postpop.tistory.com/175&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qHrDq/hyQYDY5bzI/sObsM0AH4IdB5GpAMqlSJ1/img.png?width=800&amp;amp;height=409&amp;amp;face=0_0_800_409,https://scrap.kakaocdn.net/dn/bG6uNW/hyQWvhitYe/8OLT6hMlXpbRtowMK7qE5k/img.png?width=800&amp;amp;height=409&amp;amp;face=0_0_800_409,https://scrap.kakaocdn.net/dn/7Ex8H/hyQYH1tNml/t5GNcsWICUFHMB7PcXMZqK/img.png?width=1206&amp;amp;height=617&amp;amp;face=0_0_1206_617');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;ADUCON - Arduino wireless remote control application&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Arduino remote control app using a wireless module available in Arduino. Bluetooth 2.0 Classic / 4.0 BLE : HC-05, HC-06, HM-10, AT-09, BT05, ESP32, etc. Wi-Fi : ESP01, ESP8266 NodeMcu, ESP32, etc. https://play.google.com/store/apps/details?id=com.tistory.p&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;postpop.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;날씨 코드 설명 :&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/86&quot;&gt;[arduino] - 아두이노 - ESP01 모듈, 기상청 RSS / 오픈 웨더 맵 API 날씨 정보 받기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a class=&quot;con_link&quot; style=&quot;overflow-wrap: break-word;&quot; href=&quot;http://allaboutee.com/2014/12/30/esp8266-and-arduino-webserver/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://allaboutee.com/2014/12/30/esp8266-and-arduino-webserver/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://room-15.github.io/blog/2015/03/26/esp8266-at-command-reference/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련 글&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[arduino] - 아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 1편&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[arduino] - 아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 2편&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/10&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[arduino] - 아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 3편&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[arduino] - 아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 4편&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/12&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[arduino] - 아두이노 - 안드로이드를 이용한 무선 원격제어 그리고 시리얼 통신 - 5편&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/17&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[arduino] - 블루투스 4.0 BLE 이용 아두이노 및 ESP32 원격제어&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[arduino] - 아두이노 - 시리얼통신 주요 함수와 예제, String class&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/23&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[arduino] - 아두이노 - ESP01 wifi 모듈 무선 원격제어 그리고 시리얼 통신 - 6편&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/24&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[arduino] - ESP8266 - NodeMcu 1.0 와이파이 이용 원격제어(soft AP, wifi)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/25&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[arduino] - ESP32 - Dev Module 와이파이 이용 원격제어(soft AP, wifi)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/93&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[arduino] - 아두이노 - 와이파이 모듈 ESP01, WiFiEsp.h 라이브러리 이용 웹페이지에서 디지털핀 원격제어&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a class=&quot;tx-link&quot; href=&quot;https://play.google.com/store/apps/details?id=com.appybuilder.arduino_appy.arduino_BT_controller_PWM&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;arduino bluetooth controller PWM - 아두이노 원격제어 안드로이드 앱 버전 3.5 다운로드&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a class=&quot;tx-link&quot; href=&quot;https://nxpop.tistory.com/2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;arduino bluetooth controller PWM 매뉴얼&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Arduino</category>
      <category>esp-01</category>
      <category>soft ap</category>
      <category>WiFi</category>
      <category>아두이노</category>
      <category>와이파이</category>
      <category>원격제어</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/23</guid>
      <comments>https://postpop.tistory.com/23#entry23comment</comments>
      <pubDate>Wed, 8 Jun 2022 08:28:28 +0900</pubDate>
    </item>
    <item>
      <title>방송통신기자재등의 세관 통관관련 적합성평가제도 설명회 자료</title>
      <link>https://postpop.tistory.com/173</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2021년 &lt;span style=&quot;background-color: #fcfcfc;&quot;&gt;통관관련 적합성평가업무 화상설명회 자료입니다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/vpgjp/btriFjIK4ob/K0VsNIEtB9Dn9LNziGCOa1/%EC%84%B8%EA%B4%80%ED%86%B5%EA%B4%80%20%EA%B4%80%EB%A0%A8%20%EC%A0%81%ED%95%A9%EC%84%B1%ED%8F%89%EA%B0%80%20%EC%97%85%EB%AC%B4%20%EC%84%A4%EB%AA%85%ED%9A%8C%20%EC%9E%90%EB%A3%8C%282021%EB%85%84%29.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;세관통관 관련 적합성평가 업무 설명회 자료(2021년).pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;1.84MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;809&quot; data-filename=&quot;방송통신기자재등의 세관 통관관련 적합성평가제도 설명회.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPEy2m/btriKxF26Jq/ES7FItZ4tTLeL6rPAw3K41/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPEy2m/btriKxF26Jq/ES7FItZ4tTLeL6rPAw3K41/img.jpg&quot; data-alt=&quot;부록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPEy2m/btriKxF26Jq/ES7FItZ4tTLeL6rPAw3K41/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPEy2m%2FbtriKxF26Jq%2FES7FItZ4tTLeL6rPAw3K41%2Fimg.jpg&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;809&quot; data-filename=&quot;방송통신기자재등의 세관 통관관련 적합성평가제도 설명회.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;부록&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;https://www.rra.go.kr/ko/notice/noticeList_view.do?nb_seq=4974&amp;amp;nb_type=0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/173</guid>
      <comments>https://postpop.tistory.com/173#entry173comment</comments>
      <pubDate>Mon, 25 Oct 2021 10:35:28 +0900</pubDate>
    </item>
    <item>
      <title>전자파 적합성평가 사항의 변경 내용 및 변경신고</title>
      <link>https://postpop.tistory.com/172</link>
      <description>&lt;div style=&quot;font-size: 16px; font-family: 'monospace';&quot;&gt;전자파 적합성평가를 받은 기자재가 전자회로의 변경등의 사항이 발행하였을 경우 신규 적합성 평가를 받지 않고 변경신고로 인증서의 내용을 변경 가능한 경우에 관한 규정.&lt;br /&gt;변경신고는 적합인증 및 적합등록의 경우에만 인정되며, 잠정인증의 경우에는 허용되지 않는다.&lt;br /&gt;▶▶▶ 적합성평가를 받은 모델명/인증번호를 계속해서 사용할 수 있다.&lt;/div&gt;
&lt;div style=&quot;font-size: 16px; font-family: 'monospace';&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;font-size: 16px; font-family: 'monospace';&quot;&gt;「방송통신기자재등의 적합성평가에 관한 고시」(국립전파연구원고시 제2021-10호)&lt;br /&gt;&lt;br /&gt;제15조(변경사항의 범위 등) ① 영 제77조의4에 따른 적합성평가기준과 관련된 변경사항은 다음 각 호의 어느 하나와 같다. 이 경우 제4조에 따른 적합성평가기준은 변경사항과 관련된 해당 적용기준만을 적용할 수 있다.&lt;br /&gt;&lt;br /&gt;1. 회로의 변경(인쇄회로 포함)이나, 구성품의 대치, 추가로 인한 변경, 부품소자의 제거, 대치, 추가로 인한 변경 또는 선택적으로 사용할 수 있도록 하는 변경의 경우(&lt;span style=&quot;color: #0000ff;&quot;&gt;형식기호&lt;/span&gt;에 영향을 주지 않아야 한다.)&lt;br /&gt;▶ 형식기호가 변경된 경우는 신규 적합성평가 대상임. &lt;br /&gt;&lt;br /&gt;2. 하드웨어 변경 없이 소프트웨어를 이용하여 새로운 기능 등을 구현 또는 추가함으로써 제4조 적합성평가기준의 시험항목이 변경되는 경우(무선기자재의 기기부호가 추가되는 경우 외에는 형식기호를 변경할 수 있다. 다만, 컴퓨터ㆍ스마트폰ㆍ스마트 TV 등과 같이 일반 사용자가 다양한 소프트웨어를 직접 설치하여 운용할 수 있도록 제조된 범용 정보기기는 변경사항에서 제외한다.)&lt;br /&gt;&lt;br /&gt;3. 완제품으로 적합성평가를 받은 기자재가 전파법 제11조 및 제12조에 따른 주파수 할당에 따라 하드웨어 변경 없이 사용주파수 또는 기술방식이 달라지는 경우&lt;br /&gt;&lt;br /&gt;② 적합성평가기준과 관련되지 아니한 변경사항으로서 적합성평가를 받은 기자재의 유지ㆍ관리에 관한 적합성평가의 변경사항은 다음 각 호와 같다.&lt;br /&gt;&lt;br /&gt;1. 파생모델명을 변경하는 경우&lt;br /&gt;&lt;br /&gt;2. 제조자 또는 제조국가를 변경하는 경우&lt;br /&gt;&lt;br /&gt;3. 적합성평가를 받은 자가 다음 각 목에 따라 상호ㆍ성명ㆍ주소를 변경하는 경우&lt;br /&gt;가. 상속 또는 법인(법인 내 사업부서 포함)을 양도ㆍ합병ㆍ분할하는 경우&lt;br /&gt;나. 개인사업자가 법인(개인사업자가 법인의 대표자와 동일한 경우)으로 전환하는 경우&lt;br /&gt;다. 법인 또는 개인사업자에게 양도ㆍ양수하는 경우&lt;br /&gt;라. 기타 상호명ㆍ성명ㆍ주소를 단순 변경하는 경우&lt;br /&gt;&lt;br /&gt;③ 제1항에도 불구하고 다음 각 호에 해당하는 경우에는 적합성평가기준과 관련되지 아니한 변경사항으로 볼 수 있다.&lt;br /&gt;&lt;br /&gt;1. 하드웨어 변경 없이 소프트웨어를 이용하여 사용 중인 기능을 차단하거나 또는 삭제하는 경우&lt;br /&gt;&lt;br /&gt;2. 제4조제1항제1호의 공통 적용기준과 관련한 변경사항으로서 다음 각 목에 해당하는 경우&lt;br /&gt;가. 저항(Resistor), 인덕터(Inductor), 캐패시터(Capacitor)를 동일한 종류의 부품소자로 대치(단, 부품소자의 전기적 크기나 용량에 관계없이 대치할 수 있다.)&lt;br /&gt;나. 다이오드(발광다이오드 포함)를 동일한 종류의 다이오드로 대치&lt;br /&gt;다. 전기적 회로는 동일하고 전력용량(Wattage)을 축소&lt;br /&gt;라. 적합성평가를 받은 제품의 구성품을 제거 &lt;br /&gt;마. 컴퓨터 내장 구성품[별표 1 제11호 자목 35)] 중 적합성평가를 받은 동등한 기능의 구성품으로 대치&lt;br /&gt;바. 별표 1 제11호 너목 2) 또는 3)에 해당하는 기자재의 구성품을 적합성평가를 받은 동등한 기능의 구성품으로 대치하거나 해당 기자재에 적합성평가를 받은 구성품을 추가&lt;br /&gt;&lt;br /&gt;3. 제4조제1항제2호의 무선분야 적용기준과 관련한 변경사항으로서 다음 각 목에 해당하는 경우&lt;br /&gt;가. 무선 송ㆍ수신용 부품(또는 무선기능의 완성품)을 적합성평가 받은 동등한 기능의 다른 무선 송ㆍ수신용 부품(또는 무선기능의 완성품)으로 대치&lt;br /&gt;나. 무선 송ㆍ수신용 부품(또는 무선기능의 완성품)을 제거&lt;br /&gt;&lt;br /&gt;제16조(변경사항의 신고) ① 제7조 및 제9조에 따라 적합인증서 또는 적합등록필증을 교부받은 자가 적합성평가를 받은 사항을 변경하고자 할 때에는 다음 각 호에 따른 신고서(전자문서를 포함한다)와 첨부서류를 작성하여 원장에게 제출하여야 한다.&lt;br /&gt;&lt;br /&gt;1. 별지 제10호서식의 적합성평가 변경신고서&lt;br /&gt;&lt;br /&gt;2. 적합성평가 사항의 변경사실을 증명하는 서류&lt;br /&gt;&lt;br /&gt;② 제1항제2호의 &lt;span style=&quot;color: #0000ff;&quot;&gt;적합성평가를 받은 사실의 변경사항을 증명하는 서류&lt;/span&gt;는 다음 각 호와 같다.&lt;br /&gt;&lt;br /&gt;1. 제15조제1항에 해당하는 경우에는 제5조제1항제3호부터 제6호까지의 서류(다만, 제9조에 따라 적합등록한 제품의 경우에는 제8조제1항제2호의 서류만 제출한다)&lt;br /&gt;&lt;br /&gt;2. 제15조제2항제1호에 해당하는 경우에는 적합인증서 또는 적합등록필증&lt;br /&gt;&lt;br /&gt;3. 제15조제2항제2호 및 제3호에 해당하는 경우에는 법인등기부등본, 사업자등록증명, 폐업사실증명원 등 변경사실을 증명하는 서류와 적합인증서 또는 적합등록필증(적합인증서 또는 적합등록필증에 기재된 내용이 변경되지 않는 경우에는 적합인증서 또는 적합등록필증의 제출을 생략한다). 다만,「전자정부법」제36조제1항에 따른 행정정보의 공동이용을 통하여 담당 공무원이 확인하는 것에 동의하는 경우에는 첨부서류의 제출을 생략할 수 있다.&lt;br /&gt;&lt;br /&gt;③ 제1항의 규정에도 불구하고 다음 각 호에 해당하는 경우에는 변경신고를 생략할 수 있다.&lt;br /&gt;&lt;br /&gt;1. 제5조제2항에 따른 증명서류를 제출한 경우&lt;br /&gt;&lt;br /&gt;2. 전기적인 회로는 동일하고 단순 저장용량만이 변경된 기자재&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;div style=&quot;font-size: 16px; font-family: 'monospace';&quot;&gt;▲ 형식기호: 기기부호+주파수+송/수신 구별+전력+전파형식+채널&lt;br /&gt;'별표1'의 적합성평가 대상기자재 중 아래의 제1호부터 제6호의 대상기자재&lt;br /&gt;&lt;i&gt;1. 해상업무용 무선설비의 기기&lt;br /&gt;2. 항공업무용 무선설비의 기기&lt;br /&gt;3. 간이무선국ㆍ우주국ㆍ지구국의 무선설비 및 전파탐지용 무선설비 등 그 밖의 업무용 무선설비의 기기&lt;br /&gt;4. 전기통신사업용 무선설비의 기기&lt;br /&gt;5. 신고하지 아니하고 개설할 수 있는 무선국용 무선설비의 기기&lt;br /&gt;6. 기타 무선설비의 기기&lt;/i&gt; &lt;br /&gt;&lt;br /&gt;▲ 회로의 변경&lt;br /&gt;두 개 이상의 소자 연결 시 연결 순서의 변경 또는 연결방법(직렬 또는 병렬) 변경을 모두 포함한다.&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;회로의 변경.jpg&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q0Dfn/btrcXkZSksl/jey3ABGdm2CRcndQgCpB2K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q0Dfn/btrcXkZSksl/jey3ABGdm2CRcndQgCpB2K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q0Dfn/btrcXkZSksl/jey3ABGdm2CRcndQgCpB2K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq0Dfn%2FbtrcXkZSksl%2Fjey3ABGdm2CRcndQgCpB2K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;324&quot; data-filename=&quot;회로의 변경.jpg&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;▲ 적합성평가기준과 관련된 변경사항&lt;br /&gt;(형식기호에 영향을 주지 않아야 한다. 형식기호가 변경된 경우 신규 적합성평가 대상임.)&lt;br /&gt;1. 회로의 변경(인쇄회로 포함)이나, 구성품의 대치, 추가로 인한 변경, 부품소자의 제거, 대치, 추가로 인한 변경 또는 선택적으로 사용할 수 있도록 하는 변경의 경우&lt;br /&gt;2. 하드웨어 변경 없이 소프트웨어를 이용하여 새로운 기능 등을 구현 또는 추가함으로써 제4조 적합성평가기준의 시험항목이 변경되는 경우(무선기자재의 기기부호가 추가되는 경우 외에는 형식기호를 변경할 수 있다. 다만, 컴퓨터ㆍ스마트폰ㆍ스마트 TV 등과 같이 일반 사용자가 다양한 소프트웨어를 직접 설치하여 운용할 수 있도록 제조된 범용 정보기기는 변경사항에서 제외한다.)&lt;br /&gt;3. 완제품으로 적합성평가를 받은 기자재가 전파법 제11조 및 제12조에 따른 주파수 할당에 따라 하드웨어 변경 없이 사용주파수 또는 기술방식이 달라지는 경우&lt;br /&gt;&lt;br /&gt;▲ 적합성평가기준과 관련되지 아니한 변경사항&lt;br /&gt;1. 파생모델명을 변경하는 경우&lt;br /&gt;2. 제조자 또는 제조국가를 변경하는 경우&lt;br /&gt;3. 적합성평가를 받은 자가 다음 각 목에 따라 상호ㆍ성명ㆍ주소를 변경하는 경우&lt;br /&gt;&lt;i&gt;가. 상속 또는 법인(법인 내 사업부서 포함)을 양도ㆍ합병ㆍ분할하는 경우&lt;br /&gt;나. 개인사업자가 법인(개인사업자가 법인의 대표자와 동일한 경우)으로 전환하는 경우&lt;br /&gt;다. 법인 또는 개인사업자에게 양도ㆍ양수하는 경우&lt;br /&gt;라. 기타 상호명ㆍ성명ㆍ주소를 단순 변경하는 경우&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;▲ 적합성평가기준과 관련되지 아니한 변경사항으로 볼 수 있는 경우&lt;br /&gt;1. 하드웨어 변경 없이 소프트웨어를 이용하여 사용 중인 기능을 차단하거나 또는 삭제하는 경우&lt;br /&gt;2. 제4조제1항제1호의 공통 적용기준과 관련한 변경사항으로서 다음 각 목에 해당하는 경우&lt;br /&gt;&lt;i&gt;가. 저항(Resistor), 인덕터(Inductor), 캐패시터(Capacitor)를 동일한 종류의 부품소자로 대치(단, 부품소자의 전기적 크기나 용량에 관계없이 대치할 수 있다.)&lt;br /&gt;나. 다이오드(발광다이오드 포함)를 동일한 종류의 다이오드로 대치&lt;br /&gt;다. 전기적 회로는 동일하고 전력용량(Wattage)을 축소&lt;br /&gt;라. 적합성평가를 받은 제품의 구성품을 제거 &lt;br /&gt;마. 컴퓨터 내장 구성품[별표 1 제11호 자목 35)] 중 적합성평가를 받은 동등한 기능의 구성품으로 대치&lt;br /&gt;바. 별표 1 제11호 너목 2) 또는 3)에 해당하는 기자재의 구성품을 적합성평가를 받은 동등한 기능의 구성품으로 대치하거나 해당 기자재에 적합성평가를 받은 구성품을 추가&lt;/i&gt;&lt;br /&gt;3. 제4조제1항제2호의 무선분야 적용기준과 관련한 변경사항으로서 다음 각 목에 해당하는 경우&lt;br /&gt;&lt;i&gt;가. 무선 송&lt;i&gt;ㆍ&lt;/i&gt;수신용 부품(또는 무선기능의 완성품)을 적합성평가 받은 동등한 기능의 다른 무선 송&lt;i&gt;ㆍ&lt;/i&gt;수신용 부품(또는 무선기능의 완성품)으로 대치&lt;br /&gt;나. 무선 송&lt;i&gt;ㆍ&lt;/i&gt;수신용 부품(또는 무선기능의 완성품)을 제거&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;div style=&quot;position: relative; text-align: center; overflow: hidden; margin: auto;&quot;&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot;&gt;&lt;/script&gt;
&lt;!-- 4.본문배너2 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-client=&quot;ca-pub-8269928309278636&quot; data-ad-slot=&quot;9606701598&quot; data-ad-format=&quot;auto&quot; data-full-width-responsive=&quot;true&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/div&gt;
&lt;!-- 광고 코드 삽입 --&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;font-size: 16px; font-family: 'monospace';&quot;&gt;▲ 적합성평가를 받은 사실의 변경사항을 증명하는 서류&lt;br /&gt;제5조제1항&lt;span style=&quot;color: #0000ff;&quot;&gt;제3호부터 제6호&lt;/span&gt;까지의 서류(&lt;span style=&quot;color: #0000ff;&quot;&gt;적합인증&lt;/span&gt;의 경우)&lt;br /&gt;(다만, 제9조에 따라 &lt;span style=&quot;color: #0000ff;&quot;&gt;적합등록&lt;/span&gt;한 제품의 경우에는 &lt;span style=&quot;color: #0000ff;&quot;&gt;제8조제1항제2호의 서류&lt;/span&gt;만 제출한다)&lt;br /&gt;3. 다음 각 목 중 어느 하나의 시험성적서&lt;br /&gt;&lt;i&gt;가. 지정시험기관의 장이 발행하는 시험성적서&lt;br /&gt;나. 원장이 발행하는 시험성적서&lt;br /&gt;다. 국가 간 상호 인정협정을 체결한 국가의 시험기관 중 원장이 인정한 시험기관의 장이 발행한 시험성적서&lt;/i&gt;&lt;br /&gt;4. 외관도 : 제품의 전면ㆍ후면 및 타 기기와의 연결부분과 적합성평가표시 사항의 식별이 가능한 사진을 제출하여야 한다.&lt;br /&gt;5. 부품 배치도 또는 사진 : 부품의 번호, 사양 등의 식별이 가능하여야 한다.&lt;br /&gt;6. 회로도&lt;br /&gt;&lt;i&gt;가. 적합성평가를 받은 &amp;lsquo;무선 송&amp;middot;수신용 부품&amp;rsquo;을 기자재의구성품으로 사용하는 경우에는 해당 부분을 생략할 수 있다.&lt;br /&gt;나. 적합성평가기준 적용분야가 유선분야에 해당하는 기자재인 경우에는 전원 및 기간통신망과 직접 접속되는 부분의 회로도를 제출한다.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;* 제8조제1항제2호의 서류: 적합성평가기준에 부합함을 증명하는 확인서(시험기관에서 적합성평가 후 작성)&lt;br /&gt;&lt;br /&gt;▲ 전자파적합성 변경사항의 신고&lt;br /&gt;적합인증 및 적합등록에 따라 인증(등록)된 방송통신기자재의 변경신고 시 적합성평가 변경신고서에 변경사실 증명서류를 첨부하여 제출하여야 한다(시행령 제77조의4). 적합성평가기준과 관련된 사항의 변경이 포함된 경우, 적합성평가를 받아야 하며(법 제58조의2 제5항), 적합성평가를 받은 이후에 신고하여야 한다(시행령 제77조의4).&lt;br /&gt;&lt;br /&gt;▶ 신고서류&lt;br /&gt;가. 적합성평가기준과 관련된 변경사항인 경우&lt;br /&gt;- 적합성평가 변경신고서&lt;br /&gt;- 적합인증한 제품의 경우: 시험성적서, 외관도, 부품 배치도 또는 사진, 회로도&lt;br /&gt;- 적합등록한 제품의 경우: 적합성평가기준에 부합함을 증명하는 확인서(시험기관에서 적합성평가 후 작성)&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;1266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5EfcF/btrcONvuf1Y/NNhed0utpKehECU3biHUkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5EfcF/btrcONvuf1Y/NNhed0utpKehECU3biHUkk/img.png&quot; data-alt=&quot;적합성평가기준에 부합함을 증명하는 확인서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5EfcF/btrcONvuf1Y/NNhed0utpKehECU3biHUkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5EfcF%2FbtrcONvuf1Y%2FNNhed0utpKehECU3biHUkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;1266&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;1266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적합성평가기준에 부합함을 증명하는 확인서&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;br /&gt;나. 적합성평가기준과 관련되지 아니한 변경사항(기자재의 유지ㆍ관리)인 경우: &lt;br /&gt;ㄱ. 파생모델명을 변경하는 경우&lt;br /&gt;- 적합성평가 변경신고서&lt;br /&gt;- 적합인증한 제품의 경우: 적합인증서&lt;br /&gt;- 적합등록한 제품의 경우: 적합등록필증&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;1130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6R3Tz/btrcONoLl7A/FUlx9dw1ZObtE59yrGEPdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6R3Tz/btrcONoLl7A/FUlx9dw1ZObtE59yrGEPdk/img.png&quot; data-alt=&quot;방송통신기자재등의 적합인증서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6R3Tz/btrcONoLl7A/FUlx9dw1ZObtE59yrGEPdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6R3Tz%2FbtrcONoLl7A%2FFUlx9dw1ZObtE59yrGEPdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;1130&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;1130&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;방송통신기자재등의 적합인증서&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;방송통신기자재등의 적합등록 필증.jpg&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WRCL5/btrcNNJwsw7/qDQEMX8DKvpjRQkwPtNqi1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WRCL5/btrcNNJwsw7/qDQEMX8DKvpjRQkwPtNqi1/img.jpg&quot; data-alt=&quot;방송통신기자재등의 적합등록 필증&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WRCL5/btrcNNJwsw7/qDQEMX8DKvpjRQkwPtNqi1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWRCL5%2FbtrcNNJwsw7%2FqDQEMX8DKvpjRQkwPtNqi1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;290&quot; height=&quot;459&quot; data-filename=&quot;방송통신기자재등의 적합등록 필증.jpg&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;459&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;방송통신기자재등의 적합등록 필증&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;br /&gt;ㄴ. 제조자 또는 제조국가를 변경/ 상호ㆍ성명ㆍ주소를 변경하는 경우 &lt;br /&gt;- 적합성평가 변경신고서&lt;br /&gt;- 변경사실을 증명하는 서류(법인등기부등본, 사업자등록증명, 폐업사실증명원 등)&lt;br /&gt;- 적합인증한 제품의 경우: 적합인증서&lt;br /&gt;- 적합등록한 제품의 경우: 적합등록필증&lt;br /&gt;* 적합인증서 또는 적합등록필증에 기재된 내용이 변경되지 않는 경우에는 적합인증서 또는 적합등록필증의 제출을 생략&lt;br /&gt;&lt;br /&gt;다. 적합성평가기준과 관련되지 아니한 변경사항으로 볼 수 있는 경우&lt;br /&gt;- 적합성평가 변경신고서&lt;br /&gt;- 변경사실을 증명하는 서류(기술 설명서, 부품의 데이터시트 등)&lt;br /&gt;&lt;br /&gt;▲ 변경신고의 생략&lt;br /&gt;1. 제5조제2항에 따른 증명서류를 제출한 경우&lt;br /&gt;2. 전기적인 회로는 동일하고 단순 저장용량만이 변경된 기자재&lt;br /&gt;* 증명서류&lt;br /&gt;&lt;i&gt;가. 저항 등 회로소자인 경우 기존 회로소자와의 전기적 특성 비교표&lt;br /&gt;나. 부품이 시스템의 구성품인 경우 시험성적서&lt;/i&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/153&quot;&gt;[전자파 적합성] - 전자파 적합성 시험방법 및 지정시험기관 검색 방법&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/155&quot;&gt;[전자파 적합성] - 전자파 적합성 인증의 표시 및 인증 확인 방법&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/156&quot;&gt;[전자파 적합성] - 전자파 적합성 면제 대상 기자재&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/157&quot;&gt;[전자파 적합성] - 전자파 적합성 평가 대상 기자재 중 고시에 의해 비대상인 기자재&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/158&quot;&gt;[전자파 적합성] - 요건면제 받은 기자재에 대한 면제 이행기간 연장 가능 여부(RRA KSDB 제1-1호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/159&quot;&gt;[전자파 적합성] - 해외직구 제품의 중고 판매 시 적합성평가 여부(RRA KSDB 제2호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/160&quot;&gt;[전자파 적합성] - 단순 기구물인 등기구의 적합성평가 대상 여부(RRA KSDB 제3-1호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/161&quot;&gt;[전자파 적합성] - 전동스쿠터, 전동자전거 등의 적합성평가 대상 여부(RRA KSDB 제4-2호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/162&quot;&gt;[전자파 적합성] - 병행 수입제품에 대한 적합성평가 방법(RRA KSDB 제5호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/163&quot;&gt;[전자파 적합성] - 국내인증(KC)과 해외인증(CE, FCC)의 상호인정 가능 여부(RRA KSDB 제6-1호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/164&quot;&gt;[전자파 적합성] - 적합성평가를 받은 중고기자재를 수입하는 경우(RRA KSDB 제7호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/165&quot;&gt;[전자파 적합성] - 산업표준화법에 따른 KS인증제품 면제대상의 범위(RRA KSDB 제8호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/166&quot;&gt;[전자파 적합성] - 자기시험 적합등록 대상기자재의 시험성적서 인정 범위(RRA KSDB 제10호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/167&quot;&gt;[전자파 적합성] - 다수 신청인이 공동 시험을 통한 시험성적서 발급 방법(RRA KSDB 제11호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/168&quot;&gt;[전자파 적합성] - 적합성평가표시의 전자적 표시(e-labelling) 방법 및 절차(RRA KSDB 제12-1호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/169&quot;&gt;[전자파 적합성] - 전기자전거류의 구분(RRA KSDB 제13-1호)&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/170&quot;&gt;[전자파 적합성] - 직류전원으로 동작하는 전기기기 및 전동기기류 등의 기자재에 대한 적합성평가 방법&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/171&quot;&gt;[전자파 적합성] - 2012년 6월 30일 이전에 발급 받은 전기용품안전인증서의 전자파 적합성 확인방법&lt;/a&gt;&lt;/p&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/172</guid>
      <comments>https://postpop.tistory.com/172#entry172comment</comments>
      <pubDate>Mon, 23 Aug 2021 11:28:13 +0900</pubDate>
    </item>
    <item>
      <title>2012년 6월 30일 이전에 발급 받은 전기용품안전인증서의 전자파 적합성 확인방법</title>
      <link>https://postpop.tistory.com/171</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;부 칙 &amp;lt;국립전파연구원 고시 제2012-9호, 2012.3.19.&amp;gt;&lt;br /&gt;제1조(시행일) ① 이 고시는 고시한 날부터 시행한다. 다만, 개정규정에도 불구하고 전기안전 분야의 적합성평가기준 적용은 2012년 6월 30일까지 종전의 규정을 준용한다.&lt;br /&gt;② 제3조제2항에 따른 별표 2의 제3호부터 제5호까지, 제6호라목, 제10호부터 제13호까지 및 제3조제3항 별표 3의 제7호나목의 개정규정은 2012년 7월 1일 이후 제조되는 기자재부터 적용한다.&lt;br /&gt;&lt;br /&gt;제2조(경과조치) ① 이 고시 시행 당시 「산업표준화법」 제15조, 「품질경영 및 공산품안전관리법」에 따라 안전인증을 받은 공산품, 「전기용품안전 관리법」제3조에 따른 안전인증, 같은 법 제5조에 따른 안전검사, 같은 법 제11조에 따른 자율안전확인대상 전기용품의 신고 등, 같은 법 제12조에 따른 안전검사를 받은 기자재, 제14조의3에 따른 공급자적합성확인 및 같은 법 제15조에 따른 그 밖의 전기용품의 안전인증을 받은 경우에는 전파법 제58조의2에 따라 적합성평가를 받은 것으로 본다.&lt;br /&gt;② 이 고시 시행 당시「산업표준화법」,「품질경영 및 공산품안전관리법」,「전기용품안전 관리법」에 따라 이미 접수되어 심사 중에 있는 인증신청 건에 대하여는 개별 법률에서 정한 규정을 따른다.&lt;br /&gt;③ 제1항 및 제2항에 해당하는 경우에는 제23조의 규정에도 불구하고 종전의 개별 법률에 따른 표시 등을 할 수 있다.&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;&lt;/div&gt;
&lt;p style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://e-ks.kr/KSCI/lmx//lawFullScreenEx.doid=0000001407&amp;amp;reform_no=0002&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://e-ks.kr/KSCI/lmx//lawFullScreenEx.do?id=0000001407&amp;amp;reform_no=0002&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;&lt;br /&gt;전기자기적합성(EMC) 규격&lt;br /&gt;&lt;br /&gt;제정 기술표준원고시 제2005 - 825호 (2005. 12 01)&lt;br /&gt;개정 기술표준원고시 제2006 - 956호 (2006. 12. 28)&lt;br /&gt;&lt;br /&gt;개별기기의 전기자기적합성 시험은 다음 규격을 따라 시험하여야 하며, 각 규격에서 제시하고 있는 한계값에 만족해야 한다. 또한 복합기능을 가진 기기는 각 각의 시험 기준에 만족해야한다.&lt;/div&gt;
&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;
&lt;table style=&quot;border-collapse: collapse; width: 101.048%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%; text-align: center;&quot;&gt;&lt;span&gt;&lt;span&gt;규격 번호&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%; text-align: center;&quot;&gt;&lt;span&gt;&lt;span&gt;규 격 명&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 00011&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;산업&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;과학&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;의료&lt;/span&gt;&lt;span&gt;(ISM)&lt;/span&gt;&lt;span&gt;용기기의 전기자기장해 측정방법 및 한계값&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 00013&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;음성과 텔레비전 방송수신기 및 관련 기기류의 전기자기장해 측정방법 및 한계값&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 00014-1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;가정용 전기기기&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;전동공구 및 유사기기류의 요구조건 제&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 00014-2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;가정용 전기기기&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;전동공구 및 유사기기류의 요구조건 제&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;전기자기내성&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제품군규격&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 00015&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;조명기기&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;유사기기의 전기자기장해 측정방법 및 한계값&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 00016-1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;내성측정 장비 및 측정방법 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;부&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전기자기장해 및 내성측정장비&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;KS C CISPR 16-1-1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;내성 측정장비 및 측정방법 &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;내성 측정장비 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;측정장비&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;KS C CISPR 16-1-2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;내성 측정장비 및 측정방법 &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;내성 측정장비 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;측정 부대장비 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;잡음단자전압&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;KS C CISPR 16-1-3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;내성 측정장비 및 측정방법 &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;내성 측정장비 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;측정 부대장비 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;잡음전력&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;KS C CISPR 16-1-4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;내성 측정장비 및 측정방법 &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;span&gt;ㆍ&lt;/span&gt;&lt;span&gt;내성 측정장비 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;측정 부대장비 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;잡음전계강도&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;KS C CISPR 16-1-5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;내성 측정장비 및 측정방법 &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전기자기장해&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;내성 측정장비 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: 30MHz - 1000MHz &lt;/span&gt;&lt;span&gt;의 안테나 교정 시험장&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 00016-2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기장해 내성측정 장비 및 측정방법 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;부&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전기자기장해 및 내성측정방법&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;KS C CISPR 17&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;수동 전기자기장해 필터와 억제부품의 억제특성 측정방법&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 00020&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;라디오&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;테레비전수신기 등 방송수신기 및 관련기기의 전자기내성 측정방법 및 한계값&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 00022&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;정보사무기기의 무선방해특성에 대한 측정방법과 한계값&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 00024&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;정보사무기기의 전기자기내성 측정방법 및 한계값&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-3-2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;한계값 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;고조파 전류 방출의 한계값&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;기기의 입력전류 상당 &lt;/span&gt;&lt;span&gt;16 A&lt;/span&gt;&lt;span&gt;이하&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-3-3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;한계값 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;플리커와 전압변동에 대한 한계값&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;상당 &lt;/span&gt;&lt;span&gt;16 A&lt;/span&gt;&lt;span&gt;이하&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-6-1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;일반기준 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;주거용&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;상업용 및 경공업 환경에서 사용하는 기기의 전기자기 내성기준&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-6-2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;일반기준 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;산업용 환경에서 사용하는 기기의 전기자기 내성기준&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-6-3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;일반기준 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;주거용&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;상업용 및 경공업 환경에서 사용하는 기기의 전기자기 내성기준&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-6-4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;일반기준 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;산업용 환경에서 사용하는 기기의 전기자기 내성기준&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-3-11&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;한계값 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;11&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;공공저전압 시스템에서의 전압변동 및 플리커의 한계값 &lt;/span&gt;&lt;span&gt;- 75 A&lt;/span&gt;&lt;span&gt;이하의 정격전류와 조건부 연결 기기&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-4-2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기 적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;시험 및 측정방법 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;정전기방전 내성&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-4-3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;시험 및 측정방법 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전기자기방사 내성시험&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-4-4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;시험 및 측정방법 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전기적 빠른 과도현상 내성시험&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-4-5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;시험 및 측정방법 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;서지 내성시험&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-4-6&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;시험 및 측정방법 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;6&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전기자기장 전도내성시험&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-4-8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;시험 및 측정방법 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전원주파수 자계내성시험&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-4-9&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;시험 및 측정방법 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;9&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;펄스자계 내성시험&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-4-11&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;시험 및 측정방법 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;11&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;전압강하&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;순시정전 및 전압변동 내성시험&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K 61000-4-13&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;전기자기적합성&lt;/span&gt;&lt;span&gt;(EMC) - &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;부 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;시험 및 측정방법 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;제&lt;/span&gt;&lt;span&gt;13&lt;/span&gt;&lt;span&gt;절 &lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;교류 전원단에서 주전원선 신호화를 포함한 고조파와 중간 고조파&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;저주파 내성 시험&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K61547&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;일반조명기구 &lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;전기자기적합성 내성 요구사항&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.5143%;&quot;&gt;&lt;span&gt;&lt;span&gt;K10001&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 84.4138%;&quot;&gt;&lt;span&gt;&lt;span&gt;휴대전화 배터리 충전기&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;수입되는 물품이 &lt;span style=&quot;color: #0000FF;&quot;&gt;인증 받을 당시의 동일한 기자재인 경우&lt;/span&gt;에 한해, 2012년 6월 30일 이전에 발급받은 전기용품안전인증서상의 적용기준에 상기의 전자파적합성 규격기준이 명시되어 있다면 전파법 제58조의2에 따라 적합성평가를 받은 것으로 볼 수 있다.&lt;br /&gt;&lt;br /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/171</guid>
      <comments>https://postpop.tistory.com/171#entry171comment</comments>
      <pubDate>Mon, 23 Aug 2021 10:38:39 +0900</pubDate>
    </item>
    <item>
      <title>직류전원으로 동작하는 전기기기 및 전동기기류 등의 기자재에 대한 적합성평가 방법</title>
      <link>https://postpop.tistory.com/170</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;
□ 개 요&lt;br /&gt;
&lt;br /&gt;
ㅇ 직류전원(DC)으로 동작하는 전기기기 및 전동기기류 등의 기자재가 적합성평가 대상인지 여부를 명확히 하고자 함&lt;br /&gt;
&lt;br /&gt;
□ 근 거&lt;br /&gt;
&lt;br /&gt;
ㅇ 「전파법」 제58조의2(방송통신기자재등의 적합성평가)&lt;br /&gt;
ㅇ 「방송통신기자재등의 적합성평가에 관한 고시」 [별표 1]&lt;br /&gt;
&lt;br /&gt;
□ 내 용&lt;br /&gt;
&lt;br /&gt;
ㅇ 직류전원(DC)으로 동작하는 전기기기 및 전동기기류 등의 기자재는 「방송통신기자재등의 적합성평가에 관한 고시」 [별표 1] 제11호 너목에 따라 자기시험 적합등록 대상 기자재임&lt;br /&gt;
&lt;br /&gt;
※ 2012.7.1. 「전기용품 안전관리법」에 따라 교류전원( 50V 이상 1000V 이하)을 사용하는 전기용품 안전인증 대상이 「전파법」에 따른 지정시험기관 적합등록 대상으로 편입&lt;br /&gt;
&lt;br /&gt;
- 또한, 전자파는 직류전원을 사용하는 기자재에서도 발생할 수 있기 때문에 직류전원으로 동작하는 전기기기 및 전동기기류 등의 기자재를 2013.7.1.부터 자기시험 적합등록 대상으로 분류. 이는 당시 관련 업계의 요구사항을 수렴하여 1년의 유예기간을 두고 정한 것임&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[전자파 적합성] - 전자파 적합성 평가 대상 기자재 중 고시에 의해 비대상인 기자재&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/170</guid>
      <comments>https://postpop.tistory.com/170#entry170comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:53:25 +0900</pubDate>
    </item>
    <item>
      <title>전기자전거류의 구분(RRA KSDB 제13-1호)</title>
      <link>https://postpop.tistory.com/169</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;
□ 개 요&lt;br /&gt;
&lt;br /&gt;
ㅇ 「방송통신기자재등의 적합성평가에 관한 고시」 [별표 1] 제11호 타목의 전기자전거류의 정의를 명확히 규정&lt;br /&gt;
&lt;br /&gt;
□ 근 거&lt;br /&gt;
&lt;br /&gt;
ㅇ 「전파법」 제58조의2(방송통신기자재등의 적합성평가)&lt;br /&gt;
ㅇ 「방송통신기자재등의 적합성평가에 관한 고시」 [별표 1]&lt;br /&gt;
ㅇ 「자전거 이용 활성화에 관한 법률」 제2조(정의)&lt;br /&gt;
&lt;br /&gt;
□ 내 용&lt;br /&gt;
&lt;br /&gt;
ㅇ 「방송통신기자재등의 적합성평가에 관한 고시」 [별표 1] 제11호 타목의 전기자전거류는 ｢자전거 이용 활성화에 관한 법률｣ 제2조제1의2호의 정의에서 규정한 기기에 한하며, 그 밖에 이동수단용전동기기는 제11호 다목 52)로 분류&lt;br /&gt;
&lt;br /&gt;
ㅇ &quot;전기자전거&quot;란 ｢자전거 이용 활성화에 관한 법률｣ 제2조제1의2호에서 자전거로서 사람의 힘을 보충하기 위하여 전동기를 장착하고 다음의 요건을 모두 충족하는 것을 말한다고 규정하고 있음&lt;br /&gt;
- 페달(손페달을 포함한다)과 전동기의 동시 동력으로 움직이며, 전동기만으로는 움직이지 아니할 것&lt;br /&gt;
- 시속 25킬로미터 이상으로 움직일 경우 전동기가 작동하지 아니할 것&lt;br /&gt;
- 부착된 장치의 무게를 포함한 자전거의 전체 중량이 30킬로그램 미만일 것&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/169</guid>
      <comments>https://postpop.tistory.com/169#entry169comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:52:16 +0900</pubDate>
    </item>
    <item>
      <title>적합성평가표시의 전자적 표시(e-labelling) 방법 및 절차(RRA KSDB 제12-1호)</title>
      <link>https://postpop.tistory.com/168</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;
□ 개 요&lt;br /&gt;
&lt;br /&gt;
ㅇ 적합성평가 표시를 제품의 표면에 물리적인 방법으로 표시하는 대신에 펌웨어나 소프트웨어를 이용하여 전자적으로 표시(e-labelling)할 수 있는 방법 및 절차를 공유&lt;br /&gt;
&lt;br /&gt;
□ 근 거&lt;br /&gt;
&lt;br /&gt;
ㅇ 「전파법」 제58조의2(방송통신기자재등의 적합성평가) 제6항&lt;br /&gt;
ㅇ 「전파법 시행령」 제77조의5(적합성평가의 표시)&lt;br /&gt;
ㅇ 「방송통신기자재등의 적합성평가에 관한 고시」 [별표5]&lt;br /&gt;
&lt;br /&gt;
□ 내 용&lt;br /&gt;
&lt;br /&gt;
ㅇ 적용범위&lt;br /&gt;
1) 적합성평가표시를 제품의 표면과 포장에 물리적인 방법으로 표시하는 대신 펌웨어나 소프트웨어 또는 QR코드를 이용한 전자적 표시(e-labelling) 방법을 선택적으로 사용할 수 있도록 허용&lt;br /&gt;
2) 전자적 표시(e-Labelling)는 다음 두 가지 방법을 적용&lt;br /&gt;
가) 디스플레이 방식 : 디스플레이가 내장된 제품(프로젝터 등과 같이 자체 디스플레이 제품 포함)에 한해 디스플레이를 통해 적합성평가표시를 확인 할 수 있는 방법으로 사용자가 디스플레이를 임의로 제거할 수 없는 경우에 한하여 적용할 수 있음&lt;br /&gt;
나) QR코드 방식 : 제품의 표면 또는 포장에 표시된 QR코드를 통해 적합성평가표시를 확인할 수 있는 방법으로 QR코드 내에 직접 적합성평가정보를 수록하는 정보수록방식과 적합성평가를 받은 자의 홈페이지 URL 링크를 통해 적합성평가정보를 표시하는 링크방식을 선택적으로 적용할 수 있음&lt;br /&gt;
3) 전자적 표시(e-labelling) 정보는 식별이 가능하도록 표기하여야 함&lt;br /&gt;
&lt;br /&gt;
ㅇ 전자적 표시(e-labelling)에 표기하여야 할 정보&lt;br /&gt;
1) △국가통합인증마크 기본도안과 △식별부호 및 △적합성평가정보를 표시&lt;br /&gt;
2) 인증받은 무선 송·수신용 부품의 식별부호[표시방법의 예 : 인증받은 무선모듈(또는 RF MODULE) : 식별부호]&lt;br /&gt;
3) 제2호 마목의 “식별부호 진위여부 확인 URL”(링크방식의 QR코드에 한함)&lt;br /&gt;
4) 추가적으로 표시할 수 있는 사항 : 제2호 마목의 “식별부호 진위여부 확인 URL”(정보수록방식의 QR코드에 한함), [별표 4]의 사용자 안내문, 전파법 제47조의2에 따른 전자파흡수율 등급, 사용자 설명서 등&lt;br /&gt;
&lt;br /&gt;
ㅇ 전자적 표시(e-labelling)를 사용하는 제품의 요구조건&lt;br /&gt;
1) 공통 요구조건&lt;br /&gt;
가) 사용자가 특별한 접근암호나 인가절차 없이 제3호 나목의 정보에 접근할 수 있어야 하며, 어떠한 경우에도 장치의 메뉴에서 3단계 이하의 단계를 거쳐 접근할 수 있어야 함&lt;br /&gt;
나) 전자적 표시(e-labelling) 정보는 제3자(일반사용자)에게 부여된 권한(예 : 어플리케이션 설치, 메뉴접근 등)의 통상적 활동과정에서 변경 또는 제거될 수 없는 방식으로 보호되어야 하며 적합성평가를 받은 자는 이를 보증하여야 함&lt;br /&gt;
2) 디스플레이 방식의 요구조건&lt;br /&gt;
가) 사용자에게 전자적 표시(e-labelling)를 사용한 제품임을 포장재 또는 사용자설명서에 명시하여야 함&lt;br /&gt;
나) 사용자가 별도의 장치 또는 부대용품(예 : SIM, USIM 등)을 사용하지 않고 전자적으로 저장된 제3호 나목의 정보에 접근할 수 있어야 함&lt;br /&gt;
다) 사용자가 정보에 접근할 수 있는 방법에 관한 특정한 안내문을 반드시 제공하여야 한함. 이러한 안내문은 사용자설명서(전자적 방식 포함), 작동설명서, 포장재 삽입물 또는 기타 이와 유사한 방식으로 제공할 수 있음&lt;br /&gt;
3) QR코드 방식의 요구조건&lt;br /&gt;
가) 링크방식을 통해 적합성평가표시를 하는 경우 적합성평가를 받은 자의 홈페이지는 적합성평가를 받은 자의 책임하에 운영 및 관리되어야 하며, 적합성평가표시 정보의 지속적인 서비스제공이 보장되어야 함&lt;br /&gt;
나) QR코드 표시방법은 다음과 같다.&lt;br /&gt;
(1) 국가통합마크 및 식별부호를 QR코드의 내부 또는 QR코드 테두리의 밖에 인접하여 상, 하, 좌, 우 중 적절한 위치에 눈에 잘 보이도록 표시하여야 함&lt;br /&gt;
(2) QR코드를 신속하게 인식하는데 지장이 없는 범위 내에서 제품의 디자인에 따라 기본도안의 크기와 색깔을 적절히 변경하여 사용할 수 있음&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/168</guid>
      <comments>https://postpop.tistory.com/168#entry168comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:51:33 +0900</pubDate>
    </item>
    <item>
      <title>다수 신청인이 공동 시험을 통한 시험성적서 발급 방법(RRA KSDB 제11호)</title>
      <link>https://postpop.tistory.com/167</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;
□ 개 요&lt;br /&gt;
&lt;br /&gt;
ㅇ 동일 제품을 다수인이 공동으로 시험을 신청하여 적합성평가를 받을 수 있는 규정 및 절차를 공유&lt;br /&gt;
&lt;br /&gt;
□ 근 거&lt;br /&gt;
&lt;br /&gt;
ㅇ 「방송통신기자재등의 적합성평가에 관한 고시」 부칙 &lt; 제2018-13호 &gt; 제3조(다른 고시의 개정)&lt;br /&gt;
ㅇ 「방송통신기자재등」 시험기관의 지정 및 관리에 관한 고시 제13조(시험성적서 등)&lt;br /&gt;
&lt;br /&gt;
□ 내 용&lt;br /&gt;
&lt;br /&gt;
ㅇ 신청인이 2인 이상으로 구성하여 시험을 신청한 경우, 1인 신청과 동일하게 시험절차를 적용하되, 시험성적서(전자문서를 포함한다)는 신청한 사업자 각각에게 발급할 수 있도록 제도를 개선(2018.07.31.)&lt;br /&gt;
&lt;br /&gt;
ㅇ 시험성적서에는 다음 각 호의 사항이 포함되어야 하며, 시험신청인의 성명 및 주소만 신청인 별로 달리하고 모든 내용은 동일하여야 함(신청자 식별부호가 시험성적서에 들어가는 경우 신청인 별로 다르게 할 수 있음)&lt;br /&gt;
  1. 시험신청 기자재명&lt;br /&gt;
  2. 시험신청인의 성명 및 주소&lt;br /&gt;
  3. 지정시험기관의 명칭 및 주소(시험을 행한 장소가 다를 경우는 그 소재지)&lt;br /&gt;
  4. 시험성적서 발급번호 및 페이지 일련번호&lt;br /&gt;
  5. 시험신청기자재에 대한 개요 및 형식명 또는 모델명·모델번호, 기자재일련번호(해당되는 경우에 한함)&lt;br /&gt;
  6. 시험신청기자재 접수일, 시험기간 및 시험성적서 발행일&lt;br /&gt;
  7. 사용한 시험방법(품질관리규정에서 제시한 시험방법이 아닌 경우에는 그에 대한 명확한 설명)&lt;br /&gt;
  8. 시험결과(필요시 도표, 그래프, 사진 등 첨부)&lt;br /&gt;
  9. 시험결과에 대한 담당시험원의 의견&lt;br /&gt;
  10. 시험업무 수행 중 회로 및 구조를 보완함으로써 적합성평가기준에 만족하게 된 경우 보완 전후의 모습, 부위, 재질, 사유, 보완전의 부적합 사항 등의 보완내용&lt;br /&gt;
  11. 지정시험기관의 장, 기술책임자 및 담당시험원의 직위·서명&lt;br /&gt;
  12. 그 밖에 필요한 사항&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/167</guid>
      <comments>https://postpop.tistory.com/167#entry167comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:49:57 +0900</pubDate>
    </item>
    <item>
      <title>자기시험 적합등록 대상기자재의 시험성적서 인정 범위(RRA KSDB 제10호)</title>
      <link>https://postpop.tistory.com/166</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;
□ 개 요&lt;br /&gt;
&lt;br /&gt;
ㅇ 적합등록 대상기자재 중 자기시험 적합등록 대상기자재의 시험성적서 발행 주체 및 인정 범위에 대한 규정 및 해석을 공유&lt;br /&gt;
&lt;br /&gt;
□ 근 거&lt;br /&gt;
&lt;br /&gt;
ㅇ 「전파법」 제58조의2(방송통신기자재등의 적합성평가)&lt;br /&gt;
ㅇ 「방송통신기자재등의 적합성평가에 관한 고시」 제8조(적합등록의 신청 등),  제10조(적합등록자가 비치하여야 할 서류 등)&lt;br /&gt;
&lt;br /&gt;
□ 내 용&lt;br /&gt;
&lt;br /&gt;
ㅇ 자기시험 적합등록은 「전파법」 제58조의2제3항에 따라 “공급자 스스로 시험하거나 지정시험기관이 아닌 시험기관에서 시험을 거쳐 적합성평가기준에 적합함을 확인한 후 그 사실을 등록”하는 제도임&lt;br /&gt;
&lt;br /&gt;
ㅇ 자기시험 적합등록 대상기자재의 시험성적서는 자체시험성적서, 지정시험기관이 아닌 시험기관의 시험성적서, 외국에서 시험한 성적서 등으로 자기시험 적합등록을 할 수 있음&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[전자파 적합성] - 전자파 적합성 시험방법 및 지정시험기관 검색 방법&lt;/a&gt;&lt;/p&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/166</guid>
      <comments>https://postpop.tistory.com/166#entry166comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:48:42 +0900</pubDate>
    </item>
    <item>
      <title>산업표준화법에 따른 KS인증제품 면제대상의 범위(RRA KSDB 제8호)</title>
      <link>https://postpop.tistory.com/165</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;□ 개 요&lt;br /&gt;&lt;br /&gt;ㅇ 「전파법」상 적합성평가 면제 대상 중 「산업표준화법」 제15조에 따른 KS인증을 받은 경우, 특정모델에 한해 면제되는 것인지 아니면 KS인증서 상에서 명시한 범위에 해당하는 제품이 면제 대상에 해당되는지 여부에 대해 관련 규정 및 해석을 공유&lt;br /&gt;&lt;br /&gt;□ 근 거&lt;br /&gt;&lt;br /&gt;ㅇ 「전파법」 제58조의3(적합성평가의 면제)&lt;br /&gt;ㅇ 「전파법 시행령」 제77조의7(적합성평가의 면제) [별표 6의2]&lt;br /&gt;ㅇ 「방송통신기자재등의 적합성평가에 관한 고시」 제15조(변경사항의 범위)&lt;br /&gt;&lt;br /&gt;□ 내 용&lt;br /&gt;&lt;br /&gt;ㅇ 「산업표준화법」 제15조에 따라 KS인증을 받은 품목 중 「전파법」 제58조의3 제1항제4호에서 규정한 면제 범위는 관계법령에 따라 전파법에 준하는 전자파장해 및 전자파로부터의 보호에 관한 적합성평가를 받은 제품(특정모델)에 한해 EMC 분야 적합성평가 면제 대상임&lt;br /&gt;&lt;br /&gt;※ 「전파법」 제58조의3 및 시행령 제77조의7에 따른 [별표 6의2]&lt;br /&gt;전파법에 준하는 전자파장해 및 전자파로부터의 보호에 관한 적합성평가를 받은 경우에 해당하고, 적합성평가기준에서 정한 허용 기준과 동일하거나 그이상인 기자재&lt;br /&gt;&lt;br /&gt;ㅇ KS인증을 받은 품목 중 「전파법」에 따라 면제받은 모델을 변경하는 경우, 「방송통신기자재등의 적합성평가에 관한 고시」 제15조는 전기적 회로는 동일하고 전력용량(Wattage)을 축소한 제품은 적합성평가와 관련되지 아니한 변경사항으로 보아 신고하여야 하나 KS인증 모델은 변경신고 한 것으로 간주 함&lt;br /&gt;&lt;br /&gt;※ 예) KS인증 시 전력용량 &amp;ldquo;70W초과 150W이하&amp;rdquo; 구간 내에서 100W 모델에 대해 전자파적합성 시험을 한 경우, 전력용량 100W 해당 모델 및 그 이하 용량의 모델(전기적회로가 동일한 것)에 한해 변경신고 생략&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;RRA&amp;nbsp;KSDB&amp;nbsp;제8호&amp;nbsp;(2018.12.27.)&lt;/div&gt;
&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;▶&amp;nbsp;&amp;nbsp;KS 인증시 표본으로 선정되고 검사 된 모델의 하위용량 제품은 변경신고 한 것으로 간주되어 전자파적합성 면제 대상인 것으로 생각 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/P1ufy/btroKxAwKOx/sODfhEJJd434dZJG7hUebk/RRA%20KSDB%20%EC%A0%9C8%ED%98%B8%282018.12.27.%29%20%EC%82%B0%EC%97%85%ED%91%9C%EC%A4%80%ED%99%94%EB%B2%95%EC%97%90%20%EB%94%B0%EB%A5%B8%20KS%EC%9D%B8%EC%A6%9D%EC%A0%9C%ED%92%88%20%EB%A9%B4%EC%A0%9C%EB%8C%80%EC%83%81%EC%9D%98%20%EB%B2%94%EC%9C%84.pdf?attach=1&amp;amp;knm=tfile.pdf&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;RRA KSDB 제8호(2018.12.27.) 산업표준화법에 따른 KS인증제품 면제대상의 범위.pdf&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.06MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/156&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[전자파 적합성] - 전자파 적합성 면제 대상 기자재&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/165</guid>
      <comments>https://postpop.tistory.com/165#entry165comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:45:39 +0900</pubDate>
    </item>
    <item>
      <title>적합성평가를 받은 중고기자재를 수입하는 경우(RRA KSDB 제7호)</title>
      <link>https://postpop.tistory.com/164</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;□ 개 요&lt;br /&gt;&lt;br /&gt;ㅇ 적합성평가를 받은 중고기자재를 수입할 경우 적합성평가를 다시 받아야 하는지 여부에 대한 해석을 공유&lt;br /&gt;&lt;br /&gt;□ 근 거&lt;br /&gt;&lt;br /&gt;ㅇ 「전파법」 제58조의2(방송통신기자재등의 적합성평가)&lt;br /&gt;&lt;br /&gt;□ 내 용&lt;br /&gt;&lt;br /&gt;ㅇ 국내에서 「전파법」 제58조의2에 따라 이미 적합성평가를 받은 중고 기자재를 외국에서 수입하는 경우에는 다시 적합성평가를 받지 않아도 됨&lt;br /&gt;&lt;br /&gt;- 다만, 적합성평가를 받은 사실을 확인할 수 있도록 해당 제품에 적합성평가표시가 부착되어 있어야 함&lt;br /&gt;&lt;br /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;▶&amp;nbsp;&amp;nbsp;수입하는 물품은 중고이고&lt;br /&gt;▶&amp;nbsp;&amp;nbsp;해당 물품이 국내 적합성평가를 받고 인증/등록되어 있으며&lt;br /&gt; ▶&amp;nbsp;&amp;nbsp;인증/등록 번호를 포함한 전자파적합성 표시가 되어 있고 인증/등록 번호를 확인할 수 있는 경우&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/164</guid>
      <comments>https://postpop.tistory.com/164#entry164comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:42:04 +0900</pubDate>
    </item>
    <item>
      <title>국내인증(KC)과 해외인증(CE, FCC)의 상호인정 가능 여부(RRA KSDB 제6-1호)</title>
      <link>https://postpop.tistory.com/163</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;
□ 개 요&lt;br /&gt;
&lt;br /&gt;
ㅇ 국내인증(KC)과 해외인증(CE, FCC)간 상호인정이 가능한지 여부와 상호인정이 가능한 국가 및 인정범위에 관한 정보를 공유&lt;br /&gt;
&lt;br /&gt;
□ 근 거&lt;br /&gt;
&lt;br /&gt;
ㅇ 「전파법」 제58조의8(적합성평가의 국가 간 상호 인정)&lt;br /&gt;
ㅇ 「전파법 시행령」 제77조의13(적합성평가의 국가 간 상호인정협정)&lt;br /&gt;
&lt;br /&gt;
□ 내 용&lt;br /&gt;
&lt;br /&gt;
ㅇ 각국의 전파인증 관련 기술기준은 국제표준을 준용하고 있으나, 국가별로 주파수 정책, 기술기준 등이 서로 달라 상호인정은 불가함&lt;br /&gt;
&lt;br /&gt;
- 다만, 「전파법」 제58조의8에 따라 상호인정협정(MRA) 1단계를 체결한 미국, EU, 캐나다, 베트남, 칠레 5개 국가의 경우에는 국립전파연구원장이 승인한 해당 국가의 시험기관에서 국내 기술기준에 따라 시험한 성적서는 국내 시험기관에서 발행한 성적서와 동일한 조건으로 인정하고 있으며, 해당 성적서 및 회로도 등 관련 서류를 첨부하여 국내 인증기관(전파시험인증센터)에 인증신청 할 수 있음&lt;br /&gt;
&lt;br /&gt;
ㅇ 캐나다의 경우에는 상호 인정협정 1단계(시험성적서 상호인정)에 이어 2단계(인증서 상호인정)를 체결하여 2019년 6월 15일부터 시행&lt;br /&gt;
&lt;br /&gt;
- 2단계가 시행될 경우, 캐나다로 수출하는 제품에 대해 국내에서 시험 및 인증을 받아 캐나다로 수출이 가능&lt;br /&gt;
&lt;br /&gt;
※ 상호 인정협정 1단계 : 국내에서 시험하고 해외(상대국)에서 인증 받은 후 수출 가능&lt;br /&gt;
※ 상호 인정협정 2단계 : 국내에서 시험 및 인증을 받고 수출 가능&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/163</guid>
      <comments>https://postpop.tistory.com/163#entry163comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:38:22 +0900</pubDate>
    </item>
    <item>
      <title>병행 수입제품에 대한 적합성평가 방법(RRA KSDB 제5호)</title>
      <link>https://postpop.tistory.com/162</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;□ 개 요&lt;br /&gt;&lt;br /&gt;ㅇ 기 수입된 적합성평가를 받은 제품을 다른 수입자가 병행 수입하는 경우에 대한 적합성평가 절차 및 방법을 공유&lt;br /&gt;&lt;br /&gt;□ 근 거 &lt;br /&gt;ㅇ 「전파법」 제58조의2(방송통신기자재등의 적합성평가)&lt;br /&gt;ㅇ 「방송통신기자재등의 적합성평가에 관한 고시」 제2조(정의), 제20조(적합성평가 절차 및 서류의 간소화 등)&lt;br /&gt;ㅇ 「방송통신기자재등 시험기관의 지정 및 관리에 관한 고시」 제13조(시험성적서 등)&lt;br /&gt;&lt;br /&gt;□ 내 용&lt;br /&gt;&lt;br /&gt;ㅇ 기 수입된 적합성평가를 받은 제품을 다른 병행수입자가 수입하는 경우에도 다시 적합성평가를 받아야 함&lt;br /&gt;&lt;br /&gt;- 이는 동일한 모델이라도 제조국가, 제조공장, 제조공정에 따라 제품의 적합성여부에 영향을 줄 수 있고, 적합성평가 받은 제품과의 동일성, 제품의 A/S, 사후관리 등에 대한 책임 등의 사유로 수입 업체별로 적합성평가를 받아야 함&lt;br /&gt;&lt;br /&gt;ㅇ 다만, 다른 수입업자가 「방송통신기자재등의 적합성평가에 관한 고시」 제2조제1항제8호의 동일기자재에 대하여 수입하고자 하는 경우에는 적합성평가를 받은 자로부터 동의를 받아 별도의 시험 없이 간략한 절차로 적합성평가를 받을 수 있음&lt;br /&gt;&lt;br /&gt;ㅇ 아울러, 신청인이 2인 이상으로 구성하여 시험을 신청한 경우 1인 신청과 동일하게 시험절차를 적용하고, 시험성적서(전자문서를 포함한다)는 각각 발급받아 적합인증 또는 등록이 가능함&lt;br /&gt;&lt;br /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;&lt;br /&gt;국립전파연구원고시 제2021-10호 「방송통신기자재등의 적합성평가에 관한 고시」&lt;br /&gt;&lt;br /&gt;제5조(적합인증의 신청 등) ① 제3조제1호에 따른 대상기자재에 대하여 적합인증을 신청하고자 하는 자는 다음 각 호의 신청서와 첨부서류(전자문서를 포함한다)를 작성하여 원장에게 제출하여야 한다.&lt;br /&gt;1. 별지 제1호서식의 적합인증신청서&lt;br /&gt;2. 사용자설명서(한글본) : 제품개요, 사양, 구성 및 조작방법 등이 포함되어야 한다.&lt;br /&gt;3. 다음 각 목 중 어느 하나의 시험성적서&lt;br /&gt;가. 지정시험기관의 장이 발행하는 시험성적서&lt;br /&gt;나. 원장이 발행하는 시험성적서&lt;br /&gt;다. 국가 간 상호 인정협정을 체결한 국가의 시험기관 중 원장이 인정한 시험기관의 장이 발행한 시험성적서&lt;br /&gt;4. 외관도 : 제품의 전면ㆍ후면 및 타 기기와의 연결부분과 적합성평가표시 사항의 식별이 가능한 사진을 제출하여야 한다.&lt;br /&gt;5. 부품 배치도 또는 사진 : 부품의 번호, 사양 등의 식별이 가능하여야 한다.&lt;br /&gt;&lt;span style=&quot;color: #0000FF;&quot;&gt;6. 회로도&lt;/span&gt;&lt;br /&gt;가. 적합성평가를 받은 무선 송&amp;middot;수신용 부품을 기자재의구성품으로 사용하는 경우에는 해당 부분을 생략할 수 있다.&lt;br /&gt;나. 적합성평가기준 적용분야가 유선분야에 해당하는 기자재인 경우에는 전원 및 기간통신망과 직접 접속되는 부분의 회로도를 제출한다.&lt;br /&gt;7. 대리인 지정서 : 제27조에 따른 별지 제4호서식의 대리인 지정(위임)서&lt;br /&gt;&lt;br /&gt;⑥ 제1항의 규정에도 불구하고 적합인증을 신청하는 자(제2조제1항제1호에서 정의한 제조자가 아닌 자에 한함)가 다음 각 호의 어느 하나에 해당하는 경우에는 제7항 각 호의 사항을 준수하는 조건으로 제1항제6호의 &lt;span style=&quot;color: #0000FF;&quot;&gt;회로도 제출을 생략할 수 있다.&lt;/span&gt;&lt;br /&gt;1.「병행수입에 있어서의 불공정거래행위의 유형고시」제2조에 따른 &lt;span style=&quot;color: #0000FF;&quot;&gt;병행수입을 행하는 수입자가 적합인증을 신청한 경우&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;&lt;br /&gt;병행수입에 있어서의 불공정거래행위의 유형고시&lt;br /&gt;[시행 2015. 10. 23.] [공정거래위원회고시 제2015-15호, 2015. 10. 23., 일부개정]&lt;br /&gt;&lt;br /&gt;불공정거래행위에 해당되어 금지되는 부당한 병행수입 저지행위의의 대표적인 유형을 구체적으로 밝혀 이를 사전에 예방하는데 그 목적이 있다.&lt;br /&gt;&lt;br /&gt;제2조(용어의 정의) ① &quot;진정상품&quot;이라 함은 상표가 외국에서 적법하게 사용할 수 있는 권리가 있는 자에 의하여 부착되어 배포된 상품을 말한다.&lt;br /&gt;②&quot;독점수입권자&quot;라 함은 다음 각 호의 1에 해당하는 자를 말한다.&lt;br /&gt;1. 외국상표권자와 국내상표권자가 동일인이거나 계열회사관계(주식 또는 지분의 30%이상을 소유하면서 최다출자자인 경우)이거나, 수입대리점관계에 있는 자&lt;br /&gt;2. 외국상표권자와 제1호의 관계에 있는 자로부터 전용사용권을 설정받은 자&lt;br /&gt;③&lt;span style=&quot;color: #0000FF;&quot;&gt;&quot;병행수입&quot;이라 함은 독점수입권자에 의해 당해 외국상품이 수입되는 경우 제3자가 다른 유통경로를 통하여 진정상품을 국내 독점수입권자의 허락없이 수입하는 것을 말한다.&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/162</guid>
      <comments>https://postpop.tistory.com/162#entry162comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:37:27 +0900</pubDate>
    </item>
    <item>
      <title>전동스쿠터, 전동자전거 등의 적합성평가 대상 여부(RRA KSDB 제4-2호)</title>
      <link>https://postpop.tistory.com/161</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;
□ 개 요&lt;br /&gt;
&lt;br /&gt;
ㅇ 최근 전동스쿠터, 전동자전거 등 이동수단용 전동기기가 적합성평가 대상에 해당되는지 여부에 대한 질의가 많아 관련 규정 및 절차를 공유&lt;br /&gt;
&lt;br /&gt;
□ 근 거&lt;br /&gt;
&lt;br /&gt;
ㅇ 「전파법」 제58조의2(방송통신기자재등의 적합성평가)&lt;br /&gt;
ㅇ 「방송통신기자재등의 적합성평가에 관한 고시」 [별표 1]&lt;br /&gt;
&lt;br /&gt;
□ 내 용&lt;br /&gt;
&lt;br /&gt;
ㅇ 전동스쿠터와 전동자전거는 「방송통신기자재등의 적합성평가에 관한 고시」 [별표 1] 제11호 다목 52)에 따라 가정용 전기기기 및 전동기기류의 이동수단용 전동기기로 분류되어 지정시험기관 적합등록 대상임&lt;br /&gt;
&lt;br /&gt;
- 다만, 해당 기자재가 충전지 전원으로 동작하고 인증을 받은 별도의 충전기를 사용하는 경우에는 「방송통신기자재등의 적합성평가에 관한 고시」 [별표 1] 제11호 더목에 따라 자기시험 적합등록에 해당됨&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/161</guid>
      <comments>https://postpop.tistory.com/161#entry161comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:36:07 +0900</pubDate>
    </item>
    <item>
      <title>단순 기구물인 등기구의 적합성평가 대상 여부(RRA KSDB 제3-1호)</title>
      <link>https://postpop.tistory.com/160</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;□ 개 요&lt;br /&gt;&lt;br /&gt;ㅇ 조명기기 중 단순 기구물인 등기구가 여러 형태로 된 경우 적합성평가 대상 여부에 대한 해석의 논란이 있어 판단 근거를 명확히 하고자 함&lt;br /&gt;&lt;br /&gt;□ 근 거&lt;br /&gt;&lt;br /&gt;ㅇ 「전파법」 제58조의2(방송통신기자재등의 적합성평가)&lt;br /&gt;ㅇ 「방송통신기자재등의 적합성평가에 관한 고시」 제3조(적합성평가 대상기자재의 분류 등) 및 [별표 1] 적합성평가 대상기자재&lt;br /&gt;&lt;br /&gt;□ 내 용&lt;br /&gt;&lt;br /&gt;o 「방송통신기자재등의 적합성평가에 관한 고시」 [별표 1] 제11호라목에 따르면, 9kHz부터 400GHz까지 주파수대에서의 형광등 및 조명기능을 가지는 기구 또는 장치&lt;br /&gt;&lt;br /&gt;- 즉, 형광등기구, PLS조명기구, 백열등기구, 전기스탠드, 할로겐등기구, 고압방전등기구, 투광조명기구, 램프용 자기식안정기, 램프용전자식안정기, 네온변압기, 네온변압기조명기구용컨버터(LED전원공급장치 포함), 안정기내장형램프(LED용 포함), 크리스마스츄리용조명기구, 충전식휴대전등, 조광기는 적합성평가 대상임&lt;br /&gt;&lt;br /&gt;o 이외, 단순 기구물인 등기구의 경우에는 그 형태에 따라 적합성평가 대상 여부를 판단하고 있음&lt;br /&gt;&lt;br /&gt;- (사례 1) 투광등기구로서 단순 기구물로 이루어진 등기구(램프, 컨버터 별도)인 경우&lt;br /&gt;- (판단) 램프 또는 컨버터가 포함되지 않고, 전자파를 발생하는 부품 및 회로가 없는 단순 기구물로만 이루어진 등기구는 적합성평가 대상이 아님&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;301&quot; data-filename=&quot;단순 기구물인 등기구1.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3M4lE/btrcojVXTkm/Ns2VawvWaPihFUBdZQ8h7K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3M4lE/btrcojVXTkm/Ns2VawvWaPihFUBdZQ8h7K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3M4lE/btrcojVXTkm/Ns2VawvWaPihFUBdZQ8h7K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3M4lE%2FbtrcojVXTkm%2FNs2VawvWaPihFUBdZQ8h7K%2Fimg.jpg&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;301&quot; data-filename=&quot;단순 기구물인 등기구1.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;- (사례 2) 경관조명기구로서 단순 기구물로 이루어진 등기구(램프, 컨버터 별도)인 경우&lt;br /&gt;- (판단) 램프 또는 컨버터가 포함되지 않고, 전자파를 발생하는 부품 및 회로가 없는 단순 기구물로만 이루어진 등기구는 적합성평가 대상이 아님&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;258&quot; data-filename=&quot;단순 기구물인 등기구2.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV1nO4/btrcxJL2gOb/VPwRDCZlhF4Bu4t9q59Vz0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV1nO4/btrcxJL2gOb/VPwRDCZlhF4Bu4t9q59Vz0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV1nO4/btrcxJL2gOb/VPwRDCZlhF4Bu4t9q59Vz0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV1nO4%2FbtrcxJL2gOb%2FVPwRDCZlhF4Bu4t9q59Vz0%2Fimg.jpg&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;258&quot; data-filename=&quot;단순 기구물인 등기구2.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;- (사례 3) 경관조명기구로서 단순 기구물에 LED램프(전자파적합성평가 인증제품)를 장착한 등기구인 경우&lt;br /&gt;- (판단) 적합성평가를 받은 LED램프를 장착하고, 전자파를 발생하는 부품 및 회로가 없는 등기구는 적합성평가 대상이 아님&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;258&quot; data-filename=&quot;단순 기구물인 등기구3.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRagHZ/btrcs6Bf3pv/S0sk803xLOfiUxXo2Xbtg0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRagHZ/btrcs6Bf3pv/S0sk803xLOfiUxXo2Xbtg0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRagHZ/btrcs6Bf3pv/S0sk803xLOfiUxXo2Xbtg0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRagHZ%2Fbtrcs6Bf3pv%2FS0sk803xLOfiUxXo2Xbtg0%2Fimg.jpg&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;258&quot; data-filename=&quot;단순 기구물인 등기구3.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;- (사례4) LED경관조명기구, LED수중등으로서 단순기구물에 LED모듈만 장착한 등기구(컨버터 별도)인 경우&lt;br /&gt;- (답변) 컨버터 장착 없이 LED모듈로만 구성되어 있고, 전자파를 발생하는 부품 및 회로가 없는 단순기구물로 만들어진 등기구는 적합성평가 대상이 아님&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;258&quot; data-filename=&quot;단순 기구물인 등기구5.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs3jNb/btrcuI0XaiZ/pdPQMgoN0Ut6PQ9nD1y730/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs3jNb/btrcuI0XaiZ/pdPQMgoN0Ut6PQ9nD1y730/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs3jNb/btrcuI0XaiZ/pdPQMgoN0Ut6PQ9nD1y730/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs3jNb%2FbtrcuI0XaiZ%2FpdPQMgoN0Ut6PQ9nD1y730%2Fimg.jpg&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;258&quot; data-filename=&quot;단순 기구물인 등기구5.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://postpop.tistory.com/157&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[전자파 적합성] - 전자파 적합성 평가 대상 기자재 중 고시에 의해 비대상인 기자재&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/160</guid>
      <comments>https://postpop.tistory.com/160#entry160comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:35:27 +0900</pubDate>
    </item>
    <item>
      <title>해외직구 제품의 중고 판매 시 적합성평가 여부(RRA KSDB 제2호)</title>
      <link>https://postpop.tistory.com/159</link>
      <description>&lt;div style=&quot;font-size: 18px; font-family: 'Noto Sans Light';&quot;&gt;
□ 개 요&lt;br /&gt;
&lt;br /&gt;
ㅇ 적합성평가 면제조건에 해당하는 “개인이 사용할 목적의 제품”을 해외직구로 구입하여 사용하다가 중고판매를 하고자 하는 경우 적합성평가를 받아야 하는지 여부에 대한 관련 규정 및 해석을 공유&lt;br /&gt;
&lt;br /&gt;
□ 근 거&lt;br /&gt;
&lt;br /&gt;
ㅇ 「전파법」 제58조의2(방송통신기자재등의 적합성평가)&lt;br /&gt;
ㅇ 「전파법 시행령」 제77조의7(적합성평가의 면제) [별표 6의2]&lt;br /&gt;
&lt;br /&gt;
□ 내 용&lt;br /&gt;
&lt;br /&gt;
 o 「전파법」 제58조의2에 따라 방송통신기자재와 전자파장해를 주거나 전자파로부터 영향을 받는 기자재를 제조 또는 판매하거나 수입하려는 자는 적합성평가를 받아야 하나,&lt;br /&gt;
&lt;br /&gt;
  - 「전파법 시행령」 [별표 6의2] 제1호 자목에 따라 판매를 목적으로 하지 않고 개인이 사용하기 위해 반입하는 기자재 1대에 한하여 적합성평가를 면제하고 있음&lt;br /&gt;
&lt;br /&gt;
 o 상기 면제조건에 따라 판매목적이 아닌 개인이 사용하기 위해 해외직구로 구입하여 사용 중인 제품을 온라인 사이트 등에 판매하려는 경우에는 적합성평가 면제요건에 부합하지 아니하므로, 「전파법」 제58조의2에 따라 적합성평가를 받아야 함&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;</description>
      <category>전자파 적합성</category>
      <author>Postpop</author>
      <guid isPermaLink="true">https://postpop.tistory.com/159</guid>
      <comments>https://postpop.tistory.com/159#entry159comment</comments>
      <pubDate>Tue, 10 Aug 2021 09:34:43 +0900</pubDate>
    </item>
  </channel>
</rss>