-
Notifications
You must be signed in to change notification settings - Fork 1
/
Arduino_Pro_mini_WLAN-LEDcontrol.ino
200 lines (152 loc) · 5.23 KB
/
Arduino_Pro_mini_WLAN-LEDcontrol.ino
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
//Cerevo techblog 2015.8.9
//ESP8266-Arduino pro mini 3.3V LED Control
#include <SoftwareSerial.h>
SoftwareSerial esp8266(7, 8);
#define DEBUG true
#define TIMEOUT 2000
#define ESP_RST 14
#define ESP_EN 2
#define LED1 3 //G
#define LED2 5 //R
#define LED3 6 //B
bool ledstate = true;
void setup() {
// put your setup code here, to run once:
pinMode(ESP_RST, OUTPUT);
pinMode(ESP_EN, OUTPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
Serial.begin(9600);
delay(100);
Serial.println("ESP_RST");
digitalWrite(ESP_RST,HIGH);
delay(100);
Serial.println("ESP_EN");
digitalWrite(ESP_EN,HIGH);
delay(100);
Serial.begin(9600);
esp8266.begin(115200);
sendData("AT+RST\r\n",TIMEOUT,DEBUG); // esp8266をソフトウェアリセット
delay(5000);
sendData("AT+CWMODE=2\r\n",TIMEOUT,DEBUG); // アクセスポイントモードに設定
sendData("AT+CIFSR\r\n",TIMEOUT,DEBUG); // ローカルIPアドレスの取得
sendData("AT+CIPMUX=1\r\n",TIMEOUT,DEBUG); // マルチ接続設定ON 1つ以上のアクセスを受け付ける
sendData("AT+CIPSERVER=1,80\r\n",TIMEOUT,DEBUG); // サーバーモードON. 80番ポートをアクセス可能に
//LED G点灯
digitalWrite(LED1,LOW);
}
void loop() {
// put your main code here, to run repeatedly:
if(esp8266.available()) // check if the esp is sending a message
{
/*
while(esp8266.available())
{
// デバック用
char c = esp8266.read(); // 1文字毎に読んでシリアルに表示
Serial.write(c);
}
*/
//+IPDを受信するとネットワークデータを受信
if(esp8266.find("+IPD,"))
{
delay(1000);
int connectionId = esp8266.read()-48; // IPDの次の文字がconnection idなので 読み取る
// アスキーで受信されるので、アスキーコードの0が10進で48なので、引いておく
if(esp8266.find("POST")) // POSTの文字列を受信するとLEDの色を変える
{
Serial.print("POST\r\n");
if(ledstate){
//LED2 点灯
digitalWrite(LED1,HIGH);
digitalWrite(LED2,LOW);
digitalWrite(LED3,HIGH);
//PWM
for(int j=0; j < 255 ; j++){
analogWrite(LED2,j);
delay(5);
}
delay(512);
for(int j=254; j>0 ; j--){
analogWrite(LED2,j);
delay(5);
}
}else{
//LED3 点灯
digitalWrite(LED1,HIGH);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,LOW);
//PWM
for(int j=0; j < 255 ; j++){
analogWrite(LED3,j);
delay(5);
}
delay(512);
for(int j=254; j>0 ; j--){
analogWrite(LED3,j);
delay(5);
}
}
ledstate = !ledstate;
}
//データ本体 ボタンを一つ配置して、ボタンを押すとPOSTを返答する
String webpage = "HTTP/1.0 200 OK\r\n";
webpage += "\r\n";
webpage += "<html><form method=POST><h1>Hello!</h1>";
webpage += "<input type=submit value=LED style=width:800px;/>";
webpage += "</form></html>";
//データを送る前に、idとデータのバイト数を<id>,<length>の順に記載する
String cipSend = "AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend +=webpage.length();
cipSend +="\r\n";
sendData(cipSend,1000,DEBUG);
digitalWrite(LED1,HIGH);
delay(2000);
//データ本体を送信
sendData(webpage,1000,DEBUG);
//現在のconnection idのTCPポートをクローズする
String closeCommand = "AT+CIPCLOSE=";
closeCommand+=connectionId; // append connection id
closeCommand+="\r\n";
sendData(closeCommand,3000,DEBUG);
//LED G点灯
digitalWrite(LED1,LOW);
digitalWrite(LED2,HIGH);
digitalWrite(LED3,HIGH);
}
}
}
//データ送信関数
//文字列で受けたデータを1文字ずつesp8266に送信
String sendData(String command, const int timeout, boolean debug)
{
String response = "";
char con[256];
char i;
command.toCharArray(con,256);
//esp8266.print(command); // send the read character to the esp8266
for(i=0; i<command.length(); i++){
esp8266.write(con[i]);
}
long int time = millis();
while( (time+timeout) > millis())
{
while(esp8266.available())
{
// The esp has data so display its output to the serial window
char c = esp8266.read(); // read the next character.
response+=c;
}
}
if(debug)
{
Serial.print(response);
}
return response;
}