Fala Galera!
Segue neste post um projeto que fiz para uma matéria da facul (Arquitetura de Computadores II). Este projeto usava um computador com o Linux Kurumin instalado para gerenciar uma estufa.
Controle de estufa utilizando arquitetura PC e C/C++
Para entender melhor segue o relatório final do projeto:
Introdução
Este projeto simula o monitoramento de uma estufa, para isso faz uso de três chaves, que simulam três sensores. Um sensor de temperatura, um sensor de umidade e um sensor de água no solo.
Condições do Projeto
• Se a chave geral SW estiver desligada, manter a sinalização, a bomba, o irrigador e
o ventilador desligados;
• O sistema só entra em estado de operação se a chave 1 estiver acionada. Então
quando SW for acionada o sistema entra em estado de monitoramento, aguardando a mudança de
estado de algum sensor;
• Se o sensor de temperatura for ativado, significa que a temperatura está acima do
normal e o ventilador deve ser ligado;
• Se o sensor de umidade for ativado significa que a umidade do ar esta muito baixa, e
a bomba (borrifador) deve ser ligada;
• Se o sensor de água no solo for ativado, significa que a quantidade de água no solo é
insuficiente, e o irrigador deve ser ligado e permanecer ligado por um tempo.
Especificação do Projeto
Hardware: Sistema baseado no microcomputador (PC).
Máquina de estado
Código
#include <stdio.h>
#include <sys/io.h>
#define ON 0XFF
#define OFF 0X00
#define PORT_IN 0X379
#define PORT_OUT 0X378
unsigned char sw1,s3,s2,s1;
unsigned int estado;
void entrada(void)
{
ioperm(PORT_IN,1,1);
if((inb(PORT_IN)& 0x80) == 0X80) sw1 = ON;
else sw1 = OFF;
if((inb(PORT_IN)& 0XB0) == 0XB0) s3 = ON;
else s3 = OFF;
if((inb(PORT_IN)& 0XA0)== 0XA0) s2 = ON;
else s2 = OFF;
if((inb(PORT_IN)& 0x90) == 0X90) s1 = ON;
else s1 = OFF;
ioperm(PORT_IN,1,0);
}
void desliga_tudo(void)
{
ioperm(PORT_OUT,1,1);
outb(0x00,PORT_OUT);
ioperm(PORT_OUT,1,0);
}
//sinalizador
void liga_lampada(void)
{
ioperm(PORT_OUT,1,1);
outb(0x80,PORT_OUT);
ioperm(PORT_OUT,1,0);
}
//sensor de temperatura
void trata_s1(void)
{
ioperm(PORT_OUT,1,1);
outb(0x81,PORT_OUT);
ioperm(PORT_OUT,1,0);
}
//sensor de umidade
void trata_s2(void)
{
ioperm(PORT_OUT,1,1);
outb(0x82,PORT_OUT);
ioperm(PORT_OUT,1,0);
}
//sensor de agua no solo
void trata_s3(void)
{
ioperm(PORT_OUT,1,1);
outb(0x84,PORT_OUT);
ioperm(PORT_OUT,1,0);
}
void maquina_estado(void)
{
switch(estado)
{
case 1: //verfica sw1
desliga_tudo();
if(sw1 == ON) estado = 2;
break;
case 2:
liga_lampada();
ioperm(PORT_IN,1,1);
if((inb(PORT_IN)& 0X90) == 0X90) estado = 3;
ioperm(PORT_IN,1,0);
ioperm(PORT_IN,1,1);
if((inb(PORT_IN)& 0XA0) == 0XA0) estado = 4;
ioperm(PORT_IN,1,0);
ioperm(PORT_IN,1,1);
if((inb(PORT_IN)& 0XB0) == 0XB0) estado = 5;
ioperm(PORT_IN,1,0);
ioperm(PORT_IN,1,1);
if(sw1 == OFF) estado = 1;
ioperm(PORT_IN,1,0);
break;
case 3:
trata_s1();
if(sw1 == OFF) estado = 1;
else
estado = 2;
break;
case 4:
trata_s2();
if(sw1 == OFF) estado = 1;
else
estado = 2;
break;
case 5:
trata_s3();
if(sw1 == OFF) estado = 1;
else
estado = 2;
break;
}
}
int main(void)
{
estado=1;
while(1)
{
entrada();
maquina_estado();
}
return 0;
}
Este código, como vocês podem perceber foi escrito em C/C++. Para o projeto funcionar a gente usou um simulador que tinha chaves e leds que iriam simular os componentes da estufa (bomba, ventilador, …). É coisa simples na verdade, a idéia era aprender a usar a porta paralela do PC pra gerenciar um sistema.
É lógico que exitem formas mais simples e corretas para se fazer o gerenciamento da tal estufa, mas a idéia do projeto foi atingida!
Finalizando, para o projeto funcionar compile ele normalmente no terminal:
gcc -o projeto projeto.gcc (ou projeto.c)
sudo ./projeto
Fazendo isto o linux vai compilar e rodar o programinha, que vai ficar lendo a saida paralela e mudando seu comportamento conforme a entrada de dados.
att
sanoj
😉