본문 바로가기
아두이노

아두이노 코로나 현황표시 / 색상 검출(OpenCV) / 가변저항값 그래프

by ADELA_J 2023. 8. 2.

공공데이터포털에서 

https://www.data.go.kr/index.do

보건복지부_코로나19 시도 발생현황 승인받아서 주소를 가져오기

 

그리고

코로나 현황받아오기

왜 경기만 있는지 모를... 원본 데이터에도 경기만 있었다

<지역별 코로나 확진자 수 출력하기>

경기만 있으니 경기라도....

<오늘 날짜를 자동으로 입력하여 전국의 코로나 확진자수 출력하기>

현재는 이런식으로만 제공하고 있기 때문에..ㅠ

<색상검출해서 아두이노에 LED 표시하기>

- OpenCV를 이용해서 색상 추출하기

 

더보기
import cv2

def main():
    camera = cv2.VideoCapture(0)
    camera.set(3,320)
    camera.set(4,240)

    while True:
        frame = cv2.imread('green.png')
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        lower_blue = (100,100,120)
        upper_blue = (150,255,255)

        lower_green = (50,150,50)
        upper_green = (80,255,255)

        lower_red = (150,50,50)
        upper_red = (180,255,255)

        redMask = cv2.inRange(hsv, lower_red, upper_red)
        greenMask = cv2.inRange(hsv,lower_green, upper_green)
        blueMask = cv2.inRange(hsv, lower_blue, upper_blue)

        red = cv2.bitwise_and(frame, frame, mask=redMask)
        green = cv2.bitwise_and(frame, frame, mask=greenMask)
        blue = cv2.bitwise_and(frame, frame, mask=blueMask)

        cv2.imshow('frame', frame)
        cv2.imshow('red', red)
        cv2.imshow('Green', green)
        cv2.imshow('Blue', blue)

        if cv2.waitKey(1) == ord('q'):
            break

    cv2.destroyAllwindows()

if __name__ == '__main__':
    main()

-색상 값 수치화하기

bitwise_and랑 imshow는 frame만 남기고 이거 추가
그럼 이렇게 수치가 나옴..!

 

- 색상별 가장 큰 값을 찾고 값의 임계점 이상 넘어갔을 때 색상을 판별하고 LED 색상에 맞게에 전송하기

더보기
import cv2
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():
    camera = cv2.VideoCapture(0)
    camera.set(3,320)
    camera.set(4,240)

    while True:
        frame = cv2.imread('green.png')
        
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        lower_blue = (100,100,120)
        upper_blue = (150,255,255)

        lower_green = (50,150,50)
        upper_green = (80,255,255)

        lower_red = (150,50,50)
        upper_red = (180,255,255)

        redMask = cv2.inRange(hsv, lower_red, upper_red)
        greenMask = cv2.inRange(hsv,lower_green, upper_green)
        blueMask = cv2.inRange(hsv, lower_blue, upper_blue)

        redPixels = cv2.countNonZero(redMask)
        greenPixels = cv2.countNonZero(greenMask)
        bluePixels = cv2.countNonZero(blueMask)

        colorList = [redPixels,greenPixels,bluePixels]
        maxValue = max(colorList)
        maxPos = colorList.index(maxValue)

        if maxValue >= 500:
            if maxPos == 0: #red
                print("red")
                send_rgb_led(255,0,0)
            elif maxPos == 1: #green
                print("green")
                send_rgb_led(0,255,0)
            elif maxPos == 2:   #blue
                print("blue")
                send_rgb_led(0,0,255)
        else:
            pass

        cv2.imshow('frame', frame)

        if cv2.waitKey(1) == ord('q'):
            break

    cv2.destroyAllWindows()

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()

 

<파이썬으로 가변 저항 값을 요청하여 실시간 그래프 그리기>

- 실시간 그래프 그리기

 

- 가변 저항 값을 받는대로 실시간 그래프 그리기

더보기
from matplotlib import pyplot as plt
from matplotlib import animation
import numpy as np
import time
import serial
import serial.tools.list_ports
import threading

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_vr():
    sendData = f"VR=?\n"
    my_serial.write(sendData.encode())

def init():
    return line,

def animate(i):
    send_vr()
    global serial_receive_data
    if "VR=" in serial_receive_data:
        print("가변 저항 값:", serial_receive_data[3:])
        y = int(serial_receive_data[3:])
        serial_receive_data = ""
        y = float(y)

        old_y = line.get_ydata()
        new_y = np.r_[old_y[1:], y]
        line.set_ydata(new_y)
        return line,
    else:
        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()

max_x_points = 200

fig = plt.figure()
ax = plt.axes(xlim=(0, max_x_points), ylim=(0,1023))

line, = ax.plot(np.arange(max_x_points), np.ones(max_x_points, dtype=np.float)*np.nan, lw=2)
anim = animation.FuncAnimation(fig, animate, init_func=init, frames=200, interval=20, blit=False)

plt.show()
my_serial.close()