<* 웹(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주소