본문 바로가기

아두이노우노 R4

아두이노 우노 R4 WiFi 홈 오토메이션.

반응형

 

이 프로젝트는 로컬 웹 서버를 설정하여 아두이노 Uno R4 WiFi 보드로 집 안의 사물을 제어하는 방법을 보여줍니다. 

 

소개.

 

이 기사에서는 매우 유용하고 매우 쉬운 홈 오토메이션 프로젝트를 만들 것입니다.

 

 

 

 

그리고이 홈 오토메이션 시스템을 만들기 위해 우리는 어떤 종류의 -블링크, ESP-Rainmeker, Arduino IOT 클라우드- 인터넷 및 IOT 플랫폼도 필요하지 않습니다

 

로컬 서버를 만들기위한 라우터 또는 핫스팟 만 필요합니다.

 

 

 

여기서 라우터는 웹 페이지와 Arduino UNO R4 WIFI 보드 사이의 다리 역할을합니다. Arduino는 며칠 전 Arduino UNO R3 보드의 후속 제품인 Arduino UNO R4를 출시했으며 두 가지 변형이 있으며 하나는 Arduino UNO R4 Minima이고 두 번째 변형은 Arduino UNO R4 WIFI입니다.

 

 

 

이 아두이노 UNO R4 와이파이에는 ESP32 칩셋이 내장되어 있어 와이파이와 블루투스 연결이 가능합니다.

 

 

그리고 이 새로운 아두이노 UNO R4 보드는 아두이노 UNO R3 보드와 동일한 폼팩터를 가지고 있으며 핀아웃은 R3 보드와 정확히 동일합니다.

 

 

동일한 폼팩터와 핀아웃을 가지고 있으므로 이제이 새로운 R4 보드로 아두이노 UNO R3의 모든 쉴드 또는 모듈을 쉽게 사용할 수 있습니다. 작년에 저는 초보자를위한 학습용 PCB를 설계했는데 이는 일종의 Arduino UNO R3 shield입니다. 아두이노 UNO R3 보드에 쉴드를 장착하고 멋진 홈 자동화 프로젝트를 쉽게 만들 수 있습니다....그것은 일종의 플러그 앤 플레이입니다.

 

 

https://hackaday.io/project/192701-arduino-uno-r4-wifi-home-automation/details

 

 

이 프로젝트는 새로 출시된 아두이노 Uno R4 WiFi 보드와 맞춤형 설계된 아두이노 쉴드 보드의 기능을 활용하여 로컬 웹 서버를 통해 2개의 릴레이를 제어합니다. 우리는 로컬 웹 서버를 만들고 그 로컬 서버에서 가전제품을 제어할 수 있게 될 것입니다. 이 프로젝트의 복잡한 과정을 자세히 살펴보겠습니다. 

 

 

 

아두이노 UNO R4 WiFi 보드:

 

아두이노 UNO R4 WiFi 보드는 르네사스의 32비트 마이크로컨트롤러 RA4M1과 ESP32 모듈의 기능을 결합하여 Wi-Fi 및 블루투스 연결을 모두 지원하는 다양하고 강력한 개발 툴입니다.

 

 

주요 기능

 

마이크로컨트롤러(MCU): 이 보드에는 48MHz의 클록 속도로 작동하는 고성능 Renesas RA4M1, Arm Cortex-M4 마이크로컨트롤러가 탑재되어 있습니다. 32kB의 SRAM과 256kB의 플래시 메모리가 장착되어 있습니다. 이 MCU는 USB를 통해 HID를 지원하며 실시간 클록(RTC), 디지털-아날로그 컨버터(DAC) 및 CAN 버스를 갖추고 있습니다.

 

연결 모듈: 보드의 ESP32-S3 모듈은 Wi-Fi 및 블루투스 연결을 가능하게 합니다. 이 모듈은 특정 헤더를 통해 개별적으로 프로그래밍할 수 있습니다.

 

작동 전압: RA4M1과 보드의 GPIO는 5V에서 작동하고, ESP32-S3 모듈은 3.3V에서 작동합니다.

 

LED 매트릭스: 독특한 12x8 LED 매트릭스를 통해 사용자는 보드에서 직접 비주얼 프로토타입을 제작할 수 있어 프로젝트 설계의 창의성을 키울 수 있습니다.

 

Qwiic 커넥터: 이 기능은 플러그 앤 플레이 스타일의 프로젝트 생성을 용이하게 하여 개발자의 사용 편의성을 향상시킵니다.

 

호환성 및 리소스: 아두이노 UNO R4 WiFi 보드는 4 릴레이 쉴드, 모터 쉴드 Rev3, 이더넷 쉴드 Rev2 및 9축 모션 쉴드와 같은 쉴드를 포함한 다양한 하드웨어와 호환됩니다. 아두이노 IDE, 아두이노 CLI, 웹 에디터를 통한 프로그래밍을 지원합니다. 또한 사용자가 기능을 효과적으로 설정하고 활용하는 데 도움이 되는 다양한 튜토리얼과 가이드를 제공합니다. 

 

이 홈 자동화 프로젝트의 코드는 맨 아래에 있습니다. 이 프로젝트의 작동 방식을 이해하기 위해 코드를 단계별로 분석해 보겠습니다: 라이브러리 포함 

 

https://github.com/technolabelectronics/Arduino-Uno-R4-WiFi-Home-Automation-A-DIY-Local-Web-Server-Tutorial

 

 

코드의 시작 부분에는 LED 매트릭스를 제어하는 라이브러리와 WiFi 연결을 처리하는 라이브러리가 포함되어 있습니다.

 

변수 정의 

 

 

여기서 몇 가지 변수를 정의합니다.

  • LED1과 LED2는 LED에 연결된 핀입니다.
  • matrix는 LED 매트릭스를 제어하는 객체입니다.
  • hi[]는 LED 매트릭스에 표시할 데이터를 저장하는 배열입니다.
  • ssid와 pass는 WiFi 네트워크 자격 증명을 저장합니다.
  • output1과 output2는 LED의 현재 상태를 저장합니다.
  • header는 HTTP 요청 헤더를 저장합니다.
  • currentTime과 previousTime은 루프에서 시간을 관리하는 데 도움이 됩니다.
  • timeoutTime은 클라이언트가 연결될 때까지 기다리는 최대 시간입니다.
  • status는 현재 WiFi 연결 상태를 저장합니다.
  • server는 WiFi 서버를 생성하는 객체입니다. 

 

설정 기능 

 

 

설정 기능에서는 직렬 통신을 초기화하고, LED 매트릭스를 시작하고, LED 핀을 출력으로 설정합니다. 또한 WiFi 연결을 시작하고 서버를 시작합니다.

 

루프 기능 

 

 

루프 함수는 웹서버()와 LED매트릭스()라는 두 가지 다른 함수를 연속적으로 실행합니다.

 

LED 매트릭스 함수 

 

 

LEDMatrix 함수는 hi[] 배열에 저장된 데이터를 사용하여 LED 매트릭스에 프레임을 표시합니다.

 

웹 서버 기능 

 

 

웹서버 함수는 들어오는 클라이언트 연결을 처리합니다. HTTP 요청을 읽고 그에 따라 LED를 제어합니다. 또한 사용자가 웹 인터페이스를 통해 LED를 제어할 수 있는 HTML 페이지도 제공합니다.

 

WiFi 상태 인쇄 기능 

 

 

printWifiStatus 함수는 SSID, IP 주소 및 신호 강도를 포함한 현재 WiFi 연결 세부 정보를 직렬 모니터에 인쇄합니다. 또한 웹 인터페이스에 액세스하기 위한 URL도 표시합니다. 이 코드를 아두이노 UNO R4 보드에 업로드합니다.

 

연결 다이어그램

 

 

이제 이 연결 다이어그램에 따라 전구 또는 제어하려는 장치를 연결합니다. 

아두이노 쉴드가 없고 릴레이를 사용하려는 경우 이 연결 다이어그램을 사용하여 연결하세요. 

 

 

 

*참고: 위 이미지에 나오는 2-Channel 릴레이 모듈 회로도와 구성, 테스트 코드에 대한 자료 있는 곳 링크. 이것은 아두이노 릴레이 제어 쉴드 PCB 설계하고 제작할 때 필요하다. 그 유명한 썬파운더 사이트.

 

 

이제 모든 준비가 완료되었으니 집이나 사무실 어디에서든 이 프로젝트를 설치하세요. 

 

 

이 프로젝트는 홈 오토메이션에서 Arduino Uno R4 WiFi 보드의 엄청난 잠재력을 보여줍니다. 로컬 웹 서버를 생성함으로써 사용자는 장치를 원격으로 쉽게 제어할 수 있습니다. NEXTPCB가 제공하는 서비스와 결합하면 이러한 프로젝트를 실현하는 것이 그 어느 때보다 쉬워집니다. Arduino Uno R4 WiFi 보드와 NEXTPCB로 혁신의 여정을 시작하고 홈 오토메이션의 미래로 나아가세요. 

 

비디오 튜토리얼 

 

 

#include "Arduino_LED_Matrix.h"
#include "WiFiS3.h"

#define LED1 7
#define LED2 8

ArduinoLEDMatrix matrix;

const uint32_t hi[] = {
  0xcdfcdfcc,
  0x4fc4fc4c,
  0xc4cdfcdf,
  66
};

char ssid[] = "technolab"; //Enter your WIFI SSID
char pass[] = "helloworld";   //Enter your WIFI password
int keyIndex = 0;      // your network key index number (needed only for WEP)

String output1 = "off";
String output2 = "off";
String header;

unsigned long currentTime = millis();
unsigned long previousTime = 0;
const long timeoutTime = 2000;

int status = WL_IDLE_STATUS;
WiFiServer server(80);

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

  // set the LED pins to OUTPUT
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  
  // Turn off LEDs initially
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);

  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  while (status != WL_CONNECTED) {
    Serial.print("Network named: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);
    delay(10000);
  }
  server.begin();
  printWifiStatus();
}

void loop() {
  webServer();
  LEDMatrix();
}

void LEDMatrix() {
  matrix.loadFrame(hi);
}

void webServer() {
  WiFiClient client = server.available();
  if (client) {
    Serial.println("New Client.");
    String currentLine = "";
    currentTime = millis();
    previousTime = currentTime;
    while (client.connected() && currentTime - previousTime <= timeoutTime) {
      currentTime = millis();
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        header += c;
        if (c == '\n') {
          if (currentLine.length() == 0) {
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();

            if (header.indexOf("GET /ledon1") >= 0) {
              output1 = "on";
              digitalWrite(LED1, HIGH);
            } else if (header.indexOf("GET /ledoff1") >= 0) {
              output1 = "off";
              digitalWrite(LED1, LOW);
            }
            if (header.indexOf("GET /ledon2") >= 0) {
              output2 = "on";
              digitalWrite(LED2, HIGH);
            } else if (header.indexOf("GET /ledoff2") >= 0) {
              output2 = "off";
              digitalWrite(LED2, LOW);
            }

            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".on { background-color: #FF0000; border: 5px; color: white; padding: 16px 40px; border-radius: 20px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".off {background-color: #000000;border: 5px; color: white; padding: 16px 40px; border-radius: 20px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}</style></head>");

            client.println("<body><h1>technolab electronics</h1>");

            client.println("<p>LED1 " + output1 + "</p>");
            if (output1 == "off") {
              client.println("<p><a href=\"/ledon1\"><button class=\"off\">Turn ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/ledoff1\"><button class=\"on\">Turn OFF</button></a></p>");
            }
            
            client.println("<p>LED2 " + output2 + "</p>");
            if (output2 == "off") {
              client.println("<p><a href=\"/ledon2\"><button class=\"off\">Turn ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/ledoff2\"><button class=\"on\">Turn OFF</button></a></p>");
            }

            client.println("</body></html>");

            client.println();
            break;
          } else {
            currentLine = "";
          }
        } else if (c != '\r') {
          currentLine += c;
        }
      }
    }
    header = "";
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
}

void printWifiStatus() {
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");

  Serial.print("Now open this URL on your browser --> http://");
  Serial.println(ip);
}

 

 

 

반응형

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