전자공학/MCU
[EPS32] TCP통신2
17Hyuk
2022. 7. 28. 14:52
우선 한달동안 게임에 빠져서 너무 늦게 올린거에 대해 반성을 한다.
이번에는 flask로 구현한 홈페이지에서 LED를 제어하는 코드를 만들어봤다.
파이썬 코드
from flask import Flask, render_template, request
import socket, time
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
state = request.form['switch']
if state == 'on':
state = '1'
else:
state = '0'
# TCP
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('192.168.223.41', 9008)) # ip주소, 포트번호 지정
server_socket.listen(0) # 클라이언트의 연결요청을 기다리는 상태
client_socket, addr = server_socket.accept() # 연결 요청을 수락함. 길이가 2인 튜플 데이터를 가져옴
client_socket.sendall(state.encode()) # 클라이언트에게 메세지 전송
data = client_socket.recv(100) # 클라이언트로 부터 데이터를 받음. 출력되는 버퍼 사이즈. (만약 2할 경우, 2개의 데이터만 전송됨)
print(data.decode()) # 받은 데이터를 해석함.
server_socket.close()
time.sleep(5)
return render_template('index.html')
if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000, debug=True)
ESP32 코드
#include <WiFi.h>
const char* ssid = "iptime123"; // Your WiFi SSID
const char* password = "1234567!"; // Your WiFi Password
const char* host = "192.168.223.41"; // ipconfig 이용해서 IPv4 주소 입력
const uint16_t port = 9008;
void setup() {
Serial.begin(9600);
//STA : 다른공유기에서 ip주소를 받는다는 의미
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
return;
}
}
void loop() {
WiFiClient client; // WiFiClient 를 clinet라고 정의
if(!client.connect(host,port)){
delay(2000);
return;
}
client.print("Connected");
int bk = 0; // 무한루프 탈출용
while (client.connected()) { // 연결중일 때만 처리
if(bk==300){break;} // 3초 후에 강제 탈출
bk++;
while (client.available()) { // 문자가 도착했을 때만 처리
String req = client.readStringUntil('\r'); // TCP 서버에서 문자열 가져옴
Serial.println(req);
bk = 300;
}
delay(10);
}
client.print("Finish");
client.stop();
delay(2000);
}
아두이노 코드
const int LED = 7;
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
}
void loop() {
if(Serial.available()>0) //수신된 경우
{
int rx = Serial.read();
if(rx == '1'){digitalWrite(LED, HIGH);}
else if(rx == '0'){digitalWrite(LED, LOW);}
}
}
회로
저항이 많이 있는데 LED가 있는 7번 라인을 제외하고는 무시하자
홈페이지
시리얼 모니터와 tx/rx는 동시에 사용이 안되므로 우선 시리얼 모니터를 봤을 때
on을 누르면 1, off를 누르면 0이 출력이 되는것을 확인해 봤다
그래서 이것을 아두이노와 결합을 해서 LED를 제어할 수 있었다.
다음에는 LED 1개가 아니라 여러개를 문자열로 입력받아서 작동하는 코드를 만들 것 이다.
tmi) 그냥 esp32를 서버로 쓰는 것이 편하지 않냐라고 생각이 들 수도 있는데 이렇게 복잡하게 하는 이유는
졸업작품을 만들 때 파이썬으로 서버를 만들었기 때문에 그것을 바꿀 수가 없어서 이렇게 복잡하게 했다.
그리고 라즈베리파이를 사용한다면 해결됐겠지만, 예산 문제로 어쩔 수 없이 esp32를 사용하게 됐다.