본문 바로가기

ESP32

ESP32 Wokwi 시뮬레이션 및 Arduino IoT Cloud 기반 릴레이 제어

반응형

 

무료 플랜으로 Arduino IoT Control에서 더 많은 제어 장치(12개의 릴레이 및 6개의 예약된 릴레이)를 생성하는 방법은 무엇인가요? 

 

무료 요금제 기능에서는 5개의 클라우드 변수만 제공하지만, 더 많은 제어 기능을 만들 수 있습니다. 다음은 무료 요금제 기능을 사용하여 18개의 릴레이에 대한 제어를 생성하는 방법이며, 이 중 6개 릴레이가 예약에 따라 제어됩니다. 단계는 다음과 같습니다:

 

1. 이 wokwi 프로젝트를 엽니다: https://wokwi.com/projects/3970226172....

 

2. https://cloud.arduino.cc 을 엽니다.

 

3. 아두이노 계정을 생성한 다음 로그인합니다.

 

4. 각각 부울 데이터 유형 2개, 정수 2개, CloudSchedule이라는 이름을 가진 5개의 클라우드 변수가 있는 Thing을 생성합니다: "control", "set", "select_1", "select_2", "schedule", 읽기 및 쓰기(권한) 및 변경 시(업데이트)로 각각 명명합니다.

 

5. 장치에 연결하고 장치를 선택합니다: ESP32 개발 모듈을 선택하고 장치의 ID와 비밀 키가 포함된 PDF 파일을 저장하는 것을 잊지 마세요.

 

6. 스위치 위젯, 푸시 버튼 위젯, 값 선택기 위젯 2개 및 스케줄러 위젯으로 구성된 5개의 클라우드 변수에 연결된 5개의 위젯이 연속적으로 포함된 대시보드를 생성합니다.

 

7. Wokwi 프로그램을 열고 ID와 비밀 키를 새 장치의 ID와 비밀 키(다운로드한 PDF 파일에서 찾을 수 있음)로 바꿉니다.

 

8. 보기 버튼(눈 이미지)을 클릭하여 Wokwi 프로그램과 Arduino IoT 클라우드 대시보드를 실행합니다. Wokwi 시리얼 모니터에 "Arduino IoT Cloud에 연결됨"이라는 문구가 표시될 때까지 기다립니다. 자세한 내용은 이 블로그를 참조하세요. 

 

 

강의 영상

 

 

 

 

 

 

 

아두이노 스케치 코드

 

// Code generated by Arduino IoT Cloud
#include <ArduinoIoTCloud.h>
#include <Arduino_ConnectionHandler.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(128, 64, &Wire, -1);
const char DEVICE_LOGIN_NAME[]  = "xxxxxxxxxxxx-eaca6194a74f";
const char SSID[]               = "Wokwi-GUEST";
const char PASS[]               = "";
const char DEVICE_KEY[]         = "xxxxxxxxxxxxxxxxxRJXD9l0gs";
void onSelect1Change();
void onSelect2Change();
void onScheduleChange();
void onControlChange();
void onSetChange();
time_t UnixTime;
unsigned long skr = 0;
String waktu;
int select_1;
int select_2;
CloudSchedule schedule;
bool control;
bool set;
bool rly_sched[6] = {false, false, false, false, false, false};
bool rly_onoff[12];
char rly_name[13] = {"ABCDEFGHIJKL"};
CloudSchedule R1, R2, R3, R4, R5, R6;
int count[6] = {0, 0, 0, 0, 0, 0};
int pin_sched[6] = {23, 19, 18, 5, 17, 16};
int pin_onoff[12] = {32, 33, 25, 26, 27, 14, 12, 13, 15, 2, 0, 4};
void initProperties() {
  ArduinoCloud.setBoardId(DEVICE_LOGIN_NAME);
  ArduinoCloud.setSecretDeviceKey(DEVICE_KEY);
  ArduinoCloud.addProperty(select_1, READWRITE, ON_CHANGE, onSelect1Change);
  ArduinoCloud.addProperty(select_2, READWRITE, ON_CHANGE, onSelect2Change);
  ArduinoCloud.addProperty(schedule, READWRITE, ON_CHANGE, onScheduleChange);
  ArduinoCloud.addProperty(control, READWRITE, ON_CHANGE, onControlChange);
  ArduinoCloud.addProperty(set, READWRITE, ON_CHANGE, onSetChange);
}
WiFiConnectionHandler ArduinoIoTPreferredConnection(SSID, PASS);
void setup() {
  Serial.begin(9600);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    for (;;);
  }
  delay(1500);
  initProperties();
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
  for (int i = 0; i < 6; i++) {
    pinMode(pin_sched[i], OUTPUT);
  }
  for (int i = 0; i < 12; i++) {
    pinMode(pin_onoff[i], OUTPUT);
  }
}
void loop() {
  ArduinoCloud.update();
  if (set) {
    if (select_1 == 0) R1 = schedule;
    if (select_1 == 1) R2 = schedule;
    if (select_1 == 2) R3 = schedule;
    if (select_1 == 3) R4 = schedule;
    if (select_1 == 4) R5 = schedule;
    if (select_1 == 5) R6 = schedule;
  }
  rly_sched[0] = R1.isActive();
  rly_sched[1] = R2.isActive();
  rly_sched[2] = R3.isActive();
  rly_sched[3] = R4.isActive();
  rly_sched[4] = R5.isActive();
  rly_sched[5] = R6.isActive();
  if (control) {
    for (int i = 0; i < 12; i++) {
      if (select_2 == i) {
        digitalWrite(pin_onoff[i], HIGH);
        rly_onoff[i] = true;
      }
    }
  } else {
    for (int i = 0; i < 12; i++) {
      if (select_2 == i) {
        digitalWrite(pin_onoff[i], LOW);
        rly_onoff[i] = false;
      }
    }
  }
  if (millis() - skr > 1000) {
    UnixTime = ArduinoCloud.getLocalTime();
    waktu = ctime(&UnixTime);
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 0);
    display.print(waktu.substring(0, 11));
    display.print(waktu.substring(20));
    display.print("       ");
    display.println(waktu.substring(11, 19));
    for (int i = 0; i < 6; i++) {
      display.print("R");
      display.print(i + 1);
      display.print(":");
      if (rly_sched[i]) {
        digitalWrite(pin_sched[i], true);
        display.print("ON.");
        if (count[i] < 10) display.print(".");
        if (count[i] < 100) display.print(".");
        if (count[i] < 1000) display.print(".");
        display.print(count[i]);
        count[i]++;
      } else {
        digitalWrite(pin_sched[i], false);
        count[i] = 0;
        display.print("OFF....");
      }
      if ((i + 1) % 2 == 0) display.println();
    }
    for (int i = 0; i < 12; i++) {
      display.print(rly_name[i]);
      if (rly_onoff[i]) display.print(":1, ");
      else display.print(":0, ");
      if ((i + 1) % 4 == 0) display.println();
    }
    display.display();
    skr = millis();
  }
}
void onSetChange()  {
}
void onScheduleChange()  {
}
void onSelect1Change()  {
}
void onSelect2Change()  {
}
void onControlChange()  {
}

 

diagram.json

 

{
  "version": 1,
  "author": "dian artanto",
  "editor": "wokwi",
  "parts": [
    { "type": "board-esp32-devkit-c-v4", "id": "esp", "top": 67.2, "left": -129.56, "attrs": {} },
    { "type": "wokwi-relay-module", "id": "relay1", "top": 19.4, "left": 172.8, "attrs": {} },
    { "type": "wokwi-relay-module", "id": "relay2", "top": 77, "left": 172.8, "attrs": {} },
    { "type": "wokwi-relay-module", "id": "relay3", "top": 134.6, "left": 172.8, "attrs": {} },
    { "type": "wokwi-relay-module", "id": "relay4", "top": 192.2, "left": 172.8, "attrs": {} },
    {
      "type": "board-ssd1306",
      "id": "oled1",
      "top": 70.34,
      "left": 9.83,
      "attrs": { "i2cAddress": "0x3c" }
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay5",
      "top": 332.6,
      "left": 60.4,
      "rotate": 90,
      "attrs": {}
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay6",
      "top": 18.6,
      "left": -339.2,
      "rotate": 180,
      "attrs": {}
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay7",
      "top": 76.2,
      "left": -339.2,
      "rotate": 180,
      "attrs": {}
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay8",
      "top": 133.8,
      "left": -339.2,
      "rotate": 180,
      "attrs": {}
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay9",
      "top": 191.4,
      "left": -339.2,
      "rotate": 180,
      "attrs": {}
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay10",
      "top": 249,
      "left": -339.2,
      "rotate": 180,
      "attrs": {}
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay11",
      "top": 306.6,
      "left": -339.2,
      "rotate": 180,
      "attrs": {}
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay12",
      "top": 332.6,
      "left": -227.6,
      "rotate": 90,
      "attrs": {}
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay13",
      "top": 332.6,
      "left": -170,
      "rotate": 90,
      "attrs": {}
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay14",
      "top": 332.6,
      "left": -112.4,
      "rotate": 90,
      "attrs": {}
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay15",
      "top": 332.6,
      "left": -54.8,
      "rotate": 90,
      "attrs": {}
    },
    {
      "type": "wokwi-relay-module",
      "id": "relay16",
      "top": 332.6,
      "left": 2.8,
      "rotate": 90,
      "attrs": {}
    },
    {
      "type": "wokwi-text",
      "id": "led1",
      "top": 38.4,
      "left": 307.2,
      "attrs": { "text": "R1:Scheduled" }
    },
    {
      "type": "wokwi-text",
      "id": "led2",
      "top": 96,
      "left": 307.2,
      "attrs": { "text": "R2:Scheduled" }
    },
    {
      "type": "wokwi-text",
      "id": "led3",
      "top": 153.6,
      "left": 307.2,
      "attrs": { "text": "R3:Scheduled" }
    },
    {
      "type": "wokwi-text",
      "id": "led4",
      "top": 211.2,
      "left": 307.2,
      "attrs": { "text": "R4:Scheduled" }
    },
    {
      "type": "wokwi-text",
      "id": "led5",
      "top": 28.8,
      "left": -412.8,
      "attrs": { "text": "A:On/Off" }
    },
    {
      "type": "wokwi-text",
      "id": "led6",
      "top": 86.4,
      "left": -412.8,
      "attrs": { "text": "B:On/Off" }
    },
    {
      "type": "wokwi-text",
      "id": "led7",
      "top": 144,
      "left": -412.8,
      "attrs": { "text": "C:On/Off" }
    },
    {
      "type": "wokwi-text",
      "id": "led8",
      "top": 201.6,
      "left": -412.8,
      "attrs": { "text": "D:On/Off" }
    },
    {
      "type": "wokwi-text",
      "id": "led9",
      "top": 259.2,
      "left": -412.8,
      "attrs": { "text": "E:On/Off" }
    },
    {
      "type": "wokwi-text",
      "id": "led10",
      "top": 316.8,
      "left": -412.8,
      "attrs": { "text": "F:On/Off" }
    },
    {
      "type": "wokwi-text",
      "id": "led11",
      "top": 451.2,
      "left": -211.2,
      "rotate": 300,
      "attrs": { "text": "G:On/Off" }
    },
    {
      "type": "wokwi-text",
      "id": "led12",
      "top": 451.2,
      "left": -153.6,
      "rotate": 300,
      "attrs": { "text": "H:On/Off" }
    },
    {
      "type": "wokwi-text",
      "id": "led13",
      "top": 451.2,
      "left": -86.4,
      "rotate": 300,
      "attrs": { "text": "I:On/Off" }
    },
    {
      "type": "wokwi-text",
      "id": "led14",
      "top": 451.2,
      "left": -38.4,
      "rotate": 300,
      "attrs": { "text": "J:On/Off" }
    },
    {
      "type": "wokwi-text",
      "id": "led15",
      "top": 451.2,
      "left": 19.2,
      "rotate": 300,
      "attrs": { "text": "K:On/Off" }
    },
    {
      "type": "wokwi-text",
      "id": "led16",
      "top": 451.2,
      "left": 76.8,
      "rotate": 300,
      "attrs": { "text": "L:On/Off" }
    },
    { "type": "wokwi-relay-module", "id": "relay17", "top": 249.8, "left": 172.8, "attrs": {} },
    { "type": "wokwi-relay-module", "id": "relay18", "top": 307.4, "left": 172.8, "attrs": {} },
    {
      "type": "wokwi-text",
      "id": "led17",
      "top": 268.8,
      "left": 307.2,
      "attrs": { "text": "R5:Scheduled" }
    },
    {
      "type": "wokwi-text",
      "id": "led18",
      "top": 326.4,
      "left": 307.2,
      "attrs": { "text": "R6:Scheduled" }
    }
  ],
  "connections": [
    [ "esp:TX", "$serialMonitor:RX", "", [] ],
    [ "esp:RX", "$serialMonitor:TX", "", [] ],
    [ "esp:19", "relay2:IN", "green", [ "h192", "v-47.8" ] ],
    [ "esp:18", "relay3:IN", "green", [ "h144", "v29" ] ],
    [ "esp:5", "relay4:IN", "green", [ "h192", "v48", "h9.6" ] ],
    [ "esp:21", "oled1:SDA", "green", [ "h28.8", "v-76.8", "h76.73" ] ],
    [ "esp:22", "oled1:SCL", "green", [ "h19.2", "v-57.6", "h76.5" ] ],
    [ "esp:23", "relay1:IN", "green", [ "h9.6", "v-57.6", "h134.4", "v9.8" ] ],
    [ "relay6:IN", "esp:32", "green", [ "h76.8", "v115.4" ] ],
    [ "relay7:IN", "esp:33", "green", [ "h48", "v67.4" ] ],
    [ "relay8:IN", "esp:25", "green", [ "h38.4", "v19.4" ] ],
    [ "relay9:IN", "esp:26", "green", [ "v-28.6", "h86.25" ] ],
    [ "relay10:IN", "esp:27", "green", [ "h9.6", "v-76.6" ] ],
    [ "esp:14", "relay11:IN", "green", [ "h-67.05", "v105.6", "h-19.2" ] ],
    [ "esp:12", "relay12:IN", "green", [ "h-47.85", "v105.6" ] ],
    [ "esp:13", "relay13:IN", "green", [ "h-9.45", "v57.6", "h19" ] ],
    [ "relay14:IN", "esp:15", "green", [ "v-28.8", "h38.6", "v-48" ] ],
    [ "esp:17", "relay17:IN", "green", [ "h182.4", "v96.2" ] ],
    [ "relay18:IN", "esp:16", "green", [ "h-9.6", "v-48.2", "h-19.2", "v-96" ] ],
    [ "esp:4", "relay5:IN", "green", [ "h0" ] ],
    [ "esp:2", "relay15:IN", "green", [ "h0" ] ],
    [ "esp:0", "relay16:IN", "green", [ "h0" ] ]
  ],
  "dependencies": {}
}

 

 

libraries.txt

 

# Wokwi Library List
# See https://docs.wokwi.com/guides/libraries

ArduinoIoTCloud
Arduino_ConnectionHandler
Adafruit GFX Library
Adafruit SSD1306

 

 

 

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

귀사가 성공하기까지의 긴 고난의 시간을 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩