아두이노와 파이썬을 이용해서 리소스 모니터 만들기
페이지 정보
작성자 홍예브 작성일16-08-05 13:55 조회4,243회 댓글0건관련링크
본문
안녕하세요 메카솔루션입니다.
이번에는 아두이노 나노와 LCD, 파이썬을 이용해서 컴퓨터의 상태를 파악할 수 있는 리소스모니터를 만들어 보도록 하겠습니다.
사용되는 부품 알아보기
12864 OLED 모듈 4핀
통신 방식 : I2C
동작전압 3.3 ~ 5V
CH340 아두이노 나노
기존에 헤더핀이 납땜되어있지않아 원하는 형태로 쉽게 만들 수 있습니다.
-----------------------------
기본 원리 알아보기
파이썬에는 psutil 이라는 라이브러리가 있어 이를 통해서 컴퓨터의 CPU, 메모리, 하드디스크등의 정보를 받아 올 수 있습니다.
psutil은 내장라이브러리가 아니기때문에 설치를 해주셔야합니다.
pip install psutil
파이썬 소스코드는 아래와 같습니다
import psutil
print(psutil.cpu_percent()) #cpu사용량
print(psutil.virtual_memory().percent) #메모리 사용량
print(psutil.disk_usage('/').percent) #디스크 사용량
이것을 pyserial을 통해 시리얼통신으로 아두이노에 전송하고 아두이노에서는 이를받아 화면에 출력하는것이 기본 원리 입니다.
-----------------------------
회로보기
사실 제가 간단하게 만든다고 악행을 벌였습니다.
일단 SDA랑 SCL에 맞춘다고, VCC와 GND를 A7 A6에 연결 하였지요...
A7 핀이 아두이노와 연결된 부분을 잘라냅니다 커터칼로 쉽게 잘립니다.
자를때 안다치게 조심하세요
A7 바로 오른쪽의 VCC를 납땜으로 이어줍니다.
그리고 전선으로, 맞은편의 GND를 연결해주시면 됩니다.
이렇게 해주시면 회로가 완성됩니다.
꼭 이렇게 배선하지 않고, 브레드보드를 통해 배선을 해주셔도 좋습니다.
-----------------------------
소스코드 작성하기
본프로젝트에 사용되는 소스코드는 위 링크에 정리되어있습니다.
추가적으로 필요한 아두이노 라이브러리는 다음과 같습니다.
위링크에서 라이브러리를 다운로드후 아두이노에 추가해주시면 됩니다.
파이썬 소스코드
import psutil as ps import serial import time import datetime ser = serial.Serial() ser.port = 'COM32'#아두이노 시리얼포트 선택 ser.baudrate = 115200 ser.open() while (True): if(ser.inWaiting() > 0): break while (True): now = datetime.datetime.now() hour = bytes([now.hour]) minute = bytes([now.minute]) cpu_p = int(ps.cpu_percent()) mem_p = int(ps.virtual_memory().percent) disk_p = int(ps.disk_usage('/').percent) #HEX 데이터로 보내기 시,분,CPU,RAM,D 각각 2바이트씩 총 10바이트다. ser.write(str.encode("h")) ser.write(hour) ser.write(str.encode("m")) ser.write(minute) ser.write(str.encode("C")) ser.write(bytes([cpu_p])) ser.write(str.encode("M")) ser.write(bytes([mem_p])) ser.write(str.encode("D")) ser.write(bytes([disk_p])) time.sleep(2)#2초간 대기 |
아두이노 소스코드
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #include <SoftwareSerial.h> Adafruit_SSD1306 display(4); SoftwareSerial debug(11, 12); int hour, minute, cpu_p, mem_p; char INFO[4][21]; byte packet[10] = {0,}; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.println("resource monitor v1.0"); display.setCursor(0, 8); display.println(""); display.setCursor(0, 16); display.println("mechasolution"); display.setCursor(0, 24); display.println("thanks for using"); display.display(); pinMode(13, OUTPUT); Serial.begin(115200); debug.begin(9600); delay(1000); Serial.print('a'); } void loop() { if (Serial.available() > 9) {//입력데이터가 10개가 되면 읽어들입니다. for (int i = 0; i < 10; i++) { packet[i] = Serial.read();//10byte의 데이터를 읽어들입니다. } if ( packet[0] != 'h' && packet[2] != 'm' && packet[4] != 'C' && packet[6] != 'M' && packet[8] != 'D') {//포멧이 올바르게 왔는지 확인 //data format error digitalWrite(13, HIGH); delay(50); digitalWrite(13, LOW); delay(50); digitalWrite(13, HIGH); delay(50); digitalWrite(13, LOW); //포멧이 올바르지 않으면, 에러 출력 while (Serial.available() > 0 && Serial.read()); //시리얼 버퍼 초기화 return;//루프문 종료 } //데이터가 올바르게 오면 한번 깜빡임 digitalWrite(13, HIGH); delay(50); digitalWrite(13, LOW); //화면 출력 데이터 수정 sprintf(INFO[0], " %02d:%02d", (int)packet[1], (int)packet[3]); sprintf(INFO[1], "CPU : %3d%%", (int)packet[5]); sprintf(INFO[2], "RAM : %3d%%", (int)packet[7]); sprintf(INFO[3], "DISK : %3d%%", (int)packet[9]); display.clearDisplay();//디스플레이 초기화 display.setCursor(0, 0); display.println(INFO[0]); display.setCursor(0, 8); display.println(INFO[1]); display.setCursor(0, 16); display.println(INFO[2]); display.setCursor(0, 24); display.println(INFO[3]); //화면 출력 데이터들을 실제로 출력합니다. display.display(); } } |
-----------------------------
윈도우 작업 스케줄러에 명령어 등록하기
윈도우키를 누르고 작업 스케줄러를 검색하면 위 프로그램이 실행됩니다.
새작업을 만들고 이름을 정해줍니다.
트리거는 프로그램이 실행될 상황을 선택하는데 로그온 할때로 해주시면 됩니다.
동작 명령어는 pythonw (python 으로만 해주면 커멘드창이 보입니다.) 에 인수 추가에 스크립트 파일의 위치를 입력해주시면 됩니다.
-----------------------------
동작영상보기
윈도우가 부팅이 되면 자동으로 리소스모니터와 연결되어 구동상황을 확인 할 수 있습니다.
감사합니다.
댓글목록
등록된 댓글이 없습니다.
최신댓글