Processor

아파치 웹(Web)에서 소켓을 이용한 라즈베리파이 Senso와 LED

작성자 임베디드코리아 작성일26-06-04 03:03 조회57회 댓글0건
<* 웹(Web)에서 소켓을 이용한 라즈베리파이 LED On/Off 제어 센서 값 받기 *>

---< index.html >------------------------------------------------------------------------
<!DOCTYPE html>
<html>
<head>
  <meta  charset=utf-8">
  <title>LED 제어 및 센서 모니터링</title>
  <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  <script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script>
</head>
<body>
  <h3>LED 제어</h3>
  <label><input type="radio" name="led" value="on"> ON</label>
  <label><input type="radio" name="led" value="off"> OFF</label>
  <p id="status">LED 상태: 알 수 없음</p>
  <h3>센서 모니터링</h3>
  <p id="th">데이터: --℃ / 정보: --%</p>
  <script>
    //const socket = io(location.protocol + '//' + location.hostname + ':5000');
    const socket = io("http://172.30.1.58:5000");  // 라즈베리파이 IP주소 , Flask-SocketIO 서버 주소
    // 접속 시 LED 상태 요청 및 온습도 요청
    socket.on("connect", function() {
      socket.emit("get_led_status");
 
    });
    // LED 상태 수신
    socket.on("led_status", function(data) {
      console.log("LED 상태:", data);
      $("#status").text("LED 상태: " + data.state);
      $("input[name='led'][value='" + data.state + "']").prop("checked", true);
    });
    // LED 상태 변경 요청
    $("input[name='led']").change(function() {
      const state = $(this).val();
      socket.emit("led_control", { state: state });
    });
    // 센서 요청
    setInterval(function(){
      socket.emit("get_analog_sensor_status");
    }, 2000);
 
    // 센서 수신
    socket.on("analog_sensor_status", function(data) {
      console.log("센서 수신:", data);
      $("#th").text("데이터: " + data.data + " / 정보: " + data.value );
    });
  </script>
</body>
</html>
-----------------------------------------------------------------------------------------------------
 const socket = io("http://172.30.1.58:5000"); 라즈베리파이 IP


---< flask_Socket_LED-Sensor.py >-----------------------------------------------------------
import time
import threading
from flask import Flask, request
from flask_socketio import SocketIO

import RPi.GPIO as GPIO


# --- 글로벌 변수 ---
analog_data = 0
analog_value = 0

# --- GPIO 설정 ---
LED_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)

# --- Flask-SocketIO 설정 ---
app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins="*", async_mode="eventlet")


# --- LED 상태 반환 함수 ---
def get_led_state():
    return "on" if GPIO.input(LED_PIN) else "off"

# --- LED 제어 처리 ---
@socketio.on("led_control")
def control_led(data):
    state = data.get("state")
    if state == "on":
        GPIO.output(LED_PIN, GPIO.HIGH)
    elif state == "off":
        GPIO.output(LED_PIN, GPIO.LOW)
    state = get_led_state()
    print(f"led 상태 : {state}")
    socketio.emit("led_status", {"state": state})

# --- LED 상태 요청 처리 ---
@socketio.on("get_led_status")
def handle_status_request():
    state = get_led_state()
    print(f"led 상태 : {state}")
    socketio.emit("led_status", {"state": state}, room=request.sid)

# ---  센서 상태 요청 처리 (유니캐스트) ---
@socketio.on("get_analog_sensor_status")
def send_analog_sensor_status():
    if analog_data is not None and analog_value is not None:
        socketio.emit("analog_sensor_status", {
            "data": analog_data,
            "value": analog_value
        }, room=request.sid)
    else:
        socketio.emit("analog_sensor_status", {
            "data": "N/A",
            "value": "N/A"
        }, room=request.sid)

# --- 센서 측정 스레드 ---
def sensor_monitor_thread():
    global analog_data, analog_value
    while True:
        analog_data += 10
        analog_value += 5
        print(f"Data : {analog_data}/ Value : {analog_value}")
       
        time.sleep(2)

# --- 센서 스레드 시작 ---
def start_sensor_thread():
    t = threading.Thread(target=sensor_monitor_thread)
    t.daemon = True
    t.start()

# --- 메인 ---
if __name__ == "__main__":
    print("서버 시작")
    start_sensor_thread()
    socketio.run(app, host="172.30.1.58", port=5000)
-----------------------------------------------------------------------------------------------
● socketio.run(app, host="172.30.1.58", port=5000)
    : 자신의 IP주소, 라즈베리파이 IP주소