전자공학/MCU

[EPS32] TCP통신2

17Hyuk 2022. 7. 28. 14:52

우선 한달동안 게임에 빠져서 너무 늦게 올린거에 대해 반성을 한다.

이번에는 flask로 구현한 홈페이지에서 LED를 제어하는 코드를 만들어봤다.

 

예제2.zip
0.00MB

파이썬 코드

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번 라인을 제외하고는 무시하자

 

 

홈페이지

홈페이지

 

esp32 시리얼 모니터

 

시리얼 모니터와 tx/rx는 동시에 사용이 안되므로 우선 시리얼 모니터를 봤을 때

on을 누르면 1, off를 누르면 0이 출력이 되는것을 확인해 봤다

그래서 이것을 아두이노와 결합을 해서 LED를 제어할 수 있었다.

 

다음에는 LED 1개가 아니라 여러개를 문자열로 입력받아서 작동하는 코드를 만들 것 이다.

 

tmi) 그냥 esp32를 서버로 쓰는 것이 편하지 않냐라고 생각이 들 수도 있는데 이렇게 복잡하게 하는 이유는 
졸업작품을 만들 때 파이썬으로 서버를 만들었기 때문에 그것을 바꿀 수가 없어서 이렇게 복잡하게 했다. 
그리고 라즈베리파이를 사용한다면 해결됐겠지만, 예산 문제로 어쩔 수 없이 esp32를 사용하게 됐다.