NODEMCU

NODEMCU 와이파이 연결 및 인터넷 시간받아오기

난쏘공돌이 2021. 1. 24. 18:22

툴 - 라이브러리 관리에 들어가셔서

라이브러리 검색창에 8266관련 라이브러리를 받았다는 가정하에 진행 됩니다.

 

2021/01/16 - [라즈베리파이 프로젝트] - NodeMCU 1.0 아두이노IDE 연결

 

NodeMCU 1.0 아두이노IDE 연결

따로 라즈베리파이와 떨어진 곳에서 센서컨트롤 용도로 사용할 보드로 아두이노나노와 NodeMCU를 고민했는데 이제는 찾아보기 힘든 mini5핀 형식을 가진 아두이노 나노보다는 micro 5핀 형식으로 연

nan-sso-gong.tistory.com

저의 이전 포스팅입니다 해당글에서 NODEMCU 관련 라이브러리를 받은 상태에서 진행하겠습니다.

 

IDE에서 스케치 - 라이브러리 포함하기 - ESP8266WIFI

 

를 클릭해주면 수많은 헤더파일이 생겨나게 됩니다.

그 중에서 저희는 

 

#include <ESP8266WiFi.h>

#include <ESP8266WiFi.h>

이거 하나만 씁니다

 

와이파이 연결 소스코드

#include <ESP8266WiFi.h>

//wifi 연결코드
//그리고 추가사항으로 인터넷 연결 끊어지면 다시연결

//wifi
const char* ssid = "SK_WiFiGIGA04C6_2.4G"; //wifi 이름 수정해주세요
const char* password = "*********"; //비밀번호 수정해주세요


void setup() {

  Serial.begin(115200); //전송속도

  Wifi_connect(); //와이파이 연결
  
}

void loop() {
  // put your main code here, to run repeatedly:
  if(WiFi.status() != WL_CONNECTED){ //연결이 이상할시에
    Serial.println("try reconnect");
    Wifi_connect();
  }

    delay(5000);
}

void Wifi_connect() {
  
  Serial.println("---------------------------------------");
  Serial.println(ssid);
  WiFi.begin(ssid, password); // WIFI연결 시작
  while (WiFi.status() != WL_CONNECTED) {
    // 네트워크의 연결 상태, 8개의 리턴값
    // STATUS와 WL_CONNECTED 값이 같은지를 통해 제대로 연결이 되있는지를 확인할 수 있다
    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.println("Wifi connected!");
  Serial.println("\nConnected to network");
  Serial.print("My IP address is: ");
  Serial.println(WiFi.localIP());
}

결과는

여기서 WiFi.status값은 8개의 리턴값을 가진다고 했는데,

 

리턴값은 

  • WL_CONNECTED: assigned when connected to a WiFi network;

  • WL_NO_SHIELD: assigned when no WiFi shield is present;

  • WL_IDLE_STATUS: it is a temporary status assigned when WiFi.begin() is called and remains active until the number of attempts expires (resulting in WL_CONNECT_FAILED) or a connection is established (resulting in WL_CONNECTED);

  • WL_NO_SSID_AVAIL: assigned when no SSID are available;

  • WL_SCAN_COMPLETED: assigned when the scan networks is completed;

  • WL_CONNECT_FAILED: assigned when the connection fails for all the attempts;

  • WL_CONNECTION_LOST: assigned when the connection is lost;

  • WL_DISCONNECTED: assigned when disconnected from a network;

이렇게 8개 이다.

https://www.arduino.cc/en/Reference/WiFiStatus

 

Arduino - WiFiStatus

#include #include char ssid[] = "yourNetwork";                     // your network SSID (name) char key[] = "D0D0DEADF00DABBADEAFBEADED";       // your network key int keyIndex = 0;                                // your networ

www.arduino.cc

여기부턴 인터넷 시간을 출력하는 코드를 소개합니다

 

 

라이브러리는 ESPDateTime을 사용합니다 이 역시 라이브러리 관리에서 검색해서 받아주시면 됩니다.

https://github.com/mcxiaoke/ESPDateTime

 

mcxiaoke/ESPDateTime

Date Time Functions and Classes for ESP8266 and ESP32 - mcxiaoke/ESPDateTime

github.com

먼저 추가된 코드 전문입니다.

#include <DateTime.h>
#include <ESPDateTime.h>
#include <TimeElapsed.h>


#include <ESPDateTime.h>


#include <ESP8266WiFi.h>


//인터넷 시간 받아오는 코드
//그리고 추가사항으로 인터넷 연결 끊어지면 다시연결

//wifi
const char* ssid = "SK_WiFiGIGA04C6_2.4G";
const char* password = "1803003041";


unsigned long lastMs = 0;

unsigned long ms = millis();




void setup() {

  Serial.begin(115200); //전송속도

  Wifi_connect(); //와이파이 연결

  setupDateTime();
  Serial.println(DateTime.now());
  Serial.println(DateTime.getTime());
  Serial.println(DateTime.utcTime());
  Serial.println("--------------------");
  Serial.println(DateTime.toString());
  Serial.println(DateTime.toISOString());
  Serial.println(DateTime.toUTCString());
  Serial.println("--------------------");
  Serial.println(DateTime.format(DateFormatter::COMPAT));
  Serial.println(DateTime.format(DateFormatter::DATE_ONLY));
  Serial.println(DateTime.format(DateFormatter::TIME_ONLY));
  Serial.println("--------------------");
  DateTimeParts p = DateTime.getParts();
  Serial.printf("%04d/%02d/%02d %02d:%02d:%02d %ld %+05d\n", p.getYear(),
                p.getMonth(), p.getMonthDay(), p.getHours(), p.getMinutes(),
                p.getSeconds(), p.getTime(), p.getTimeZone());
  Serial.println("--------------------");
  time_t t = DateTime.now();
  Serial.println(DateFormatter::format("%Y/%m/%d %H:%M:%S", t));
  Serial.println(DateFormatter::format("%x - %I:%M %p", t));
  Serial.println(DateFormatter::format("Now it's %F %I:%M%p.", t));
}

void loop() {
  // put your main code here, to run repeatedly:
  if(WiFi.status() != WL_CONNECTED){ //연결이 이상할시에
    Serial.println("try reconnect");
    Wifi_connect();
  }
  Serial.println(DateTime.now());
  Serial.println(DateTime.toString());


  delay(5000);
}

void Wifi_connect() {
  
  Serial.println("---------------------------------------");
  Serial.println(ssid);
  WiFi.begin(ssid, password); // 와이파이 이름과 비밀번호를 통해 WIFI연결을 시작 // WL_CONNECTED라는 값을 돌려준다
  while (WiFi.status() != WL_CONNECTED) {
    // 네트워크의 연결 상태, 8개의 리턴값
    // STATUS와 WL_CONNECTED 값이 같은지를 통해 제대로 연결이 되있는지를 확인할 수 있다
    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.println("Wifi connected!");
  Serial.println("\nConnected to network");
  Serial.print("My IP address is: ");
  Serial.println(WiFi.localIP());
}

void setupDateTime() {
  // 와이파이 연결이후에 수정하세요
  // you can use custom timeZone,server and timeout
  DateTime.setTimeZone(9);
  //DateTime.setServer("asia.pool.ntp.org");
  DateTime.begin(15 * 1000);
  DateTime.setTimeZone(9);
  DateTime.begin();
  if (!DateTime.isTimeValid()) {
    Serial.println("Failed to get time from server.");
  }
}


 

해당코드는 와이파이 연결이 정상적으로 진행될경우,

타임서버에서 시간을 받아와서 5초마다 시간을 출력해주는 코드입니다.