2016年4月2日土曜日

[Arduino]CPU使用率をみたい

Buildしている時にほかの作業をしていると終わったのを見逃して作業効率悪いから、見えるようにした


概要:
 PC(Python) <-usb-> ArduinoMicro <-gpio->matrix led

HW:
 ArduinoMicro
 8x8マトリックスモジュールキット K-LED8X8M7219
 連結可能なminiブレッドボード BBD-170SP

SW:
PC側はPythonでCPU使用率を取得してSerialで送るだけ
CPU使用率取得にはpsutilをつかう
$easy_install psutil
コードはこんなん
cpu2arduino.py
import psutil
import serial

ser = serial.Serial('/dev/ttyACM0', 96000)
ps_interval = 0.1

while True:
  percent = psutil.cpu_percent(interval=ps_interval , percpu=True)
  sendData = ("[" + ",".join(str(x) for x in percent) + "]")
  ser.write(sendData)
  ps_interval = max(0.3, sum(percent) / len(percent) / 100)

Arduino側にはPCからこんなSerialデータが送られる
 [0.0,10.0,30.0]
これをパースしてMatrixLEDに表示するだけ
ShowCpuInfo.ino
/*MatrixLED Display*/
# define DISP_USAGE_0 0x00
# define DISP_USAGE_1 0x01
# define DISP_USAGE_2 0x03
# define DISP_USAGE_3 0x07
# define DISP_USAGE_4 0x0f
# define DISP_USAGE_5 0x1f
# define DISP_USAGE_6 0x3f
# define DISP_USAGE_7 0x7f
# define DISP_USAGE_8 0xff

/*Serial Definitions*/
# define MAX_LENGTH 62
char dat[MAX_LENGTH];   // Serial strings
int count = 0;          // Serial strings count

/*Port Definitions*/
const int Max7219_pinCLK = 10;
const int Max7219_pinCS  = 9;
const int Max7219_pinDIN = 8;

void Write_Max7219_byte(unsigned char DATA)
{
  unsigned char i;
  digitalWrite(Max7219_pinCS, LOW);
  for (i = 8; i >= 1; i--)
  {
    digitalWrite(Max7219_pinCLK, LOW);
    digitalWrite(Max7219_pinDIN, DATA & 0x80); // Extracting a bit data
    DATA = DATA << 1;
    digitalWrite(Max7219_pinCLK, HIGH);
  }
}

void Write_Max7219(unsigned char address, unsigned char dat)
{
  digitalWrite(Max7219_pinCS, LOW);
  Write_Max7219_byte(address);     //address,code of LED
  Write_Max7219_byte(dat);         //data,figure on LED
  digitalWrite(Max7219_pinCS, HIGH);
}

void Init_MAX7219(void)
{
  Write_Max7219(0x09, 0x00);       //decoding :BCD
  Write_Max7219(0x0a, 0x00);       //brightness
  Write_Max7219(0x0b, 0x07);       //scanlimit;8 LED
  Write_Max7219(0x0c, 0x01);       //power-down mode:0,normal mode:1
  Write_Max7219(0x0f, 0x00);       //test display:1;EOT,display:0
  
  Write_Max7219(0x01,DISP_USAGE_1);//Init views
  Write_Max7219(0x02,DISP_USAGE_2);
  Write_Max7219(0x03,DISP_USAGE_3);
  Write_Max7219(0x04,DISP_USAGE_4);
  Write_Max7219(0x05,DISP_USAGE_5);
  Write_Max7219(0x06,DISP_USAGE_6);
  Write_Max7219(0x07,DISP_USAGE_7);
  Write_Max7219(0x08,DISP_USAGE_8);
}

void writeCpuUsage(char* usage, int usage_length) {
  char char_usage[6];
  int char_usage_now = 0;
  int str_now = 0;
  
  for(int line = 1 ;line <= 8; line++) {
    char_usage[0] = '0';
    char_usage_now = 0;

    for(char_usage_now = 0 ;str_now < usage_length && char_usage_now < 6 ; str_now++) {
      if(usage[str_now] >= 48 &&   // 0  
         usage[str_now] <= 57 ) {  // 9
           char_usage[char_usage_now] = usage[str_now];
           char_usage_now++;
       } else if(usage[str_now] == '.' ||
                 usage[str_now] == ',' ||
                 usage[str_now] == ']' ) {
         //Ignore the decimal point
         while(usage[str_now] != ',' &&
               usage[str_now] !=  ']') {
           str_now++;
         }
         str_now++;
         break;
       } 
    }
    char_usage[char_usage_now+1] = '\0';
    Write_Max7219(line, getDispUsage(atoi(char_usage)));
  }
}

unsigned char getDispUsage(int usage)
{
  if(usage < 5) 
    return DISP_USAGE_0;
  else if (usage < 20)
    return DISP_USAGE_1;
  else if (usage < 35) 
    return DISP_USAGE_2;
  else if (usage < 50) 
    return DISP_USAGE_3;
  else if (usage < 60)
    return DISP_USAGE_4;
  else if (usage < 70) 
    return DISP_USAGE_5;
  else if (usage < 80) 
    return DISP_USAGE_6;
  else if (usage < 90) 
    return DISP_USAGE_7;
  
  return DISP_USAGE_8;
}

void setup() {
  pinMode(Max7219_pinCLK,OUTPUT);
  pinMode(Max7219_pinCS,OUTPUT);
  pinMode(Max7219_pinDIN,OUTPUT);
  delay(50);
  Init_MAX7219();
  
  Serial.begin(9600);
}

void loop() {
  String usage;
  while (Serial.available() > 0) {
    dat[count] = Serial.read();
    if (count > MAX_LENGTH - 2 || dat[count] == ']') {
      dat[count] = '\0';
      writeCpuUsage(dat, count);
      count = 0;
    } else {
      count++;
    }
  }
  delay(10);
}

0 件のコメント:

コメントを投稿