Salve galera!
Essa semana chegou para mim uma pecinha de hardware que comprei no DealExtreme, que possui 8 digitos de sete segmentos, 8 leds bicolores e 8 botões. Ele não tem aplicação específica nenhuma, é bem voltado para ser usado com microcontroladores e pela turma do "Faça você mesmo" (mais conhecido pela sigla em inglês "DIY").
http://www.dealextreme.com/p/8x-digital-tube-8x-key-8x-double-color-led-module-81873?item=2
Pensando no que poderia fazer com isso, resolvi conectá-la a um Arduino Duemilanove (para quem não conhece, recomendo dar uma lida no site oficial, pois é fantástico: http://arduino.cc/) e criar um software de interface entre o Computador/Arduino/Display para que ele exibisse informações de uso de CPU e memória.
No lado do Arduino eu elaborei o firmware usando a library abaixo, que facilita a comunicação com o IC TM1638, que controla todo o display:
http://code.google.com/p/tm1638-library/
O código do Arduino é mostrado abaixo. Ele é responsável por receber os dados da porta serial, fazer alguns pequenos ajustes e exibir as informações dos displays de 7 segmentos. O código também controla o acendimento dos LEDs e monitora os botões.
[PHP]
#include
TM1638 module(8, 7, 9);
word leds [9] = {0, 256, 768, 1792, 3840, 7936, 7968, 8032, 8160};
byte buttons, oldbuttons, page;
byte cpu_h, cpu_l, mem_h, mem_l, cpu_led, mem_led;
word memory;
boolean changed;
unsigned long milstart;
void setup() {
Serial.begin(9600);
oldbuttons = 0;
page = 0;
changed = false;
}
void loop() {
if (Serial.available() > 0) {
if (Serial.available() > 8) {
if (Serial.read() == 255) {
cpu_h = Serial.read();
cpu_l = Serial.read();
mem_h = Serial.read();
mem_l = Serial.read();
cpu_led = Serial.read();
mem_led = Serial.read();
memory = (mem_h << 8) | mem_l;
}
}
}
buttons = module.getButtons();
if (buttons != 0) {
if (buttons != oldbuttons) {
oldbuttons = buttons;
page = buttons;
module.clearDisplay();
switch (page) {
case 1:
module.setDisplayToString("CPU", 0, 0);
break;
case 2:
module.setDisplayToString("Memoria", 0, 0);
break;
}
changed = true;
milstart = millis();
}
}
if (changed == false) {
switch (page) {
case 1:
if (cpu_h < 10) {
module.setDisplayDigit(0, 1, false);
module.setDisplayDigit(0, 2, false);
module.setDisplayToString(String(cpu_h), 0, 3);
} else if (cpu_h >= 10 && cpu_h <= 99) {
module.setDisplayDigit(0, 1, false);
module.setDisplayToString(String(cpu_h), 0, 2);
} else {
module.setDisplayToString(String(cpu_h), 0, 1);
}
module.setDisplayToString("pct" , 0, 5);
module.setLEDs(leds[cpu_led]);
break;
case 2:
module.setDisplayToString(String(memory, DEC), 0b10000000, 0);
module.setDisplayToString("mb" , 0b10000000, 6);
module.setLEDs(leds[mem_led]);
break;
}
} else {
if ((millis() - milstart) > 2000) {
changed = false;
module.clearDisplay();
}
}
}
[/PHP]
Do outro lado, tem o código em C#, que busca informações de uso de CPU e memória livre do Windows e os envia através da porta serial (emulada pela USB) para o Arduino.
[PHP]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO.Ports;
namespace CPUPerformance {
class Program {
static void Main(string[] args) {
PerformanceCounter theCPUCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
PerformanceCounter theMemCounter = new PerformanceCounter("Memory", "Available MBytes");
SerialPort SP = new SerialPort("COM3", 9600, Parity.None, 8);
byte[] senddata = new byte[7];
SP.Open();
while (true) {
float cpu;
int mem;
cpu = (float) Math.Round(theCPUCounter.NextValue(), 2);
mem = Convert.ToInt32(theMemCounter.NextValue());
senddata[0] = 255;
senddata[1] = Convert.ToByte(Math.Truncate(cpu));
senddata[2] = Convert.ToByte((cpu - Math.Truncate(cpu)) * 100);
senddata[3] = Convert.ToByte((mem >> 8) & 0x00FF);
senddata[4] = Convert.ToByte(mem & 0x00FF);
senddata[5] = Convert.ToByte(Math.Round((cpu * 9) / 100));
senddata[6] = Convert.ToByte(Math.Round((float)(mem * 9) / 4096));
//Console.WriteLine(senddata[1] + "." + senddata[2]);
SP.Write(senddata, 0, 7);
System.Threading.Thread.Sleep(250);
}
}
}
}
[/PHP]
Abaixo o resultado do trabalho:
Também fiz um vídeo que mostra o display em funcionamento.
http://www.youtube.com/watch?v=cuMa06gzFBc
Para quem curte um pouco de eletrônica (eu sou leigo, minha formação é de eng. civil) e esse "ideal" do faça você mesmo, é um passatempo bem bacana.
Abaixo tem mais um vídeo, de outra aplicação que encontrei para o display:
http://www.youtube.com/watch?v=Rdv0iFGwMco
Espero que gostem
Fergo
Highlander
Registrado
9.3K Mensagens
1.1K Curtidas