ESP32

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

지구빵집 2024. 5. 6. 17:57
반응형

 

무료 플랜으로 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

 

 

 

 

 

반응형