프로젝트

아두이노와 파이썬을 이용해서 리소스 모니터 만들기

페이지 정보

작성자 홍예브 작성일16-08-05 13:55 조회4,243회 댓글0건

본문

안녕하세요 메카솔루션입니다.

이번에는 아두이노 나노와 LCD, 파이썬을 이용해서 컴퓨터의 상태를 파악할 수 있는 리소스모니터를 만들어 보도록 하겠습니다.

사용되는 부품 알아보기

9fa189b057ca1b86ca68b6c6652cafef_1470372

12864 OLED 모듈 4핀

통신 방식 : I2C
동작전압 3.3 ~ 5V



9fa189b057ca1b86ca68b6c6652cafef_1470372
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을 통해 시리얼통신으로 아두이노에 전송하고 아두이노에서는 이를받아 화면에 출력하는것이 기본 원리 입니다.

-----------------------------

회로보기

9fa189b057ca1b86ca68b6c6652cafef_1470372


사실 제가 간단하게 만든다고 악행을 벌였습니다.
일단 SDA랑 SCL에 맞춘다고, VCC와 GND를 A7 A6에 연결 하였지요...

9fa189b057ca1b86ca68b6c6652cafef_1470372

A7 핀이 아두이노와 연결된 부분을 잘라냅니다 커터칼로 쉽게 잘립니다.
자를때 안다치게 조심하세요

9fa189b057ca1b86ca68b6c6652cafef_1470372

A7 바로 오른쪽의 VCC를 납땜으로 이어줍니다.

9fa189b057ca1b86ca68b6c6652cafef_1470372

그리고 전선으로, 맞은편의 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();
  }
}




-----------------------------

윈도우 작업 스케줄러에 명령어 등록하기
9fa189b057ca1b86ca68b6c6652cafef_1470372
윈도우키를 누르고 작업 스케줄러를 검색하면 위 프로그램이 실행됩니다.
9fa189b057ca1b86ca68b6c6652cafef_1470372

새작업을 만들고 이름을 정해줍니다.
9fa189b057ca1b86ca68b6c6652cafef_1470372

트리거는 프로그램이 실행될 상황을 선택하는데 로그온 할때로 해주시면 됩니다.
9fa189b057ca1b86ca68b6c6652cafef_1470372

동작 명령어는 pythonw (python 으로만 해주면 커멘드창이 보입니다.) 에 인수 추가에 스크립트 파일의 위치를 입력해주시면 됩니다.

-----------------------------

동작영상보기


윈도우가 부팅이 되면 자동으로 리소스모니터와 연결되어 구동상황을 확인 할 수 있습니다.

감사합니다.

댓글목록

등록된 댓글이 없습니다.


모바일 버전으로 보기