본문 바로가기
아두이노

아두이노 밝기값 스마트폰 알람 / 센서값 엑셀 저장 / GUI만들어서 서보모터/음성인식

by ADELA_J 2023. 8. 2.

<파이썬으로 밝기 값을 요청하여 어두워지면 스마트폰으로 알림보내기>

 

https://slack.com 에서 워크페이스 생성하고

https://api.slack.com/ 에서 워크스페이스에서 동작하는 봇을 만들기 위해 접속해서 app을 생성함

그리고 조도센서로 값을 받아서 일정값 보다 아래면 어두워졌다고 보냄

더보기
import time
import serial
import serial.tools.list_ports
import threading
import requests
import json

slack_webhook_url = "api 주소"

def sendSlackWebhook(strText):
    headers = {
        "Content-type":"application/json"
    }

    data = {
        "text" : strText
    }

    res = requests.post(slack_webhook_url, headers=headers, data=json.dumps(data))

    if res.status_code == 200:
        return "ok"
    else:
        return "error"
    
def send_bright():
    sendData = f"BRIGHT=?\n"
    my_serial.write(sendData.encode())

serial_receive_data = ""
def serial_read_thread():
    global serial_receive_data
    while True:
        read_data = my_serial.readline()
        serial_receive_data = read_data.decode()
    
def send_bright_1sec():
    t2 = threading.Timer(1, send_bright_1sec)
    t2.daemon = True
    t2.start()
    send_bright()

def main():
    try:
        send_bright_1sec()
        global serial_receive_data
        while True:
            if "BRIGHT=" in serial_receive_data:
                bright = int(serial_receive_data[7:])
                print("밝기값:",bright)
                serial_receive_data = ""
                
                if bright < 10:
                    sendSlackWebhook("어둡습니다.")
                    for i in range(60):
                        time.sleep(60.0)
    except KeyboardInterrupt:
        pass

if __name__== '__main__':

    ports = list(serial.tools.list_ports.comports())
    for p in ports:
        if 'USB' in p.description:
            print(f"{p}포트에 연결하였습니다.")
            my_serial = serial.Serial(p.device, baudrate=9600, timeout=1.0)
            time.sleep(2.0)

    t1 = threading.Thread(target=serial_read_thread)
    t1.daemon = True
    t1.start()

    main()

    my_serial.close()

<온도 센서 받기>

 

- 온도/습도 센서 받아서 엑셀에 저장하기

<파이썬으로 GUI 만들어서 서보모터 제어하기>

더보기
import tkinter
import tkinter.font
import time
import serial
import serial.tools.list_ports

def send_servo(self):
    value = scale.get()
    print(value)
    send_servo(value)
    time.sleep(0.1)

def send_servo(digree):
    sendData = f"SERVO={digree}\n"
    my_serial.write(sendData.encode())

if __name__== '__main__':

    ports = list(serial.tools.list_ports.comports())
    for p in ports:
        if 'USB' in p.description:
            print(f"{p}포트에 연결하였습니다.")
            my_serial = serial.Serial(p.device, baudrate=9600, timeout=1.0)
            time.sleep(2.0)

    window = tkinter.Tk()
    window.title("SERVO CONTROL")
    # window.geometry("500X200")
    window.resizable(False,False)

    font = tkinter.font.Font(size=20)
    label = tkinter.Label(window, text="SERVO DIGREE", font=font)

    var = tkinter.IntVar()
    scale = tkinter.Scale(window, variable=var, command=send_servo, orient="horizontal", showvalue=True, tickinterval=20, to=180, length=500)
    scale.set(90)
    label.grid(row=0, column=0, columnspan=3)
    scale.grid(row=3, column=0, columnspan=3)

    window.mainloop()

<음성 인식>

더보기
import speech_recognition as sr
import time
import serial
import serial.tools.list_ports

def send_rgb_led(red, green, blue):
    sendData = f"RGB={red},{green}, {blue}\n"
    my_serial.write(sendData.encode())

def main():
    try:
        while True:
            r = sr.Recognizer()

            with sr.Microphone() as source:
                print("음성입력")
                audio = r.listen(source)
            try:
                stt = r.recognize_google(audio, language='ko-KR')
                print("음성변환:"+stt)
                if "빨간색" in stt and "켜" in stt:
                    print("빨간색 LED ON")
                    send_rgb_led(255,0,0)
                elif "녹색" in stt and "켜" in stt:
                    print("녹색 LED ON")
                    send_rgb_led(0, 255,0)
                elif "노란색" in stt and "켜" in stt:
                    print("노란색 LED ON")
                    send_rgb_led(0,0,255)
                elif "불" in stt and "꺼" in stt:
                    print("모든 LED OFF")
                    send_rgb_led(0,0,0)
            except sr.UnknownValueError:
                print("오디오를 이해할 수 없습니다.")
            except sr.RequestError as e:
                print(f"에러가 발생했습니다. 원인:{e}")
    except KeyboardInterrupt:
        pass

if __name__== '__main__':
    ports = list(serial.tools.list_ports.comports())
    for p in ports:
        if 'USB' in p.description:
            print(f"{p}포트에 연결하였습니다.")
            my_serial = serial.Serial(p.device, baudrate=9600, timeout=1.0)
            time.sleep(2.0)

        main()

        my_serial.close()