아두이노를 사용한 프로젝트에서 최근 Wifi를 이용하는 경우가 많아지고 있다.
각종 졸업작품이나 과제, 제작대회에서 IoT 제품을 출품하기 때문이다.
IoT 제품을 개발함에 있어서 기존에는 아두이노에 wifi 모듈을 구매하여 추가해주었다면,
최근에는 통합형 보드로 쉽게 개발하는 추세이다.
ESP8266 과 ESP32 무선통신 모듈을 이용하는데, 그 중 대중적인 ESP8266을 사용하는 보드 중 가장 작은 사이즈를 자랑하는 Wemos D1 mini 에 대해서 다뤄보고자 한다.
글 쓰고 있는 시점 2022-05-26 의 Wemos D1 mini 최신버전은 아래와 같다.
USB가 C 타입으로 나오고
리셋 버튼이 존재하며
I2C 커넥터가 별도로 존재한다.
위의 버전이 4.0.0 이다.
아래 버전들도 핀맵은 같고 커넥터와 리셋버튼의 유무에서 차이가 존재할 것이다.
구버전의 경우 아래와 같이 생겼다.
핀 배치는 같기 때문에 다 호환된다고 볼 수 있다.
핀맵을 살펴보면 아래와 같다.
최신 버전의 D1 mini는 GPIO핀으로만 나와있고,
예전 버전의 경우 GPIO가 적힌 경우 또는 Digital Pin 번호가 적힌 경우가 있다.
그래서 사용자들이 혼란을 겪곤 한다.
초보자 분들은 분명 5번핀으로 led 제어하려 했는데 led 불이 안 들어온다던가 하는 이유가 다 위의 GPIO 와 Digital pin 을 헷갈려서 코드를 짰기 때문이다.
제일 쉬운 방법은 보드에 적혀있는 핀 번호를 적으면 되는 것이다.
실제 사용 사진을 보면
뒷면에 핀번호가 적혀있다.
최신 D1 mini 의 경우 GPIO 가 적혀있다고 했었는데, 위처럼 그냥 숫자만 적혀있다.
숫자만 있는 경우 GPIO 번호인 것으로, 아두이노 코드에서 아두이노 우노에서 코딩하는 것 처럼 그냥 GPIO 번호를 적으면 된다.
예를 들면, 지금 5번핀으로 LED를 제어하고 싶은 경우
pinMode(5, OUTPUT);
digitalWrite(5, HIGH);
이렇게 사용하면 된다는 뜻이다.
구버전인 경우에는 어떻게 해야하나면
GPIO 5번이 D1과 같은 자리이기 때문에 D1을 사용하면 된다.
(물론 gpio는 5번이기 때문에 5라고 사용해도 된다.)
pinMode(D1, OUTPUT);
digitalWrite(D1, HIGH);
앞서 두가지 코드 모두 동일한 코드라고 보면 된다.
다만 개발에 있어 헷갈리지 말고, 그냥 보드에 적혀있는 숫자를 입력하면 된다는 것을 말하고 싶었다.
주의해야 할 점은 D1 핀인데, 코드에서 D1 이 아닌 1로 적으면 문제가 된다는 것이다.
이제 상세 스펙을 알아보자.
공식홈페이지에서 소개하는 D1 mini 내용이다.
일단 4MB 플래시 메모리를 갖고 있고, ESP-8266EX 기반의 wifi 보드이다.
아두이노 우노와 메가에 비해서 플래시 메모리가 엄청 큰 것을 확인할 수 있다.
플래시 메모리는 스케치 코드를 저장하는 공간으로 보면 되는데, wifi 보드는 wifi 기반의 라이브러리들의 용량이 꽤 크기 때문에 4MB 를 사용자 코드로 온전히 사용할 수는 없다는 점을 알아야 한다.
일반적인 상황에서는 코드가 길다고해서 업로드가 안 되지는 않을 것이니 크게 걱정할 필요 없다.
D1 mini 는 11개의 디지털 입출력 핀이 있고,
인터럽트, PWM, I2C, 1-wire 통신을 지원한다.
그리고 제일 중요한 내용인데 아날로그 인풋이 1개 밖에 없다는 것이다.
여기서도 제일 중요한 것은 3.2V 가 MAX input 이라는 것이다.
D1 mini는 3.3V 기반의 보드이기 때문에 5V 시스템을 사용함에 있어서 주의해야 할 점이 많다.
D1 mini 핀 중 5V input 빼고는 나머지 핀에 5V가 입력되면 보드가 망가질 수 있다.
따라서 모든 센서에는 3.3V를 입력해주고 센서 value 가 3.3V 를 넘지 않게 주의해야 한다.
센서가 어쩔 수 없이 5V 만을 입력해줘야 한다면, 저항등을 통해서 전압을 낮춰줘야 한다.
(전압 분배 법칙을 이용하면 된다.)
그리고 아날로그 인풋이 하나밖에 없기 때문에 자신의 프로젝트에 아날로그 센서를 얼마나 사용하는지도 따져봐야 한다.
아날로그 센서를 많이 사용하는 경우 별도의 ADC 모듈을 구매해서 사용해야 하며,
아니면 LM393 을 이용한 전압비교기 회로를 통해 일정 전압값 이상이면 HIGH로 감지해서 사용하면 된다.
아날로그를 많이 써야한다면 편하게 아두이노 메가에 esp8266 모듈을 추가한 보드를 사용하면 된다.
좀 더 자세한 핀정보는 아래 표를 참고하면 된다.
전문가들은 위의 표만 보면 다 알아 들으니, 초보자 분들을 위해 약간만 설명하자면,
아두이노 우노의 내장 LED는 13번 핀인 반면 D1 mini는 D4 핀이다.
그리고 pull-up 회로가 되어 있기 때문에 HIGH를 주면 BUILTIN_LED에는 LOW가 걸리게 되어 LED 불이 꺼지게 된다.
pull-up 회로에는 신호가 반대로 되기 때문에 주의해서 사용해야 한다는 것을 말해주고 싶었다.
아두이노 우노에서 사용하는 것처럼 사용하면 안 된다는 것이다.
더 자세한 정보를 찾아보고 싶으시다면 아래 공식 홈페이지에서 찾아보면 되겠다.
근데 이미 대부분 내용이 여기에 다 담겨서 넘어가도 자세히 볼 건 없을 것이다.
https://www.wemos.cc/en/latest/d1/d1_mini.html
D1 mini 를 사용하는 방법도 소개해 보겠다.
일단 아두이노IDE(프로그램) 세팅을 해주어야 한다.
아두이노IDE 환경설정에서
추가적인 보드 맨니저 URL 을 추가해주어야 한다.
http://arduino.esp8266.com/stable/package_esp8266com_index.json
위의 주소를 추가하면 된다.
그리고 툴>보드>보드매니저 에 들어가서
위의 최신 버전을 설치해주면 된다.
툴에서 WEMOS D1 mini Lite 를 찾아서 선택해주면 된다.
코드는 아래 코드를 사용하면 된다.
#include <ESP8266WiFi.h>
const char* ssid = " "; // 사용 중 인 와이파이 이름
const char* password = " "; // 와이파이 패스워드
WiFiServer server(80);
void setup() {
pinMode(A0,INPUT);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(12, OUTPUT);
Serial.begin(115200); // 시리얼 통신, 속도 115200
delay(10);
Serial.println();
// Connect to WiFi network
WiFi.mode(WIFI_STA);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
// Start the server
server.begin();
Serial.println("Server started");
// Print the IP address
Serial.println(WiFi.localIP());
}
void loop() {
int val = analogRead(A0); // cds 센서값 저장
delay(50);
Serial.println(val);
WiFiClient client = server.available();
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 1"); // 자동으로 웹페이지 새로고침 (1초 설정)
client.println();
client.println("<!DOCTYPE html>");
client.println("<html xmlns='http://www.w3.org/1999/xhtml'>");
client.println("<head>\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />");
//client.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />");
//client.println("<head>\n<meta charset='UTF-8'>");
client.println("<title>DIYver tistory blog test</title>"); // 웹 서버 페이지 제목 설정
client.println("</head>\n<body>");
client.println("<center>");
client.println("<H1>Node MCU Sensor Test</H1>"); // 페이지 내용 설정
if (val < 250 ) {
client.print("<H2>DARK !</H2> ");
client.println("<br>");
client.println("<H3>LED ON</H3>");
client.println("<br>");
client.println("<H4>Sensor Value</H4>");
client.println(val);
digitalWrite(LED_BUILTIN, LOW); // LED ON
digitalWrite(12, HIGH); // LED ON
}
else
{
client.print("<H2>BRIGHT </H2>");
client.println("<br>");
client.print("<H3>LED OFF</H3>");
client.println("<br>");
client.println("<H4>Sensor Value</H4>");
client.println(val);
digitalWrite(LED_BUILTIN, HIGH); // LED OFF
digitalWrite(12, LOW); // LED OFF
}
client.println("<br>");
client.println("<br>");
client.println("<H1> 블로그 주소 https://diyver.tistory.com </H1>"); // 페이지 내용 설정
client.println("<pre>");
client.print("</body>\n</html>");
}
제일 중요한 것은 윗 줄에 쓴
wifi ssid와 password 를 잘 적어주어야 하다는 것이다.
큰 따옴표 안에 직접 입력해두면 된다.
업로드하고 시리얼 모니터에서 뜨는 ip주소를
스마트폰으로 입력하면
정상적으로 실행되는 것을 볼 수 있다.
실제로 보면 D1 mini의 파란색 내장 LED가 조건에 따라서 켜졌다 꺼졌다 하는 것을 확인할 수 있다.
※ 궁금하시거나 질문사항이 있으시면 댓글로 작성해주시면 답변해 드릴 수 있는 부분에서 친절히 답변드리겠습니다!
'코딩 > 아두이노' 카테고리의 다른 글
LOLIN D32 코드 업로드 오류(fatal error) 뜰 때, 해결 방법 (0) | 2022.06.09 |
---|---|
ESP8266 외부인터럽트 에러 해결 방법 (2) | 2022.05.30 |
아두이노 네오픽셀로 LED 색 조절하는 방법 (0) | 2021.10.14 |
아두이노와 블루투스모듈 ZS-040로 스마트폰과 통신하기 (0) | 2021.04.30 |
아두이노 PIR 센서로 사람감지하기 (0) | 2021.04.15 |
댓글