본문 바로가기

ESP32

ESP32 4개의 센서 모니터링, 18개의 릴레이(12개 릴레이 + 예약된 릴레이 6개) 제어

반응형

 

안녕하세요 여러분, 이전 영상에 이어 이번 영상에서는 4개의 센서가 추가되어 12개의 릴레이 온/오프 제어와 6개의 릴레이를 예약 제어하는 것 외에 4개의 센서 모니터링도 추가되어 아두이노 IoT 클라우드의 무료 플랜 기능을 이용하고 시뮬레이션 웍위도 사용해보았습니다, 도움이 되었기를 바라며 많은 관심 부탁드리겠습니다. 댓글란에 동영상 링크가 있습니다. 

 

유튜브 영상

 

무료 요금제는 5개의 클라우드 변수만 제공하지만, 이를 사용하여 18개의 릴레이(12개 릴레이 + 예약된 릴레이 6개)를 제어하고 4개의 센서를 모니터링할 수 있습니다. 단계는 다음과 같습니다:

 

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

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

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

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

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

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

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

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

9. 센서 값을 변경하고 메신저 위젯 디스플레이를 관찰합니다. 또한 스케줄러 위젯, 값 선택기 위젯 및 푸시 버튼 위젯을 통해 6개의 릴레이(R1-R6)를 예약합니다. 또한 값 선택기 위젯(select_2)으로 12개의 릴레이(A-L)를 제어할 수 있습니다.

자세한 내용은 이 블로그를 참조하세요:

블로그 내용중 제목은 6. Kontrol 18 Relay dan Monitor 4 Sensor 

https://bermainwokwi.blogspot.com/p/koneksi-dengan-arduino-iot-cloud.html#enam

 

 

 

 

 

회로도

 

 

 

라이브러리 

  • ArduinoIoTCloud
  • Arduino_ConnectionHandler
  • Adafruit GFX Library
  • Adafruit SSD1306 

 

코드

 

// 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[]  = "xxxxxxxxxxxxxxxx06-4d9b01c6a785";
const char SSID[]               = "Wokwi-GUEST";
const char PASS[]               = "";
const char DEVICE_KEY[]         = "xxxxxxxxxxxxxxxl18GNT@e";
void onSelect1Change();
void onSelect2Change();
void onScheduleChange();
void onSetChange();
void onTeksChange();
time_t UnixTime;
unsigned long skr = 0;
String teks;
String waktu;
int select_1;
int select_2;
bool set;
CloudSchedule schedule;
int ok = 0, ldr1 = 0, ntc1 = 0, pot1 = 0, sld1 = 0;
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(set, READWRITE, ON_CHANGE, onSetChange);
  ArduinoCloud.addProperty(teks, READWRITE, ON_CHANGE, onTeksChange);
}
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();
  int ntc = analogRead(35);
  float cels = 1 / (log(1 / (4095. / ntc - 1)) / 3950 + 1.0 / 298.15) - 273.15;
  int ldr = analogRead(34);
  float voltage = ldr / 4095. * 5;
  float resistance = 2000 * voltage / (1 - voltage / 5);
  float lux = pow(50 * 1e3 * pow(10, 0.7) / resistance, (1 / 0.7));
  int pot = analogRead(39);
  int sld = analogRead(36);
  if (ntc != ntc1) {
    teks = "cels:" + String(cels);
    ntc1 = ntc;
  }
  if (ldr != ldr1) {
    teks = "ldr:" + String(lux);
    ldr1 = ldr;
  }
  if (pot != pot1) {
    teks = "pot:" + String(pot);
    pot1 = pot;
  }
  if (sld != sld1) {
    teks = "sld:" + String(sld);
    sld1 = sld;
  }
  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();
  for (int i = 0; i < 12; i++) {
    if (select_2 == i && ok != i) {
      digitalWrite(pin_onoff[i], !digitalRead(pin_onoff[i]));
      rly_onoff[i] = !rly_onoff[i];
      ok = i;
    }
  }
  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 onTeksChange()  {
}

 

 

 

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^