티스토리 뷰

728x90

1. 개요

  

  어떠한 제품을 만들때 제품의 설정 값을 동적으로 변경되어야 할 때가 있다. 또한 매번 해당 설정 값을 전원을 켤때마다 하는 것은 비효율 적이다. 이를 해결하기 위해 전원이 없어도 데이터가 초기화 되지 않는 EEPROM 또는 Flash Memory에 저장을 한다. 


이번 예제는 특수 데이터를 Web을 이용하여 EEPROM에 변경 저장을 하는 예제이며 해당 데이터가 전원을 껐다 켜도 남아있는 것을 확인한다.


Test 보드는 NodeMCU를 사용하였으며 ESP제품이 아닌 다른 제품을 이용할 시에는 라이브러리를 기본 라이브러리인 WIFI.h 및 WebServer.h를 추가하면 된다.



2. Source Code

  

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
#define EEP_DATA_LEN 30
const char* ssid = "SSID";
const char* passphrase = "PSWD";
 
IPAddress mystaticip(192, 168, 0, 11);
IPAddress mygateway(192, 168, 0, 1);
IPAddress mysubnet(255, 255, 255, 0);
 
ESP8266WebServer server(80);
 
WiFiClient espClient;
String content, data = "";
int statusCode;
 
bool setWIFI() {
  Serial.print("Connecting to ");
  Serial.println(ssid);
   
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
 
    WiFi.mode(WIFI_STA);
  }
   
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
   
  return true;
}
 
void readEEPROM(){
    data = "";
    char temp;
    Serial.println();
    for (int i = 0; i < EEP_DATA_LEN; ++i)
    {
        temp = char(EEPROM.read(i));
        if(temp == '!')
            break;
        data += temp;
    }
    Serial.println("Read Data : ");
    Serial.println(data);
    Serial.println();
}
 
void launchWeb(int webtype) {
  createWebServer(webtype);
  server.begin();
}
 
void createWebServer(int webtype)
{
 
    if ( webtype == 0 ) {
        server.on("/", []() {
        content = "<!DOCTYPE HTML>\r\n";
        content += "<H1>Setting Data</H1><p>";
        content += "<p>Current Data : ";
        content += data;
        content += "</p><form method='get' action='setting'><label>Input New Data: </label><input name='data' length=32><br><input type='submit'></form>";
        content += "";
        server.send(200, "text/html", content);
        });
     
        server.on("/setting", []() {
          data = server.arg("data");
 
          int len = data.length();
          if (len > 0 ) {
              for (int i = 0; i < EEP_DATA_LEN; ++i) {
                EEPROM.write(i, 0); //clearing
              }
              EEPROM.commit();
               
              for (int i = 0; i < len ; ++i)
              {
                EEPROM.write(i, data[i]);
              }
              EEPROM.write(len,'!');
              EEPROM.commit();
               
              content = "{\"Success\":\"saved to eeprom... reset to boot into new wifi\"}";
              statusCode = 200;
            } else {
              content = "{\"Error\":\"404 not found\"}";
              statusCode = 404;
              Serial.println("Sending 404");
            }
            server.send(statusCode, "application/json", content);
        });
    }
}
 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  EEPROM.begin(512);
   
  readEEPROM();
   
  WiFi.begin(ssid, passphrase);
  WiFi.config(mystaticip, mygateway, mysubnet);  //set static IP
  if (setWIFI()) {
    launchWeb(0);//OK
    return;
  }
  delay(1000);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  server.handleClient();
}

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함