SdevLab – Projeto | Controle de estufa utilizando arquitetura PC e C/C++

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

😉

SdevLab – Exemplo de Código | Ordenação de vetores dinâmicos em C/C++

Fala Galera!

Segue abaixo um código de ordenação de vetores dinâmicos em c++. Na verdade são dois exemplos, o quick sort e o shell sort.

Ordenação de vetores dinâmicos em C/C++

O exemplo é bastante simples, primeiro você entra com o vetor e depois dele povoado você escolhe o algoritmo à usar e o vetor sai ordenado no final. É uma aplicação simples porque a idéia é mostrar os algoritmos de ordenação na prática!

Segue o código:


#include
#include
using namespace std;
// shellsort ..........................................
void shellsort(int x[], int tamanho, int nPassos)
{
    int incr,i,j,k,span,y;
    int *incrementos;
    incrementos = new int[nPassos];
    for (i=0;i<=nPassos;i++)
        incrementos[i] = (int)round(exp((nPassos-i)*log(2.0)));
    for (incr=0;incr<=nPassos;incr++)
    {
        //span é o tamanho de incrementos
        span = incrementos[incr];
        for (j=span;j=0 && y< pivo)
             esq++;
        while (vetor[dir] > pivo)
            dir--;
        if (esq <= dir)
        {
            trab = vetor[esq];
            vetor[esq] = vetor[dir];
            vetor[dir] = trab;
            esq++;
            dir--;
        }
    }while (esq <= dir);     if (dir-i >= 0)
        quickSort(vetor,tamanho,i,dir);
    if (j-esq >= 0)
        quickSort(vetor, tamanho, esq, j);
}
int main(){
    int *vetor;
    int aux,aux2,aux3;
    cout << "Quantos elementos voce deseja armazenar?" << endl;
    cin >> aux;
    vetor = new int[aux];
    for(int i=0;i<< "Entre com um número." << endl;
        cin >> aux2;
        vetor[i] = aux2;
        }
    cout << "Entre com 1 para ordenar usando o quickSort ou 2 para ordenar usando o shellsort."    << endl;
    cin >> aux3;
        if(aux3==1)
            quickSort(vetor,aux,0,aux-1);
        if(aux3==2)
            shellsort(vetor,aux,2);
    cout << "O vetor ordenado é: " << endl;
    for(int j=0;j<< vetor[j] << " ";
        }
    delete [] vetor;
}

Até a próxima!
😉

SdevLab – Exemplo de Código | Árvore Binária em C/C++

Eae galera!

Segue neste post um código que mostra como utilizar uma outra estrutura de dados que é a árvore binária.

Árvore Binária em C/C++

Este tipo de estrutura utiliza termos como nó, folha e raiz para denominar seus elementos, que possuem uma estrutura parecida com a imagem abaixo:

Acredito ser o tipo de árvore mais utilizado na computação, utiliza muita recursividade e é usada principalmente em algoritmos de árvores de busca binária.

Segue então o código que além de povoar a árvore, soma todos os seus elementos:

#include
using namespace std;
struct treenode
{
    int info;
    treenode *left;
    treenode *right;
};
typedef treenode *treenodeptr;
void tInsere(treenodeptr &p, int x)
{
    if (p == NULL) // insere na raiz
    {
        p = new treenode;
        p->info = x;
        p->left = NULL;
        p->right = NULL;
    }
    else
    {
        if(x < p->info)//insere na subarvore esquerda
            tInsere(p->left, x);
        else
            tInsere(p->right, x);
    }
}
void emOrdem(treenodeptr arvore, int &x)
{
    if(arvore != NULL)
    {
        emOrdem(arvore->left,x);
        x = x + arvore->info;
        emOrdem(arvore->right,x);
    }
}
void soma(treenodeptr arvore)
{
    int x = 0;
    emOrdem(arvore, x);
    cout << "Somatório dos elementos da árvore: " << x << endl;
}
int main(){
    int x = 0;
    treenodeptr arvore = NULL;
    while (x != -1)
    {
        cout << "Digite elemento a ser inserido." << endl;
        cin >> x;
        if (x != -1)
            tInsere(arvore, x);
    }
    soma(arvore);
}

Até a próxima!
😉

SdevLab – Exemplo de Código | Como abrir um arquivo e procurar uma string dentro dele em C/C++

Este código, como diz o título do post, abre um arquivo (de texto) e procura uma string dentro.

Como abrir um arquivo e procurar uma string dentro dele em C/C++

Imagine que você tenha um dicionário em arquivo texto e queira facilmente encontrar o significado de uma palavra. No lugar de procurar, use este código!

#include <iostream>
#include <fstream>
#include  <cstring>
using namespace std;
int procura(char  *string, char *delim1, char *delim2, char *palavra)
{
char  *inicio, *final;
char *p;
int i;
inicio = strstr(string,  delim1);
if (inicio != NULL)
{
final =  strstr(string, delim2);
i = 0;
for  (p=inicio+strlen(delim1);p<final;p++)
palavra[i++] = *p;
palavra[i]= '';
return 0;
}
else
return 1;
}
int  main(int argc, char *argv[])
{
char procurado[100];
char aux[512];
char palavra[512];
strcpy(procurado,argv[1]);
ifstream arquivo;
arquivo.open("exemplo.txt");
if(arquivo.is_open())
{
while(!arquivo.eof())
{
arquivo.getline(aux,512);
if  (procura(aux, "<hw>","</hw>",palavra)==0)
cout << "Palavra: " << palavra << endl;
if (procura(aux, "<def>","</def>",palavra)==0)
cout << "Definição: " << palavra << endl;
}
arquivo.close();
}
else
cout << "Cade o arquivo??" << endl;
return 0;
}

No linux, para testar, abra o terminal e digite as linhas:

g++ -o dict teste.cc
./dict teste

Note que como delimitadores eu usei os termos <hw> e <def> mas isto não é uma regra, usei desta forma porque o meu dicionário era na verdade um arquivo xml.

Até a próxima!

SdevLab – Exemplo de Código | Manipulação de Listas – Delafter e Remove tudo C/C++

Eae galera!

Agora que já vimos o básico da montagem de lista, vamos ver um código como exemplo de código que manipula listas.

Manipulação de Listas – Delafter e Remove tudo C/C++

O código abaixo trabalha com as funções delafter (remove o próximo registro depois de uma dada referência) e a remove tudo que limpa uma lista.

Segue o código:

#include <iostream>
using namespace std;
struct no
{
int info;
no* next;
};
typedef no* noptr;
void push (noptr &s, int t)
{
no *p;
p = new no;
p->info = t;
if (s == NULL)
p->next=NULL;
else
p->next = s;
s=p;
};
void delafter(noptr &p, int &x)
{
noptr q;
q = p->next;
x = q->info;
p->next = q->next;
delete q;
}
int pop (noptr &lista)
{
int q;
no *p;
if (lista == NULL)
cout << "Lista vazia";
else
{
p=lista;
lista = p->next;
q = p->info;
delete p;
}
return q;
};
void removetudo(noptr &lista, int x)
{
noptr p,q;
int aux;
q = NULL;
p = lista;
while(p != NULL)
{
if (p->info == x)
if (q == NULL) // remove o primeiro da lista
{
aux = pop(lista);
p = lista;
}
else
{
p = p->next;
delafter(q,aux);
}
else // continua atravessando a lista
{
q = p;
p = p->next;
}
}
}
int main()
{
noptr lista = NULL;
int informacao;
int auxtel;
cout <<"Entre com o número do telefone (-1 para sair)" << endl;
cin >> informacao;
while (informacao != -1)
{
push(lista, informacao);
cout <<"Entre com o número do telefone (-1 para sair)" << endl;
cin >> informacao;
}
cout << "Digite o telefone que você deseja remover." << endl;
cin >> auxtel;
removetudo(lista, auxtel);
cout << "Sua nova lista é: " << endl;
while (lista != NULL)
{
informacao=pop(lista);
cout << informacao << endl;
}
return 0;
}

Até a próxima!

😉