Ubuntu の Load Average を Arudino の RGBLED で表示

Ubuntu の Load Average を Arudino の RGBLED で表示します。

こんな感じでサーバーの現在の Load Average 分を表示できます。
![EuvY_BZUcAQMC_7.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115935/6a951386-2c55-c033-6e30-2f0cdcbc50a2.jpeg)
まずは、サーバーのロードアベレージをパーセントで返す PHP プログラム

ソースコードのリファクタリングはそのうち、、、

~~~~php:loadAvaragePercent.php
<?php

function get_server_memory_usage(){

    $free = Shell_exec('free');
    $free = (string)trim($free);
    $free_arr = explode("\n", $free);
    $mem = explode(" ", $free_arr[1]);
    $mem = array_filter($mem);
    $mem = array_merge($mem);
    $memory_usage = $mem[2]/$mem[1]*100;

    return $memory_usage;
}

function get_server_cpu_usage(){

    $load = sys_getloadavg();
    return $load[0];

}

exec("grep \"processor\" /proc/cpuinfo | wc -l" , $cpu_num );
//$cpu_num[0]

$load_average = trim( get_server_cpu_usage() );

echo intval( $load_average / $cpu_num[0] * 100 );

//get_server_memory_usage();
~~~~

返り値はパーセント整数値で 20 とかその辺が返ってきます。これを Arduino で読んでその分だけ赤色を点滅させることになります。

~~~~c:topRgbLed.ino
// LAN setting
#include <UIPEthernet.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x78, 0xEE  };  
IPAddress ip(192, 168, 0, 117);
IPAddress myDns(192, 168, 0, 1);                        
EthernetClient client;

// setting server's ip address
char server[] = "192.168.0.104";

#include <Adafruit_NeoPixel.h>
 
#define PIN            2
 
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      16
 
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
 
int delayval = 250; // delay for half a second
 
void setup() {

  Serial.begin(9600);

  // LAN start
  delay( 1000 );
  Ethernet.begin(mac, ip , myDns );
  delay( 1000 );

  // get server's data
  Serial.println("Connecting...");
  if (client.connect(server, 80)) {

    Serial.println("Connected");

    // Make a HTTP request:
    client.println("GET /1.php HTTP/1.1");
    client.println("Host: 192.168.0.104" );
    client.println("Connection: close");
    client.println();

  }

  pixels.begin(); // This initializes the NeoPixel library.

}
 
void loop() {
  
  Serial.println( "lopp in" );
  
  // character settings
  char c;
  long c_index = 0;
  boolean is_c_blank = true;
  
  //Serial.println( "----------header start --------" );
  while (client.connected()) {
    
    if (client.available()) {
      
      c = client.read();      

      // check not blank
      if (c == '\n' && is_c_blank) {

        //Serial.println( "----------header end --------" );

        // get server's body data into result[ ]
        //Serial.println( "----------body start --------" );
        char result[ ] = "                ";
        while (client.connected()) {
          if (client.available()) {
            c = client.read();  

            // add text into result[ ] if not \n
            if( c != '\n' ){
              Serial.print( c );
              result[c_index] = c ;
              c_index ++;
            }

          }
        }
        //Serial.println( "----------body end --------" );
        Serial.println( result );

        int active_num = int( String( result ).toInt() / NUMPIXELS );
        Serial.println( active_num );
        
        // color blank
        for(int i=0;i<active_num;i++){
          pixels.setPixelColor(i, pixels.Color(0,0,0));
          pixels.show();
          delay(delayval);
        }

        // blue
        for(int i=0;i<NUMPIXELS;i++){
          pixels.setPixelColor(i, pixels.Color(0,0,10));
          pixels.show();
          delay(delayval);
        }

        // color red
        for(int i=0;i<active_num;i++){
          pixels.setPixelColor(i, pixels.Color(10,0,0));
          pixels.show();
          delay(delayval);
        }

        delay( ( NUMPIXELS + active_num ) * 1000 );

        break;

      }

      // check read data if \n 
      if (c == '\n') {
        is_c_blank = true;
      } 
      else if (c != '\r') {
        is_c_blank = false;
      }

    }else{

      break;

    }

  }

}
~~~~

HDDやメモリの状態が見れても面白いかもしれません。あとせっかくRGBLEDですのでアニメーション機能があると良さげです。
####参考リンク
- [How to save htop output to file? - Ask Ubuntu ](https://askubuntu.com/questions/726333/how-to-save-htop-output-to-file)
- [WS2812 RGB led ring example on Arduino - Arduino Learning ](http://arduinolearning.com/code/ws2812-rgb-led-ring-example-on-arduino.php)
- [php — サーバーのCPU使用率とRAM PHPの使用率を取得するにはどうすればよいですか？ ](https://www.it-swarm.jp.net/ja/php/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AEcpu%E4%BD%BF%E7%94%A8%E7%8E%87%E3%81%A8ram-php%E3%81%AE%E4%BD%BF%E7%94%A8%E7%8E%87%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/1046142143/)
- [CPUの搭載数を確認 - Webエンジニアの技術メモ　〜PHP、SQL、Linuxなど〜]( https://moroto1122.hatenadiary.org/entry/20100917/1284719047)