Logo Hardware.com.br
Fergo
Fergo Highlander Registrado
9.3K Mensagens 1.1K Curtidas

[DIY] Monitorando CPU/Memória com um Arduino e um display TM1638

#1 Por Fergo 19/05/2012 - 13:57
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").

Imagem
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:
Imagem

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 smile.png
Responder
Pão Man
Pão Man General de Pijama Registrado
3.3K Mensagens 178 Curtidas
#3 Por Pão Man
20/05/2012 - 13:13
Muito bom, estou para comprar um microcontrolador para fazer uns experimentos também até criei um tópico no fórum.

Iria pegar no mercado livre só que o vendedor pausou o anuncio to vendo se volta!
#Linux-User: 535210
[Indicação] Cursos de info Clique aqui: Curso 24H com diploma em casa.
Canal Youtube - https://www.youtube.com/jlucasengenharia
Robô e Kinect - https://www.youtube.com/watch?v=jcoaCoyohiQ
Fergo
Fergo Highlander Registrado
9.3K Mensagens 1.1K Curtidas
#4 Por Fergo
20/05/2012 - 13:54
Valeu galera!
O Arduino eu tenho desde 2009, tanto que essa versão já foi substituída pelo Uno. Eu comprei ele no eBay. Eu acho mais vantagem comprar lá fora, pois aqui eles tem o costume de meter a faca.

O que eu comprei no DealExtreme foi apenas esse display. Demorou 2 meses e meio pra chegar, já tinha dado até como perdido.

Pra quem gosta, recomendo muito o Arduino. Pra mim é uma das melhores invenções na área. Bem fácil e divertido de trabalhar.
Site pessoal www.fergonez.net
Portfolio
www.fbirck.com
Artigos
Informática
Pão Man
Pão Man General de Pijama Registrado
3.3K Mensagens 178 Curtidas
#5 Por Pão Man
20/05/2012 - 13:55
Fergo disse:
Valeu galera!
O Arduino eu tenho desde 2009, tanto que essa versão já foi substituída pelo Uno. Eu comprei ele no eBay. Eu acho mais vantagem comprar lá fora, pois aqui eles tem o costume de meter a faca.

O que eu comprei no DealExtreme foi apenas esse display. Demorou 2 meses e meio pra chegar, já tinha dado até como perdido.

Pra quem gosta, recomendo muito o Arduino. Pra mim é uma das melhores invenções na área. Bem fácil e divertido de trabalhar.


Eu tenho um projeto do curso para fazer e o professor recomendou o microcontrolador, mas dando uma olhada achei o Arduíno bem mais customizável e barato...
#Linux-User: 535210
[Indicação] Cursos de info Clique aqui: Curso 24H com diploma em casa.
Canal Youtube - https://www.youtube.com/jlucasengenharia
Robô e Kinect - https://www.youtube.com/watch?v=jcoaCoyohiQ
Fergo
Fergo Highlander Registrado
9.3K Mensagens 1.1K Curtidas
#8 Por Fergo
21/05/2012 - 13:15
Daniel, o Arduino usa um ATmega328 como uC. Ele já vem pré-gravado com um bootloader que permite programação diretamente via USB, sem necessidade de gravador. Também possui um uC da FTDI responsável por fazer a conversão USB-Serial, de forma que você possa se comunicar facilmente com outros equipamentos através de portas COM (é o caso do meu projeto).

A grande vantagem é que ele é feito pensando na facilidade e rapidez de prototipagem. A linguagem é a mesma do Processing/Wiring e, como você pode ver no primeiro post, bem fácil de trabalhar. Dada a sua popularidade e a característica de tudo ser open-source (inclusive o hardware), você encontra bibliotecas adicionais para quase tudo o que é protocolo ou outros ICs (led drivers, shift registers, eeproms, i2c, spi etc). Para mais informações: http://arduino.cc/

Genericamente, a especificação do Arduino Uno é:

Microcontroller: ATmega328
Operating Voltage: 5V
Input Voltage (recommended): 7-12V
Input Voltage (limits):6-20V
Digital I/O Pins: 14 (of which 6 provide PWM output)
Analog Input Pins: 6
DC Current per I/O Pin: 40 mA
DC Current for 3.3V Pin: 50 mA
Flash Memory: 32 KB (ATmega328) of which 0.5 KB used by bootloader
SRAM: 2 KB (ATmega328)
EEPROM: 1 KB (ATmega328)
Clock Speed: 16 MHz

O ATmega328 ainda tem suporte interno a UART, I2C e SPI.

A comunidade gerando conteúdo para o Arduino é gigatesca. Se gosta de eletrônica, mesmo que seja leigo (como meu caso), recomendo muito, sem falar que você acha Arduino-compatibles (clones do Arduino) por meros 15 dólares no eBay. O oficial custa em torno de 30.
Site pessoal www.fergonez.net
Portfolio
www.fbirck.com
Artigos
Informática
Pão Man
Pão Man General de Pijama Registrado
3.3K Mensagens 178 Curtidas
#10 Por Pão Man
26/05/2012 - 10:02
Eaw Fergo queria saber sua opinião sobre algo útil para ser realizado com microcontrolador. Eu pensei em um potenciômetro para através dele achar potencias como a eficaz depois de realizar cálculos.

Eu tenho que realizar um projeto simples, que utilize algum sensor, para um projeto inicial do curso de Engenharia Elétrica em C.

Eu já comprei o microcontrolador, tinha criado até outro tópico sobre qual comprar. Na verdade queria utilizar Arduíno, mas o professor quis microcontrolador.

[Daniel] você que também tem algum conhecimento, qual sua opinião de um bom projeto, voltado a Engenharia Elétrica?

Vi uns vídeos seus Fergo bem interessante com aquele do volante, ficou muito bom...

Também analisando com o professor chegamos a possibilidade de usar um sensor para verificar a quantidade de luz do ambiente e medir se é boa ou não para fotos.

Outro também foi que quando começar a chover fechar a janela automaticamente. Só que achei que esse o gasto é maior.

É meu 1 período do curso.
#Linux-User: 535210
[Indicação] Cursos de info Clique aqui: Curso 24H com diploma em casa.
Canal Youtube - https://www.youtube.com/jlucasengenharia
Robô e Kinect - https://www.youtube.com/watch?v=jcoaCoyohiQ
Fergo
Fergo Highlander Registrado
9.3K Mensagens 1.1K Curtidas
#11 Por Fergo
26/05/2012 - 15:49
Pão Man, vou te passar uns links para inspiração:

http://hackaday.com
http://tronixstuff.wordpress.com/
http://www.ladyada.net/make/
http://bildr.org/

A maioria é relacionada com o Arduino, mas é possível de fazer com outros uC também. O HackADay é meu favorito. Veja a categoria "arduino hacks". Tem mais de 800 projetos relacionados com o Arduino que você pode adaptar para o uC que está trabalhando (se for AVR, mais fácil ainda):
http://hackaday.com/category/arduino-hacks/
Site pessoal www.fergonez.net
Portfolio
www.fbirck.com
Artigos
Informática
Pão Man
Pão Man General de Pijama Registrado
3.3K Mensagens 178 Curtidas
#12 Por Pão Man
27/05/2012 - 19:40
Fergo disse:
Pão Man, vou te passar uns links para inspiração:

http://hackaday.com
http://tronixstuff.wordpress.com/
http://www.ladyada.net/make/
http://bildr.org/

A maioria é relacionada com o Arduino, mas é possível de fazer com outros uC também. O HackADay é meu favorito. Veja a categoria "arduino hacks". Tem mais de 800 projetos relacionados com o Arduino que você pode adaptar para o uC que está trabalhando (se for AVR, mais fácil ainda):
http://hackaday.com/category/arduino-hacks/


Boa fergo gostei muito dos sites. Valeu!

Ei eu pensei assim, em tipo usar o microcontrolador para ler e gerar um código de barra para leitor de energia. Tipo os caras tiram a leitura manualmente, então queria fazer algo automático.

No caso usaria o microcontrolador para receber uma determinada quantidade de energia e gerar um código de barra que seria medido usando um software do android. Então após gerar o código o android funcionaria como leitor de barras.

O que acha?
#Linux-User: 535210
[Indicação] Cursos de info Clique aqui: Curso 24H com diploma em casa.
Canal Youtube - https://www.youtube.com/jlucasengenharia
Robô e Kinect - https://www.youtube.com/watch?v=jcoaCoyohiQ
OfflineUser
OfflineUser General de Pijama Registrado
3.2K Mensagens 228 Curtidas
#13 Por OfflineUser
28/05/2012 - 11:04
Pão Man disse:
...Eu tenho que realizar um projeto simples, que utilize algum sensor, para um projeto inicial do curso de Engenharia Elétrica em C.

Eu já comprei o microcontrolador, tinha criado até outro tópico sobre qual comprar. Na verdade queria utilizar Arduíno, mas o professor quis microcontrolador.

[Daniel] você que também tem algum conhecimento, qual sua opinião de um bom projeto, voltado a Engenharia Elétrica?

É meu 1 período do curso.


*Você já esta programando alguma coisa, ou vai iniciar ainda?
*Ja viu assembly?
*Para que microcontrolador? (linha)
O arduino também também é um microcontrolador.
*Detalhadamente o que você quer usar em seu projeto?
*O que esta sendo abordado nesse primeiro período do curso, quais matérias?


Pão Man disse:
Ei eu pensei assim, em tipo usar o microcontrolador para ler e gerar um código de barra para leitor de energia. Tipo os caras tiram a leitura manualmente, então queria fazer algo automático.

No caso usaria o microcontrolador para receber uma determinada quantidade de energia e gerar um código de barra que seria medido usando um software do android. Então após gerar o código o android funcionaria como leitor de barras.

O que acha?


Pelo que eu compreendi, você quer medir a corrente consumida e então gerar um código dessa medida em forma de barras, e depois mais um vez ler essas barras e enviar para o micro e receber esse valor na tela do pc. Se for isso, não vejo porque dar a volta toda, basta medir e enviar direto.
Pão Man
Pão Man General de Pijama Registrado
3.3K Mensagens 178 Curtidas
#14 Por Pão Man
28/05/2012 - 11:54
'[Daniel
;5988828']*Você já esta programando alguma coisa, ou vai iniciar ainda?
*Ja viu assembly?
*Para que microcontrolador? (linha)
O arduino também também é um microcontrolador.
*Detalhadamente o que você quer usar em seu projeto?
*O que esta sendo abordado nesse primeiro período do curso, quais matérias?


1 - Não vi assembly.
2 - 16f877a
3 - Quero fazer algo voltado a Eng. Elétrica. O prof disse que temos que usar algum sensor e desenvolver em c.
4 - A matéria é processamento de dados com linguagem C. As outras matérias são as normais de toda universidade pública para o curso. Também temos a que estuda teoricamente modelos de energia, que é a Introdução a Eng. Elétrica.

'[Daniel
;5988828']
Pelo que eu compreendi, você quer medir a corrente consumida e então gerar um código dessa medida em forma de barras, e depois mais um vez ler essas barras e enviar para o micro e receber esse valor na tela do pc. Se for isso, não vejo porque dar a volta toda, basta medir e enviar direto.


Sim, por parte, mas depois de gerada a barra, ela ficará no leitor, e tipo se quiser saber o consumo usa o android para ler o código de barra que estará no dispositivo. Ele não voltará ao computador.
#Linux-User: 535210
[Indicação] Cursos de info Clique aqui: Curso 24H com diploma em casa.
Canal Youtube - https://www.youtube.com/jlucasengenharia
Robô e Kinect - https://www.youtube.com/watch?v=jcoaCoyohiQ
OfflineUser
OfflineUser General de Pijama Registrado
3.2K Mensagens 228 Curtidas
#15 Por OfflineUser
28/05/2012 - 12:40
1...4: Faz um medidor de corrente usando o sensor SHUNT, a programação em C não é tão complexa.

+: Eu entendo que tu se referes aqueles medidores de consumo de Watts das concessionarias de energia elétrica. Algo semelhante a isso.

Porque não faz um medidor unindo as duas ideias e salva os valores na memoria e quando você quiser receber elas para inserir no micro e salvar, usa um cartão magnético ou com conector ou um módulo de RF, que quando voce quiser pegar o valor da memória, você envia um código e o medidor te retorna o codigo +valor atual, se o código recebido for o esperado.
Responder Tópico
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal